gitee.com/quant1x/gox@v1.7.6/num/asm/arithmetic.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 genAdd_F64() { 10 11 TEXT("Add_AVX2_F64", NOSPLIT, "func(x, y []float64)") 12 Pragma("noescape") 13 Load(Param("x").Base(), RDI) 14 Load(Param("y").Base(), RSI) 15 Load(Param("x").Len(), RDX) 16 17 TESTQ(RDX, RDX) 18 JE(LabelRef("LBB0_7")) 19 CMPQ(RDX, Imm(16)) 20 JAE(LabelRef("LBB0_3")) 21 XORL(EAX, EAX) 22 JMP(LabelRef("LBB0_6")) 23 24 Label("LBB0_3") 25 { 26 MOVQ(RDX, RAX) 27 ANDQ(I32(-16), RAX) 28 XORL(ECX, ECX) 29 } 30 31 Label("LBB0_4") 32 { 33 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0) 34 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1) 35 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y2) 36 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y3) 37 VADDPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0) 38 VADDPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y1) 39 VADDPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2, Y2) 40 VADDPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3, Y3) 41 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 42 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 43 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 44 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 45 ADDQ(Imm(16), RCX) 46 CMPQ(RAX, RCX) 47 JNE(LabelRef("LBB0_4")) 48 CMPQ(RAX, RDX) 49 JE(LabelRef("LBB0_7")) 50 } 51 52 Label("LBB0_6") 53 { 54 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0) 55 VADDSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0) 56 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 57 ADDQ(Imm(1), RAX) 58 CMPQ(RDX, RAX) 59 JNE(LabelRef("LBB0_6")) 60 } 61 62 Label("LBB0_7") 63 { 64 VZEROUPPER() 65 RET() 66 } 67 } 68 69 func genAdd_F32() { 70 71 TEXT("Add_AVX2_F32", NOSPLIT, "func(x, y []float32)") 72 Pragma("noescape") 73 Load(Param("x").Base(), RDI) 74 Load(Param("y").Base(), RSI) 75 Load(Param("x").Len(), RDX) 76 77 TESTQ(RDX, RDX) 78 JE(LabelRef("LBB1_7")) 79 CMPQ(RDX, Imm(32)) 80 JAE(LabelRef("LBB1_3")) 81 XORL(EAX, EAX) 82 JMP(LabelRef("LBB1_6")) 83 84 Label("LBB1_3") 85 { 86 MOVQ(RDX, RAX) 87 ANDQ(I32(-32), RAX) 88 XORL(ECX, ECX) 89 } 90 91 Label("LBB1_4") 92 { 93 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y0) 94 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1) 95 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y2) 96 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y3) 97 VADDPS(Mem{Base: RSI}.Idx(RCX, 4), Y0, Y0) 98 VADDPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1, Y1) 99 VADDPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2, Y2) 100 VADDPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3, Y3) 101 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 102 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 103 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 104 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 105 ADDQ(Imm(32), RCX) 106 CMPQ(RAX, RCX) 107 JNE(LabelRef("LBB1_4")) 108 CMPQ(RAX, RDX) 109 JE(LabelRef("LBB1_7")) 110 } 111 112 Label("LBB1_6") 113 { 114 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0) 115 VADDSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 116 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 117 ADDQ(Imm(1), RAX) 118 CMPQ(RDX, RAX) 119 JNE(LabelRef("LBB1_6")) 120 } 121 122 Label("LBB1_7") 123 { 124 VZEROUPPER() 125 RET() 126 } 127 } 128 129 func genAddNumber_F64() { 130 131 TEXT("AddNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)") 132 Pragma("noescape") 133 Load(Param("x").Base(), RDI) 134 Load(Param("a"), X0) 135 Load(Param("x").Len(), RSI) 136 137 TESTQ(RSI, RSI) 138 JE(LabelRef("LBB2_11")) 139 CMPQ(RSI, Imm(16)) 140 JAE(LabelRef("LBB2_3")) 141 XORL(EAX, EAX) 142 JMP(LabelRef("LBB2_10")) 143 144 Label("LBB2_3") 145 { 146 MOVQ(RSI, RAX) 147 ANDQ(I32(-16), RAX) 148 VBROADCASTSD(X0, Y1) 149 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 150 MOVQ(RCX, R8) 151 SHRQ(Imm(4), R8) 152 ADDQ(Imm(1), R8) 153 TESTQ(RCX, RCX) 154 JE(LabelRef("LBB2_4")) 155 MOVQ(R8, RDX) 156 ANDQ(I32(-2), RDX) 157 XORL(ECX, ECX) 158 } 159 160 Label("LBB2_6") 161 { 162 VADDPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2) 163 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3) 164 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4) 165 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y5) 166 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8)) 167 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 168 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 169 VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 170 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y1, Y2) 171 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y1, Y3) 172 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y1, Y4) 173 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y1, Y5) 174 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 175 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 176 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 177 VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 178 ADDQ(Imm(32), RCX) 179 ADDQ(I32(-2), RDX) 180 JNE(LabelRef("LBB2_6")) 181 TESTB(Imm(1), R8B) 182 JE(LabelRef("LBB2_9")) 183 } 184 185 Label("LBB2_8") 186 { 187 VADDPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2) 188 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3) 189 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4) 190 VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y1) 191 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8)) 192 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 193 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 194 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 195 } 196 197 Label("LBB2_9") 198 { 199 CMPQ(RAX, RSI) 200 JE(LabelRef("LBB2_11")) 201 } 202 203 Label("LBB2_10") 204 { 205 VADDSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1) 206 VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8)) 207 ADDQ(Imm(1), RAX) 208 CMPQ(RSI, RAX) 209 JNE(LabelRef("LBB2_10")) 210 } 211 212 Label("LBB2_11") 213 { 214 VZEROUPPER() 215 RET() 216 } 217 218 Label("LBB2_4") 219 { 220 XORL(ECX, ECX) 221 TESTB(Imm(1), R8B) 222 JNE(LabelRef("LBB2_8")) 223 JMP(LabelRef("LBB2_9")) 224 } 225 } 226 227 func genAddNumber_F32() { 228 229 TEXT("AddNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)") 230 Pragma("noescape") 231 Load(Param("x").Base(), RDI) 232 Load(Param("a"), X0) 233 Load(Param("x").Len(), RSI) 234 235 TESTQ(RSI, RSI) 236 JE(LabelRef("LBB3_11")) 237 CMPQ(RSI, Imm(32)) 238 JAE(LabelRef("LBB3_3")) 239 XORL(EAX, EAX) 240 JMP(LabelRef("LBB3_10")) 241 242 Label("LBB3_3") 243 { 244 MOVQ(RSI, RAX) 245 ANDQ(I32(-32), RAX) 246 VBROADCASTSS(X0, Y1) 247 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 248 MOVQ(RCX, R8) 249 SHRQ(Imm(5), R8) 250 ADDQ(Imm(1), R8) 251 TESTQ(RCX, RCX) 252 JE(LabelRef("LBB3_4")) 253 MOVQ(R8, RDX) 254 ANDQ(I32(-2), RDX) 255 XORL(ECX, ECX) 256 } 257 258 Label("LBB3_6") 259 { 260 VADDPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2) 261 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3) 262 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4) 263 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y5) 264 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 265 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 266 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 267 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 268 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y1, Y2) 269 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y1, Y3) 270 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y1, Y4) 271 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y1, Y5) 272 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 273 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 274 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 275 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 276 ADDQ(Imm(64), RCX) 277 ADDQ(I32(-2), RDX) 278 JNE(LabelRef("LBB3_6")) 279 TESTB(Imm(1), R8B) 280 JE(LabelRef("LBB3_9")) 281 } 282 283 Label("LBB3_8") 284 { 285 VADDPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2) 286 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3) 287 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4) 288 VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y1) 289 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 290 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 291 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 292 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 293 } 294 295 Label("LBB3_9") 296 { 297 CMPQ(RAX, RSI) 298 JE(LabelRef("LBB3_11")) 299 } 300 301 Label("LBB3_10") 302 { 303 VADDSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1) 304 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 305 ADDQ(Imm(1), RAX) 306 CMPQ(RSI, RAX) 307 JNE(LabelRef("LBB3_10")) 308 } 309 310 Label("LBB3_11") 311 { 312 VZEROUPPER() 313 RET() 314 } 315 316 Label("LBB3_4") 317 { 318 XORL(ECX, ECX) 319 TESTB(Imm(1), R8B) 320 JNE(LabelRef("LBB3_8")) 321 JMP(LabelRef("LBB3_9")) 322 } 323 } 324 325 func genSub_F64() { 326 327 TEXT("Sub_AVX2_F64", NOSPLIT, "func(x, y []float64)") 328 Pragma("noescape") 329 Load(Param("x").Base(), RDI) 330 Load(Param("y").Base(), RSI) 331 Load(Param("x").Len(), RDX) 332 333 TESTQ(RDX, RDX) 334 JE(LabelRef("LBB4_7")) 335 CMPQ(RDX, Imm(16)) 336 JAE(LabelRef("LBB4_3")) 337 XORL(EAX, EAX) 338 JMP(LabelRef("LBB4_6")) 339 340 Label("LBB4_3") 341 { 342 MOVQ(RDX, RAX) 343 ANDQ(I32(-16), RAX) 344 XORL(ECX, ECX) 345 } 346 347 Label("LBB4_4") 348 { 349 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0) 350 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1) 351 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y2) 352 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y3) 353 VSUBPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0) 354 VSUBPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y1) 355 VSUBPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2, Y2) 356 VSUBPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3, Y3) 357 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 358 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 359 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 360 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 361 ADDQ(Imm(16), RCX) 362 CMPQ(RAX, RCX) 363 JNE(LabelRef("LBB4_4")) 364 CMPQ(RAX, RDX) 365 JE(LabelRef("LBB4_7")) 366 } 367 368 Label("LBB4_6") 369 { 370 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0) 371 VSUBSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0) 372 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 373 ADDQ(Imm(1), RAX) 374 CMPQ(RDX, RAX) 375 JNE(LabelRef("LBB4_6")) 376 } 377 378 Label("LBB4_7") 379 { 380 VZEROUPPER() 381 RET() 382 } 383 } 384 385 func genSub_F32() { 386 387 TEXT("Sub_AVX2_F32", NOSPLIT, "func(x, y []float32)") 388 Pragma("noescape") 389 Load(Param("x").Base(), RDI) 390 Load(Param("y").Base(), RSI) 391 Load(Param("x").Len(), RDX) 392 393 TESTQ(RDX, RDX) 394 JE(LabelRef("LBB5_7")) 395 CMPQ(RDX, Imm(32)) 396 JAE(LabelRef("LBB5_3")) 397 XORL(EAX, EAX) 398 JMP(LabelRef("LBB5_6")) 399 400 Label("LBB5_3") 401 { 402 MOVQ(RDX, RAX) 403 ANDQ(I32(-32), RAX) 404 XORL(ECX, ECX) 405 } 406 407 Label("LBB5_4") 408 { 409 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y0) 410 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1) 411 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y2) 412 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y3) 413 VSUBPS(Mem{Base: RSI}.Idx(RCX, 4), Y0, Y0) 414 VSUBPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1, Y1) 415 VSUBPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2, Y2) 416 VSUBPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3, Y3) 417 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 418 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 419 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 420 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 421 ADDQ(Imm(32), RCX) 422 CMPQ(RAX, RCX) 423 JNE(LabelRef("LBB5_4")) 424 CMPQ(RAX, RDX) 425 JE(LabelRef("LBB5_7")) 426 } 427 428 Label("LBB5_6") 429 { 430 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0) 431 VSUBSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 432 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 433 ADDQ(Imm(1), RAX) 434 CMPQ(RDX, RAX) 435 JNE(LabelRef("LBB5_6")) 436 } 437 438 Label("LBB5_7") 439 { 440 VZEROUPPER() 441 RET() 442 } 443 } 444 445 func genSubNumber_F64() { 446 447 TEXT("SubNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)") 448 Pragma("noescape") 449 Load(Param("x").Base(), RDI) 450 Load(Param("a"), X0) 451 Load(Param("x").Len(), RSI) 452 453 TESTQ(RSI, RSI) 454 JE(LabelRef("LBB6_11")) 455 CMPQ(RSI, Imm(16)) 456 JAE(LabelRef("LBB6_3")) 457 XORL(EAX, EAX) 458 JMP(LabelRef("LBB6_10")) 459 460 Label("LBB6_3") 461 { 462 MOVQ(RSI, RAX) 463 ANDQ(I32(-16), RAX) 464 VBROADCASTSD(X0, Y1) 465 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 466 MOVQ(RCX, R8) 467 SHRQ(Imm(4), R8) 468 ADDQ(Imm(1), R8) 469 TESTQ(RCX, RCX) 470 JE(LabelRef("LBB6_4")) 471 MOVQ(R8, RDX) 472 ANDQ(I32(-2), RDX) 473 XORL(ECX, ECX) 474 } 475 476 Label("LBB6_6") 477 { 478 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y2) 479 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y3) 480 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y4) 481 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y5) 482 VSUBPD(Y1, Y2, Y2) 483 VSUBPD(Y1, Y3, Y3) 484 VSUBPD(Y1, Y4, Y4) 485 VSUBPD(Y1, Y5, Y5) 486 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8)) 487 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 488 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 489 VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 490 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y2) 491 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y3) 492 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y4) 493 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y5) 494 VSUBPD(Y1, Y2, Y2) 495 VSUBPD(Y1, Y3, Y3) 496 VSUBPD(Y1, Y4, Y4) 497 VSUBPD(Y1, Y5, Y5) 498 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 499 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 500 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 501 VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 502 ADDQ(Imm(32), RCX) 503 ADDQ(I32(-2), RDX) 504 JNE(LabelRef("LBB6_6")) 505 TESTB(Imm(1), R8B) 506 JE(LabelRef("LBB6_9")) 507 } 508 509 Label("LBB6_8") 510 { 511 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y2) 512 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y3) 513 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y4) 514 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y5) 515 VSUBPD(Y1, Y2, Y2) 516 VSUBPD(Y1, Y3, Y3) 517 VSUBPD(Y1, Y4, Y4) 518 VSUBPD(Y1, Y5, Y1) 519 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8)) 520 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 521 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 522 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 523 } 524 525 Label("LBB6_9") 526 { 527 CMPQ(RAX, RSI) 528 JE(LabelRef("LBB6_11")) 529 } 530 531 Label("LBB6_10") 532 { 533 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X1) 534 VSUBSD(X0, X1, X1) 535 VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8)) 536 ADDQ(Imm(1), RAX) 537 CMPQ(RSI, RAX) 538 JNE(LabelRef("LBB6_10")) 539 } 540 541 Label("LBB6_11") 542 { 543 VZEROUPPER() 544 RET() 545 } 546 547 Label("LBB6_4") 548 { 549 XORL(ECX, ECX) 550 TESTB(Imm(1), R8B) 551 JNE(LabelRef("LBB6_8")) 552 JMP(LabelRef("LBB6_9")) 553 } 554 } 555 556 func genSubNumber_F32() { 557 558 TEXT("SubNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)") 559 Pragma("noescape") 560 Load(Param("x").Base(), RDI) 561 Load(Param("a"), X0) 562 Load(Param("x").Len(), RSI) 563 564 TESTQ(RSI, RSI) 565 JE(LabelRef("LBB7_11")) 566 CMPQ(RSI, Imm(32)) 567 JAE(LabelRef("LBB7_3")) 568 XORL(EAX, EAX) 569 JMP(LabelRef("LBB7_10")) 570 571 Label("LBB7_3") 572 { 573 MOVQ(RSI, RAX) 574 ANDQ(I32(-32), RAX) 575 VBROADCASTSS(X0, Y1) 576 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 577 MOVQ(RCX, R8) 578 SHRQ(Imm(5), R8) 579 ADDQ(Imm(1), R8) 580 TESTQ(RCX, RCX) 581 JE(LabelRef("LBB7_4")) 582 MOVQ(R8, RDX) 583 ANDQ(I32(-2), RDX) 584 XORL(ECX, ECX) 585 } 586 587 Label("LBB7_6") 588 { 589 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y2) 590 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y3) 591 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y4) 592 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y5) 593 VSUBPS(Y1, Y2, Y2) 594 VSUBPS(Y1, Y3, Y3) 595 VSUBPS(Y1, Y4, Y4) 596 VSUBPS(Y1, Y5, Y5) 597 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 598 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 599 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 600 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 601 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y2) 602 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y3) 603 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y4) 604 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y5) 605 VSUBPS(Y1, Y2, Y2) 606 VSUBPS(Y1, Y3, Y3) 607 VSUBPS(Y1, Y4, Y4) 608 VSUBPS(Y1, Y5, Y5) 609 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 610 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 611 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 612 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 613 ADDQ(Imm(64), RCX) 614 ADDQ(I32(-2), RDX) 615 JNE(LabelRef("LBB7_6")) 616 TESTB(Imm(1), R8B) 617 JE(LabelRef("LBB7_9")) 618 } 619 620 Label("LBB7_8") 621 { 622 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y2) 623 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y3) 624 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y4) 625 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y5) 626 VSUBPS(Y1, Y2, Y2) 627 VSUBPS(Y1, Y3, Y3) 628 VSUBPS(Y1, Y4, Y4) 629 VSUBPS(Y1, Y5, Y1) 630 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 631 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 632 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 633 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 634 } 635 636 Label("LBB7_9") 637 { 638 CMPQ(RAX, RSI) 639 JE(LabelRef("LBB7_11")) 640 } 641 642 Label("LBB7_10") 643 { 644 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X1) 645 VSUBSS(X0, X1, X1) 646 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 647 ADDQ(Imm(1), RAX) 648 CMPQ(RSI, RAX) 649 JNE(LabelRef("LBB7_10")) 650 } 651 652 Label("LBB7_11") 653 { 654 VZEROUPPER() 655 RET() 656 } 657 658 Label("LBB7_4") 659 { 660 XORL(ECX, ECX) 661 TESTB(Imm(1), R8B) 662 JNE(LabelRef("LBB7_8")) 663 JMP(LabelRef("LBB7_9")) 664 } 665 } 666 667 func genMul_F64() { 668 669 TEXT("Mul_AVX2_F64", NOSPLIT, "func(x, y []float64)") 670 Pragma("noescape") 671 Load(Param("x").Base(), RDI) 672 Load(Param("y").Base(), RSI) 673 Load(Param("x").Len(), RDX) 674 675 TESTQ(RDX, RDX) 676 JE(LabelRef("LBB8_7")) 677 CMPQ(RDX, Imm(16)) 678 JAE(LabelRef("LBB8_3")) 679 XORL(EAX, EAX) 680 JMP(LabelRef("LBB8_6")) 681 682 Label("LBB8_3") 683 { 684 MOVQ(RDX, RAX) 685 ANDQ(I32(-16), RAX) 686 XORL(ECX, ECX) 687 } 688 689 Label("LBB8_4") 690 { 691 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0) 692 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1) 693 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y2) 694 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y3) 695 VMULPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0) 696 VMULPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y1) 697 VMULPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2, Y2) 698 VMULPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3, Y3) 699 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 700 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 701 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 702 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 703 ADDQ(Imm(16), RCX) 704 CMPQ(RAX, RCX) 705 JNE(LabelRef("LBB8_4")) 706 CMPQ(RAX, RDX) 707 JE(LabelRef("LBB8_7")) 708 } 709 710 Label("LBB8_6") 711 { 712 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0) 713 VMULSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0) 714 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 715 ADDQ(Imm(1), RAX) 716 CMPQ(RDX, RAX) 717 JNE(LabelRef("LBB8_6")) 718 } 719 720 Label("LBB8_7") 721 { 722 VZEROUPPER() 723 RET() 724 } 725 } 726 727 func genMul_F32() { 728 729 TEXT("Mul_AVX2_F32", NOSPLIT, "func(x, y []float32)") 730 Pragma("noescape") 731 Load(Param("x").Base(), RDI) 732 Load(Param("y").Base(), RSI) 733 Load(Param("x").Len(), RDX) 734 735 TESTQ(RDX, RDX) 736 JE(LabelRef("LBB9_7")) 737 CMPQ(RDX, Imm(32)) 738 JAE(LabelRef("LBB9_3")) 739 XORL(EAX, EAX) 740 JMP(LabelRef("LBB9_6")) 741 742 Label("LBB9_3") 743 { 744 MOVQ(RDX, RAX) 745 ANDQ(I32(-32), RAX) 746 XORL(ECX, ECX) 747 } 748 749 Label("LBB9_4") 750 { 751 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y0) 752 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1) 753 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y2) 754 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y3) 755 VMULPS(Mem{Base: RSI}.Idx(RCX, 4), Y0, Y0) 756 VMULPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1, Y1) 757 VMULPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2, Y2) 758 VMULPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3, Y3) 759 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 760 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 761 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 762 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 763 ADDQ(Imm(32), RCX) 764 CMPQ(RAX, RCX) 765 JNE(LabelRef("LBB9_4")) 766 CMPQ(RAX, RDX) 767 JE(LabelRef("LBB9_7")) 768 } 769 770 Label("LBB9_6") 771 { 772 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0) 773 VMULSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 774 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 775 ADDQ(Imm(1), RAX) 776 CMPQ(RDX, RAX) 777 JNE(LabelRef("LBB9_6")) 778 } 779 780 Label("LBB9_7") 781 { 782 VZEROUPPER() 783 RET() 784 } 785 } 786 787 func genMulNumber_F64() { 788 789 TEXT("MulNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)") 790 Pragma("noescape") 791 Load(Param("x").Base(), RDI) 792 Load(Param("a"), X0) 793 Load(Param("x").Len(), RSI) 794 795 TESTQ(RSI, RSI) 796 JE(LabelRef("LBB10_11")) 797 CMPQ(RSI, Imm(16)) 798 JAE(LabelRef("LBB10_3")) 799 XORL(EAX, EAX) 800 JMP(LabelRef("LBB10_10")) 801 802 Label("LBB10_3") 803 { 804 MOVQ(RSI, RAX) 805 ANDQ(I32(-16), RAX) 806 VBROADCASTSD(X0, Y1) 807 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 808 MOVQ(RCX, R8) 809 SHRQ(Imm(4), R8) 810 ADDQ(Imm(1), R8) 811 TESTQ(RCX, RCX) 812 JE(LabelRef("LBB10_4")) 813 MOVQ(R8, RDX) 814 ANDQ(I32(-2), RDX) 815 XORL(ECX, ECX) 816 } 817 818 Label("LBB10_6") 819 { 820 VMULPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2) 821 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3) 822 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4) 823 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y5) 824 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8)) 825 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 826 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 827 VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 828 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y1, Y2) 829 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y1, Y3) 830 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y1, Y4) 831 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y1, Y5) 832 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 833 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 834 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 835 VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 836 ADDQ(Imm(32), RCX) 837 ADDQ(I32(-2), RDX) 838 JNE(LabelRef("LBB10_6")) 839 TESTB(Imm(1), R8B) 840 JE(LabelRef("LBB10_9")) 841 } 842 843 Label("LBB10_8") 844 { 845 VMULPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2) 846 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3) 847 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4) 848 VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y1) 849 VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8)) 850 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 851 VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 852 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 853 } 854 855 Label("LBB10_9") 856 { 857 CMPQ(RAX, RSI) 858 JE(LabelRef("LBB10_11")) 859 } 860 861 Label("LBB10_10") 862 { 863 VMULSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1) 864 VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8)) 865 ADDQ(Imm(1), RAX) 866 CMPQ(RSI, RAX) 867 JNE(LabelRef("LBB10_10")) 868 } 869 870 Label("LBB10_11") 871 { 872 VZEROUPPER() 873 RET() 874 } 875 876 Label("LBB10_4") 877 { 878 XORL(ECX, ECX) 879 TESTB(Imm(1), R8B) 880 JNE(LabelRef("LBB10_8")) 881 JMP(LabelRef("LBB10_9")) 882 } 883 } 884 885 func genMulNumber_F32() { 886 887 TEXT("MulNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)") 888 Pragma("noescape") 889 Load(Param("x").Base(), RDI) 890 Load(Param("a"), X0) 891 Load(Param("x").Len(), RSI) 892 893 TESTQ(RSI, RSI) 894 JE(LabelRef("LBB11_11")) 895 CMPQ(RSI, Imm(32)) 896 JAE(LabelRef("LBB11_3")) 897 XORL(EAX, EAX) 898 JMP(LabelRef("LBB11_10")) 899 900 Label("LBB11_3") 901 { 902 MOVQ(RSI, RAX) 903 ANDQ(I32(-32), RAX) 904 VBROADCASTSS(X0, Y1) 905 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 906 MOVQ(RCX, R8) 907 SHRQ(Imm(5), R8) 908 ADDQ(Imm(1), R8) 909 TESTQ(RCX, RCX) 910 JE(LabelRef("LBB11_4")) 911 MOVQ(R8, RDX) 912 ANDQ(I32(-2), RDX) 913 XORL(ECX, ECX) 914 } 915 916 Label("LBB11_6") 917 { 918 VMULPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2) 919 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3) 920 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4) 921 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y5) 922 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 923 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 924 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 925 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 926 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y1, Y2) 927 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y1, Y3) 928 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y1, Y4) 929 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y1, Y5) 930 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 931 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 932 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 933 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 934 ADDQ(Imm(64), RCX) 935 ADDQ(I32(-2), RDX) 936 JNE(LabelRef("LBB11_6")) 937 TESTB(Imm(1), R8B) 938 JE(LabelRef("LBB11_9")) 939 } 940 941 Label("LBB11_8") 942 { 943 VMULPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2) 944 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3) 945 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4) 946 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y1) 947 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 948 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 949 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 950 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 951 } 952 953 Label("LBB11_9") 954 { 955 CMPQ(RAX, RSI) 956 JE(LabelRef("LBB11_11")) 957 } 958 959 Label("LBB11_10") 960 { 961 VMULSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1) 962 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 963 ADDQ(Imm(1), RAX) 964 CMPQ(RSI, RAX) 965 JNE(LabelRef("LBB11_10")) 966 } 967 968 Label("LBB11_11") 969 { 970 VZEROUPPER() 971 RET() 972 } 973 974 Label("LBB11_4") 975 { 976 XORL(ECX, ECX) 977 TESTB(Imm(1), R8B) 978 JNE(LabelRef("LBB11_8")) 979 JMP(LabelRef("LBB11_9")) 980 } 981 } 982 983 func genDiv_F64() { 984 985 TEXT("Div_AVX2_F64", NOSPLIT, "func(x, y []float64)") 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("LBB12_11")) 993 CMPQ(RDX, Imm(4)) 994 JAE(LabelRef("LBB12_3")) 995 XORL(EAX, EAX) 996 JMP(LabelRef("LBB12_10")) 997 998 Label("LBB12_3") 999 { 1000 MOVQ(RDX, RAX) 1001 ANDQ(I32(-4), RAX) 1002 LEAQ(Mem{Base: RAX}.Offset(-4), RCX) 1003 MOVQ(RCX, R8) 1004 SHRQ(Imm(2), R8) 1005 ADDQ(Imm(1), R8) 1006 TESTQ(RCX, RCX) 1007 JE(LabelRef("LBB12_4")) 1008 MOVQ(R8, R9) 1009 ANDQ(I32(-2), R9) 1010 XORL(ECX, ECX) 1011 } 1012 1013 Label("LBB12_6") 1014 { 1015 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0) 1016 VDIVPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0) 1017 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1) 1018 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 1019 VDIVPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y0) 1020 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1021 ADDQ(Imm(8), RCX) 1022 ADDQ(I32(-2), R9) 1023 JNE(LabelRef("LBB12_6")) 1024 TESTB(Imm(1), R8B) 1025 JE(LabelRef("LBB12_9")) 1026 } 1027 1028 Label("LBB12_8") 1029 { 1030 VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0) 1031 VDIVPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0) 1032 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8)) 1033 } 1034 1035 Label("LBB12_9") 1036 { 1037 CMPQ(RAX, RDX) 1038 JE(LabelRef("LBB12_11")) 1039 } 1040 1041 Label("LBB12_10") 1042 { 1043 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0) 1044 VDIVSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0) 1045 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 1046 ADDQ(Imm(1), RAX) 1047 CMPQ(RDX, RAX) 1048 JNE(LabelRef("LBB12_10")) 1049 } 1050 1051 Label("LBB12_11") 1052 { 1053 VZEROUPPER() 1054 RET() 1055 } 1056 1057 Label("LBB12_4") 1058 { 1059 XORL(ECX, ECX) 1060 TESTB(Imm(1), R8B) 1061 JNE(LabelRef("LBB12_8")) 1062 JMP(LabelRef("LBB12_9")) 1063 } 1064 } 1065 1066 func genDiv_F32() { 1067 1068 TEXT("Div_AVX2_F32", NOSPLIT, "func(x, y []float32)") 1069 Pragma("noescape") 1070 Load(Param("x").Base(), RDI) 1071 Load(Param("y").Base(), RSI) 1072 Load(Param("x").Len(), RDX) 1073 1074 TESTQ(RDX, RDX) 1075 JE(LabelRef("LBB13_7")) 1076 CMPQ(RDX, Imm(32)) 1077 JAE(LabelRef("LBB13_3")) 1078 XORL(EAX, EAX) 1079 JMP(LabelRef("LBB13_6")) 1080 1081 Label("LBB13_3") 1082 { 1083 MOVQ(RDX, RAX) 1084 ANDQ(I32(-32), RAX) 1085 XORL(ECX, ECX) 1086 } 1087 1088 Label("LBB13_4") 1089 { 1090 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4), Y0) 1091 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1) 1092 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2) 1093 VRCPPS(Y0, Y3) 1094 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y4) 1095 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y5) 1096 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y6) 1097 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y7) 1098 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y8) 1099 VMULPS(Y3, Y5, Y9) 1100 VFMSUB213PS(Y5, Y9, Y0) 1101 VFNMADD213PS(Y9, Y3, Y0) 1102 VRCPPS(Y1, Y3) 1103 VMULPS(Y3, Y6, Y5) 1104 VFMSUB213PS(Y6, Y5, Y1) 1105 VRCPPS(Y2, Y6) 1106 VFNMADD213PS(Y5, Y3, Y1) 1107 VMULPS(Y6, Y7, Y3) 1108 VFMSUB213PS(Y7, Y3, Y2) 1109 VFNMADD213PS(Y3, Y6, Y2) 1110 VRCPPS(Y4, Y3) 1111 VMULPS(Y3, Y8, Y5) 1112 VFMSUB213PS(Y8, Y5, Y4) 1113 VFNMADD213PS(Y5, Y3, Y4) 1114 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4)) 1115 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1116 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1117 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1118 ADDQ(Imm(32), RCX) 1119 CMPQ(RAX, RCX) 1120 JNE(LabelRef("LBB13_4")) 1121 CMPQ(RAX, RDX) 1122 JE(LabelRef("LBB13_7")) 1123 } 1124 1125 Label("LBB13_6") 1126 { 1127 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0) 1128 VDIVSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0) 1129 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 1130 ADDQ(Imm(1), RAX) 1131 CMPQ(RDX, RAX) 1132 JNE(LabelRef("LBB13_6")) 1133 } 1134 1135 Label("LBB13_7") 1136 { 1137 VZEROUPPER() 1138 RET() 1139 } 1140 } 1141 1142 func genDivNumber_F64() { 1143 1144 data := GLOBL("dataDivNumberF64", RODATA|NOPTR) 1145 DATA(0, U64(0x3ff0000000000000)) 1146 1147 TEXT("DivNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)") 1148 Pragma("noescape") 1149 Load(Param("x").Base(), RDI) 1150 Load(Param("a"), X0) 1151 Load(Param("x").Len(), RSI) 1152 1153 TESTQ(RSI, RSI) 1154 JE(LabelRef("LBB14_12")) 1155 CMPQ(RSI, Imm(4)) 1156 JAE(LabelRef("LBB14_3")) 1157 XORL(EAX, EAX) 1158 JMP(LabelRef("LBB14_10")) 1159 1160 Label("LBB14_3") 1161 { 1162 MOVQ(RSI, RAX) 1163 ANDQ(I32(-4), RAX) 1164 VBROADCASTSD(X0, Y1) 1165 LEAQ(Mem{Base: RAX}.Offset(-4), RCX) 1166 MOVQ(RCX, R8) 1167 SHRQ(Imm(2), R8) 1168 ADDQ(Imm(1), R8) 1169 TESTQ(RCX, RCX) 1170 JE(LabelRef("LBB14_4")) 1171 MOVQ(R8, RCX) 1172 ANDQ(I32(-2), RCX) 1173 VBROADCASTSD(data.Offset(0), Y2) 1174 VDIVPD(Y1, Y2, Y2) 1175 XORL(EDX, EDX) 1176 } 1177 1178 Label("LBB14_6") 1179 { 1180 VMULPD(Mem{Base: RDI}.Idx(RDX, 8), Y2, Y3) 1181 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RDX, 8)) 1182 VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y2, Y3) 1183 VMOVUPD(Y3, Mem{Base: RDI}.Idx(RDX, 8).Offset(32)) 1184 ADDQ(Imm(8), RDX) 1185 ADDQ(I32(-2), RCX) 1186 JNE(LabelRef("LBB14_6")) 1187 TESTB(Imm(1), R8B) 1188 JE(LabelRef("LBB14_9")) 1189 } 1190 1191 Label("LBB14_8") 1192 { 1193 VMOVUPD(Mem{Base: RDI}.Idx(RDX, 8), Y2) 1194 VDIVPD(Y1, Y2, Y1) 1195 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RDX, 8)) 1196 } 1197 1198 Label("LBB14_9") 1199 { 1200 CMPQ(RAX, RSI) 1201 JE(LabelRef("LBB14_12")) 1202 } 1203 1204 Label("LBB14_10") 1205 { 1206 VMOVSD(data.Offset(0), X1) 1207 VDIVSD(X0, X1, X0) 1208 } 1209 1210 Label("LBB14_11") 1211 { 1212 VMULSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1) 1213 VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8)) 1214 ADDQ(Imm(1), RAX) 1215 CMPQ(RSI, RAX) 1216 JNE(LabelRef("LBB14_11")) 1217 } 1218 1219 Label("LBB14_12") 1220 { 1221 VZEROUPPER() 1222 RET() 1223 } 1224 1225 Label("LBB14_4") 1226 { 1227 XORL(EDX, EDX) 1228 TESTB(Imm(1), R8B) 1229 JNE(LabelRef("LBB14_8")) 1230 JMP(LabelRef("LBB14_9")) 1231 } 1232 } 1233 1234 func genDivNumber_F32() { 1235 1236 data := GLOBL("dataDivNumberF32", RODATA|NOPTR) 1237 DATA(0, U32(0x3f800000)) 1238 1239 TEXT("DivNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)") 1240 Pragma("noescape") 1241 Load(Param("x").Base(), RDI) 1242 Load(Param("a"), X0) 1243 Load(Param("x").Len(), RSI) 1244 1245 TESTQ(RSI, RSI) 1246 JE(LabelRef("LBB15_8")) 1247 CMPQ(RSI, Imm(32)) 1248 JAE(LabelRef("LBB15_3")) 1249 XORL(EAX, EAX) 1250 JMP(LabelRef("LBB15_6")) 1251 1252 Label("LBB15_3") 1253 { 1254 MOVQ(RSI, RAX) 1255 ANDQ(I32(-32), RAX) 1256 VMOVSS(data.Offset(0), X1) 1257 VDIVSS(X0, X1, X1) 1258 VBROADCASTSS(X1, Y1) 1259 XORL(ECX, ECX) 1260 } 1261 1262 Label("LBB15_4") 1263 { 1264 VMULPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2) 1265 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3) 1266 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4) 1267 VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y5) 1268 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4)) 1269 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1270 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1271 VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1272 ADDQ(Imm(32), RCX) 1273 CMPQ(RAX, RCX) 1274 JNE(LabelRef("LBB15_4")) 1275 CMPQ(RAX, RSI) 1276 JE(LabelRef("LBB15_8")) 1277 } 1278 1279 Label("LBB15_6") 1280 { 1281 VMOVSS(data.Offset(0), X1) 1282 VDIVSS(X0, X1, X0) 1283 } 1284 1285 Label("LBB15_7") 1286 { 1287 VMULSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1) 1288 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 1289 ADDQ(Imm(1), RAX) 1290 CMPQ(RSI, RAX) 1291 JNE(LabelRef("LBB15_7")) 1292 } 1293 1294 Label("LBB15_8") 1295 { 1296 VZEROUPPER() 1297 RET() 1298 } 1299 } 1300 1301 func genAbs_F64() { 1302 1303 data := GLOBL("dataAbsF64", RODATA|NOPTR) 1304 DATA(0, U64(0x7fffffffffffffff)) 1305 DATA(8, U64(0x7fffffffffffffff)) 1306 DATA(16, U64(0x7fffffffffffffff)) 1307 1308 TEXT("Abs_AVX2_F64", NOSPLIT, "func(x []float64)") 1309 Pragma("noescape") 1310 Load(Param("x").Base(), RDI) 1311 Load(Param("x").Len(), RSI) 1312 1313 TESTQ(RSI, RSI) 1314 JE(LabelRef("LBB16_8")) 1315 CMPQ(RSI, Imm(16)) 1316 JAE(LabelRef("LBB16_3")) 1317 XORL(EAX, EAX) 1318 JMP(LabelRef("LBB16_6")) 1319 1320 Label("LBB16_3") 1321 { 1322 MOVQ(RSI, RAX) 1323 ANDQ(I32(-16), RAX) 1324 XORL(ECX, ECX) 1325 VBROADCASTSD(data.Offset(0), Y0) 1326 } 1327 1328 Label("LBB16_4") 1329 { 1330 VANDPS(Mem{Base: RDI}.Idx(RCX, 8), Y0, Y1) 1331 VANDPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y0, Y2) 1332 VANDPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y0, Y3) 1333 VANDPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y0, Y4) 1334 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8)) 1335 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1336 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1337 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1338 ADDQ(Imm(16), RCX) 1339 CMPQ(RAX, RCX) 1340 JNE(LabelRef("LBB16_4")) 1341 CMPQ(RAX, RSI) 1342 JE(LabelRef("LBB16_8")) 1343 } 1344 1345 Label("LBB16_6") 1346 { 1347 VMOVUPS(data.Offset(8), X0) 1348 } 1349 1350 Label("LBB16_7") 1351 { 1352 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X1) 1353 VANDPS(X0, X1, X1) 1354 VMOVLPS(X1, Mem{Base: RDI}.Idx(RAX, 8)) 1355 ADDQ(Imm(1), RAX) 1356 CMPQ(RSI, RAX) 1357 JNE(LabelRef("LBB16_7")) 1358 } 1359 1360 Label("LBB16_8") 1361 { 1362 VZEROUPPER() 1363 RET() 1364 } 1365 } 1366 1367 func genAbs_F32() { 1368 1369 data := GLOBL("dataAbsF32", RODATA|NOPTR) 1370 DATA(0, U32(0x7fffffff)) 1371 1372 TEXT("Abs_AVX2_F32", NOSPLIT, "func(x []float32)") 1373 Pragma("noescape") 1374 Load(Param("x").Base(), RDI) 1375 Load(Param("x").Len(), RSI) 1376 1377 TESTQ(RSI, RSI) 1378 JE(LabelRef("LBB17_8")) 1379 CMPQ(RSI, Imm(32)) 1380 JAE(LabelRef("LBB17_3")) 1381 XORL(EAX, EAX) 1382 JMP(LabelRef("LBB17_6")) 1383 1384 Label("LBB17_3") 1385 { 1386 MOVQ(RSI, RAX) 1387 ANDQ(I32(-32), RAX) 1388 XORL(ECX, ECX) 1389 VBROADCASTSS(data.Offset(0), Y0) 1390 } 1391 1392 Label("LBB17_4") 1393 { 1394 VANDPS(Mem{Base: RDI}.Idx(RCX, 4), Y0, Y1) 1395 VANDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y0, Y2) 1396 VANDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y0, Y3) 1397 VANDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y0, Y4) 1398 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 1399 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1400 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1401 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1402 ADDQ(Imm(32), RCX) 1403 CMPQ(RAX, RCX) 1404 JNE(LabelRef("LBB17_4")) 1405 CMPQ(RAX, RSI) 1406 JE(LabelRef("LBB17_8")) 1407 } 1408 1409 Label("LBB17_6") 1410 { 1411 VBROADCASTSS(data.Offset(0), X0) 1412 } 1413 1414 Label("LBB17_7") 1415 { 1416 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X1) 1417 VANDPS(X0, X1, X1) 1418 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 1419 ADDQ(Imm(1), RAX) 1420 CMPQ(RSI, RAX) 1421 JNE(LabelRef("LBB17_7")) 1422 } 1423 1424 Label("LBB17_8") 1425 { 1426 VZEROUPPER() 1427 RET() 1428 } 1429 } 1430 1431 func genNeg_F64() { 1432 1433 data := GLOBL("dataNegF64", RODATA|NOPTR) 1434 DATA(0, U64(0x8000000000000000)) 1435 DATA(8, U64(0x8000000000000000)) 1436 DATA(16, U64(0x8000000000000000)) 1437 1438 TEXT("Neg_AVX2_F64", NOSPLIT, "func(x []float64)") 1439 Pragma("noescape") 1440 Load(Param("x").Base(), RDI) 1441 Load(Param("x").Len(), RSI) 1442 1443 TESTQ(RSI, RSI) 1444 JE(LabelRef("LBB18_12")) 1445 CMPQ(RSI, Imm(16)) 1446 JAE(LabelRef("LBB18_3")) 1447 XORL(EAX, EAX) 1448 JMP(LabelRef("LBB18_10")) 1449 1450 Label("LBB18_3") 1451 { 1452 MOVQ(RSI, RAX) 1453 ANDQ(I32(-16), RAX) 1454 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 1455 MOVQ(RCX, R8) 1456 SHRQ(Imm(4), R8) 1457 ADDQ(Imm(1), R8) 1458 TESTQ(RCX, RCX) 1459 JE(LabelRef("LBB18_4")) 1460 MOVQ(R8, RDX) 1461 ANDQ(I32(-2), RDX) 1462 XORL(ECX, ECX) 1463 VBROADCASTSD(data.Offset(0), Y0) 1464 } 1465 1466 Label("LBB18_6") 1467 { 1468 VXORPS(Mem{Base: RDI}.Idx(RCX, 8), Y0, Y1) 1469 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y0, Y2) 1470 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y0, Y3) 1471 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y0, Y4) 1472 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8)) 1473 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1474 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1475 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1476 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y0, Y1) 1477 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y0, Y2) 1478 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y0, Y3) 1479 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y0, Y4) 1480 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(128)) 1481 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(160)) 1482 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(192)) 1483 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(224)) 1484 ADDQ(Imm(32), RCX) 1485 ADDQ(I32(-2), RDX) 1486 JNE(LabelRef("LBB18_6")) 1487 TESTB(Imm(1), R8B) 1488 JE(LabelRef("LBB18_9")) 1489 } 1490 1491 Label("LBB18_8") 1492 { 1493 VBROADCASTSD(data.Offset(0), Y0) 1494 VXORPS(Mem{Base: RDI}.Idx(RCX, 8), Y0, Y1) 1495 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y0, Y2) 1496 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y0, Y3) 1497 VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y0, Y0) 1498 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8)) 1499 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32)) 1500 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64)) 1501 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(96)) 1502 } 1503 1504 Label("LBB18_9") 1505 { 1506 CMPQ(RAX, RSI) 1507 JE(LabelRef("LBB18_12")) 1508 } 1509 1510 Label("LBB18_10") 1511 { 1512 VMOVUPS(data.Offset(8), X0) 1513 } 1514 1515 Label("LBB18_11") 1516 { 1517 VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X1) 1518 VXORPS(X0, X1, X1) 1519 VMOVLPS(X1, Mem{Base: RDI}.Idx(RAX, 8)) 1520 ADDQ(Imm(1), RAX) 1521 CMPQ(RSI, RAX) 1522 JNE(LabelRef("LBB18_11")) 1523 } 1524 1525 Label("LBB18_12") 1526 { 1527 VZEROUPPER() 1528 RET() 1529 } 1530 1531 Label("LBB18_4") 1532 { 1533 XORL(ECX, ECX) 1534 TESTB(Imm(1), R8B) 1535 JNE(LabelRef("LBB18_8")) 1536 JMP(LabelRef("LBB18_9")) 1537 } 1538 } 1539 1540 func genNeg_F32() { 1541 1542 data := GLOBL("dataNegF32", RODATA|NOPTR) 1543 DATA(0, U32(0x80000000)) 1544 1545 TEXT("Neg_AVX2_F32", NOSPLIT, "func(x []float32)") 1546 Pragma("noescape") 1547 Load(Param("x").Base(), RDI) 1548 Load(Param("x").Len(), RSI) 1549 1550 TESTQ(RSI, RSI) 1551 JE(LabelRef("LBB19_12")) 1552 CMPQ(RSI, Imm(32)) 1553 JAE(LabelRef("LBB19_3")) 1554 XORL(EAX, EAX) 1555 JMP(LabelRef("LBB19_10")) 1556 1557 Label("LBB19_3") 1558 { 1559 MOVQ(RSI, RAX) 1560 ANDQ(I32(-32), RAX) 1561 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 1562 MOVQ(RCX, R8) 1563 SHRQ(Imm(5), R8) 1564 ADDQ(Imm(1), R8) 1565 TESTQ(RCX, RCX) 1566 JE(LabelRef("LBB19_4")) 1567 MOVQ(R8, RDX) 1568 ANDQ(I32(-2), RDX) 1569 XORL(ECX, ECX) 1570 VBROADCASTSS(data.Offset(0), Y0) 1571 } 1572 1573 Label("LBB19_6") 1574 { 1575 VXORPS(Mem{Base: RDI}.Idx(RCX, 4), Y0, Y1) 1576 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y0, Y2) 1577 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y0, Y3) 1578 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y0, Y4) 1579 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 1580 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1581 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1582 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1583 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y0, Y1) 1584 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y0, Y2) 1585 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y0, Y3) 1586 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y0, Y4) 1587 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(128)) 1588 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(160)) 1589 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(192)) 1590 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(224)) 1591 ADDQ(Imm(64), RCX) 1592 ADDQ(I32(-2), RDX) 1593 JNE(LabelRef("LBB19_6")) 1594 TESTB(Imm(1), R8B) 1595 JE(LabelRef("LBB19_9")) 1596 } 1597 1598 Label("LBB19_8") 1599 { 1600 VBROADCASTSS(data.Offset(0), Y0) 1601 VXORPS(Mem{Base: RDI}.Idx(RCX, 4), Y0, Y1) 1602 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y0, Y2) 1603 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y0, Y3) 1604 VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y0, Y0) 1605 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 1606 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1607 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1608 VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1609 } 1610 1611 Label("LBB19_9") 1612 { 1613 CMPQ(RAX, RSI) 1614 JE(LabelRef("LBB19_12")) 1615 } 1616 1617 Label("LBB19_10") 1618 { 1619 VBROADCASTSS(data.Offset(0), X0) 1620 } 1621 1622 Label("LBB19_11") 1623 { 1624 VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X1) 1625 VXORPS(X0, X1, X1) 1626 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 1627 ADDQ(Imm(1), RAX) 1628 CMPQ(RSI, RAX) 1629 JNE(LabelRef("LBB19_11")) 1630 } 1631 1632 Label("LBB19_12") 1633 { 1634 VZEROUPPER() 1635 RET() 1636 } 1637 1638 Label("LBB19_4") 1639 { 1640 XORL(ECX, ECX) 1641 TESTB(Imm(1), R8B) 1642 JNE(LabelRef("LBB19_8")) 1643 JMP(LabelRef("LBB19_9")) 1644 } 1645 } 1646 1647 func genInv_F64() { 1648 1649 data := GLOBL("dataInvF64", RODATA|NOPTR) 1650 DATA(0, U64(0x3ff0000000000000)) 1651 1652 TEXT("Inv_AVX2_F64", NOSPLIT, "func(x []float64)") 1653 Pragma("noescape") 1654 Load(Param("x").Base(), RDI) 1655 Load(Param("x").Len(), RSI) 1656 1657 TESTQ(RSI, RSI) 1658 JE(LabelRef("LBB20_12")) 1659 CMPQ(RSI, Imm(4)) 1660 JAE(LabelRef("LBB20_3")) 1661 XORL(EAX, EAX) 1662 JMP(LabelRef("LBB20_10")) 1663 1664 Label("LBB20_3") 1665 { 1666 MOVQ(RSI, RAX) 1667 ANDQ(I32(-4), RAX) 1668 LEAQ(Mem{Base: RAX}.Offset(-4), RCX) 1669 MOVQ(RCX, R8) 1670 SHRQ(Imm(2), R8) 1671 ADDQ(Imm(1), R8) 1672 TESTQ(RCX, RCX) 1673 JE(LabelRef("LBB20_4")) 1674 MOVQ(R8, RCX) 1675 ANDQ(I32(-2), RCX) 1676 XORL(EDX, EDX) 1677 VBROADCASTSD(data.Offset(0), Y0) 1678 } 1679 1680 Label("LBB20_6") 1681 { 1682 VDIVPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y1) 1683 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RDX, 8)) 1684 VDIVPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y0, Y1) 1685 VMOVUPD(Y1, Mem{Base: RDI}.Idx(RDX, 8).Offset(32)) 1686 ADDQ(Imm(8), RDX) 1687 ADDQ(I32(-2), RCX) 1688 JNE(LabelRef("LBB20_6")) 1689 TESTB(Imm(1), R8B) 1690 JE(LabelRef("LBB20_9")) 1691 } 1692 1693 Label("LBB20_8") 1694 { 1695 VBROADCASTSD(data.Offset(0), Y0) 1696 VDIVPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 1697 VMOVUPD(Y0, Mem{Base: RDI}.Idx(RDX, 8)) 1698 } 1699 1700 Label("LBB20_9") 1701 { 1702 CMPQ(RAX, RSI) 1703 JE(LabelRef("LBB20_12")) 1704 } 1705 1706 Label("LBB20_10") 1707 { 1708 VMOVSD(data.Offset(0), X0) 1709 } 1710 1711 Label("LBB20_11") 1712 { 1713 VDIVSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1) 1714 VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8)) 1715 ADDQ(Imm(1), RAX) 1716 CMPQ(RSI, RAX) 1717 JNE(LabelRef("LBB20_11")) 1718 } 1719 1720 Label("LBB20_12") 1721 { 1722 VZEROUPPER() 1723 RET() 1724 } 1725 1726 Label("LBB20_4") 1727 { 1728 XORL(EDX, EDX) 1729 TESTB(Imm(1), R8B) 1730 JNE(LabelRef("LBB20_8")) 1731 JMP(LabelRef("LBB20_9")) 1732 } 1733 } 1734 1735 func genInv_F32() { 1736 1737 data := GLOBL("dataInvF32", RODATA|NOPTR) 1738 DATA(0, U32(0x3f800000)) 1739 1740 TEXT("Inv_AVX2_F32", NOSPLIT, "func(x []float32)") 1741 Pragma("noescape") 1742 Load(Param("x").Base(), RDI) 1743 Load(Param("x").Len(), RSI) 1744 1745 TESTQ(RSI, RSI) 1746 JE(LabelRef("LBB21_8")) 1747 CMPQ(RSI, Imm(32)) 1748 JAE(LabelRef("LBB21_3")) 1749 XORL(EAX, EAX) 1750 JMP(LabelRef("LBB21_6")) 1751 1752 Label("LBB21_3") 1753 { 1754 MOVQ(RSI, RAX) 1755 ANDQ(I32(-32), RAX) 1756 XORL(ECX, ECX) 1757 VBROADCASTSS(data.Offset(0), Y0) 1758 } 1759 1760 Label("LBB21_4") 1761 { 1762 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y1) 1763 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y2) 1764 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y3) 1765 VRCPPS(Y1, Y4) 1766 VFMSUB213PS(Y0, Y4, Y1) 1767 VRCPPS(Y2, Y5) 1768 VFNMADD132PS(Y4, Y4, Y1) 1769 VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y4) 1770 VFMSUB213PS(Y0, Y5, Y2) 1771 VFNMADD132PS(Y5, Y5, Y2) 1772 VRCPPS(Y3, Y5) 1773 VFMSUB213PS(Y0, Y5, Y3) 1774 VFNMADD132PS(Y5, Y5, Y3) 1775 VRCPPS(Y4, Y5) 1776 VFMSUB213PS(Y0, Y5, Y4) 1777 VFNMADD132PS(Y5, Y5, Y4) 1778 VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4)) 1779 VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32)) 1780 VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64)) 1781 VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96)) 1782 ADDQ(Imm(32), RCX) 1783 CMPQ(RAX, RCX) 1784 JNE(LabelRef("LBB21_4")) 1785 CMPQ(RAX, RSI) 1786 JE(LabelRef("LBB21_8")) 1787 } 1788 1789 Label("LBB21_6") 1790 { 1791 VMOVSS(data.Offset(0), X0) 1792 } 1793 1794 Label("LBB21_7") 1795 { 1796 VDIVSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1) 1797 VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4)) 1798 ADDQ(Imm(1), RAX) 1799 CMPQ(RSI, RAX) 1800 JNE(LabelRef("LBB21_7")) 1801 } 1802 1803 Label("LBB21_8") 1804 { 1805 VZEROUPPER() 1806 RET() 1807 } 1808 }