gitee.com/quant1x/gox@v1.7.6/num/asm/aggregates.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 genSum_F64() { 10 11 TEXT("Sum_AVX2_F64", NOSPLIT, "func(x []float64) float64") 12 Pragma("noescape") 13 Load(Param("x").Base(), RDI) 14 Load(Param("x").Len(), RSI) 15 16 TESTQ(RSI, RSI) 17 JE(LabelRef("LBB0_1")) 18 CMPQ(RSI, Imm(16)) 19 JAE(LabelRef("LBB0_4")) 20 VXORPD(X0, X0, X0) 21 XORL(EAX, EAX) 22 JMP(LabelRef("LBB0_11")) 23 24 Label("LBB0_1") 25 { 26 VXORPS(X0, X0, X0) 27 Store(X0, ReturnIndex(0)) 28 RET() 29 } 30 31 Label("LBB0_4") 32 { 33 MOVQ(RSI, RAX) 34 ANDQ(I32(-16), RAX) 35 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 36 MOVQ(RCX, R8) 37 SHRQ(Imm(4), R8) 38 ADDQ(Imm(1), R8) 39 TESTQ(RCX, RCX) 40 JE(LabelRef("LBB0_5")) 41 MOVQ(R8, RCX) 42 ANDQ(I32(-2), RCX) 43 VXORPD(X0, X0, X0) 44 XORL(EDX, EDX) 45 VXORPD(X1, X1, X1) 46 VXORPD(X2, X2, X2) 47 VXORPD(X3, X3, X3) 48 } 49 50 Label("LBB0_7") 51 { 52 VADDPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 53 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1) 54 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2) 55 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3) 56 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(128), Y0, Y0) 57 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(160), Y1, Y1) 58 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(192), Y2, Y2) 59 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(224), Y3, Y3) 60 ADDQ(Imm(32), RDX) 61 ADDQ(I32(-2), RCX) 62 JNE(LabelRef("LBB0_7")) 63 TESTB(Imm(1), R8B) 64 JE(LabelRef("LBB0_10")) 65 } 66 67 Label("LBB0_9") 68 { 69 VADDPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 70 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1) 71 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2) 72 VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3) 73 } 74 75 Label("LBB0_10") 76 { 77 VADDPD(Y3, Y1, Y1) 78 VADDPD(Y2, Y0, Y0) 79 VADDPD(Y1, Y0, Y0) 80 VEXTRACTF128(Imm(1), Y0, X1) 81 VADDPD(X1, X0, X0) 82 VPERMILPD(Imm(1), X0, X1) 83 VADDSD(X1, X0, X0) 84 CMPQ(RAX, RSI) 85 JE(LabelRef("LBB0_12")) 86 } 87 88 Label("LBB0_11") 89 { 90 VADDSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X0) 91 ADDQ(Imm(1), RAX) 92 CMPQ(RSI, RAX) 93 JNE(LabelRef("LBB0_11")) 94 } 95 96 Label("LBB0_12") 97 { 98 VZEROUPPER() 99 Store(X0, ReturnIndex(0)) 100 RET() 101 } 102 103 Label("LBB0_5") 104 { 105 VXORPD(X0, X0, X0) 106 XORL(EDX, EDX) 107 VXORPD(X1, X1, X1) 108 VXORPD(X2, X2, X2) 109 VXORPD(X3, X3, X3) 110 TESTB(Imm(1), R8B) 111 JNE(LabelRef("LBB0_9")) 112 JMP(LabelRef("LBB0_10")) 113 } 114 } 115 116 func genSum_F32() { 117 118 TEXT("Sum_AVX2_F32", NOSPLIT, "func(x []float32) float32") 119 Pragma("noescape") 120 Load(Param("x").Base(), RDI) 121 Load(Param("x").Len(), RSI) 122 123 TESTQ(RSI, RSI) 124 JE(LabelRef("LBB1_1")) 125 CMPQ(RSI, Imm(32)) 126 JAE(LabelRef("LBB1_4")) 127 VXORPS(X0, X0, X0) 128 XORL(EAX, EAX) 129 JMP(LabelRef("LBB1_11")) 130 131 Label("LBB1_1") 132 { 133 VXORPS(X0, X0, X0) 134 Store(X0, ReturnIndex(0)) 135 RET() 136 } 137 138 Label("LBB1_4") 139 { 140 MOVQ(RSI, RAX) 141 ANDQ(I32(-32), RAX) 142 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 143 MOVQ(RCX, R8) 144 SHRQ(Imm(5), R8) 145 ADDQ(Imm(1), R8) 146 TESTQ(RCX, RCX) 147 JE(LabelRef("LBB1_5")) 148 MOVQ(R8, RCX) 149 ANDQ(I32(-2), RCX) 150 VXORPS(X0, X0, X0) 151 XORL(EDX, EDX) 152 VXORPS(X1, X1, X1) 153 VXORPS(X2, X2, X2) 154 VXORPS(X3, X3, X3) 155 } 156 157 Label("LBB1_7") 158 { 159 VADDPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0) 160 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1) 161 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2) 162 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3) 163 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(128), Y0, Y0) 164 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(160), Y1, Y1) 165 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(192), Y2, Y2) 166 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(224), Y3, Y3) 167 ADDQ(Imm(64), RDX) 168 ADDQ(I32(-2), RCX) 169 JNE(LabelRef("LBB1_7")) 170 TESTB(Imm(1), R8B) 171 JE(LabelRef("LBB1_10")) 172 } 173 174 Label("LBB1_9") 175 { 176 VADDPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0) 177 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1) 178 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2) 179 VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3) 180 } 181 182 Label("LBB1_10") 183 { 184 VADDPS(Y3, Y1, Y1) 185 VADDPS(Y2, Y0, Y0) 186 VADDPS(Y1, Y0, Y0) 187 VEXTRACTF128(Imm(1), Y0, X1) 188 VADDPS(X1, X0, X0) 189 VPERMILPD(Imm(1), X0, X1) 190 VADDPS(X1, X0, X0) 191 VMOVSHDUP(X0, X1) 192 VADDSS(X1, X0, X0) 193 CMPQ(RAX, RSI) 194 JE(LabelRef("LBB1_12")) 195 } 196 197 Label("LBB1_11") 198 { 199 VADDSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X0) 200 ADDQ(Imm(1), RAX) 201 CMPQ(RSI, RAX) 202 JNE(LabelRef("LBB1_11")) 203 } 204 205 Label("LBB1_12") 206 { 207 VZEROUPPER() 208 Store(X0, ReturnIndex(0)) 209 RET() 210 } 211 212 Label("LBB1_5") 213 { 214 VXORPS(X0, X0, X0) 215 XORL(EDX, EDX) 216 VXORPS(X1, X1, X1) 217 VXORPS(X2, X2, X2) 218 VXORPS(X3, X3, X3) 219 TESTB(Imm(1), R8B) 220 JNE(LabelRef("LBB1_9")) 221 JMP(LabelRef("LBB1_10")) 222 } 223 } 224 225 func genCumSum_F64() { 226 227 TEXT("CumSum_AVX2_F64", NOSPLIT, "func(x []float64)") 228 Pragma("noescape") 229 Load(Param("x").Base(), RDI) 230 Load(Param("x").Len(), RSI) 231 232 TESTQ(RSI, RSI) 233 JE(LabelRef("LBB2_8")) 234 LEAQ(Mem{Base: RSI}.Offset(-1), RCX) 235 MOVL(ESI, EAX) 236 ANDL(Imm(3), EAX) 237 CMPQ(RCX, Imm(3)) 238 JAE(LabelRef("LBB2_3")) 239 VXORPD(X0, X0, X0) 240 XORL(ECX, ECX) 241 JMP(LabelRef("LBB2_5")) 242 243 Label("LBB2_3") 244 { 245 ANDQ(I32(-4), RSI) 246 VXORPD(X0, X0, X0) 247 XORL(ECX, ECX) 248 } 249 250 Label("LBB2_4") 251 { 252 VADDSD(Mem{Base: RDI}.Idx(RCX, 8), X0, X0) 253 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8)) 254 VADDSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(8), X0, X0) 255 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(8)) 256 VADDSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(16), X0, X0) 257 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(16)) 258 VADDSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(24), X0, X0) 259 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(24)) 260 ADDQ(Imm(4), RCX) 261 CMPQ(RSI, RCX) 262 JNE(LabelRef("LBB2_4")) 263 } 264 265 Label("LBB2_5") 266 { 267 TESTQ(RAX, RAX) 268 JE(LabelRef("LBB2_8")) 269 LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX) 270 XORL(EDX, EDX) 271 } 272 273 Label("LBB2_7") 274 { 275 VADDSD(Mem{Base: RCX}.Idx(RDX, 8), X0, X0) 276 VMOVSD(X0, Mem{Base: RCX}.Idx(RDX, 8)) 277 ADDQ(Imm(1), RDX) 278 CMPQ(RAX, RDX) 279 JNE(LabelRef("LBB2_7")) 280 } 281 282 Label("LBB2_8") 283 { 284 RET() 285 } 286 } 287 288 func genCumSum_F32() { 289 290 TEXT("CumSum_AVX2_F32", NOSPLIT, "func(x []float32)") 291 Pragma("noescape") 292 Load(Param("x").Base(), RDI) 293 Load(Param("x").Len(), RSI) 294 295 TESTQ(RSI, RSI) 296 JE(LabelRef("LBB3_8")) 297 LEAQ(Mem{Base: RSI}.Offset(-1), RCX) 298 MOVL(ESI, EAX) 299 ANDL(Imm(3), EAX) 300 CMPQ(RCX, Imm(3)) 301 JAE(LabelRef("LBB3_3")) 302 VXORPS(X0, X0, X0) 303 XORL(ECX, ECX) 304 JMP(LabelRef("LBB3_5")) 305 306 Label("LBB3_3") 307 { 308 ANDQ(I32(-4), RSI) 309 VXORPS(X0, X0, X0) 310 XORL(ECX, ECX) 311 } 312 313 Label("LBB3_4") 314 { 315 VADDSS(Mem{Base: RDI}.Idx(RCX, 4), X0, X0) 316 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4)) 317 VADDSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(4), X0, X0) 318 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(4)) 319 VADDSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(8), X0, X0) 320 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(8)) 321 VADDSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(12), X0, X0) 322 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(12)) 323 ADDQ(Imm(4), RCX) 324 CMPQ(RSI, RCX) 325 JNE(LabelRef("LBB3_4")) 326 } 327 328 Label("LBB3_5") 329 { 330 TESTQ(RAX, RAX) 331 JE(LabelRef("LBB3_8")) 332 LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX) 333 XORL(EDX, EDX) 334 } 335 336 Label("LBB3_7") 337 { 338 VADDSS(Mem{Base: RCX}.Idx(RDX, 4), X0, X0) 339 VMOVSS(X0, Mem{Base: RCX}.Idx(RDX, 4)) 340 ADDQ(Imm(1), RDX) 341 CMPQ(RAX, RDX) 342 JNE(LabelRef("LBB3_7")) 343 } 344 345 Label("LBB3_8") 346 { 347 RET() 348 } 349 } 350 351 func genProd_F64() { 352 353 data := GLOBL("dataProdF64", RODATA|NOPTR) 354 DATA(0, U64(0x3ff0000000000000)) 355 356 TEXT("Prod_AVX2_F64", NOSPLIT, "func(x []float64) float64") 357 Pragma("noescape") 358 Load(Param("x").Base(), RDI) 359 Load(Param("x").Len(), RSI) 360 361 TESTQ(RSI, RSI) 362 JE(LabelRef("LBB4_1")) 363 CMPQ(RSI, Imm(16)) 364 JAE(LabelRef("LBB4_4")) 365 VMOVSD(data.Offset(0), X0) 366 XORL(EAX, EAX) 367 JMP(LabelRef("LBB4_11")) 368 369 Label("LBB4_1") 370 { 371 VMOVSD(data.Offset(0), X0) 372 Store(X0, ReturnIndex(0)) 373 RET() 374 } 375 376 Label("LBB4_4") 377 { 378 MOVQ(RSI, RAX) 379 ANDQ(I32(-16), RAX) 380 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 381 MOVQ(RCX, R8) 382 SHRQ(Imm(4), R8) 383 ADDQ(Imm(1), R8) 384 TESTQ(RCX, RCX) 385 JE(LabelRef("LBB4_5")) 386 MOVQ(R8, RCX) 387 ANDQ(I32(-2), RCX) 388 VBROADCASTSD(data.Offset(0), Y0) 389 XORL(EDX, EDX) 390 VMOVAPD(Y0, Y1) 391 VMOVAPD(Y0, Y2) 392 VMOVAPD(Y0, Y3) 393 } 394 395 Label("LBB4_7") 396 { 397 VMULPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 398 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1) 399 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2) 400 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3) 401 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(128), Y0, Y0) 402 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(160), Y1, Y1) 403 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(192), Y2, Y2) 404 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(224), Y3, Y3) 405 ADDQ(Imm(32), RDX) 406 ADDQ(I32(-2), RCX) 407 JNE(LabelRef("LBB4_7")) 408 TESTB(Imm(1), R8B) 409 JE(LabelRef("LBB4_10")) 410 } 411 412 Label("LBB4_9") 413 { 414 VMULPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 415 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1) 416 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2) 417 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3) 418 } 419 420 Label("LBB4_10") 421 { 422 VMULPD(Y3, Y1, Y1) 423 VMULPD(Y2, Y0, Y0) 424 VMULPD(Y1, Y0, Y0) 425 VEXTRACTF128(Imm(1), Y0, X1) 426 VMULPD(X1, X0, X0) 427 VPERMILPD(Imm(1), X0, X1) 428 VMULSD(X1, X0, X0) 429 CMPQ(RAX, RSI) 430 JE(LabelRef("LBB4_12")) 431 } 432 433 Label("LBB4_11") 434 { 435 VMULSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X0) 436 ADDQ(Imm(1), RAX) 437 CMPQ(RSI, RAX) 438 JNE(LabelRef("LBB4_11")) 439 } 440 441 Label("LBB4_12") 442 { 443 VZEROUPPER() 444 Store(X0, ReturnIndex(0)) 445 RET() 446 } 447 448 Label("LBB4_5") 449 { 450 VBROADCASTSD(data.Offset(0), Y0) 451 XORL(EDX, EDX) 452 VMOVAPD(Y0, Y1) 453 VMOVAPD(Y0, Y2) 454 VMOVAPD(Y0, Y3) 455 TESTB(Imm(1), R8B) 456 JNE(LabelRef("LBB4_9")) 457 JMP(LabelRef("LBB4_10")) 458 } 459 } 460 461 func genProd_F32() { 462 463 data := GLOBL("dataProdF32", RODATA|NOPTR) 464 DATA(0, U32(0x3f800000)) 465 466 TEXT("Prod_AVX2_F32", NOSPLIT, "func(x []float32) float32") 467 Pragma("noescape") 468 Load(Param("x").Base(), RDI) 469 Load(Param("x").Len(), RSI) 470 471 TESTQ(RSI, RSI) 472 JE(LabelRef("LBB5_1")) 473 CMPQ(RSI, Imm(32)) 474 JAE(LabelRef("LBB5_4")) 475 VMOVSS(data.Offset(0), X0) 476 XORL(EAX, EAX) 477 JMP(LabelRef("LBB5_11")) 478 479 Label("LBB5_1") 480 { 481 VMOVSS(data.Offset(0), X0) 482 Store(X0, ReturnIndex(0)) 483 RET() 484 } 485 486 Label("LBB5_4") 487 { 488 MOVQ(RSI, RAX) 489 ANDQ(I32(-32), RAX) 490 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 491 MOVQ(RCX, R8) 492 SHRQ(Imm(5), R8) 493 ADDQ(Imm(1), R8) 494 TESTQ(RCX, RCX) 495 JE(LabelRef("LBB5_5")) 496 MOVQ(R8, RCX) 497 ANDQ(I32(-2), RCX) 498 VBROADCASTSS(data.Offset(0), Y0) 499 XORL(EDX, EDX) 500 VMOVAPS(Y0, Y1) 501 VMOVAPS(Y0, Y2) 502 VMOVAPS(Y0, Y3) 503 } 504 505 Label("LBB5_7") 506 { 507 VMULPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0) 508 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1) 509 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2) 510 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3) 511 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(128), Y0, Y0) 512 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(160), Y1, Y1) 513 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(192), Y2, Y2) 514 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(224), Y3, Y3) 515 ADDQ(Imm(64), RDX) 516 ADDQ(I32(-2), RCX) 517 JNE(LabelRef("LBB5_7")) 518 TESTB(Imm(1), R8B) 519 JE(LabelRef("LBB5_10")) 520 } 521 522 Label("LBB5_9") 523 { 524 VMULPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0) 525 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1) 526 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2) 527 VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3) 528 } 529 530 Label("LBB5_10") 531 { 532 VMULPS(Y3, Y1, Y1) 533 VMULPS(Y2, Y0, Y0) 534 VMULPS(Y1, Y0, Y0) 535 VEXTRACTF128(Imm(1), Y0, X1) 536 VMULPS(X1, X0, X0) 537 VPERMILPD(Imm(1), X0, X1) 538 VMULPS(X1, X0, X0) 539 VMOVSHDUP(X0, X1) 540 VMULSS(X1, X0, X0) 541 CMPQ(RAX, RSI) 542 JE(LabelRef("LBB5_12")) 543 } 544 545 Label("LBB5_11") 546 { 547 VMULSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X0) 548 ADDQ(Imm(1), RAX) 549 CMPQ(RSI, RAX) 550 JNE(LabelRef("LBB5_11")) 551 } 552 553 Label("LBB5_12") 554 { 555 VZEROUPPER() 556 Store(X0, ReturnIndex(0)) 557 RET() 558 } 559 560 Label("LBB5_5") 561 { 562 VBROADCASTSS(data.Offset(0), Y0) 563 XORL(EDX, EDX) 564 VMOVAPS(Y0, Y1) 565 VMOVAPS(Y0, Y2) 566 VMOVAPS(Y0, Y3) 567 TESTB(Imm(1), R8B) 568 JNE(LabelRef("LBB5_9")) 569 JMP(LabelRef("LBB5_10")) 570 } 571 } 572 573 func genCumProd_F64() { 574 575 data := GLOBL("dataCumProdF64", RODATA|NOPTR) 576 DATA(0, U64(0x3ff0000000000000)) 577 578 TEXT("CumProd_AVX2_F64", NOSPLIT, "func(x []float64)") 579 Pragma("noescape") 580 Load(Param("x").Base(), RDI) 581 Load(Param("x").Len(), RSI) 582 583 TESTQ(RSI, RSI) 584 JE(LabelRef("LBB6_8")) 585 LEAQ(Mem{Base: RSI}.Offset(-1), RCX) 586 MOVL(ESI, EAX) 587 ANDL(Imm(3), EAX) 588 CMPQ(RCX, Imm(3)) 589 JAE(LabelRef("LBB6_3")) 590 VMOVSD(data.Offset(0), X0) 591 XORL(ECX, ECX) 592 JMP(LabelRef("LBB6_5")) 593 594 Label("LBB6_3") 595 { 596 ANDQ(I32(-4), RSI) 597 VMOVSD(data.Offset(0), X0) 598 XORL(ECX, ECX) 599 } 600 601 Label("LBB6_4") 602 { 603 VMULSD(Mem{Base: RDI}.Idx(RCX, 8), X0, X0) 604 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8)) 605 VMULSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(8), X0, X0) 606 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(8)) 607 VMULSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(16), X0, X0) 608 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(16)) 609 VMULSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(24), X0, X0) 610 VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(24)) 611 ADDQ(Imm(4), RCX) 612 CMPQ(RSI, RCX) 613 JNE(LabelRef("LBB6_4")) 614 } 615 616 Label("LBB6_5") 617 { 618 TESTQ(RAX, RAX) 619 JE(LabelRef("LBB6_8")) 620 LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX) 621 XORL(EDX, EDX) 622 } 623 624 Label("LBB6_7") 625 { 626 VMULSD(Mem{Base: RCX}.Idx(RDX, 8), X0, X0) 627 VMOVSD(X0, Mem{Base: RCX}.Idx(RDX, 8)) 628 ADDQ(Imm(1), RDX) 629 CMPQ(RAX, RDX) 630 JNE(LabelRef("LBB6_7")) 631 } 632 633 Label("LBB6_8") 634 { 635 RET() 636 } 637 } 638 639 func genCumProd_F32() { 640 data := GLOBL("dataCumProdF32", RODATA|NOPTR) 641 DATA(0, U32(0x3f800000)) 642 643 TEXT("CumProd_AVX2_F32", NOSPLIT, "func(x []float32)") 644 Pragma("noescape") 645 Load(Param("x").Base(), RDI) 646 Load(Param("x").Len(), RSI) 647 648 TESTQ(RSI, RSI) 649 JE(LabelRef("LBB7_8")) 650 LEAQ(Mem{Base: RSI}.Offset(-1), RCX) 651 MOVL(ESI, EAX) 652 ANDL(Imm(3), EAX) 653 CMPQ(RCX, Imm(3)) 654 JAE(LabelRef("LBB7_3")) 655 VMOVSS(data.Offset(0), X0) 656 XORL(ECX, ECX) 657 JMP(LabelRef("LBB7_5")) 658 659 Label("LBB7_3") 660 { 661 ANDQ(I32(-4), RSI) 662 VMOVSS(data.Offset(0), X0) 663 XORL(ECX, ECX) 664 } 665 666 Label("LBB7_4") 667 { 668 VMULSS(Mem{Base: RDI}.Idx(RCX, 4), X0, X0) 669 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4)) 670 VMULSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(4), X0, X0) 671 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(4)) 672 VMULSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(8), X0, X0) 673 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(8)) 674 VMULSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(12), X0, X0) 675 VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(12)) 676 ADDQ(Imm(4), RCX) 677 CMPQ(RSI, RCX) 678 JNE(LabelRef("LBB7_4")) 679 } 680 681 Label("LBB7_5") 682 { 683 TESTQ(RAX, RAX) 684 JE(LabelRef("LBB7_8")) 685 LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX) 686 XORL(EDX, EDX) 687 } 688 689 Label("LBB7_7") 690 { 691 VMULSS(Mem{Base: RCX}.Idx(RDX, 4), X0, X0) 692 VMOVSS(X0, Mem{Base: RCX}.Idx(RDX, 4)) 693 ADDQ(Imm(1), RDX) 694 CMPQ(RAX, RDX) 695 JNE(LabelRef("LBB7_7")) 696 } 697 698 Label("LBB7_8") 699 { 700 RET() 701 } 702 }