gitee.com/quant1x/gox@v1.7.6/num/asm/min.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 genMin_F64() { 10 11 data := GLOBL("dataMinF64", RODATA|NOPTR) 12 DATA(0, U64(0x7fefffffffffffff)) 13 14 TEXT("Min_AVX2_F64", NOSPLIT, "func(x []float64) float64") 15 Pragma("noescape") 16 Load(Param("x").Base(), RDI) 17 Load(Param("x").Len(), RSI) 18 19 TESTQ(RSI, RSI) 20 JE(LabelRef("LBB0_1")) 21 CMPQ(RSI, Imm(16)) 22 JAE(LabelRef("LBB0_4")) 23 VMOVSD(data, X0) 24 XORL(EAX, EAX) 25 JMP(LabelRef("LBB0_11")) 26 27 Label("LBB0_1") 28 { 29 VMOVSD(data, X0) 30 Store(X0, ReturnIndex(0)) 31 RET() 32 } 33 34 Label("LBB0_4") 35 { 36 MOVQ(RSI, RAX) 37 ANDQ(I32(-16), RAX) 38 LEAQ(Mem{Base: RAX}.Offset(-16), RCX) 39 MOVQ(RCX, R8) 40 SHRQ(Imm(4), R8) 41 ADDQ(Imm(1), R8) 42 TESTQ(RCX, RCX) 43 JE(LabelRef("LBB0_5")) 44 MOVQ(R8, RCX) 45 ANDQ(I32(-2), RCX) 46 VBROADCASTSD(data, Y0) 47 XORL(EDX, EDX) 48 VMOVAPD(Y0, Y1) 49 VMOVAPD(Y0, Y2) 50 VMOVAPD(Y0, Y3) 51 } 52 53 Label("LBB0_7") 54 { 55 VMINPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 56 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1) 57 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2) 58 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3) 59 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(128), Y0, Y0) 60 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(160), Y1, Y1) 61 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(192), Y2, Y2) 62 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(224), Y3, Y3) 63 ADDQ(Imm(32), RDX) 64 ADDQ(I32(-2), RCX) 65 JNE(LabelRef("LBB0_7")) 66 TESTB(Imm(1), R8B) 67 JE(LabelRef("LBB0_10")) 68 } 69 70 Label("LBB0_9") 71 { 72 VMINPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0) 73 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1) 74 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2) 75 VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3) 76 } 77 78 Label("LBB0_10") 79 { 80 VMINPD(Y3, Y0, Y0) 81 VMINPD(Y2, Y1, Y1) 82 VMINPD(Y0, Y1, Y0) 83 VEXTRACTF128(Imm(1), Y0, X1) 84 VMINPD(X1, X0, X0) 85 VPERMILPD(Imm(1), X0, X1) 86 VMINSD(X1, X0, X0) 87 CMPQ(RAX, RSI) 88 JE(LabelRef("LBB0_12")) 89 } 90 91 Label("LBB0_11") 92 { 93 VMINSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X0) 94 ADDQ(Imm(1), RAX) 95 CMPQ(RSI, RAX) 96 JNE(LabelRef("LBB0_11")) 97 } 98 99 Label("LBB0_12") 100 { 101 VZEROUPPER() 102 Store(X0, ReturnIndex(0)) 103 RET() 104 } 105 106 Label("LBB0_5") 107 { 108 VBROADCASTSD(data, Y0) 109 XORL(EDX, EDX) 110 VMOVAPD(Y0, Y1) 111 VMOVAPD(Y0, Y2) 112 VMOVAPD(Y0, Y3) 113 TESTB(Imm(1), R8B) 114 JNE(LabelRef("LBB0_9")) 115 JMP(LabelRef("LBB0_10")) 116 } 117 } 118 119 func genMin_F32() { 120 121 data := GLOBL("dataMinF32", RODATA|NOPTR) 122 DATA(0, U32(0x7f7fffff)) 123 124 TEXT("Min_AVX2_F32", NOSPLIT, "func(x []float32) float32") 125 Pragma("noescape") 126 Load(Param("x").Base(), RDI) 127 Load(Param("x").Len(), RSI) 128 129 TESTQ(RSI, RSI) 130 JE(LabelRef("LBB1_1")) 131 CMPQ(RSI, Imm(32)) 132 JAE(LabelRef("LBB1_4")) 133 VMOVSS(data, X0) 134 XORL(EAX, EAX) 135 JMP(LabelRef("LBB1_11")) 136 137 Label("LBB1_1") 138 { 139 VMOVSS(data, X0) 140 Store(X0, ReturnIndex(0)) 141 RET() 142 } 143 144 Label("LBB1_4") 145 { 146 MOVQ(RSI, RAX) 147 ANDQ(I32(-32), RAX) 148 LEAQ(Mem{Base: RAX}.Offset(-32), RCX) 149 MOVQ(RCX, R8) 150 SHRQ(Imm(5), R8) 151 ADDQ(Imm(1), R8) 152 TESTQ(RCX, RCX) 153 JE(LabelRef("LBB1_5")) 154 MOVQ(R8, RCX) 155 ANDQ(I32(-2), RCX) 156 VBROADCASTSS(data, Y0) 157 XORL(EDX, EDX) 158 VMOVAPS(Y0, Y1) 159 VMOVAPS(Y0, Y2) 160 VMOVAPS(Y0, Y3) 161 } 162 163 Label("LBB1_7") 164 { 165 VMINPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0) 166 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1) 167 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2) 168 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3) 169 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(128), Y0, Y0) 170 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(160), Y1, Y1) 171 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(192), Y2, Y2) 172 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(224), Y3, Y3) 173 ADDQ(Imm(64), RDX) 174 ADDQ(I32(-2), RCX) 175 JNE(LabelRef("LBB1_7")) 176 TESTB(Imm(1), R8B) 177 JE(LabelRef("LBB1_10")) 178 } 179 180 Label("LBB1_9") 181 { 182 VMINPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0) 183 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1) 184 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2) 185 VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3) 186 } 187 188 Label("LBB1_10") 189 { 190 VMINPS(Y3, Y0, Y0) 191 VMINPS(Y2, Y1, Y1) 192 VMINPS(Y0, Y1, Y0) 193 VEXTRACTF128(Imm(1), Y0, X1) 194 VMINPS(X1, X0, X0) 195 VPERMILPD(Imm(1), X0, X1) 196 VMINPS(X1, X0, X0) 197 VMOVSHDUP(X0, X1) 198 VMINSS(X1, X0, X0) 199 CMPQ(RAX, RSI) 200 JE(LabelRef("LBB1_12")) 201 } 202 203 Label("LBB1_11") 204 { 205 VMINSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X0) 206 ADDQ(Imm(1), RAX) 207 CMPQ(RSI, RAX) 208 JNE(LabelRef("LBB1_11")) 209 } 210 211 Label("LBB1_12") 212 { 213 VZEROUPPER() 214 Store(X0, ReturnIndex(0)) 215 RET() 216 } 217 218 Label("LBB1_5") 219 { 220 VBROADCASTSS(data, Y0) 221 XORL(EDX, EDX) 222 VMOVAPS(Y0, Y1) 223 VMOVAPS(Y0, Y2) 224 VMOVAPS(Y0, Y3) 225 TESTB(Imm(1), R8B) 226 JNE(LabelRef("LBB1_9")) 227 JMP(LabelRef("LBB1_10")) 228 } 229 } 230 231 func genMinimum_F64() { 232 233 TEXT("Minimum_AVX2_F64", NOSPLIT, "func(x, y []float64)") 234 Pragma("noescape") 235 Load(Param("x").Base(), RDI) 236 Load(Param("y").Base(), RSI) 237 Load(Param("x").Len(), RDX) 238 239 TESTQ(RDX, RDX) 240 JE(LabelRef("LBB2_9")) 241 CMPQ(RDX, Imm(16)) 242 JAE(LabelRef("LBB2_3")) 243 XORL(EAX, EAX) 244 JMP(LabelRef("LBB2_6")) 245 246 Label("LBB2_3") 247 { 248 MOVQ(RDX, RAX) 249 ANDQ(I32(-16), RAX) 250 LEAQ(Mem{Base: RDI}.Offset(96), R8) 251 XORL(ECX, ECX) 252 } 253 254 Label("LBB2_4") 255 { 256 VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8), Y0) 257 VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1) 258 VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2) 259 VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3) 260 VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8).Offset(-96), Y0, Y4) 261 VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8).Offset(-64), Y1, Y5) 262 VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8).Offset(-32), Y2, Y6) 263 VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8), Y3, Y7) 264 VMASKMOVPD(Y0, Y4, Mem{Base: R8}.Idx(RCX, 8).Offset(-96)) 265 VMASKMOVPD(Y1, Y5, Mem{Base: R8}.Idx(RCX, 8).Offset(-64)) 266 VMASKMOVPD(Y2, Y6, Mem{Base: R8}.Idx(RCX, 8).Offset(-32)) 267 VMASKMOVPD(Y3, Y7, Mem{Base: R8}.Idx(RCX, 8)) 268 ADDQ(Imm(16), RCX) 269 CMPQ(RAX, RCX) 270 JNE(LabelRef("LBB2_4")) 271 CMPQ(RAX, RDX) 272 JNE(LabelRef("LBB2_6")) 273 } 274 275 Label("LBB2_9") 276 { 277 VZEROUPPER() 278 RET() 279 } 280 281 Label("LBB2_8") 282 { 283 ADDQ(Imm(1), RAX) 284 CMPQ(RDX, RAX) 285 JE(LabelRef("LBB2_9")) 286 } 287 288 Label("LBB2_6") 289 { 290 VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0) 291 VUCOMISD(Mem{Base: RDI}.Idx(RAX, 8), X0) 292 JAE(LabelRef("LBB2_8")) 293 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 294 JMP(LabelRef("LBB2_8")) 295 } 296 } 297 298 func genMinimum_F32() { 299 300 TEXT("Minimum_AVX2_F32", NOSPLIT, "func(x, y []float32)") 301 Pragma("noescape") 302 Load(Param("x").Base(), RDI) 303 Load(Param("y").Base(), RSI) 304 Load(Param("x").Len(), RDX) 305 306 TESTQ(RDX, RDX) 307 JE(LabelRef("LBB3_9")) 308 CMPQ(RDX, Imm(32)) 309 JAE(LabelRef("LBB3_3")) 310 XORL(EAX, EAX) 311 JMP(LabelRef("LBB3_6")) 312 313 Label("LBB3_3") 314 { 315 MOVQ(RDX, RAX) 316 ANDQ(I32(-32), RAX) 317 LEAQ(Mem{Base: RDI}.Offset(96), R8) 318 XORL(ECX, ECX) 319 } 320 321 Label("LBB3_4") 322 { 323 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4), Y0) 324 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1) 325 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2) 326 VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3) 327 VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4).Offset(-96), Y0, Y4) 328 VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4).Offset(-64), Y1, Y5) 329 VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4).Offset(-32), Y2, Y6) 330 VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4), Y3, Y7) 331 VMASKMOVPS(Y0, Y4, Mem{Base: R8}.Idx(RCX, 4).Offset(-96)) 332 VMASKMOVPS(Y1, Y5, Mem{Base: R8}.Idx(RCX, 4).Offset(-64)) 333 VMASKMOVPS(Y2, Y6, Mem{Base: R8}.Idx(RCX, 4).Offset(-32)) 334 VMASKMOVPS(Y3, Y7, Mem{Base: R8}.Idx(RCX, 4)) 335 ADDQ(Imm(32), RCX) 336 CMPQ(RAX, RCX) 337 JNE(LabelRef("LBB3_4")) 338 CMPQ(RAX, RDX) 339 JNE(LabelRef("LBB3_6")) 340 } 341 342 Label("LBB3_9") 343 { 344 VZEROUPPER() 345 RET() 346 } 347 348 Label("LBB3_8") 349 { 350 ADDQ(Imm(1), RAX) 351 CMPQ(RDX, RAX) 352 JE(LabelRef("LBB3_9")) 353 } 354 355 Label("LBB3_6") 356 { 357 VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0) 358 VUCOMISS(Mem{Base: RDI}.Idx(RAX, 4), X0) 359 JAE(LabelRef("LBB3_8")) 360 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 361 JMP(LabelRef("LBB3_8")) 362 } 363 } 364 365 func genMinimumNumber_F64() { 366 367 TEXT("MinimumNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)") 368 Pragma("noescape") 369 Load(Param("x").Base(), RDI) 370 Load(Param("a"), X0) 371 Load(Param("x").Len(), RSI) 372 373 TESTQ(RSI, RSI) 374 JE(LabelRef("LBB4_9")) 375 CMPQ(RSI, Imm(16)) 376 JAE(LabelRef("LBB4_3")) 377 XORL(EAX, EAX) 378 JMP(LabelRef("LBB4_6")) 379 380 Label("LBB4_3") 381 { 382 MOVQ(RSI, RAX) 383 ANDQ(I32(-16), RAX) 384 VBROADCASTSD(X0, Y1) 385 LEAQ(Mem{Base: RDI}.Offset(96), RCX) 386 XORL(EDX, EDX) 387 } 388 389 Label("LBB4_4") 390 { 391 VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8).Offset(-96), Y1, Y2) 392 VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8).Offset(-64), Y1, Y3) 393 VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8).Offset(-32), Y1, Y4) 394 VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8), Y1, Y5) 395 VMASKMOVPD(Y1, Y2, Mem{Base: RCX}.Idx(RDX, 8).Offset(-96)) 396 VMASKMOVPD(Y1, Y3, Mem{Base: RCX}.Idx(RDX, 8).Offset(-64)) 397 VMASKMOVPD(Y1, Y4, Mem{Base: RCX}.Idx(RDX, 8).Offset(-32)) 398 VMASKMOVPD(Y1, Y5, Mem{Base: RCX}.Idx(RDX, 8)) 399 ADDQ(Imm(16), RDX) 400 CMPQ(RAX, RDX) 401 JNE(LabelRef("LBB4_4")) 402 CMPQ(RAX, RSI) 403 JNE(LabelRef("LBB4_6")) 404 } 405 406 Label("LBB4_9") 407 { 408 VZEROUPPER() 409 RET() 410 } 411 412 Label("LBB4_8") 413 { 414 ADDQ(Imm(1), RAX) 415 CMPQ(RSI, RAX) 416 JE(LabelRef("LBB4_9")) 417 } 418 419 Label("LBB4_6") 420 { 421 VUCOMISD(Mem{Base: RDI}.Idx(RAX, 8), X0) 422 JAE(LabelRef("LBB4_8")) 423 VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8)) 424 JMP(LabelRef("LBB4_8")) 425 } 426 } 427 428 func genMinimumNumber_F32() { 429 430 TEXT("MinimumNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)") 431 Pragma("noescape") 432 Load(Param("x").Base(), RDI) 433 Load(Param("a"), X0) 434 Load(Param("x").Len(), RSI) 435 436 TESTQ(RSI, RSI) 437 JE(LabelRef("LBB5_9")) 438 CMPQ(RSI, Imm(32)) 439 JAE(LabelRef("LBB5_3")) 440 XORL(EAX, EAX) 441 JMP(LabelRef("LBB5_6")) 442 443 Label("LBB5_3") 444 { 445 MOVQ(RSI, RAX) 446 ANDQ(I32(-32), RAX) 447 VBROADCASTSS(X0, Y1) 448 LEAQ(Mem{Base: RDI}.Offset(96), RCX) 449 XORL(EDX, EDX) 450 } 451 452 Label("LBB5_4") 453 { 454 VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4).Offset(-96), Y1, Y2) 455 VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4).Offset(-64), Y1, Y3) 456 VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4).Offset(-32), Y1, Y4) 457 VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4), Y1, Y5) 458 VMASKMOVPS(Y1, Y2, Mem{Base: RCX}.Idx(RDX, 4).Offset(-96)) 459 VMASKMOVPS(Y1, Y3, Mem{Base: RCX}.Idx(RDX, 4).Offset(-64)) 460 VMASKMOVPS(Y1, Y4, Mem{Base: RCX}.Idx(RDX, 4).Offset(-32)) 461 VMASKMOVPS(Y1, Y5, Mem{Base: RCX}.Idx(RDX, 4)) 462 ADDQ(Imm(32), RDX) 463 CMPQ(RAX, RDX) 464 JNE(LabelRef("LBB5_4")) 465 CMPQ(RAX, RSI) 466 JNE(LabelRef("LBB5_6")) 467 } 468 469 Label("LBB5_9") 470 { 471 VZEROUPPER() 472 RET() 473 } 474 475 Label("LBB5_8") 476 { 477 ADDQ(Imm(1), RAX) 478 CMPQ(RSI, RAX) 479 JE(LabelRef("LBB5_9")) 480 } 481 482 Label("LBB5_6") 483 { 484 VUCOMISS(Mem{Base: RDI}.Idx(RAX, 4), X0) 485 JAE(LabelRef("LBB5_8")) 486 VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4)) 487 JMP(LabelRef("LBB5_8")) 488 } 489 }