github.com/apache/arrow/go/v14@v14.0.1/internal/utils/min_max_neon_arm64.s (about) 1 //+build !noasm !appengine 2 3 // ARROW-15336 4 // (C2GOASM doesn't work correctly for Arm64) 5 // Partly GENERATED BY asm2plan9s. 6 7 8 // func _int32_max_min_neon(values unsafe.Pointer, length int, minout, maxout unsafe.Pointer) 9 TEXT ·_int32_max_min_neon(SB), $0-32 10 11 MOVD values+0(FP), R0 12 MOVD length+8(FP), R1 13 MOVD minout+16(FP), R2 14 MOVD maxout+24(FP), R3 15 16 WORD $0xa9bf7bfd // stp x29, x30, [sp, #-16]! 17 WORD $0x7100043f // cmp w1, #1 18 WORD $0x910003fd // mov x29, sp 19 BLT LBB0_3 20 21 WORD $0x71000c3f // cmp w1, #3 22 WORD $0x2a0103e8 // mov w8, w1 23 BHI LBB0_4 24 25 WORD $0xaa1f03e9 // mov x9, xzr 26 WORD $0x52b0000b // mov w11, #-2147483648 27 WORD $0x12b0000a // mov w10, #2147483647 28 JMP LBB0_7 29 LBB0_3: 30 WORD $0x12b0000a // mov w10, #2147483647 31 WORD $0x52b0000b // mov w11, #-2147483648 32 WORD $0xb900006b // str w11, [x3] 33 WORD $0xb900004a // str w10, [x2] 34 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 35 RET 36 LBB0_4: 37 WORD $0x927e7509 // and x9, x8, #0xfffffffc 38 WORD $0x9100200a // add x10, x0, #8 39 WORD $0x0f046402 // movi v2.2s, #128, lsl #24 40 WORD $0x2f046400 // mvni v0.2s, #128, lsl #24 41 WORD $0x2f046401 // mvni v1.2s, #128, lsl #24 42 WORD $0xaa0903eb // mov x11, x9 43 WORD $0x0f046403 // movi v3.2s, #128, lsl #24 44 LBB0_5: 45 WORD $0x6d7f9544 // ldp d4, d5, [x10, #-8] 46 WORD $0xf100116b // subs x11, x11, #4 47 WORD $0x9100414a // add x10, x10, #16 48 WORD $0x0ea46c00 // smin v0.2s, v0.2s, v4.2s 49 WORD $0x0ea56c21 // smin v1.2s, v1.2s, v5.2s 50 WORD $0x0ea46442 // smax v2.2s, v2.2s, v4.2s 51 WORD $0x0ea56463 // smax v3.2s, v3.2s, v5.2s 52 BNE LBB0_5 53 54 WORD $0x0ea36442 // smax v2.2s, v2.2s, v3.2s 55 WORD $0x0ea16c00 // smin v0.2s, v0.2s, v1.2s 56 WORD $0x0e0c0441 // dup v1.2s, v2.s[1] 57 WORD $0x0e0c0403 // dup v3.2s, v0.s[1] 58 WORD $0x0ea16441 // smax v1.2s, v2.2s, v1.2s 59 WORD $0x0ea36c00 // smin v0.2s, v0.2s, v3.2s 60 WORD $0xeb08013f // cmp x9, x8 61 WORD $0x1e26002b // fmov w11, s1 62 WORD $0x1e26000a // fmov w10, s0 63 BEQ LBB0_9 64 LBB0_7: 65 WORD $0x8b09080c // add x12, x0, x9, lsl #2 66 WORD $0xcb090108 // sub x8, x8, x9 67 LBB0_8: 68 WORD $0xb8404589 // ldr w9, [x12], #4 69 WORD $0x6b09015f // cmp w10, w9 70 WORD $0x1a89b14a // csel w10, w10, w9, lt 71 WORD $0x6b09017f // cmp w11, w9 72 WORD $0x1a89c16b // csel w11, w11, w9, gt 73 WORD $0xf1000508 // subs x8, x8, #1 74 BNE LBB0_8 75 LBB0_9: 76 WORD $0xb900006b // str w11, [x3] 77 WORD $0xb900004a // str w10, [x2] 78 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 79 RET 80 81 // func _uint32_max_min_neon(values unsafe.Pointer, length int, minout, maxout unsafe.Pointer) 82 TEXT ·_uint32_max_min_neon(SB), $0-32 83 84 MOVD values+0(FP), R0 85 MOVD length+8(FP), R1 86 MOVD minout+16(FP), R2 87 MOVD maxout+24(FP), R3 88 89 WORD $0xa9bf7bfd // stp x29, x30, [sp, #-16]! 90 WORD $0x7100043f // cmp w1, #1 91 WORD $0x910003fd // mov x29, sp 92 BLT LBB1_3 93 94 WORD $0x71000c3f // cmp w1, #3 95 WORD $0x2a0103e8 // mov w8, w1 96 BHI LBB1_4 97 98 WORD $0xaa1f03e9 // mov x9, xzr 99 WORD $0x2a1f03ea // mov w10, wzr 100 WORD $0x1280000b // mov w11, #-1 101 JMP LBB1_7 102 LBB1_3: 103 WORD $0x2a1f03ea // mov w10, wzr 104 WORD $0x1280000b // mov w11, #-1 105 WORD $0xb900006a // str w10, [x3] 106 WORD $0xb900004b // str w11, [x2] 107 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 108 RET 109 LBB1_4: 110 WORD $0x927e7509 // and x9, x8, #0xfffffffc 111 WORD $0x6f00e401 // movi v1.2d, #0000000000000000 112 WORD $0x6f07e7e0 // movi v0.2d, #0xffffffffffffffff 113 WORD $0x9100200a // add x10, x0, #8 114 WORD $0x6f07e7e2 // movi v2.2d, #0xffffffffffffffff 115 WORD $0xaa0903eb // mov x11, x9 116 WORD $0x6f00e403 // movi v3.2d, #0000000000000000 117 LBB1_5: 118 WORD $0x6d7f9544 // ldp d4, d5, [x10, #-8] 119 WORD $0xf100116b // subs x11, x11, #4 120 WORD $0x9100414a // add x10, x10, #16 121 WORD $0x2ea46c00 // umin v0.2s, v0.2s, v4.2s 122 WORD $0x2ea56c42 // umin v2.2s, v2.2s, v5.2s 123 WORD $0x2ea46421 // umax v1.2s, v1.2s, v4.2s 124 WORD $0x2ea56463 // umax v3.2s, v3.2s, v5.2s 125 BNE LBB1_5 126 127 WORD $0x2ea36421 // umax v1.2s, v1.2s, v3.2s 128 WORD $0x2ea26c00 // umin v0.2s, v0.2s, v2.2s 129 WORD $0x0e0c0422 // dup v2.2s, v1.s[1] 130 WORD $0x0e0c0403 // dup v3.2s, v0.s[1] 131 WORD $0x2ea26421 // umax v1.2s, v1.2s, v2.2s 132 WORD $0x2ea36c00 // umin v0.2s, v0.2s, v3.2s 133 WORD $0xeb08013f // cmp x9, x8 134 WORD $0x1e26002a // fmov w10, s1 135 WORD $0x1e26000b // fmov w11, s0 136 BEQ LBB1_9 137 LBB1_7: 138 WORD $0x8b09080c // add x12, x0, x9, lsl #2 139 WORD $0xcb090108 // sub x8, x8, x9 140 LBB1_8: 141 WORD $0xb8404589 // ldr w9, [x12], #4 142 WORD $0x6b09017f // cmp w11, w9 143 WORD $0x1a89316b // csel w11, w11, w9, lo 144 WORD $0x6b09015f // cmp w10, w9 145 WORD $0x1a89814a // csel w10, w10, w9, hi 146 WORD $0xf1000508 // subs x8, x8, #1 147 BNE LBB1_8 148 LBB1_9: 149 WORD $0xb900006a // str w10, [x3] 150 WORD $0xb900004b // str w11, [x2] 151 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 152 RET 153 154 // func _int64_max_min_neon(values unsafe.Pointer, length int, minout, maxout unsafe.Pointer) 155 TEXT ·_int64_max_min_neon(SB), $0-32 156 157 MOVD values+0(FP), R0 158 MOVD length+8(FP), R1 159 MOVD minout+16(FP), R2 160 MOVD maxout+24(FP), R3 161 162 WORD $0xa9bf7bfd // stp x29, x30, [sp, #-16]! 163 WORD $0x7100043f // cmp w1, #1 164 WORD $0x910003fd // mov x29, sp 165 BLT LBB2_3 166 167 WORD $0x2a0103e8 // mov w8, w1 168 WORD $0xd2f0000b // mov x11, #-9223372036854775808 169 WORD $0x71000c3f // cmp w1, #3 170 WORD $0x92f0000a // mov x10, #9223372036854775807 171 BHI LBB2_4 172 173 WORD $0xaa1f03e9 // mov x9, xzr 174 JMP LBB2_7 175 LBB2_3: 176 WORD $0x92f0000a // mov x10, #9223372036854775807 177 WORD $0xd2f0000b // mov x11, #-9223372036854775808 178 WORD $0xf900006b // str x11, [x3] 179 WORD $0xf900004a // str x10, [x2] 180 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 181 RET 182 LBB2_4: 183 WORD $0x927e7509 // and x9, x8, #0xfffffffc 184 WORD $0x4e080d61 // dup v1.2d, x11 185 WORD $0x4e080d40 // dup v0.2d, x10 186 WORD $0x9100400a // add x10, x0, #16 187 WORD $0xaa0903eb // mov x11, x9 188 WORD $0x4ea01c02 // mov v2.16b, v0.16b 189 WORD $0x4ea11c23 // mov v3.16b, v1.16b 190 LBB2_5: 191 WORD $0xad7f9544 // ldp q4, q5, [x10, #-16] 192 WORD $0x4ea31c66 // mov v6.16b, v3.16b 193 WORD $0x4ea11c27 // mov v7.16b, v1.16b 194 WORD $0x4ea21c43 // mov v3.16b, v2.16b 195 WORD $0x4ea01c01 // mov v1.16b, v0.16b 196 WORD $0x4ee03480 // cmgt v0.2d, v4.2d, v0.2d 197 WORD $0x4ee234a2 // cmgt v2.2d, v5.2d, v2.2d 198 WORD $0x6e641c20 // bsl v0.16b, v1.16b, v4.16b 199 WORD $0x4ee434e1 // cmgt v1.2d, v7.2d, v4.2d 200 WORD $0x6e651c62 // bsl v2.16b, v3.16b, v5.16b 201 WORD $0x4ee534c3 // cmgt v3.2d, v6.2d, v5.2d 202 WORD $0xf100116b // subs x11, x11, #4 203 WORD $0x6e641ce1 // bsl v1.16b, v7.16b, v4.16b 204 WORD $0x6e651cc3 // bsl v3.16b, v6.16b, v5.16b 205 WORD $0x9100814a // add x10, x10, #32 206 BNE LBB2_5 207 208 WORD $0x4ee33424 // cmgt v4.2d, v1.2d, v3.2d 209 WORD $0x4ee03445 // cmgt v5.2d, v2.2d, v0.2d 210 WORD $0x6e631c24 // bsl v4.16b, v1.16b, v3.16b 211 WORD $0x6e621c05 // bsl v5.16b, v0.16b, v2.16b 212 WORD $0x4e180480 // dup v0.2d, v4.d[1] 213 WORD $0x4e1804a1 // dup v1.2d, v5.d[1] 214 WORD $0x4ee03482 // cmgt v2.2d, v4.2d, v0.2d 215 WORD $0x4ee53423 // cmgt v3.2d, v1.2d, v5.2d 216 WORD $0x6e601c82 // bsl v2.16b, v4.16b, v0.16b 217 WORD $0x6e611ca3 // bsl v3.16b, v5.16b, v1.16b 218 WORD $0xeb08013f // cmp x9, x8 219 WORD $0x9e66004b // fmov x11, d2 220 WORD $0x9e66006a // fmov x10, d3 221 BEQ LBB2_9 222 LBB2_7: 223 WORD $0x8b090c0c // add x12, x0, x9, lsl #3 224 WORD $0xcb090108 // sub x8, x8, x9 225 LBB2_8: 226 WORD $0xf8408589 // ldr x9, [x12], #8 227 WORD $0xeb09015f // cmp x10, x9 228 WORD $0x9a89b14a // csel x10, x10, x9, lt 229 WORD $0xeb09017f // cmp x11, x9 230 WORD $0x9a89c16b // csel x11, x11, x9, gt 231 WORD $0xf1000508 // subs x8, x8, #1 232 BNE LBB2_8 233 LBB2_9: 234 WORD $0xf900006b // str x11, [x3] 235 WORD $0xf900004a // str x10, [x2] 236 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 237 RET 238 239 240 // func _uint64_max_min_neon(values unsafe.Pointer, length int, minout, maxout unsafe.Pointer) 241 TEXT ·_uint64_max_min_neon(SB), $0-32 242 243 MOVD values+0(FP), R0 244 MOVD length+8(FP), R1 245 MOVD minout+16(FP), R2 246 MOVD maxout+24(FP), R3 247 248 WORD $0xa9bf7bfd // stp x29, x30, [sp, #-16]! 249 WORD $0x7100043f // cmp w1, #1 250 WORD $0x910003fd // mov x29, sp 251 BLT LBB3_3 252 253 WORD $0x71000c3f // cmp w1, #3 254 WORD $0x2a0103e8 // mov w8, w1 255 BHI LBB3_4 256 257 WORD $0xaa1f03e9 // mov x9, xzr 258 WORD $0xaa1f03ea // mov x10, xzr 259 WORD $0x9280000b // mov x11, #-1 260 JMP LBB3_7 261 LBB3_3: 262 WORD $0xaa1f03ea // mov x10, xzr 263 WORD $0x9280000b // mov x11, #-1 264 WORD $0xf900006a // str x10, [x3] 265 WORD $0xf900004b // str x11, [x2] 266 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 267 RET 268 LBB3_4: 269 WORD $0x927e7509 // and x9, x8, #0xfffffffc 270 WORD $0x9100400a // add x10, x0, #16 271 WORD $0x6f00e401 // movi v1.2d, #0000000000000000 272 WORD $0x6f07e7e0 // movi v0.2d, #0xffffffffffffffff 273 WORD $0x6f07e7e2 // movi v2.2d, #0xffffffffffffffff 274 WORD $0xaa0903eb // mov x11, x9 275 WORD $0x6f00e403 // movi v3.2d, #0000000000000000 276 LBB3_5: 277 WORD $0xad7f9544 // ldp q4, q5, [x10, #-16] 278 WORD $0x4ea31c66 // mov v6.16b, v3.16b 279 WORD $0x4ea11c27 // mov v7.16b, v1.16b 280 WORD $0x4ea21c43 // mov v3.16b, v2.16b 281 WORD $0x4ea01c01 // mov v1.16b, v0.16b 282 WORD $0x6ee03480 // cmhi v0.2d, v4.2d, v0.2d 283 WORD $0x6ee234a2 // cmhi v2.2d, v5.2d, v2.2d 284 WORD $0x6e641c20 // bsl v0.16b, v1.16b, v4.16b 285 WORD $0x6ee434e1 // cmhi v1.2d, v7.2d, v4.2d 286 WORD $0x6e651c62 // bsl v2.16b, v3.16b, v5.16b 287 WORD $0x6ee534c3 // cmhi v3.2d, v6.2d, v5.2d 288 WORD $0xf100116b // subs x11, x11, #4 289 WORD $0x6e641ce1 // bsl v1.16b, v7.16b, v4.16b 290 WORD $0x6e651cc3 // bsl v3.16b, v6.16b, v5.16b 291 WORD $0x9100814a // add x10, x10, #32 292 BNE LBB3_5 293 294 WORD $0x6ee33424 // cmhi v4.2d, v1.2d, v3.2d 295 WORD $0x6ee03445 // cmhi v5.2d, v2.2d, v0.2d 296 WORD $0x6e631c24 // bsl v4.16b, v1.16b, v3.16b 297 WORD $0x6e621c05 // bsl v5.16b, v0.16b, v2.16b 298 WORD $0x4e180480 // dup v0.2d, v4.d[1] 299 WORD $0x4e1804a1 // dup v1.2d, v5.d[1] 300 WORD $0x6ee03482 // cmhi v2.2d, v4.2d, v0.2d 301 WORD $0x6ee53423 // cmhi v3.2d, v1.2d, v5.2d 302 WORD $0x6e601c82 // bsl v2.16b, v4.16b, v0.16b 303 WORD $0x6e611ca3 // bsl v3.16b, v5.16b, v1.16b 304 WORD $0xeb08013f // cmp x9, x8 305 WORD $0x9e66004a // fmov x10, d2 306 WORD $0x9e66006b // fmov x11, d3 307 BEQ LBB3_9 308 LBB3_7: 309 WORD $0x8b090c0c // add x12, x0, x9, lsl #3 310 WORD $0xcb090108 // sub x8, x8, x9 311 LBB3_8: 312 WORD $0xf8408589 // ldr x9, [x12], #8 313 WORD $0xeb09017f // cmp x11, x9 314 WORD $0x9a89316b // csel x11, x11, x9, lo 315 WORD $0xeb09015f // cmp x10, x9 316 WORD $0x9a89814a // csel x10, x10, x9, hi 317 WORD $0xf1000508 // subs x8, x8, #1 318 BNE LBB3_8 319 LBB3_9: 320 WORD $0xf900006a // str x10, [x3] 321 WORD $0xf900004b // str x11, [x2] 322 WORD $0xa8c17bfd // ldp x29, x30, [sp], #16 323 RET 324