gitee.com/quant1x/gox@v1.7.6/num/asm/boolean.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 genNot() { 10 data := GLOBL("dataNot", RODATA|NOPTR) 11 DATA(0, U8(1)) 12 DATA(1, U8(1)) 13 DATA(2, U8(1)) 14 DATA(3, U8(1)) 15 DATA(4, U8(1)) 16 DATA(5, U8(1)) 17 DATA(6, U8(1)) 18 DATA(7, U8(1)) 19 DATA(8, U8(1)) 20 DATA(9, U8(1)) 21 DATA(10, U8(1)) 22 DATA(11, U8(1)) 23 DATA(12, U8(1)) 24 DATA(13, U8(1)) 25 DATA(14, U8(1)) 26 DATA(15, U8(1)) 27 DATA(16, U8(1)) 28 DATA(17, U8(1)) 29 DATA(18, U8(1)) 30 DATA(19, U8(1)) 31 DATA(20, U8(1)) 32 DATA(21, U8(1)) 33 DATA(22, U8(1)) 34 DATA(23, U8(1)) 35 DATA(24, U8(1)) 36 DATA(25, U8(1)) 37 DATA(26, U8(1)) 38 DATA(27, U8(1)) 39 DATA(28, U8(1)) 40 DATA(29, U8(1)) 41 DATA(30, U8(1)) 42 DATA(31, U8(1)) 43 44 TEXT("Not_AVX2", NOSPLIT, "func(x []bool)") 45 Pragma("noescape") 46 Load(Param("x").Base(), RDI) 47 Load(Param("x").Len(), RSI) 48 49 TESTQ(RSI, RSI) 50 JE(LabelRef("LBB0_17")) 51 CMPQ(RSI, Imm(16)) 52 JAE(LabelRef("LBB0_3")) 53 XORL(EAX, EAX) 54 JMP(LabelRef("LBB0_16")) 55 56 Label("LBB0_3") 57 { 58 CMPQ(RSI, Imm(128)) 59 JAE(LabelRef("LBB0_5")) 60 XORL(EAX, EAX) 61 JMP(LabelRef("LBB0_13")) 62 } 63 64 Label("LBB0_5") 65 { 66 MOVQ(RSI, RAX) 67 ANDQ(I32(-128), RAX) 68 LEAQ(Mem{Base: RAX}.Offset(-128), RCX) 69 MOVQ(RCX, R8) 70 SHRQ(Imm(7), R8) 71 ADDQ(Imm(1), R8) 72 TESTQ(RCX, RCX) 73 JE(LabelRef("LBB0_6")) 74 MOVQ(R8, RDX) 75 ANDQ(I32(-2), RDX) 76 XORL(ECX, ECX) 77 VMOVUPS(data.Offset(0), Y0) 78 } 79 80 Label("LBB0_8") 81 { 82 VXORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y1) 83 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y0, Y2) 84 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y0, Y3) 85 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y0, Y4) 86 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1)) 87 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(32)) 88 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(64)) 89 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 1).Offset(96)) 90 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(128), Y0, Y1) 91 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(160), Y0, Y2) 92 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(192), Y0, Y3) 93 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(224), Y0, Y4) 94 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(128)) 95 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(160)) 96 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(192)) 97 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 1).Offset(224)) 98 ADDQ(I32(256), RCX) 99 ADDQ(I32(-2), RDX) 100 JNE(LabelRef("LBB0_8")) 101 TESTB(Imm(1), R8B) 102 JE(LabelRef("LBB0_11")) 103 } 104 105 Label("LBB0_10") 106 { 107 VMOVUPS(data.Offset(0), Y0) 108 VXORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y1) 109 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y0, Y2) 110 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y0, Y3) 111 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y0, Y0) 112 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1)) 113 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(32)) 114 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(64)) 115 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1).Offset(96)) 116 } 117 118 Label("LBB0_11") 119 { 120 CMPQ(RAX, RSI) 121 JE(LabelRef("LBB0_17")) 122 TESTB(Imm(112), SIB) 123 JE(LabelRef("LBB0_16")) 124 } 125 126 Label("LBB0_13") 127 { 128 MOVQ(RAX, RCX) 129 MOVQ(RSI, RAX) 130 ANDQ(I32(-16), RAX) 131 VMOVUPS(data.Offset(0), X0) 132 } 133 134 Label("LBB0_14") 135 { 136 VXORPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X1) 137 VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 1)) 138 ADDQ(Imm(16), RCX) 139 CMPQ(RAX, RCX) 140 JNE(LabelRef("LBB0_14")) 141 CMPQ(RAX, RSI) 142 JE(LabelRef("LBB0_17")) 143 } 144 145 Label("LBB0_16") 146 { 147 XORB(Imm(1), Mem{Base: RDI}.Idx(RAX, 1)) 148 ADDQ(Imm(1), RAX) 149 CMPQ(RSI, RAX) 150 JNE(LabelRef("LBB0_16")) 151 } 152 153 Label("LBB0_17") 154 { 155 VZEROUPPER() 156 RET() 157 } 158 159 Label("LBB0_6") 160 { 161 XORL(ECX, ECX) 162 TESTB(Imm(1), R8B) 163 JNE(LabelRef("LBB0_10")) 164 JMP(LabelRef("LBB0_11")) 165 } 166 } 167 168 func genAnd() { 169 170 TEXT("And_AVX2", NOSPLIT, "func(x, y []bool)") 171 Pragma("noescape") 172 Load(Param("x").Base(), RDI) 173 Load(Param("y").Base(), RSI) 174 Load(Param("x").Len(), RDX) 175 176 TESTQ(RDX, RDX) 177 JE(LabelRef("LBB1_13")) 178 CMPQ(RDX, Imm(16)) 179 JAE(LabelRef("LBB1_3")) 180 XORL(EAX, EAX) 181 JMP(LabelRef("LBB1_12")) 182 183 Label("LBB1_3") 184 { 185 CMPQ(RDX, Imm(128)) 186 JAE(LabelRef("LBB1_5")) 187 XORL(EAX, EAX) 188 JMP(LabelRef("LBB1_9")) 189 } 190 191 Label("LBB1_5") 192 { 193 MOVQ(RDX, RAX) 194 ANDQ(I32(-128), RAX) 195 XORL(ECX, ECX) 196 } 197 198 Label("LBB1_6") 199 { 200 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), Y0) 201 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(32), Y1) 202 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(64), Y2) 203 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(96), Y3) 204 VANDPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y0) 205 VANDPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y1, Y1) 206 VANDPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y2, Y2) 207 VANDPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y3, Y3) 208 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1)) 209 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(32)) 210 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(64)) 211 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(96)) 212 SUBQ(I32(-128), RCX) 213 CMPQ(RAX, RCX) 214 JNE(LabelRef("LBB1_6")) 215 CMPQ(RAX, RDX) 216 JE(LabelRef("LBB1_13")) 217 TESTB(Imm(112), DL) 218 JE(LabelRef("LBB1_12")) 219 } 220 221 Label("LBB1_9") 222 { 223 MOVQ(RAX, RCX) 224 MOVQ(RDX, RAX) 225 ANDQ(I32(-16), RAX) 226 } 227 228 Label("LBB1_10") 229 { 230 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), X0) 231 VANDPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X0) 232 VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 1)) 233 ADDQ(Imm(16), RCX) 234 CMPQ(RAX, RCX) 235 JNE(LabelRef("LBB1_10")) 236 CMPQ(RAX, RDX) 237 JE(LabelRef("LBB1_13")) 238 } 239 240 Label("LBB1_12") 241 { 242 MOVBLZX(Mem{Base: RSI}.Idx(RAX, 1), ECX) 243 ANDB(CL, Mem{Base: RDI}.Idx(RAX, 1)) 244 ADDQ(Imm(1), RAX) 245 CMPQ(RDX, RAX) 246 JNE(LabelRef("LBB1_12")) 247 } 248 249 Label("LBB1_13") 250 { 251 VZEROUPPER() 252 RET() 253 } 254 } 255 256 func genOr() { 257 258 TEXT("Or_AVX2", NOSPLIT, "func(x, y []bool)") 259 Pragma("noescape") 260 Load(Param("x").Base(), RDI) 261 Load(Param("y").Base(), RSI) 262 Load(Param("x").Len(), RDX) 263 264 TESTQ(RDX, RDX) 265 JE(LabelRef("LBB2_13")) 266 CMPQ(RDX, Imm(16)) 267 JAE(LabelRef("LBB2_3")) 268 XORL(EAX, EAX) 269 JMP(LabelRef("LBB2_12")) 270 271 Label("LBB2_3") 272 { 273 CMPQ(RDX, Imm(128)) 274 JAE(LabelRef("LBB2_5")) 275 XORL(EAX, EAX) 276 JMP(LabelRef("LBB2_9")) 277 } 278 279 Label("LBB2_5") 280 { 281 MOVQ(RDX, RAX) 282 ANDQ(I32(-128), RAX) 283 XORL(ECX, ECX) 284 } 285 286 Label("LBB2_6") 287 { 288 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), Y0) 289 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(32), Y1) 290 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(64), Y2) 291 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(96), Y3) 292 VORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y0) 293 VORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y1, Y1) 294 VORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y2, Y2) 295 VORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y3, Y3) 296 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1)) 297 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(32)) 298 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(64)) 299 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(96)) 300 SUBQ(I32(-128), RCX) 301 CMPQ(RAX, RCX) 302 JNE(LabelRef("LBB2_6")) 303 CMPQ(RAX, RDX) 304 JE(LabelRef("LBB2_13")) 305 TESTB(Imm(112), DL) 306 JE(LabelRef("LBB2_12")) 307 } 308 309 Label("LBB2_9") 310 { 311 MOVQ(RAX, RCX) 312 MOVQ(RDX, RAX) 313 ANDQ(I32(-16), RAX) 314 } 315 316 Label("LBB2_10") 317 { 318 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), X0) 319 VORPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X0) 320 VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 1)) 321 ADDQ(Imm(16), RCX) 322 CMPQ(RAX, RCX) 323 JNE(LabelRef("LBB2_10")) 324 CMPQ(RAX, RDX) 325 JE(LabelRef("LBB2_13")) 326 } 327 328 Label("LBB2_12") 329 { 330 MOVBLZX(Mem{Base: RSI}.Idx(RAX, 1), ECX) 331 ORB(CL, Mem{Base: RDI}.Idx(RAX, 1)) 332 ADDQ(Imm(1), RAX) 333 CMPQ(RDX, RAX) 334 JNE(LabelRef("LBB2_12")) 335 } 336 337 Label("LBB2_13") 338 { 339 VZEROUPPER() 340 RET() 341 } 342 } 343 344 func genXor() { 345 346 TEXT("Xor_AVX2", NOSPLIT, "func(x, y []bool)") 347 Pragma("noescape") 348 Load(Param("x").Base(), RDI) 349 Load(Param("y").Base(), RSI) 350 Load(Param("x").Len(), RDX) 351 352 TESTQ(RDX, RDX) 353 JE(LabelRef("LBB3_13")) 354 CMPQ(RDX, Imm(16)) 355 JAE(LabelRef("LBB3_3")) 356 XORL(EAX, EAX) 357 JMP(LabelRef("LBB3_12")) 358 359 Label("LBB3_3") 360 { 361 CMPQ(RDX, Imm(128)) 362 JAE(LabelRef("LBB3_5")) 363 XORL(EAX, EAX) 364 JMP(LabelRef("LBB3_9")) 365 } 366 367 Label("LBB3_5") 368 { 369 MOVQ(RDX, RAX) 370 ANDQ(I32(-128), RAX) 371 XORL(ECX, ECX) 372 } 373 374 Label("LBB3_6") 375 { 376 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), Y0) 377 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(32), Y1) 378 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(64), Y2) 379 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(96), Y3) 380 VXORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y0) 381 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y1, Y1) 382 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y2, Y2) 383 VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y3, Y3) 384 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1)) 385 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(32)) 386 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(64)) 387 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(96)) 388 SUBQ(I32(-128), RCX) 389 CMPQ(RAX, RCX) 390 JNE(LabelRef("LBB3_6")) 391 CMPQ(RAX, RDX) 392 JE(LabelRef("LBB3_13")) 393 TESTB(Imm(112), DL) 394 JE(LabelRef("LBB3_12")) 395 } 396 397 Label("LBB3_9") 398 { 399 MOVQ(RAX, RCX) 400 MOVQ(RDX, RAX) 401 ANDQ(I32(-16), RAX) 402 } 403 404 Label("LBB3_10") 405 { 406 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), X0) 407 VXORPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X0) 408 VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 1)) 409 ADDQ(Imm(16), RCX) 410 CMPQ(RAX, RCX) 411 JNE(LabelRef("LBB3_10")) 412 CMPQ(RAX, RDX) 413 JE(LabelRef("LBB3_13")) 414 } 415 416 Label("LBB3_12") 417 { 418 MOVBLZX(Mem{Base: RSI}.Idx(RAX, 1), ECX) 419 XORB(CL, Mem{Base: RDI}.Idx(RAX, 1)) 420 ADDQ(Imm(1), RAX) 421 CMPQ(RDX, RAX) 422 JNE(LabelRef("LBB3_12")) 423 } 424 425 Label("LBB3_13") 426 { 427 VZEROUPPER() 428 RET() 429 } 430 } 431 432 func genSelect_F64() { 433 434 TEXT("Select_AVX2_F64", NOSPLIT, "func(x, y []float64, z []bool) int") 435 Pragma("noescape") 436 Load(Param("x").Base(), RDI) 437 Load(Param("y").Base(), RSI) 438 Load(Param("z").Base(), RDX) 439 Load(Param("z").Len(), RCX) 440 441 TESTQ(RCX, RCX) 442 JE(LabelRef("LBB4_1")) 443 CMPQ(RCX, Imm(1)) 444 JNE(LabelRef("LBB4_4")) 445 XORL(R8L, R8L) 446 XORL(EAX, EAX) 447 448 Label("LBB4_10") 449 { 450 TESTB(Imm(1), CL) 451 JE(LabelRef("LBB4_13")) 452 CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0)) 453 JE(LabelRef("LBB4_13")) 454 VMOVSD(Mem{Base: RSI}.Idx(R8, 8), X0) 455 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 456 ADDQ(Imm(1), RAX) 457 } 458 459 Label("LBB4_13") 460 { 461 Store(RAX, ReturnIndex(0)) 462 RET() 463 } 464 465 Label("LBB4_1") 466 { 467 XORL(EAX, EAX) 468 Store(RAX, ReturnIndex(0)) 469 RET() 470 } 471 472 Label("LBB4_4") 473 { 474 MOVQ(RCX, R9) 475 ANDQ(I32(-2), R9) 476 XORL(R8L, R8L) 477 XORL(EAX, EAX) 478 JMP(LabelRef("LBB4_5")) 479 } 480 481 Label("LBB4_9") 482 { 483 ADDQ(Imm(2), R8) 484 CMPQ(R9, R8) 485 JE(LabelRef("LBB4_10")) 486 } 487 488 Label("LBB4_5") 489 { 490 CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0)) 491 JE(LabelRef("LBB4_7")) 492 VMOVSD(Mem{Base: RSI}.Idx(R8, 8), X0) 493 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 494 ADDQ(Imm(1), RAX) 495 } 496 497 Label("LBB4_7") 498 { 499 CMPB(Mem{Base: RDX}.Idx(R8, 1).Offset(1), Imm(0)) 500 JE(LabelRef("LBB4_9")) 501 VMOVSD(Mem{Base: RSI}.Idx(R8, 8).Offset(8), X0) 502 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 503 ADDQ(Imm(1), RAX) 504 JMP(LabelRef("LBB4_9")) 505 } 506 } 507 508 func genSelect_F32() { 509 510 TEXT("Select_AVX2_F32", NOSPLIT, "func(x, y []float32, z []bool) int") 511 Pragma("noescape") 512 Load(Param("x").Base(), RDI) 513 Load(Param("y").Base(), RSI) 514 Load(Param("z").Base(), RDX) 515 Load(Param("z").Len(), RCX) 516 517 TESTQ(RCX, RCX) 518 JE(LabelRef("LBB5_1")) 519 CMPQ(RCX, Imm(1)) 520 JNE(LabelRef("LBB5_4")) 521 XORL(R8L, R8L) 522 XORL(EAX, EAX) 523 524 Label("LBB5_10") 525 { 526 TESTB(Imm(1), CL) 527 JE(LabelRef("LBB5_13")) 528 CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0)) 529 JE(LabelRef("LBB5_13")) 530 VMOVSS(Mem{Base: RSI}.Idx(R8, 4), X0) 531 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 532 ADDQ(Imm(1), RAX) 533 } 534 535 Label("LBB5_13") 536 { 537 Store(RAX, ReturnIndex(0)) 538 RET() 539 } 540 541 Label("LBB5_1") 542 { 543 XORL(EAX, EAX) 544 Store(RAX, ReturnIndex(0)) 545 RET() 546 } 547 548 Label("LBB5_4") 549 { 550 MOVQ(RCX, R9) 551 ANDQ(I32(-2), R9) 552 XORL(R8L, R8L) 553 XORL(EAX, EAX) 554 JMP(LabelRef("LBB5_5")) 555 } 556 557 Label("LBB5_9") 558 { 559 ADDQ(Imm(2), R8) 560 CMPQ(R9, R8) 561 JE(LabelRef("LBB5_10")) 562 } 563 564 Label("LBB5_5") 565 { 566 CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0)) 567 JE(LabelRef("LBB5_7")) 568 VMOVSS(Mem{Base: RSI}.Idx(R8, 4), X0) 569 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 570 ADDQ(Imm(1), RAX) 571 } 572 573 Label("LBB5_7") 574 { 575 CMPB(Mem{Base: RDX}.Idx(R8, 1).Offset(1), Imm(0)) 576 JE(LabelRef("LBB5_9")) 577 VMOVSS(Mem{Base: RSI}.Idx(R8, 4).Offset(4), X0) 578 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 579 ADDQ(Imm(1), RAX) 580 JMP(LabelRef("LBB5_9")) 581 } 582 } 583 584 func genAll() { 585 586 TEXT("All_AVX2", NOSPLIT, "func(x []bool) int") 587 Pragma("noescape") 588 Load(Param("x").Base(), RDI) 589 Load(Param("x").Len(), RSI) 590 591 MOVQ(RSI, RAX) 592 XORL(ECX, ECX) 593 ANDQ(I32(-32), RAX) 594 JE(LabelRef("LBB0_1")) 595 VPXOR(X0, X0, X0) 596 597 Label("LBB0_8") 598 { 599 VPCMPEQB(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y1) 600 VPTEST(Y1, Y1) 601 JNE(LabelRef("LBB0_9")) 602 ADDQ(Imm(32), RCX) 603 CMPQ(RCX, RAX) 604 JB(LabelRef("LBB0_8")) 605 } 606 607 Label("LBB0_1") 608 { 609 MOVB(Imm(1), AL) 610 CMPQ(RCX, RSI) 611 JAE(LabelRef("LBB0_6")) 612 ADDQ(I32(-1), RSI) 613 } 614 615 Label("LBB0_3") 616 { 617 MOVBLZX(Mem{Base: RDI}.Idx(RCX, 1), EAX) 618 TESTB(AL, AL) 619 JE(LabelRef("LBB0_5")) 620 LEAQ(Mem{Base: RCX}.Offset(1), RDX) 621 CMPQ(RSI, RCX) 622 MOVQ(RDX, RCX) 623 JNE(LabelRef("LBB0_3")) 624 } 625 626 Label("LBB0_5") 627 { 628 TESTB(AL, AL) 629 SETNE(AL) 630 } 631 632 Label("LBB0_6") 633 { 634 VZEROUPPER() 635 Store(RAX, ReturnIndex(0)) 636 RET() 637 } 638 639 Label("LBB0_9") 640 { 641 XORL(EAX, EAX) 642 VZEROUPPER() 643 Store(RAX, ReturnIndex(0)) 644 RET() 645 } 646 } 647 648 func genAny() { 649 650 TEXT("Any_AVX2", NOSPLIT, "func(x []bool) int") 651 Pragma("noescape") 652 Load(Param("x").Base(), RDI) 653 Load(Param("x").Len(), RSI) 654 655 MOVQ(RSI, RCX) 656 XORL(EAX, EAX) 657 ANDQ(I32(-32), RCX) 658 JE(LabelRef("LBB1_1")) 659 660 Label("LBB1_4") 661 { 662 VMOVDQU(Mem{Base: RDI}.Idx(RAX, 1), Y0) 663 VPTEST(Y0, Y0) 664 JNE(LabelRef("LBB1_5")) 665 ADDQ(Imm(32), RAX) 666 CMPQ(RAX, RCX) 667 JB(LabelRef("LBB1_4")) 668 } 669 670 Label("LBB1_1") 671 { 672 CMPQ(RAX, RSI) 673 JAE(LabelRef("LBB1_2")) 674 ADDQ(I32(-1), RSI) 675 } 676 677 Label("LBB1_7") 678 { 679 MOVBLZX(Mem{Base: RDI}.Idx(RAX, 1), ECX) 680 TESTB(CL, CL) 681 JNE(LabelRef("LBB1_9")) 682 LEAQ(Mem{Base: RAX}.Offset(1), RDX) 683 CMPQ(RSI, RAX) 684 MOVQ(RDX, RAX) 685 JNE(LabelRef("LBB1_7")) 686 } 687 688 Label("LBB1_9") 689 { 690 TESTB(CL, CL) 691 SETNE(AL) 692 VZEROUPPER() 693 Store(RAX, ReturnIndex(0)) 694 RET() 695 } 696 697 Label("LBB1_5") 698 { 699 MOVB(Imm(1), AL) 700 VZEROUPPER() 701 Store(RAX, ReturnIndex(0)) 702 RET() 703 } 704 705 Label("LBB1_2") 706 { 707 XORL(EAX, EAX) 708 VZEROUPPER() 709 Store(RAX, ReturnIndex(0)) 710 RET() 711 } 712 } 713 714 func genNone() { 715 716 TEXT("None_AVX2", NOSPLIT, "func(x []bool) int") 717 Pragma("noescape") 718 Load(Param("x").Base(), RDI) 719 Load(Param("x").Len(), RSI) 720 721 MOVQ(RSI, RAX) 722 XORL(ECX, ECX) 723 ANDQ(I32(-32), RAX) 724 JE(LabelRef("LBB2_1")) 725 726 Label("LBB2_7") 727 { 728 VMOVDQU(Mem{Base: RDI}.Idx(RCX, 1), Y0) 729 VPTEST(Y0, Y0) 730 JNE(LabelRef("LBB2_8")) 731 ADDQ(Imm(32), RCX) 732 CMPQ(RCX, RAX) 733 JB(LabelRef("LBB2_7")) 734 } 735 736 Label("LBB2_1") 737 { 738 MOVB(Imm(1), AL) 739 CMPQ(RCX, RSI) 740 JAE(LabelRef("LBB2_5")) 741 ADDQ(I32(-1), RSI) 742 } 743 744 Label("LBB2_3") 745 { 746 CMPB(Mem{Base: RDI}.Idx(RCX, 1), Imm(0)) 747 SETEQ(AL) 748 JNE(LabelRef("LBB2_5")) 749 LEAQ(Mem{Base: RCX}.Offset(1), RDX) 750 CMPQ(RSI, RCX) 751 MOVQ(RDX, RCX) 752 JNE(LabelRef("LBB2_3")) 753 } 754 755 Label("LBB2_5") 756 { 757 VZEROUPPER() 758 Store(RAX, ReturnIndex(0)) 759 RET() 760 } 761 762 Label("LBB2_8") 763 { 764 XORL(EAX, EAX) 765 VZEROUPPER() 766 Store(RAX, ReturnIndex(0)) 767 RET() 768 } 769 } 770 771 func genCount() { 772 773 TEXT("Count_AVX2", NOSPLIT, "func(x []bool) int") 774 Pragma("noescape") 775 Load(Param("x").Base(), RDI) 776 Load(Param("x").Len(), RSI) 777 778 TESTQ(RSI, RSI) 779 JE(LabelRef("LBB9_1")) 780 CMPQ(RSI, Imm(16)) 781 JAE(LabelRef("LBB9_4")) 782 XORL(ECX, ECX) 783 XORL(EAX, EAX) 784 JMP(LabelRef("LBB9_11")) 785 786 Label("LBB9_1") 787 { 788 XORL(EAX, EAX) 789 Store(RAX, ReturnIndex(0)) 790 RET() 791 } 792 793 Label("LBB9_4") 794 { 795 MOVQ(RSI, RCX) 796 ANDQ(I32(-16), RCX) 797 LEAQ(Mem{Base: RCX}.Offset(-16), RAX) 798 MOVQ(RAX, R8) 799 SHRQ(Imm(4), R8) 800 ADDQ(Imm(1), R8) 801 TESTQ(RAX, RAX) 802 JE(LabelRef("LBB9_5")) 803 MOVQ(R8, RDX) 804 ANDQ(I32(-2), RDX) 805 VPXOR(X0, X0, X0) 806 XORL(EAX, EAX) 807 VPXOR(X1, X1, X1) 808 VPXOR(X2, X2, X2) 809 VPXOR(X3, X3, X3) 810 } 811 812 Label("LBB9_7") 813 { 814 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1), Y4) 815 VPADDQ(Y4, Y0, Y0) 816 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(4), Y4) 817 VPADDQ(Y4, Y1, Y1) 818 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(8), Y4) 819 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(12), Y5) 820 VPADDQ(Y4, Y2, Y2) 821 VPADDQ(Y5, Y3, Y3) 822 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(16), Y4) 823 VPADDQ(Y4, Y0, Y0) 824 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(20), Y4) 825 VPADDQ(Y4, Y1, Y1) 826 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(24), Y4) 827 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(28), Y5) 828 VPADDQ(Y4, Y2, Y2) 829 VPADDQ(Y5, Y3, Y3) 830 ADDQ(Imm(32), RAX) 831 ADDQ(I32(-2), RDX) 832 JNE(LabelRef("LBB9_7")) 833 TESTB(Imm(1), R8B) 834 JE(LabelRef("LBB9_10")) 835 } 836 837 Label("LBB9_9") 838 { 839 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1), Y4) 840 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(4), Y5) 841 VPADDQ(Y4, Y0, Y0) 842 VPADDQ(Y5, Y1, Y1) 843 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(8), Y4) 844 VPADDQ(Y4, Y2, Y2) 845 VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(12), Y4) 846 VPADDQ(Y4, Y3, Y3) 847 } 848 849 Label("LBB9_10") 850 { 851 VPADDQ(Y3, Y1, Y1) 852 VPADDQ(Y2, Y0, Y0) 853 VPADDQ(Y1, Y0, Y0) 854 VEXTRACTI128(Imm(1), Y0, X1) 855 VPADDQ(X1, X0, X0) 856 VPSHUFD(Imm(238), X0, X1) 857 VPADDQ(X1, X0, X0) 858 VMOVQ(X0, RAX) 859 CMPQ(RCX, RSI) 860 JE(LabelRef("LBB9_12")) 861 } 862 863 Label("LBB9_11") 864 { 865 MOVBLZX(Mem{Base: RDI}.Idx(RCX, 1), EDX) 866 ADDQ(RDX, RAX) 867 ADDQ(Imm(1), RCX) 868 CMPQ(RSI, RCX) 869 JNE(LabelRef("LBB9_11")) 870 } 871 872 Label("LBB9_12") 873 { 874 VZEROUPPER() 875 Store(RAX, ReturnIndex(0)) 876 RET() 877 } 878 879 Label("LBB9_5") 880 { 881 VPXOR(X0, X0, X0) 882 XORL(EAX, EAX) 883 VPXOR(X1, X1, X1) 884 VPXOR(X2, X2, X2) 885 VPXOR(X3, X3, X3) 886 TESTB(Imm(1), R8B) 887 JNE(LabelRef("LBB9_9")) 888 JMP(LabelRef("LBB9_10")) 889 } 890 }