gitee.com/quant1x/gox@v1.7.6/num/asm/construct.go (about) 1 package main 2 3 import ( 4 . "github.com/mmcloughlin/avo/build" 5 . "github.com/mmcloughlin/avo/operand" 6 . "github.com/mmcloughlin/avo/reg" 7 ) 8 9 func genRepeat_F64() { 10 11 TEXT("Repeat_AVX2_F64", NOSPLIT, "func(x []float64, a float64, n int)") 12 Pragma("noescape") 13 Load(Param("x").Base(), RDI) 14 Load(Param("a"), X0) 15 Load(Param("n"), RSI) 16 17 TESTQ(RSI, RSI) 18 JE(LabelRef("LBB0_12")) 19 CMPQ(RSI, Imm(16)) 20 JAE(LabelRef("LBB0_3")) 21 XORL(EAX, EAX) 22 JMP(LabelRef("LBB0_11")) 23 24 Label("LBB0_3") 25 { 26 MOVQ(RSI, RAX) 27 ANDQ(I32(-16), RAX) 28 VBROADCASTSD(X0, Y1) 29 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 30 MOVQ(RCX, RDX) 31 SHRQ(Imm(4), RDX) 32 ADDQ(Imm(1), RDX) 33 MOVL(EDX, R8L) 34 ANDL(Imm(3), R8L) 35 CMPQ(RCX, Imm(48)) 36 JAE(LabelRef("LBB0_5")) 37 XORL(ECX, ECX) 38 JMP(LabelRef("LBB0_7")) 39 } 40 41 Label("LBB0_5") 42 { 43 ANDQ(I32(-4), RDX) 44 XORL(ECX, ECX) 45 } 46 47 Label("LBB0_6") 48 { 49 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8)) 50 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 51 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 52 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 53 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 54 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 55 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 56 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 57 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(256)) 58 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(288)) 59 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(320)) 60 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(352)) 61 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(384)) 62 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(416)) 63 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(448)) 64 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(480)) 65 ADDQ(Imm(64), RCX) 66 ADDQ(I32(-4), RDX) 67 JNE(LabelRef("LBB0_6")) 68 } 69 70 Label("LBB0_7") 71 { 72 TESTQ(R8, R8) 73 JE(LabelRef("LBB0_10")) 74 LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX) 75 ADDQ(Imm(96), RCX) 76 SHLQ(Imm(7), R8) 77 XORL(EDX, EDX) 78 } 79 80 Label("LBB0_9") 81 { 82 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-96)) 83 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-64)) 84 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-32)) 85 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1)) 86 SUBQ(I32(-128), RDX) 87 CMPQ(R8, RDX) 88 JNE(LabelRef("LBB0_9")) 89 } 90 91 Label("LBB0_10") 92 { 93 CMPQ(RAX, RSI) 94 JE(LabelRef("LBB0_12")) 95 } 96 97 Label("LBB0_11") 98 { 99 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 100 ADDQ(Imm(1), RAX) 101 CMPQ(RSI, RAX) 102 JNE(LabelRef("LBB0_11")) 103 } 104 105 Label("LBB0_12") 106 { 107 VZEROUPPER() 108 RET() 109 } 110 } 111 112 func genRepeat_F32() { 113 114 TEXT("Repeat_AVX2_F32", NOSPLIT, "func(x []float32, a float32, n int)") 115 Pragma("noescape") 116 Load(Param("x").Base(), RDI) 117 Load(Param("a"), X0) 118 Load(Param("n"), RSI) 119 120 TESTQ(RSI, RSI) 121 JE(LabelRef("LBB1_12")) 122 CMPQ(RSI, Imm(32)) 123 JAE(LabelRef("LBB1_3")) 124 XORL(EAX, EAX) 125 JMP(LabelRef("LBB1_11")) 126 127 Label("LBB1_3") 128 { 129 MOVQ(RSI, RAX) 130 ANDQ(I32(-32), RAX) 131 VBROADCASTSS(X0, Y1) 132 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 133 MOVQ(RCX, RDX) 134 SHRQ(Imm(5), RDX) 135 ADDQ(Imm(1), RDX) 136 MOVL(EDX, R8L) 137 ANDL(Imm(3), R8L) 138 CMPQ(RCX, Imm(96)) 139 JAE(LabelRef("LBB1_5")) 140 XORL(ECX, ECX) 141 JMP(LabelRef("LBB1_7")) 142 } 143 144 Label("LBB1_5") 145 { 146 ANDQ(I32(-4), RDX) 147 XORL(ECX, ECX) 148 } 149 150 Label("LBB1_6") 151 { 152 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 153 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 154 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 155 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 156 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 157 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 158 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 159 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 160 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(256)) 161 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(288)) 162 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(320)) 163 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(352)) 164 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(384)) 165 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(416)) 166 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(448)) 167 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(480)) 168 SUBQ(I32(-128), RCX) 169 ADDQ(I32(-4), RDX) 170 JNE(LabelRef("LBB1_6")) 171 } 172 173 Label("LBB1_7") 174 { 175 TESTQ(R8, R8) 176 JE(LabelRef("LBB1_10")) 177 LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX) 178 ADDQ(Imm(96), RCX) 179 SHLQ(Imm(7), R8) 180 XORL(EDX, EDX) 181 } 182 183 Label("LBB1_9") 184 { 185 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-96)) 186 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-64)) 187 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-32)) 188 VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1)) 189 SUBQ(I32(-128), RDX) 190 CMPQ(R8, RDX) 191 JNE(LabelRef("LBB1_9")) 192 } 193 194 Label("LBB1_10") 195 { 196 CMPQ(RAX, RSI) 197 JE(LabelRef("LBB1_12")) 198 } 199 200 Label("LBB1_11") 201 { 202 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 203 ADDQ(Imm(1), RAX) 204 CMPQ(RSI, RAX) 205 JNE(LabelRef("LBB1_11")) 206 } 207 208 Label("LBB1_12") 209 { 210 VZEROUPPER() 211 RET() 212 } 213 } 214 215 func genRange_F64() { 216 217 data := GLOBL("dataRangeF64", RODATA|NOPTR) 218 DATA(0, U64(0x0000000000000000)) 219 DATA(8, U64(0x3ff0000000000000)) 220 DATA(16, U64(0x4000000000000000)) 221 DATA(24, U64(0x4008000000000000)) 222 DATA(32, U64(0x4010000000000000)) 223 DATA(40, U64(0x4020000000000000)) 224 DATA(48, U64(0x4028000000000000)) 225 DATA(56, U64(0x4030000000000000)) 226 DATA(64, U64(0x4034000000000000)) 227 DATA(72, U64(0x4038000000000000)) 228 DATA(80, U64(0x403c000000000000)) 229 DATA(88, U64(0x4040000000000000)) 230 DATA(96, U64(0x3ff0000000000000)) 231 232 TEXT("Range_AVX2_F64", NOSPLIT, "func(x []float64, a float64, n int)") 233 Pragma("noescape") 234 Load(Param("x").Base(), RDI) 235 Load(Param("a"), X0) 236 Load(Param("n"), RSI) 237 238 TESTQ(RSI, RSI) 239 JE(LabelRef("LBB2_13")) 240 CMPQ(RSI, Imm(16)) 241 JAE(LabelRef("LBB2_3")) 242 XORL(EAX, EAX) 243 JMP(LabelRef("LBB2_11")) 244 245 Label("LBB2_3") 246 { 247 MOVQ(RSI, RAX) 248 ANDQ(I32(-16), RAX) 249 VBROADCASTSD(X0, Y1) 250 VADDPD(data.Offset(0), Y1, Y1) 251 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 252 MOVQ(RCX, R8) 253 SHRQ(Imm(4), R8) 254 ADDQ(Imm(1), R8) 255 TESTQ(RCX, RCX) 256 JE(LabelRef("LBB2_4")) 257 MOVQ(R8, RDX) 258 ANDQ(I32(-2), RDX) 259 XORL(ECX, ECX) 260 VBROADCASTSD(data.Offset(32), Y2) 261 VBROADCASTSD(data.Offset(40), Y3) 262 VBROADCASTSD(data.Offset(48), Y4) 263 VBROADCASTSD(data.Offset(56), Y5) 264 VBROADCASTSD(data.Offset(64), Y6) 265 VBROADCASTSD(data.Offset(72), Y7) 266 VBROADCASTSD(data.Offset(80), Y8) 267 VBROADCASTSD(data.Offset(88), Y9) 268 } 269 270 Label("LBB2_6") 271 { 272 VADDPD(Y2, Y1, Y10) 273 VADDPD(Y3, Y1, Y11) 274 VADDPD(Y4, Y1, Y12) 275 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8)) 276 VMOVUPD(Y10, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 277 VMOVUPD(Y11, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 278 VMOVUPD(Y12, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 279 VADDPD(Y5, Y1, Y10) 280 VADDPD(Y6, Y1, Y11) 281 VADDPD(Y7, Y1, Y12) 282 VADDPD(Y1, Y8, Y13) 283 VMOVUPD(Y10, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 284 VMOVUPD(Y11, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 285 VMOVUPD(Y12, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 286 VMOVUPD(Y13, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 287 ADDQ(Imm(32), RCX) 288 VADDPD(Y1, Y9, Y1) 289 ADDQ(I32(-2), RDX) 290 JNE(LabelRef("LBB2_6")) 291 TESTB(Imm(1), R8B) 292 JE(LabelRef("LBB2_9")) 293 } 294 295 Label("LBB2_8") 296 { 297 VBROADCASTSD(data.Offset(32), Y2) 298 VADDPD(Y2, Y1, Y2) 299 VBROADCASTSD(data.Offset(40), Y3) 300 VADDPD(Y3, Y1, Y3) 301 VBROADCASTSD(data.Offset(48), Y4) 302 VADDPD(Y4, Y1, Y4) 303 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8)) 304 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 305 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 306 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 307 } 308 309 Label("LBB2_9") 310 { 311 CMPQ(RAX, RSI) 312 JE(LabelRef("LBB2_13")) 313 VCVTSI2SDQ(RAX, X14, X1) 314 VADDSD(X0, X1, X0) 315 } 316 317 Label("LBB2_11") 318 { 319 VMOVSD(data.Offset(96), X1) 320 } 321 322 Label("LBB2_12") 323 { 324 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 325 VADDSD(X1, X0, X0) 326 ADDQ(Imm(1), RAX) 327 CMPQ(RSI, RAX) 328 JNE(LabelRef("LBB2_12")) 329 } 330 331 Label("LBB2_13") 332 { 333 VZEROUPPER() 334 RET() 335 } 336 337 Label("LBB2_4") 338 { 339 XORL(ECX, ECX) 340 TESTB(Imm(1), R8B) 341 JNE(LabelRef("LBB2_8")) 342 JMP(LabelRef("LBB2_9")) 343 } 344 } 345 346 func genRange_F32() { 347 348 data := GLOBL("dataRangeF32", RODATA|NOPTR) 349 DATA(0, U32(0x00000000)) 350 DATA(4, U32(0x3f800000)) 351 DATA(8, U32(0x40000000)) 352 DATA(12, U32(0x40400000)) 353 DATA(16, U32(0x40800000)) 354 DATA(20, U32(0x40a00000)) 355 DATA(24, U32(0x40c00000)) 356 DATA(28, U32(0x40e00000)) 357 358 DATA(32, U32(0x41000000)) 359 DATA(36, U32(0x41800000)) 360 DATA(40, U32(0x41c00000)) 361 DATA(44, U32(0x42000000)) 362 DATA(48, U32(0x42200000)) 363 DATA(52, U32(0x42400000)) 364 DATA(56, U32(0x42600000)) 365 DATA(60, U32(0x42800000)) 366 DATA(64, U32(0x3f800000)) 367 368 TEXT("Range_AVX2_F32", NOSPLIT, "func(x []float32, a float32, n int)") 369 Pragma("noescape") 370 Load(Param("x").Base(), RDI) 371 Load(Param("a"), X0) 372 Load(Param("n"), RSI) 373 374 TESTQ(RSI, RSI) 375 JE(LabelRef("LBB3_13")) 376 CMPQ(RSI, Imm(32)) 377 JAE(LabelRef("LBB3_3")) 378 XORL(EAX, EAX) 379 JMP(LabelRef("LBB3_11")) 380 381 Label("LBB3_3") 382 { 383 MOVQ(RSI, RAX) 384 ANDQ(I32(-32), RAX) 385 VBROADCASTSS(X0, Y1) 386 VADDPS(data.Offset(0), Y1, Y1) 387 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 388 MOVQ(RCX, R8) 389 SHRQ(Imm(5), R8) 390 ADDQ(Imm(1), R8) 391 TESTQ(RCX, RCX) 392 JE(LabelRef("LBB3_4")) 393 MOVQ(R8, RDX) 394 ANDQ(I32(-2), RDX) 395 XORL(ECX, ECX) 396 VBROADCASTSS(data.Offset(32), Y2) 397 VBROADCASTSS(data.Offset(36), Y3) 398 VBROADCASTSS(data.Offset(40), Y4) 399 VBROADCASTSS(data.Offset(44), Y5) 400 VBROADCASTSS(data.Offset(48), Y6) 401 VBROADCASTSS(data.Offset(52), Y7) 402 VBROADCASTSS(data.Offset(56), Y8) 403 VBROADCASTSS(data.Offset(60), Y9) 404 } 405 406 Label("LBB3_6") 407 { 408 VADDPS(Y2, Y1, Y10) 409 VADDPS(Y3, Y1, Y11) 410 VADDPS(Y4, Y1, Y12) 411 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 412 VMOVUPS(Y10, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 413 VMOVUPS(Y11, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 414 VMOVUPS(Y12, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 415 VADDPS(Y5, Y1, Y10) 416 VADDPS(Y6, Y1, Y11) 417 VADDPS(Y7, Y1, Y12) 418 VADDPS(Y1, Y8, Y13) 419 VMOVUPS(Y10, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 420 VMOVUPS(Y11, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 421 VMOVUPS(Y12, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 422 VMOVUPS(Y13, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 423 ADDQ(Imm(64), RCX) 424 VADDPS(Y1, Y9, Y1) 425 ADDQ(I32(-2), RDX) 426 JNE(LabelRef("LBB3_6")) 427 TESTB(Imm(1), R8B) 428 JE(LabelRef("LBB3_9")) 429 } 430 431 Label("LBB3_8") 432 { 433 VBROADCASTSS(data.Offset(32), Y2) 434 VADDPS(Y2, Y1, Y2) 435 VBROADCASTSS(data.Offset(36), Y3) 436 VADDPS(Y3, Y1, Y3) 437 VBROADCASTSS(data.Offset(40), Y4) 438 VADDPS(Y4, Y1, Y4) 439 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 440 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 441 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 442 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 443 } 444 445 Label("LBB3_9") 446 { 447 CMPQ(RAX, RSI) 448 JE(LabelRef("LBB3_13")) 449 VCVTSI2SSQ(RAX, X14, X1) 450 VADDSS(X0, X1, X0) 451 } 452 453 Label("LBB3_11") 454 { 455 VMOVSS(data.Offset(64), X1) 456 } 457 458 Label("LBB3_12") 459 { 460 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 461 VADDSS(X1, X0, X0) 462 ADDQ(Imm(1), RAX) 463 CMPQ(RSI, RAX) 464 JNE(LabelRef("LBB3_12")) 465 } 466 467 Label("LBB3_13") 468 { 469 VZEROUPPER() 470 RET() 471 } 472 473 Label("LBB3_4") 474 { 475 XORL(ECX, ECX) 476 TESTB(Imm(1), R8B) 477 JNE(LabelRef("LBB3_8")) 478 JMP(LabelRef("LBB3_9")) 479 } 480 } 481 482 func genGather_F64() { 483 484 TEXT("Gather_AVX2_F64", NOSPLIT, "func(x, y []float64, z []int)") 485 Pragma("noescape") 486 Load(Param("x").Base(), RDI) 487 Load(Param("y").Base(), RSI) 488 Load(Param("z").Base(), RDX) 489 Load(Param("z").Len(), RCX) 490 491 TESTQ(RCX, RCX) 492 JE(LabelRef("LBB4_7")) 493 CMPQ(RCX, Imm(16)) 494 JAE(LabelRef("LBB4_3")) 495 XORL(R8L, R8L) 496 JMP(LabelRef("LBB4_6")) 497 498 Label("LBB4_3") 499 { 500 MOVQ(RCX, R8) 501 ANDQ(I32(-16), R8) 502 XORL(R9L, R9L) 503 } 504 505 Label("LBB4_4") 506 { 507 MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX) 508 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0) 509 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX) 510 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X0, X0) 511 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX) 512 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X1) 513 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX) 514 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X1, X1) 515 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(32), RAX) 516 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X2) 517 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(40), RAX) 518 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X2, X2) 519 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(48), RAX) 520 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X3) 521 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(56), RAX) 522 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X3, X3) 523 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(64), RAX) 524 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X4) 525 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(72), RAX) 526 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X4, X4) 527 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(80), RAX) 528 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X5) 529 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(88), RAX) 530 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X5, X5) 531 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(96), RAX) 532 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X6) 533 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(104), RAX) 534 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X6, X6) 535 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(112), RAX) 536 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X7) 537 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(120), RAX) 538 VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X7, X7) 539 VMOVUPS(X1, Mem{Base: RDI}.Idx(R9, 8).Offset(16)) 540 VMOVUPS(X0, Mem{Base: RDI}.Idx(R9, 8)) 541 VMOVUPS(X3, Mem{Base: RDI}.Idx(R9, 8).Offset(48)) 542 VMOVUPS(X2, Mem{Base: RDI}.Idx(R9, 8).Offset(32)) 543 VMOVUPS(X5, Mem{Base: RDI}.Idx(R9, 8).Offset(80)) 544 VMOVUPS(X4, Mem{Base: RDI}.Idx(R9, 8).Offset(64)) 545 VMOVUPS(X7, Mem{Base: RDI}.Idx(R9, 8).Offset(112)) 546 VMOVUPS(X6, Mem{Base: RDI}.Idx(R9, 8).Offset(96)) 547 ADDQ(Imm(16), R9) 548 CMPQ(R8, R9) 549 JNE(LabelRef("LBB4_4")) 550 CMPQ(R8, RCX) 551 JE(LabelRef("LBB4_7")) 552 } 553 554 Label("LBB4_6") 555 { 556 MOVQ(Mem{Base: RDX}.Idx(R8, 8), RAX) 557 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0) 558 VMOVSD(X0, Mem{Base: RDI}.Idx(R8, 8)) 559 ADDQ(Imm(1), R8) 560 CMPQ(RCX, R8) 561 JNE(LabelRef("LBB4_6")) 562 } 563 564 Label("LBB4_7") 565 { 566 RET() 567 } 568 } 569 570 func genGather_F32() { 571 572 TEXT("Gather_AVX2_F32", NOSPLIT, "func(x, y []float32, z []int)") 573 Pragma("noescape") 574 Load(Param("x").Base(), RDI) 575 Load(Param("y").Base(), RSI) 576 Load(Param("z").Base(), RDX) 577 Load(Param("z").Len(), RCX) 578 579 TESTQ(RCX, RCX) 580 JE(LabelRef("LBB5_7")) 581 CMPQ(RCX, Imm(16)) 582 JAE(LabelRef("LBB5_3")) 583 XORL(R8L, R8L) 584 JMP(LabelRef("LBB5_6")) 585 586 Label("LBB5_3") 587 { 588 MOVQ(RCX, R8) 589 ANDQ(I32(-16), R8) 590 XORL(R9L, R9L) 591 } 592 593 Label("LBB5_4") 594 { 595 MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX) 596 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0) 597 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX) 598 VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 599 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX) 600 VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 601 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX) 602 VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 603 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(32), RAX) 604 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X1) 605 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(40), RAX) 606 VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X1, X1) 607 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(48), RAX) 608 VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X1, X1) 609 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(56), RAX) 610 VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X1, X1) 611 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(64), RAX) 612 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X2) 613 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(72), RAX) 614 VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X2, X2) 615 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(80), RAX) 616 VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X2, X2) 617 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(88), RAX) 618 VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X2, X2) 619 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(96), RAX) 620 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X3) 621 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(104), RAX) 622 VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X3, X3) 623 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(112), RAX) 624 VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X3, X3) 625 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(120), RAX) 626 VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X3, X3) 627 VMOVUPS(X0, Mem{Base: RDI}.Idx(R9, 4)) 628 VMOVUPS(X1, Mem{Base: RDI}.Idx(R9, 4).Offset(16)) 629 VMOVUPS(X2, Mem{Base: RDI}.Idx(R9, 4).Offset(32)) 630 VMOVUPS(X3, Mem{Base: RDI}.Idx(R9, 4).Offset(48)) 631 ADDQ(Imm(16), R9) 632 CMPQ(R8, R9) 633 JNE(LabelRef("LBB5_4")) 634 CMPQ(R8, RCX) 635 JE(LabelRef("LBB5_7")) 636 } 637 638 Label("LBB5_6") 639 { 640 MOVQ(Mem{Base: RDX}.Idx(R8, 8), RAX) 641 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0) 642 VMOVSS(X0, Mem{Base: RDI}.Idx(R8, 4)) 643 ADDQ(Imm(1), R8) 644 CMPQ(RCX, R8) 645 JNE(LabelRef("LBB5_6")) 646 } 647 648 Label("LBB5_7") 649 { 650 RET() 651 } 652 } 653 654 func genScatter_F64() { 655 656 TEXT("Scatter_AVX2_F64", NOSPLIT, "func(x, y []float64, z []int)") 657 Pragma("noescape") 658 Load(Param("x").Base(), RDI) 659 Load(Param("y").Base(), RSI) 660 Load(Param("z").Base(), RDX) 661 Load(Param("z").Len(), RCX) 662 663 TESTQ(RCX, RCX) 664 JE(LabelRef("LBB6_8")) 665 LEAQ(Mem{Base: RCX}.Offset(-1), RAX) 666 MOVL(ECX, R8L) 667 ANDL(Imm(3), R8L) 668 CMPQ(RAX, Imm(3)) 669 JAE(LabelRef("LBB6_3")) 670 XORL(R9L, R9L) 671 JMP(LabelRef("LBB6_5")) 672 673 Label("LBB6_3") 674 { 675 ANDQ(I32(-4), RCX) 676 XORL(R9L, R9L) 677 } 678 679 Label("LBB6_4") 680 { 681 VMOVSD(Mem{Base: RSI}.Idx(R9, 8), X0) 682 MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX) 683 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 684 VMOVSD(Mem{Base: RSI}.Idx(R9, 8).Offset(8), X0) 685 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX) 686 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 687 VMOVSD(Mem{Base: RSI}.Idx(R9, 8).Offset(16), X0) 688 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX) 689 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 690 VMOVSD(Mem{Base: RSI}.Idx(R9, 8).Offset(24), X0) 691 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX) 692 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 693 ADDQ(Imm(4), R9) 694 CMPQ(RCX, R9) 695 JNE(LabelRef("LBB6_4")) 696 } 697 698 Label("LBB6_5") 699 { 700 TESTQ(R8, R8) 701 JE(LabelRef("LBB6_8")) 702 LEAQ(Mem{Base: RDX}.Idx(R9, 8), RCX) 703 LEAQ(Mem{Base: RSI}.Idx(R9, 8), RAX) 704 XORL(EDX, EDX) 705 } 706 707 Label("LBB6_7") 708 { 709 VMOVSD(Mem{Base: RAX}.Idx(RDX, 8), X0) 710 MOVQ(Mem{Base: RCX}.Idx(RDX, 8), RSI) 711 VMOVSD(X0, Mem{Base: RDI}.Idx(RSI, 8)) 712 ADDQ(Imm(1), RDX) 713 CMPQ(R8, RDX) 714 JNE(LabelRef("LBB6_7")) 715 } 716 717 Label("LBB6_8") 718 { 719 RET() 720 } 721 } 722 723 func genScatter_F32() { 724 725 TEXT("Scatter_AVX2_F32", NOSPLIT, "func(x, y []float32, z []int)") 726 Pragma("noescape") 727 Load(Param("x").Base(), RDI) 728 Load(Param("y").Base(), RSI) 729 Load(Param("z").Base(), RDX) 730 Load(Param("z").Len(), RCX) 731 732 TESTQ(RCX, RCX) 733 JE(LabelRef("LBB7_8")) 734 LEAQ(Mem{Base: RCX}.Offset(-1), RAX) 735 MOVL(ECX, R8L) 736 ANDL(Imm(3), R8L) 737 CMPQ(RAX, Imm(3)) 738 JAE(LabelRef("LBB7_3")) 739 XORL(R9L, R9L) 740 JMP(LabelRef("LBB7_5")) 741 742 Label("LBB7_3") 743 { 744 ANDQ(I32(-4), RCX) 745 XORL(R9L, R9L) 746 } 747 748 Label("LBB7_4") 749 { 750 VMOVSS(Mem{Base: RSI}.Idx(R9, 4), X0) 751 MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX) 752 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 753 VMOVSS(Mem{Base: RSI}.Idx(R9, 4).Offset(4), X0) 754 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX) 755 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 756 VMOVSS(Mem{Base: RSI}.Idx(R9, 4).Offset(8), X0) 757 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX) 758 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 759 VMOVSS(Mem{Base: RSI}.Idx(R9, 4).Offset(12), X0) 760 MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX) 761 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 762 ADDQ(Imm(4), R9) 763 CMPQ(RCX, R9) 764 JNE(LabelRef("LBB7_4")) 765 } 766 767 Label("LBB7_5") 768 { 769 TESTQ(R8, R8) 770 JE(LabelRef("LBB7_8")) 771 LEAQ(Mem{Base: RDX}.Idx(R9, 8), RCX) 772 LEAQ(Mem{Base: RSI}.Idx(R9, 4), RAX) 773 XORL(EDX, EDX) 774 } 775 776 Label("LBB7_7") 777 { 778 VMOVSS(Mem{Base: RAX}.Idx(RDX, 4), X0) 779 MOVQ(Mem{Base: RCX}.Idx(RDX, 8), RSI) 780 VMOVSS(X0, Mem{Base: RDI}.Idx(RSI, 4)) 781 ADDQ(Imm(1), RDX) 782 CMPQ(R8, RDX) 783 JNE(LabelRef("LBB7_7")) 784 } 785 786 Label("LBB7_8") 787 { 788 RET() 789 } 790 } 791 792 func genFromBool_F64() { 793 data := GLOBL("dataFromBoolF64", RODATA|NOPTR) 794 DATA(0, I32(1)) 795 DATA(4, U64(0x3ff0000000000000)) 796 797 TEXT("FromBool_AVX2_F64", NOSPLIT, "func(x []float64, y []bool)") 798 Pragma("noescape") 799 Load(Param("x").Base(), RDI) 800 Load(Param("y").Base(), RSI) 801 Load(Param("x").Len(), RDX) 802 803 TESTQ(RDX, RDX) 804 JE(LabelRef("LBB4_10")) 805 CMPQ(RDX, Imm(16)) 806 JAE(LabelRef("LBB4_3")) 807 XORL(EAX, EAX) 808 JMP(LabelRef("LBB4_6")) 809 810 Label("LBB4_3") 811 { 812 MOVQ(RDX, RAX) 813 ANDQ(I32(-16), RAX) 814 XORL(ECX, ECX) 815 VPXOR(X0, X0, X0) 816 VPCMPEQD(X1, X1, X1) 817 VPBROADCASTD(data.Offset(0), X2) 818 } 819 820 Label("LBB4_4") 821 { 822 VMOVD(Mem{Base: RSI}.Idx(RCX, 1), X3) 823 VMOVD(Mem{Base: RSI}.Idx(RCX, 1).Offset(4), X4) 824 VMOVD(Mem{Base: RSI}.Idx(RCX, 1).Offset(8), X5) 825 VMOVD(Mem{Base: RSI}.Idx(RCX, 1).Offset(12), X6) 826 VPCMPEQB(X0, X3, X3) 827 VPXOR(X1, X3, X3) 828 VPMOVZXBD(X3, X3) 829 VPAND(X2, X3, X3) 830 VCVTDQ2PD(X3, Y3) 831 VPCMPEQB(X0, X4, X4) 832 VPXOR(X1, X4, X4) 833 VPMOVZXBD(X4, X4) 834 VPAND(X2, X4, X4) 835 VCVTDQ2PD(X4, Y4) 836 VPCMPEQB(X0, X5, X5) 837 VPXOR(X1, X5, X5) 838 VPMOVZXBD(X5, X5) 839 VPAND(X2, X5, X5) 840 VCVTDQ2PD(X5, Y5) 841 VPCMPEQB(X0, X6, X6) 842 VPXOR(X1, X6, X6) 843 VPMOVZXBD(X6, X6) 844 VPAND(X2, X6, X6) 845 VCVTDQ2PD(X6, Y6) 846 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8)) 847 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 848 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 849 VMOVUPS(Y6, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 850 ADDQ(Imm(16), RCX) 851 CMPQ(RAX, RCX) 852 JNE(LabelRef("LBB4_4")) 853 CMPQ(RAX, RDX) 854 JNE(LabelRef("LBB4_6")) 855 } 856 857 Label("LBB4_10") 858 { 859 VZEROUPPER() 860 RET() 861 } 862 863 Label("LBB4_6") 864 { 865 VMOVQ(data.Offset(4), X0) 866 JMP(LabelRef("LBB4_7")) 867 } 868 869 Label("LBB4_9") 870 { 871 VMOVQ(X1, Mem{Base: RDI}.Idx(RAX, 8)) 872 ADDQ(Imm(1), RAX) 873 CMPQ(RDX, RAX) 874 JE(LabelRef("LBB4_10")) 875 } 876 877 Label("LBB4_7") 878 { 879 CMPB(Mem{Base: RSI}.Idx(RAX, 1), Imm(0)) 880 VMOVDQA(X0, X1) 881 JNE(LabelRef("LBB4_9")) 882 VPXOR(X1, X1, X1) 883 JMP(LabelRef("LBB4_9")) 884 } 885 } 886 887 func genFromBool_F32() { 888 889 data := GLOBL("dataFromBoolF32", RODATA|NOPTR) 890 DATA(0, I32(1)) 891 DATA(4, I32(0x3f800000)) 892 893 TEXT("FromBool_AVX2_F32", NOSPLIT, "func(x []float32, y []bool)") 894 Pragma("noescape") 895 Load(Param("x").Base(), RDI) 896 Load(Param("y").Base(), RSI) 897 Load(Param("x").Len(), RDX) 898 899 TESTQ(RDX, RDX) 900 JE(LabelRef("LBB5_10")) 901 CMPQ(RDX, Imm(32)) 902 JAE(LabelRef("LBB5_3")) 903 XORL(EAX, EAX) 904 JMP(LabelRef("LBB5_6")) 905 906 Label("LBB5_3") 907 { 908 MOVQ(RDX, RAX) 909 ANDQ(I32(-32), RAX) 910 XORL(ECX, ECX) 911 VPXOR(X0, X0, X0) 912 VPCMPEQD(X1, X1, X1) 913 VPBROADCASTD(data.Offset(0), Y2) 914 } 915 916 Label("LBB5_4") 917 { 918 VMOVQ(Mem{Base: RSI}.Idx(RCX, 1), X3) 919 VMOVQ(Mem{Base: RSI}.Idx(RCX, 1).Offset(8), X4) 920 VMOVQ(Mem{Base: RSI}.Idx(RCX, 1).Offset(16), X5) 921 VMOVQ(Mem{Base: RSI}.Idx(RCX, 1).Offset(24), X6) 922 VPCMPEQB(X0, X3, X3) 923 VPXOR(X1, X3, X3) 924 VPMOVZXBD(X3, Y3) 925 VPAND(Y2, Y3, Y3) 926 VCVTDQ2PS(Y3, Y3) 927 VPCMPEQB(X0, X4, X4) 928 VPXOR(X1, X4, X4) 929 VPMOVZXBD(X4, Y4) 930 VPAND(Y2, Y4, Y4) 931 VCVTDQ2PS(Y4, Y4) 932 VPCMPEQB(X0, X5, X5) 933 VPXOR(X1, X5, X5) 934 VPMOVZXBD(X5, Y5) 935 VPAND(Y2, Y5, Y5) 936 VCVTDQ2PS(Y5, Y5) 937 VPCMPEQB(X0, X6, X6) 938 VPXOR(X1, X6, X6) 939 VPMOVZXBD(X6, Y6) 940 VPAND(Y2, Y6, Y6) 941 VCVTDQ2PS(Y6, Y6) 942 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4)) 943 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 944 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 945 VMOVUPS(Y6, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 946 ADDQ(Imm(32), RCX) 947 CMPQ(RAX, RCX) 948 JNE(LabelRef("LBB5_4")) 949 CMPQ(RAX, RDX) 950 JNE(LabelRef("LBB5_6")) 951 } 952 953 Label("LBB5_10") 954 { 955 VZEROUPPER() 956 RET() 957 } 958 959 Label("LBB5_6") 960 { 961 VMOVD(data.Offset(4), X0) 962 JMP(LabelRef("LBB5_7")) 963 } 964 965 Label("LBB5_9") 966 { 967 VMOVD(X1, Mem{Base: RDI}.Idx(RAX, 4)) 968 ADDQ(Imm(1), RAX) 969 CMPQ(RDX, RAX) 970 JE(LabelRef("LBB5_10")) 971 } 972 973 Label("LBB5_7") 974 { 975 CMPB(Mem{Base: RSI}.Idx(RAX, 1), Imm(0)) 976 VMOVDQA(X0, X1) 977 JNE(LabelRef("LBB5_9")) 978 VPXOR(X1, X1, X1) 979 JMP(LabelRef("LBB5_9")) 980 } 981 } 982 983 func genFromFloat32_F64() { 984 985 TEXT("FromFloat32_AVX2_F64", NOSPLIT, "func(x []float64, y []float32)") 986 Pragma("noescape") 987 Load(Param("x").Base(), RDI) 988 Load(Param("y").Base(), RSI) 989 Load(Param("x").Len(), RDX) 990 991 TESTQ(RDX, RDX) 992 JE(LabelRef("LBB6_11")) 993 CMPQ(RDX, Imm(16)) 994 JAE(LabelRef("LBB6_3")) 995 XORL(EAX, EAX) 996 JMP(LabelRef("LBB6_10")) 997 998 Label("LBB6_3") 999 { 1000 MOVQ(RDX, RAX) 1001 ANDQ(I32(-16), RAX) 1002 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 1003 MOVQ(RCX, R8) 1004 SHRQ(Imm(4), R8) 1005 ADDQ(Imm(1), R8) 1006 TESTQ(RCX, RCX) 1007 JE(LabelRef("LBB6_4")) 1008 MOVQ(R8, R9) 1009 ANDQ(I32(-2), R9) 1010 XORL(ECX, ECX) 1011 } 1012 1013 Label("LBB6_6") 1014 { 1015 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1016 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1) 1017 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2) 1018 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3) 1019 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 1020 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1021 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1022 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1023 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y0) 1024 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(80), Y1) 1025 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y2) 1026 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(112), Y3) 1027 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 1028 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 1029 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 1030 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 1031 ADDQ(Imm(32), RCX) 1032 ADDQ(I32(-2), R9) 1033 JNE(LabelRef("LBB6_6")) 1034 TESTB(Imm(1), R8B) 1035 JE(LabelRef("LBB6_9")) 1036 } 1037 1038 Label("LBB6_8") 1039 { 1040 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1041 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1) 1042 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2) 1043 VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3) 1044 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 1045 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1046 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1047 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1048 } 1049 1050 Label("LBB6_9") 1051 { 1052 CMPQ(RAX, RDX) 1053 JE(LabelRef("LBB6_11")) 1054 } 1055 1056 Label("LBB6_10") 1057 { 1058 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0) 1059 VCVTSS2SD(X0, X0, X0) 1060 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 1061 ADDQ(Imm(1), RAX) 1062 CMPQ(RDX, RAX) 1063 JNE(LabelRef("LBB6_10")) 1064 } 1065 1066 Label("LBB6_11") 1067 { 1068 VZEROUPPER() 1069 RET() 1070 } 1071 1072 Label("LBB6_4") 1073 { 1074 XORL(ECX, ECX) 1075 TESTB(Imm(1), R8B) 1076 JNE(LabelRef("LBB6_8")) 1077 JMP(LabelRef("LBB6_9")) 1078 } 1079 } 1080 1081 func genFromFloat64_F32() { 1082 1083 TEXT("FromFloat64_AVX2_F32", NOSPLIT, "func(x []float32, y []float64)") 1084 Pragma("noescape") 1085 Load(Param("x").Base(), RDI) 1086 Load(Param("y").Base(), RSI) 1087 Load(Param("x").Len(), RDX) 1088 1089 TESTQ(RDX, RDX) 1090 JE(LabelRef("LBB7_11")) 1091 CMPQ(RDX, Imm(16)) 1092 JAE(LabelRef("LBB7_3")) 1093 XORL(EAX, EAX) 1094 JMP(LabelRef("LBB7_10")) 1095 1096 Label("LBB7_3") 1097 { 1098 MOVQ(RDX, RAX) 1099 ANDQ(I32(-16), RAX) 1100 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 1101 MOVQ(RCX, R8) 1102 SHRQ(Imm(4), R8) 1103 ADDQ(Imm(1), R8) 1104 TESTQ(RCX, RCX) 1105 JE(LabelRef("LBB7_4")) 1106 MOVQ(R8, R9) 1107 ANDQ(I32(-2), R9) 1108 XORL(ECX, ECX) 1109 } 1110 1111 Label("LBB7_6") 1112 { 1113 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8), X0) 1114 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1) 1115 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2) 1116 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3) 1117 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4)) 1118 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16)) 1119 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1120 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48)) 1121 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0) 1122 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X1) 1123 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X2) 1124 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X3) 1125 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1126 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(80)) 1127 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1128 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(112)) 1129 ADDQ(Imm(32), RCX) 1130 ADDQ(I32(-2), R9) 1131 JNE(LabelRef("LBB7_6")) 1132 TESTB(Imm(1), R8B) 1133 JE(LabelRef("LBB7_9")) 1134 } 1135 1136 Label("LBB7_8") 1137 { 1138 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8), X0) 1139 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1) 1140 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2) 1141 VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3) 1142 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4)) 1143 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16)) 1144 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1145 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48)) 1146 } 1147 1148 Label("LBB7_9") 1149 { 1150 CMPQ(RAX, RDX) 1151 JE(LabelRef("LBB7_11")) 1152 } 1153 1154 Label("LBB7_10") 1155 { 1156 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0) 1157 VCVTSD2SS(X0, X0, X0) 1158 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 1159 ADDQ(Imm(1), RAX) 1160 CMPQ(RDX, RAX) 1161 JNE(LabelRef("LBB7_10")) 1162 } 1163 1164 Label("LBB7_11") 1165 { 1166 RET() 1167 } 1168 1169 Label("LBB7_4") 1170 { 1171 XORL(ECX, ECX) 1172 TESTB(Imm(1), R8B) 1173 JNE(LabelRef("LBB7_8")) 1174 JMP(LabelRef("LBB7_9")) 1175 } 1176 } 1177 1178 func genFromInt64_F64() { 1179 1180 TEXT("FromInt64_AVX2_F64", NOSPLIT, "func(x []float64, y []int64)") 1181 Pragma("noescape") 1182 Load(Param("x").Base(), RDI) 1183 Load(Param("y").Base(), RSI) 1184 Load(Param("x").Len(), RDX) 1185 1186 TESTQ(RDX, RDX) 1187 JE(LabelRef("LBB8_11")) 1188 CMPQ(RDX, Imm(16)) 1189 JAE(LabelRef("LBB8_3")) 1190 XORL(R10L, R10L) 1191 JMP(LabelRef("LBB8_10")) 1192 1193 Label("LBB8_3") 1194 { 1195 MOVQ(RDX, R10) 1196 ANDQ(I32(-16), R10) 1197 LEAQ(Mem{Base: R10}.Offset(-16), RCX) 1198 MOVQ(RCX, R8) 1199 SHRQ(Imm(4), R8) 1200 ADDQ(Imm(1), R8) 1201 TESTQ(RCX, RCX) 1202 JE(LabelRef("LBB8_4")) 1203 MOVQ(R8, R9) 1204 ANDQ(I32(-2), R9) 1205 XORL(ECX, ECX) 1206 } 1207 1208 Label("LBB8_6") 1209 { 1210 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0) 1211 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1) 1212 VPEXTRQ(Imm(1), X0, RAX) 1213 VCVTSI2SDQ(RAX, X11, X2) 1214 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X3) 1215 VMOVQ(X0, RAX) 1216 VCVTSI2SDQ(RAX, X11, X0) 1217 VPEXTRQ(Imm(1), X1, RAX) 1218 VCVTSI2SDQ(RAX, X11, X4) 1219 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X5) 1220 VMOVQ(X1, RAX) 1221 VCVTSI2SDQ(RAX, X11, X1) 1222 VPEXTRQ(Imm(1), X5, RAX) 1223 VCVTSI2SDQ(RAX, X11, X6) 1224 VUNPCKLPD(X2, X0, X8) 1225 VMOVQ(X5, RAX) 1226 VCVTSI2SDQ(RAX, X11, X2) 1227 VPEXTRQ(Imm(1), X3, RAX) 1228 VCVTSI2SDQ(RAX, X11, X5) 1229 VUNPCKLPD(X4, X1, X10) 1230 VMOVQ(X3, RAX) 1231 VCVTSI2SDQ(RAX, X11, X3) 1232 VUNPCKLPD(X6, X2, X9) 1233 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X4) 1234 VPEXTRQ(Imm(1), X4, RAX) 1235 VUNPCKLPD(X5, X3, X3) 1236 VCVTSI2SDQ(RAX, X11, X5) 1237 VMOVQ(X4, RAX) 1238 VCVTSI2SDQ(RAX, X11, X4) 1239 VUNPCKLPD(X5, X4, X4) 1240 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X5) 1241 VPEXTRQ(Imm(1), X5, RAX) 1242 VCVTSI2SDQ(RAX, X11, X6) 1243 VMOVQ(X5, RAX) 1244 VCVTSI2SDQ(RAX, X11, X5) 1245 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X7) 1246 VPEXTRQ(Imm(1), X7, RAX) 1247 VCVTSI2SDQ(RAX, X11, X0) 1248 VMOVQ(X7, RAX) 1249 VCVTSI2SDQ(RAX, X11, X7) 1250 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X2) 1251 VPEXTRQ(Imm(1), X2, RAX) 1252 VCVTSI2SDQ(RAX, X11, X1) 1253 VUNPCKLPD(X6, X5, X5) 1254 VMOVQ(X2, RAX) 1255 VCVTSI2SDQ(RAX, X11, X2) 1256 VUNPCKLPD(X0, X7, X0) 1257 VUNPCKLPD(X1, X2, X1) 1258 VMOVUPD(X10, Mem{Base: RDI}.Idx(RCX, 8).Offset(16)) 1259 VMOVUPD(X8, Mem{Base: RDI}.Idx(RCX, 8)) 1260 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1261 VMOVUPD(X9, Mem{Base: RDI}.Idx(RCX, 8).Offset(48)) 1262 VMOVUPD(X5, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1263 VMOVUPD(X4, Mem{Base: RDI}.Idx(RCX, 8).Offset(80)) 1264 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1265 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(112)) 1266 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0) 1267 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(144), X1) 1268 VPEXTRQ(Imm(1), X0, RAX) 1269 VCVTSI2SDQ(RAX, X11, X2) 1270 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X3) 1271 VMOVQ(X0, RAX) 1272 VCVTSI2SDQ(RAX, X11, X0) 1273 VPEXTRQ(Imm(1), X1, RAX) 1274 VCVTSI2SDQ(RAX, X11, X4) 1275 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(176), X5) 1276 VMOVQ(X1, RAX) 1277 VCVTSI2SDQ(RAX, X11, X1) 1278 VPEXTRQ(Imm(1), X5, RAX) 1279 VCVTSI2SDQ(RAX, X11, X6) 1280 VUNPCKLPD(X2, X0, X8) 1281 VMOVQ(X5, RAX) 1282 VCVTSI2SDQ(RAX, X11, X2) 1283 VPEXTRQ(Imm(1), X3, RAX) 1284 VCVTSI2SDQ(RAX, X11, X5) 1285 VUNPCKLPD(X4, X1, X10) 1286 VMOVQ(X3, RAX) 1287 VCVTSI2SDQ(RAX, X11, X3) 1288 VUNPCKLPD(X6, X2, X9) 1289 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(208), X4) 1290 VPEXTRQ(Imm(1), X4, RAX) 1291 VUNPCKLPD(X5, X3, X3) 1292 VCVTSI2SDQ(RAX, X11, X5) 1293 VMOVQ(X4, RAX) 1294 VCVTSI2SDQ(RAX, X11, X4) 1295 VUNPCKLPD(X5, X4, X4) 1296 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X5) 1297 VPEXTRQ(Imm(1), X5, RAX) 1298 VCVTSI2SDQ(RAX, X11, X6) 1299 VMOVQ(X5, RAX) 1300 VCVTSI2SDQ(RAX, X11, X5) 1301 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(240), X7) 1302 VPEXTRQ(Imm(1), X7, RAX) 1303 VCVTSI2SDQ(RAX, X11, X0) 1304 VMOVQ(X7, RAX) 1305 VCVTSI2SDQ(RAX, X11, X7) 1306 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X2) 1307 VPEXTRQ(Imm(1), X2, RAX) 1308 VCVTSI2SDQ(RAX, X11, X1) 1309 VUNPCKLPD(X6, X5, X5) 1310 VMOVQ(X2, RAX) 1311 VCVTSI2SDQ(RAX, X11, X2) 1312 VUNPCKLPD(X0, X7, X0) 1313 VUNPCKLPD(X1, X2, X1) 1314 VMOVUPD(X10, Mem{Base: RDI}.Idx(RCX, 8).Offset(144)) 1315 VMOVUPD(X8, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 1316 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 1317 VMOVUPD(X9, Mem{Base: RDI}.Idx(RCX, 8).Offset(176)) 1318 VMOVUPD(X5, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 1319 VMOVUPD(X4, Mem{Base: RDI}.Idx(RCX, 8).Offset(208)) 1320 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 1321 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(240)) 1322 ADDQ(Imm(32), RCX) 1323 ADDQ(I32(-2), R9) 1324 JNE(LabelRef("LBB8_6")) 1325 TESTB(Imm(1), R8B) 1326 JE(LabelRef("LBB8_9")) 1327 } 1328 1329 Label("LBB8_8") 1330 { 1331 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0) 1332 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1) 1333 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X3) 1334 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X2) 1335 VPEXTRQ(Imm(1), X0, RAX) 1336 VCVTSI2SDQ(RAX, X11, X4) 1337 VMOVQ(X0, RAX) 1338 VCVTSI2SDQ(RAX, X11, X0) 1339 VUNPCKLPD(X4, X0, X8) 1340 VPEXTRQ(Imm(1), X1, RAX) 1341 VCVTSI2SDQ(RAX, X11, X4) 1342 VMOVQ(X1, RAX) 1343 VCVTSI2SDQ(RAX, X11, X1) 1344 VUNPCKLPD(X4, X1, X1) 1345 VPEXTRQ(Imm(1), X2, RAX) 1346 VCVTSI2SDQ(RAX, X11, X4) 1347 VMOVQ(X2, RAX) 1348 VCVTSI2SDQ(RAX, X11, X2) 1349 VUNPCKLPD(X4, X2, X2) 1350 VPEXTRQ(Imm(1), X3, RAX) 1351 VCVTSI2SDQ(RAX, X11, X4) 1352 VMOVQ(X3, RAX) 1353 VCVTSI2SDQ(RAX, X11, X3) 1354 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X5) 1355 VPEXTRQ(Imm(1), X5, RAX) 1356 VCVTSI2SDQ(RAX, X11, X6) 1357 VMOVQ(X5, RAX) 1358 VCVTSI2SDQ(RAX, X11, X5) 1359 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X7) 1360 VPEXTRQ(Imm(1), X7, RAX) 1361 VCVTSI2SDQ(RAX, X11, X0) 1362 VUNPCKLPD(X4, X3, X3) 1363 VMOVQ(X7, RAX) 1364 VCVTSI2SDQ(RAX, X11, X4) 1365 VUNPCKLPD(X6, X5, X5) 1366 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X6) 1367 VPEXTRQ(Imm(1), X6, RAX) 1368 VUNPCKLPD(X0, X4, X0) 1369 VCVTSI2SDQ(RAX, X11, X4) 1370 VMOVQ(X6, RAX) 1371 VCVTSI2SDQ(RAX, X11, X6) 1372 VUNPCKLPD(X4, X6, X4) 1373 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X6) 1374 VPEXTRQ(Imm(1), X6, RAX) 1375 VCVTSI2SDQ(RAX, X11, X7) 1376 VMOVQ(X6, RAX) 1377 VCVTSI2SDQ(RAX, X11, X6) 1378 VUNPCKLPD(X7, X6, X6) 1379 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 8).Offset(16)) 1380 VMOVUPD(X8, Mem{Base: RDI}.Idx(RCX, 8)) 1381 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1382 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 8).Offset(48)) 1383 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1384 VMOVUPD(X5, Mem{Base: RDI}.Idx(RCX, 8).Offset(80)) 1385 VMOVUPD(X6, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1386 VMOVUPD(X4, Mem{Base: RDI}.Idx(RCX, 8).Offset(112)) 1387 } 1388 1389 Label("LBB8_9") 1390 { 1391 CMPQ(R10, RDX) 1392 JE(LabelRef("LBB8_11")) 1393 } 1394 1395 Label("LBB8_10") 1396 { 1397 VCVTSI2SDQ(Mem{Base: RSI}.Idx(R10, 8), X11, X0) 1398 VMOVSD(X0, Mem{Base: RDI}.Idx(R10, 8)) 1399 ADDQ(Imm(1), R10) 1400 CMPQ(RDX, R10) 1401 JNE(LabelRef("LBB8_10")) 1402 } 1403 1404 Label("LBB8_11") 1405 { 1406 RET() 1407 } 1408 1409 Label("LBB8_4") 1410 { 1411 XORL(ECX, ECX) 1412 TESTB(Imm(1), R8B) 1413 JNE(LabelRef("LBB8_8")) 1414 JMP(LabelRef("LBB8_9")) 1415 } 1416 } 1417 1418 func genFromInt64_F32() { 1419 1420 TEXT("FromInt64_AVX2_F32", NOSPLIT, "func(x []float32, y []int64)") 1421 Pragma("noescape") 1422 Load(Param("x").Base(), RDI) 1423 Load(Param("y").Base(), RSI) 1424 Load(Param("x").Len(), RDX) 1425 1426 TESTQ(RDX, RDX) 1427 JE(LabelRef("LBB9_11")) 1428 CMPQ(RDX, Imm(16)) 1429 JAE(LabelRef("LBB9_3")) 1430 XORL(R11L, R11L) 1431 JMP(LabelRef("LBB9_10")) 1432 1433 Label("LBB9_3") 1434 { 1435 MOVQ(RDX, R11) 1436 ANDQ(I32(-16), R11) 1437 LEAQ(Mem{Base: R11}.Offset(-16), RCX) 1438 MOVQ(RCX, R8) 1439 SHRQ(Imm(4), R8) 1440 ADDQ(Imm(1), R8) 1441 TESTQ(RCX, RCX) 1442 JE(LabelRef("LBB9_4")) 1443 MOVQ(R8, R9) 1444 ANDQ(I32(-2), R9) 1445 XORL(ECX, ECX) 1446 } 1447 1448 Label("LBB9_6") 1449 { 1450 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0) 1451 VPEXTRQ(Imm(1), X0, R10) 1452 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1) 1453 VCVTSI2SSQ(R10, X8, X2) 1454 VMOVQ(X0, RAX) 1455 VCVTSI2SSQ(RAX, X8, X0) 1456 VMOVQ(X1, RAX) 1457 VCVTSI2SSQ(RAX, X8, X3) 1458 VPEXTRQ(Imm(1), X1, RAX) 1459 VCVTSI2SSQ(RAX, X8, X1) 1460 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X4) 1461 VPEXTRQ(Imm(1), X4, RAX) 1462 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X5) 1463 VCVTSI2SSQ(RAX, X8, X6) 1464 VMOVQ(X4, RAX) 1465 VCVTSI2SSQ(RAX, X8, X4) 1466 VMOVQ(X5, RAX) 1467 VCVTSI2SSQ(RAX, X8, X7) 1468 VINSERTPS(Imm(16), X2, X0, X0) 1469 VINSERTPS(Imm(32), X3, X0, X0) 1470 VPEXTRQ(Imm(1), X5, RAX) 1471 VINSERTPS(Imm(48), X1, X0, X0) 1472 VCVTSI2SSQ(RAX, X8, X1) 1473 VINSERTPS(Imm(16), X6, X4, X2) 1474 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X3) 1475 VPEXTRQ(Imm(1), X3, RAX) 1476 VCVTSI2SSQ(RAX, X8, X4) 1477 VMOVQ(X3, RAX) 1478 VCVTSI2SSQ(RAX, X8, X3) 1479 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X5) 1480 VMOVQ(X5, RAX) 1481 VCVTSI2SSQ(RAX, X8, X6) 1482 VINSERTPS(Imm(32), X7, X2, X2) 1483 VINSERTPS(Imm(48), X1, X2, X1) 1484 VPEXTRQ(Imm(1), X5, RAX) 1485 VINSERTPS(Imm(16), X4, X3, X2) 1486 VCVTSI2SSQ(RAX, X8, X3) 1487 VINSERTPS(Imm(32), X6, X2, X2) 1488 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X4) 1489 VPEXTRQ(Imm(1), X4, RAX) 1490 VCVTSI2SSQ(RAX, X8, X5) 1491 VMOVQ(X4, RAX) 1492 VCVTSI2SSQ(RAX, X8, X4) 1493 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X6) 1494 VMOVQ(X6, RAX) 1495 VCVTSI2SSQ(RAX, X8, X7) 1496 VINSERTPS(Imm(48), X3, X2, X2) 1497 VINSERTPS(Imm(16), X5, X4, X3) 1498 VPEXTRQ(Imm(1), X6, RAX) 1499 VINSERTPS(Imm(32), X7, X3, X3) 1500 VCVTSI2SSQ(RAX, X8, X4) 1501 VINSERTPS(Imm(48), X4, X3, X3) 1502 VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 4)) 1503 VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16)) 1504 VMOVUPS(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1505 VMOVUPS(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48)) 1506 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0) 1507 VPEXTRQ(Imm(1), X0, RAX) 1508 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(144), X1) 1509 VCVTSI2SSQ(RAX, X8, X2) 1510 VMOVQ(X0, RAX) 1511 VCVTSI2SSQ(RAX, X8, X0) 1512 VMOVQ(X1, RAX) 1513 VCVTSI2SSQ(RAX, X8, X3) 1514 VPEXTRQ(Imm(1), X1, RAX) 1515 VCVTSI2SSQ(RAX, X8, X1) 1516 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X4) 1517 VPEXTRQ(Imm(1), X4, RAX) 1518 VCVTSI2SSQ(RAX, X8, X5) 1519 VMOVQ(X4, RAX) 1520 VCVTSI2SSQ(RAX, X8, X4) 1521 VINSERTPS(Imm(16), X2, X0, X0) 1522 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(176), X2) 1523 VPEXTRQ(Imm(1), X2, R10) 1524 VMOVQ(X2, RAX) 1525 VCVTSI2SSQ(RAX, X8, X2) 1526 VINSERTPS(Imm(32), X3, X0, X0) 1527 VCVTSI2SSQ(R10, X8, X3) 1528 VINSERTPS(Imm(48), X1, X0, X0) 1529 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X1) 1530 VPEXTRQ(Imm(1), X1, RAX) 1531 VINSERTPS(Imm(16), X5, X4, X4) 1532 VCVTSI2SSQ(RAX, X8, X5) 1533 VMOVQ(X1, RAX) 1534 VCVTSI2SSQ(RAX, X8, X1) 1535 VINSERTPS(Imm(32), X2, X4, X2) 1536 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(208), X4) 1537 VPEXTRQ(Imm(1), X4, R10) 1538 VMOVQ(X4, RAX) 1539 VCVTSI2SSQ(RAX, X8, X4) 1540 VINSERTPS(Imm(48), X3, X2, X2) 1541 VCVTSI2SSQ(R10, X8, X3) 1542 VINSERTPS(Imm(16), X5, X1, X1) 1543 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X5) 1544 VPEXTRQ(Imm(1), X5, RAX) 1545 VINSERTPS(Imm(32), X4, X1, X1) 1546 VCVTSI2SSQ(RAX, X8, X4) 1547 VMOVQ(X5, RAX) 1548 VCVTSI2SSQ(RAX, X8, X5) 1549 VINSERTPS(Imm(48), X3, X1, X1) 1550 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(240), X3) 1551 VPEXTRQ(Imm(1), X3, R10) 1552 VMOVQ(X3, RAX) 1553 VCVTSI2SSQ(RAX, X8, X3) 1554 VINSERTPS(Imm(16), X4, X5, X4) 1555 VCVTSI2SSQ(R10, X8, X5) 1556 VINSERTPS(Imm(32), X3, X4, X3) 1557 VINSERTPS(Imm(48), X5, X3, X3) 1558 VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1559 VMOVUPS(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(80)) 1560 VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1561 VMOVUPS(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(112)) 1562 ADDQ(Imm(32), RCX) 1563 ADDQ(I32(-2), R9) 1564 JNE(LabelRef("LBB9_6")) 1565 TESTB(Imm(1), R8B) 1566 JE(LabelRef("LBB9_9")) 1567 } 1568 1569 Label("LBB9_8") 1570 { 1571 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0) 1572 VPEXTRQ(Imm(1), X0, RAX) 1573 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1) 1574 VCVTSI2SSQ(RAX, X8, X2) 1575 VMOVQ(X0, RAX) 1576 VCVTSI2SSQ(RAX, X8, X0) 1577 VMOVQ(X1, RAX) 1578 VCVTSI2SSQ(RAX, X8, X3) 1579 VPEXTRQ(Imm(1), X1, RAX) 1580 VCVTSI2SSQ(RAX, X8, X1) 1581 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X4) 1582 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X5) 1583 VPEXTRQ(Imm(1), X4, RAX) 1584 VINSERTPS(Imm(16), X2, X0, X0) 1585 VCVTSI2SSQ(RAX, X8, X2) 1586 VMOVQ(X4, RAX) 1587 VCVTSI2SSQ(RAX, X8, X4) 1588 VMOVQ(X5, RAX) 1589 VCVTSI2SSQ(RAX, X8, X6) 1590 VINSERTPS(Imm(32), X3, X0, X0) 1591 VINSERTPS(Imm(48), X1, X0, X0) 1592 VPEXTRQ(Imm(1), X5, RAX) 1593 VINSERTPS(Imm(16), X2, X4, X1) 1594 VCVTSI2SSQ(RAX, X8, X2) 1595 VINSERTPS(Imm(32), X6, X1, X1) 1596 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X3) 1597 VPEXTRQ(Imm(1), X3, RAX) 1598 VCVTSI2SSQ(RAX, X8, X4) 1599 VMOVQ(X3, RAX) 1600 VCVTSI2SSQ(RAX, X8, X3) 1601 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X5) 1602 VMOVQ(X5, RAX) 1603 VCVTSI2SSQ(RAX, X8, X6) 1604 VINSERTPS(Imm(48), X2, X1, X1) 1605 VINSERTPS(Imm(16), X4, X3, X2) 1606 VPEXTRQ(Imm(1), X5, RAX) 1607 VINSERTPS(Imm(32), X6, X2, X2) 1608 VCVTSI2SSQ(RAX, X8, X3) 1609 VINSERTPS(Imm(48), X3, X2, X2) 1610 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3) 1611 VPEXTRQ(Imm(1), X3, RAX) 1612 VCVTSI2SSQ(RAX, X8, X4) 1613 VMOVQ(X3, RAX) 1614 VCVTSI2SSQ(RAX, X8, X3) 1615 VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X5) 1616 VMOVQ(X5, RAX) 1617 VCVTSI2SSQ(RAX, X8, X6) 1618 VINSERTPS(Imm(16), X4, X3, X3) 1619 VINSERTPS(Imm(32), X6, X3, X3) 1620 VPEXTRQ(Imm(1), X5, RAX) 1621 VCVTSI2SSQ(RAX, X8, X4) 1622 VINSERTPS(Imm(48), X4, X3, X3) 1623 VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 4)) 1624 VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16)) 1625 VMOVUPS(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1626 VMOVUPS(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48)) 1627 } 1628 1629 Label("LBB9_9") 1630 { 1631 CMPQ(R11, RDX) 1632 JE(LabelRef("LBB9_11")) 1633 } 1634 1635 Label("LBB9_10") 1636 { 1637 VCVTSI2SSQ(Mem{Base: RSI}.Idx(R11, 8), X8, X0) 1638 VMOVSS(X0, Mem{Base: RDI}.Idx(R11, 4)) 1639 ADDQ(Imm(1), R11) 1640 CMPQ(RDX, R11) 1641 JNE(LabelRef("LBB9_10")) 1642 } 1643 1644 Label("LBB9_11") 1645 { 1646 RET() 1647 } 1648 1649 Label("LBB9_4") 1650 { 1651 XORL(ECX, ECX) 1652 TESTB(Imm(1), R8B) 1653 JNE(LabelRef("LBB9_8")) 1654 JMP(LabelRef("LBB9_9")) 1655 } 1656 } 1657 1658 func genFromInt32_F64() { 1659 1660 TEXT("FromInt32_AVX2_F64", NOSPLIT, "func(x []float64, y []int32)") 1661 Pragma("noescape") 1662 Load(Param("x").Base(), RDI) 1663 Load(Param("y").Base(), RSI) 1664 Load(Param("x").Len(), RDX) 1665 1666 TESTQ(RDX, RDX) 1667 JE(LabelRef("LBB10_11")) 1668 CMPQ(RDX, Imm(16)) 1669 JAE(LabelRef("LBB10_3")) 1670 XORL(EAX, EAX) 1671 JMP(LabelRef("LBB10_10")) 1672 1673 Label("LBB10_3") 1674 { 1675 MOVQ(RDX, RAX) 1676 ANDQ(I32(-16), RAX) 1677 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 1678 MOVQ(RCX, R8) 1679 SHRQ(Imm(4), R8) 1680 ADDQ(Imm(1), R8) 1681 TESTQ(RCX, RCX) 1682 JE(LabelRef("LBB10_4")) 1683 MOVQ(R8, R9) 1684 ANDQ(I32(-2), R9) 1685 XORL(ECX, ECX) 1686 } 1687 1688 Label("LBB10_6") 1689 { 1690 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1691 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1) 1692 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2) 1693 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3) 1694 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 1695 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1696 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1697 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1698 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y0) 1699 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(80), Y1) 1700 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y2) 1701 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(112), Y3) 1702 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 1703 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 1704 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 1705 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 1706 ADDQ(Imm(32), RCX) 1707 ADDQ(I32(-2), R9) 1708 JNE(LabelRef("LBB10_6")) 1709 TESTB(Imm(1), R8B) 1710 JE(LabelRef("LBB10_9")) 1711 } 1712 1713 Label("LBB10_8") 1714 { 1715 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1716 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1) 1717 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2) 1718 VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3) 1719 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 1720 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1721 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1722 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1723 } 1724 1725 Label("LBB10_9") 1726 { 1727 CMPQ(RAX, RDX) 1728 JE(LabelRef("LBB10_11")) 1729 } 1730 1731 Label("LBB10_10") 1732 { 1733 VCVTSI2SDL(Mem{Base: RSI}.Idx(RAX, 4), X4, X0) 1734 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 1735 ADDQ(Imm(1), RAX) 1736 CMPQ(RDX, RAX) 1737 JNE(LabelRef("LBB10_10")) 1738 } 1739 1740 Label("LBB10_11") 1741 { 1742 VZEROUPPER() 1743 RET() 1744 } 1745 1746 Label("LBB10_4") 1747 { 1748 XORL(ECX, ECX) 1749 TESTB(Imm(1), R8B) 1750 JNE(LabelRef("LBB10_8")) 1751 JMP(LabelRef("LBB10_9")) 1752 } 1753 } 1754 1755 func genFromInt32_F32() { 1756 1757 TEXT("FromInt32_AVX2_F32", NOSPLIT, "func(x []float32, y []int32)") 1758 Pragma("noescape") 1759 Load(Param("x").Base(), RDI) 1760 Load(Param("y").Base(), RSI) 1761 Load(Param("x").Len(), RDX) 1762 1763 TESTQ(RDX, RDX) 1764 JE(LabelRef("LBB11_11")) 1765 CMPQ(RDX, Imm(32)) 1766 JAE(LabelRef("LBB11_3")) 1767 XORL(EAX, EAX) 1768 JMP(LabelRef("LBB11_10")) 1769 1770 Label("LBB11_3") 1771 { 1772 MOVQ(RDX, RAX) 1773 ANDQ(I32(-32), RAX) 1774 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 1775 MOVQ(RCX, R8) 1776 SHRQ(Imm(5), R8) 1777 ADDQ(Imm(1), R8) 1778 TESTQ(RCX, RCX) 1779 JE(LabelRef("LBB11_4")) 1780 MOVQ(R8, R9) 1781 ANDQ(I32(-2), R9) 1782 XORL(ECX, ECX) 1783 } 1784 1785 Label("LBB11_6") 1786 { 1787 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1788 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1) 1789 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2) 1790 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3) 1791 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 1792 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1793 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1794 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1795 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(128), Y0) 1796 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(160), Y1) 1797 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(192), Y2) 1798 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(224), Y3) 1799 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 1800 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 1801 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 1802 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 1803 ADDQ(Imm(64), RCX) 1804 ADDQ(I32(-2), R9) 1805 JNE(LabelRef("LBB11_6")) 1806 TESTB(Imm(1), R8B) 1807 JE(LabelRef("LBB11_9")) 1808 } 1809 1810 Label("LBB11_8") 1811 { 1812 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1813 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1) 1814 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2) 1815 VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3) 1816 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 1817 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1818 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1819 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1820 } 1821 1822 Label("LBB11_9") 1823 { 1824 CMPQ(RAX, RDX) 1825 JE(LabelRef("LBB11_11")) 1826 } 1827 1828 Label("LBB11_10") 1829 { 1830 VCVTSI2SSL(Mem{Base: RSI}.Idx(RAX, 4), X4, X0) 1831 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 1832 ADDQ(Imm(1), RAX) 1833 CMPQ(RDX, RAX) 1834 JNE(LabelRef("LBB11_10")) 1835 } 1836 1837 Label("LBB11_11") 1838 { 1839 VZEROUPPER() 1840 RET() 1841 } 1842 1843 Label("LBB11_4") 1844 { 1845 XORL(ECX, ECX) 1846 TESTB(Imm(1), R8B) 1847 JNE(LabelRef("LBB11_8")) 1848 JMP(LabelRef("LBB11_9")) 1849 } 1850 } 1851 1852 func genToBool_F64() { 1853 1854 data := GLOBL("dataToBoolF64", RODATA|NOPTR) 1855 DATA(0, I8(1)) 1856 DATA(1, I8(1)) 1857 DATA(2, I8(1)) 1858 DATA(3, I8(1)) 1859 DATA(4, I8(0)) 1860 DATA(5, I8(0)) 1861 DATA(6, I8(0)) 1862 DATA(7, I8(0)) 1863 DATA(8, I8(0)) 1864 DATA(9, I8(0)) 1865 DATA(10, I8(0)) 1866 DATA(11, I8(0)) 1867 DATA(12, I8(0)) 1868 DATA(13, I8(0)) 1869 DATA(14, I8(0)) 1870 DATA(15, I8(0)) 1871 1872 TEXT("ToBool_AVX2_F64", NOSPLIT, "func(x []bool, y []float64)") 1873 Pragma("noescape") 1874 Load(Param("x").Base(), RDI) 1875 Load(Param("y").Base(), RSI) 1876 Load(Param("x").Len(), RDX) 1877 1878 TESTQ(RDX, RDX) 1879 JE(LabelRef("LBB12_8")) 1880 CMPQ(RDX, Imm(16)) 1881 JAE(LabelRef("LBB12_3")) 1882 XORL(EAX, EAX) 1883 JMP(LabelRef("LBB12_6")) 1884 1885 Label("LBB12_3") 1886 { 1887 MOVQ(RDX, RAX) 1888 ANDQ(I32(-16), RAX) 1889 XORL(ECX, ECX) 1890 VXORPD(X0, X0, X0) 1891 VMOVDQU(data.Offset(0), X1) 1892 } 1893 1894 Label("LBB12_4") 1895 { 1896 VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8), Y0, Y2) 1897 VEXTRACTF128(Imm(1), Y2, X3) 1898 VPACKSSDW(X3, X2, X2) 1899 VPACKSSDW(X2, X2, X2) 1900 VPACKSSWB(X2, X2, X2) 1901 VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y0, Y3) 1902 VPAND(X1, X2, X2) 1903 VEXTRACTF128(Imm(1), Y3, X4) 1904 VPACKSSDW(X4, X3, X3) 1905 VPACKSSDW(X3, X3, X3) 1906 VPACKSSWB(X3, X3, X3) 1907 VPAND(X1, X3, X3) 1908 VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y0, Y4) 1909 VPUNPCKLDQ(X3, X2, X2) 1910 VEXTRACTF128(Imm(1), Y4, X3) 1911 VPACKSSDW(X3, X4, X3) 1912 VPACKSSDW(X3, X3, X3) 1913 VPACKSSWB(X3, X3, X3) 1914 VPAND(X1, X3, X3) 1915 VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y0, Y4) 1916 VEXTRACTF128(Imm(1), Y4, X5) 1917 VPACKSSDW(X5, X4, X4) 1918 VPACKSSDW(X4, X4, X4) 1919 VPACKSSWB(X4, X4, X4) 1920 VPAND(X1, X4, X4) 1921 VPBROADCASTD(X4, X4) 1922 VPBROADCASTD(X3, X3) 1923 VPUNPCKLDQ(X4, X3, X3) 1924 VPBLENDD(Imm(12), X3, X2, X2) 1925 VMOVDQU(X2, Mem{Base: RDI}.Idx(RCX, 1)) 1926 ADDQ(Imm(16), RCX) 1927 CMPQ(RAX, RCX) 1928 JNE(LabelRef("LBB12_4")) 1929 CMPQ(RAX, RDX) 1930 JE(LabelRef("LBB12_8")) 1931 } 1932 1933 Label("LBB12_6") 1934 { 1935 VXORPD(X0, X0, X0) 1936 } 1937 1938 Label("LBB12_7") 1939 { 1940 VUCOMISD(Mem{Base: RSI}.Idx(RAX, 8), X0) 1941 SETNE(Mem{Base: RDI}.Idx(RAX, 1)) 1942 ADDQ(Imm(1), RAX) 1943 CMPQ(RDX, RAX) 1944 JNE(LabelRef("LBB12_7")) 1945 } 1946 1947 Label("LBB12_8") 1948 { 1949 VZEROUPPER() 1950 RET() 1951 } 1952 } 1953 1954 func genToBool_F32() { 1955 1956 data := GLOBL("dataToBoolF32", RODATA|NOPTR) 1957 DATA(0, I8(1)) 1958 DATA(1, I8(1)) 1959 DATA(2, I8(1)) 1960 DATA(3, I8(1)) 1961 DATA(4, I8(1)) 1962 DATA(5, I8(1)) 1963 DATA(6, I8(1)) 1964 DATA(7, I8(1)) 1965 DATA(8, I8(0)) 1966 DATA(9, I8(0)) 1967 DATA(10, I8(0)) 1968 DATA(11, I8(0)) 1969 DATA(12, I8(0)) 1970 DATA(13, I8(0)) 1971 DATA(14, I8(0)) 1972 DATA(15, I8(0)) 1973 1974 TEXT("ToBool_AVX2_F32", NOSPLIT, "func(x []bool, y []float32)") 1975 Pragma("noescape") 1976 Load(Param("x").Base(), RDI) 1977 Load(Param("y").Base(), RSI) 1978 Load(Param("x").Len(), RDX) 1979 1980 TESTQ(RDX, RDX) 1981 JE(LabelRef("LBB13_8")) 1982 CMPQ(RDX, Imm(32)) 1983 JAE(LabelRef("LBB13_3")) 1984 XORL(EAX, EAX) 1985 JMP(LabelRef("LBB13_6")) 1986 1987 Label("LBB13_3") 1988 { 1989 MOVQ(RDX, RAX) 1990 ANDQ(I32(-32), RAX) 1991 XORL(ECX, ECX) 1992 VXORPS(X0, X0, X0) 1993 VMOVDQU(data.Offset(0), X1) 1994 } 1995 1996 Label("LBB13_4") 1997 { 1998 VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4), Y0, Y2) 1999 VEXTRACTF128(Imm(1), Y2, X3) 2000 VPACKSSDW(X3, X2, X2) 2001 VPACKSSWB(X2, X2, X2) 2002 VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y0, Y3) 2003 VPAND(X1, X2, X2) 2004 VEXTRACTF128(Imm(1), Y3, X4) 2005 VPACKSSDW(X4, X3, X3) 2006 VPACKSSWB(X3, X3, X3) 2007 VPAND(X1, X3, X3) 2008 VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y0, Y4) 2009 VEXTRACTF128(Imm(1), Y4, X5) 2010 VPACKSSDW(X5, X4, X4) 2011 VPACKSSWB(X4, X4, X4) 2012 VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y0, Y5) 2013 VPAND(X1, X4, X4) 2014 VEXTRACTF128(Imm(1), Y5, X6) 2015 VPACKSSDW(X6, X5, X5) 2016 VPACKSSWB(X5, X5, X5) 2017 VPAND(X1, X5, X5) 2018 VINSERTI128(Imm(1), X5, Y4, Y4) 2019 VINSERTI128(Imm(1), X3, Y2, Y2) 2020 VPUNPCKLQDQ(Y4, Y2, Y2) 2021 VPERMQ(Imm(216), Y2, Y2) 2022 VMOVDQU(Y2, Mem{Base: RDI}.Idx(RCX, 1)) 2023 ADDQ(Imm(32), RCX) 2024 CMPQ(RAX, RCX) 2025 JNE(LabelRef("LBB13_4")) 2026 CMPQ(RAX, RDX) 2027 JE(LabelRef("LBB13_8")) 2028 } 2029 2030 Label("LBB13_6") 2031 { 2032 VXORPS(X0, X0, X0) 2033 } 2034 2035 Label("LBB13_7") 2036 { 2037 VUCOMISS(Mem{Base: RSI}.Idx(RAX, 4), X0) 2038 SETNE(Mem{Base: RDI}.Idx(RAX, 1)) 2039 ADDQ(Imm(1), RAX) 2040 CMPQ(RDX, RAX) 2041 JNE(LabelRef("LBB13_7")) 2042 } 2043 2044 Label("LBB13_8") 2045 { 2046 VZEROUPPER() 2047 RET() 2048 } 2049 } 2050 2051 func genToInt64_F64() { 2052 2053 TEXT("ToInt64_AVX2_F64", NOSPLIT, "func(x []int64, y []float64)") 2054 Pragma("noescape") 2055 Load(Param("x").Base(), RDI) 2056 Load(Param("y").Base(), RSI) 2057 Load(Param("x").Len(), RDX) 2058 2059 TESTQ(RDX, RDX) 2060 JE(LabelRef("LBB14_8")) 2061 LEAQ(Mem{Base: RDX}.Offset(-1), RCX) 2062 MOVL(EDX, R8L) 2063 ANDL(Imm(3), R8L) 2064 CMPQ(RCX, Imm(3)) 2065 JAE(LabelRef("LBB14_3")) 2066 XORL(ECX, ECX) 2067 JMP(LabelRef("LBB14_5")) 2068 2069 Label("LBB14_3") 2070 { 2071 ANDQ(I32(-4), RDX) 2072 XORL(ECX, ECX) 2073 } 2074 2075 Label("LBB14_4") 2076 { 2077 VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8), RAX) 2078 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8)) 2079 VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8).Offset(8), RAX) 2080 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(8)) 2081 VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), RAX) 2082 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(16)) 2083 VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8).Offset(24), RAX) 2084 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(24)) 2085 ADDQ(Imm(4), RCX) 2086 CMPQ(RDX, RCX) 2087 JNE(LabelRef("LBB14_4")) 2088 } 2089 2090 Label("LBB14_5") 2091 { 2092 TESTQ(R8, R8) 2093 JE(LabelRef("LBB14_8")) 2094 LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RDX) 2095 LEAQ(Mem{Base: RSI}.Idx(RCX, 8), RCX) 2096 XORL(ESI, ESI) 2097 } 2098 2099 Label("LBB14_7") 2100 { 2101 VCVTTSD2SIQ(Mem{Base: RCX}.Idx(RSI, 8), RAX) 2102 MOVQ(RAX, Mem{Base: RDX}.Idx(RSI, 8)) 2103 ADDQ(Imm(1), RSI) 2104 CMPQ(R8, RSI) 2105 JNE(LabelRef("LBB14_7")) 2106 } 2107 2108 Label("LBB14_8") 2109 { 2110 RET() 2111 } 2112 } 2113 2114 func genToInt64_F32() { 2115 2116 TEXT("ToInt64_AVX2_F32", NOSPLIT, "func(x []int64, y []float32)") 2117 Pragma("noescape") 2118 Load(Param("x").Base(), RDI) 2119 Load(Param("y").Base(), RSI) 2120 Load(Param("x").Len(), RDX) 2121 2122 TESTQ(RDX, RDX) 2123 JE(LabelRef("LBB15_8")) 2124 LEAQ(Mem{Base: RDX}.Offset(-1), RCX) 2125 MOVL(EDX, R8L) 2126 ANDL(Imm(3), R8L) 2127 CMPQ(RCX, Imm(3)) 2128 JAE(LabelRef("LBB15_3")) 2129 XORL(ECX, ECX) 2130 JMP(LabelRef("LBB15_5")) 2131 2132 Label("LBB15_3") 2133 { 2134 ANDQ(I32(-4), RDX) 2135 XORL(ECX, ECX) 2136 } 2137 2138 Label("LBB15_4") 2139 { 2140 VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4), RAX) 2141 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8)) 2142 VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(4), RAX) 2143 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(8)) 2144 VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(8), RAX) 2145 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(16)) 2146 VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(12), RAX) 2147 MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(24)) 2148 ADDQ(Imm(4), RCX) 2149 CMPQ(RDX, RCX) 2150 JNE(LabelRef("LBB15_4")) 2151 } 2152 2153 Label("LBB15_5") 2154 { 2155 TESTQ(R8, R8) 2156 JE(LabelRef("LBB15_8")) 2157 LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RDX) 2158 LEAQ(Mem{Base: RSI}.Idx(RCX, 4), RCX) 2159 XORL(ESI, ESI) 2160 } 2161 2162 Label("LBB15_7") 2163 { 2164 VCVTTSS2SIQ(Mem{Base: RCX}.Idx(RSI, 4), RAX) 2165 MOVQ(RAX, Mem{Base: RDX}.Idx(RSI, 8)) 2166 ADDQ(Imm(1), RSI) 2167 CMPQ(R8, RSI) 2168 JNE(LabelRef("LBB15_7")) 2169 } 2170 2171 Label("LBB15_8") 2172 { 2173 RET() 2174 } 2175 } 2176 2177 func genToInt32_F64() { 2178 2179 TEXT("ToInt32_AVX2_F64", NOSPLIT, "func(x []int32, y []float64)") 2180 Pragma("noescape") 2181 Load(Param("x").Base(), RDI) 2182 Load(Param("y").Base(), RSI) 2183 Load(Param("x").Len(), RDX) 2184 2185 TESTQ(RDX, RDX) 2186 JE(LabelRef("LBB16_11")) 2187 CMPQ(RDX, Imm(16)) 2188 JAE(LabelRef("LBB16_3")) 2189 XORL(EAX, EAX) 2190 JMP(LabelRef("LBB16_10")) 2191 2192 Label("LBB16_3") 2193 { 2194 MOVQ(RDX, RAX) 2195 ANDQ(I32(-16), RAX) 2196 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 2197 MOVQ(RCX, R8) 2198 SHRQ(Imm(4), R8) 2199 ADDQ(Imm(1), R8) 2200 TESTQ(RCX, RCX) 2201 JE(LabelRef("LBB16_4")) 2202 MOVQ(R8, R9) 2203 ANDQ(I32(-2), R9) 2204 XORL(ECX, ECX) 2205 } 2206 2207 Label("LBB16_6") 2208 { 2209 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8), X0) 2210 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1) 2211 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2) 2212 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3) 2213 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4)) 2214 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16)) 2215 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 2216 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48)) 2217 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0) 2218 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X1) 2219 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X2) 2220 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X3) 2221 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 2222 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(80)) 2223 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 2224 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(112)) 2225 ADDQ(Imm(32), RCX) 2226 ADDQ(I32(-2), R9) 2227 JNE(LabelRef("LBB16_6")) 2228 TESTB(Imm(1), R8B) 2229 JE(LabelRef("LBB16_9")) 2230 } 2231 2232 Label("LBB16_8") 2233 { 2234 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8), X0) 2235 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1) 2236 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2) 2237 VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3) 2238 VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4)) 2239 VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16)) 2240 VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 2241 VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48)) 2242 } 2243 2244 Label("LBB16_9") 2245 { 2246 CMPQ(RAX, RDX) 2247 JE(LabelRef("LBB16_11")) 2248 } 2249 2250 Label("LBB16_10") 2251 { 2252 VCVTTSD2SI(Mem{Base: RSI}.Idx(RAX, 8), ECX) 2253 MOVL(ECX, Mem{Base: RDI}.Idx(RAX, 4)) 2254 ADDQ(Imm(1), RAX) 2255 CMPQ(RDX, RAX) 2256 JNE(LabelRef("LBB16_10")) 2257 } 2258 2259 Label("LBB16_11") 2260 { 2261 RET() 2262 } 2263 2264 Label("LBB16_4") 2265 { 2266 XORL(ECX, ECX) 2267 TESTB(Imm(1), R8B) 2268 JNE(LabelRef("LBB16_8")) 2269 JMP(LabelRef("LBB16_9")) 2270 } 2271 } 2272 2273 func genToInt32_F32() { 2274 2275 TEXT("ToInt32_AVX2_F32", NOSPLIT, "func(x []int32, y []float32)") 2276 Pragma("noescape") 2277 Load(Param("x").Base(), RDI) 2278 Load(Param("y").Base(), RSI) 2279 Load(Param("x").Len(), RDX) 2280 2281 TESTQ(RDX, RDX) 2282 JE(LabelRef("LBB17_11")) 2283 CMPQ(RDX, Imm(32)) 2284 JAE(LabelRef("LBB17_3")) 2285 XORL(EAX, EAX) 2286 JMP(LabelRef("LBB17_10")) 2287 2288 Label("LBB17_3") 2289 { 2290 MOVQ(RDX, RAX) 2291 ANDQ(I32(-32), RAX) 2292 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 2293 MOVQ(RCX, R8) 2294 SHRQ(Imm(5), R8) 2295 ADDQ(Imm(1), R8) 2296 TESTQ(RCX, RCX) 2297 JE(LabelRef("LBB17_4")) 2298 MOVQ(R8, R9) 2299 ANDQ(I32(-2), R9) 2300 XORL(ECX, ECX) 2301 } 2302 2303 Label("LBB17_6") 2304 { 2305 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4), Y0) 2306 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1) 2307 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2) 2308 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3) 2309 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 2310 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 2311 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 2312 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 2313 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(128), Y0) 2314 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(160), Y1) 2315 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(192), Y2) 2316 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(224), Y3) 2317 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 2318 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 2319 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 2320 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 2321 ADDQ(Imm(64), RCX) 2322 ADDQ(I32(-2), R9) 2323 JNE(LabelRef("LBB17_6")) 2324 TESTB(Imm(1), R8B) 2325 JE(LabelRef("LBB17_9")) 2326 } 2327 2328 Label("LBB17_8") 2329 { 2330 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4), Y0) 2331 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1) 2332 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2) 2333 VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3) 2334 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 2335 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 2336 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 2337 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 2338 } 2339 2340 Label("LBB17_9") 2341 { 2342 CMPQ(RAX, RDX) 2343 JE(LabelRef("LBB17_11")) 2344 } 2345 2346 Label("LBB17_10") 2347 { 2348 VCVTTSS2SI(Mem{Base: RSI}.Idx(RAX, 4), ECX) 2349 MOVL(ECX, Mem{Base: RDI}.Idx(RAX, 4)) 2350 ADDQ(Imm(1), RAX) 2351 CMPQ(RDX, RAX) 2352 JNE(LabelRef("LBB17_10")) 2353 } 2354 2355 Label("LBB17_11") 2356 { 2357 VZEROUPPER() 2358 RET() 2359 } 2360 2361 Label("LBB17_4") 2362 { 2363 XORL(ECX, ECX) 2364 TESTB(Imm(1), R8B) 2365 JNE(LabelRef("LBB17_8")) 2366 JMP(LabelRef("LBB17_9")) 2367 } 2368 }