github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/cmd/compile/internal/ssa/rewrite386.go (about) 1 // Code generated from gen/386.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 9 var _ = math.MinInt8 // in case not otherwise used 10 var _ = obj.ANOP // in case not otherwise used 11 func rewriteValue386(v *Value) bool { 12 switch v.Op { 13 case Op386ADCL: 14 return rewriteValue386_Op386ADCL(v) 15 case Op386ADDL: 16 return rewriteValue386_Op386ADDL(v) 17 case Op386ADDLcarry: 18 return rewriteValue386_Op386ADDLcarry(v) 19 case Op386ADDLconst: 20 return rewriteValue386_Op386ADDLconst(v) 21 case Op386ANDL: 22 return rewriteValue386_Op386ANDL(v) 23 case Op386ANDLconst: 24 return rewriteValue386_Op386ANDLconst(v) 25 case Op386CMPB: 26 return rewriteValue386_Op386CMPB(v) 27 case Op386CMPBconst: 28 return rewriteValue386_Op386CMPBconst(v) 29 case Op386CMPL: 30 return rewriteValue386_Op386CMPL(v) 31 case Op386CMPLconst: 32 return rewriteValue386_Op386CMPLconst(v) 33 case Op386CMPW: 34 return rewriteValue386_Op386CMPW(v) 35 case Op386CMPWconst: 36 return rewriteValue386_Op386CMPWconst(v) 37 case Op386LEAL: 38 return rewriteValue386_Op386LEAL(v) 39 case Op386LEAL1: 40 return rewriteValue386_Op386LEAL1(v) 41 case Op386LEAL2: 42 return rewriteValue386_Op386LEAL2(v) 43 case Op386LEAL4: 44 return rewriteValue386_Op386LEAL4(v) 45 case Op386LEAL8: 46 return rewriteValue386_Op386LEAL8(v) 47 case Op386MOVBLSX: 48 return rewriteValue386_Op386MOVBLSX(v) 49 case Op386MOVBLSXload: 50 return rewriteValue386_Op386MOVBLSXload(v) 51 case Op386MOVBLZX: 52 return rewriteValue386_Op386MOVBLZX(v) 53 case Op386MOVBload: 54 return rewriteValue386_Op386MOVBload(v) 55 case Op386MOVBloadidx1: 56 return rewriteValue386_Op386MOVBloadidx1(v) 57 case Op386MOVBstore: 58 return rewriteValue386_Op386MOVBstore(v) 59 case Op386MOVBstoreconst: 60 return rewriteValue386_Op386MOVBstoreconst(v) 61 case Op386MOVBstoreconstidx1: 62 return rewriteValue386_Op386MOVBstoreconstidx1(v) 63 case Op386MOVBstoreidx1: 64 return rewriteValue386_Op386MOVBstoreidx1(v) 65 case Op386MOVLload: 66 return rewriteValue386_Op386MOVLload(v) 67 case Op386MOVLloadidx1: 68 return rewriteValue386_Op386MOVLloadidx1(v) 69 case Op386MOVLloadidx4: 70 return rewriteValue386_Op386MOVLloadidx4(v) 71 case Op386MOVLstore: 72 return rewriteValue386_Op386MOVLstore(v) 73 case Op386MOVLstoreconst: 74 return rewriteValue386_Op386MOVLstoreconst(v) 75 case Op386MOVLstoreconstidx1: 76 return rewriteValue386_Op386MOVLstoreconstidx1(v) 77 case Op386MOVLstoreconstidx4: 78 return rewriteValue386_Op386MOVLstoreconstidx4(v) 79 case Op386MOVLstoreidx1: 80 return rewriteValue386_Op386MOVLstoreidx1(v) 81 case Op386MOVLstoreidx4: 82 return rewriteValue386_Op386MOVLstoreidx4(v) 83 case Op386MOVSDconst: 84 return rewriteValue386_Op386MOVSDconst(v) 85 case Op386MOVSDload: 86 return rewriteValue386_Op386MOVSDload(v) 87 case Op386MOVSDloadidx1: 88 return rewriteValue386_Op386MOVSDloadidx1(v) 89 case Op386MOVSDloadidx8: 90 return rewriteValue386_Op386MOVSDloadidx8(v) 91 case Op386MOVSDstore: 92 return rewriteValue386_Op386MOVSDstore(v) 93 case Op386MOVSDstoreidx1: 94 return rewriteValue386_Op386MOVSDstoreidx1(v) 95 case Op386MOVSDstoreidx8: 96 return rewriteValue386_Op386MOVSDstoreidx8(v) 97 case Op386MOVSSconst: 98 return rewriteValue386_Op386MOVSSconst(v) 99 case Op386MOVSSload: 100 return rewriteValue386_Op386MOVSSload(v) 101 case Op386MOVSSloadidx1: 102 return rewriteValue386_Op386MOVSSloadidx1(v) 103 case Op386MOVSSloadidx4: 104 return rewriteValue386_Op386MOVSSloadidx4(v) 105 case Op386MOVSSstore: 106 return rewriteValue386_Op386MOVSSstore(v) 107 case Op386MOVSSstoreidx1: 108 return rewriteValue386_Op386MOVSSstoreidx1(v) 109 case Op386MOVSSstoreidx4: 110 return rewriteValue386_Op386MOVSSstoreidx4(v) 111 case Op386MOVWLSX: 112 return rewriteValue386_Op386MOVWLSX(v) 113 case Op386MOVWLSXload: 114 return rewriteValue386_Op386MOVWLSXload(v) 115 case Op386MOVWLZX: 116 return rewriteValue386_Op386MOVWLZX(v) 117 case Op386MOVWload: 118 return rewriteValue386_Op386MOVWload(v) 119 case Op386MOVWloadidx1: 120 return rewriteValue386_Op386MOVWloadidx1(v) 121 case Op386MOVWloadidx2: 122 return rewriteValue386_Op386MOVWloadidx2(v) 123 case Op386MOVWstore: 124 return rewriteValue386_Op386MOVWstore(v) 125 case Op386MOVWstoreconst: 126 return rewriteValue386_Op386MOVWstoreconst(v) 127 case Op386MOVWstoreconstidx1: 128 return rewriteValue386_Op386MOVWstoreconstidx1(v) 129 case Op386MOVWstoreconstidx2: 130 return rewriteValue386_Op386MOVWstoreconstidx2(v) 131 case Op386MOVWstoreidx1: 132 return rewriteValue386_Op386MOVWstoreidx1(v) 133 case Op386MOVWstoreidx2: 134 return rewriteValue386_Op386MOVWstoreidx2(v) 135 case Op386MULL: 136 return rewriteValue386_Op386MULL(v) 137 case Op386MULLconst: 138 return rewriteValue386_Op386MULLconst(v) 139 case Op386NEGL: 140 return rewriteValue386_Op386NEGL(v) 141 case Op386NOTL: 142 return rewriteValue386_Op386NOTL(v) 143 case Op386ORL: 144 return rewriteValue386_Op386ORL(v) 145 case Op386ORLconst: 146 return rewriteValue386_Op386ORLconst(v) 147 case Op386ROLBconst: 148 return rewriteValue386_Op386ROLBconst(v) 149 case Op386ROLLconst: 150 return rewriteValue386_Op386ROLLconst(v) 151 case Op386ROLWconst: 152 return rewriteValue386_Op386ROLWconst(v) 153 case Op386SARB: 154 return rewriteValue386_Op386SARB(v) 155 case Op386SARBconst: 156 return rewriteValue386_Op386SARBconst(v) 157 case Op386SARL: 158 return rewriteValue386_Op386SARL(v) 159 case Op386SARLconst: 160 return rewriteValue386_Op386SARLconst(v) 161 case Op386SARW: 162 return rewriteValue386_Op386SARW(v) 163 case Op386SARWconst: 164 return rewriteValue386_Op386SARWconst(v) 165 case Op386SBBL: 166 return rewriteValue386_Op386SBBL(v) 167 case Op386SBBLcarrymask: 168 return rewriteValue386_Op386SBBLcarrymask(v) 169 case Op386SETA: 170 return rewriteValue386_Op386SETA(v) 171 case Op386SETAE: 172 return rewriteValue386_Op386SETAE(v) 173 case Op386SETB: 174 return rewriteValue386_Op386SETB(v) 175 case Op386SETBE: 176 return rewriteValue386_Op386SETBE(v) 177 case Op386SETEQ: 178 return rewriteValue386_Op386SETEQ(v) 179 case Op386SETG: 180 return rewriteValue386_Op386SETG(v) 181 case Op386SETGE: 182 return rewriteValue386_Op386SETGE(v) 183 case Op386SETL: 184 return rewriteValue386_Op386SETL(v) 185 case Op386SETLE: 186 return rewriteValue386_Op386SETLE(v) 187 case Op386SETNE: 188 return rewriteValue386_Op386SETNE(v) 189 case Op386SHLL: 190 return rewriteValue386_Op386SHLL(v) 191 case Op386SHLLconst: 192 return rewriteValue386_Op386SHLLconst(v) 193 case Op386SHRB: 194 return rewriteValue386_Op386SHRB(v) 195 case Op386SHRBconst: 196 return rewriteValue386_Op386SHRBconst(v) 197 case Op386SHRL: 198 return rewriteValue386_Op386SHRL(v) 199 case Op386SHRLconst: 200 return rewriteValue386_Op386SHRLconst(v) 201 case Op386SHRW: 202 return rewriteValue386_Op386SHRW(v) 203 case Op386SHRWconst: 204 return rewriteValue386_Op386SHRWconst(v) 205 case Op386SUBL: 206 return rewriteValue386_Op386SUBL(v) 207 case Op386SUBLcarry: 208 return rewriteValue386_Op386SUBLcarry(v) 209 case Op386SUBLconst: 210 return rewriteValue386_Op386SUBLconst(v) 211 case Op386XORL: 212 return rewriteValue386_Op386XORL(v) 213 case Op386XORLconst: 214 return rewriteValue386_Op386XORLconst(v) 215 case OpAdd16: 216 return rewriteValue386_OpAdd16(v) 217 case OpAdd32: 218 return rewriteValue386_OpAdd32(v) 219 case OpAdd32F: 220 return rewriteValue386_OpAdd32F(v) 221 case OpAdd32carry: 222 return rewriteValue386_OpAdd32carry(v) 223 case OpAdd32withcarry: 224 return rewriteValue386_OpAdd32withcarry(v) 225 case OpAdd64F: 226 return rewriteValue386_OpAdd64F(v) 227 case OpAdd8: 228 return rewriteValue386_OpAdd8(v) 229 case OpAddPtr: 230 return rewriteValue386_OpAddPtr(v) 231 case OpAddr: 232 return rewriteValue386_OpAddr(v) 233 case OpAnd16: 234 return rewriteValue386_OpAnd16(v) 235 case OpAnd32: 236 return rewriteValue386_OpAnd32(v) 237 case OpAnd8: 238 return rewriteValue386_OpAnd8(v) 239 case OpAndB: 240 return rewriteValue386_OpAndB(v) 241 case OpAvg32u: 242 return rewriteValue386_OpAvg32u(v) 243 case OpBswap32: 244 return rewriteValue386_OpBswap32(v) 245 case OpClosureCall: 246 return rewriteValue386_OpClosureCall(v) 247 case OpCom16: 248 return rewriteValue386_OpCom16(v) 249 case OpCom32: 250 return rewriteValue386_OpCom32(v) 251 case OpCom8: 252 return rewriteValue386_OpCom8(v) 253 case OpConst16: 254 return rewriteValue386_OpConst16(v) 255 case OpConst32: 256 return rewriteValue386_OpConst32(v) 257 case OpConst32F: 258 return rewriteValue386_OpConst32F(v) 259 case OpConst64F: 260 return rewriteValue386_OpConst64F(v) 261 case OpConst8: 262 return rewriteValue386_OpConst8(v) 263 case OpConstBool: 264 return rewriteValue386_OpConstBool(v) 265 case OpConstNil: 266 return rewriteValue386_OpConstNil(v) 267 case OpConvert: 268 return rewriteValue386_OpConvert(v) 269 case OpCvt32Fto32: 270 return rewriteValue386_OpCvt32Fto32(v) 271 case OpCvt32Fto64F: 272 return rewriteValue386_OpCvt32Fto64F(v) 273 case OpCvt32to32F: 274 return rewriteValue386_OpCvt32to32F(v) 275 case OpCvt32to64F: 276 return rewriteValue386_OpCvt32to64F(v) 277 case OpCvt64Fto32: 278 return rewriteValue386_OpCvt64Fto32(v) 279 case OpCvt64Fto32F: 280 return rewriteValue386_OpCvt64Fto32F(v) 281 case OpDiv16: 282 return rewriteValue386_OpDiv16(v) 283 case OpDiv16u: 284 return rewriteValue386_OpDiv16u(v) 285 case OpDiv32: 286 return rewriteValue386_OpDiv32(v) 287 case OpDiv32F: 288 return rewriteValue386_OpDiv32F(v) 289 case OpDiv32u: 290 return rewriteValue386_OpDiv32u(v) 291 case OpDiv64F: 292 return rewriteValue386_OpDiv64F(v) 293 case OpDiv8: 294 return rewriteValue386_OpDiv8(v) 295 case OpDiv8u: 296 return rewriteValue386_OpDiv8u(v) 297 case OpEq16: 298 return rewriteValue386_OpEq16(v) 299 case OpEq32: 300 return rewriteValue386_OpEq32(v) 301 case OpEq32F: 302 return rewriteValue386_OpEq32F(v) 303 case OpEq64F: 304 return rewriteValue386_OpEq64F(v) 305 case OpEq8: 306 return rewriteValue386_OpEq8(v) 307 case OpEqB: 308 return rewriteValue386_OpEqB(v) 309 case OpEqPtr: 310 return rewriteValue386_OpEqPtr(v) 311 case OpGeq16: 312 return rewriteValue386_OpGeq16(v) 313 case OpGeq16U: 314 return rewriteValue386_OpGeq16U(v) 315 case OpGeq32: 316 return rewriteValue386_OpGeq32(v) 317 case OpGeq32F: 318 return rewriteValue386_OpGeq32F(v) 319 case OpGeq32U: 320 return rewriteValue386_OpGeq32U(v) 321 case OpGeq64F: 322 return rewriteValue386_OpGeq64F(v) 323 case OpGeq8: 324 return rewriteValue386_OpGeq8(v) 325 case OpGeq8U: 326 return rewriteValue386_OpGeq8U(v) 327 case OpGetClosurePtr: 328 return rewriteValue386_OpGetClosurePtr(v) 329 case OpGetG: 330 return rewriteValue386_OpGetG(v) 331 case OpGreater16: 332 return rewriteValue386_OpGreater16(v) 333 case OpGreater16U: 334 return rewriteValue386_OpGreater16U(v) 335 case OpGreater32: 336 return rewriteValue386_OpGreater32(v) 337 case OpGreater32F: 338 return rewriteValue386_OpGreater32F(v) 339 case OpGreater32U: 340 return rewriteValue386_OpGreater32U(v) 341 case OpGreater64F: 342 return rewriteValue386_OpGreater64F(v) 343 case OpGreater8: 344 return rewriteValue386_OpGreater8(v) 345 case OpGreater8U: 346 return rewriteValue386_OpGreater8U(v) 347 case OpHmul32: 348 return rewriteValue386_OpHmul32(v) 349 case OpHmul32u: 350 return rewriteValue386_OpHmul32u(v) 351 case OpInterCall: 352 return rewriteValue386_OpInterCall(v) 353 case OpIsInBounds: 354 return rewriteValue386_OpIsInBounds(v) 355 case OpIsNonNil: 356 return rewriteValue386_OpIsNonNil(v) 357 case OpIsSliceInBounds: 358 return rewriteValue386_OpIsSliceInBounds(v) 359 case OpLeq16: 360 return rewriteValue386_OpLeq16(v) 361 case OpLeq16U: 362 return rewriteValue386_OpLeq16U(v) 363 case OpLeq32: 364 return rewriteValue386_OpLeq32(v) 365 case OpLeq32F: 366 return rewriteValue386_OpLeq32F(v) 367 case OpLeq32U: 368 return rewriteValue386_OpLeq32U(v) 369 case OpLeq64F: 370 return rewriteValue386_OpLeq64F(v) 371 case OpLeq8: 372 return rewriteValue386_OpLeq8(v) 373 case OpLeq8U: 374 return rewriteValue386_OpLeq8U(v) 375 case OpLess16: 376 return rewriteValue386_OpLess16(v) 377 case OpLess16U: 378 return rewriteValue386_OpLess16U(v) 379 case OpLess32: 380 return rewriteValue386_OpLess32(v) 381 case OpLess32F: 382 return rewriteValue386_OpLess32F(v) 383 case OpLess32U: 384 return rewriteValue386_OpLess32U(v) 385 case OpLess64F: 386 return rewriteValue386_OpLess64F(v) 387 case OpLess8: 388 return rewriteValue386_OpLess8(v) 389 case OpLess8U: 390 return rewriteValue386_OpLess8U(v) 391 case OpLoad: 392 return rewriteValue386_OpLoad(v) 393 case OpLsh16x16: 394 return rewriteValue386_OpLsh16x16(v) 395 case OpLsh16x32: 396 return rewriteValue386_OpLsh16x32(v) 397 case OpLsh16x64: 398 return rewriteValue386_OpLsh16x64(v) 399 case OpLsh16x8: 400 return rewriteValue386_OpLsh16x8(v) 401 case OpLsh32x16: 402 return rewriteValue386_OpLsh32x16(v) 403 case OpLsh32x32: 404 return rewriteValue386_OpLsh32x32(v) 405 case OpLsh32x64: 406 return rewriteValue386_OpLsh32x64(v) 407 case OpLsh32x8: 408 return rewriteValue386_OpLsh32x8(v) 409 case OpLsh8x16: 410 return rewriteValue386_OpLsh8x16(v) 411 case OpLsh8x32: 412 return rewriteValue386_OpLsh8x32(v) 413 case OpLsh8x64: 414 return rewriteValue386_OpLsh8x64(v) 415 case OpLsh8x8: 416 return rewriteValue386_OpLsh8x8(v) 417 case OpMod16: 418 return rewriteValue386_OpMod16(v) 419 case OpMod16u: 420 return rewriteValue386_OpMod16u(v) 421 case OpMod32: 422 return rewriteValue386_OpMod32(v) 423 case OpMod32u: 424 return rewriteValue386_OpMod32u(v) 425 case OpMod8: 426 return rewriteValue386_OpMod8(v) 427 case OpMod8u: 428 return rewriteValue386_OpMod8u(v) 429 case OpMove: 430 return rewriteValue386_OpMove(v) 431 case OpMul16: 432 return rewriteValue386_OpMul16(v) 433 case OpMul32: 434 return rewriteValue386_OpMul32(v) 435 case OpMul32F: 436 return rewriteValue386_OpMul32F(v) 437 case OpMul32uhilo: 438 return rewriteValue386_OpMul32uhilo(v) 439 case OpMul64F: 440 return rewriteValue386_OpMul64F(v) 441 case OpMul8: 442 return rewriteValue386_OpMul8(v) 443 case OpNeg16: 444 return rewriteValue386_OpNeg16(v) 445 case OpNeg32: 446 return rewriteValue386_OpNeg32(v) 447 case OpNeg32F: 448 return rewriteValue386_OpNeg32F(v) 449 case OpNeg64F: 450 return rewriteValue386_OpNeg64F(v) 451 case OpNeg8: 452 return rewriteValue386_OpNeg8(v) 453 case OpNeq16: 454 return rewriteValue386_OpNeq16(v) 455 case OpNeq32: 456 return rewriteValue386_OpNeq32(v) 457 case OpNeq32F: 458 return rewriteValue386_OpNeq32F(v) 459 case OpNeq64F: 460 return rewriteValue386_OpNeq64F(v) 461 case OpNeq8: 462 return rewriteValue386_OpNeq8(v) 463 case OpNeqB: 464 return rewriteValue386_OpNeqB(v) 465 case OpNeqPtr: 466 return rewriteValue386_OpNeqPtr(v) 467 case OpNilCheck: 468 return rewriteValue386_OpNilCheck(v) 469 case OpNot: 470 return rewriteValue386_OpNot(v) 471 case OpOffPtr: 472 return rewriteValue386_OpOffPtr(v) 473 case OpOr16: 474 return rewriteValue386_OpOr16(v) 475 case OpOr32: 476 return rewriteValue386_OpOr32(v) 477 case OpOr8: 478 return rewriteValue386_OpOr8(v) 479 case OpOrB: 480 return rewriteValue386_OpOrB(v) 481 case OpRound32F: 482 return rewriteValue386_OpRound32F(v) 483 case OpRound64F: 484 return rewriteValue386_OpRound64F(v) 485 case OpRsh16Ux16: 486 return rewriteValue386_OpRsh16Ux16(v) 487 case OpRsh16Ux32: 488 return rewriteValue386_OpRsh16Ux32(v) 489 case OpRsh16Ux64: 490 return rewriteValue386_OpRsh16Ux64(v) 491 case OpRsh16Ux8: 492 return rewriteValue386_OpRsh16Ux8(v) 493 case OpRsh16x16: 494 return rewriteValue386_OpRsh16x16(v) 495 case OpRsh16x32: 496 return rewriteValue386_OpRsh16x32(v) 497 case OpRsh16x64: 498 return rewriteValue386_OpRsh16x64(v) 499 case OpRsh16x8: 500 return rewriteValue386_OpRsh16x8(v) 501 case OpRsh32Ux16: 502 return rewriteValue386_OpRsh32Ux16(v) 503 case OpRsh32Ux32: 504 return rewriteValue386_OpRsh32Ux32(v) 505 case OpRsh32Ux64: 506 return rewriteValue386_OpRsh32Ux64(v) 507 case OpRsh32Ux8: 508 return rewriteValue386_OpRsh32Ux8(v) 509 case OpRsh32x16: 510 return rewriteValue386_OpRsh32x16(v) 511 case OpRsh32x32: 512 return rewriteValue386_OpRsh32x32(v) 513 case OpRsh32x64: 514 return rewriteValue386_OpRsh32x64(v) 515 case OpRsh32x8: 516 return rewriteValue386_OpRsh32x8(v) 517 case OpRsh8Ux16: 518 return rewriteValue386_OpRsh8Ux16(v) 519 case OpRsh8Ux32: 520 return rewriteValue386_OpRsh8Ux32(v) 521 case OpRsh8Ux64: 522 return rewriteValue386_OpRsh8Ux64(v) 523 case OpRsh8Ux8: 524 return rewriteValue386_OpRsh8Ux8(v) 525 case OpRsh8x16: 526 return rewriteValue386_OpRsh8x16(v) 527 case OpRsh8x32: 528 return rewriteValue386_OpRsh8x32(v) 529 case OpRsh8x64: 530 return rewriteValue386_OpRsh8x64(v) 531 case OpRsh8x8: 532 return rewriteValue386_OpRsh8x8(v) 533 case OpSignExt16to32: 534 return rewriteValue386_OpSignExt16to32(v) 535 case OpSignExt8to16: 536 return rewriteValue386_OpSignExt8to16(v) 537 case OpSignExt8to32: 538 return rewriteValue386_OpSignExt8to32(v) 539 case OpSignmask: 540 return rewriteValue386_OpSignmask(v) 541 case OpSlicemask: 542 return rewriteValue386_OpSlicemask(v) 543 case OpSqrt: 544 return rewriteValue386_OpSqrt(v) 545 case OpStaticCall: 546 return rewriteValue386_OpStaticCall(v) 547 case OpStore: 548 return rewriteValue386_OpStore(v) 549 case OpSub16: 550 return rewriteValue386_OpSub16(v) 551 case OpSub32: 552 return rewriteValue386_OpSub32(v) 553 case OpSub32F: 554 return rewriteValue386_OpSub32F(v) 555 case OpSub32carry: 556 return rewriteValue386_OpSub32carry(v) 557 case OpSub32withcarry: 558 return rewriteValue386_OpSub32withcarry(v) 559 case OpSub64F: 560 return rewriteValue386_OpSub64F(v) 561 case OpSub8: 562 return rewriteValue386_OpSub8(v) 563 case OpSubPtr: 564 return rewriteValue386_OpSubPtr(v) 565 case OpTrunc16to8: 566 return rewriteValue386_OpTrunc16to8(v) 567 case OpTrunc32to16: 568 return rewriteValue386_OpTrunc32to16(v) 569 case OpTrunc32to8: 570 return rewriteValue386_OpTrunc32to8(v) 571 case OpXor16: 572 return rewriteValue386_OpXor16(v) 573 case OpXor32: 574 return rewriteValue386_OpXor32(v) 575 case OpXor8: 576 return rewriteValue386_OpXor8(v) 577 case OpZero: 578 return rewriteValue386_OpZero(v) 579 case OpZeroExt16to32: 580 return rewriteValue386_OpZeroExt16to32(v) 581 case OpZeroExt8to16: 582 return rewriteValue386_OpZeroExt8to16(v) 583 case OpZeroExt8to32: 584 return rewriteValue386_OpZeroExt8to32(v) 585 case OpZeromask: 586 return rewriteValue386_OpZeromask(v) 587 } 588 return false 589 } 590 func rewriteValue386_Op386ADCL(v *Value) bool { 591 // match: (ADCL x (MOVLconst [c]) f) 592 // cond: 593 // result: (ADCLconst [c] x f) 594 for { 595 x := v.Args[0] 596 v_1 := v.Args[1] 597 if v_1.Op != Op386MOVLconst { 598 break 599 } 600 c := v_1.AuxInt 601 f := v.Args[2] 602 v.reset(Op386ADCLconst) 603 v.AuxInt = c 604 v.AddArg(x) 605 v.AddArg(f) 606 return true 607 } 608 // match: (ADCL (MOVLconst [c]) x f) 609 // cond: 610 // result: (ADCLconst [c] x f) 611 for { 612 v_0 := v.Args[0] 613 if v_0.Op != Op386MOVLconst { 614 break 615 } 616 c := v_0.AuxInt 617 x := v.Args[1] 618 f := v.Args[2] 619 v.reset(Op386ADCLconst) 620 v.AuxInt = c 621 v.AddArg(x) 622 v.AddArg(f) 623 return true 624 } 625 // match: (ADCL (MOVLconst [c]) x f) 626 // cond: 627 // result: (ADCLconst [c] x f) 628 for { 629 v_0 := v.Args[0] 630 if v_0.Op != Op386MOVLconst { 631 break 632 } 633 c := v_0.AuxInt 634 x := v.Args[1] 635 f := v.Args[2] 636 v.reset(Op386ADCLconst) 637 v.AuxInt = c 638 v.AddArg(x) 639 v.AddArg(f) 640 return true 641 } 642 // match: (ADCL x (MOVLconst [c]) f) 643 // cond: 644 // result: (ADCLconst [c] x f) 645 for { 646 x := v.Args[0] 647 v_1 := v.Args[1] 648 if v_1.Op != Op386MOVLconst { 649 break 650 } 651 c := v_1.AuxInt 652 f := v.Args[2] 653 v.reset(Op386ADCLconst) 654 v.AuxInt = c 655 v.AddArg(x) 656 v.AddArg(f) 657 return true 658 } 659 return false 660 } 661 func rewriteValue386_Op386ADDL(v *Value) bool { 662 // match: (ADDL x (MOVLconst [c])) 663 // cond: 664 // result: (ADDLconst [c] x) 665 for { 666 x := v.Args[0] 667 v_1 := v.Args[1] 668 if v_1.Op != Op386MOVLconst { 669 break 670 } 671 c := v_1.AuxInt 672 v.reset(Op386ADDLconst) 673 v.AuxInt = c 674 v.AddArg(x) 675 return true 676 } 677 // match: (ADDL (MOVLconst [c]) x) 678 // cond: 679 // result: (ADDLconst [c] x) 680 for { 681 v_0 := v.Args[0] 682 if v_0.Op != Op386MOVLconst { 683 break 684 } 685 c := v_0.AuxInt 686 x := v.Args[1] 687 v.reset(Op386ADDLconst) 688 v.AuxInt = c 689 v.AddArg(x) 690 return true 691 } 692 // match: (ADDL (SHLLconst [c] x) (SHRLconst [d] x)) 693 // cond: d == 32-c 694 // result: (ROLLconst [c] x) 695 for { 696 v_0 := v.Args[0] 697 if v_0.Op != Op386SHLLconst { 698 break 699 } 700 c := v_0.AuxInt 701 x := v_0.Args[0] 702 v_1 := v.Args[1] 703 if v_1.Op != Op386SHRLconst { 704 break 705 } 706 d := v_1.AuxInt 707 if x != v_1.Args[0] { 708 break 709 } 710 if !(d == 32-c) { 711 break 712 } 713 v.reset(Op386ROLLconst) 714 v.AuxInt = c 715 v.AddArg(x) 716 return true 717 } 718 // match: (ADDL (SHRLconst [d] x) (SHLLconst [c] x)) 719 // cond: d == 32-c 720 // result: (ROLLconst [c] x) 721 for { 722 v_0 := v.Args[0] 723 if v_0.Op != Op386SHRLconst { 724 break 725 } 726 d := v_0.AuxInt 727 x := v_0.Args[0] 728 v_1 := v.Args[1] 729 if v_1.Op != Op386SHLLconst { 730 break 731 } 732 c := v_1.AuxInt 733 if x != v_1.Args[0] { 734 break 735 } 736 if !(d == 32-c) { 737 break 738 } 739 v.reset(Op386ROLLconst) 740 v.AuxInt = c 741 v.AddArg(x) 742 return true 743 } 744 // match: (ADDL <t> (SHLLconst x [c]) (SHRWconst x [d])) 745 // cond: c < 16 && d == 16-c && t.Size() == 2 746 // result: (ROLWconst x [c]) 747 for { 748 t := v.Type 749 v_0 := v.Args[0] 750 if v_0.Op != Op386SHLLconst { 751 break 752 } 753 c := v_0.AuxInt 754 x := v_0.Args[0] 755 v_1 := v.Args[1] 756 if v_1.Op != Op386SHRWconst { 757 break 758 } 759 d := v_1.AuxInt 760 if x != v_1.Args[0] { 761 break 762 } 763 if !(c < 16 && d == 16-c && t.Size() == 2) { 764 break 765 } 766 v.reset(Op386ROLWconst) 767 v.AuxInt = c 768 v.AddArg(x) 769 return true 770 } 771 // match: (ADDL <t> (SHRWconst x [d]) (SHLLconst x [c])) 772 // cond: c < 16 && d == 16-c && t.Size() == 2 773 // result: (ROLWconst x [c]) 774 for { 775 t := v.Type 776 v_0 := v.Args[0] 777 if v_0.Op != Op386SHRWconst { 778 break 779 } 780 d := v_0.AuxInt 781 x := v_0.Args[0] 782 v_1 := v.Args[1] 783 if v_1.Op != Op386SHLLconst { 784 break 785 } 786 c := v_1.AuxInt 787 if x != v_1.Args[0] { 788 break 789 } 790 if !(c < 16 && d == 16-c && t.Size() == 2) { 791 break 792 } 793 v.reset(Op386ROLWconst) 794 v.AuxInt = c 795 v.AddArg(x) 796 return true 797 } 798 // match: (ADDL <t> (SHLLconst x [c]) (SHRBconst x [d])) 799 // cond: c < 8 && d == 8-c && t.Size() == 1 800 // result: (ROLBconst x [c]) 801 for { 802 t := v.Type 803 v_0 := v.Args[0] 804 if v_0.Op != Op386SHLLconst { 805 break 806 } 807 c := v_0.AuxInt 808 x := v_0.Args[0] 809 v_1 := v.Args[1] 810 if v_1.Op != Op386SHRBconst { 811 break 812 } 813 d := v_1.AuxInt 814 if x != v_1.Args[0] { 815 break 816 } 817 if !(c < 8 && d == 8-c && t.Size() == 1) { 818 break 819 } 820 v.reset(Op386ROLBconst) 821 v.AuxInt = c 822 v.AddArg(x) 823 return true 824 } 825 // match: (ADDL <t> (SHRBconst x [d]) (SHLLconst x [c])) 826 // cond: c < 8 && d == 8-c && t.Size() == 1 827 // result: (ROLBconst x [c]) 828 for { 829 t := v.Type 830 v_0 := v.Args[0] 831 if v_0.Op != Op386SHRBconst { 832 break 833 } 834 d := v_0.AuxInt 835 x := v_0.Args[0] 836 v_1 := v.Args[1] 837 if v_1.Op != Op386SHLLconst { 838 break 839 } 840 c := v_1.AuxInt 841 if x != v_1.Args[0] { 842 break 843 } 844 if !(c < 8 && d == 8-c && t.Size() == 1) { 845 break 846 } 847 v.reset(Op386ROLBconst) 848 v.AuxInt = c 849 v.AddArg(x) 850 return true 851 } 852 // match: (ADDL x (SHLLconst [3] y)) 853 // cond: 854 // result: (LEAL8 x y) 855 for { 856 x := v.Args[0] 857 v_1 := v.Args[1] 858 if v_1.Op != Op386SHLLconst { 859 break 860 } 861 if v_1.AuxInt != 3 { 862 break 863 } 864 y := v_1.Args[0] 865 v.reset(Op386LEAL8) 866 v.AddArg(x) 867 v.AddArg(y) 868 return true 869 } 870 // match: (ADDL (SHLLconst [3] y) x) 871 // cond: 872 // result: (LEAL8 x y) 873 for { 874 v_0 := v.Args[0] 875 if v_0.Op != Op386SHLLconst { 876 break 877 } 878 if v_0.AuxInt != 3 { 879 break 880 } 881 y := v_0.Args[0] 882 x := v.Args[1] 883 v.reset(Op386LEAL8) 884 v.AddArg(x) 885 v.AddArg(y) 886 return true 887 } 888 // match: (ADDL x (SHLLconst [2] y)) 889 // cond: 890 // result: (LEAL4 x y) 891 for { 892 x := v.Args[0] 893 v_1 := v.Args[1] 894 if v_1.Op != Op386SHLLconst { 895 break 896 } 897 if v_1.AuxInt != 2 { 898 break 899 } 900 y := v_1.Args[0] 901 v.reset(Op386LEAL4) 902 v.AddArg(x) 903 v.AddArg(y) 904 return true 905 } 906 // match: (ADDL (SHLLconst [2] y) x) 907 // cond: 908 // result: (LEAL4 x y) 909 for { 910 v_0 := v.Args[0] 911 if v_0.Op != Op386SHLLconst { 912 break 913 } 914 if v_0.AuxInt != 2 { 915 break 916 } 917 y := v_0.Args[0] 918 x := v.Args[1] 919 v.reset(Op386LEAL4) 920 v.AddArg(x) 921 v.AddArg(y) 922 return true 923 } 924 // match: (ADDL x (SHLLconst [1] y)) 925 // cond: 926 // result: (LEAL2 x y) 927 for { 928 x := v.Args[0] 929 v_1 := v.Args[1] 930 if v_1.Op != Op386SHLLconst { 931 break 932 } 933 if v_1.AuxInt != 1 { 934 break 935 } 936 y := v_1.Args[0] 937 v.reset(Op386LEAL2) 938 v.AddArg(x) 939 v.AddArg(y) 940 return true 941 } 942 // match: (ADDL (SHLLconst [1] y) x) 943 // cond: 944 // result: (LEAL2 x y) 945 for { 946 v_0 := v.Args[0] 947 if v_0.Op != Op386SHLLconst { 948 break 949 } 950 if v_0.AuxInt != 1 { 951 break 952 } 953 y := v_0.Args[0] 954 x := v.Args[1] 955 v.reset(Op386LEAL2) 956 v.AddArg(x) 957 v.AddArg(y) 958 return true 959 } 960 // match: (ADDL x (ADDL y y)) 961 // cond: 962 // result: (LEAL2 x y) 963 for { 964 x := v.Args[0] 965 v_1 := v.Args[1] 966 if v_1.Op != Op386ADDL { 967 break 968 } 969 y := v_1.Args[0] 970 if y != v_1.Args[1] { 971 break 972 } 973 v.reset(Op386LEAL2) 974 v.AddArg(x) 975 v.AddArg(y) 976 return true 977 } 978 // match: (ADDL (ADDL y y) x) 979 // cond: 980 // result: (LEAL2 x y) 981 for { 982 v_0 := v.Args[0] 983 if v_0.Op != Op386ADDL { 984 break 985 } 986 y := v_0.Args[0] 987 if y != v_0.Args[1] { 988 break 989 } 990 x := v.Args[1] 991 v.reset(Op386LEAL2) 992 v.AddArg(x) 993 v.AddArg(y) 994 return true 995 } 996 // match: (ADDL x (ADDL x y)) 997 // cond: 998 // result: (LEAL2 y x) 999 for { 1000 x := v.Args[0] 1001 v_1 := v.Args[1] 1002 if v_1.Op != Op386ADDL { 1003 break 1004 } 1005 if x != v_1.Args[0] { 1006 break 1007 } 1008 y := v_1.Args[1] 1009 v.reset(Op386LEAL2) 1010 v.AddArg(y) 1011 v.AddArg(x) 1012 return true 1013 } 1014 // match: (ADDL x (ADDL y x)) 1015 // cond: 1016 // result: (LEAL2 y x) 1017 for { 1018 x := v.Args[0] 1019 v_1 := v.Args[1] 1020 if v_1.Op != Op386ADDL { 1021 break 1022 } 1023 y := v_1.Args[0] 1024 if x != v_1.Args[1] { 1025 break 1026 } 1027 v.reset(Op386LEAL2) 1028 v.AddArg(y) 1029 v.AddArg(x) 1030 return true 1031 } 1032 // match: (ADDL (ADDL x y) x) 1033 // cond: 1034 // result: (LEAL2 y x) 1035 for { 1036 v_0 := v.Args[0] 1037 if v_0.Op != Op386ADDL { 1038 break 1039 } 1040 x := v_0.Args[0] 1041 y := v_0.Args[1] 1042 if x != v.Args[1] { 1043 break 1044 } 1045 v.reset(Op386LEAL2) 1046 v.AddArg(y) 1047 v.AddArg(x) 1048 return true 1049 } 1050 // match: (ADDL (ADDL y x) x) 1051 // cond: 1052 // result: (LEAL2 y x) 1053 for { 1054 v_0 := v.Args[0] 1055 if v_0.Op != Op386ADDL { 1056 break 1057 } 1058 y := v_0.Args[0] 1059 x := v_0.Args[1] 1060 if x != v.Args[1] { 1061 break 1062 } 1063 v.reset(Op386LEAL2) 1064 v.AddArg(y) 1065 v.AddArg(x) 1066 return true 1067 } 1068 // match: (ADDL (ADDLconst [c] x) y) 1069 // cond: 1070 // result: (LEAL1 [c] x y) 1071 for { 1072 v_0 := v.Args[0] 1073 if v_0.Op != Op386ADDLconst { 1074 break 1075 } 1076 c := v_0.AuxInt 1077 x := v_0.Args[0] 1078 y := v.Args[1] 1079 v.reset(Op386LEAL1) 1080 v.AuxInt = c 1081 v.AddArg(x) 1082 v.AddArg(y) 1083 return true 1084 } 1085 // match: (ADDL y (ADDLconst [c] x)) 1086 // cond: 1087 // result: (LEAL1 [c] x y) 1088 for { 1089 y := v.Args[0] 1090 v_1 := v.Args[1] 1091 if v_1.Op != Op386ADDLconst { 1092 break 1093 } 1094 c := v_1.AuxInt 1095 x := v_1.Args[0] 1096 v.reset(Op386LEAL1) 1097 v.AuxInt = c 1098 v.AddArg(x) 1099 v.AddArg(y) 1100 return true 1101 } 1102 // match: (ADDL x (LEAL [c] {s} y)) 1103 // cond: x.Op != OpSB && y.Op != OpSB 1104 // result: (LEAL1 [c] {s} x y) 1105 for { 1106 x := v.Args[0] 1107 v_1 := v.Args[1] 1108 if v_1.Op != Op386LEAL { 1109 break 1110 } 1111 c := v_1.AuxInt 1112 s := v_1.Aux 1113 y := v_1.Args[0] 1114 if !(x.Op != OpSB && y.Op != OpSB) { 1115 break 1116 } 1117 v.reset(Op386LEAL1) 1118 v.AuxInt = c 1119 v.Aux = s 1120 v.AddArg(x) 1121 v.AddArg(y) 1122 return true 1123 } 1124 // match: (ADDL (LEAL [c] {s} y) x) 1125 // cond: x.Op != OpSB && y.Op != OpSB 1126 // result: (LEAL1 [c] {s} x y) 1127 for { 1128 v_0 := v.Args[0] 1129 if v_0.Op != Op386LEAL { 1130 break 1131 } 1132 c := v_0.AuxInt 1133 s := v_0.Aux 1134 y := v_0.Args[0] 1135 x := v.Args[1] 1136 if !(x.Op != OpSB && y.Op != OpSB) { 1137 break 1138 } 1139 v.reset(Op386LEAL1) 1140 v.AuxInt = c 1141 v.Aux = s 1142 v.AddArg(x) 1143 v.AddArg(y) 1144 return true 1145 } 1146 // match: (ADDL x (NEGL y)) 1147 // cond: 1148 // result: (SUBL x y) 1149 for { 1150 x := v.Args[0] 1151 v_1 := v.Args[1] 1152 if v_1.Op != Op386NEGL { 1153 break 1154 } 1155 y := v_1.Args[0] 1156 v.reset(Op386SUBL) 1157 v.AddArg(x) 1158 v.AddArg(y) 1159 return true 1160 } 1161 // match: (ADDL (NEGL y) x) 1162 // cond: 1163 // result: (SUBL x y) 1164 for { 1165 v_0 := v.Args[0] 1166 if v_0.Op != Op386NEGL { 1167 break 1168 } 1169 y := v_0.Args[0] 1170 x := v.Args[1] 1171 v.reset(Op386SUBL) 1172 v.AddArg(x) 1173 v.AddArg(y) 1174 return true 1175 } 1176 return false 1177 } 1178 func rewriteValue386_Op386ADDLcarry(v *Value) bool { 1179 // match: (ADDLcarry x (MOVLconst [c])) 1180 // cond: 1181 // result: (ADDLconstcarry [c] x) 1182 for { 1183 x := v.Args[0] 1184 v_1 := v.Args[1] 1185 if v_1.Op != Op386MOVLconst { 1186 break 1187 } 1188 c := v_1.AuxInt 1189 v.reset(Op386ADDLconstcarry) 1190 v.AuxInt = c 1191 v.AddArg(x) 1192 return true 1193 } 1194 // match: (ADDLcarry (MOVLconst [c]) x) 1195 // cond: 1196 // result: (ADDLconstcarry [c] x) 1197 for { 1198 v_0 := v.Args[0] 1199 if v_0.Op != Op386MOVLconst { 1200 break 1201 } 1202 c := v_0.AuxInt 1203 x := v.Args[1] 1204 v.reset(Op386ADDLconstcarry) 1205 v.AuxInt = c 1206 v.AddArg(x) 1207 return true 1208 } 1209 return false 1210 } 1211 func rewriteValue386_Op386ADDLconst(v *Value) bool { 1212 // match: (ADDLconst [c] (ADDL x y)) 1213 // cond: 1214 // result: (LEAL1 [c] x y) 1215 for { 1216 c := v.AuxInt 1217 v_0 := v.Args[0] 1218 if v_0.Op != Op386ADDL { 1219 break 1220 } 1221 x := v_0.Args[0] 1222 y := v_0.Args[1] 1223 v.reset(Op386LEAL1) 1224 v.AuxInt = c 1225 v.AddArg(x) 1226 v.AddArg(y) 1227 return true 1228 } 1229 // match: (ADDLconst [c] (LEAL [d] {s} x)) 1230 // cond: is32Bit(c+d) 1231 // result: (LEAL [c+d] {s} x) 1232 for { 1233 c := v.AuxInt 1234 v_0 := v.Args[0] 1235 if v_0.Op != Op386LEAL { 1236 break 1237 } 1238 d := v_0.AuxInt 1239 s := v_0.Aux 1240 x := v_0.Args[0] 1241 if !(is32Bit(c + d)) { 1242 break 1243 } 1244 v.reset(Op386LEAL) 1245 v.AuxInt = c + d 1246 v.Aux = s 1247 v.AddArg(x) 1248 return true 1249 } 1250 // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) 1251 // cond: is32Bit(c+d) 1252 // result: (LEAL1 [c+d] {s} x y) 1253 for { 1254 c := v.AuxInt 1255 v_0 := v.Args[0] 1256 if v_0.Op != Op386LEAL1 { 1257 break 1258 } 1259 d := v_0.AuxInt 1260 s := v_0.Aux 1261 x := v_0.Args[0] 1262 y := v_0.Args[1] 1263 if !(is32Bit(c + d)) { 1264 break 1265 } 1266 v.reset(Op386LEAL1) 1267 v.AuxInt = c + d 1268 v.Aux = s 1269 v.AddArg(x) 1270 v.AddArg(y) 1271 return true 1272 } 1273 // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) 1274 // cond: is32Bit(c+d) 1275 // result: (LEAL2 [c+d] {s} x y) 1276 for { 1277 c := v.AuxInt 1278 v_0 := v.Args[0] 1279 if v_0.Op != Op386LEAL2 { 1280 break 1281 } 1282 d := v_0.AuxInt 1283 s := v_0.Aux 1284 x := v_0.Args[0] 1285 y := v_0.Args[1] 1286 if !(is32Bit(c + d)) { 1287 break 1288 } 1289 v.reset(Op386LEAL2) 1290 v.AuxInt = c + d 1291 v.Aux = s 1292 v.AddArg(x) 1293 v.AddArg(y) 1294 return true 1295 } 1296 // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) 1297 // cond: is32Bit(c+d) 1298 // result: (LEAL4 [c+d] {s} x y) 1299 for { 1300 c := v.AuxInt 1301 v_0 := v.Args[0] 1302 if v_0.Op != Op386LEAL4 { 1303 break 1304 } 1305 d := v_0.AuxInt 1306 s := v_0.Aux 1307 x := v_0.Args[0] 1308 y := v_0.Args[1] 1309 if !(is32Bit(c + d)) { 1310 break 1311 } 1312 v.reset(Op386LEAL4) 1313 v.AuxInt = c + d 1314 v.Aux = s 1315 v.AddArg(x) 1316 v.AddArg(y) 1317 return true 1318 } 1319 // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) 1320 // cond: is32Bit(c+d) 1321 // result: (LEAL8 [c+d] {s} x y) 1322 for { 1323 c := v.AuxInt 1324 v_0 := v.Args[0] 1325 if v_0.Op != Op386LEAL8 { 1326 break 1327 } 1328 d := v_0.AuxInt 1329 s := v_0.Aux 1330 x := v_0.Args[0] 1331 y := v_0.Args[1] 1332 if !(is32Bit(c + d)) { 1333 break 1334 } 1335 v.reset(Op386LEAL8) 1336 v.AuxInt = c + d 1337 v.Aux = s 1338 v.AddArg(x) 1339 v.AddArg(y) 1340 return true 1341 } 1342 // match: (ADDLconst [c] x) 1343 // cond: int32(c)==0 1344 // result: x 1345 for { 1346 c := v.AuxInt 1347 x := v.Args[0] 1348 if !(int32(c) == 0) { 1349 break 1350 } 1351 v.reset(OpCopy) 1352 v.Type = x.Type 1353 v.AddArg(x) 1354 return true 1355 } 1356 // match: (ADDLconst [c] (MOVLconst [d])) 1357 // cond: 1358 // result: (MOVLconst [int64(int32(c+d))]) 1359 for { 1360 c := v.AuxInt 1361 v_0 := v.Args[0] 1362 if v_0.Op != Op386MOVLconst { 1363 break 1364 } 1365 d := v_0.AuxInt 1366 v.reset(Op386MOVLconst) 1367 v.AuxInt = int64(int32(c + d)) 1368 return true 1369 } 1370 // match: (ADDLconst [c] (ADDLconst [d] x)) 1371 // cond: 1372 // result: (ADDLconst [int64(int32(c+d))] x) 1373 for { 1374 c := v.AuxInt 1375 v_0 := v.Args[0] 1376 if v_0.Op != Op386ADDLconst { 1377 break 1378 } 1379 d := v_0.AuxInt 1380 x := v_0.Args[0] 1381 v.reset(Op386ADDLconst) 1382 v.AuxInt = int64(int32(c + d)) 1383 v.AddArg(x) 1384 return true 1385 } 1386 return false 1387 } 1388 func rewriteValue386_Op386ANDL(v *Value) bool { 1389 // match: (ANDL x (MOVLconst [c])) 1390 // cond: 1391 // result: (ANDLconst [c] x) 1392 for { 1393 x := v.Args[0] 1394 v_1 := v.Args[1] 1395 if v_1.Op != Op386MOVLconst { 1396 break 1397 } 1398 c := v_1.AuxInt 1399 v.reset(Op386ANDLconst) 1400 v.AuxInt = c 1401 v.AddArg(x) 1402 return true 1403 } 1404 // match: (ANDL (MOVLconst [c]) x) 1405 // cond: 1406 // result: (ANDLconst [c] x) 1407 for { 1408 v_0 := v.Args[0] 1409 if v_0.Op != Op386MOVLconst { 1410 break 1411 } 1412 c := v_0.AuxInt 1413 x := v.Args[1] 1414 v.reset(Op386ANDLconst) 1415 v.AuxInt = c 1416 v.AddArg(x) 1417 return true 1418 } 1419 // match: (ANDL x x) 1420 // cond: 1421 // result: x 1422 for { 1423 x := v.Args[0] 1424 if x != v.Args[1] { 1425 break 1426 } 1427 v.reset(OpCopy) 1428 v.Type = x.Type 1429 v.AddArg(x) 1430 return true 1431 } 1432 return false 1433 } 1434 func rewriteValue386_Op386ANDLconst(v *Value) bool { 1435 // match: (ANDLconst [c] (ANDLconst [d] x)) 1436 // cond: 1437 // result: (ANDLconst [c & d] x) 1438 for { 1439 c := v.AuxInt 1440 v_0 := v.Args[0] 1441 if v_0.Op != Op386ANDLconst { 1442 break 1443 } 1444 d := v_0.AuxInt 1445 x := v_0.Args[0] 1446 v.reset(Op386ANDLconst) 1447 v.AuxInt = c & d 1448 v.AddArg(x) 1449 return true 1450 } 1451 // match: (ANDLconst [c] _) 1452 // cond: int32(c)==0 1453 // result: (MOVLconst [0]) 1454 for { 1455 c := v.AuxInt 1456 if !(int32(c) == 0) { 1457 break 1458 } 1459 v.reset(Op386MOVLconst) 1460 v.AuxInt = 0 1461 return true 1462 } 1463 // match: (ANDLconst [c] x) 1464 // cond: int32(c)==-1 1465 // result: x 1466 for { 1467 c := v.AuxInt 1468 x := v.Args[0] 1469 if !(int32(c) == -1) { 1470 break 1471 } 1472 v.reset(OpCopy) 1473 v.Type = x.Type 1474 v.AddArg(x) 1475 return true 1476 } 1477 // match: (ANDLconst [c] (MOVLconst [d])) 1478 // cond: 1479 // result: (MOVLconst [c&d]) 1480 for { 1481 c := v.AuxInt 1482 v_0 := v.Args[0] 1483 if v_0.Op != Op386MOVLconst { 1484 break 1485 } 1486 d := v_0.AuxInt 1487 v.reset(Op386MOVLconst) 1488 v.AuxInt = c & d 1489 return true 1490 } 1491 return false 1492 } 1493 func rewriteValue386_Op386CMPB(v *Value) bool { 1494 b := v.Block 1495 _ = b 1496 // match: (CMPB x (MOVLconst [c])) 1497 // cond: 1498 // result: (CMPBconst x [int64(int8(c))]) 1499 for { 1500 x := v.Args[0] 1501 v_1 := v.Args[1] 1502 if v_1.Op != Op386MOVLconst { 1503 break 1504 } 1505 c := v_1.AuxInt 1506 v.reset(Op386CMPBconst) 1507 v.AuxInt = int64(int8(c)) 1508 v.AddArg(x) 1509 return true 1510 } 1511 // match: (CMPB (MOVLconst [c]) x) 1512 // cond: 1513 // result: (InvertFlags (CMPBconst x [int64(int8(c))])) 1514 for { 1515 v_0 := v.Args[0] 1516 if v_0.Op != Op386MOVLconst { 1517 break 1518 } 1519 c := v_0.AuxInt 1520 x := v.Args[1] 1521 v.reset(Op386InvertFlags) 1522 v0 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 1523 v0.AuxInt = int64(int8(c)) 1524 v0.AddArg(x) 1525 v.AddArg(v0) 1526 return true 1527 } 1528 return false 1529 } 1530 func rewriteValue386_Op386CMPBconst(v *Value) bool { 1531 // match: (CMPBconst (MOVLconst [x]) [y]) 1532 // cond: int8(x)==int8(y) 1533 // result: (FlagEQ) 1534 for { 1535 y := v.AuxInt 1536 v_0 := v.Args[0] 1537 if v_0.Op != Op386MOVLconst { 1538 break 1539 } 1540 x := v_0.AuxInt 1541 if !(int8(x) == int8(y)) { 1542 break 1543 } 1544 v.reset(Op386FlagEQ) 1545 return true 1546 } 1547 // match: (CMPBconst (MOVLconst [x]) [y]) 1548 // cond: int8(x)<int8(y) && uint8(x)<uint8(y) 1549 // result: (FlagLT_ULT) 1550 for { 1551 y := v.AuxInt 1552 v_0 := v.Args[0] 1553 if v_0.Op != Op386MOVLconst { 1554 break 1555 } 1556 x := v_0.AuxInt 1557 if !(int8(x) < int8(y) && uint8(x) < uint8(y)) { 1558 break 1559 } 1560 v.reset(Op386FlagLT_ULT) 1561 return true 1562 } 1563 // match: (CMPBconst (MOVLconst [x]) [y]) 1564 // cond: int8(x)<int8(y) && uint8(x)>uint8(y) 1565 // result: (FlagLT_UGT) 1566 for { 1567 y := v.AuxInt 1568 v_0 := v.Args[0] 1569 if v_0.Op != Op386MOVLconst { 1570 break 1571 } 1572 x := v_0.AuxInt 1573 if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { 1574 break 1575 } 1576 v.reset(Op386FlagLT_UGT) 1577 return true 1578 } 1579 // match: (CMPBconst (MOVLconst [x]) [y]) 1580 // cond: int8(x)>int8(y) && uint8(x)<uint8(y) 1581 // result: (FlagGT_ULT) 1582 for { 1583 y := v.AuxInt 1584 v_0 := v.Args[0] 1585 if v_0.Op != Op386MOVLconst { 1586 break 1587 } 1588 x := v_0.AuxInt 1589 if !(int8(x) > int8(y) && uint8(x) < uint8(y)) { 1590 break 1591 } 1592 v.reset(Op386FlagGT_ULT) 1593 return true 1594 } 1595 // match: (CMPBconst (MOVLconst [x]) [y]) 1596 // cond: int8(x)>int8(y) && uint8(x)>uint8(y) 1597 // result: (FlagGT_UGT) 1598 for { 1599 y := v.AuxInt 1600 v_0 := v.Args[0] 1601 if v_0.Op != Op386MOVLconst { 1602 break 1603 } 1604 x := v_0.AuxInt 1605 if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { 1606 break 1607 } 1608 v.reset(Op386FlagGT_UGT) 1609 return true 1610 } 1611 // match: (CMPBconst (ANDLconst _ [m]) [n]) 1612 // cond: 0 <= int8(m) && int8(m) < int8(n) 1613 // result: (FlagLT_ULT) 1614 for { 1615 n := v.AuxInt 1616 v_0 := v.Args[0] 1617 if v_0.Op != Op386ANDLconst { 1618 break 1619 } 1620 m := v_0.AuxInt 1621 if !(0 <= int8(m) && int8(m) < int8(n)) { 1622 break 1623 } 1624 v.reset(Op386FlagLT_ULT) 1625 return true 1626 } 1627 // match: (CMPBconst (ANDL x y) [0]) 1628 // cond: 1629 // result: (TESTB x y) 1630 for { 1631 if v.AuxInt != 0 { 1632 break 1633 } 1634 v_0 := v.Args[0] 1635 if v_0.Op != Op386ANDL { 1636 break 1637 } 1638 x := v_0.Args[0] 1639 y := v_0.Args[1] 1640 v.reset(Op386TESTB) 1641 v.AddArg(x) 1642 v.AddArg(y) 1643 return true 1644 } 1645 // match: (CMPBconst (ANDLconst [c] x) [0]) 1646 // cond: 1647 // result: (TESTBconst [int64(int8(c))] x) 1648 for { 1649 if v.AuxInt != 0 { 1650 break 1651 } 1652 v_0 := v.Args[0] 1653 if v_0.Op != Op386ANDLconst { 1654 break 1655 } 1656 c := v_0.AuxInt 1657 x := v_0.Args[0] 1658 v.reset(Op386TESTBconst) 1659 v.AuxInt = int64(int8(c)) 1660 v.AddArg(x) 1661 return true 1662 } 1663 // match: (CMPBconst x [0]) 1664 // cond: 1665 // result: (TESTB x x) 1666 for { 1667 if v.AuxInt != 0 { 1668 break 1669 } 1670 x := v.Args[0] 1671 v.reset(Op386TESTB) 1672 v.AddArg(x) 1673 v.AddArg(x) 1674 return true 1675 } 1676 return false 1677 } 1678 func rewriteValue386_Op386CMPL(v *Value) bool { 1679 b := v.Block 1680 _ = b 1681 // match: (CMPL x (MOVLconst [c])) 1682 // cond: 1683 // result: (CMPLconst x [c]) 1684 for { 1685 x := v.Args[0] 1686 v_1 := v.Args[1] 1687 if v_1.Op != Op386MOVLconst { 1688 break 1689 } 1690 c := v_1.AuxInt 1691 v.reset(Op386CMPLconst) 1692 v.AuxInt = c 1693 v.AddArg(x) 1694 return true 1695 } 1696 // match: (CMPL (MOVLconst [c]) x) 1697 // cond: 1698 // result: (InvertFlags (CMPLconst x [c])) 1699 for { 1700 v_0 := v.Args[0] 1701 if v_0.Op != Op386MOVLconst { 1702 break 1703 } 1704 c := v_0.AuxInt 1705 x := v.Args[1] 1706 v.reset(Op386InvertFlags) 1707 v0 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 1708 v0.AuxInt = c 1709 v0.AddArg(x) 1710 v.AddArg(v0) 1711 return true 1712 } 1713 return false 1714 } 1715 func rewriteValue386_Op386CMPLconst(v *Value) bool { 1716 // match: (CMPLconst (MOVLconst [x]) [y]) 1717 // cond: int32(x)==int32(y) 1718 // result: (FlagEQ) 1719 for { 1720 y := v.AuxInt 1721 v_0 := v.Args[0] 1722 if v_0.Op != Op386MOVLconst { 1723 break 1724 } 1725 x := v_0.AuxInt 1726 if !(int32(x) == int32(y)) { 1727 break 1728 } 1729 v.reset(Op386FlagEQ) 1730 return true 1731 } 1732 // match: (CMPLconst (MOVLconst [x]) [y]) 1733 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 1734 // result: (FlagLT_ULT) 1735 for { 1736 y := v.AuxInt 1737 v_0 := v.Args[0] 1738 if v_0.Op != Op386MOVLconst { 1739 break 1740 } 1741 x := v_0.AuxInt 1742 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 1743 break 1744 } 1745 v.reset(Op386FlagLT_ULT) 1746 return true 1747 } 1748 // match: (CMPLconst (MOVLconst [x]) [y]) 1749 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 1750 // result: (FlagLT_UGT) 1751 for { 1752 y := v.AuxInt 1753 v_0 := v.Args[0] 1754 if v_0.Op != Op386MOVLconst { 1755 break 1756 } 1757 x := v_0.AuxInt 1758 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 1759 break 1760 } 1761 v.reset(Op386FlagLT_UGT) 1762 return true 1763 } 1764 // match: (CMPLconst (MOVLconst [x]) [y]) 1765 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 1766 // result: (FlagGT_ULT) 1767 for { 1768 y := v.AuxInt 1769 v_0 := v.Args[0] 1770 if v_0.Op != Op386MOVLconst { 1771 break 1772 } 1773 x := v_0.AuxInt 1774 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 1775 break 1776 } 1777 v.reset(Op386FlagGT_ULT) 1778 return true 1779 } 1780 // match: (CMPLconst (MOVLconst [x]) [y]) 1781 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 1782 // result: (FlagGT_UGT) 1783 for { 1784 y := v.AuxInt 1785 v_0 := v.Args[0] 1786 if v_0.Op != Op386MOVLconst { 1787 break 1788 } 1789 x := v_0.AuxInt 1790 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 1791 break 1792 } 1793 v.reset(Op386FlagGT_UGT) 1794 return true 1795 } 1796 // match: (CMPLconst (SHRLconst _ [c]) [n]) 1797 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 1798 // result: (FlagLT_ULT) 1799 for { 1800 n := v.AuxInt 1801 v_0 := v.Args[0] 1802 if v_0.Op != Op386SHRLconst { 1803 break 1804 } 1805 c := v_0.AuxInt 1806 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 1807 break 1808 } 1809 v.reset(Op386FlagLT_ULT) 1810 return true 1811 } 1812 // match: (CMPLconst (ANDLconst _ [m]) [n]) 1813 // cond: 0 <= int32(m) && int32(m) < int32(n) 1814 // result: (FlagLT_ULT) 1815 for { 1816 n := v.AuxInt 1817 v_0 := v.Args[0] 1818 if v_0.Op != Op386ANDLconst { 1819 break 1820 } 1821 m := v_0.AuxInt 1822 if !(0 <= int32(m) && int32(m) < int32(n)) { 1823 break 1824 } 1825 v.reset(Op386FlagLT_ULT) 1826 return true 1827 } 1828 // match: (CMPLconst (ANDL x y) [0]) 1829 // cond: 1830 // result: (TESTL x y) 1831 for { 1832 if v.AuxInt != 0 { 1833 break 1834 } 1835 v_0 := v.Args[0] 1836 if v_0.Op != Op386ANDL { 1837 break 1838 } 1839 x := v_0.Args[0] 1840 y := v_0.Args[1] 1841 v.reset(Op386TESTL) 1842 v.AddArg(x) 1843 v.AddArg(y) 1844 return true 1845 } 1846 // match: (CMPLconst (ANDLconst [c] x) [0]) 1847 // cond: 1848 // result: (TESTLconst [c] x) 1849 for { 1850 if v.AuxInt != 0 { 1851 break 1852 } 1853 v_0 := v.Args[0] 1854 if v_0.Op != Op386ANDLconst { 1855 break 1856 } 1857 c := v_0.AuxInt 1858 x := v_0.Args[0] 1859 v.reset(Op386TESTLconst) 1860 v.AuxInt = c 1861 v.AddArg(x) 1862 return true 1863 } 1864 // match: (CMPLconst x [0]) 1865 // cond: 1866 // result: (TESTL x x) 1867 for { 1868 if v.AuxInt != 0 { 1869 break 1870 } 1871 x := v.Args[0] 1872 v.reset(Op386TESTL) 1873 v.AddArg(x) 1874 v.AddArg(x) 1875 return true 1876 } 1877 return false 1878 } 1879 func rewriteValue386_Op386CMPW(v *Value) bool { 1880 b := v.Block 1881 _ = b 1882 // match: (CMPW x (MOVLconst [c])) 1883 // cond: 1884 // result: (CMPWconst x [int64(int16(c))]) 1885 for { 1886 x := v.Args[0] 1887 v_1 := v.Args[1] 1888 if v_1.Op != Op386MOVLconst { 1889 break 1890 } 1891 c := v_1.AuxInt 1892 v.reset(Op386CMPWconst) 1893 v.AuxInt = int64(int16(c)) 1894 v.AddArg(x) 1895 return true 1896 } 1897 // match: (CMPW (MOVLconst [c]) x) 1898 // cond: 1899 // result: (InvertFlags (CMPWconst x [int64(int16(c))])) 1900 for { 1901 v_0 := v.Args[0] 1902 if v_0.Op != Op386MOVLconst { 1903 break 1904 } 1905 c := v_0.AuxInt 1906 x := v.Args[1] 1907 v.reset(Op386InvertFlags) 1908 v0 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 1909 v0.AuxInt = int64(int16(c)) 1910 v0.AddArg(x) 1911 v.AddArg(v0) 1912 return true 1913 } 1914 return false 1915 } 1916 func rewriteValue386_Op386CMPWconst(v *Value) bool { 1917 // match: (CMPWconst (MOVLconst [x]) [y]) 1918 // cond: int16(x)==int16(y) 1919 // result: (FlagEQ) 1920 for { 1921 y := v.AuxInt 1922 v_0 := v.Args[0] 1923 if v_0.Op != Op386MOVLconst { 1924 break 1925 } 1926 x := v_0.AuxInt 1927 if !(int16(x) == int16(y)) { 1928 break 1929 } 1930 v.reset(Op386FlagEQ) 1931 return true 1932 } 1933 // match: (CMPWconst (MOVLconst [x]) [y]) 1934 // cond: int16(x)<int16(y) && uint16(x)<uint16(y) 1935 // result: (FlagLT_ULT) 1936 for { 1937 y := v.AuxInt 1938 v_0 := v.Args[0] 1939 if v_0.Op != Op386MOVLconst { 1940 break 1941 } 1942 x := v_0.AuxInt 1943 if !(int16(x) < int16(y) && uint16(x) < uint16(y)) { 1944 break 1945 } 1946 v.reset(Op386FlagLT_ULT) 1947 return true 1948 } 1949 // match: (CMPWconst (MOVLconst [x]) [y]) 1950 // cond: int16(x)<int16(y) && uint16(x)>uint16(y) 1951 // result: (FlagLT_UGT) 1952 for { 1953 y := v.AuxInt 1954 v_0 := v.Args[0] 1955 if v_0.Op != Op386MOVLconst { 1956 break 1957 } 1958 x := v_0.AuxInt 1959 if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { 1960 break 1961 } 1962 v.reset(Op386FlagLT_UGT) 1963 return true 1964 } 1965 // match: (CMPWconst (MOVLconst [x]) [y]) 1966 // cond: int16(x)>int16(y) && uint16(x)<uint16(y) 1967 // result: (FlagGT_ULT) 1968 for { 1969 y := v.AuxInt 1970 v_0 := v.Args[0] 1971 if v_0.Op != Op386MOVLconst { 1972 break 1973 } 1974 x := v_0.AuxInt 1975 if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { 1976 break 1977 } 1978 v.reset(Op386FlagGT_ULT) 1979 return true 1980 } 1981 // match: (CMPWconst (MOVLconst [x]) [y]) 1982 // cond: int16(x)>int16(y) && uint16(x)>uint16(y) 1983 // result: (FlagGT_UGT) 1984 for { 1985 y := v.AuxInt 1986 v_0 := v.Args[0] 1987 if v_0.Op != Op386MOVLconst { 1988 break 1989 } 1990 x := v_0.AuxInt 1991 if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { 1992 break 1993 } 1994 v.reset(Op386FlagGT_UGT) 1995 return true 1996 } 1997 // match: (CMPWconst (ANDLconst _ [m]) [n]) 1998 // cond: 0 <= int16(m) && int16(m) < int16(n) 1999 // result: (FlagLT_ULT) 2000 for { 2001 n := v.AuxInt 2002 v_0 := v.Args[0] 2003 if v_0.Op != Op386ANDLconst { 2004 break 2005 } 2006 m := v_0.AuxInt 2007 if !(0 <= int16(m) && int16(m) < int16(n)) { 2008 break 2009 } 2010 v.reset(Op386FlagLT_ULT) 2011 return true 2012 } 2013 // match: (CMPWconst (ANDL x y) [0]) 2014 // cond: 2015 // result: (TESTW x y) 2016 for { 2017 if v.AuxInt != 0 { 2018 break 2019 } 2020 v_0 := v.Args[0] 2021 if v_0.Op != Op386ANDL { 2022 break 2023 } 2024 x := v_0.Args[0] 2025 y := v_0.Args[1] 2026 v.reset(Op386TESTW) 2027 v.AddArg(x) 2028 v.AddArg(y) 2029 return true 2030 } 2031 // match: (CMPWconst (ANDLconst [c] x) [0]) 2032 // cond: 2033 // result: (TESTWconst [int64(int16(c))] x) 2034 for { 2035 if v.AuxInt != 0 { 2036 break 2037 } 2038 v_0 := v.Args[0] 2039 if v_0.Op != Op386ANDLconst { 2040 break 2041 } 2042 c := v_0.AuxInt 2043 x := v_0.Args[0] 2044 v.reset(Op386TESTWconst) 2045 v.AuxInt = int64(int16(c)) 2046 v.AddArg(x) 2047 return true 2048 } 2049 // match: (CMPWconst x [0]) 2050 // cond: 2051 // result: (TESTW x x) 2052 for { 2053 if v.AuxInt != 0 { 2054 break 2055 } 2056 x := v.Args[0] 2057 v.reset(Op386TESTW) 2058 v.AddArg(x) 2059 v.AddArg(x) 2060 return true 2061 } 2062 return false 2063 } 2064 func rewriteValue386_Op386LEAL(v *Value) bool { 2065 // match: (LEAL [c] {s} (ADDLconst [d] x)) 2066 // cond: is32Bit(c+d) 2067 // result: (LEAL [c+d] {s} x) 2068 for { 2069 c := v.AuxInt 2070 s := v.Aux 2071 v_0 := v.Args[0] 2072 if v_0.Op != Op386ADDLconst { 2073 break 2074 } 2075 d := v_0.AuxInt 2076 x := v_0.Args[0] 2077 if !(is32Bit(c + d)) { 2078 break 2079 } 2080 v.reset(Op386LEAL) 2081 v.AuxInt = c + d 2082 v.Aux = s 2083 v.AddArg(x) 2084 return true 2085 } 2086 // match: (LEAL [c] {s} (ADDL x y)) 2087 // cond: x.Op != OpSB && y.Op != OpSB 2088 // result: (LEAL1 [c] {s} x y) 2089 for { 2090 c := v.AuxInt 2091 s := v.Aux 2092 v_0 := v.Args[0] 2093 if v_0.Op != Op386ADDL { 2094 break 2095 } 2096 x := v_0.Args[0] 2097 y := v_0.Args[1] 2098 if !(x.Op != OpSB && y.Op != OpSB) { 2099 break 2100 } 2101 v.reset(Op386LEAL1) 2102 v.AuxInt = c 2103 v.Aux = s 2104 v.AddArg(x) 2105 v.AddArg(y) 2106 return true 2107 } 2108 // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) 2109 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2110 // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) 2111 for { 2112 off1 := v.AuxInt 2113 sym1 := v.Aux 2114 v_0 := v.Args[0] 2115 if v_0.Op != Op386LEAL { 2116 break 2117 } 2118 off2 := v_0.AuxInt 2119 sym2 := v_0.Aux 2120 x := v_0.Args[0] 2121 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2122 break 2123 } 2124 v.reset(Op386LEAL) 2125 v.AuxInt = off1 + off2 2126 v.Aux = mergeSym(sym1, sym2) 2127 v.AddArg(x) 2128 return true 2129 } 2130 // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) 2131 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2132 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2133 for { 2134 off1 := v.AuxInt 2135 sym1 := v.Aux 2136 v_0 := v.Args[0] 2137 if v_0.Op != Op386LEAL1 { 2138 break 2139 } 2140 off2 := v_0.AuxInt 2141 sym2 := v_0.Aux 2142 x := v_0.Args[0] 2143 y := v_0.Args[1] 2144 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2145 break 2146 } 2147 v.reset(Op386LEAL1) 2148 v.AuxInt = off1 + off2 2149 v.Aux = mergeSym(sym1, sym2) 2150 v.AddArg(x) 2151 v.AddArg(y) 2152 return true 2153 } 2154 // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) 2155 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2156 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2157 for { 2158 off1 := v.AuxInt 2159 sym1 := v.Aux 2160 v_0 := v.Args[0] 2161 if v_0.Op != Op386LEAL2 { 2162 break 2163 } 2164 off2 := v_0.AuxInt 2165 sym2 := v_0.Aux 2166 x := v_0.Args[0] 2167 y := v_0.Args[1] 2168 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2169 break 2170 } 2171 v.reset(Op386LEAL2) 2172 v.AuxInt = off1 + off2 2173 v.Aux = mergeSym(sym1, sym2) 2174 v.AddArg(x) 2175 v.AddArg(y) 2176 return true 2177 } 2178 // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) 2179 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2180 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2181 for { 2182 off1 := v.AuxInt 2183 sym1 := v.Aux 2184 v_0 := v.Args[0] 2185 if v_0.Op != Op386LEAL4 { 2186 break 2187 } 2188 off2 := v_0.AuxInt 2189 sym2 := v_0.Aux 2190 x := v_0.Args[0] 2191 y := v_0.Args[1] 2192 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2193 break 2194 } 2195 v.reset(Op386LEAL4) 2196 v.AuxInt = off1 + off2 2197 v.Aux = mergeSym(sym1, sym2) 2198 v.AddArg(x) 2199 v.AddArg(y) 2200 return true 2201 } 2202 // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) 2203 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2204 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2205 for { 2206 off1 := v.AuxInt 2207 sym1 := v.Aux 2208 v_0 := v.Args[0] 2209 if v_0.Op != Op386LEAL8 { 2210 break 2211 } 2212 off2 := v_0.AuxInt 2213 sym2 := v_0.Aux 2214 x := v_0.Args[0] 2215 y := v_0.Args[1] 2216 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2217 break 2218 } 2219 v.reset(Op386LEAL8) 2220 v.AuxInt = off1 + off2 2221 v.Aux = mergeSym(sym1, sym2) 2222 v.AddArg(x) 2223 v.AddArg(y) 2224 return true 2225 } 2226 return false 2227 } 2228 func rewriteValue386_Op386LEAL1(v *Value) bool { 2229 // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) 2230 // cond: is32Bit(c+d) && x.Op != OpSB 2231 // result: (LEAL1 [c+d] {s} x y) 2232 for { 2233 c := v.AuxInt 2234 s := v.Aux 2235 v_0 := v.Args[0] 2236 if v_0.Op != Op386ADDLconst { 2237 break 2238 } 2239 d := v_0.AuxInt 2240 x := v_0.Args[0] 2241 y := v.Args[1] 2242 if !(is32Bit(c+d) && x.Op != OpSB) { 2243 break 2244 } 2245 v.reset(Op386LEAL1) 2246 v.AuxInt = c + d 2247 v.Aux = s 2248 v.AddArg(x) 2249 v.AddArg(y) 2250 return true 2251 } 2252 // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) 2253 // cond: is32Bit(c+d) && x.Op != OpSB 2254 // result: (LEAL1 [c+d] {s} x y) 2255 for { 2256 c := v.AuxInt 2257 s := v.Aux 2258 y := v.Args[0] 2259 v_1 := v.Args[1] 2260 if v_1.Op != Op386ADDLconst { 2261 break 2262 } 2263 d := v_1.AuxInt 2264 x := v_1.Args[0] 2265 if !(is32Bit(c+d) && x.Op != OpSB) { 2266 break 2267 } 2268 v.reset(Op386LEAL1) 2269 v.AuxInt = c + d 2270 v.Aux = s 2271 v.AddArg(x) 2272 v.AddArg(y) 2273 return true 2274 } 2275 // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) 2276 // cond: 2277 // result: (LEAL2 [c] {s} x y) 2278 for { 2279 c := v.AuxInt 2280 s := v.Aux 2281 x := v.Args[0] 2282 v_1 := v.Args[1] 2283 if v_1.Op != Op386SHLLconst { 2284 break 2285 } 2286 if v_1.AuxInt != 1 { 2287 break 2288 } 2289 y := v_1.Args[0] 2290 v.reset(Op386LEAL2) 2291 v.AuxInt = c 2292 v.Aux = s 2293 v.AddArg(x) 2294 v.AddArg(y) 2295 return true 2296 } 2297 // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) 2298 // cond: 2299 // result: (LEAL2 [c] {s} x y) 2300 for { 2301 c := v.AuxInt 2302 s := v.Aux 2303 v_0 := v.Args[0] 2304 if v_0.Op != Op386SHLLconst { 2305 break 2306 } 2307 if v_0.AuxInt != 1 { 2308 break 2309 } 2310 y := v_0.Args[0] 2311 x := v.Args[1] 2312 v.reset(Op386LEAL2) 2313 v.AuxInt = c 2314 v.Aux = s 2315 v.AddArg(x) 2316 v.AddArg(y) 2317 return true 2318 } 2319 // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) 2320 // cond: 2321 // result: (LEAL4 [c] {s} x y) 2322 for { 2323 c := v.AuxInt 2324 s := v.Aux 2325 x := v.Args[0] 2326 v_1 := v.Args[1] 2327 if v_1.Op != Op386SHLLconst { 2328 break 2329 } 2330 if v_1.AuxInt != 2 { 2331 break 2332 } 2333 y := v_1.Args[0] 2334 v.reset(Op386LEAL4) 2335 v.AuxInt = c 2336 v.Aux = s 2337 v.AddArg(x) 2338 v.AddArg(y) 2339 return true 2340 } 2341 // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) 2342 // cond: 2343 // result: (LEAL4 [c] {s} x y) 2344 for { 2345 c := v.AuxInt 2346 s := v.Aux 2347 v_0 := v.Args[0] 2348 if v_0.Op != Op386SHLLconst { 2349 break 2350 } 2351 if v_0.AuxInt != 2 { 2352 break 2353 } 2354 y := v_0.Args[0] 2355 x := v.Args[1] 2356 v.reset(Op386LEAL4) 2357 v.AuxInt = c 2358 v.Aux = s 2359 v.AddArg(x) 2360 v.AddArg(y) 2361 return true 2362 } 2363 // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) 2364 // cond: 2365 // result: (LEAL8 [c] {s} x y) 2366 for { 2367 c := v.AuxInt 2368 s := v.Aux 2369 x := v.Args[0] 2370 v_1 := v.Args[1] 2371 if v_1.Op != Op386SHLLconst { 2372 break 2373 } 2374 if v_1.AuxInt != 3 { 2375 break 2376 } 2377 y := v_1.Args[0] 2378 v.reset(Op386LEAL8) 2379 v.AuxInt = c 2380 v.Aux = s 2381 v.AddArg(x) 2382 v.AddArg(y) 2383 return true 2384 } 2385 // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) 2386 // cond: 2387 // result: (LEAL8 [c] {s} x y) 2388 for { 2389 c := v.AuxInt 2390 s := v.Aux 2391 v_0 := v.Args[0] 2392 if v_0.Op != Op386SHLLconst { 2393 break 2394 } 2395 if v_0.AuxInt != 3 { 2396 break 2397 } 2398 y := v_0.Args[0] 2399 x := v.Args[1] 2400 v.reset(Op386LEAL8) 2401 v.AuxInt = c 2402 v.Aux = s 2403 v.AddArg(x) 2404 v.AddArg(y) 2405 return true 2406 } 2407 // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2408 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2409 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2410 for { 2411 off1 := v.AuxInt 2412 sym1 := v.Aux 2413 v_0 := v.Args[0] 2414 if v_0.Op != Op386LEAL { 2415 break 2416 } 2417 off2 := v_0.AuxInt 2418 sym2 := v_0.Aux 2419 x := v_0.Args[0] 2420 y := v.Args[1] 2421 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2422 break 2423 } 2424 v.reset(Op386LEAL1) 2425 v.AuxInt = off1 + off2 2426 v.Aux = mergeSym(sym1, sym2) 2427 v.AddArg(x) 2428 v.AddArg(y) 2429 return true 2430 } 2431 // match: (LEAL1 [off1] {sym1} y (LEAL [off2] {sym2} x)) 2432 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2433 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2434 for { 2435 off1 := v.AuxInt 2436 sym1 := v.Aux 2437 y := v.Args[0] 2438 v_1 := v.Args[1] 2439 if v_1.Op != Op386LEAL { 2440 break 2441 } 2442 off2 := v_1.AuxInt 2443 sym2 := v_1.Aux 2444 x := v_1.Args[0] 2445 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2446 break 2447 } 2448 v.reset(Op386LEAL1) 2449 v.AuxInt = off1 + off2 2450 v.Aux = mergeSym(sym1, sym2) 2451 v.AddArg(x) 2452 v.AddArg(y) 2453 return true 2454 } 2455 return false 2456 } 2457 func rewriteValue386_Op386LEAL2(v *Value) bool { 2458 // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) 2459 // cond: is32Bit(c+d) && x.Op != OpSB 2460 // result: (LEAL2 [c+d] {s} x y) 2461 for { 2462 c := v.AuxInt 2463 s := v.Aux 2464 v_0 := v.Args[0] 2465 if v_0.Op != Op386ADDLconst { 2466 break 2467 } 2468 d := v_0.AuxInt 2469 x := v_0.Args[0] 2470 y := v.Args[1] 2471 if !(is32Bit(c+d) && x.Op != OpSB) { 2472 break 2473 } 2474 v.reset(Op386LEAL2) 2475 v.AuxInt = c + d 2476 v.Aux = s 2477 v.AddArg(x) 2478 v.AddArg(y) 2479 return true 2480 } 2481 // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) 2482 // cond: is32Bit(c+2*d) && y.Op != OpSB 2483 // result: (LEAL2 [c+2*d] {s} x y) 2484 for { 2485 c := v.AuxInt 2486 s := v.Aux 2487 x := v.Args[0] 2488 v_1 := v.Args[1] 2489 if v_1.Op != Op386ADDLconst { 2490 break 2491 } 2492 d := v_1.AuxInt 2493 y := v_1.Args[0] 2494 if !(is32Bit(c+2*d) && y.Op != OpSB) { 2495 break 2496 } 2497 v.reset(Op386LEAL2) 2498 v.AuxInt = c + 2*d 2499 v.Aux = s 2500 v.AddArg(x) 2501 v.AddArg(y) 2502 return true 2503 } 2504 // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) 2505 // cond: 2506 // result: (LEAL4 [c] {s} x y) 2507 for { 2508 c := v.AuxInt 2509 s := v.Aux 2510 x := v.Args[0] 2511 v_1 := v.Args[1] 2512 if v_1.Op != Op386SHLLconst { 2513 break 2514 } 2515 if v_1.AuxInt != 1 { 2516 break 2517 } 2518 y := v_1.Args[0] 2519 v.reset(Op386LEAL4) 2520 v.AuxInt = c 2521 v.Aux = s 2522 v.AddArg(x) 2523 v.AddArg(y) 2524 return true 2525 } 2526 // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) 2527 // cond: 2528 // result: (LEAL8 [c] {s} x y) 2529 for { 2530 c := v.AuxInt 2531 s := v.Aux 2532 x := v.Args[0] 2533 v_1 := v.Args[1] 2534 if v_1.Op != Op386SHLLconst { 2535 break 2536 } 2537 if v_1.AuxInt != 2 { 2538 break 2539 } 2540 y := v_1.Args[0] 2541 v.reset(Op386LEAL8) 2542 v.AuxInt = c 2543 v.Aux = s 2544 v.AddArg(x) 2545 v.AddArg(y) 2546 return true 2547 } 2548 // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2549 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2550 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2551 for { 2552 off1 := v.AuxInt 2553 sym1 := v.Aux 2554 v_0 := v.Args[0] 2555 if v_0.Op != Op386LEAL { 2556 break 2557 } 2558 off2 := v_0.AuxInt 2559 sym2 := v_0.Aux 2560 x := v_0.Args[0] 2561 y := v.Args[1] 2562 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2563 break 2564 } 2565 v.reset(Op386LEAL2) 2566 v.AuxInt = off1 + off2 2567 v.Aux = mergeSym(sym1, sym2) 2568 v.AddArg(x) 2569 v.AddArg(y) 2570 return true 2571 } 2572 return false 2573 } 2574 func rewriteValue386_Op386LEAL4(v *Value) bool { 2575 // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) 2576 // cond: is32Bit(c+d) && x.Op != OpSB 2577 // result: (LEAL4 [c+d] {s} x y) 2578 for { 2579 c := v.AuxInt 2580 s := v.Aux 2581 v_0 := v.Args[0] 2582 if v_0.Op != Op386ADDLconst { 2583 break 2584 } 2585 d := v_0.AuxInt 2586 x := v_0.Args[0] 2587 y := v.Args[1] 2588 if !(is32Bit(c+d) && x.Op != OpSB) { 2589 break 2590 } 2591 v.reset(Op386LEAL4) 2592 v.AuxInt = c + d 2593 v.Aux = s 2594 v.AddArg(x) 2595 v.AddArg(y) 2596 return true 2597 } 2598 // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) 2599 // cond: is32Bit(c+4*d) && y.Op != OpSB 2600 // result: (LEAL4 [c+4*d] {s} x y) 2601 for { 2602 c := v.AuxInt 2603 s := v.Aux 2604 x := v.Args[0] 2605 v_1 := v.Args[1] 2606 if v_1.Op != Op386ADDLconst { 2607 break 2608 } 2609 d := v_1.AuxInt 2610 y := v_1.Args[0] 2611 if !(is32Bit(c+4*d) && y.Op != OpSB) { 2612 break 2613 } 2614 v.reset(Op386LEAL4) 2615 v.AuxInt = c + 4*d 2616 v.Aux = s 2617 v.AddArg(x) 2618 v.AddArg(y) 2619 return true 2620 } 2621 // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) 2622 // cond: 2623 // result: (LEAL8 [c] {s} x y) 2624 for { 2625 c := v.AuxInt 2626 s := v.Aux 2627 x := v.Args[0] 2628 v_1 := v.Args[1] 2629 if v_1.Op != Op386SHLLconst { 2630 break 2631 } 2632 if v_1.AuxInt != 1 { 2633 break 2634 } 2635 y := v_1.Args[0] 2636 v.reset(Op386LEAL8) 2637 v.AuxInt = c 2638 v.Aux = s 2639 v.AddArg(x) 2640 v.AddArg(y) 2641 return true 2642 } 2643 // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2644 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2645 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2646 for { 2647 off1 := v.AuxInt 2648 sym1 := v.Aux 2649 v_0 := v.Args[0] 2650 if v_0.Op != Op386LEAL { 2651 break 2652 } 2653 off2 := v_0.AuxInt 2654 sym2 := v_0.Aux 2655 x := v_0.Args[0] 2656 y := v.Args[1] 2657 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2658 break 2659 } 2660 v.reset(Op386LEAL4) 2661 v.AuxInt = off1 + off2 2662 v.Aux = mergeSym(sym1, sym2) 2663 v.AddArg(x) 2664 v.AddArg(y) 2665 return true 2666 } 2667 return false 2668 } 2669 func rewriteValue386_Op386LEAL8(v *Value) bool { 2670 // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) 2671 // cond: is32Bit(c+d) && x.Op != OpSB 2672 // result: (LEAL8 [c+d] {s} x y) 2673 for { 2674 c := v.AuxInt 2675 s := v.Aux 2676 v_0 := v.Args[0] 2677 if v_0.Op != Op386ADDLconst { 2678 break 2679 } 2680 d := v_0.AuxInt 2681 x := v_0.Args[0] 2682 y := v.Args[1] 2683 if !(is32Bit(c+d) && x.Op != OpSB) { 2684 break 2685 } 2686 v.reset(Op386LEAL8) 2687 v.AuxInt = c + d 2688 v.Aux = s 2689 v.AddArg(x) 2690 v.AddArg(y) 2691 return true 2692 } 2693 // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) 2694 // cond: is32Bit(c+8*d) && y.Op != OpSB 2695 // result: (LEAL8 [c+8*d] {s} x y) 2696 for { 2697 c := v.AuxInt 2698 s := v.Aux 2699 x := v.Args[0] 2700 v_1 := v.Args[1] 2701 if v_1.Op != Op386ADDLconst { 2702 break 2703 } 2704 d := v_1.AuxInt 2705 y := v_1.Args[0] 2706 if !(is32Bit(c+8*d) && y.Op != OpSB) { 2707 break 2708 } 2709 v.reset(Op386LEAL8) 2710 v.AuxInt = c + 8*d 2711 v.Aux = s 2712 v.AddArg(x) 2713 v.AddArg(y) 2714 return true 2715 } 2716 // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2717 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2718 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2719 for { 2720 off1 := v.AuxInt 2721 sym1 := v.Aux 2722 v_0 := v.Args[0] 2723 if v_0.Op != Op386LEAL { 2724 break 2725 } 2726 off2 := v_0.AuxInt 2727 sym2 := v_0.Aux 2728 x := v_0.Args[0] 2729 y := v.Args[1] 2730 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2731 break 2732 } 2733 v.reset(Op386LEAL8) 2734 v.AuxInt = off1 + off2 2735 v.Aux = mergeSym(sym1, sym2) 2736 v.AddArg(x) 2737 v.AddArg(y) 2738 return true 2739 } 2740 return false 2741 } 2742 func rewriteValue386_Op386MOVBLSX(v *Value) bool { 2743 b := v.Block 2744 _ = b 2745 // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) 2746 // cond: x.Uses == 1 && clobber(x) 2747 // result: @x.Block (MOVBLSXload <v.Type> [off] {sym} ptr mem) 2748 for { 2749 x := v.Args[0] 2750 if x.Op != Op386MOVBload { 2751 break 2752 } 2753 off := x.AuxInt 2754 sym := x.Aux 2755 ptr := x.Args[0] 2756 mem := x.Args[1] 2757 if !(x.Uses == 1 && clobber(x)) { 2758 break 2759 } 2760 b = x.Block 2761 v0 := b.NewValue0(v.Pos, Op386MOVBLSXload, v.Type) 2762 v.reset(OpCopy) 2763 v.AddArg(v0) 2764 v0.AuxInt = off 2765 v0.Aux = sym 2766 v0.AddArg(ptr) 2767 v0.AddArg(mem) 2768 return true 2769 } 2770 // match: (MOVBLSX (ANDLconst [c] x)) 2771 // cond: c & 0x80 == 0 2772 // result: (ANDLconst [c & 0x7f] x) 2773 for { 2774 v_0 := v.Args[0] 2775 if v_0.Op != Op386ANDLconst { 2776 break 2777 } 2778 c := v_0.AuxInt 2779 x := v_0.Args[0] 2780 if !(c&0x80 == 0) { 2781 break 2782 } 2783 v.reset(Op386ANDLconst) 2784 v.AuxInt = c & 0x7f 2785 v.AddArg(x) 2786 return true 2787 } 2788 return false 2789 } 2790 func rewriteValue386_Op386MOVBLSXload(v *Value) bool { 2791 b := v.Block 2792 _ = b 2793 config := b.Func.Config 2794 _ = config 2795 // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2796 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2797 // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2798 for { 2799 off1 := v.AuxInt 2800 sym1 := v.Aux 2801 v_0 := v.Args[0] 2802 if v_0.Op != Op386LEAL { 2803 break 2804 } 2805 off2 := v_0.AuxInt 2806 sym2 := v_0.Aux 2807 base := v_0.Args[0] 2808 mem := v.Args[1] 2809 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2810 break 2811 } 2812 v.reset(Op386MOVBLSXload) 2813 v.AuxInt = off1 + off2 2814 v.Aux = mergeSym(sym1, sym2) 2815 v.AddArg(base) 2816 v.AddArg(mem) 2817 return true 2818 } 2819 return false 2820 } 2821 func rewriteValue386_Op386MOVBLZX(v *Value) bool { 2822 b := v.Block 2823 _ = b 2824 // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) 2825 // cond: x.Uses == 1 && clobber(x) 2826 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 2827 for { 2828 x := v.Args[0] 2829 if x.Op != Op386MOVBload { 2830 break 2831 } 2832 off := x.AuxInt 2833 sym := x.Aux 2834 ptr := x.Args[0] 2835 mem := x.Args[1] 2836 if !(x.Uses == 1 && clobber(x)) { 2837 break 2838 } 2839 b = x.Block 2840 v0 := b.NewValue0(v.Pos, Op386MOVBload, v.Type) 2841 v.reset(OpCopy) 2842 v.AddArg(v0) 2843 v0.AuxInt = off 2844 v0.Aux = sym 2845 v0.AddArg(ptr) 2846 v0.AddArg(mem) 2847 return true 2848 } 2849 // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) 2850 // cond: x.Uses == 1 && clobber(x) 2851 // result: @x.Block (MOVBloadidx1 <v.Type> [off] {sym} ptr idx mem) 2852 for { 2853 x := v.Args[0] 2854 if x.Op != Op386MOVBloadidx1 { 2855 break 2856 } 2857 off := x.AuxInt 2858 sym := x.Aux 2859 ptr := x.Args[0] 2860 idx := x.Args[1] 2861 mem := x.Args[2] 2862 if !(x.Uses == 1 && clobber(x)) { 2863 break 2864 } 2865 b = x.Block 2866 v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) 2867 v.reset(OpCopy) 2868 v.AddArg(v0) 2869 v0.AuxInt = off 2870 v0.Aux = sym 2871 v0.AddArg(ptr) 2872 v0.AddArg(idx) 2873 v0.AddArg(mem) 2874 return true 2875 } 2876 // match: (MOVBLZX (ANDLconst [c] x)) 2877 // cond: 2878 // result: (ANDLconst [c & 0xff] x) 2879 for { 2880 v_0 := v.Args[0] 2881 if v_0.Op != Op386ANDLconst { 2882 break 2883 } 2884 c := v_0.AuxInt 2885 x := v_0.Args[0] 2886 v.reset(Op386ANDLconst) 2887 v.AuxInt = c & 0xff 2888 v.AddArg(x) 2889 return true 2890 } 2891 return false 2892 } 2893 func rewriteValue386_Op386MOVBload(v *Value) bool { 2894 b := v.Block 2895 _ = b 2896 config := b.Func.Config 2897 _ = config 2898 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 2899 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 2900 // result: x 2901 for { 2902 off := v.AuxInt 2903 sym := v.Aux 2904 ptr := v.Args[0] 2905 v_1 := v.Args[1] 2906 if v_1.Op != Op386MOVBstore { 2907 break 2908 } 2909 off2 := v_1.AuxInt 2910 sym2 := v_1.Aux 2911 ptr2 := v_1.Args[0] 2912 x := v_1.Args[1] 2913 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 2914 break 2915 } 2916 v.reset(OpCopy) 2917 v.Type = x.Type 2918 v.AddArg(x) 2919 return true 2920 } 2921 // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) 2922 // cond: is32Bit(off1+off2) 2923 // result: (MOVBload [off1+off2] {sym} ptr mem) 2924 for { 2925 off1 := v.AuxInt 2926 sym := v.Aux 2927 v_0 := v.Args[0] 2928 if v_0.Op != Op386ADDLconst { 2929 break 2930 } 2931 off2 := v_0.AuxInt 2932 ptr := v_0.Args[0] 2933 mem := v.Args[1] 2934 if !(is32Bit(off1 + off2)) { 2935 break 2936 } 2937 v.reset(Op386MOVBload) 2938 v.AuxInt = off1 + off2 2939 v.Aux = sym 2940 v.AddArg(ptr) 2941 v.AddArg(mem) 2942 return true 2943 } 2944 // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2945 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2946 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2947 for { 2948 off1 := v.AuxInt 2949 sym1 := v.Aux 2950 v_0 := v.Args[0] 2951 if v_0.Op != Op386LEAL { 2952 break 2953 } 2954 off2 := v_0.AuxInt 2955 sym2 := v_0.Aux 2956 base := v_0.Args[0] 2957 mem := v.Args[1] 2958 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2959 break 2960 } 2961 v.reset(Op386MOVBload) 2962 v.AuxInt = off1 + off2 2963 v.Aux = mergeSym(sym1, sym2) 2964 v.AddArg(base) 2965 v.AddArg(mem) 2966 return true 2967 } 2968 // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 2969 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2970 // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 2971 for { 2972 off1 := v.AuxInt 2973 sym1 := v.Aux 2974 v_0 := v.Args[0] 2975 if v_0.Op != Op386LEAL1 { 2976 break 2977 } 2978 off2 := v_0.AuxInt 2979 sym2 := v_0.Aux 2980 ptr := v_0.Args[0] 2981 idx := v_0.Args[1] 2982 mem := v.Args[1] 2983 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2984 break 2985 } 2986 v.reset(Op386MOVBloadidx1) 2987 v.AuxInt = off1 + off2 2988 v.Aux = mergeSym(sym1, sym2) 2989 v.AddArg(ptr) 2990 v.AddArg(idx) 2991 v.AddArg(mem) 2992 return true 2993 } 2994 // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) 2995 // cond: ptr.Op != OpSB 2996 // result: (MOVBloadidx1 [off] {sym} ptr idx mem) 2997 for { 2998 off := v.AuxInt 2999 sym := v.Aux 3000 v_0 := v.Args[0] 3001 if v_0.Op != Op386ADDL { 3002 break 3003 } 3004 ptr := v_0.Args[0] 3005 idx := v_0.Args[1] 3006 mem := v.Args[1] 3007 if !(ptr.Op != OpSB) { 3008 break 3009 } 3010 v.reset(Op386MOVBloadidx1) 3011 v.AuxInt = off 3012 v.Aux = sym 3013 v.AddArg(ptr) 3014 v.AddArg(idx) 3015 v.AddArg(mem) 3016 return true 3017 } 3018 return false 3019 } 3020 func rewriteValue386_Op386MOVBloadidx1(v *Value) bool { 3021 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 3022 // cond: 3023 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3024 for { 3025 c := v.AuxInt 3026 sym := v.Aux 3027 v_0 := v.Args[0] 3028 if v_0.Op != Op386ADDLconst { 3029 break 3030 } 3031 d := v_0.AuxInt 3032 ptr := v_0.Args[0] 3033 idx := v.Args[1] 3034 mem := v.Args[2] 3035 v.reset(Op386MOVBloadidx1) 3036 v.AuxInt = c + d 3037 v.Aux = sym 3038 v.AddArg(ptr) 3039 v.AddArg(idx) 3040 v.AddArg(mem) 3041 return true 3042 } 3043 // match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 3044 // cond: 3045 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3046 for { 3047 c := v.AuxInt 3048 sym := v.Aux 3049 idx := v.Args[0] 3050 v_1 := v.Args[1] 3051 if v_1.Op != Op386ADDLconst { 3052 break 3053 } 3054 d := v_1.AuxInt 3055 ptr := v_1.Args[0] 3056 mem := v.Args[2] 3057 v.reset(Op386MOVBloadidx1) 3058 v.AuxInt = c + d 3059 v.Aux = sym 3060 v.AddArg(ptr) 3061 v.AddArg(idx) 3062 v.AddArg(mem) 3063 return true 3064 } 3065 // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 3066 // cond: 3067 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3068 for { 3069 c := v.AuxInt 3070 sym := v.Aux 3071 ptr := v.Args[0] 3072 v_1 := v.Args[1] 3073 if v_1.Op != Op386ADDLconst { 3074 break 3075 } 3076 d := v_1.AuxInt 3077 idx := v_1.Args[0] 3078 mem := v.Args[2] 3079 v.reset(Op386MOVBloadidx1) 3080 v.AuxInt = c + d 3081 v.Aux = sym 3082 v.AddArg(ptr) 3083 v.AddArg(idx) 3084 v.AddArg(mem) 3085 return true 3086 } 3087 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 3088 // cond: 3089 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3090 for { 3091 c := v.AuxInt 3092 sym := v.Aux 3093 v_0 := v.Args[0] 3094 if v_0.Op != Op386ADDLconst { 3095 break 3096 } 3097 d := v_0.AuxInt 3098 idx := v_0.Args[0] 3099 ptr := v.Args[1] 3100 mem := v.Args[2] 3101 v.reset(Op386MOVBloadidx1) 3102 v.AuxInt = c + d 3103 v.Aux = sym 3104 v.AddArg(ptr) 3105 v.AddArg(idx) 3106 v.AddArg(mem) 3107 return true 3108 } 3109 return false 3110 } 3111 func rewriteValue386_Op386MOVBstore(v *Value) bool { 3112 b := v.Block 3113 _ = b 3114 config := b.Func.Config 3115 _ = config 3116 // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) 3117 // cond: 3118 // result: (MOVBstore [off] {sym} ptr x mem) 3119 for { 3120 off := v.AuxInt 3121 sym := v.Aux 3122 ptr := v.Args[0] 3123 v_1 := v.Args[1] 3124 if v_1.Op != Op386MOVBLSX { 3125 break 3126 } 3127 x := v_1.Args[0] 3128 mem := v.Args[2] 3129 v.reset(Op386MOVBstore) 3130 v.AuxInt = off 3131 v.Aux = sym 3132 v.AddArg(ptr) 3133 v.AddArg(x) 3134 v.AddArg(mem) 3135 return true 3136 } 3137 // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) 3138 // cond: 3139 // result: (MOVBstore [off] {sym} ptr x mem) 3140 for { 3141 off := v.AuxInt 3142 sym := v.Aux 3143 ptr := v.Args[0] 3144 v_1 := v.Args[1] 3145 if v_1.Op != Op386MOVBLZX { 3146 break 3147 } 3148 x := v_1.Args[0] 3149 mem := v.Args[2] 3150 v.reset(Op386MOVBstore) 3151 v.AuxInt = off 3152 v.Aux = sym 3153 v.AddArg(ptr) 3154 v.AddArg(x) 3155 v.AddArg(mem) 3156 return true 3157 } 3158 // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 3159 // cond: is32Bit(off1+off2) 3160 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3161 for { 3162 off1 := v.AuxInt 3163 sym := v.Aux 3164 v_0 := v.Args[0] 3165 if v_0.Op != Op386ADDLconst { 3166 break 3167 } 3168 off2 := v_0.AuxInt 3169 ptr := v_0.Args[0] 3170 val := v.Args[1] 3171 mem := v.Args[2] 3172 if !(is32Bit(off1 + off2)) { 3173 break 3174 } 3175 v.reset(Op386MOVBstore) 3176 v.AuxInt = off1 + off2 3177 v.Aux = sym 3178 v.AddArg(ptr) 3179 v.AddArg(val) 3180 v.AddArg(mem) 3181 return true 3182 } 3183 // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) 3184 // cond: validOff(off) 3185 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 3186 for { 3187 off := v.AuxInt 3188 sym := v.Aux 3189 ptr := v.Args[0] 3190 v_1 := v.Args[1] 3191 if v_1.Op != Op386MOVLconst { 3192 break 3193 } 3194 c := v_1.AuxInt 3195 mem := v.Args[2] 3196 if !(validOff(off)) { 3197 break 3198 } 3199 v.reset(Op386MOVBstoreconst) 3200 v.AuxInt = makeValAndOff(int64(int8(c)), off) 3201 v.Aux = sym 3202 v.AddArg(ptr) 3203 v.AddArg(mem) 3204 return true 3205 } 3206 // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 3207 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3208 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 3209 for { 3210 off1 := v.AuxInt 3211 sym1 := v.Aux 3212 v_0 := v.Args[0] 3213 if v_0.Op != Op386LEAL { 3214 break 3215 } 3216 off2 := v_0.AuxInt 3217 sym2 := v_0.Aux 3218 base := v_0.Args[0] 3219 val := v.Args[1] 3220 mem := v.Args[2] 3221 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3222 break 3223 } 3224 v.reset(Op386MOVBstore) 3225 v.AuxInt = off1 + off2 3226 v.Aux = mergeSym(sym1, sym2) 3227 v.AddArg(base) 3228 v.AddArg(val) 3229 v.AddArg(mem) 3230 return true 3231 } 3232 // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 3233 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3234 // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3235 for { 3236 off1 := v.AuxInt 3237 sym1 := v.Aux 3238 v_0 := v.Args[0] 3239 if v_0.Op != Op386LEAL1 { 3240 break 3241 } 3242 off2 := v_0.AuxInt 3243 sym2 := v_0.Aux 3244 ptr := v_0.Args[0] 3245 idx := v_0.Args[1] 3246 val := v.Args[1] 3247 mem := v.Args[2] 3248 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3249 break 3250 } 3251 v.reset(Op386MOVBstoreidx1) 3252 v.AuxInt = off1 + off2 3253 v.Aux = mergeSym(sym1, sym2) 3254 v.AddArg(ptr) 3255 v.AddArg(idx) 3256 v.AddArg(val) 3257 v.AddArg(mem) 3258 return true 3259 } 3260 // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) 3261 // cond: ptr.Op != OpSB 3262 // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) 3263 for { 3264 off := v.AuxInt 3265 sym := v.Aux 3266 v_0 := v.Args[0] 3267 if v_0.Op != Op386ADDL { 3268 break 3269 } 3270 ptr := v_0.Args[0] 3271 idx := v_0.Args[1] 3272 val := v.Args[1] 3273 mem := v.Args[2] 3274 if !(ptr.Op != OpSB) { 3275 break 3276 } 3277 v.reset(Op386MOVBstoreidx1) 3278 v.AuxInt = off 3279 v.Aux = sym 3280 v.AddArg(ptr) 3281 v.AddArg(idx) 3282 v.AddArg(val) 3283 v.AddArg(mem) 3284 return true 3285 } 3286 // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 3287 // cond: x.Uses == 1 && clobber(x) 3288 // result: (MOVWstore [i-1] {s} p w mem) 3289 for { 3290 i := v.AuxInt 3291 s := v.Aux 3292 p := v.Args[0] 3293 v_1 := v.Args[1] 3294 if v_1.Op != Op386SHRLconst { 3295 break 3296 } 3297 if v_1.AuxInt != 8 { 3298 break 3299 } 3300 w := v_1.Args[0] 3301 x := v.Args[2] 3302 if x.Op != Op386MOVBstore { 3303 break 3304 } 3305 if x.AuxInt != i-1 { 3306 break 3307 } 3308 if x.Aux != s { 3309 break 3310 } 3311 if p != x.Args[0] { 3312 break 3313 } 3314 if w != x.Args[1] { 3315 break 3316 } 3317 mem := x.Args[2] 3318 if !(x.Uses == 1 && clobber(x)) { 3319 break 3320 } 3321 v.reset(Op386MOVWstore) 3322 v.AuxInt = i - 1 3323 v.Aux = s 3324 v.AddArg(p) 3325 v.AddArg(w) 3326 v.AddArg(mem) 3327 return true 3328 } 3329 // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) 3330 // cond: x.Uses == 1 && clobber(x) 3331 // result: (MOVWstore [i-1] {s} p w0 mem) 3332 for { 3333 i := v.AuxInt 3334 s := v.Aux 3335 p := v.Args[0] 3336 v_1 := v.Args[1] 3337 if v_1.Op != Op386SHRLconst { 3338 break 3339 } 3340 j := v_1.AuxInt 3341 w := v_1.Args[0] 3342 x := v.Args[2] 3343 if x.Op != Op386MOVBstore { 3344 break 3345 } 3346 if x.AuxInt != i-1 { 3347 break 3348 } 3349 if x.Aux != s { 3350 break 3351 } 3352 if p != x.Args[0] { 3353 break 3354 } 3355 w0 := x.Args[1] 3356 if w0.Op != Op386SHRLconst { 3357 break 3358 } 3359 if w0.AuxInt != j-8 { 3360 break 3361 } 3362 if w != w0.Args[0] { 3363 break 3364 } 3365 mem := x.Args[2] 3366 if !(x.Uses == 1 && clobber(x)) { 3367 break 3368 } 3369 v.reset(Op386MOVWstore) 3370 v.AuxInt = i - 1 3371 v.Aux = s 3372 v.AddArg(p) 3373 v.AddArg(w0) 3374 v.AddArg(mem) 3375 return true 3376 } 3377 return false 3378 } 3379 func rewriteValue386_Op386MOVBstoreconst(v *Value) bool { 3380 b := v.Block 3381 _ = b 3382 config := b.Func.Config 3383 _ = config 3384 // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 3385 // cond: ValAndOff(sc).canAdd(off) 3386 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 3387 for { 3388 sc := v.AuxInt 3389 s := v.Aux 3390 v_0 := v.Args[0] 3391 if v_0.Op != Op386ADDLconst { 3392 break 3393 } 3394 off := v_0.AuxInt 3395 ptr := v_0.Args[0] 3396 mem := v.Args[1] 3397 if !(ValAndOff(sc).canAdd(off)) { 3398 break 3399 } 3400 v.reset(Op386MOVBstoreconst) 3401 v.AuxInt = ValAndOff(sc).add(off) 3402 v.Aux = s 3403 v.AddArg(ptr) 3404 v.AddArg(mem) 3405 return true 3406 } 3407 // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 3408 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 3409 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 3410 for { 3411 sc := v.AuxInt 3412 sym1 := v.Aux 3413 v_0 := v.Args[0] 3414 if v_0.Op != Op386LEAL { 3415 break 3416 } 3417 off := v_0.AuxInt 3418 sym2 := v_0.Aux 3419 ptr := v_0.Args[0] 3420 mem := v.Args[1] 3421 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 3422 break 3423 } 3424 v.reset(Op386MOVBstoreconst) 3425 v.AuxInt = ValAndOff(sc).add(off) 3426 v.Aux = mergeSym(sym1, sym2) 3427 v.AddArg(ptr) 3428 v.AddArg(mem) 3429 return true 3430 } 3431 // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 3432 // cond: canMergeSym(sym1, sym2) 3433 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 3434 for { 3435 x := v.AuxInt 3436 sym1 := v.Aux 3437 v_0 := v.Args[0] 3438 if v_0.Op != Op386LEAL1 { 3439 break 3440 } 3441 off := v_0.AuxInt 3442 sym2 := v_0.Aux 3443 ptr := v_0.Args[0] 3444 idx := v_0.Args[1] 3445 mem := v.Args[1] 3446 if !(canMergeSym(sym1, sym2)) { 3447 break 3448 } 3449 v.reset(Op386MOVBstoreconstidx1) 3450 v.AuxInt = ValAndOff(x).add(off) 3451 v.Aux = mergeSym(sym1, sym2) 3452 v.AddArg(ptr) 3453 v.AddArg(idx) 3454 v.AddArg(mem) 3455 return true 3456 } 3457 // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) 3458 // cond: 3459 // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) 3460 for { 3461 x := v.AuxInt 3462 sym := v.Aux 3463 v_0 := v.Args[0] 3464 if v_0.Op != Op386ADDL { 3465 break 3466 } 3467 ptr := v_0.Args[0] 3468 idx := v_0.Args[1] 3469 mem := v.Args[1] 3470 v.reset(Op386MOVBstoreconstidx1) 3471 v.AuxInt = x 3472 v.Aux = sym 3473 v.AddArg(ptr) 3474 v.AddArg(idx) 3475 v.AddArg(mem) 3476 return true 3477 } 3478 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 3479 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3480 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 3481 for { 3482 c := v.AuxInt 3483 s := v.Aux 3484 p := v.Args[0] 3485 x := v.Args[1] 3486 if x.Op != Op386MOVBstoreconst { 3487 break 3488 } 3489 a := x.AuxInt 3490 if x.Aux != s { 3491 break 3492 } 3493 if p != x.Args[0] { 3494 break 3495 } 3496 mem := x.Args[1] 3497 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3498 break 3499 } 3500 v.reset(Op386MOVWstoreconst) 3501 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3502 v.Aux = s 3503 v.AddArg(p) 3504 v.AddArg(mem) 3505 return true 3506 } 3507 return false 3508 } 3509 func rewriteValue386_Op386MOVBstoreconstidx1(v *Value) bool { 3510 // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 3511 // cond: 3512 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3513 for { 3514 x := v.AuxInt 3515 sym := v.Aux 3516 v_0 := v.Args[0] 3517 if v_0.Op != Op386ADDLconst { 3518 break 3519 } 3520 c := v_0.AuxInt 3521 ptr := v_0.Args[0] 3522 idx := v.Args[1] 3523 mem := v.Args[2] 3524 v.reset(Op386MOVBstoreconstidx1) 3525 v.AuxInt = ValAndOff(x).add(c) 3526 v.Aux = sym 3527 v.AddArg(ptr) 3528 v.AddArg(idx) 3529 v.AddArg(mem) 3530 return true 3531 } 3532 // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 3533 // cond: 3534 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3535 for { 3536 x := v.AuxInt 3537 sym := v.Aux 3538 ptr := v.Args[0] 3539 v_1 := v.Args[1] 3540 if v_1.Op != Op386ADDLconst { 3541 break 3542 } 3543 c := v_1.AuxInt 3544 idx := v_1.Args[0] 3545 mem := v.Args[2] 3546 v.reset(Op386MOVBstoreconstidx1) 3547 v.AuxInt = ValAndOff(x).add(c) 3548 v.Aux = sym 3549 v.AddArg(ptr) 3550 v.AddArg(idx) 3551 v.AddArg(mem) 3552 return true 3553 } 3554 // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) 3555 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3556 // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) 3557 for { 3558 c := v.AuxInt 3559 s := v.Aux 3560 p := v.Args[0] 3561 i := v.Args[1] 3562 x := v.Args[2] 3563 if x.Op != Op386MOVBstoreconstidx1 { 3564 break 3565 } 3566 a := x.AuxInt 3567 if x.Aux != s { 3568 break 3569 } 3570 if p != x.Args[0] { 3571 break 3572 } 3573 if i != x.Args[1] { 3574 break 3575 } 3576 mem := x.Args[2] 3577 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3578 break 3579 } 3580 v.reset(Op386MOVWstoreconstidx1) 3581 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3582 v.Aux = s 3583 v.AddArg(p) 3584 v.AddArg(i) 3585 v.AddArg(mem) 3586 return true 3587 } 3588 return false 3589 } 3590 func rewriteValue386_Op386MOVBstoreidx1(v *Value) bool { 3591 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 3592 // cond: 3593 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3594 for { 3595 c := v.AuxInt 3596 sym := v.Aux 3597 v_0 := v.Args[0] 3598 if v_0.Op != Op386ADDLconst { 3599 break 3600 } 3601 d := v_0.AuxInt 3602 ptr := v_0.Args[0] 3603 idx := v.Args[1] 3604 val := v.Args[2] 3605 mem := v.Args[3] 3606 v.reset(Op386MOVBstoreidx1) 3607 v.AuxInt = c + d 3608 v.Aux = sym 3609 v.AddArg(ptr) 3610 v.AddArg(idx) 3611 v.AddArg(val) 3612 v.AddArg(mem) 3613 return true 3614 } 3615 // match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 3616 // cond: 3617 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3618 for { 3619 c := v.AuxInt 3620 sym := v.Aux 3621 idx := v.Args[0] 3622 v_1 := v.Args[1] 3623 if v_1.Op != Op386ADDLconst { 3624 break 3625 } 3626 d := v_1.AuxInt 3627 ptr := v_1.Args[0] 3628 val := v.Args[2] 3629 mem := v.Args[3] 3630 v.reset(Op386MOVBstoreidx1) 3631 v.AuxInt = c + d 3632 v.Aux = sym 3633 v.AddArg(ptr) 3634 v.AddArg(idx) 3635 v.AddArg(val) 3636 v.AddArg(mem) 3637 return true 3638 } 3639 // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 3640 // cond: 3641 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3642 for { 3643 c := v.AuxInt 3644 sym := v.Aux 3645 ptr := v.Args[0] 3646 v_1 := v.Args[1] 3647 if v_1.Op != Op386ADDLconst { 3648 break 3649 } 3650 d := v_1.AuxInt 3651 idx := v_1.Args[0] 3652 val := v.Args[2] 3653 mem := v.Args[3] 3654 v.reset(Op386MOVBstoreidx1) 3655 v.AuxInt = c + d 3656 v.Aux = sym 3657 v.AddArg(ptr) 3658 v.AddArg(idx) 3659 v.AddArg(val) 3660 v.AddArg(mem) 3661 return true 3662 } 3663 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 3664 // cond: 3665 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3666 for { 3667 c := v.AuxInt 3668 sym := v.Aux 3669 v_0 := v.Args[0] 3670 if v_0.Op != Op386ADDLconst { 3671 break 3672 } 3673 d := v_0.AuxInt 3674 idx := v_0.Args[0] 3675 ptr := v.Args[1] 3676 val := v.Args[2] 3677 mem := v.Args[3] 3678 v.reset(Op386MOVBstoreidx1) 3679 v.AuxInt = c + d 3680 v.Aux = sym 3681 v.AddArg(ptr) 3682 v.AddArg(idx) 3683 v.AddArg(val) 3684 v.AddArg(mem) 3685 return true 3686 } 3687 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3688 // cond: x.Uses == 1 && clobber(x) 3689 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3690 for { 3691 i := v.AuxInt 3692 s := v.Aux 3693 p := v.Args[0] 3694 idx := v.Args[1] 3695 v_2 := v.Args[2] 3696 if v_2.Op != Op386SHRLconst { 3697 break 3698 } 3699 if v_2.AuxInt != 8 { 3700 break 3701 } 3702 w := v_2.Args[0] 3703 x := v.Args[3] 3704 if x.Op != Op386MOVBstoreidx1 { 3705 break 3706 } 3707 if x.AuxInt != i-1 { 3708 break 3709 } 3710 if x.Aux != s { 3711 break 3712 } 3713 if p != x.Args[0] { 3714 break 3715 } 3716 if idx != x.Args[1] { 3717 break 3718 } 3719 if w != x.Args[2] { 3720 break 3721 } 3722 mem := x.Args[3] 3723 if !(x.Uses == 1 && clobber(x)) { 3724 break 3725 } 3726 v.reset(Op386MOVWstoreidx1) 3727 v.AuxInt = i - 1 3728 v.Aux = s 3729 v.AddArg(p) 3730 v.AddArg(idx) 3731 v.AddArg(w) 3732 v.AddArg(mem) 3733 return true 3734 } 3735 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3736 // cond: x.Uses == 1 && clobber(x) 3737 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3738 for { 3739 i := v.AuxInt 3740 s := v.Aux 3741 p := v.Args[0] 3742 idx := v.Args[1] 3743 v_2 := v.Args[2] 3744 if v_2.Op != Op386SHRLconst { 3745 break 3746 } 3747 if v_2.AuxInt != 8 { 3748 break 3749 } 3750 w := v_2.Args[0] 3751 x := v.Args[3] 3752 if x.Op != Op386MOVBstoreidx1 { 3753 break 3754 } 3755 if x.AuxInt != i-1 { 3756 break 3757 } 3758 if x.Aux != s { 3759 break 3760 } 3761 if idx != x.Args[0] { 3762 break 3763 } 3764 if p != x.Args[1] { 3765 break 3766 } 3767 if w != x.Args[2] { 3768 break 3769 } 3770 mem := x.Args[3] 3771 if !(x.Uses == 1 && clobber(x)) { 3772 break 3773 } 3774 v.reset(Op386MOVWstoreidx1) 3775 v.AuxInt = i - 1 3776 v.Aux = s 3777 v.AddArg(p) 3778 v.AddArg(idx) 3779 v.AddArg(w) 3780 v.AddArg(mem) 3781 return true 3782 } 3783 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3784 // cond: x.Uses == 1 && clobber(x) 3785 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3786 for { 3787 i := v.AuxInt 3788 s := v.Aux 3789 idx := v.Args[0] 3790 p := v.Args[1] 3791 v_2 := v.Args[2] 3792 if v_2.Op != Op386SHRLconst { 3793 break 3794 } 3795 if v_2.AuxInt != 8 { 3796 break 3797 } 3798 w := v_2.Args[0] 3799 x := v.Args[3] 3800 if x.Op != Op386MOVBstoreidx1 { 3801 break 3802 } 3803 if x.AuxInt != i-1 { 3804 break 3805 } 3806 if x.Aux != s { 3807 break 3808 } 3809 if p != x.Args[0] { 3810 break 3811 } 3812 if idx != x.Args[1] { 3813 break 3814 } 3815 if w != x.Args[2] { 3816 break 3817 } 3818 mem := x.Args[3] 3819 if !(x.Uses == 1 && clobber(x)) { 3820 break 3821 } 3822 v.reset(Op386MOVWstoreidx1) 3823 v.AuxInt = i - 1 3824 v.Aux = s 3825 v.AddArg(p) 3826 v.AddArg(idx) 3827 v.AddArg(w) 3828 v.AddArg(mem) 3829 return true 3830 } 3831 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3832 // cond: x.Uses == 1 && clobber(x) 3833 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3834 for { 3835 i := v.AuxInt 3836 s := v.Aux 3837 idx := v.Args[0] 3838 p := v.Args[1] 3839 v_2 := v.Args[2] 3840 if v_2.Op != Op386SHRLconst { 3841 break 3842 } 3843 if v_2.AuxInt != 8 { 3844 break 3845 } 3846 w := v_2.Args[0] 3847 x := v.Args[3] 3848 if x.Op != Op386MOVBstoreidx1 { 3849 break 3850 } 3851 if x.AuxInt != i-1 { 3852 break 3853 } 3854 if x.Aux != s { 3855 break 3856 } 3857 if idx != x.Args[0] { 3858 break 3859 } 3860 if p != x.Args[1] { 3861 break 3862 } 3863 if w != x.Args[2] { 3864 break 3865 } 3866 mem := x.Args[3] 3867 if !(x.Uses == 1 && clobber(x)) { 3868 break 3869 } 3870 v.reset(Op386MOVWstoreidx1) 3871 v.AuxInt = i - 1 3872 v.Aux = s 3873 v.AddArg(p) 3874 v.AddArg(idx) 3875 v.AddArg(w) 3876 v.AddArg(mem) 3877 return true 3878 } 3879 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 3880 // cond: x.Uses == 1 && clobber(x) 3881 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 3882 for { 3883 i := v.AuxInt 3884 s := v.Aux 3885 p := v.Args[0] 3886 idx := v.Args[1] 3887 v_2 := v.Args[2] 3888 if v_2.Op != Op386SHRLconst { 3889 break 3890 } 3891 j := v_2.AuxInt 3892 w := v_2.Args[0] 3893 x := v.Args[3] 3894 if x.Op != Op386MOVBstoreidx1 { 3895 break 3896 } 3897 if x.AuxInt != i-1 { 3898 break 3899 } 3900 if x.Aux != s { 3901 break 3902 } 3903 if p != x.Args[0] { 3904 break 3905 } 3906 if idx != x.Args[1] { 3907 break 3908 } 3909 w0 := x.Args[2] 3910 if w0.Op != Op386SHRLconst { 3911 break 3912 } 3913 if w0.AuxInt != j-8 { 3914 break 3915 } 3916 if w != w0.Args[0] { 3917 break 3918 } 3919 mem := x.Args[3] 3920 if !(x.Uses == 1 && clobber(x)) { 3921 break 3922 } 3923 v.reset(Op386MOVWstoreidx1) 3924 v.AuxInt = i - 1 3925 v.Aux = s 3926 v.AddArg(p) 3927 v.AddArg(idx) 3928 v.AddArg(w0) 3929 v.AddArg(mem) 3930 return true 3931 } 3932 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 3933 // cond: x.Uses == 1 && clobber(x) 3934 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 3935 for { 3936 i := v.AuxInt 3937 s := v.Aux 3938 p := v.Args[0] 3939 idx := v.Args[1] 3940 v_2 := v.Args[2] 3941 if v_2.Op != Op386SHRLconst { 3942 break 3943 } 3944 j := v_2.AuxInt 3945 w := v_2.Args[0] 3946 x := v.Args[3] 3947 if x.Op != Op386MOVBstoreidx1 { 3948 break 3949 } 3950 if x.AuxInt != i-1 { 3951 break 3952 } 3953 if x.Aux != s { 3954 break 3955 } 3956 if idx != x.Args[0] { 3957 break 3958 } 3959 if p != x.Args[1] { 3960 break 3961 } 3962 w0 := x.Args[2] 3963 if w0.Op != Op386SHRLconst { 3964 break 3965 } 3966 if w0.AuxInt != j-8 { 3967 break 3968 } 3969 if w != w0.Args[0] { 3970 break 3971 } 3972 mem := x.Args[3] 3973 if !(x.Uses == 1 && clobber(x)) { 3974 break 3975 } 3976 v.reset(Op386MOVWstoreidx1) 3977 v.AuxInt = i - 1 3978 v.Aux = s 3979 v.AddArg(p) 3980 v.AddArg(idx) 3981 v.AddArg(w0) 3982 v.AddArg(mem) 3983 return true 3984 } 3985 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 3986 // cond: x.Uses == 1 && clobber(x) 3987 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 3988 for { 3989 i := v.AuxInt 3990 s := v.Aux 3991 idx := v.Args[0] 3992 p := v.Args[1] 3993 v_2 := v.Args[2] 3994 if v_2.Op != Op386SHRLconst { 3995 break 3996 } 3997 j := v_2.AuxInt 3998 w := v_2.Args[0] 3999 x := v.Args[3] 4000 if x.Op != Op386MOVBstoreidx1 { 4001 break 4002 } 4003 if x.AuxInt != i-1 { 4004 break 4005 } 4006 if x.Aux != s { 4007 break 4008 } 4009 if p != x.Args[0] { 4010 break 4011 } 4012 if idx != x.Args[1] { 4013 break 4014 } 4015 w0 := x.Args[2] 4016 if w0.Op != Op386SHRLconst { 4017 break 4018 } 4019 if w0.AuxInt != j-8 { 4020 break 4021 } 4022 if w != w0.Args[0] { 4023 break 4024 } 4025 mem := x.Args[3] 4026 if !(x.Uses == 1 && clobber(x)) { 4027 break 4028 } 4029 v.reset(Op386MOVWstoreidx1) 4030 v.AuxInt = i - 1 4031 v.Aux = s 4032 v.AddArg(p) 4033 v.AddArg(idx) 4034 v.AddArg(w0) 4035 v.AddArg(mem) 4036 return true 4037 } 4038 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 4039 // cond: x.Uses == 1 && clobber(x) 4040 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4041 for { 4042 i := v.AuxInt 4043 s := v.Aux 4044 idx := v.Args[0] 4045 p := v.Args[1] 4046 v_2 := v.Args[2] 4047 if v_2.Op != Op386SHRLconst { 4048 break 4049 } 4050 j := v_2.AuxInt 4051 w := v_2.Args[0] 4052 x := v.Args[3] 4053 if x.Op != Op386MOVBstoreidx1 { 4054 break 4055 } 4056 if x.AuxInt != i-1 { 4057 break 4058 } 4059 if x.Aux != s { 4060 break 4061 } 4062 if idx != x.Args[0] { 4063 break 4064 } 4065 if p != x.Args[1] { 4066 break 4067 } 4068 w0 := x.Args[2] 4069 if w0.Op != Op386SHRLconst { 4070 break 4071 } 4072 if w0.AuxInt != j-8 { 4073 break 4074 } 4075 if w != w0.Args[0] { 4076 break 4077 } 4078 mem := x.Args[3] 4079 if !(x.Uses == 1 && clobber(x)) { 4080 break 4081 } 4082 v.reset(Op386MOVWstoreidx1) 4083 v.AuxInt = i - 1 4084 v.Aux = s 4085 v.AddArg(p) 4086 v.AddArg(idx) 4087 v.AddArg(w0) 4088 v.AddArg(mem) 4089 return true 4090 } 4091 return false 4092 } 4093 func rewriteValue386_Op386MOVLload(v *Value) bool { 4094 b := v.Block 4095 _ = b 4096 config := b.Func.Config 4097 _ = config 4098 // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) 4099 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4100 // result: x 4101 for { 4102 off := v.AuxInt 4103 sym := v.Aux 4104 ptr := v.Args[0] 4105 v_1 := v.Args[1] 4106 if v_1.Op != Op386MOVLstore { 4107 break 4108 } 4109 off2 := v_1.AuxInt 4110 sym2 := v_1.Aux 4111 ptr2 := v_1.Args[0] 4112 x := v_1.Args[1] 4113 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4114 break 4115 } 4116 v.reset(OpCopy) 4117 v.Type = x.Type 4118 v.AddArg(x) 4119 return true 4120 } 4121 // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) 4122 // cond: is32Bit(off1+off2) 4123 // result: (MOVLload [off1+off2] {sym} ptr mem) 4124 for { 4125 off1 := v.AuxInt 4126 sym := v.Aux 4127 v_0 := v.Args[0] 4128 if v_0.Op != Op386ADDLconst { 4129 break 4130 } 4131 off2 := v_0.AuxInt 4132 ptr := v_0.Args[0] 4133 mem := v.Args[1] 4134 if !(is32Bit(off1 + off2)) { 4135 break 4136 } 4137 v.reset(Op386MOVLload) 4138 v.AuxInt = off1 + off2 4139 v.Aux = sym 4140 v.AddArg(ptr) 4141 v.AddArg(mem) 4142 return true 4143 } 4144 // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 4145 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4146 // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) 4147 for { 4148 off1 := v.AuxInt 4149 sym1 := v.Aux 4150 v_0 := v.Args[0] 4151 if v_0.Op != Op386LEAL { 4152 break 4153 } 4154 off2 := v_0.AuxInt 4155 sym2 := v_0.Aux 4156 base := v_0.Args[0] 4157 mem := v.Args[1] 4158 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4159 break 4160 } 4161 v.reset(Op386MOVLload) 4162 v.AuxInt = off1 + off2 4163 v.Aux = mergeSym(sym1, sym2) 4164 v.AddArg(base) 4165 v.AddArg(mem) 4166 return true 4167 } 4168 // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 4169 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4170 // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4171 for { 4172 off1 := v.AuxInt 4173 sym1 := v.Aux 4174 v_0 := v.Args[0] 4175 if v_0.Op != Op386LEAL1 { 4176 break 4177 } 4178 off2 := v_0.AuxInt 4179 sym2 := v_0.Aux 4180 ptr := v_0.Args[0] 4181 idx := v_0.Args[1] 4182 mem := v.Args[1] 4183 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4184 break 4185 } 4186 v.reset(Op386MOVLloadidx1) 4187 v.AuxInt = off1 + off2 4188 v.Aux = mergeSym(sym1, sym2) 4189 v.AddArg(ptr) 4190 v.AddArg(idx) 4191 v.AddArg(mem) 4192 return true 4193 } 4194 // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 4195 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4196 // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4197 for { 4198 off1 := v.AuxInt 4199 sym1 := v.Aux 4200 v_0 := v.Args[0] 4201 if v_0.Op != Op386LEAL4 { 4202 break 4203 } 4204 off2 := v_0.AuxInt 4205 sym2 := v_0.Aux 4206 ptr := v_0.Args[0] 4207 idx := v_0.Args[1] 4208 mem := v.Args[1] 4209 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4210 break 4211 } 4212 v.reset(Op386MOVLloadidx4) 4213 v.AuxInt = off1 + off2 4214 v.Aux = mergeSym(sym1, sym2) 4215 v.AddArg(ptr) 4216 v.AddArg(idx) 4217 v.AddArg(mem) 4218 return true 4219 } 4220 // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) 4221 // cond: ptr.Op != OpSB 4222 // result: (MOVLloadidx1 [off] {sym} ptr idx mem) 4223 for { 4224 off := v.AuxInt 4225 sym := v.Aux 4226 v_0 := v.Args[0] 4227 if v_0.Op != Op386ADDL { 4228 break 4229 } 4230 ptr := v_0.Args[0] 4231 idx := v_0.Args[1] 4232 mem := v.Args[1] 4233 if !(ptr.Op != OpSB) { 4234 break 4235 } 4236 v.reset(Op386MOVLloadidx1) 4237 v.AuxInt = off 4238 v.Aux = sym 4239 v.AddArg(ptr) 4240 v.AddArg(idx) 4241 v.AddArg(mem) 4242 return true 4243 } 4244 return false 4245 } 4246 func rewriteValue386_Op386MOVLloadidx1(v *Value) bool { 4247 // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4248 // cond: 4249 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4250 for { 4251 c := v.AuxInt 4252 sym := v.Aux 4253 ptr := v.Args[0] 4254 v_1 := v.Args[1] 4255 if v_1.Op != Op386SHLLconst { 4256 break 4257 } 4258 if v_1.AuxInt != 2 { 4259 break 4260 } 4261 idx := v_1.Args[0] 4262 mem := v.Args[2] 4263 v.reset(Op386MOVLloadidx4) 4264 v.AuxInt = c 4265 v.Aux = sym 4266 v.AddArg(ptr) 4267 v.AddArg(idx) 4268 v.AddArg(mem) 4269 return true 4270 } 4271 // match: (MOVLloadidx1 [c] {sym} (SHLLconst [2] idx) ptr mem) 4272 // cond: 4273 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4274 for { 4275 c := v.AuxInt 4276 sym := v.Aux 4277 v_0 := v.Args[0] 4278 if v_0.Op != Op386SHLLconst { 4279 break 4280 } 4281 if v_0.AuxInt != 2 { 4282 break 4283 } 4284 idx := v_0.Args[0] 4285 ptr := v.Args[1] 4286 mem := v.Args[2] 4287 v.reset(Op386MOVLloadidx4) 4288 v.AuxInt = c 4289 v.Aux = sym 4290 v.AddArg(ptr) 4291 v.AddArg(idx) 4292 v.AddArg(mem) 4293 return true 4294 } 4295 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 4296 // cond: 4297 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4298 for { 4299 c := v.AuxInt 4300 sym := v.Aux 4301 v_0 := v.Args[0] 4302 if v_0.Op != Op386ADDLconst { 4303 break 4304 } 4305 d := v_0.AuxInt 4306 ptr := v_0.Args[0] 4307 idx := v.Args[1] 4308 mem := v.Args[2] 4309 v.reset(Op386MOVLloadidx1) 4310 v.AuxInt = c + d 4311 v.Aux = sym 4312 v.AddArg(ptr) 4313 v.AddArg(idx) 4314 v.AddArg(mem) 4315 return true 4316 } 4317 // match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 4318 // cond: 4319 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4320 for { 4321 c := v.AuxInt 4322 sym := v.Aux 4323 idx := v.Args[0] 4324 v_1 := v.Args[1] 4325 if v_1.Op != Op386ADDLconst { 4326 break 4327 } 4328 d := v_1.AuxInt 4329 ptr := v_1.Args[0] 4330 mem := v.Args[2] 4331 v.reset(Op386MOVLloadidx1) 4332 v.AuxInt = c + d 4333 v.Aux = sym 4334 v.AddArg(ptr) 4335 v.AddArg(idx) 4336 v.AddArg(mem) 4337 return true 4338 } 4339 // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 4340 // cond: 4341 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4342 for { 4343 c := v.AuxInt 4344 sym := v.Aux 4345 ptr := v.Args[0] 4346 v_1 := v.Args[1] 4347 if v_1.Op != Op386ADDLconst { 4348 break 4349 } 4350 d := v_1.AuxInt 4351 idx := v_1.Args[0] 4352 mem := v.Args[2] 4353 v.reset(Op386MOVLloadidx1) 4354 v.AuxInt = c + d 4355 v.Aux = sym 4356 v.AddArg(ptr) 4357 v.AddArg(idx) 4358 v.AddArg(mem) 4359 return true 4360 } 4361 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 4362 // cond: 4363 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4364 for { 4365 c := v.AuxInt 4366 sym := v.Aux 4367 v_0 := v.Args[0] 4368 if v_0.Op != Op386ADDLconst { 4369 break 4370 } 4371 d := v_0.AuxInt 4372 idx := v_0.Args[0] 4373 ptr := v.Args[1] 4374 mem := v.Args[2] 4375 v.reset(Op386MOVLloadidx1) 4376 v.AuxInt = c + d 4377 v.Aux = sym 4378 v.AddArg(ptr) 4379 v.AddArg(idx) 4380 v.AddArg(mem) 4381 return true 4382 } 4383 return false 4384 } 4385 func rewriteValue386_Op386MOVLloadidx4(v *Value) bool { 4386 // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 4387 // cond: 4388 // result: (MOVLloadidx4 [c+d] {sym} ptr idx mem) 4389 for { 4390 c := v.AuxInt 4391 sym := v.Aux 4392 v_0 := v.Args[0] 4393 if v_0.Op != Op386ADDLconst { 4394 break 4395 } 4396 d := v_0.AuxInt 4397 ptr := v_0.Args[0] 4398 idx := v.Args[1] 4399 mem := v.Args[2] 4400 v.reset(Op386MOVLloadidx4) 4401 v.AuxInt = c + d 4402 v.Aux = sym 4403 v.AddArg(ptr) 4404 v.AddArg(idx) 4405 v.AddArg(mem) 4406 return true 4407 } 4408 // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 4409 // cond: 4410 // result: (MOVLloadidx4 [c+4*d] {sym} ptr idx mem) 4411 for { 4412 c := v.AuxInt 4413 sym := v.Aux 4414 ptr := v.Args[0] 4415 v_1 := v.Args[1] 4416 if v_1.Op != Op386ADDLconst { 4417 break 4418 } 4419 d := v_1.AuxInt 4420 idx := v_1.Args[0] 4421 mem := v.Args[2] 4422 v.reset(Op386MOVLloadidx4) 4423 v.AuxInt = c + 4*d 4424 v.Aux = sym 4425 v.AddArg(ptr) 4426 v.AddArg(idx) 4427 v.AddArg(mem) 4428 return true 4429 } 4430 return false 4431 } 4432 func rewriteValue386_Op386MOVLstore(v *Value) bool { 4433 b := v.Block 4434 _ = b 4435 config := b.Func.Config 4436 _ = config 4437 // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 4438 // cond: is32Bit(off1+off2) 4439 // result: (MOVLstore [off1+off2] {sym} ptr val mem) 4440 for { 4441 off1 := v.AuxInt 4442 sym := v.Aux 4443 v_0 := v.Args[0] 4444 if v_0.Op != Op386ADDLconst { 4445 break 4446 } 4447 off2 := v_0.AuxInt 4448 ptr := v_0.Args[0] 4449 val := v.Args[1] 4450 mem := v.Args[2] 4451 if !(is32Bit(off1 + off2)) { 4452 break 4453 } 4454 v.reset(Op386MOVLstore) 4455 v.AuxInt = off1 + off2 4456 v.Aux = sym 4457 v.AddArg(ptr) 4458 v.AddArg(val) 4459 v.AddArg(mem) 4460 return true 4461 } 4462 // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) 4463 // cond: validOff(off) 4464 // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 4465 for { 4466 off := v.AuxInt 4467 sym := v.Aux 4468 ptr := v.Args[0] 4469 v_1 := v.Args[1] 4470 if v_1.Op != Op386MOVLconst { 4471 break 4472 } 4473 c := v_1.AuxInt 4474 mem := v.Args[2] 4475 if !(validOff(off)) { 4476 break 4477 } 4478 v.reset(Op386MOVLstoreconst) 4479 v.AuxInt = makeValAndOff(int64(int32(c)), off) 4480 v.Aux = sym 4481 v.AddArg(ptr) 4482 v.AddArg(mem) 4483 return true 4484 } 4485 // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 4486 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4487 // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 4488 for { 4489 off1 := v.AuxInt 4490 sym1 := v.Aux 4491 v_0 := v.Args[0] 4492 if v_0.Op != Op386LEAL { 4493 break 4494 } 4495 off2 := v_0.AuxInt 4496 sym2 := v_0.Aux 4497 base := v_0.Args[0] 4498 val := v.Args[1] 4499 mem := v.Args[2] 4500 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4501 break 4502 } 4503 v.reset(Op386MOVLstore) 4504 v.AuxInt = off1 + off2 4505 v.Aux = mergeSym(sym1, sym2) 4506 v.AddArg(base) 4507 v.AddArg(val) 4508 v.AddArg(mem) 4509 return true 4510 } 4511 // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 4512 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4513 // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4514 for { 4515 off1 := v.AuxInt 4516 sym1 := v.Aux 4517 v_0 := v.Args[0] 4518 if v_0.Op != Op386LEAL1 { 4519 break 4520 } 4521 off2 := v_0.AuxInt 4522 sym2 := v_0.Aux 4523 ptr := v_0.Args[0] 4524 idx := v_0.Args[1] 4525 val := v.Args[1] 4526 mem := v.Args[2] 4527 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4528 break 4529 } 4530 v.reset(Op386MOVLstoreidx1) 4531 v.AuxInt = off1 + off2 4532 v.Aux = mergeSym(sym1, sym2) 4533 v.AddArg(ptr) 4534 v.AddArg(idx) 4535 v.AddArg(val) 4536 v.AddArg(mem) 4537 return true 4538 } 4539 // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 4540 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4541 // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4542 for { 4543 off1 := v.AuxInt 4544 sym1 := v.Aux 4545 v_0 := v.Args[0] 4546 if v_0.Op != Op386LEAL4 { 4547 break 4548 } 4549 off2 := v_0.AuxInt 4550 sym2 := v_0.Aux 4551 ptr := v_0.Args[0] 4552 idx := v_0.Args[1] 4553 val := v.Args[1] 4554 mem := v.Args[2] 4555 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4556 break 4557 } 4558 v.reset(Op386MOVLstoreidx4) 4559 v.AuxInt = off1 + off2 4560 v.Aux = mergeSym(sym1, sym2) 4561 v.AddArg(ptr) 4562 v.AddArg(idx) 4563 v.AddArg(val) 4564 v.AddArg(mem) 4565 return true 4566 } 4567 // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) 4568 // cond: ptr.Op != OpSB 4569 // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) 4570 for { 4571 off := v.AuxInt 4572 sym := v.Aux 4573 v_0 := v.Args[0] 4574 if v_0.Op != Op386ADDL { 4575 break 4576 } 4577 ptr := v_0.Args[0] 4578 idx := v_0.Args[1] 4579 val := v.Args[1] 4580 mem := v.Args[2] 4581 if !(ptr.Op != OpSB) { 4582 break 4583 } 4584 v.reset(Op386MOVLstoreidx1) 4585 v.AuxInt = off 4586 v.Aux = sym 4587 v.AddArg(ptr) 4588 v.AddArg(idx) 4589 v.AddArg(val) 4590 v.AddArg(mem) 4591 return true 4592 } 4593 return false 4594 } 4595 func rewriteValue386_Op386MOVLstoreconst(v *Value) bool { 4596 b := v.Block 4597 _ = b 4598 config := b.Func.Config 4599 _ = config 4600 // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 4601 // cond: ValAndOff(sc).canAdd(off) 4602 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 4603 for { 4604 sc := v.AuxInt 4605 s := v.Aux 4606 v_0 := v.Args[0] 4607 if v_0.Op != Op386ADDLconst { 4608 break 4609 } 4610 off := v_0.AuxInt 4611 ptr := v_0.Args[0] 4612 mem := v.Args[1] 4613 if !(ValAndOff(sc).canAdd(off)) { 4614 break 4615 } 4616 v.reset(Op386MOVLstoreconst) 4617 v.AuxInt = ValAndOff(sc).add(off) 4618 v.Aux = s 4619 v.AddArg(ptr) 4620 v.AddArg(mem) 4621 return true 4622 } 4623 // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 4624 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 4625 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 4626 for { 4627 sc := v.AuxInt 4628 sym1 := v.Aux 4629 v_0 := v.Args[0] 4630 if v_0.Op != Op386LEAL { 4631 break 4632 } 4633 off := v_0.AuxInt 4634 sym2 := v_0.Aux 4635 ptr := v_0.Args[0] 4636 mem := v.Args[1] 4637 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 4638 break 4639 } 4640 v.reset(Op386MOVLstoreconst) 4641 v.AuxInt = ValAndOff(sc).add(off) 4642 v.Aux = mergeSym(sym1, sym2) 4643 v.AddArg(ptr) 4644 v.AddArg(mem) 4645 return true 4646 } 4647 // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 4648 // cond: canMergeSym(sym1, sym2) 4649 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4650 for { 4651 x := v.AuxInt 4652 sym1 := v.Aux 4653 v_0 := v.Args[0] 4654 if v_0.Op != Op386LEAL1 { 4655 break 4656 } 4657 off := v_0.AuxInt 4658 sym2 := v_0.Aux 4659 ptr := v_0.Args[0] 4660 idx := v_0.Args[1] 4661 mem := v.Args[1] 4662 if !(canMergeSym(sym1, sym2)) { 4663 break 4664 } 4665 v.reset(Op386MOVLstoreconstidx1) 4666 v.AuxInt = ValAndOff(x).add(off) 4667 v.Aux = mergeSym(sym1, sym2) 4668 v.AddArg(ptr) 4669 v.AddArg(idx) 4670 v.AddArg(mem) 4671 return true 4672 } 4673 // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) 4674 // cond: canMergeSym(sym1, sym2) 4675 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4676 for { 4677 x := v.AuxInt 4678 sym1 := v.Aux 4679 v_0 := v.Args[0] 4680 if v_0.Op != Op386LEAL4 { 4681 break 4682 } 4683 off := v_0.AuxInt 4684 sym2 := v_0.Aux 4685 ptr := v_0.Args[0] 4686 idx := v_0.Args[1] 4687 mem := v.Args[1] 4688 if !(canMergeSym(sym1, sym2)) { 4689 break 4690 } 4691 v.reset(Op386MOVLstoreconstidx4) 4692 v.AuxInt = ValAndOff(x).add(off) 4693 v.Aux = mergeSym(sym1, sym2) 4694 v.AddArg(ptr) 4695 v.AddArg(idx) 4696 v.AddArg(mem) 4697 return true 4698 } 4699 // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) 4700 // cond: 4701 // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) 4702 for { 4703 x := v.AuxInt 4704 sym := v.Aux 4705 v_0 := v.Args[0] 4706 if v_0.Op != Op386ADDL { 4707 break 4708 } 4709 ptr := v_0.Args[0] 4710 idx := v_0.Args[1] 4711 mem := v.Args[1] 4712 v.reset(Op386MOVLstoreconstidx1) 4713 v.AuxInt = x 4714 v.Aux = sym 4715 v.AddArg(ptr) 4716 v.AddArg(idx) 4717 v.AddArg(mem) 4718 return true 4719 } 4720 return false 4721 } 4722 func rewriteValue386_Op386MOVLstoreconstidx1(v *Value) bool { 4723 // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4724 // cond: 4725 // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) 4726 for { 4727 c := v.AuxInt 4728 sym := v.Aux 4729 ptr := v.Args[0] 4730 v_1 := v.Args[1] 4731 if v_1.Op != Op386SHLLconst { 4732 break 4733 } 4734 if v_1.AuxInt != 2 { 4735 break 4736 } 4737 idx := v_1.Args[0] 4738 mem := v.Args[2] 4739 v.reset(Op386MOVLstoreconstidx4) 4740 v.AuxInt = c 4741 v.Aux = sym 4742 v.AddArg(ptr) 4743 v.AddArg(idx) 4744 v.AddArg(mem) 4745 return true 4746 } 4747 // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 4748 // cond: 4749 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4750 for { 4751 x := v.AuxInt 4752 sym := v.Aux 4753 v_0 := v.Args[0] 4754 if v_0.Op != Op386ADDLconst { 4755 break 4756 } 4757 c := v_0.AuxInt 4758 ptr := v_0.Args[0] 4759 idx := v.Args[1] 4760 mem := v.Args[2] 4761 v.reset(Op386MOVLstoreconstidx1) 4762 v.AuxInt = ValAndOff(x).add(c) 4763 v.Aux = sym 4764 v.AddArg(ptr) 4765 v.AddArg(idx) 4766 v.AddArg(mem) 4767 return true 4768 } 4769 // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 4770 // cond: 4771 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4772 for { 4773 x := v.AuxInt 4774 sym := v.Aux 4775 ptr := v.Args[0] 4776 v_1 := v.Args[1] 4777 if v_1.Op != Op386ADDLconst { 4778 break 4779 } 4780 c := v_1.AuxInt 4781 idx := v_1.Args[0] 4782 mem := v.Args[2] 4783 v.reset(Op386MOVLstoreconstidx1) 4784 v.AuxInt = ValAndOff(x).add(c) 4785 v.Aux = sym 4786 v.AddArg(ptr) 4787 v.AddArg(idx) 4788 v.AddArg(mem) 4789 return true 4790 } 4791 return false 4792 } 4793 func rewriteValue386_Op386MOVLstoreconstidx4(v *Value) bool { 4794 // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) 4795 // cond: 4796 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4797 for { 4798 x := v.AuxInt 4799 sym := v.Aux 4800 v_0 := v.Args[0] 4801 if v_0.Op != Op386ADDLconst { 4802 break 4803 } 4804 c := v_0.AuxInt 4805 ptr := v_0.Args[0] 4806 idx := v.Args[1] 4807 mem := v.Args[2] 4808 v.reset(Op386MOVLstoreconstidx4) 4809 v.AuxInt = ValAndOff(x).add(c) 4810 v.Aux = sym 4811 v.AddArg(ptr) 4812 v.AddArg(idx) 4813 v.AddArg(mem) 4814 return true 4815 } 4816 // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) 4817 // cond: 4818 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) 4819 for { 4820 x := v.AuxInt 4821 sym := v.Aux 4822 ptr := v.Args[0] 4823 v_1 := v.Args[1] 4824 if v_1.Op != Op386ADDLconst { 4825 break 4826 } 4827 c := v_1.AuxInt 4828 idx := v_1.Args[0] 4829 mem := v.Args[2] 4830 v.reset(Op386MOVLstoreconstidx4) 4831 v.AuxInt = ValAndOff(x).add(4 * c) 4832 v.Aux = sym 4833 v.AddArg(ptr) 4834 v.AddArg(idx) 4835 v.AddArg(mem) 4836 return true 4837 } 4838 return false 4839 } 4840 func rewriteValue386_Op386MOVLstoreidx1(v *Value) bool { 4841 // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) 4842 // cond: 4843 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 4844 for { 4845 c := v.AuxInt 4846 sym := v.Aux 4847 ptr := v.Args[0] 4848 v_1 := v.Args[1] 4849 if v_1.Op != Op386SHLLconst { 4850 break 4851 } 4852 if v_1.AuxInt != 2 { 4853 break 4854 } 4855 idx := v_1.Args[0] 4856 val := v.Args[2] 4857 mem := v.Args[3] 4858 v.reset(Op386MOVLstoreidx4) 4859 v.AuxInt = c 4860 v.Aux = sym 4861 v.AddArg(ptr) 4862 v.AddArg(idx) 4863 v.AddArg(val) 4864 v.AddArg(mem) 4865 return true 4866 } 4867 // match: (MOVLstoreidx1 [c] {sym} (SHLLconst [2] idx) ptr val mem) 4868 // cond: 4869 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 4870 for { 4871 c := v.AuxInt 4872 sym := v.Aux 4873 v_0 := v.Args[0] 4874 if v_0.Op != Op386SHLLconst { 4875 break 4876 } 4877 if v_0.AuxInt != 2 { 4878 break 4879 } 4880 idx := v_0.Args[0] 4881 ptr := v.Args[1] 4882 val := v.Args[2] 4883 mem := v.Args[3] 4884 v.reset(Op386MOVLstoreidx4) 4885 v.AuxInt = c 4886 v.Aux = sym 4887 v.AddArg(ptr) 4888 v.AddArg(idx) 4889 v.AddArg(val) 4890 v.AddArg(mem) 4891 return true 4892 } 4893 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4894 // cond: 4895 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4896 for { 4897 c := v.AuxInt 4898 sym := v.Aux 4899 v_0 := v.Args[0] 4900 if v_0.Op != Op386ADDLconst { 4901 break 4902 } 4903 d := v_0.AuxInt 4904 ptr := v_0.Args[0] 4905 idx := v.Args[1] 4906 val := v.Args[2] 4907 mem := v.Args[3] 4908 v.reset(Op386MOVLstoreidx1) 4909 v.AuxInt = c + d 4910 v.Aux = sym 4911 v.AddArg(ptr) 4912 v.AddArg(idx) 4913 v.AddArg(val) 4914 v.AddArg(mem) 4915 return true 4916 } 4917 // match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 4918 // cond: 4919 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4920 for { 4921 c := v.AuxInt 4922 sym := v.Aux 4923 idx := v.Args[0] 4924 v_1 := v.Args[1] 4925 if v_1.Op != Op386ADDLconst { 4926 break 4927 } 4928 d := v_1.AuxInt 4929 ptr := v_1.Args[0] 4930 val := v.Args[2] 4931 mem := v.Args[3] 4932 v.reset(Op386MOVLstoreidx1) 4933 v.AuxInt = c + d 4934 v.Aux = sym 4935 v.AddArg(ptr) 4936 v.AddArg(idx) 4937 v.AddArg(val) 4938 v.AddArg(mem) 4939 return true 4940 } 4941 // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 4942 // cond: 4943 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4944 for { 4945 c := v.AuxInt 4946 sym := v.Aux 4947 ptr := v.Args[0] 4948 v_1 := v.Args[1] 4949 if v_1.Op != Op386ADDLconst { 4950 break 4951 } 4952 d := v_1.AuxInt 4953 idx := v_1.Args[0] 4954 val := v.Args[2] 4955 mem := v.Args[3] 4956 v.reset(Op386MOVLstoreidx1) 4957 v.AuxInt = c + d 4958 v.Aux = sym 4959 v.AddArg(ptr) 4960 v.AddArg(idx) 4961 v.AddArg(val) 4962 v.AddArg(mem) 4963 return true 4964 } 4965 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 4966 // cond: 4967 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4968 for { 4969 c := v.AuxInt 4970 sym := v.Aux 4971 v_0 := v.Args[0] 4972 if v_0.Op != Op386ADDLconst { 4973 break 4974 } 4975 d := v_0.AuxInt 4976 idx := v_0.Args[0] 4977 ptr := v.Args[1] 4978 val := v.Args[2] 4979 mem := v.Args[3] 4980 v.reset(Op386MOVLstoreidx1) 4981 v.AuxInt = c + d 4982 v.Aux = sym 4983 v.AddArg(ptr) 4984 v.AddArg(idx) 4985 v.AddArg(val) 4986 v.AddArg(mem) 4987 return true 4988 } 4989 return false 4990 } 4991 func rewriteValue386_Op386MOVLstoreidx4(v *Value) bool { 4992 // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4993 // cond: 4994 // result: (MOVLstoreidx4 [c+d] {sym} ptr idx val mem) 4995 for { 4996 c := v.AuxInt 4997 sym := v.Aux 4998 v_0 := v.Args[0] 4999 if v_0.Op != Op386ADDLconst { 5000 break 5001 } 5002 d := v_0.AuxInt 5003 ptr := v_0.Args[0] 5004 idx := v.Args[1] 5005 val := v.Args[2] 5006 mem := v.Args[3] 5007 v.reset(Op386MOVLstoreidx4) 5008 v.AuxInt = c + d 5009 v.Aux = sym 5010 v.AddArg(ptr) 5011 v.AddArg(idx) 5012 v.AddArg(val) 5013 v.AddArg(mem) 5014 return true 5015 } 5016 // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5017 // cond: 5018 // result: (MOVLstoreidx4 [c+4*d] {sym} ptr idx val mem) 5019 for { 5020 c := v.AuxInt 5021 sym := v.Aux 5022 ptr := v.Args[0] 5023 v_1 := v.Args[1] 5024 if v_1.Op != Op386ADDLconst { 5025 break 5026 } 5027 d := v_1.AuxInt 5028 idx := v_1.Args[0] 5029 val := v.Args[2] 5030 mem := v.Args[3] 5031 v.reset(Op386MOVLstoreidx4) 5032 v.AuxInt = c + 4*d 5033 v.Aux = sym 5034 v.AddArg(ptr) 5035 v.AddArg(idx) 5036 v.AddArg(val) 5037 v.AddArg(mem) 5038 return true 5039 } 5040 return false 5041 } 5042 func rewriteValue386_Op386MOVSDconst(v *Value) bool { 5043 b := v.Block 5044 _ = b 5045 config := b.Func.Config 5046 _ = config 5047 types := &b.Func.Config.Types 5048 _ = types 5049 // match: (MOVSDconst [c]) 5050 // cond: config.ctxt.Flag_shared 5051 // result: (MOVSDconst2 (MOVSDconst1 [c])) 5052 for { 5053 c := v.AuxInt 5054 if !(config.ctxt.Flag_shared) { 5055 break 5056 } 5057 v.reset(Op386MOVSDconst2) 5058 v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, types.UInt32) 5059 v0.AuxInt = c 5060 v.AddArg(v0) 5061 return true 5062 } 5063 return false 5064 } 5065 func rewriteValue386_Op386MOVSDload(v *Value) bool { 5066 b := v.Block 5067 _ = b 5068 config := b.Func.Config 5069 _ = config 5070 // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) 5071 // cond: is32Bit(off1+off2) 5072 // result: (MOVSDload [off1+off2] {sym} ptr mem) 5073 for { 5074 off1 := v.AuxInt 5075 sym := v.Aux 5076 v_0 := v.Args[0] 5077 if v_0.Op != Op386ADDLconst { 5078 break 5079 } 5080 off2 := v_0.AuxInt 5081 ptr := v_0.Args[0] 5082 mem := v.Args[1] 5083 if !(is32Bit(off1 + off2)) { 5084 break 5085 } 5086 v.reset(Op386MOVSDload) 5087 v.AuxInt = off1 + off2 5088 v.Aux = sym 5089 v.AddArg(ptr) 5090 v.AddArg(mem) 5091 return true 5092 } 5093 // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5094 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5095 // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5096 for { 5097 off1 := v.AuxInt 5098 sym1 := v.Aux 5099 v_0 := v.Args[0] 5100 if v_0.Op != Op386LEAL { 5101 break 5102 } 5103 off2 := v_0.AuxInt 5104 sym2 := v_0.Aux 5105 base := v_0.Args[0] 5106 mem := v.Args[1] 5107 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5108 break 5109 } 5110 v.reset(Op386MOVSDload) 5111 v.AuxInt = off1 + off2 5112 v.Aux = mergeSym(sym1, sym2) 5113 v.AddArg(base) 5114 v.AddArg(mem) 5115 return true 5116 } 5117 // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5118 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5119 // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5120 for { 5121 off1 := v.AuxInt 5122 sym1 := v.Aux 5123 v_0 := v.Args[0] 5124 if v_0.Op != Op386LEAL1 { 5125 break 5126 } 5127 off2 := v_0.AuxInt 5128 sym2 := v_0.Aux 5129 ptr := v_0.Args[0] 5130 idx := v_0.Args[1] 5131 mem := v.Args[1] 5132 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5133 break 5134 } 5135 v.reset(Op386MOVSDloadidx1) 5136 v.AuxInt = off1 + off2 5137 v.Aux = mergeSym(sym1, sym2) 5138 v.AddArg(ptr) 5139 v.AddArg(idx) 5140 v.AddArg(mem) 5141 return true 5142 } 5143 // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) 5144 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5145 // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5146 for { 5147 off1 := v.AuxInt 5148 sym1 := v.Aux 5149 v_0 := v.Args[0] 5150 if v_0.Op != Op386LEAL8 { 5151 break 5152 } 5153 off2 := v_0.AuxInt 5154 sym2 := v_0.Aux 5155 ptr := v_0.Args[0] 5156 idx := v_0.Args[1] 5157 mem := v.Args[1] 5158 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5159 break 5160 } 5161 v.reset(Op386MOVSDloadidx8) 5162 v.AuxInt = off1 + off2 5163 v.Aux = mergeSym(sym1, sym2) 5164 v.AddArg(ptr) 5165 v.AddArg(idx) 5166 v.AddArg(mem) 5167 return true 5168 } 5169 // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) 5170 // cond: ptr.Op != OpSB 5171 // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) 5172 for { 5173 off := v.AuxInt 5174 sym := v.Aux 5175 v_0 := v.Args[0] 5176 if v_0.Op != Op386ADDL { 5177 break 5178 } 5179 ptr := v_0.Args[0] 5180 idx := v_0.Args[1] 5181 mem := v.Args[1] 5182 if !(ptr.Op != OpSB) { 5183 break 5184 } 5185 v.reset(Op386MOVSDloadidx1) 5186 v.AuxInt = off 5187 v.Aux = sym 5188 v.AddArg(ptr) 5189 v.AddArg(idx) 5190 v.AddArg(mem) 5191 return true 5192 } 5193 return false 5194 } 5195 func rewriteValue386_Op386MOVSDloadidx1(v *Value) bool { 5196 // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5197 // cond: 5198 // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem) 5199 for { 5200 c := v.AuxInt 5201 sym := v.Aux 5202 v_0 := v.Args[0] 5203 if v_0.Op != Op386ADDLconst { 5204 break 5205 } 5206 d := v_0.AuxInt 5207 ptr := v_0.Args[0] 5208 idx := v.Args[1] 5209 mem := v.Args[2] 5210 v.reset(Op386MOVSDloadidx1) 5211 v.AuxInt = c + d 5212 v.Aux = sym 5213 v.AddArg(ptr) 5214 v.AddArg(idx) 5215 v.AddArg(mem) 5216 return true 5217 } 5218 // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5219 // cond: 5220 // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem) 5221 for { 5222 c := v.AuxInt 5223 sym := v.Aux 5224 ptr := v.Args[0] 5225 v_1 := v.Args[1] 5226 if v_1.Op != Op386ADDLconst { 5227 break 5228 } 5229 d := v_1.AuxInt 5230 idx := v_1.Args[0] 5231 mem := v.Args[2] 5232 v.reset(Op386MOVSDloadidx1) 5233 v.AuxInt = c + d 5234 v.Aux = sym 5235 v.AddArg(ptr) 5236 v.AddArg(idx) 5237 v.AddArg(mem) 5238 return true 5239 } 5240 return false 5241 } 5242 func rewriteValue386_Op386MOVSDloadidx8(v *Value) bool { 5243 // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) 5244 // cond: 5245 // result: (MOVSDloadidx8 [c+d] {sym} ptr idx mem) 5246 for { 5247 c := v.AuxInt 5248 sym := v.Aux 5249 v_0 := v.Args[0] 5250 if v_0.Op != Op386ADDLconst { 5251 break 5252 } 5253 d := v_0.AuxInt 5254 ptr := v_0.Args[0] 5255 idx := v.Args[1] 5256 mem := v.Args[2] 5257 v.reset(Op386MOVSDloadidx8) 5258 v.AuxInt = c + d 5259 v.Aux = sym 5260 v.AddArg(ptr) 5261 v.AddArg(idx) 5262 v.AddArg(mem) 5263 return true 5264 } 5265 // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) 5266 // cond: 5267 // result: (MOVSDloadidx8 [c+8*d] {sym} ptr idx mem) 5268 for { 5269 c := v.AuxInt 5270 sym := v.Aux 5271 ptr := v.Args[0] 5272 v_1 := v.Args[1] 5273 if v_1.Op != Op386ADDLconst { 5274 break 5275 } 5276 d := v_1.AuxInt 5277 idx := v_1.Args[0] 5278 mem := v.Args[2] 5279 v.reset(Op386MOVSDloadidx8) 5280 v.AuxInt = c + 8*d 5281 v.Aux = sym 5282 v.AddArg(ptr) 5283 v.AddArg(idx) 5284 v.AddArg(mem) 5285 return true 5286 } 5287 return false 5288 } 5289 func rewriteValue386_Op386MOVSDstore(v *Value) bool { 5290 b := v.Block 5291 _ = b 5292 config := b.Func.Config 5293 _ = config 5294 // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5295 // cond: is32Bit(off1+off2) 5296 // result: (MOVSDstore [off1+off2] {sym} ptr val mem) 5297 for { 5298 off1 := v.AuxInt 5299 sym := v.Aux 5300 v_0 := v.Args[0] 5301 if v_0.Op != Op386ADDLconst { 5302 break 5303 } 5304 off2 := v_0.AuxInt 5305 ptr := v_0.Args[0] 5306 val := v.Args[1] 5307 mem := v.Args[2] 5308 if !(is32Bit(off1 + off2)) { 5309 break 5310 } 5311 v.reset(Op386MOVSDstore) 5312 v.AuxInt = off1 + off2 5313 v.Aux = sym 5314 v.AddArg(ptr) 5315 v.AddArg(val) 5316 v.AddArg(mem) 5317 return true 5318 } 5319 // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5320 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5321 // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5322 for { 5323 off1 := v.AuxInt 5324 sym1 := v.Aux 5325 v_0 := v.Args[0] 5326 if v_0.Op != Op386LEAL { 5327 break 5328 } 5329 off2 := v_0.AuxInt 5330 sym2 := v_0.Aux 5331 base := v_0.Args[0] 5332 val := v.Args[1] 5333 mem := v.Args[2] 5334 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5335 break 5336 } 5337 v.reset(Op386MOVSDstore) 5338 v.AuxInt = off1 + off2 5339 v.Aux = mergeSym(sym1, sym2) 5340 v.AddArg(base) 5341 v.AddArg(val) 5342 v.AddArg(mem) 5343 return true 5344 } 5345 // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5346 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5347 // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5348 for { 5349 off1 := v.AuxInt 5350 sym1 := v.Aux 5351 v_0 := v.Args[0] 5352 if v_0.Op != Op386LEAL1 { 5353 break 5354 } 5355 off2 := v_0.AuxInt 5356 sym2 := v_0.Aux 5357 ptr := v_0.Args[0] 5358 idx := v_0.Args[1] 5359 val := v.Args[1] 5360 mem := v.Args[2] 5361 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5362 break 5363 } 5364 v.reset(Op386MOVSDstoreidx1) 5365 v.AuxInt = off1 + off2 5366 v.Aux = mergeSym(sym1, sym2) 5367 v.AddArg(ptr) 5368 v.AddArg(idx) 5369 v.AddArg(val) 5370 v.AddArg(mem) 5371 return true 5372 } 5373 // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) 5374 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5375 // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5376 for { 5377 off1 := v.AuxInt 5378 sym1 := v.Aux 5379 v_0 := v.Args[0] 5380 if v_0.Op != Op386LEAL8 { 5381 break 5382 } 5383 off2 := v_0.AuxInt 5384 sym2 := v_0.Aux 5385 ptr := v_0.Args[0] 5386 idx := v_0.Args[1] 5387 val := v.Args[1] 5388 mem := v.Args[2] 5389 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5390 break 5391 } 5392 v.reset(Op386MOVSDstoreidx8) 5393 v.AuxInt = off1 + off2 5394 v.Aux = mergeSym(sym1, sym2) 5395 v.AddArg(ptr) 5396 v.AddArg(idx) 5397 v.AddArg(val) 5398 v.AddArg(mem) 5399 return true 5400 } 5401 // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) 5402 // cond: ptr.Op != OpSB 5403 // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) 5404 for { 5405 off := v.AuxInt 5406 sym := v.Aux 5407 v_0 := v.Args[0] 5408 if v_0.Op != Op386ADDL { 5409 break 5410 } 5411 ptr := v_0.Args[0] 5412 idx := v_0.Args[1] 5413 val := v.Args[1] 5414 mem := v.Args[2] 5415 if !(ptr.Op != OpSB) { 5416 break 5417 } 5418 v.reset(Op386MOVSDstoreidx1) 5419 v.AuxInt = off 5420 v.Aux = sym 5421 v.AddArg(ptr) 5422 v.AddArg(idx) 5423 v.AddArg(val) 5424 v.AddArg(mem) 5425 return true 5426 } 5427 return false 5428 } 5429 func rewriteValue386_Op386MOVSDstoreidx1(v *Value) bool { 5430 // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5431 // cond: 5432 // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem) 5433 for { 5434 c := v.AuxInt 5435 sym := v.Aux 5436 v_0 := v.Args[0] 5437 if v_0.Op != Op386ADDLconst { 5438 break 5439 } 5440 d := v_0.AuxInt 5441 ptr := v_0.Args[0] 5442 idx := v.Args[1] 5443 val := v.Args[2] 5444 mem := v.Args[3] 5445 v.reset(Op386MOVSDstoreidx1) 5446 v.AuxInt = c + d 5447 v.Aux = sym 5448 v.AddArg(ptr) 5449 v.AddArg(idx) 5450 v.AddArg(val) 5451 v.AddArg(mem) 5452 return true 5453 } 5454 // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5455 // cond: 5456 // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem) 5457 for { 5458 c := v.AuxInt 5459 sym := v.Aux 5460 ptr := v.Args[0] 5461 v_1 := v.Args[1] 5462 if v_1.Op != Op386ADDLconst { 5463 break 5464 } 5465 d := v_1.AuxInt 5466 idx := v_1.Args[0] 5467 val := v.Args[2] 5468 mem := v.Args[3] 5469 v.reset(Op386MOVSDstoreidx1) 5470 v.AuxInt = c + d 5471 v.Aux = sym 5472 v.AddArg(ptr) 5473 v.AddArg(idx) 5474 v.AddArg(val) 5475 v.AddArg(mem) 5476 return true 5477 } 5478 return false 5479 } 5480 func rewriteValue386_Op386MOVSDstoreidx8(v *Value) bool { 5481 // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5482 // cond: 5483 // result: (MOVSDstoreidx8 [c+d] {sym} ptr idx val mem) 5484 for { 5485 c := v.AuxInt 5486 sym := v.Aux 5487 v_0 := v.Args[0] 5488 if v_0.Op != Op386ADDLconst { 5489 break 5490 } 5491 d := v_0.AuxInt 5492 ptr := v_0.Args[0] 5493 idx := v.Args[1] 5494 val := v.Args[2] 5495 mem := v.Args[3] 5496 v.reset(Op386MOVSDstoreidx8) 5497 v.AuxInt = c + d 5498 v.Aux = sym 5499 v.AddArg(ptr) 5500 v.AddArg(idx) 5501 v.AddArg(val) 5502 v.AddArg(mem) 5503 return true 5504 } 5505 // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5506 // cond: 5507 // result: (MOVSDstoreidx8 [c+8*d] {sym} ptr idx val mem) 5508 for { 5509 c := v.AuxInt 5510 sym := v.Aux 5511 ptr := v.Args[0] 5512 v_1 := v.Args[1] 5513 if v_1.Op != Op386ADDLconst { 5514 break 5515 } 5516 d := v_1.AuxInt 5517 idx := v_1.Args[0] 5518 val := v.Args[2] 5519 mem := v.Args[3] 5520 v.reset(Op386MOVSDstoreidx8) 5521 v.AuxInt = c + 8*d 5522 v.Aux = sym 5523 v.AddArg(ptr) 5524 v.AddArg(idx) 5525 v.AddArg(val) 5526 v.AddArg(mem) 5527 return true 5528 } 5529 return false 5530 } 5531 func rewriteValue386_Op386MOVSSconst(v *Value) bool { 5532 b := v.Block 5533 _ = b 5534 config := b.Func.Config 5535 _ = config 5536 types := &b.Func.Config.Types 5537 _ = types 5538 // match: (MOVSSconst [c]) 5539 // cond: config.ctxt.Flag_shared 5540 // result: (MOVSSconst2 (MOVSSconst1 [c])) 5541 for { 5542 c := v.AuxInt 5543 if !(config.ctxt.Flag_shared) { 5544 break 5545 } 5546 v.reset(Op386MOVSSconst2) 5547 v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, types.UInt32) 5548 v0.AuxInt = c 5549 v.AddArg(v0) 5550 return true 5551 } 5552 return false 5553 } 5554 func rewriteValue386_Op386MOVSSload(v *Value) bool { 5555 b := v.Block 5556 _ = b 5557 config := b.Func.Config 5558 _ = config 5559 // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) 5560 // cond: is32Bit(off1+off2) 5561 // result: (MOVSSload [off1+off2] {sym} ptr mem) 5562 for { 5563 off1 := v.AuxInt 5564 sym := v.Aux 5565 v_0 := v.Args[0] 5566 if v_0.Op != Op386ADDLconst { 5567 break 5568 } 5569 off2 := v_0.AuxInt 5570 ptr := v_0.Args[0] 5571 mem := v.Args[1] 5572 if !(is32Bit(off1 + off2)) { 5573 break 5574 } 5575 v.reset(Op386MOVSSload) 5576 v.AuxInt = off1 + off2 5577 v.Aux = sym 5578 v.AddArg(ptr) 5579 v.AddArg(mem) 5580 return true 5581 } 5582 // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5583 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5584 // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5585 for { 5586 off1 := v.AuxInt 5587 sym1 := v.Aux 5588 v_0 := v.Args[0] 5589 if v_0.Op != Op386LEAL { 5590 break 5591 } 5592 off2 := v_0.AuxInt 5593 sym2 := v_0.Aux 5594 base := v_0.Args[0] 5595 mem := v.Args[1] 5596 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5597 break 5598 } 5599 v.reset(Op386MOVSSload) 5600 v.AuxInt = off1 + off2 5601 v.Aux = mergeSym(sym1, sym2) 5602 v.AddArg(base) 5603 v.AddArg(mem) 5604 return true 5605 } 5606 // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5607 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5608 // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5609 for { 5610 off1 := v.AuxInt 5611 sym1 := v.Aux 5612 v_0 := v.Args[0] 5613 if v_0.Op != Op386LEAL1 { 5614 break 5615 } 5616 off2 := v_0.AuxInt 5617 sym2 := v_0.Aux 5618 ptr := v_0.Args[0] 5619 idx := v_0.Args[1] 5620 mem := v.Args[1] 5621 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5622 break 5623 } 5624 v.reset(Op386MOVSSloadidx1) 5625 v.AuxInt = off1 + off2 5626 v.Aux = mergeSym(sym1, sym2) 5627 v.AddArg(ptr) 5628 v.AddArg(idx) 5629 v.AddArg(mem) 5630 return true 5631 } 5632 // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 5633 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5634 // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5635 for { 5636 off1 := v.AuxInt 5637 sym1 := v.Aux 5638 v_0 := v.Args[0] 5639 if v_0.Op != Op386LEAL4 { 5640 break 5641 } 5642 off2 := v_0.AuxInt 5643 sym2 := v_0.Aux 5644 ptr := v_0.Args[0] 5645 idx := v_0.Args[1] 5646 mem := v.Args[1] 5647 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5648 break 5649 } 5650 v.reset(Op386MOVSSloadidx4) 5651 v.AuxInt = off1 + off2 5652 v.Aux = mergeSym(sym1, sym2) 5653 v.AddArg(ptr) 5654 v.AddArg(idx) 5655 v.AddArg(mem) 5656 return true 5657 } 5658 // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) 5659 // cond: ptr.Op != OpSB 5660 // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) 5661 for { 5662 off := v.AuxInt 5663 sym := v.Aux 5664 v_0 := v.Args[0] 5665 if v_0.Op != Op386ADDL { 5666 break 5667 } 5668 ptr := v_0.Args[0] 5669 idx := v_0.Args[1] 5670 mem := v.Args[1] 5671 if !(ptr.Op != OpSB) { 5672 break 5673 } 5674 v.reset(Op386MOVSSloadidx1) 5675 v.AuxInt = off 5676 v.Aux = sym 5677 v.AddArg(ptr) 5678 v.AddArg(idx) 5679 v.AddArg(mem) 5680 return true 5681 } 5682 return false 5683 } 5684 func rewriteValue386_Op386MOVSSloadidx1(v *Value) bool { 5685 // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5686 // cond: 5687 // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem) 5688 for { 5689 c := v.AuxInt 5690 sym := v.Aux 5691 v_0 := v.Args[0] 5692 if v_0.Op != Op386ADDLconst { 5693 break 5694 } 5695 d := v_0.AuxInt 5696 ptr := v_0.Args[0] 5697 idx := v.Args[1] 5698 mem := v.Args[2] 5699 v.reset(Op386MOVSSloadidx1) 5700 v.AuxInt = c + d 5701 v.Aux = sym 5702 v.AddArg(ptr) 5703 v.AddArg(idx) 5704 v.AddArg(mem) 5705 return true 5706 } 5707 // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5708 // cond: 5709 // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem) 5710 for { 5711 c := v.AuxInt 5712 sym := v.Aux 5713 ptr := v.Args[0] 5714 v_1 := v.Args[1] 5715 if v_1.Op != Op386ADDLconst { 5716 break 5717 } 5718 d := v_1.AuxInt 5719 idx := v_1.Args[0] 5720 mem := v.Args[2] 5721 v.reset(Op386MOVSSloadidx1) 5722 v.AuxInt = c + d 5723 v.Aux = sym 5724 v.AddArg(ptr) 5725 v.AddArg(idx) 5726 v.AddArg(mem) 5727 return true 5728 } 5729 return false 5730 } 5731 func rewriteValue386_Op386MOVSSloadidx4(v *Value) bool { 5732 // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 5733 // cond: 5734 // result: (MOVSSloadidx4 [c+d] {sym} ptr idx mem) 5735 for { 5736 c := v.AuxInt 5737 sym := v.Aux 5738 v_0 := v.Args[0] 5739 if v_0.Op != Op386ADDLconst { 5740 break 5741 } 5742 d := v_0.AuxInt 5743 ptr := v_0.Args[0] 5744 idx := v.Args[1] 5745 mem := v.Args[2] 5746 v.reset(Op386MOVSSloadidx4) 5747 v.AuxInt = c + d 5748 v.Aux = sym 5749 v.AddArg(ptr) 5750 v.AddArg(idx) 5751 v.AddArg(mem) 5752 return true 5753 } 5754 // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 5755 // cond: 5756 // result: (MOVSSloadidx4 [c+4*d] {sym} ptr idx mem) 5757 for { 5758 c := v.AuxInt 5759 sym := v.Aux 5760 ptr := v.Args[0] 5761 v_1 := v.Args[1] 5762 if v_1.Op != Op386ADDLconst { 5763 break 5764 } 5765 d := v_1.AuxInt 5766 idx := v_1.Args[0] 5767 mem := v.Args[2] 5768 v.reset(Op386MOVSSloadidx4) 5769 v.AuxInt = c + 4*d 5770 v.Aux = sym 5771 v.AddArg(ptr) 5772 v.AddArg(idx) 5773 v.AddArg(mem) 5774 return true 5775 } 5776 return false 5777 } 5778 func rewriteValue386_Op386MOVSSstore(v *Value) bool { 5779 b := v.Block 5780 _ = b 5781 config := b.Func.Config 5782 _ = config 5783 // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5784 // cond: is32Bit(off1+off2) 5785 // result: (MOVSSstore [off1+off2] {sym} ptr val mem) 5786 for { 5787 off1 := v.AuxInt 5788 sym := v.Aux 5789 v_0 := v.Args[0] 5790 if v_0.Op != Op386ADDLconst { 5791 break 5792 } 5793 off2 := v_0.AuxInt 5794 ptr := v_0.Args[0] 5795 val := v.Args[1] 5796 mem := v.Args[2] 5797 if !(is32Bit(off1 + off2)) { 5798 break 5799 } 5800 v.reset(Op386MOVSSstore) 5801 v.AuxInt = off1 + off2 5802 v.Aux = sym 5803 v.AddArg(ptr) 5804 v.AddArg(val) 5805 v.AddArg(mem) 5806 return true 5807 } 5808 // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5809 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5810 // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5811 for { 5812 off1 := v.AuxInt 5813 sym1 := v.Aux 5814 v_0 := v.Args[0] 5815 if v_0.Op != Op386LEAL { 5816 break 5817 } 5818 off2 := v_0.AuxInt 5819 sym2 := v_0.Aux 5820 base := v_0.Args[0] 5821 val := v.Args[1] 5822 mem := v.Args[2] 5823 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5824 break 5825 } 5826 v.reset(Op386MOVSSstore) 5827 v.AuxInt = off1 + off2 5828 v.Aux = mergeSym(sym1, sym2) 5829 v.AddArg(base) 5830 v.AddArg(val) 5831 v.AddArg(mem) 5832 return true 5833 } 5834 // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5835 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5836 // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5837 for { 5838 off1 := v.AuxInt 5839 sym1 := v.Aux 5840 v_0 := v.Args[0] 5841 if v_0.Op != Op386LEAL1 { 5842 break 5843 } 5844 off2 := v_0.AuxInt 5845 sym2 := v_0.Aux 5846 ptr := v_0.Args[0] 5847 idx := v_0.Args[1] 5848 val := v.Args[1] 5849 mem := v.Args[2] 5850 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5851 break 5852 } 5853 v.reset(Op386MOVSSstoreidx1) 5854 v.AuxInt = off1 + off2 5855 v.Aux = mergeSym(sym1, sym2) 5856 v.AddArg(ptr) 5857 v.AddArg(idx) 5858 v.AddArg(val) 5859 v.AddArg(mem) 5860 return true 5861 } 5862 // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 5863 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5864 // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5865 for { 5866 off1 := v.AuxInt 5867 sym1 := v.Aux 5868 v_0 := v.Args[0] 5869 if v_0.Op != Op386LEAL4 { 5870 break 5871 } 5872 off2 := v_0.AuxInt 5873 sym2 := v_0.Aux 5874 ptr := v_0.Args[0] 5875 idx := v_0.Args[1] 5876 val := v.Args[1] 5877 mem := v.Args[2] 5878 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5879 break 5880 } 5881 v.reset(Op386MOVSSstoreidx4) 5882 v.AuxInt = off1 + off2 5883 v.Aux = mergeSym(sym1, sym2) 5884 v.AddArg(ptr) 5885 v.AddArg(idx) 5886 v.AddArg(val) 5887 v.AddArg(mem) 5888 return true 5889 } 5890 // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) 5891 // cond: ptr.Op != OpSB 5892 // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) 5893 for { 5894 off := v.AuxInt 5895 sym := v.Aux 5896 v_0 := v.Args[0] 5897 if v_0.Op != Op386ADDL { 5898 break 5899 } 5900 ptr := v_0.Args[0] 5901 idx := v_0.Args[1] 5902 val := v.Args[1] 5903 mem := v.Args[2] 5904 if !(ptr.Op != OpSB) { 5905 break 5906 } 5907 v.reset(Op386MOVSSstoreidx1) 5908 v.AuxInt = off 5909 v.Aux = sym 5910 v.AddArg(ptr) 5911 v.AddArg(idx) 5912 v.AddArg(val) 5913 v.AddArg(mem) 5914 return true 5915 } 5916 return false 5917 } 5918 func rewriteValue386_Op386MOVSSstoreidx1(v *Value) bool { 5919 // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5920 // cond: 5921 // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem) 5922 for { 5923 c := v.AuxInt 5924 sym := v.Aux 5925 v_0 := v.Args[0] 5926 if v_0.Op != Op386ADDLconst { 5927 break 5928 } 5929 d := v_0.AuxInt 5930 ptr := v_0.Args[0] 5931 idx := v.Args[1] 5932 val := v.Args[2] 5933 mem := v.Args[3] 5934 v.reset(Op386MOVSSstoreidx1) 5935 v.AuxInt = c + d 5936 v.Aux = sym 5937 v.AddArg(ptr) 5938 v.AddArg(idx) 5939 v.AddArg(val) 5940 v.AddArg(mem) 5941 return true 5942 } 5943 // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5944 // cond: 5945 // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem) 5946 for { 5947 c := v.AuxInt 5948 sym := v.Aux 5949 ptr := v.Args[0] 5950 v_1 := v.Args[1] 5951 if v_1.Op != Op386ADDLconst { 5952 break 5953 } 5954 d := v_1.AuxInt 5955 idx := v_1.Args[0] 5956 val := v.Args[2] 5957 mem := v.Args[3] 5958 v.reset(Op386MOVSSstoreidx1) 5959 v.AuxInt = c + d 5960 v.Aux = sym 5961 v.AddArg(ptr) 5962 v.AddArg(idx) 5963 v.AddArg(val) 5964 v.AddArg(mem) 5965 return true 5966 } 5967 return false 5968 } 5969 func rewriteValue386_Op386MOVSSstoreidx4(v *Value) bool { 5970 // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5971 // cond: 5972 // result: (MOVSSstoreidx4 [c+d] {sym} ptr idx val mem) 5973 for { 5974 c := v.AuxInt 5975 sym := v.Aux 5976 v_0 := v.Args[0] 5977 if v_0.Op != Op386ADDLconst { 5978 break 5979 } 5980 d := v_0.AuxInt 5981 ptr := v_0.Args[0] 5982 idx := v.Args[1] 5983 val := v.Args[2] 5984 mem := v.Args[3] 5985 v.reset(Op386MOVSSstoreidx4) 5986 v.AuxInt = c + d 5987 v.Aux = sym 5988 v.AddArg(ptr) 5989 v.AddArg(idx) 5990 v.AddArg(val) 5991 v.AddArg(mem) 5992 return true 5993 } 5994 // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5995 // cond: 5996 // result: (MOVSSstoreidx4 [c+4*d] {sym} ptr idx val mem) 5997 for { 5998 c := v.AuxInt 5999 sym := v.Aux 6000 ptr := v.Args[0] 6001 v_1 := v.Args[1] 6002 if v_1.Op != Op386ADDLconst { 6003 break 6004 } 6005 d := v_1.AuxInt 6006 idx := v_1.Args[0] 6007 val := v.Args[2] 6008 mem := v.Args[3] 6009 v.reset(Op386MOVSSstoreidx4) 6010 v.AuxInt = c + 4*d 6011 v.Aux = sym 6012 v.AddArg(ptr) 6013 v.AddArg(idx) 6014 v.AddArg(val) 6015 v.AddArg(mem) 6016 return true 6017 } 6018 return false 6019 } 6020 func rewriteValue386_Op386MOVWLSX(v *Value) bool { 6021 b := v.Block 6022 _ = b 6023 // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) 6024 // cond: x.Uses == 1 && clobber(x) 6025 // result: @x.Block (MOVWLSXload <v.Type> [off] {sym} ptr mem) 6026 for { 6027 x := v.Args[0] 6028 if x.Op != Op386MOVWload { 6029 break 6030 } 6031 off := x.AuxInt 6032 sym := x.Aux 6033 ptr := x.Args[0] 6034 mem := x.Args[1] 6035 if !(x.Uses == 1 && clobber(x)) { 6036 break 6037 } 6038 b = x.Block 6039 v0 := b.NewValue0(v.Pos, Op386MOVWLSXload, v.Type) 6040 v.reset(OpCopy) 6041 v.AddArg(v0) 6042 v0.AuxInt = off 6043 v0.Aux = sym 6044 v0.AddArg(ptr) 6045 v0.AddArg(mem) 6046 return true 6047 } 6048 // match: (MOVWLSX (ANDLconst [c] x)) 6049 // cond: c & 0x8000 == 0 6050 // result: (ANDLconst [c & 0x7fff] x) 6051 for { 6052 v_0 := v.Args[0] 6053 if v_0.Op != Op386ANDLconst { 6054 break 6055 } 6056 c := v_0.AuxInt 6057 x := v_0.Args[0] 6058 if !(c&0x8000 == 0) { 6059 break 6060 } 6061 v.reset(Op386ANDLconst) 6062 v.AuxInt = c & 0x7fff 6063 v.AddArg(x) 6064 return true 6065 } 6066 return false 6067 } 6068 func rewriteValue386_Op386MOVWLSXload(v *Value) bool { 6069 b := v.Block 6070 _ = b 6071 config := b.Func.Config 6072 _ = config 6073 // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6074 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6075 // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6076 for { 6077 off1 := v.AuxInt 6078 sym1 := v.Aux 6079 v_0 := v.Args[0] 6080 if v_0.Op != Op386LEAL { 6081 break 6082 } 6083 off2 := v_0.AuxInt 6084 sym2 := v_0.Aux 6085 base := v_0.Args[0] 6086 mem := v.Args[1] 6087 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6088 break 6089 } 6090 v.reset(Op386MOVWLSXload) 6091 v.AuxInt = off1 + off2 6092 v.Aux = mergeSym(sym1, sym2) 6093 v.AddArg(base) 6094 v.AddArg(mem) 6095 return true 6096 } 6097 return false 6098 } 6099 func rewriteValue386_Op386MOVWLZX(v *Value) bool { 6100 b := v.Block 6101 _ = b 6102 // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) 6103 // cond: x.Uses == 1 && clobber(x) 6104 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 6105 for { 6106 x := v.Args[0] 6107 if x.Op != Op386MOVWload { 6108 break 6109 } 6110 off := x.AuxInt 6111 sym := x.Aux 6112 ptr := x.Args[0] 6113 mem := x.Args[1] 6114 if !(x.Uses == 1 && clobber(x)) { 6115 break 6116 } 6117 b = x.Block 6118 v0 := b.NewValue0(v.Pos, Op386MOVWload, v.Type) 6119 v.reset(OpCopy) 6120 v.AddArg(v0) 6121 v0.AuxInt = off 6122 v0.Aux = sym 6123 v0.AddArg(ptr) 6124 v0.AddArg(mem) 6125 return true 6126 } 6127 // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) 6128 // cond: x.Uses == 1 && clobber(x) 6129 // result: @x.Block (MOVWloadidx1 <v.Type> [off] {sym} ptr idx mem) 6130 for { 6131 x := v.Args[0] 6132 if x.Op != Op386MOVWloadidx1 { 6133 break 6134 } 6135 off := x.AuxInt 6136 sym := x.Aux 6137 ptr := x.Args[0] 6138 idx := x.Args[1] 6139 mem := x.Args[2] 6140 if !(x.Uses == 1 && clobber(x)) { 6141 break 6142 } 6143 b = x.Block 6144 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 6145 v.reset(OpCopy) 6146 v.AddArg(v0) 6147 v0.AuxInt = off 6148 v0.Aux = sym 6149 v0.AddArg(ptr) 6150 v0.AddArg(idx) 6151 v0.AddArg(mem) 6152 return true 6153 } 6154 // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) 6155 // cond: x.Uses == 1 && clobber(x) 6156 // result: @x.Block (MOVWloadidx2 <v.Type> [off] {sym} ptr idx mem) 6157 for { 6158 x := v.Args[0] 6159 if x.Op != Op386MOVWloadidx2 { 6160 break 6161 } 6162 off := x.AuxInt 6163 sym := x.Aux 6164 ptr := x.Args[0] 6165 idx := x.Args[1] 6166 mem := x.Args[2] 6167 if !(x.Uses == 1 && clobber(x)) { 6168 break 6169 } 6170 b = x.Block 6171 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) 6172 v.reset(OpCopy) 6173 v.AddArg(v0) 6174 v0.AuxInt = off 6175 v0.Aux = sym 6176 v0.AddArg(ptr) 6177 v0.AddArg(idx) 6178 v0.AddArg(mem) 6179 return true 6180 } 6181 // match: (MOVWLZX (ANDLconst [c] x)) 6182 // cond: 6183 // result: (ANDLconst [c & 0xffff] x) 6184 for { 6185 v_0 := v.Args[0] 6186 if v_0.Op != Op386ANDLconst { 6187 break 6188 } 6189 c := v_0.AuxInt 6190 x := v_0.Args[0] 6191 v.reset(Op386ANDLconst) 6192 v.AuxInt = c & 0xffff 6193 v.AddArg(x) 6194 return true 6195 } 6196 return false 6197 } 6198 func rewriteValue386_Op386MOVWload(v *Value) bool { 6199 b := v.Block 6200 _ = b 6201 config := b.Func.Config 6202 _ = config 6203 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6204 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6205 // result: x 6206 for { 6207 off := v.AuxInt 6208 sym := v.Aux 6209 ptr := v.Args[0] 6210 v_1 := v.Args[1] 6211 if v_1.Op != Op386MOVWstore { 6212 break 6213 } 6214 off2 := v_1.AuxInt 6215 sym2 := v_1.Aux 6216 ptr2 := v_1.Args[0] 6217 x := v_1.Args[1] 6218 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6219 break 6220 } 6221 v.reset(OpCopy) 6222 v.Type = x.Type 6223 v.AddArg(x) 6224 return true 6225 } 6226 // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) 6227 // cond: is32Bit(off1+off2) 6228 // result: (MOVWload [off1+off2] {sym} ptr mem) 6229 for { 6230 off1 := v.AuxInt 6231 sym := v.Aux 6232 v_0 := v.Args[0] 6233 if v_0.Op != Op386ADDLconst { 6234 break 6235 } 6236 off2 := v_0.AuxInt 6237 ptr := v_0.Args[0] 6238 mem := v.Args[1] 6239 if !(is32Bit(off1 + off2)) { 6240 break 6241 } 6242 v.reset(Op386MOVWload) 6243 v.AuxInt = off1 + off2 6244 v.Aux = sym 6245 v.AddArg(ptr) 6246 v.AddArg(mem) 6247 return true 6248 } 6249 // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6250 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6251 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6252 for { 6253 off1 := v.AuxInt 6254 sym1 := v.Aux 6255 v_0 := v.Args[0] 6256 if v_0.Op != Op386LEAL { 6257 break 6258 } 6259 off2 := v_0.AuxInt 6260 sym2 := v_0.Aux 6261 base := v_0.Args[0] 6262 mem := v.Args[1] 6263 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6264 break 6265 } 6266 v.reset(Op386MOVWload) 6267 v.AuxInt = off1 + off2 6268 v.Aux = mergeSym(sym1, sym2) 6269 v.AddArg(base) 6270 v.AddArg(mem) 6271 return true 6272 } 6273 // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 6274 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6275 // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6276 for { 6277 off1 := v.AuxInt 6278 sym1 := v.Aux 6279 v_0 := v.Args[0] 6280 if v_0.Op != Op386LEAL1 { 6281 break 6282 } 6283 off2 := v_0.AuxInt 6284 sym2 := v_0.Aux 6285 ptr := v_0.Args[0] 6286 idx := v_0.Args[1] 6287 mem := v.Args[1] 6288 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6289 break 6290 } 6291 v.reset(Op386MOVWloadidx1) 6292 v.AuxInt = off1 + off2 6293 v.Aux = mergeSym(sym1, sym2) 6294 v.AddArg(ptr) 6295 v.AddArg(idx) 6296 v.AddArg(mem) 6297 return true 6298 } 6299 // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) 6300 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6301 // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6302 for { 6303 off1 := v.AuxInt 6304 sym1 := v.Aux 6305 v_0 := v.Args[0] 6306 if v_0.Op != Op386LEAL2 { 6307 break 6308 } 6309 off2 := v_0.AuxInt 6310 sym2 := v_0.Aux 6311 ptr := v_0.Args[0] 6312 idx := v_0.Args[1] 6313 mem := v.Args[1] 6314 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6315 break 6316 } 6317 v.reset(Op386MOVWloadidx2) 6318 v.AuxInt = off1 + off2 6319 v.Aux = mergeSym(sym1, sym2) 6320 v.AddArg(ptr) 6321 v.AddArg(idx) 6322 v.AddArg(mem) 6323 return true 6324 } 6325 // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) 6326 // cond: ptr.Op != OpSB 6327 // result: (MOVWloadidx1 [off] {sym} ptr idx mem) 6328 for { 6329 off := v.AuxInt 6330 sym := v.Aux 6331 v_0 := v.Args[0] 6332 if v_0.Op != Op386ADDL { 6333 break 6334 } 6335 ptr := v_0.Args[0] 6336 idx := v_0.Args[1] 6337 mem := v.Args[1] 6338 if !(ptr.Op != OpSB) { 6339 break 6340 } 6341 v.reset(Op386MOVWloadidx1) 6342 v.AuxInt = off 6343 v.Aux = sym 6344 v.AddArg(ptr) 6345 v.AddArg(idx) 6346 v.AddArg(mem) 6347 return true 6348 } 6349 return false 6350 } 6351 func rewriteValue386_Op386MOVWloadidx1(v *Value) bool { 6352 // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 6353 // cond: 6354 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6355 for { 6356 c := v.AuxInt 6357 sym := v.Aux 6358 ptr := v.Args[0] 6359 v_1 := v.Args[1] 6360 if v_1.Op != Op386SHLLconst { 6361 break 6362 } 6363 if v_1.AuxInt != 1 { 6364 break 6365 } 6366 idx := v_1.Args[0] 6367 mem := v.Args[2] 6368 v.reset(Op386MOVWloadidx2) 6369 v.AuxInt = c 6370 v.Aux = sym 6371 v.AddArg(ptr) 6372 v.AddArg(idx) 6373 v.AddArg(mem) 6374 return true 6375 } 6376 // match: (MOVWloadidx1 [c] {sym} (SHLLconst [1] idx) ptr mem) 6377 // cond: 6378 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6379 for { 6380 c := v.AuxInt 6381 sym := v.Aux 6382 v_0 := v.Args[0] 6383 if v_0.Op != Op386SHLLconst { 6384 break 6385 } 6386 if v_0.AuxInt != 1 { 6387 break 6388 } 6389 idx := v_0.Args[0] 6390 ptr := v.Args[1] 6391 mem := v.Args[2] 6392 v.reset(Op386MOVWloadidx2) 6393 v.AuxInt = c 6394 v.Aux = sym 6395 v.AddArg(ptr) 6396 v.AddArg(idx) 6397 v.AddArg(mem) 6398 return true 6399 } 6400 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 6401 // cond: 6402 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6403 for { 6404 c := v.AuxInt 6405 sym := v.Aux 6406 v_0 := v.Args[0] 6407 if v_0.Op != Op386ADDLconst { 6408 break 6409 } 6410 d := v_0.AuxInt 6411 ptr := v_0.Args[0] 6412 idx := v.Args[1] 6413 mem := v.Args[2] 6414 v.reset(Op386MOVWloadidx1) 6415 v.AuxInt = c + d 6416 v.Aux = sym 6417 v.AddArg(ptr) 6418 v.AddArg(idx) 6419 v.AddArg(mem) 6420 return true 6421 } 6422 // match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 6423 // cond: 6424 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6425 for { 6426 c := v.AuxInt 6427 sym := v.Aux 6428 idx := v.Args[0] 6429 v_1 := v.Args[1] 6430 if v_1.Op != Op386ADDLconst { 6431 break 6432 } 6433 d := v_1.AuxInt 6434 ptr := v_1.Args[0] 6435 mem := v.Args[2] 6436 v.reset(Op386MOVWloadidx1) 6437 v.AuxInt = c + d 6438 v.Aux = sym 6439 v.AddArg(ptr) 6440 v.AddArg(idx) 6441 v.AddArg(mem) 6442 return true 6443 } 6444 // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 6445 // cond: 6446 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6447 for { 6448 c := v.AuxInt 6449 sym := v.Aux 6450 ptr := v.Args[0] 6451 v_1 := v.Args[1] 6452 if v_1.Op != Op386ADDLconst { 6453 break 6454 } 6455 d := v_1.AuxInt 6456 idx := v_1.Args[0] 6457 mem := v.Args[2] 6458 v.reset(Op386MOVWloadidx1) 6459 v.AuxInt = c + d 6460 v.Aux = sym 6461 v.AddArg(ptr) 6462 v.AddArg(idx) 6463 v.AddArg(mem) 6464 return true 6465 } 6466 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 6467 // cond: 6468 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6469 for { 6470 c := v.AuxInt 6471 sym := v.Aux 6472 v_0 := v.Args[0] 6473 if v_0.Op != Op386ADDLconst { 6474 break 6475 } 6476 d := v_0.AuxInt 6477 idx := v_0.Args[0] 6478 ptr := v.Args[1] 6479 mem := v.Args[2] 6480 v.reset(Op386MOVWloadidx1) 6481 v.AuxInt = c + d 6482 v.Aux = sym 6483 v.AddArg(ptr) 6484 v.AddArg(idx) 6485 v.AddArg(mem) 6486 return true 6487 } 6488 return false 6489 } 6490 func rewriteValue386_Op386MOVWloadidx2(v *Value) bool { 6491 // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) 6492 // cond: 6493 // result: (MOVWloadidx2 [c+d] {sym} ptr idx mem) 6494 for { 6495 c := v.AuxInt 6496 sym := v.Aux 6497 v_0 := v.Args[0] 6498 if v_0.Op != Op386ADDLconst { 6499 break 6500 } 6501 d := v_0.AuxInt 6502 ptr := v_0.Args[0] 6503 idx := v.Args[1] 6504 mem := v.Args[2] 6505 v.reset(Op386MOVWloadidx2) 6506 v.AuxInt = c + d 6507 v.Aux = sym 6508 v.AddArg(ptr) 6509 v.AddArg(idx) 6510 v.AddArg(mem) 6511 return true 6512 } 6513 // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) 6514 // cond: 6515 // result: (MOVWloadidx2 [c+2*d] {sym} ptr idx mem) 6516 for { 6517 c := v.AuxInt 6518 sym := v.Aux 6519 ptr := v.Args[0] 6520 v_1 := v.Args[1] 6521 if v_1.Op != Op386ADDLconst { 6522 break 6523 } 6524 d := v_1.AuxInt 6525 idx := v_1.Args[0] 6526 mem := v.Args[2] 6527 v.reset(Op386MOVWloadidx2) 6528 v.AuxInt = c + 2*d 6529 v.Aux = sym 6530 v.AddArg(ptr) 6531 v.AddArg(idx) 6532 v.AddArg(mem) 6533 return true 6534 } 6535 return false 6536 } 6537 func rewriteValue386_Op386MOVWstore(v *Value) bool { 6538 b := v.Block 6539 _ = b 6540 config := b.Func.Config 6541 _ = config 6542 // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) 6543 // cond: 6544 // result: (MOVWstore [off] {sym} ptr x mem) 6545 for { 6546 off := v.AuxInt 6547 sym := v.Aux 6548 ptr := v.Args[0] 6549 v_1 := v.Args[1] 6550 if v_1.Op != Op386MOVWLSX { 6551 break 6552 } 6553 x := v_1.Args[0] 6554 mem := v.Args[2] 6555 v.reset(Op386MOVWstore) 6556 v.AuxInt = off 6557 v.Aux = sym 6558 v.AddArg(ptr) 6559 v.AddArg(x) 6560 v.AddArg(mem) 6561 return true 6562 } 6563 // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) 6564 // cond: 6565 // result: (MOVWstore [off] {sym} ptr x mem) 6566 for { 6567 off := v.AuxInt 6568 sym := v.Aux 6569 ptr := v.Args[0] 6570 v_1 := v.Args[1] 6571 if v_1.Op != Op386MOVWLZX { 6572 break 6573 } 6574 x := v_1.Args[0] 6575 mem := v.Args[2] 6576 v.reset(Op386MOVWstore) 6577 v.AuxInt = off 6578 v.Aux = sym 6579 v.AddArg(ptr) 6580 v.AddArg(x) 6581 v.AddArg(mem) 6582 return true 6583 } 6584 // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 6585 // cond: is32Bit(off1+off2) 6586 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6587 for { 6588 off1 := v.AuxInt 6589 sym := v.Aux 6590 v_0 := v.Args[0] 6591 if v_0.Op != Op386ADDLconst { 6592 break 6593 } 6594 off2 := v_0.AuxInt 6595 ptr := v_0.Args[0] 6596 val := v.Args[1] 6597 mem := v.Args[2] 6598 if !(is32Bit(off1 + off2)) { 6599 break 6600 } 6601 v.reset(Op386MOVWstore) 6602 v.AuxInt = off1 + off2 6603 v.Aux = sym 6604 v.AddArg(ptr) 6605 v.AddArg(val) 6606 v.AddArg(mem) 6607 return true 6608 } 6609 // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) 6610 // cond: validOff(off) 6611 // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 6612 for { 6613 off := v.AuxInt 6614 sym := v.Aux 6615 ptr := v.Args[0] 6616 v_1 := v.Args[1] 6617 if v_1.Op != Op386MOVLconst { 6618 break 6619 } 6620 c := v_1.AuxInt 6621 mem := v.Args[2] 6622 if !(validOff(off)) { 6623 break 6624 } 6625 v.reset(Op386MOVWstoreconst) 6626 v.AuxInt = makeValAndOff(int64(int16(c)), off) 6627 v.Aux = sym 6628 v.AddArg(ptr) 6629 v.AddArg(mem) 6630 return true 6631 } 6632 // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 6633 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6634 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 6635 for { 6636 off1 := v.AuxInt 6637 sym1 := v.Aux 6638 v_0 := v.Args[0] 6639 if v_0.Op != Op386LEAL { 6640 break 6641 } 6642 off2 := v_0.AuxInt 6643 sym2 := v_0.Aux 6644 base := v_0.Args[0] 6645 val := v.Args[1] 6646 mem := v.Args[2] 6647 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6648 break 6649 } 6650 v.reset(Op386MOVWstore) 6651 v.AuxInt = off1 + off2 6652 v.Aux = mergeSym(sym1, sym2) 6653 v.AddArg(base) 6654 v.AddArg(val) 6655 v.AddArg(mem) 6656 return true 6657 } 6658 // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 6659 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6660 // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6661 for { 6662 off1 := v.AuxInt 6663 sym1 := v.Aux 6664 v_0 := v.Args[0] 6665 if v_0.Op != Op386LEAL1 { 6666 break 6667 } 6668 off2 := v_0.AuxInt 6669 sym2 := v_0.Aux 6670 ptr := v_0.Args[0] 6671 idx := v_0.Args[1] 6672 val := v.Args[1] 6673 mem := v.Args[2] 6674 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6675 break 6676 } 6677 v.reset(Op386MOVWstoreidx1) 6678 v.AuxInt = off1 + off2 6679 v.Aux = mergeSym(sym1, sym2) 6680 v.AddArg(ptr) 6681 v.AddArg(idx) 6682 v.AddArg(val) 6683 v.AddArg(mem) 6684 return true 6685 } 6686 // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) 6687 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6688 // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6689 for { 6690 off1 := v.AuxInt 6691 sym1 := v.Aux 6692 v_0 := v.Args[0] 6693 if v_0.Op != Op386LEAL2 { 6694 break 6695 } 6696 off2 := v_0.AuxInt 6697 sym2 := v_0.Aux 6698 ptr := v_0.Args[0] 6699 idx := v_0.Args[1] 6700 val := v.Args[1] 6701 mem := v.Args[2] 6702 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6703 break 6704 } 6705 v.reset(Op386MOVWstoreidx2) 6706 v.AuxInt = off1 + off2 6707 v.Aux = mergeSym(sym1, sym2) 6708 v.AddArg(ptr) 6709 v.AddArg(idx) 6710 v.AddArg(val) 6711 v.AddArg(mem) 6712 return true 6713 } 6714 // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) 6715 // cond: ptr.Op != OpSB 6716 // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) 6717 for { 6718 off := v.AuxInt 6719 sym := v.Aux 6720 v_0 := v.Args[0] 6721 if v_0.Op != Op386ADDL { 6722 break 6723 } 6724 ptr := v_0.Args[0] 6725 idx := v_0.Args[1] 6726 val := v.Args[1] 6727 mem := v.Args[2] 6728 if !(ptr.Op != OpSB) { 6729 break 6730 } 6731 v.reset(Op386MOVWstoreidx1) 6732 v.AuxInt = off 6733 v.Aux = sym 6734 v.AddArg(ptr) 6735 v.AddArg(idx) 6736 v.AddArg(val) 6737 v.AddArg(mem) 6738 return true 6739 } 6740 // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) 6741 // cond: x.Uses == 1 && clobber(x) 6742 // result: (MOVLstore [i-2] {s} p w mem) 6743 for { 6744 i := v.AuxInt 6745 s := v.Aux 6746 p := v.Args[0] 6747 v_1 := v.Args[1] 6748 if v_1.Op != Op386SHRLconst { 6749 break 6750 } 6751 if v_1.AuxInt != 16 { 6752 break 6753 } 6754 w := v_1.Args[0] 6755 x := v.Args[2] 6756 if x.Op != Op386MOVWstore { 6757 break 6758 } 6759 if x.AuxInt != i-2 { 6760 break 6761 } 6762 if x.Aux != s { 6763 break 6764 } 6765 if p != x.Args[0] { 6766 break 6767 } 6768 if w != x.Args[1] { 6769 break 6770 } 6771 mem := x.Args[2] 6772 if !(x.Uses == 1 && clobber(x)) { 6773 break 6774 } 6775 v.reset(Op386MOVLstore) 6776 v.AuxInt = i - 2 6777 v.Aux = s 6778 v.AddArg(p) 6779 v.AddArg(w) 6780 v.AddArg(mem) 6781 return true 6782 } 6783 // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) 6784 // cond: x.Uses == 1 && clobber(x) 6785 // result: (MOVLstore [i-2] {s} p w0 mem) 6786 for { 6787 i := v.AuxInt 6788 s := v.Aux 6789 p := v.Args[0] 6790 v_1 := v.Args[1] 6791 if v_1.Op != Op386SHRLconst { 6792 break 6793 } 6794 j := v_1.AuxInt 6795 w := v_1.Args[0] 6796 x := v.Args[2] 6797 if x.Op != Op386MOVWstore { 6798 break 6799 } 6800 if x.AuxInt != i-2 { 6801 break 6802 } 6803 if x.Aux != s { 6804 break 6805 } 6806 if p != x.Args[0] { 6807 break 6808 } 6809 w0 := x.Args[1] 6810 if w0.Op != Op386SHRLconst { 6811 break 6812 } 6813 if w0.AuxInt != j-16 { 6814 break 6815 } 6816 if w != w0.Args[0] { 6817 break 6818 } 6819 mem := x.Args[2] 6820 if !(x.Uses == 1 && clobber(x)) { 6821 break 6822 } 6823 v.reset(Op386MOVLstore) 6824 v.AuxInt = i - 2 6825 v.Aux = s 6826 v.AddArg(p) 6827 v.AddArg(w0) 6828 v.AddArg(mem) 6829 return true 6830 } 6831 return false 6832 } 6833 func rewriteValue386_Op386MOVWstoreconst(v *Value) bool { 6834 b := v.Block 6835 _ = b 6836 config := b.Func.Config 6837 _ = config 6838 // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 6839 // cond: ValAndOff(sc).canAdd(off) 6840 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 6841 for { 6842 sc := v.AuxInt 6843 s := v.Aux 6844 v_0 := v.Args[0] 6845 if v_0.Op != Op386ADDLconst { 6846 break 6847 } 6848 off := v_0.AuxInt 6849 ptr := v_0.Args[0] 6850 mem := v.Args[1] 6851 if !(ValAndOff(sc).canAdd(off)) { 6852 break 6853 } 6854 v.reset(Op386MOVWstoreconst) 6855 v.AuxInt = ValAndOff(sc).add(off) 6856 v.Aux = s 6857 v.AddArg(ptr) 6858 v.AddArg(mem) 6859 return true 6860 } 6861 // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 6862 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 6863 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 6864 for { 6865 sc := v.AuxInt 6866 sym1 := v.Aux 6867 v_0 := v.Args[0] 6868 if v_0.Op != Op386LEAL { 6869 break 6870 } 6871 off := v_0.AuxInt 6872 sym2 := v_0.Aux 6873 ptr := v_0.Args[0] 6874 mem := v.Args[1] 6875 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 6876 break 6877 } 6878 v.reset(Op386MOVWstoreconst) 6879 v.AuxInt = ValAndOff(sc).add(off) 6880 v.Aux = mergeSym(sym1, sym2) 6881 v.AddArg(ptr) 6882 v.AddArg(mem) 6883 return true 6884 } 6885 // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 6886 // cond: canMergeSym(sym1, sym2) 6887 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 6888 for { 6889 x := v.AuxInt 6890 sym1 := v.Aux 6891 v_0 := v.Args[0] 6892 if v_0.Op != Op386LEAL1 { 6893 break 6894 } 6895 off := v_0.AuxInt 6896 sym2 := v_0.Aux 6897 ptr := v_0.Args[0] 6898 idx := v_0.Args[1] 6899 mem := v.Args[1] 6900 if !(canMergeSym(sym1, sym2)) { 6901 break 6902 } 6903 v.reset(Op386MOVWstoreconstidx1) 6904 v.AuxInt = ValAndOff(x).add(off) 6905 v.Aux = mergeSym(sym1, sym2) 6906 v.AddArg(ptr) 6907 v.AddArg(idx) 6908 v.AddArg(mem) 6909 return true 6910 } 6911 // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) 6912 // cond: canMergeSym(sym1, sym2) 6913 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 6914 for { 6915 x := v.AuxInt 6916 sym1 := v.Aux 6917 v_0 := v.Args[0] 6918 if v_0.Op != Op386LEAL2 { 6919 break 6920 } 6921 off := v_0.AuxInt 6922 sym2 := v_0.Aux 6923 ptr := v_0.Args[0] 6924 idx := v_0.Args[1] 6925 mem := v.Args[1] 6926 if !(canMergeSym(sym1, sym2)) { 6927 break 6928 } 6929 v.reset(Op386MOVWstoreconstidx2) 6930 v.AuxInt = ValAndOff(x).add(off) 6931 v.Aux = mergeSym(sym1, sym2) 6932 v.AddArg(ptr) 6933 v.AddArg(idx) 6934 v.AddArg(mem) 6935 return true 6936 } 6937 // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) 6938 // cond: 6939 // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) 6940 for { 6941 x := v.AuxInt 6942 sym := v.Aux 6943 v_0 := v.Args[0] 6944 if v_0.Op != Op386ADDL { 6945 break 6946 } 6947 ptr := v_0.Args[0] 6948 idx := v_0.Args[1] 6949 mem := v.Args[1] 6950 v.reset(Op386MOVWstoreconstidx1) 6951 v.AuxInt = x 6952 v.Aux = sym 6953 v.AddArg(ptr) 6954 v.AddArg(idx) 6955 v.AddArg(mem) 6956 return true 6957 } 6958 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 6959 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 6960 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 6961 for { 6962 c := v.AuxInt 6963 s := v.Aux 6964 p := v.Args[0] 6965 x := v.Args[1] 6966 if x.Op != Op386MOVWstoreconst { 6967 break 6968 } 6969 a := x.AuxInt 6970 if x.Aux != s { 6971 break 6972 } 6973 if p != x.Args[0] { 6974 break 6975 } 6976 mem := x.Args[1] 6977 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 6978 break 6979 } 6980 v.reset(Op386MOVLstoreconst) 6981 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 6982 v.Aux = s 6983 v.AddArg(p) 6984 v.AddArg(mem) 6985 return true 6986 } 6987 return false 6988 } 6989 func rewriteValue386_Op386MOVWstoreconstidx1(v *Value) bool { 6990 // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 6991 // cond: 6992 // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) 6993 for { 6994 c := v.AuxInt 6995 sym := v.Aux 6996 ptr := v.Args[0] 6997 v_1 := v.Args[1] 6998 if v_1.Op != Op386SHLLconst { 6999 break 7000 } 7001 if v_1.AuxInt != 1 { 7002 break 7003 } 7004 idx := v_1.Args[0] 7005 mem := v.Args[2] 7006 v.reset(Op386MOVWstoreconstidx2) 7007 v.AuxInt = c 7008 v.Aux = sym 7009 v.AddArg(ptr) 7010 v.AddArg(idx) 7011 v.AddArg(mem) 7012 return true 7013 } 7014 // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 7015 // cond: 7016 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7017 for { 7018 x := v.AuxInt 7019 sym := v.Aux 7020 v_0 := v.Args[0] 7021 if v_0.Op != Op386ADDLconst { 7022 break 7023 } 7024 c := v_0.AuxInt 7025 ptr := v_0.Args[0] 7026 idx := v.Args[1] 7027 mem := v.Args[2] 7028 v.reset(Op386MOVWstoreconstidx1) 7029 v.AuxInt = ValAndOff(x).add(c) 7030 v.Aux = sym 7031 v.AddArg(ptr) 7032 v.AddArg(idx) 7033 v.AddArg(mem) 7034 return true 7035 } 7036 // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 7037 // cond: 7038 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7039 for { 7040 x := v.AuxInt 7041 sym := v.Aux 7042 ptr := v.Args[0] 7043 v_1 := v.Args[1] 7044 if v_1.Op != Op386ADDLconst { 7045 break 7046 } 7047 c := v_1.AuxInt 7048 idx := v_1.Args[0] 7049 mem := v.Args[2] 7050 v.reset(Op386MOVWstoreconstidx1) 7051 v.AuxInt = ValAndOff(x).add(c) 7052 v.Aux = sym 7053 v.AddArg(ptr) 7054 v.AddArg(idx) 7055 v.AddArg(mem) 7056 return true 7057 } 7058 // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) 7059 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7060 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) 7061 for { 7062 c := v.AuxInt 7063 s := v.Aux 7064 p := v.Args[0] 7065 i := v.Args[1] 7066 x := v.Args[2] 7067 if x.Op != Op386MOVWstoreconstidx1 { 7068 break 7069 } 7070 a := x.AuxInt 7071 if x.Aux != s { 7072 break 7073 } 7074 if p != x.Args[0] { 7075 break 7076 } 7077 if i != x.Args[1] { 7078 break 7079 } 7080 mem := x.Args[2] 7081 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7082 break 7083 } 7084 v.reset(Op386MOVLstoreconstidx1) 7085 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7086 v.Aux = s 7087 v.AddArg(p) 7088 v.AddArg(i) 7089 v.AddArg(mem) 7090 return true 7091 } 7092 return false 7093 } 7094 func rewriteValue386_Op386MOVWstoreconstidx2(v *Value) bool { 7095 b := v.Block 7096 _ = b 7097 // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) 7098 // cond: 7099 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7100 for { 7101 x := v.AuxInt 7102 sym := v.Aux 7103 v_0 := v.Args[0] 7104 if v_0.Op != Op386ADDLconst { 7105 break 7106 } 7107 c := v_0.AuxInt 7108 ptr := v_0.Args[0] 7109 idx := v.Args[1] 7110 mem := v.Args[2] 7111 v.reset(Op386MOVWstoreconstidx2) 7112 v.AuxInt = ValAndOff(x).add(c) 7113 v.Aux = sym 7114 v.AddArg(ptr) 7115 v.AddArg(idx) 7116 v.AddArg(mem) 7117 return true 7118 } 7119 // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) 7120 // cond: 7121 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) 7122 for { 7123 x := v.AuxInt 7124 sym := v.Aux 7125 ptr := v.Args[0] 7126 v_1 := v.Args[1] 7127 if v_1.Op != Op386ADDLconst { 7128 break 7129 } 7130 c := v_1.AuxInt 7131 idx := v_1.Args[0] 7132 mem := v.Args[2] 7133 v.reset(Op386MOVWstoreconstidx2) 7134 v.AuxInt = ValAndOff(x).add(2 * c) 7135 v.Aux = sym 7136 v.AddArg(ptr) 7137 v.AddArg(idx) 7138 v.AddArg(mem) 7139 return true 7140 } 7141 // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) 7142 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7143 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst <i.Type> [1] i) mem) 7144 for { 7145 c := v.AuxInt 7146 s := v.Aux 7147 p := v.Args[0] 7148 i := v.Args[1] 7149 x := v.Args[2] 7150 if x.Op != Op386MOVWstoreconstidx2 { 7151 break 7152 } 7153 a := x.AuxInt 7154 if x.Aux != s { 7155 break 7156 } 7157 if p != x.Args[0] { 7158 break 7159 } 7160 if i != x.Args[1] { 7161 break 7162 } 7163 mem := x.Args[2] 7164 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7165 break 7166 } 7167 v.reset(Op386MOVLstoreconstidx1) 7168 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7169 v.Aux = s 7170 v.AddArg(p) 7171 v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) 7172 v0.AuxInt = 1 7173 v0.AddArg(i) 7174 v.AddArg(v0) 7175 v.AddArg(mem) 7176 return true 7177 } 7178 return false 7179 } 7180 func rewriteValue386_Op386MOVWstoreidx1(v *Value) bool { 7181 // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) 7182 // cond: 7183 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7184 for { 7185 c := v.AuxInt 7186 sym := v.Aux 7187 ptr := v.Args[0] 7188 v_1 := v.Args[1] 7189 if v_1.Op != Op386SHLLconst { 7190 break 7191 } 7192 if v_1.AuxInt != 1 { 7193 break 7194 } 7195 idx := v_1.Args[0] 7196 val := v.Args[2] 7197 mem := v.Args[3] 7198 v.reset(Op386MOVWstoreidx2) 7199 v.AuxInt = c 7200 v.Aux = sym 7201 v.AddArg(ptr) 7202 v.AddArg(idx) 7203 v.AddArg(val) 7204 v.AddArg(mem) 7205 return true 7206 } 7207 // match: (MOVWstoreidx1 [c] {sym} (SHLLconst [1] idx) ptr val mem) 7208 // cond: 7209 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7210 for { 7211 c := v.AuxInt 7212 sym := v.Aux 7213 v_0 := v.Args[0] 7214 if v_0.Op != Op386SHLLconst { 7215 break 7216 } 7217 if v_0.AuxInt != 1 { 7218 break 7219 } 7220 idx := v_0.Args[0] 7221 ptr := v.Args[1] 7222 val := v.Args[2] 7223 mem := v.Args[3] 7224 v.reset(Op386MOVWstoreidx2) 7225 v.AuxInt = c 7226 v.Aux = sym 7227 v.AddArg(ptr) 7228 v.AddArg(idx) 7229 v.AddArg(val) 7230 v.AddArg(mem) 7231 return true 7232 } 7233 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 7234 // cond: 7235 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7236 for { 7237 c := v.AuxInt 7238 sym := v.Aux 7239 v_0 := v.Args[0] 7240 if v_0.Op != Op386ADDLconst { 7241 break 7242 } 7243 d := v_0.AuxInt 7244 ptr := v_0.Args[0] 7245 idx := v.Args[1] 7246 val := v.Args[2] 7247 mem := v.Args[3] 7248 v.reset(Op386MOVWstoreidx1) 7249 v.AuxInt = c + d 7250 v.Aux = sym 7251 v.AddArg(ptr) 7252 v.AddArg(idx) 7253 v.AddArg(val) 7254 v.AddArg(mem) 7255 return true 7256 } 7257 // match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 7258 // cond: 7259 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7260 for { 7261 c := v.AuxInt 7262 sym := v.Aux 7263 idx := v.Args[0] 7264 v_1 := v.Args[1] 7265 if v_1.Op != Op386ADDLconst { 7266 break 7267 } 7268 d := v_1.AuxInt 7269 ptr := v_1.Args[0] 7270 val := v.Args[2] 7271 mem := v.Args[3] 7272 v.reset(Op386MOVWstoreidx1) 7273 v.AuxInt = c + d 7274 v.Aux = sym 7275 v.AddArg(ptr) 7276 v.AddArg(idx) 7277 v.AddArg(val) 7278 v.AddArg(mem) 7279 return true 7280 } 7281 // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 7282 // cond: 7283 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7284 for { 7285 c := v.AuxInt 7286 sym := v.Aux 7287 ptr := v.Args[0] 7288 v_1 := v.Args[1] 7289 if v_1.Op != Op386ADDLconst { 7290 break 7291 } 7292 d := v_1.AuxInt 7293 idx := v_1.Args[0] 7294 val := v.Args[2] 7295 mem := v.Args[3] 7296 v.reset(Op386MOVWstoreidx1) 7297 v.AuxInt = c + d 7298 v.Aux = sym 7299 v.AddArg(ptr) 7300 v.AddArg(idx) 7301 v.AddArg(val) 7302 v.AddArg(mem) 7303 return true 7304 } 7305 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 7306 // cond: 7307 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7308 for { 7309 c := v.AuxInt 7310 sym := v.Aux 7311 v_0 := v.Args[0] 7312 if v_0.Op != Op386ADDLconst { 7313 break 7314 } 7315 d := v_0.AuxInt 7316 idx := v_0.Args[0] 7317 ptr := v.Args[1] 7318 val := v.Args[2] 7319 mem := v.Args[3] 7320 v.reset(Op386MOVWstoreidx1) 7321 v.AuxInt = c + d 7322 v.Aux = sym 7323 v.AddArg(ptr) 7324 v.AddArg(idx) 7325 v.AddArg(val) 7326 v.AddArg(mem) 7327 return true 7328 } 7329 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7330 // cond: x.Uses == 1 && clobber(x) 7331 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7332 for { 7333 i := v.AuxInt 7334 s := v.Aux 7335 p := v.Args[0] 7336 idx := v.Args[1] 7337 v_2 := v.Args[2] 7338 if v_2.Op != Op386SHRLconst { 7339 break 7340 } 7341 if v_2.AuxInt != 16 { 7342 break 7343 } 7344 w := v_2.Args[0] 7345 x := v.Args[3] 7346 if x.Op != Op386MOVWstoreidx1 { 7347 break 7348 } 7349 if x.AuxInt != i-2 { 7350 break 7351 } 7352 if x.Aux != s { 7353 break 7354 } 7355 if p != x.Args[0] { 7356 break 7357 } 7358 if idx != x.Args[1] { 7359 break 7360 } 7361 if w != x.Args[2] { 7362 break 7363 } 7364 mem := x.Args[3] 7365 if !(x.Uses == 1 && clobber(x)) { 7366 break 7367 } 7368 v.reset(Op386MOVLstoreidx1) 7369 v.AuxInt = i - 2 7370 v.Aux = s 7371 v.AddArg(p) 7372 v.AddArg(idx) 7373 v.AddArg(w) 7374 v.AddArg(mem) 7375 return true 7376 } 7377 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7378 // cond: x.Uses == 1 && clobber(x) 7379 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7380 for { 7381 i := v.AuxInt 7382 s := v.Aux 7383 p := v.Args[0] 7384 idx := v.Args[1] 7385 v_2 := v.Args[2] 7386 if v_2.Op != Op386SHRLconst { 7387 break 7388 } 7389 if v_2.AuxInt != 16 { 7390 break 7391 } 7392 w := v_2.Args[0] 7393 x := v.Args[3] 7394 if x.Op != Op386MOVWstoreidx1 { 7395 break 7396 } 7397 if x.AuxInt != i-2 { 7398 break 7399 } 7400 if x.Aux != s { 7401 break 7402 } 7403 if idx != x.Args[0] { 7404 break 7405 } 7406 if p != x.Args[1] { 7407 break 7408 } 7409 if w != x.Args[2] { 7410 break 7411 } 7412 mem := x.Args[3] 7413 if !(x.Uses == 1 && clobber(x)) { 7414 break 7415 } 7416 v.reset(Op386MOVLstoreidx1) 7417 v.AuxInt = i - 2 7418 v.Aux = s 7419 v.AddArg(p) 7420 v.AddArg(idx) 7421 v.AddArg(w) 7422 v.AddArg(mem) 7423 return true 7424 } 7425 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7426 // cond: x.Uses == 1 && clobber(x) 7427 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7428 for { 7429 i := v.AuxInt 7430 s := v.Aux 7431 idx := v.Args[0] 7432 p := v.Args[1] 7433 v_2 := v.Args[2] 7434 if v_2.Op != Op386SHRLconst { 7435 break 7436 } 7437 if v_2.AuxInt != 16 { 7438 break 7439 } 7440 w := v_2.Args[0] 7441 x := v.Args[3] 7442 if x.Op != Op386MOVWstoreidx1 { 7443 break 7444 } 7445 if x.AuxInt != i-2 { 7446 break 7447 } 7448 if x.Aux != s { 7449 break 7450 } 7451 if p != x.Args[0] { 7452 break 7453 } 7454 if idx != x.Args[1] { 7455 break 7456 } 7457 if w != x.Args[2] { 7458 break 7459 } 7460 mem := x.Args[3] 7461 if !(x.Uses == 1 && clobber(x)) { 7462 break 7463 } 7464 v.reset(Op386MOVLstoreidx1) 7465 v.AuxInt = i - 2 7466 v.Aux = s 7467 v.AddArg(p) 7468 v.AddArg(idx) 7469 v.AddArg(w) 7470 v.AddArg(mem) 7471 return true 7472 } 7473 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7474 // cond: x.Uses == 1 && clobber(x) 7475 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7476 for { 7477 i := v.AuxInt 7478 s := v.Aux 7479 idx := v.Args[0] 7480 p := v.Args[1] 7481 v_2 := v.Args[2] 7482 if v_2.Op != Op386SHRLconst { 7483 break 7484 } 7485 if v_2.AuxInt != 16 { 7486 break 7487 } 7488 w := v_2.Args[0] 7489 x := v.Args[3] 7490 if x.Op != Op386MOVWstoreidx1 { 7491 break 7492 } 7493 if x.AuxInt != i-2 { 7494 break 7495 } 7496 if x.Aux != s { 7497 break 7498 } 7499 if idx != x.Args[0] { 7500 break 7501 } 7502 if p != x.Args[1] { 7503 break 7504 } 7505 if w != x.Args[2] { 7506 break 7507 } 7508 mem := x.Args[3] 7509 if !(x.Uses == 1 && clobber(x)) { 7510 break 7511 } 7512 v.reset(Op386MOVLstoreidx1) 7513 v.AuxInt = i - 2 7514 v.Aux = s 7515 v.AddArg(p) 7516 v.AddArg(idx) 7517 v.AddArg(w) 7518 v.AddArg(mem) 7519 return true 7520 } 7521 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7522 // cond: x.Uses == 1 && clobber(x) 7523 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7524 for { 7525 i := v.AuxInt 7526 s := v.Aux 7527 p := v.Args[0] 7528 idx := v.Args[1] 7529 v_2 := v.Args[2] 7530 if v_2.Op != Op386SHRLconst { 7531 break 7532 } 7533 j := v_2.AuxInt 7534 w := v_2.Args[0] 7535 x := v.Args[3] 7536 if x.Op != Op386MOVWstoreidx1 { 7537 break 7538 } 7539 if x.AuxInt != i-2 { 7540 break 7541 } 7542 if x.Aux != s { 7543 break 7544 } 7545 if p != x.Args[0] { 7546 break 7547 } 7548 if idx != x.Args[1] { 7549 break 7550 } 7551 w0 := x.Args[2] 7552 if w0.Op != Op386SHRLconst { 7553 break 7554 } 7555 if w0.AuxInt != j-16 { 7556 break 7557 } 7558 if w != w0.Args[0] { 7559 break 7560 } 7561 mem := x.Args[3] 7562 if !(x.Uses == 1 && clobber(x)) { 7563 break 7564 } 7565 v.reset(Op386MOVLstoreidx1) 7566 v.AuxInt = i - 2 7567 v.Aux = s 7568 v.AddArg(p) 7569 v.AddArg(idx) 7570 v.AddArg(w0) 7571 v.AddArg(mem) 7572 return true 7573 } 7574 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 7575 // cond: x.Uses == 1 && clobber(x) 7576 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7577 for { 7578 i := v.AuxInt 7579 s := v.Aux 7580 p := v.Args[0] 7581 idx := v.Args[1] 7582 v_2 := v.Args[2] 7583 if v_2.Op != Op386SHRLconst { 7584 break 7585 } 7586 j := v_2.AuxInt 7587 w := v_2.Args[0] 7588 x := v.Args[3] 7589 if x.Op != Op386MOVWstoreidx1 { 7590 break 7591 } 7592 if x.AuxInt != i-2 { 7593 break 7594 } 7595 if x.Aux != s { 7596 break 7597 } 7598 if idx != x.Args[0] { 7599 break 7600 } 7601 if p != x.Args[1] { 7602 break 7603 } 7604 w0 := x.Args[2] 7605 if w0.Op != Op386SHRLconst { 7606 break 7607 } 7608 if w0.AuxInt != j-16 { 7609 break 7610 } 7611 if w != w0.Args[0] { 7612 break 7613 } 7614 mem := x.Args[3] 7615 if !(x.Uses == 1 && clobber(x)) { 7616 break 7617 } 7618 v.reset(Op386MOVLstoreidx1) 7619 v.AuxInt = i - 2 7620 v.Aux = s 7621 v.AddArg(p) 7622 v.AddArg(idx) 7623 v.AddArg(w0) 7624 v.AddArg(mem) 7625 return true 7626 } 7627 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7628 // cond: x.Uses == 1 && clobber(x) 7629 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7630 for { 7631 i := v.AuxInt 7632 s := v.Aux 7633 idx := v.Args[0] 7634 p := v.Args[1] 7635 v_2 := v.Args[2] 7636 if v_2.Op != Op386SHRLconst { 7637 break 7638 } 7639 j := v_2.AuxInt 7640 w := v_2.Args[0] 7641 x := v.Args[3] 7642 if x.Op != Op386MOVWstoreidx1 { 7643 break 7644 } 7645 if x.AuxInt != i-2 { 7646 break 7647 } 7648 if x.Aux != s { 7649 break 7650 } 7651 if p != x.Args[0] { 7652 break 7653 } 7654 if idx != x.Args[1] { 7655 break 7656 } 7657 w0 := x.Args[2] 7658 if w0.Op != Op386SHRLconst { 7659 break 7660 } 7661 if w0.AuxInt != j-16 { 7662 break 7663 } 7664 if w != w0.Args[0] { 7665 break 7666 } 7667 mem := x.Args[3] 7668 if !(x.Uses == 1 && clobber(x)) { 7669 break 7670 } 7671 v.reset(Op386MOVLstoreidx1) 7672 v.AuxInt = i - 2 7673 v.Aux = s 7674 v.AddArg(p) 7675 v.AddArg(idx) 7676 v.AddArg(w0) 7677 v.AddArg(mem) 7678 return true 7679 } 7680 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 7681 // cond: x.Uses == 1 && clobber(x) 7682 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7683 for { 7684 i := v.AuxInt 7685 s := v.Aux 7686 idx := v.Args[0] 7687 p := v.Args[1] 7688 v_2 := v.Args[2] 7689 if v_2.Op != Op386SHRLconst { 7690 break 7691 } 7692 j := v_2.AuxInt 7693 w := v_2.Args[0] 7694 x := v.Args[3] 7695 if x.Op != Op386MOVWstoreidx1 { 7696 break 7697 } 7698 if x.AuxInt != i-2 { 7699 break 7700 } 7701 if x.Aux != s { 7702 break 7703 } 7704 if idx != x.Args[0] { 7705 break 7706 } 7707 if p != x.Args[1] { 7708 break 7709 } 7710 w0 := x.Args[2] 7711 if w0.Op != Op386SHRLconst { 7712 break 7713 } 7714 if w0.AuxInt != j-16 { 7715 break 7716 } 7717 if w != w0.Args[0] { 7718 break 7719 } 7720 mem := x.Args[3] 7721 if !(x.Uses == 1 && clobber(x)) { 7722 break 7723 } 7724 v.reset(Op386MOVLstoreidx1) 7725 v.AuxInt = i - 2 7726 v.Aux = s 7727 v.AddArg(p) 7728 v.AddArg(idx) 7729 v.AddArg(w0) 7730 v.AddArg(mem) 7731 return true 7732 } 7733 return false 7734 } 7735 func rewriteValue386_Op386MOVWstoreidx2(v *Value) bool { 7736 b := v.Block 7737 _ = b 7738 // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) 7739 // cond: 7740 // result: (MOVWstoreidx2 [c+d] {sym} ptr idx val mem) 7741 for { 7742 c := v.AuxInt 7743 sym := v.Aux 7744 v_0 := v.Args[0] 7745 if v_0.Op != Op386ADDLconst { 7746 break 7747 } 7748 d := v_0.AuxInt 7749 ptr := v_0.Args[0] 7750 idx := v.Args[1] 7751 val := v.Args[2] 7752 mem := v.Args[3] 7753 v.reset(Op386MOVWstoreidx2) 7754 v.AuxInt = c + d 7755 v.Aux = sym 7756 v.AddArg(ptr) 7757 v.AddArg(idx) 7758 v.AddArg(val) 7759 v.AddArg(mem) 7760 return true 7761 } 7762 // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) 7763 // cond: 7764 // result: (MOVWstoreidx2 [c+2*d] {sym} ptr idx val mem) 7765 for { 7766 c := v.AuxInt 7767 sym := v.Aux 7768 ptr := v.Args[0] 7769 v_1 := v.Args[1] 7770 if v_1.Op != Op386ADDLconst { 7771 break 7772 } 7773 d := v_1.AuxInt 7774 idx := v_1.Args[0] 7775 val := v.Args[2] 7776 mem := v.Args[3] 7777 v.reset(Op386MOVWstoreidx2) 7778 v.AuxInt = c + 2*d 7779 v.Aux = sym 7780 v.AddArg(ptr) 7781 v.AddArg(idx) 7782 v.AddArg(val) 7783 v.AddArg(mem) 7784 return true 7785 } 7786 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) 7787 // cond: x.Uses == 1 && clobber(x) 7788 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w mem) 7789 for { 7790 i := v.AuxInt 7791 s := v.Aux 7792 p := v.Args[0] 7793 idx := v.Args[1] 7794 v_2 := v.Args[2] 7795 if v_2.Op != Op386SHRLconst { 7796 break 7797 } 7798 if v_2.AuxInt != 16 { 7799 break 7800 } 7801 w := v_2.Args[0] 7802 x := v.Args[3] 7803 if x.Op != Op386MOVWstoreidx2 { 7804 break 7805 } 7806 if x.AuxInt != i-2 { 7807 break 7808 } 7809 if x.Aux != s { 7810 break 7811 } 7812 if p != x.Args[0] { 7813 break 7814 } 7815 if idx != x.Args[1] { 7816 break 7817 } 7818 if w != x.Args[2] { 7819 break 7820 } 7821 mem := x.Args[3] 7822 if !(x.Uses == 1 && clobber(x)) { 7823 break 7824 } 7825 v.reset(Op386MOVLstoreidx1) 7826 v.AuxInt = i - 2 7827 v.Aux = s 7828 v.AddArg(p) 7829 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 7830 v0.AuxInt = 1 7831 v0.AddArg(idx) 7832 v.AddArg(v0) 7833 v.AddArg(w) 7834 v.AddArg(mem) 7835 return true 7836 } 7837 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7838 // cond: x.Uses == 1 && clobber(x) 7839 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w0 mem) 7840 for { 7841 i := v.AuxInt 7842 s := v.Aux 7843 p := v.Args[0] 7844 idx := v.Args[1] 7845 v_2 := v.Args[2] 7846 if v_2.Op != Op386SHRLconst { 7847 break 7848 } 7849 j := v_2.AuxInt 7850 w := v_2.Args[0] 7851 x := v.Args[3] 7852 if x.Op != Op386MOVWstoreidx2 { 7853 break 7854 } 7855 if x.AuxInt != i-2 { 7856 break 7857 } 7858 if x.Aux != s { 7859 break 7860 } 7861 if p != x.Args[0] { 7862 break 7863 } 7864 if idx != x.Args[1] { 7865 break 7866 } 7867 w0 := x.Args[2] 7868 if w0.Op != Op386SHRLconst { 7869 break 7870 } 7871 if w0.AuxInt != j-16 { 7872 break 7873 } 7874 if w != w0.Args[0] { 7875 break 7876 } 7877 mem := x.Args[3] 7878 if !(x.Uses == 1 && clobber(x)) { 7879 break 7880 } 7881 v.reset(Op386MOVLstoreidx1) 7882 v.AuxInt = i - 2 7883 v.Aux = s 7884 v.AddArg(p) 7885 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 7886 v0.AuxInt = 1 7887 v0.AddArg(idx) 7888 v.AddArg(v0) 7889 v.AddArg(w0) 7890 v.AddArg(mem) 7891 return true 7892 } 7893 return false 7894 } 7895 func rewriteValue386_Op386MULL(v *Value) bool { 7896 // match: (MULL x (MOVLconst [c])) 7897 // cond: 7898 // result: (MULLconst [c] x) 7899 for { 7900 x := v.Args[0] 7901 v_1 := v.Args[1] 7902 if v_1.Op != Op386MOVLconst { 7903 break 7904 } 7905 c := v_1.AuxInt 7906 v.reset(Op386MULLconst) 7907 v.AuxInt = c 7908 v.AddArg(x) 7909 return true 7910 } 7911 // match: (MULL (MOVLconst [c]) x) 7912 // cond: 7913 // result: (MULLconst [c] x) 7914 for { 7915 v_0 := v.Args[0] 7916 if v_0.Op != Op386MOVLconst { 7917 break 7918 } 7919 c := v_0.AuxInt 7920 x := v.Args[1] 7921 v.reset(Op386MULLconst) 7922 v.AuxInt = c 7923 v.AddArg(x) 7924 return true 7925 } 7926 return false 7927 } 7928 func rewriteValue386_Op386MULLconst(v *Value) bool { 7929 b := v.Block 7930 _ = b 7931 // match: (MULLconst [c] (MULLconst [d] x)) 7932 // cond: 7933 // result: (MULLconst [int64(int32(c * d))] x) 7934 for { 7935 c := v.AuxInt 7936 v_0 := v.Args[0] 7937 if v_0.Op != Op386MULLconst { 7938 break 7939 } 7940 d := v_0.AuxInt 7941 x := v_0.Args[0] 7942 v.reset(Op386MULLconst) 7943 v.AuxInt = int64(int32(c * d)) 7944 v.AddArg(x) 7945 return true 7946 } 7947 // match: (MULLconst [-1] x) 7948 // cond: 7949 // result: (NEGL x) 7950 for { 7951 if v.AuxInt != -1 { 7952 break 7953 } 7954 x := v.Args[0] 7955 v.reset(Op386NEGL) 7956 v.AddArg(x) 7957 return true 7958 } 7959 // match: (MULLconst [0] _) 7960 // cond: 7961 // result: (MOVLconst [0]) 7962 for { 7963 if v.AuxInt != 0 { 7964 break 7965 } 7966 v.reset(Op386MOVLconst) 7967 v.AuxInt = 0 7968 return true 7969 } 7970 // match: (MULLconst [1] x) 7971 // cond: 7972 // result: x 7973 for { 7974 if v.AuxInt != 1 { 7975 break 7976 } 7977 x := v.Args[0] 7978 v.reset(OpCopy) 7979 v.Type = x.Type 7980 v.AddArg(x) 7981 return true 7982 } 7983 // match: (MULLconst [3] x) 7984 // cond: 7985 // result: (LEAL2 x x) 7986 for { 7987 if v.AuxInt != 3 { 7988 break 7989 } 7990 x := v.Args[0] 7991 v.reset(Op386LEAL2) 7992 v.AddArg(x) 7993 v.AddArg(x) 7994 return true 7995 } 7996 // match: (MULLconst [5] x) 7997 // cond: 7998 // result: (LEAL4 x x) 7999 for { 8000 if v.AuxInt != 5 { 8001 break 8002 } 8003 x := v.Args[0] 8004 v.reset(Op386LEAL4) 8005 v.AddArg(x) 8006 v.AddArg(x) 8007 return true 8008 } 8009 // match: (MULLconst [7] x) 8010 // cond: 8011 // result: (LEAL8 (NEGL <v.Type> x) x) 8012 for { 8013 if v.AuxInt != 7 { 8014 break 8015 } 8016 x := v.Args[0] 8017 v.reset(Op386LEAL8) 8018 v0 := b.NewValue0(v.Pos, Op386NEGL, v.Type) 8019 v0.AddArg(x) 8020 v.AddArg(v0) 8021 v.AddArg(x) 8022 return true 8023 } 8024 // match: (MULLconst [9] x) 8025 // cond: 8026 // result: (LEAL8 x x) 8027 for { 8028 if v.AuxInt != 9 { 8029 break 8030 } 8031 x := v.Args[0] 8032 v.reset(Op386LEAL8) 8033 v.AddArg(x) 8034 v.AddArg(x) 8035 return true 8036 } 8037 // match: (MULLconst [11] x) 8038 // cond: 8039 // result: (LEAL2 x (LEAL4 <v.Type> x x)) 8040 for { 8041 if v.AuxInt != 11 { 8042 break 8043 } 8044 x := v.Args[0] 8045 v.reset(Op386LEAL2) 8046 v.AddArg(x) 8047 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8048 v0.AddArg(x) 8049 v0.AddArg(x) 8050 v.AddArg(v0) 8051 return true 8052 } 8053 // match: (MULLconst [13] x) 8054 // cond: 8055 // result: (LEAL4 x (LEAL2 <v.Type> x x)) 8056 for { 8057 if v.AuxInt != 13 { 8058 break 8059 } 8060 x := v.Args[0] 8061 v.reset(Op386LEAL4) 8062 v.AddArg(x) 8063 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8064 v0.AddArg(x) 8065 v0.AddArg(x) 8066 v.AddArg(v0) 8067 return true 8068 } 8069 // match: (MULLconst [21] x) 8070 // cond: 8071 // result: (LEAL4 x (LEAL4 <v.Type> x x)) 8072 for { 8073 if v.AuxInt != 21 { 8074 break 8075 } 8076 x := v.Args[0] 8077 v.reset(Op386LEAL4) 8078 v.AddArg(x) 8079 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8080 v0.AddArg(x) 8081 v0.AddArg(x) 8082 v.AddArg(v0) 8083 return true 8084 } 8085 // match: (MULLconst [25] x) 8086 // cond: 8087 // result: (LEAL8 x (LEAL2 <v.Type> x x)) 8088 for { 8089 if v.AuxInt != 25 { 8090 break 8091 } 8092 x := v.Args[0] 8093 v.reset(Op386LEAL8) 8094 v.AddArg(x) 8095 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8096 v0.AddArg(x) 8097 v0.AddArg(x) 8098 v.AddArg(v0) 8099 return true 8100 } 8101 // match: (MULLconst [37] x) 8102 // cond: 8103 // result: (LEAL4 x (LEAL8 <v.Type> x x)) 8104 for { 8105 if v.AuxInt != 37 { 8106 break 8107 } 8108 x := v.Args[0] 8109 v.reset(Op386LEAL4) 8110 v.AddArg(x) 8111 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8112 v0.AddArg(x) 8113 v0.AddArg(x) 8114 v.AddArg(v0) 8115 return true 8116 } 8117 // match: (MULLconst [41] x) 8118 // cond: 8119 // result: (LEAL8 x (LEAL4 <v.Type> x x)) 8120 for { 8121 if v.AuxInt != 41 { 8122 break 8123 } 8124 x := v.Args[0] 8125 v.reset(Op386LEAL8) 8126 v.AddArg(x) 8127 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8128 v0.AddArg(x) 8129 v0.AddArg(x) 8130 v.AddArg(v0) 8131 return true 8132 } 8133 // match: (MULLconst [73] x) 8134 // cond: 8135 // result: (LEAL8 x (LEAL8 <v.Type> x x)) 8136 for { 8137 if v.AuxInt != 73 { 8138 break 8139 } 8140 x := v.Args[0] 8141 v.reset(Op386LEAL8) 8142 v.AddArg(x) 8143 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8144 v0.AddArg(x) 8145 v0.AddArg(x) 8146 v.AddArg(v0) 8147 return true 8148 } 8149 // match: (MULLconst [c] x) 8150 // cond: isPowerOfTwo(c) 8151 // result: (SHLLconst [log2(c)] x) 8152 for { 8153 c := v.AuxInt 8154 x := v.Args[0] 8155 if !(isPowerOfTwo(c)) { 8156 break 8157 } 8158 v.reset(Op386SHLLconst) 8159 v.AuxInt = log2(c) 8160 v.AddArg(x) 8161 return true 8162 } 8163 // match: (MULLconst [c] x) 8164 // cond: isPowerOfTwo(c+1) && c >= 15 8165 // result: (SUBL (SHLLconst <v.Type> [log2(c+1)] x) x) 8166 for { 8167 c := v.AuxInt 8168 x := v.Args[0] 8169 if !(isPowerOfTwo(c+1) && c >= 15) { 8170 break 8171 } 8172 v.reset(Op386SUBL) 8173 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8174 v0.AuxInt = log2(c + 1) 8175 v0.AddArg(x) 8176 v.AddArg(v0) 8177 v.AddArg(x) 8178 return true 8179 } 8180 // match: (MULLconst [c] x) 8181 // cond: isPowerOfTwo(c-1) && c >= 17 8182 // result: (LEAL1 (SHLLconst <v.Type> [log2(c-1)] x) x) 8183 for { 8184 c := v.AuxInt 8185 x := v.Args[0] 8186 if !(isPowerOfTwo(c-1) && c >= 17) { 8187 break 8188 } 8189 v.reset(Op386LEAL1) 8190 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8191 v0.AuxInt = log2(c - 1) 8192 v0.AddArg(x) 8193 v.AddArg(v0) 8194 v.AddArg(x) 8195 return true 8196 } 8197 // match: (MULLconst [c] x) 8198 // cond: isPowerOfTwo(c-2) && c >= 34 8199 // result: (LEAL2 (SHLLconst <v.Type> [log2(c-2)] x) x) 8200 for { 8201 c := v.AuxInt 8202 x := v.Args[0] 8203 if !(isPowerOfTwo(c-2) && c >= 34) { 8204 break 8205 } 8206 v.reset(Op386LEAL2) 8207 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8208 v0.AuxInt = log2(c - 2) 8209 v0.AddArg(x) 8210 v.AddArg(v0) 8211 v.AddArg(x) 8212 return true 8213 } 8214 // match: (MULLconst [c] x) 8215 // cond: isPowerOfTwo(c-4) && c >= 68 8216 // result: (LEAL4 (SHLLconst <v.Type> [log2(c-4)] x) x) 8217 for { 8218 c := v.AuxInt 8219 x := v.Args[0] 8220 if !(isPowerOfTwo(c-4) && c >= 68) { 8221 break 8222 } 8223 v.reset(Op386LEAL4) 8224 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8225 v0.AuxInt = log2(c - 4) 8226 v0.AddArg(x) 8227 v.AddArg(v0) 8228 v.AddArg(x) 8229 return true 8230 } 8231 // match: (MULLconst [c] x) 8232 // cond: isPowerOfTwo(c-8) && c >= 136 8233 // result: (LEAL8 (SHLLconst <v.Type> [log2(c-8)] x) x) 8234 for { 8235 c := v.AuxInt 8236 x := v.Args[0] 8237 if !(isPowerOfTwo(c-8) && c >= 136) { 8238 break 8239 } 8240 v.reset(Op386LEAL8) 8241 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8242 v0.AuxInt = log2(c - 8) 8243 v0.AddArg(x) 8244 v.AddArg(v0) 8245 v.AddArg(x) 8246 return true 8247 } 8248 // match: (MULLconst [c] x) 8249 // cond: c%3 == 0 && isPowerOfTwo(c/3) 8250 // result: (SHLLconst [log2(c/3)] (LEAL2 <v.Type> x x)) 8251 for { 8252 c := v.AuxInt 8253 x := v.Args[0] 8254 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 8255 break 8256 } 8257 v.reset(Op386SHLLconst) 8258 v.AuxInt = log2(c / 3) 8259 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8260 v0.AddArg(x) 8261 v0.AddArg(x) 8262 v.AddArg(v0) 8263 return true 8264 } 8265 // match: (MULLconst [c] x) 8266 // cond: c%5 == 0 && isPowerOfTwo(c/5) 8267 // result: (SHLLconst [log2(c/5)] (LEAL4 <v.Type> x x)) 8268 for { 8269 c := v.AuxInt 8270 x := v.Args[0] 8271 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 8272 break 8273 } 8274 v.reset(Op386SHLLconst) 8275 v.AuxInt = log2(c / 5) 8276 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8277 v0.AddArg(x) 8278 v0.AddArg(x) 8279 v.AddArg(v0) 8280 return true 8281 } 8282 // match: (MULLconst [c] x) 8283 // cond: c%9 == 0 && isPowerOfTwo(c/9) 8284 // result: (SHLLconst [log2(c/9)] (LEAL8 <v.Type> x x)) 8285 for { 8286 c := v.AuxInt 8287 x := v.Args[0] 8288 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 8289 break 8290 } 8291 v.reset(Op386SHLLconst) 8292 v.AuxInt = log2(c / 9) 8293 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8294 v0.AddArg(x) 8295 v0.AddArg(x) 8296 v.AddArg(v0) 8297 return true 8298 } 8299 // match: (MULLconst [c] (MOVLconst [d])) 8300 // cond: 8301 // result: (MOVLconst [int64(int32(c*d))]) 8302 for { 8303 c := v.AuxInt 8304 v_0 := v.Args[0] 8305 if v_0.Op != Op386MOVLconst { 8306 break 8307 } 8308 d := v_0.AuxInt 8309 v.reset(Op386MOVLconst) 8310 v.AuxInt = int64(int32(c * d)) 8311 return true 8312 } 8313 return false 8314 } 8315 func rewriteValue386_Op386NEGL(v *Value) bool { 8316 // match: (NEGL (MOVLconst [c])) 8317 // cond: 8318 // result: (MOVLconst [int64(int32(-c))]) 8319 for { 8320 v_0 := v.Args[0] 8321 if v_0.Op != Op386MOVLconst { 8322 break 8323 } 8324 c := v_0.AuxInt 8325 v.reset(Op386MOVLconst) 8326 v.AuxInt = int64(int32(-c)) 8327 return true 8328 } 8329 return false 8330 } 8331 func rewriteValue386_Op386NOTL(v *Value) bool { 8332 // match: (NOTL (MOVLconst [c])) 8333 // cond: 8334 // result: (MOVLconst [^c]) 8335 for { 8336 v_0 := v.Args[0] 8337 if v_0.Op != Op386MOVLconst { 8338 break 8339 } 8340 c := v_0.AuxInt 8341 v.reset(Op386MOVLconst) 8342 v.AuxInt = ^c 8343 return true 8344 } 8345 return false 8346 } 8347 func rewriteValue386_Op386ORL(v *Value) bool { 8348 b := v.Block 8349 _ = b 8350 types := &b.Func.Config.Types 8351 _ = types 8352 // match: (ORL x (MOVLconst [c])) 8353 // cond: 8354 // result: (ORLconst [c] x) 8355 for { 8356 x := v.Args[0] 8357 v_1 := v.Args[1] 8358 if v_1.Op != Op386MOVLconst { 8359 break 8360 } 8361 c := v_1.AuxInt 8362 v.reset(Op386ORLconst) 8363 v.AuxInt = c 8364 v.AddArg(x) 8365 return true 8366 } 8367 // match: (ORL (MOVLconst [c]) x) 8368 // cond: 8369 // result: (ORLconst [c] x) 8370 for { 8371 v_0 := v.Args[0] 8372 if v_0.Op != Op386MOVLconst { 8373 break 8374 } 8375 c := v_0.AuxInt 8376 x := v.Args[1] 8377 v.reset(Op386ORLconst) 8378 v.AuxInt = c 8379 v.AddArg(x) 8380 return true 8381 } 8382 // match: (ORL (SHLLconst [c] x) (SHRLconst [d] x)) 8383 // cond: d == 32-c 8384 // result: (ROLLconst [c] x) 8385 for { 8386 v_0 := v.Args[0] 8387 if v_0.Op != Op386SHLLconst { 8388 break 8389 } 8390 c := v_0.AuxInt 8391 x := v_0.Args[0] 8392 v_1 := v.Args[1] 8393 if v_1.Op != Op386SHRLconst { 8394 break 8395 } 8396 d := v_1.AuxInt 8397 if x != v_1.Args[0] { 8398 break 8399 } 8400 if !(d == 32-c) { 8401 break 8402 } 8403 v.reset(Op386ROLLconst) 8404 v.AuxInt = c 8405 v.AddArg(x) 8406 return true 8407 } 8408 // match: (ORL (SHRLconst [d] x) (SHLLconst [c] x)) 8409 // cond: d == 32-c 8410 // result: (ROLLconst [c] x) 8411 for { 8412 v_0 := v.Args[0] 8413 if v_0.Op != Op386SHRLconst { 8414 break 8415 } 8416 d := v_0.AuxInt 8417 x := v_0.Args[0] 8418 v_1 := v.Args[1] 8419 if v_1.Op != Op386SHLLconst { 8420 break 8421 } 8422 c := v_1.AuxInt 8423 if x != v_1.Args[0] { 8424 break 8425 } 8426 if !(d == 32-c) { 8427 break 8428 } 8429 v.reset(Op386ROLLconst) 8430 v.AuxInt = c 8431 v.AddArg(x) 8432 return true 8433 } 8434 // match: (ORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 8435 // cond: c < 16 && d == 16-c && t.Size() == 2 8436 // result: (ROLWconst x [c]) 8437 for { 8438 t := v.Type 8439 v_0 := v.Args[0] 8440 if v_0.Op != Op386SHLLconst { 8441 break 8442 } 8443 c := v_0.AuxInt 8444 x := v_0.Args[0] 8445 v_1 := v.Args[1] 8446 if v_1.Op != Op386SHRWconst { 8447 break 8448 } 8449 d := v_1.AuxInt 8450 if x != v_1.Args[0] { 8451 break 8452 } 8453 if !(c < 16 && d == 16-c && t.Size() == 2) { 8454 break 8455 } 8456 v.reset(Op386ROLWconst) 8457 v.AuxInt = c 8458 v.AddArg(x) 8459 return true 8460 } 8461 // match: (ORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 8462 // cond: c < 16 && d == 16-c && t.Size() == 2 8463 // result: (ROLWconst x [c]) 8464 for { 8465 t := v.Type 8466 v_0 := v.Args[0] 8467 if v_0.Op != Op386SHRWconst { 8468 break 8469 } 8470 d := v_0.AuxInt 8471 x := v_0.Args[0] 8472 v_1 := v.Args[1] 8473 if v_1.Op != Op386SHLLconst { 8474 break 8475 } 8476 c := v_1.AuxInt 8477 if x != v_1.Args[0] { 8478 break 8479 } 8480 if !(c < 16 && d == 16-c && t.Size() == 2) { 8481 break 8482 } 8483 v.reset(Op386ROLWconst) 8484 v.AuxInt = c 8485 v.AddArg(x) 8486 return true 8487 } 8488 // match: (ORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 8489 // cond: c < 8 && d == 8-c && t.Size() == 1 8490 // result: (ROLBconst x [c]) 8491 for { 8492 t := v.Type 8493 v_0 := v.Args[0] 8494 if v_0.Op != Op386SHLLconst { 8495 break 8496 } 8497 c := v_0.AuxInt 8498 x := v_0.Args[0] 8499 v_1 := v.Args[1] 8500 if v_1.Op != Op386SHRBconst { 8501 break 8502 } 8503 d := v_1.AuxInt 8504 if x != v_1.Args[0] { 8505 break 8506 } 8507 if !(c < 8 && d == 8-c && t.Size() == 1) { 8508 break 8509 } 8510 v.reset(Op386ROLBconst) 8511 v.AuxInt = c 8512 v.AddArg(x) 8513 return true 8514 } 8515 // match: (ORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 8516 // cond: c < 8 && d == 8-c && t.Size() == 1 8517 // result: (ROLBconst x [c]) 8518 for { 8519 t := v.Type 8520 v_0 := v.Args[0] 8521 if v_0.Op != Op386SHRBconst { 8522 break 8523 } 8524 d := v_0.AuxInt 8525 x := v_0.Args[0] 8526 v_1 := v.Args[1] 8527 if v_1.Op != Op386SHLLconst { 8528 break 8529 } 8530 c := v_1.AuxInt 8531 if x != v_1.Args[0] { 8532 break 8533 } 8534 if !(c < 8 && d == 8-c && t.Size() == 1) { 8535 break 8536 } 8537 v.reset(Op386ROLBconst) 8538 v.AuxInt = c 8539 v.AddArg(x) 8540 return true 8541 } 8542 // match: (ORL x x) 8543 // cond: 8544 // result: x 8545 for { 8546 x := v.Args[0] 8547 if x != v.Args[1] { 8548 break 8549 } 8550 v.reset(OpCopy) 8551 v.Type = x.Type 8552 v.AddArg(x) 8553 return true 8554 } 8555 // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) 8556 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8557 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 8558 for { 8559 x0 := v.Args[0] 8560 if x0.Op != Op386MOVBload { 8561 break 8562 } 8563 i0 := x0.AuxInt 8564 s := x0.Aux 8565 p := x0.Args[0] 8566 mem := x0.Args[1] 8567 s0 := v.Args[1] 8568 if s0.Op != Op386SHLLconst { 8569 break 8570 } 8571 if s0.AuxInt != 8 { 8572 break 8573 } 8574 x1 := s0.Args[0] 8575 if x1.Op != Op386MOVBload { 8576 break 8577 } 8578 i1 := x1.AuxInt 8579 if x1.Aux != s { 8580 break 8581 } 8582 if p != x1.Args[0] { 8583 break 8584 } 8585 if mem != x1.Args[1] { 8586 break 8587 } 8588 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 8589 break 8590 } 8591 b = mergePoint(b, x0, x1) 8592 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 8593 v.reset(OpCopy) 8594 v.AddArg(v0) 8595 v0.AuxInt = i0 8596 v0.Aux = s 8597 v0.AddArg(p) 8598 v0.AddArg(mem) 8599 return true 8600 } 8601 // match: (ORL s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) 8602 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8603 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 8604 for { 8605 s0 := v.Args[0] 8606 if s0.Op != Op386SHLLconst { 8607 break 8608 } 8609 if s0.AuxInt != 8 { 8610 break 8611 } 8612 x1 := s0.Args[0] 8613 if x1.Op != Op386MOVBload { 8614 break 8615 } 8616 i1 := x1.AuxInt 8617 s := x1.Aux 8618 p := x1.Args[0] 8619 mem := x1.Args[1] 8620 x0 := v.Args[1] 8621 if x0.Op != Op386MOVBload { 8622 break 8623 } 8624 i0 := x0.AuxInt 8625 if x0.Aux != s { 8626 break 8627 } 8628 if p != x0.Args[0] { 8629 break 8630 } 8631 if mem != x0.Args[1] { 8632 break 8633 } 8634 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 8635 break 8636 } 8637 b = mergePoint(b, x0, x1) 8638 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 8639 v.reset(OpCopy) 8640 v.AddArg(v0) 8641 v0.AuxInt = i0 8642 v0.Aux = s 8643 v0.AddArg(p) 8644 v0.AddArg(mem) 8645 return true 8646 } 8647 // match: (ORL o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem))) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) 8648 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8649 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8650 for { 8651 o0 := v.Args[0] 8652 if o0.Op != Op386ORL { 8653 break 8654 } 8655 x0 := o0.Args[0] 8656 if x0.Op != Op386MOVWload { 8657 break 8658 } 8659 i0 := x0.AuxInt 8660 s := x0.Aux 8661 p := x0.Args[0] 8662 mem := x0.Args[1] 8663 s0 := o0.Args[1] 8664 if s0.Op != Op386SHLLconst { 8665 break 8666 } 8667 if s0.AuxInt != 16 { 8668 break 8669 } 8670 x1 := s0.Args[0] 8671 if x1.Op != Op386MOVBload { 8672 break 8673 } 8674 i2 := x1.AuxInt 8675 if x1.Aux != s { 8676 break 8677 } 8678 if p != x1.Args[0] { 8679 break 8680 } 8681 if mem != x1.Args[1] { 8682 break 8683 } 8684 s1 := v.Args[1] 8685 if s1.Op != Op386SHLLconst { 8686 break 8687 } 8688 if s1.AuxInt != 24 { 8689 break 8690 } 8691 x2 := s1.Args[0] 8692 if x2.Op != Op386MOVBload { 8693 break 8694 } 8695 i3 := x2.AuxInt 8696 if x2.Aux != s { 8697 break 8698 } 8699 if p != x2.Args[0] { 8700 break 8701 } 8702 if mem != x2.Args[1] { 8703 break 8704 } 8705 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8706 break 8707 } 8708 b = mergePoint(b, x0, x1, x2) 8709 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8710 v.reset(OpCopy) 8711 v.AddArg(v0) 8712 v0.AuxInt = i0 8713 v0.Aux = s 8714 v0.AddArg(p) 8715 v0.AddArg(mem) 8716 return true 8717 } 8718 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)) x0:(MOVWload [i0] {s} p mem)) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) 8719 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8720 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8721 for { 8722 o0 := v.Args[0] 8723 if o0.Op != Op386ORL { 8724 break 8725 } 8726 s0 := o0.Args[0] 8727 if s0.Op != Op386SHLLconst { 8728 break 8729 } 8730 if s0.AuxInt != 16 { 8731 break 8732 } 8733 x1 := s0.Args[0] 8734 if x1.Op != Op386MOVBload { 8735 break 8736 } 8737 i2 := x1.AuxInt 8738 s := x1.Aux 8739 p := x1.Args[0] 8740 mem := x1.Args[1] 8741 x0 := o0.Args[1] 8742 if x0.Op != Op386MOVWload { 8743 break 8744 } 8745 i0 := x0.AuxInt 8746 if x0.Aux != s { 8747 break 8748 } 8749 if p != x0.Args[0] { 8750 break 8751 } 8752 if mem != x0.Args[1] { 8753 break 8754 } 8755 s1 := v.Args[1] 8756 if s1.Op != Op386SHLLconst { 8757 break 8758 } 8759 if s1.AuxInt != 24 { 8760 break 8761 } 8762 x2 := s1.Args[0] 8763 if x2.Op != Op386MOVBload { 8764 break 8765 } 8766 i3 := x2.AuxInt 8767 if x2.Aux != s { 8768 break 8769 } 8770 if p != x2.Args[0] { 8771 break 8772 } 8773 if mem != x2.Args[1] { 8774 break 8775 } 8776 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8777 break 8778 } 8779 b = mergePoint(b, x0, x1, x2) 8780 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8781 v.reset(OpCopy) 8782 v.AddArg(v0) 8783 v0.AuxInt = i0 8784 v0.Aux = s 8785 v0.AddArg(p) 8786 v0.AddArg(mem) 8787 return true 8788 } 8789 // match: (ORL s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)) o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)))) 8790 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8791 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8792 for { 8793 s1 := v.Args[0] 8794 if s1.Op != Op386SHLLconst { 8795 break 8796 } 8797 if s1.AuxInt != 24 { 8798 break 8799 } 8800 x2 := s1.Args[0] 8801 if x2.Op != Op386MOVBload { 8802 break 8803 } 8804 i3 := x2.AuxInt 8805 s := x2.Aux 8806 p := x2.Args[0] 8807 mem := x2.Args[1] 8808 o0 := v.Args[1] 8809 if o0.Op != Op386ORL { 8810 break 8811 } 8812 x0 := o0.Args[0] 8813 if x0.Op != Op386MOVWload { 8814 break 8815 } 8816 i0 := x0.AuxInt 8817 if x0.Aux != s { 8818 break 8819 } 8820 if p != x0.Args[0] { 8821 break 8822 } 8823 if mem != x0.Args[1] { 8824 break 8825 } 8826 s0 := o0.Args[1] 8827 if s0.Op != Op386SHLLconst { 8828 break 8829 } 8830 if s0.AuxInt != 16 { 8831 break 8832 } 8833 x1 := s0.Args[0] 8834 if x1.Op != Op386MOVBload { 8835 break 8836 } 8837 i2 := x1.AuxInt 8838 if x1.Aux != s { 8839 break 8840 } 8841 if p != x1.Args[0] { 8842 break 8843 } 8844 if mem != x1.Args[1] { 8845 break 8846 } 8847 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8848 break 8849 } 8850 b = mergePoint(b, x0, x1, x2) 8851 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8852 v.reset(OpCopy) 8853 v.AddArg(v0) 8854 v0.AuxInt = i0 8855 v0.Aux = s 8856 v0.AddArg(p) 8857 v0.AddArg(mem) 8858 return true 8859 } 8860 // match: (ORL s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)) x0:(MOVWload [i0] {s} p mem))) 8861 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8862 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8863 for { 8864 s1 := v.Args[0] 8865 if s1.Op != Op386SHLLconst { 8866 break 8867 } 8868 if s1.AuxInt != 24 { 8869 break 8870 } 8871 x2 := s1.Args[0] 8872 if x2.Op != Op386MOVBload { 8873 break 8874 } 8875 i3 := x2.AuxInt 8876 s := x2.Aux 8877 p := x2.Args[0] 8878 mem := x2.Args[1] 8879 o0 := v.Args[1] 8880 if o0.Op != Op386ORL { 8881 break 8882 } 8883 s0 := o0.Args[0] 8884 if s0.Op != Op386SHLLconst { 8885 break 8886 } 8887 if s0.AuxInt != 16 { 8888 break 8889 } 8890 x1 := s0.Args[0] 8891 if x1.Op != Op386MOVBload { 8892 break 8893 } 8894 i2 := x1.AuxInt 8895 if x1.Aux != s { 8896 break 8897 } 8898 if p != x1.Args[0] { 8899 break 8900 } 8901 if mem != x1.Args[1] { 8902 break 8903 } 8904 x0 := o0.Args[1] 8905 if x0.Op != Op386MOVWload { 8906 break 8907 } 8908 i0 := x0.AuxInt 8909 if x0.Aux != s { 8910 break 8911 } 8912 if p != x0.Args[0] { 8913 break 8914 } 8915 if mem != x0.Args[1] { 8916 break 8917 } 8918 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8919 break 8920 } 8921 b = mergePoint(b, x0, x1, x2) 8922 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8923 v.reset(OpCopy) 8924 v.AddArg(v0) 8925 v0.AuxInt = i0 8926 v0.Aux = s 8927 v0.AddArg(p) 8928 v0.AddArg(mem) 8929 return true 8930 } 8931 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 8932 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8933 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 8934 for { 8935 x0 := v.Args[0] 8936 if x0.Op != Op386MOVBloadidx1 { 8937 break 8938 } 8939 i0 := x0.AuxInt 8940 s := x0.Aux 8941 p := x0.Args[0] 8942 idx := x0.Args[1] 8943 mem := x0.Args[2] 8944 s0 := v.Args[1] 8945 if s0.Op != Op386SHLLconst { 8946 break 8947 } 8948 if s0.AuxInt != 8 { 8949 break 8950 } 8951 x1 := s0.Args[0] 8952 if x1.Op != Op386MOVBloadidx1 { 8953 break 8954 } 8955 i1 := x1.AuxInt 8956 if x1.Aux != s { 8957 break 8958 } 8959 if p != x1.Args[0] { 8960 break 8961 } 8962 if idx != x1.Args[1] { 8963 break 8964 } 8965 if mem != x1.Args[2] { 8966 break 8967 } 8968 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 8969 break 8970 } 8971 b = mergePoint(b, x0, x1) 8972 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 8973 v.reset(OpCopy) 8974 v.AddArg(v0) 8975 v0.AuxInt = i0 8976 v0.Aux = s 8977 v0.AddArg(p) 8978 v0.AddArg(idx) 8979 v0.AddArg(mem) 8980 return true 8981 } 8982 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 8983 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8984 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 8985 for { 8986 x0 := v.Args[0] 8987 if x0.Op != Op386MOVBloadidx1 { 8988 break 8989 } 8990 i0 := x0.AuxInt 8991 s := x0.Aux 8992 idx := x0.Args[0] 8993 p := x0.Args[1] 8994 mem := x0.Args[2] 8995 s0 := v.Args[1] 8996 if s0.Op != Op386SHLLconst { 8997 break 8998 } 8999 if s0.AuxInt != 8 { 9000 break 9001 } 9002 x1 := s0.Args[0] 9003 if x1.Op != Op386MOVBloadidx1 { 9004 break 9005 } 9006 i1 := x1.AuxInt 9007 if x1.Aux != s { 9008 break 9009 } 9010 if p != x1.Args[0] { 9011 break 9012 } 9013 if idx != x1.Args[1] { 9014 break 9015 } 9016 if mem != x1.Args[2] { 9017 break 9018 } 9019 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9020 break 9021 } 9022 b = mergePoint(b, x0, x1) 9023 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9024 v.reset(OpCopy) 9025 v.AddArg(v0) 9026 v0.AuxInt = i0 9027 v0.Aux = s 9028 v0.AddArg(p) 9029 v0.AddArg(idx) 9030 v0.AddArg(mem) 9031 return true 9032 } 9033 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9034 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9035 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9036 for { 9037 x0 := v.Args[0] 9038 if x0.Op != Op386MOVBloadidx1 { 9039 break 9040 } 9041 i0 := x0.AuxInt 9042 s := x0.Aux 9043 p := x0.Args[0] 9044 idx := x0.Args[1] 9045 mem := x0.Args[2] 9046 s0 := v.Args[1] 9047 if s0.Op != Op386SHLLconst { 9048 break 9049 } 9050 if s0.AuxInt != 8 { 9051 break 9052 } 9053 x1 := s0.Args[0] 9054 if x1.Op != Op386MOVBloadidx1 { 9055 break 9056 } 9057 i1 := x1.AuxInt 9058 if x1.Aux != s { 9059 break 9060 } 9061 if idx != x1.Args[0] { 9062 break 9063 } 9064 if p != x1.Args[1] { 9065 break 9066 } 9067 if mem != x1.Args[2] { 9068 break 9069 } 9070 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9071 break 9072 } 9073 b = mergePoint(b, x0, x1) 9074 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9075 v.reset(OpCopy) 9076 v.AddArg(v0) 9077 v0.AuxInt = i0 9078 v0.Aux = s 9079 v0.AddArg(p) 9080 v0.AddArg(idx) 9081 v0.AddArg(mem) 9082 return true 9083 } 9084 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9085 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9086 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9087 for { 9088 x0 := v.Args[0] 9089 if x0.Op != Op386MOVBloadidx1 { 9090 break 9091 } 9092 i0 := x0.AuxInt 9093 s := x0.Aux 9094 idx := x0.Args[0] 9095 p := x0.Args[1] 9096 mem := x0.Args[2] 9097 s0 := v.Args[1] 9098 if s0.Op != Op386SHLLconst { 9099 break 9100 } 9101 if s0.AuxInt != 8 { 9102 break 9103 } 9104 x1 := s0.Args[0] 9105 if x1.Op != Op386MOVBloadidx1 { 9106 break 9107 } 9108 i1 := x1.AuxInt 9109 if x1.Aux != s { 9110 break 9111 } 9112 if idx != x1.Args[0] { 9113 break 9114 } 9115 if p != x1.Args[1] { 9116 break 9117 } 9118 if mem != x1.Args[2] { 9119 break 9120 } 9121 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9122 break 9123 } 9124 b = mergePoint(b, x0, x1) 9125 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9126 v.reset(OpCopy) 9127 v.AddArg(v0) 9128 v0.AuxInt = i0 9129 v0.Aux = s 9130 v0.AddArg(p) 9131 v0.AddArg(idx) 9132 v0.AddArg(mem) 9133 return true 9134 } 9135 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9136 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9137 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9138 for { 9139 s0 := v.Args[0] 9140 if s0.Op != Op386SHLLconst { 9141 break 9142 } 9143 if s0.AuxInt != 8 { 9144 break 9145 } 9146 x1 := s0.Args[0] 9147 if x1.Op != Op386MOVBloadidx1 { 9148 break 9149 } 9150 i1 := x1.AuxInt 9151 s := x1.Aux 9152 p := x1.Args[0] 9153 idx := x1.Args[1] 9154 mem := x1.Args[2] 9155 x0 := v.Args[1] 9156 if x0.Op != Op386MOVBloadidx1 { 9157 break 9158 } 9159 i0 := x0.AuxInt 9160 if x0.Aux != s { 9161 break 9162 } 9163 if p != x0.Args[0] { 9164 break 9165 } 9166 if idx != x0.Args[1] { 9167 break 9168 } 9169 if mem != x0.Args[2] { 9170 break 9171 } 9172 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9173 break 9174 } 9175 b = mergePoint(b, x0, x1) 9176 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9177 v.reset(OpCopy) 9178 v.AddArg(v0) 9179 v0.AuxInt = i0 9180 v0.Aux = s 9181 v0.AddArg(p) 9182 v0.AddArg(idx) 9183 v0.AddArg(mem) 9184 return true 9185 } 9186 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9187 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9188 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9189 for { 9190 s0 := v.Args[0] 9191 if s0.Op != Op386SHLLconst { 9192 break 9193 } 9194 if s0.AuxInt != 8 { 9195 break 9196 } 9197 x1 := s0.Args[0] 9198 if x1.Op != Op386MOVBloadidx1 { 9199 break 9200 } 9201 i1 := x1.AuxInt 9202 s := x1.Aux 9203 idx := x1.Args[0] 9204 p := x1.Args[1] 9205 mem := x1.Args[2] 9206 x0 := v.Args[1] 9207 if x0.Op != Op386MOVBloadidx1 { 9208 break 9209 } 9210 i0 := x0.AuxInt 9211 if x0.Aux != s { 9212 break 9213 } 9214 if p != x0.Args[0] { 9215 break 9216 } 9217 if idx != x0.Args[1] { 9218 break 9219 } 9220 if mem != x0.Args[2] { 9221 break 9222 } 9223 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9224 break 9225 } 9226 b = mergePoint(b, x0, x1) 9227 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9228 v.reset(OpCopy) 9229 v.AddArg(v0) 9230 v0.AuxInt = i0 9231 v0.Aux = s 9232 v0.AddArg(p) 9233 v0.AddArg(idx) 9234 v0.AddArg(mem) 9235 return true 9236 } 9237 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9238 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9239 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9240 for { 9241 s0 := v.Args[0] 9242 if s0.Op != Op386SHLLconst { 9243 break 9244 } 9245 if s0.AuxInt != 8 { 9246 break 9247 } 9248 x1 := s0.Args[0] 9249 if x1.Op != Op386MOVBloadidx1 { 9250 break 9251 } 9252 i1 := x1.AuxInt 9253 s := x1.Aux 9254 p := x1.Args[0] 9255 idx := x1.Args[1] 9256 mem := x1.Args[2] 9257 x0 := v.Args[1] 9258 if x0.Op != Op386MOVBloadidx1 { 9259 break 9260 } 9261 i0 := x0.AuxInt 9262 if x0.Aux != s { 9263 break 9264 } 9265 if idx != x0.Args[0] { 9266 break 9267 } 9268 if p != x0.Args[1] { 9269 break 9270 } 9271 if mem != x0.Args[2] { 9272 break 9273 } 9274 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9275 break 9276 } 9277 b = mergePoint(b, x0, x1) 9278 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9279 v.reset(OpCopy) 9280 v.AddArg(v0) 9281 v0.AuxInt = i0 9282 v0.Aux = s 9283 v0.AddArg(p) 9284 v0.AddArg(idx) 9285 v0.AddArg(mem) 9286 return true 9287 } 9288 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9289 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9290 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9291 for { 9292 s0 := v.Args[0] 9293 if s0.Op != Op386SHLLconst { 9294 break 9295 } 9296 if s0.AuxInt != 8 { 9297 break 9298 } 9299 x1 := s0.Args[0] 9300 if x1.Op != Op386MOVBloadidx1 { 9301 break 9302 } 9303 i1 := x1.AuxInt 9304 s := x1.Aux 9305 idx := x1.Args[0] 9306 p := x1.Args[1] 9307 mem := x1.Args[2] 9308 x0 := v.Args[1] 9309 if x0.Op != Op386MOVBloadidx1 { 9310 break 9311 } 9312 i0 := x0.AuxInt 9313 if x0.Aux != s { 9314 break 9315 } 9316 if idx != x0.Args[0] { 9317 break 9318 } 9319 if p != x0.Args[1] { 9320 break 9321 } 9322 if mem != x0.Args[2] { 9323 break 9324 } 9325 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9326 break 9327 } 9328 b = mergePoint(b, x0, x1) 9329 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9330 v.reset(OpCopy) 9331 v.AddArg(v0) 9332 v0.AuxInt = i0 9333 v0.Aux = s 9334 v0.AddArg(p) 9335 v0.AddArg(idx) 9336 v0.AddArg(mem) 9337 return true 9338 } 9339 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9340 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9341 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9342 for { 9343 o0 := v.Args[0] 9344 if o0.Op != Op386ORL { 9345 break 9346 } 9347 x0 := o0.Args[0] 9348 if x0.Op != Op386MOVWloadidx1 { 9349 break 9350 } 9351 i0 := x0.AuxInt 9352 s := x0.Aux 9353 p := x0.Args[0] 9354 idx := x0.Args[1] 9355 mem := x0.Args[2] 9356 s0 := o0.Args[1] 9357 if s0.Op != Op386SHLLconst { 9358 break 9359 } 9360 if s0.AuxInt != 16 { 9361 break 9362 } 9363 x1 := s0.Args[0] 9364 if x1.Op != Op386MOVBloadidx1 { 9365 break 9366 } 9367 i2 := x1.AuxInt 9368 if x1.Aux != s { 9369 break 9370 } 9371 if p != x1.Args[0] { 9372 break 9373 } 9374 if idx != x1.Args[1] { 9375 break 9376 } 9377 if mem != x1.Args[2] { 9378 break 9379 } 9380 s1 := v.Args[1] 9381 if s1.Op != Op386SHLLconst { 9382 break 9383 } 9384 if s1.AuxInt != 24 { 9385 break 9386 } 9387 x2 := s1.Args[0] 9388 if x2.Op != Op386MOVBloadidx1 { 9389 break 9390 } 9391 i3 := x2.AuxInt 9392 if x2.Aux != s { 9393 break 9394 } 9395 if p != x2.Args[0] { 9396 break 9397 } 9398 if idx != x2.Args[1] { 9399 break 9400 } 9401 if mem != x2.Args[2] { 9402 break 9403 } 9404 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9405 break 9406 } 9407 b = mergePoint(b, x0, x1, x2) 9408 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9409 v.reset(OpCopy) 9410 v.AddArg(v0) 9411 v0.AuxInt = i0 9412 v0.Aux = s 9413 v0.AddArg(p) 9414 v0.AddArg(idx) 9415 v0.AddArg(mem) 9416 return true 9417 } 9418 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9419 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9420 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9421 for { 9422 o0 := v.Args[0] 9423 if o0.Op != Op386ORL { 9424 break 9425 } 9426 x0 := o0.Args[0] 9427 if x0.Op != Op386MOVWloadidx1 { 9428 break 9429 } 9430 i0 := x0.AuxInt 9431 s := x0.Aux 9432 idx := x0.Args[0] 9433 p := x0.Args[1] 9434 mem := x0.Args[2] 9435 s0 := o0.Args[1] 9436 if s0.Op != Op386SHLLconst { 9437 break 9438 } 9439 if s0.AuxInt != 16 { 9440 break 9441 } 9442 x1 := s0.Args[0] 9443 if x1.Op != Op386MOVBloadidx1 { 9444 break 9445 } 9446 i2 := x1.AuxInt 9447 if x1.Aux != s { 9448 break 9449 } 9450 if p != x1.Args[0] { 9451 break 9452 } 9453 if idx != x1.Args[1] { 9454 break 9455 } 9456 if mem != x1.Args[2] { 9457 break 9458 } 9459 s1 := v.Args[1] 9460 if s1.Op != Op386SHLLconst { 9461 break 9462 } 9463 if s1.AuxInt != 24 { 9464 break 9465 } 9466 x2 := s1.Args[0] 9467 if x2.Op != Op386MOVBloadidx1 { 9468 break 9469 } 9470 i3 := x2.AuxInt 9471 if x2.Aux != s { 9472 break 9473 } 9474 if p != x2.Args[0] { 9475 break 9476 } 9477 if idx != x2.Args[1] { 9478 break 9479 } 9480 if mem != x2.Args[2] { 9481 break 9482 } 9483 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9484 break 9485 } 9486 b = mergePoint(b, x0, x1, x2) 9487 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9488 v.reset(OpCopy) 9489 v.AddArg(v0) 9490 v0.AuxInt = i0 9491 v0.Aux = s 9492 v0.AddArg(p) 9493 v0.AddArg(idx) 9494 v0.AddArg(mem) 9495 return true 9496 } 9497 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9498 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9499 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9500 for { 9501 o0 := v.Args[0] 9502 if o0.Op != Op386ORL { 9503 break 9504 } 9505 x0 := o0.Args[0] 9506 if x0.Op != Op386MOVWloadidx1 { 9507 break 9508 } 9509 i0 := x0.AuxInt 9510 s := x0.Aux 9511 p := x0.Args[0] 9512 idx := x0.Args[1] 9513 mem := x0.Args[2] 9514 s0 := o0.Args[1] 9515 if s0.Op != Op386SHLLconst { 9516 break 9517 } 9518 if s0.AuxInt != 16 { 9519 break 9520 } 9521 x1 := s0.Args[0] 9522 if x1.Op != Op386MOVBloadidx1 { 9523 break 9524 } 9525 i2 := x1.AuxInt 9526 if x1.Aux != s { 9527 break 9528 } 9529 if idx != x1.Args[0] { 9530 break 9531 } 9532 if p != x1.Args[1] { 9533 break 9534 } 9535 if mem != x1.Args[2] { 9536 break 9537 } 9538 s1 := v.Args[1] 9539 if s1.Op != Op386SHLLconst { 9540 break 9541 } 9542 if s1.AuxInt != 24 { 9543 break 9544 } 9545 x2 := s1.Args[0] 9546 if x2.Op != Op386MOVBloadidx1 { 9547 break 9548 } 9549 i3 := x2.AuxInt 9550 if x2.Aux != s { 9551 break 9552 } 9553 if p != x2.Args[0] { 9554 break 9555 } 9556 if idx != x2.Args[1] { 9557 break 9558 } 9559 if mem != x2.Args[2] { 9560 break 9561 } 9562 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9563 break 9564 } 9565 b = mergePoint(b, x0, x1, x2) 9566 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9567 v.reset(OpCopy) 9568 v.AddArg(v0) 9569 v0.AuxInt = i0 9570 v0.Aux = s 9571 v0.AddArg(p) 9572 v0.AddArg(idx) 9573 v0.AddArg(mem) 9574 return true 9575 } 9576 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9577 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9578 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9579 for { 9580 o0 := v.Args[0] 9581 if o0.Op != Op386ORL { 9582 break 9583 } 9584 x0 := o0.Args[0] 9585 if x0.Op != Op386MOVWloadidx1 { 9586 break 9587 } 9588 i0 := x0.AuxInt 9589 s := x0.Aux 9590 idx := x0.Args[0] 9591 p := x0.Args[1] 9592 mem := x0.Args[2] 9593 s0 := o0.Args[1] 9594 if s0.Op != Op386SHLLconst { 9595 break 9596 } 9597 if s0.AuxInt != 16 { 9598 break 9599 } 9600 x1 := s0.Args[0] 9601 if x1.Op != Op386MOVBloadidx1 { 9602 break 9603 } 9604 i2 := x1.AuxInt 9605 if x1.Aux != s { 9606 break 9607 } 9608 if idx != x1.Args[0] { 9609 break 9610 } 9611 if p != x1.Args[1] { 9612 break 9613 } 9614 if mem != x1.Args[2] { 9615 break 9616 } 9617 s1 := v.Args[1] 9618 if s1.Op != Op386SHLLconst { 9619 break 9620 } 9621 if s1.AuxInt != 24 { 9622 break 9623 } 9624 x2 := s1.Args[0] 9625 if x2.Op != Op386MOVBloadidx1 { 9626 break 9627 } 9628 i3 := x2.AuxInt 9629 if x2.Aux != s { 9630 break 9631 } 9632 if p != x2.Args[0] { 9633 break 9634 } 9635 if idx != x2.Args[1] { 9636 break 9637 } 9638 if mem != x2.Args[2] { 9639 break 9640 } 9641 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9642 break 9643 } 9644 b = mergePoint(b, x0, x1, x2) 9645 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9646 v.reset(OpCopy) 9647 v.AddArg(v0) 9648 v0.AuxInt = i0 9649 v0.Aux = s 9650 v0.AddArg(p) 9651 v0.AddArg(idx) 9652 v0.AddArg(mem) 9653 return true 9654 } 9655 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9656 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9657 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9658 for { 9659 o0 := v.Args[0] 9660 if o0.Op != Op386ORL { 9661 break 9662 } 9663 s0 := o0.Args[0] 9664 if s0.Op != Op386SHLLconst { 9665 break 9666 } 9667 if s0.AuxInt != 16 { 9668 break 9669 } 9670 x1 := s0.Args[0] 9671 if x1.Op != Op386MOVBloadidx1 { 9672 break 9673 } 9674 i2 := x1.AuxInt 9675 s := x1.Aux 9676 p := x1.Args[0] 9677 idx := x1.Args[1] 9678 mem := x1.Args[2] 9679 x0 := o0.Args[1] 9680 if x0.Op != Op386MOVWloadidx1 { 9681 break 9682 } 9683 i0 := x0.AuxInt 9684 if x0.Aux != s { 9685 break 9686 } 9687 if p != x0.Args[0] { 9688 break 9689 } 9690 if idx != x0.Args[1] { 9691 break 9692 } 9693 if mem != x0.Args[2] { 9694 break 9695 } 9696 s1 := v.Args[1] 9697 if s1.Op != Op386SHLLconst { 9698 break 9699 } 9700 if s1.AuxInt != 24 { 9701 break 9702 } 9703 x2 := s1.Args[0] 9704 if x2.Op != Op386MOVBloadidx1 { 9705 break 9706 } 9707 i3 := x2.AuxInt 9708 if x2.Aux != s { 9709 break 9710 } 9711 if p != x2.Args[0] { 9712 break 9713 } 9714 if idx != x2.Args[1] { 9715 break 9716 } 9717 if mem != x2.Args[2] { 9718 break 9719 } 9720 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9721 break 9722 } 9723 b = mergePoint(b, x0, x1, x2) 9724 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9725 v.reset(OpCopy) 9726 v.AddArg(v0) 9727 v0.AuxInt = i0 9728 v0.Aux = s 9729 v0.AddArg(p) 9730 v0.AddArg(idx) 9731 v0.AddArg(mem) 9732 return true 9733 } 9734 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9735 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9736 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9737 for { 9738 o0 := v.Args[0] 9739 if o0.Op != Op386ORL { 9740 break 9741 } 9742 s0 := o0.Args[0] 9743 if s0.Op != Op386SHLLconst { 9744 break 9745 } 9746 if s0.AuxInt != 16 { 9747 break 9748 } 9749 x1 := s0.Args[0] 9750 if x1.Op != Op386MOVBloadidx1 { 9751 break 9752 } 9753 i2 := x1.AuxInt 9754 s := x1.Aux 9755 idx := x1.Args[0] 9756 p := x1.Args[1] 9757 mem := x1.Args[2] 9758 x0 := o0.Args[1] 9759 if x0.Op != Op386MOVWloadidx1 { 9760 break 9761 } 9762 i0 := x0.AuxInt 9763 if x0.Aux != s { 9764 break 9765 } 9766 if p != x0.Args[0] { 9767 break 9768 } 9769 if idx != x0.Args[1] { 9770 break 9771 } 9772 if mem != x0.Args[2] { 9773 break 9774 } 9775 s1 := v.Args[1] 9776 if s1.Op != Op386SHLLconst { 9777 break 9778 } 9779 if s1.AuxInt != 24 { 9780 break 9781 } 9782 x2 := s1.Args[0] 9783 if x2.Op != Op386MOVBloadidx1 { 9784 break 9785 } 9786 i3 := x2.AuxInt 9787 if x2.Aux != s { 9788 break 9789 } 9790 if p != x2.Args[0] { 9791 break 9792 } 9793 if idx != x2.Args[1] { 9794 break 9795 } 9796 if mem != x2.Args[2] { 9797 break 9798 } 9799 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9800 break 9801 } 9802 b = mergePoint(b, x0, x1, x2) 9803 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9804 v.reset(OpCopy) 9805 v.AddArg(v0) 9806 v0.AuxInt = i0 9807 v0.Aux = s 9808 v0.AddArg(p) 9809 v0.AddArg(idx) 9810 v0.AddArg(mem) 9811 return true 9812 } 9813 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9814 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9815 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9816 for { 9817 o0 := v.Args[0] 9818 if o0.Op != Op386ORL { 9819 break 9820 } 9821 s0 := o0.Args[0] 9822 if s0.Op != Op386SHLLconst { 9823 break 9824 } 9825 if s0.AuxInt != 16 { 9826 break 9827 } 9828 x1 := s0.Args[0] 9829 if x1.Op != Op386MOVBloadidx1 { 9830 break 9831 } 9832 i2 := x1.AuxInt 9833 s := x1.Aux 9834 p := x1.Args[0] 9835 idx := x1.Args[1] 9836 mem := x1.Args[2] 9837 x0 := o0.Args[1] 9838 if x0.Op != Op386MOVWloadidx1 { 9839 break 9840 } 9841 i0 := x0.AuxInt 9842 if x0.Aux != s { 9843 break 9844 } 9845 if idx != x0.Args[0] { 9846 break 9847 } 9848 if p != x0.Args[1] { 9849 break 9850 } 9851 if mem != x0.Args[2] { 9852 break 9853 } 9854 s1 := v.Args[1] 9855 if s1.Op != Op386SHLLconst { 9856 break 9857 } 9858 if s1.AuxInt != 24 { 9859 break 9860 } 9861 x2 := s1.Args[0] 9862 if x2.Op != Op386MOVBloadidx1 { 9863 break 9864 } 9865 i3 := x2.AuxInt 9866 if x2.Aux != s { 9867 break 9868 } 9869 if p != x2.Args[0] { 9870 break 9871 } 9872 if idx != x2.Args[1] { 9873 break 9874 } 9875 if mem != x2.Args[2] { 9876 break 9877 } 9878 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9879 break 9880 } 9881 b = mergePoint(b, x0, x1, x2) 9882 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9883 v.reset(OpCopy) 9884 v.AddArg(v0) 9885 v0.AuxInt = i0 9886 v0.Aux = s 9887 v0.AddArg(p) 9888 v0.AddArg(idx) 9889 v0.AddArg(mem) 9890 return true 9891 } 9892 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9893 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9894 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9895 for { 9896 o0 := v.Args[0] 9897 if o0.Op != Op386ORL { 9898 break 9899 } 9900 s0 := o0.Args[0] 9901 if s0.Op != Op386SHLLconst { 9902 break 9903 } 9904 if s0.AuxInt != 16 { 9905 break 9906 } 9907 x1 := s0.Args[0] 9908 if x1.Op != Op386MOVBloadidx1 { 9909 break 9910 } 9911 i2 := x1.AuxInt 9912 s := x1.Aux 9913 idx := x1.Args[0] 9914 p := x1.Args[1] 9915 mem := x1.Args[2] 9916 x0 := o0.Args[1] 9917 if x0.Op != Op386MOVWloadidx1 { 9918 break 9919 } 9920 i0 := x0.AuxInt 9921 if x0.Aux != s { 9922 break 9923 } 9924 if idx != x0.Args[0] { 9925 break 9926 } 9927 if p != x0.Args[1] { 9928 break 9929 } 9930 if mem != x0.Args[2] { 9931 break 9932 } 9933 s1 := v.Args[1] 9934 if s1.Op != Op386SHLLconst { 9935 break 9936 } 9937 if s1.AuxInt != 24 { 9938 break 9939 } 9940 x2 := s1.Args[0] 9941 if x2.Op != Op386MOVBloadidx1 { 9942 break 9943 } 9944 i3 := x2.AuxInt 9945 if x2.Aux != s { 9946 break 9947 } 9948 if p != x2.Args[0] { 9949 break 9950 } 9951 if idx != x2.Args[1] { 9952 break 9953 } 9954 if mem != x2.Args[2] { 9955 break 9956 } 9957 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9958 break 9959 } 9960 b = mergePoint(b, x0, x1, x2) 9961 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9962 v.reset(OpCopy) 9963 v.AddArg(v0) 9964 v0.AuxInt = i0 9965 v0.Aux = s 9966 v0.AddArg(p) 9967 v0.AddArg(idx) 9968 v0.AddArg(mem) 9969 return true 9970 } 9971 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 9972 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9973 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9974 for { 9975 o0 := v.Args[0] 9976 if o0.Op != Op386ORL { 9977 break 9978 } 9979 x0 := o0.Args[0] 9980 if x0.Op != Op386MOVWloadidx1 { 9981 break 9982 } 9983 i0 := x0.AuxInt 9984 s := x0.Aux 9985 p := x0.Args[0] 9986 idx := x0.Args[1] 9987 mem := x0.Args[2] 9988 s0 := o0.Args[1] 9989 if s0.Op != Op386SHLLconst { 9990 break 9991 } 9992 if s0.AuxInt != 16 { 9993 break 9994 } 9995 x1 := s0.Args[0] 9996 if x1.Op != Op386MOVBloadidx1 { 9997 break 9998 } 9999 i2 := x1.AuxInt 10000 if x1.Aux != s { 10001 break 10002 } 10003 if p != x1.Args[0] { 10004 break 10005 } 10006 if idx != x1.Args[1] { 10007 break 10008 } 10009 if mem != x1.Args[2] { 10010 break 10011 } 10012 s1 := v.Args[1] 10013 if s1.Op != Op386SHLLconst { 10014 break 10015 } 10016 if s1.AuxInt != 24 { 10017 break 10018 } 10019 x2 := s1.Args[0] 10020 if x2.Op != Op386MOVBloadidx1 { 10021 break 10022 } 10023 i3 := x2.AuxInt 10024 if x2.Aux != s { 10025 break 10026 } 10027 if idx != x2.Args[0] { 10028 break 10029 } 10030 if p != x2.Args[1] { 10031 break 10032 } 10033 if mem != x2.Args[2] { 10034 break 10035 } 10036 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10037 break 10038 } 10039 b = mergePoint(b, x0, x1, x2) 10040 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10041 v.reset(OpCopy) 10042 v.AddArg(v0) 10043 v0.AuxInt = i0 10044 v0.Aux = s 10045 v0.AddArg(p) 10046 v0.AddArg(idx) 10047 v0.AddArg(mem) 10048 return true 10049 } 10050 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10051 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10052 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10053 for { 10054 o0 := v.Args[0] 10055 if o0.Op != Op386ORL { 10056 break 10057 } 10058 x0 := o0.Args[0] 10059 if x0.Op != Op386MOVWloadidx1 { 10060 break 10061 } 10062 i0 := x0.AuxInt 10063 s := x0.Aux 10064 idx := x0.Args[0] 10065 p := x0.Args[1] 10066 mem := x0.Args[2] 10067 s0 := o0.Args[1] 10068 if s0.Op != Op386SHLLconst { 10069 break 10070 } 10071 if s0.AuxInt != 16 { 10072 break 10073 } 10074 x1 := s0.Args[0] 10075 if x1.Op != Op386MOVBloadidx1 { 10076 break 10077 } 10078 i2 := x1.AuxInt 10079 if x1.Aux != s { 10080 break 10081 } 10082 if p != x1.Args[0] { 10083 break 10084 } 10085 if idx != x1.Args[1] { 10086 break 10087 } 10088 if mem != x1.Args[2] { 10089 break 10090 } 10091 s1 := v.Args[1] 10092 if s1.Op != Op386SHLLconst { 10093 break 10094 } 10095 if s1.AuxInt != 24 { 10096 break 10097 } 10098 x2 := s1.Args[0] 10099 if x2.Op != Op386MOVBloadidx1 { 10100 break 10101 } 10102 i3 := x2.AuxInt 10103 if x2.Aux != s { 10104 break 10105 } 10106 if idx != x2.Args[0] { 10107 break 10108 } 10109 if p != x2.Args[1] { 10110 break 10111 } 10112 if mem != x2.Args[2] { 10113 break 10114 } 10115 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10116 break 10117 } 10118 b = mergePoint(b, x0, x1, x2) 10119 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10120 v.reset(OpCopy) 10121 v.AddArg(v0) 10122 v0.AuxInt = i0 10123 v0.Aux = s 10124 v0.AddArg(p) 10125 v0.AddArg(idx) 10126 v0.AddArg(mem) 10127 return true 10128 } 10129 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10130 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10131 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10132 for { 10133 o0 := v.Args[0] 10134 if o0.Op != Op386ORL { 10135 break 10136 } 10137 x0 := o0.Args[0] 10138 if x0.Op != Op386MOVWloadidx1 { 10139 break 10140 } 10141 i0 := x0.AuxInt 10142 s := x0.Aux 10143 p := x0.Args[0] 10144 idx := x0.Args[1] 10145 mem := x0.Args[2] 10146 s0 := o0.Args[1] 10147 if s0.Op != Op386SHLLconst { 10148 break 10149 } 10150 if s0.AuxInt != 16 { 10151 break 10152 } 10153 x1 := s0.Args[0] 10154 if x1.Op != Op386MOVBloadidx1 { 10155 break 10156 } 10157 i2 := x1.AuxInt 10158 if x1.Aux != s { 10159 break 10160 } 10161 if idx != x1.Args[0] { 10162 break 10163 } 10164 if p != x1.Args[1] { 10165 break 10166 } 10167 if mem != x1.Args[2] { 10168 break 10169 } 10170 s1 := v.Args[1] 10171 if s1.Op != Op386SHLLconst { 10172 break 10173 } 10174 if s1.AuxInt != 24 { 10175 break 10176 } 10177 x2 := s1.Args[0] 10178 if x2.Op != Op386MOVBloadidx1 { 10179 break 10180 } 10181 i3 := x2.AuxInt 10182 if x2.Aux != s { 10183 break 10184 } 10185 if idx != x2.Args[0] { 10186 break 10187 } 10188 if p != x2.Args[1] { 10189 break 10190 } 10191 if mem != x2.Args[2] { 10192 break 10193 } 10194 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10195 break 10196 } 10197 b = mergePoint(b, x0, x1, x2) 10198 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10199 v.reset(OpCopy) 10200 v.AddArg(v0) 10201 v0.AuxInt = i0 10202 v0.Aux = s 10203 v0.AddArg(p) 10204 v0.AddArg(idx) 10205 v0.AddArg(mem) 10206 return true 10207 } 10208 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10209 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10210 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10211 for { 10212 o0 := v.Args[0] 10213 if o0.Op != Op386ORL { 10214 break 10215 } 10216 x0 := o0.Args[0] 10217 if x0.Op != Op386MOVWloadidx1 { 10218 break 10219 } 10220 i0 := x0.AuxInt 10221 s := x0.Aux 10222 idx := x0.Args[0] 10223 p := x0.Args[1] 10224 mem := x0.Args[2] 10225 s0 := o0.Args[1] 10226 if s0.Op != Op386SHLLconst { 10227 break 10228 } 10229 if s0.AuxInt != 16 { 10230 break 10231 } 10232 x1 := s0.Args[0] 10233 if x1.Op != Op386MOVBloadidx1 { 10234 break 10235 } 10236 i2 := x1.AuxInt 10237 if x1.Aux != s { 10238 break 10239 } 10240 if idx != x1.Args[0] { 10241 break 10242 } 10243 if p != x1.Args[1] { 10244 break 10245 } 10246 if mem != x1.Args[2] { 10247 break 10248 } 10249 s1 := v.Args[1] 10250 if s1.Op != Op386SHLLconst { 10251 break 10252 } 10253 if s1.AuxInt != 24 { 10254 break 10255 } 10256 x2 := s1.Args[0] 10257 if x2.Op != Op386MOVBloadidx1 { 10258 break 10259 } 10260 i3 := x2.AuxInt 10261 if x2.Aux != s { 10262 break 10263 } 10264 if idx != x2.Args[0] { 10265 break 10266 } 10267 if p != x2.Args[1] { 10268 break 10269 } 10270 if mem != x2.Args[2] { 10271 break 10272 } 10273 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10274 break 10275 } 10276 b = mergePoint(b, x0, x1, x2) 10277 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10278 v.reset(OpCopy) 10279 v.AddArg(v0) 10280 v0.AuxInt = i0 10281 v0.Aux = s 10282 v0.AddArg(p) 10283 v0.AddArg(idx) 10284 v0.AddArg(mem) 10285 return true 10286 } 10287 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10288 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10289 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10290 for { 10291 o0 := v.Args[0] 10292 if o0.Op != Op386ORL { 10293 break 10294 } 10295 s0 := o0.Args[0] 10296 if s0.Op != Op386SHLLconst { 10297 break 10298 } 10299 if s0.AuxInt != 16 { 10300 break 10301 } 10302 x1 := s0.Args[0] 10303 if x1.Op != Op386MOVBloadidx1 { 10304 break 10305 } 10306 i2 := x1.AuxInt 10307 s := x1.Aux 10308 p := x1.Args[0] 10309 idx := x1.Args[1] 10310 mem := x1.Args[2] 10311 x0 := o0.Args[1] 10312 if x0.Op != Op386MOVWloadidx1 { 10313 break 10314 } 10315 i0 := x0.AuxInt 10316 if x0.Aux != s { 10317 break 10318 } 10319 if p != x0.Args[0] { 10320 break 10321 } 10322 if idx != x0.Args[1] { 10323 break 10324 } 10325 if mem != x0.Args[2] { 10326 break 10327 } 10328 s1 := v.Args[1] 10329 if s1.Op != Op386SHLLconst { 10330 break 10331 } 10332 if s1.AuxInt != 24 { 10333 break 10334 } 10335 x2 := s1.Args[0] 10336 if x2.Op != Op386MOVBloadidx1 { 10337 break 10338 } 10339 i3 := x2.AuxInt 10340 if x2.Aux != s { 10341 break 10342 } 10343 if idx != x2.Args[0] { 10344 break 10345 } 10346 if p != x2.Args[1] { 10347 break 10348 } 10349 if mem != x2.Args[2] { 10350 break 10351 } 10352 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10353 break 10354 } 10355 b = mergePoint(b, x0, x1, x2) 10356 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10357 v.reset(OpCopy) 10358 v.AddArg(v0) 10359 v0.AuxInt = i0 10360 v0.Aux = s 10361 v0.AddArg(p) 10362 v0.AddArg(idx) 10363 v0.AddArg(mem) 10364 return true 10365 } 10366 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10367 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10368 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10369 for { 10370 o0 := v.Args[0] 10371 if o0.Op != Op386ORL { 10372 break 10373 } 10374 s0 := o0.Args[0] 10375 if s0.Op != Op386SHLLconst { 10376 break 10377 } 10378 if s0.AuxInt != 16 { 10379 break 10380 } 10381 x1 := s0.Args[0] 10382 if x1.Op != Op386MOVBloadidx1 { 10383 break 10384 } 10385 i2 := x1.AuxInt 10386 s := x1.Aux 10387 idx := x1.Args[0] 10388 p := x1.Args[1] 10389 mem := x1.Args[2] 10390 x0 := o0.Args[1] 10391 if x0.Op != Op386MOVWloadidx1 { 10392 break 10393 } 10394 i0 := x0.AuxInt 10395 if x0.Aux != s { 10396 break 10397 } 10398 if p != x0.Args[0] { 10399 break 10400 } 10401 if idx != x0.Args[1] { 10402 break 10403 } 10404 if mem != x0.Args[2] { 10405 break 10406 } 10407 s1 := v.Args[1] 10408 if s1.Op != Op386SHLLconst { 10409 break 10410 } 10411 if s1.AuxInt != 24 { 10412 break 10413 } 10414 x2 := s1.Args[0] 10415 if x2.Op != Op386MOVBloadidx1 { 10416 break 10417 } 10418 i3 := x2.AuxInt 10419 if x2.Aux != s { 10420 break 10421 } 10422 if idx != x2.Args[0] { 10423 break 10424 } 10425 if p != x2.Args[1] { 10426 break 10427 } 10428 if mem != x2.Args[2] { 10429 break 10430 } 10431 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10432 break 10433 } 10434 b = mergePoint(b, x0, x1, x2) 10435 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10436 v.reset(OpCopy) 10437 v.AddArg(v0) 10438 v0.AuxInt = i0 10439 v0.Aux = s 10440 v0.AddArg(p) 10441 v0.AddArg(idx) 10442 v0.AddArg(mem) 10443 return true 10444 } 10445 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10446 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10447 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10448 for { 10449 o0 := v.Args[0] 10450 if o0.Op != Op386ORL { 10451 break 10452 } 10453 s0 := o0.Args[0] 10454 if s0.Op != Op386SHLLconst { 10455 break 10456 } 10457 if s0.AuxInt != 16 { 10458 break 10459 } 10460 x1 := s0.Args[0] 10461 if x1.Op != Op386MOVBloadidx1 { 10462 break 10463 } 10464 i2 := x1.AuxInt 10465 s := x1.Aux 10466 p := x1.Args[0] 10467 idx := x1.Args[1] 10468 mem := x1.Args[2] 10469 x0 := o0.Args[1] 10470 if x0.Op != Op386MOVWloadidx1 { 10471 break 10472 } 10473 i0 := x0.AuxInt 10474 if x0.Aux != s { 10475 break 10476 } 10477 if idx != x0.Args[0] { 10478 break 10479 } 10480 if p != x0.Args[1] { 10481 break 10482 } 10483 if mem != x0.Args[2] { 10484 break 10485 } 10486 s1 := v.Args[1] 10487 if s1.Op != Op386SHLLconst { 10488 break 10489 } 10490 if s1.AuxInt != 24 { 10491 break 10492 } 10493 x2 := s1.Args[0] 10494 if x2.Op != Op386MOVBloadidx1 { 10495 break 10496 } 10497 i3 := x2.AuxInt 10498 if x2.Aux != s { 10499 break 10500 } 10501 if idx != x2.Args[0] { 10502 break 10503 } 10504 if p != x2.Args[1] { 10505 break 10506 } 10507 if mem != x2.Args[2] { 10508 break 10509 } 10510 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10511 break 10512 } 10513 b = mergePoint(b, x0, x1, x2) 10514 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10515 v.reset(OpCopy) 10516 v.AddArg(v0) 10517 v0.AuxInt = i0 10518 v0.Aux = s 10519 v0.AddArg(p) 10520 v0.AddArg(idx) 10521 v0.AddArg(mem) 10522 return true 10523 } 10524 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10525 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10526 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10527 for { 10528 o0 := v.Args[0] 10529 if o0.Op != Op386ORL { 10530 break 10531 } 10532 s0 := o0.Args[0] 10533 if s0.Op != Op386SHLLconst { 10534 break 10535 } 10536 if s0.AuxInt != 16 { 10537 break 10538 } 10539 x1 := s0.Args[0] 10540 if x1.Op != Op386MOVBloadidx1 { 10541 break 10542 } 10543 i2 := x1.AuxInt 10544 s := x1.Aux 10545 idx := x1.Args[0] 10546 p := x1.Args[1] 10547 mem := x1.Args[2] 10548 x0 := o0.Args[1] 10549 if x0.Op != Op386MOVWloadidx1 { 10550 break 10551 } 10552 i0 := x0.AuxInt 10553 if x0.Aux != s { 10554 break 10555 } 10556 if idx != x0.Args[0] { 10557 break 10558 } 10559 if p != x0.Args[1] { 10560 break 10561 } 10562 if mem != x0.Args[2] { 10563 break 10564 } 10565 s1 := v.Args[1] 10566 if s1.Op != Op386SHLLconst { 10567 break 10568 } 10569 if s1.AuxInt != 24 { 10570 break 10571 } 10572 x2 := s1.Args[0] 10573 if x2.Op != Op386MOVBloadidx1 { 10574 break 10575 } 10576 i3 := x2.AuxInt 10577 if x2.Aux != s { 10578 break 10579 } 10580 if idx != x2.Args[0] { 10581 break 10582 } 10583 if p != x2.Args[1] { 10584 break 10585 } 10586 if mem != x2.Args[2] { 10587 break 10588 } 10589 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10590 break 10591 } 10592 b = mergePoint(b, x0, x1, x2) 10593 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10594 v.reset(OpCopy) 10595 v.AddArg(v0) 10596 v0.AuxInt = i0 10597 v0.Aux = s 10598 v0.AddArg(p) 10599 v0.AddArg(idx) 10600 v0.AddArg(mem) 10601 return true 10602 } 10603 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10604 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10605 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10606 for { 10607 s1 := v.Args[0] 10608 if s1.Op != Op386SHLLconst { 10609 break 10610 } 10611 if s1.AuxInt != 24 { 10612 break 10613 } 10614 x2 := s1.Args[0] 10615 if x2.Op != Op386MOVBloadidx1 { 10616 break 10617 } 10618 i3 := x2.AuxInt 10619 s := x2.Aux 10620 p := x2.Args[0] 10621 idx := x2.Args[1] 10622 mem := x2.Args[2] 10623 o0 := v.Args[1] 10624 if o0.Op != Op386ORL { 10625 break 10626 } 10627 x0 := o0.Args[0] 10628 if x0.Op != Op386MOVWloadidx1 { 10629 break 10630 } 10631 i0 := x0.AuxInt 10632 if x0.Aux != s { 10633 break 10634 } 10635 if p != x0.Args[0] { 10636 break 10637 } 10638 if idx != x0.Args[1] { 10639 break 10640 } 10641 if mem != x0.Args[2] { 10642 break 10643 } 10644 s0 := o0.Args[1] 10645 if s0.Op != Op386SHLLconst { 10646 break 10647 } 10648 if s0.AuxInt != 16 { 10649 break 10650 } 10651 x1 := s0.Args[0] 10652 if x1.Op != Op386MOVBloadidx1 { 10653 break 10654 } 10655 i2 := x1.AuxInt 10656 if x1.Aux != s { 10657 break 10658 } 10659 if p != x1.Args[0] { 10660 break 10661 } 10662 if idx != x1.Args[1] { 10663 break 10664 } 10665 if mem != x1.Args[2] { 10666 break 10667 } 10668 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10669 break 10670 } 10671 b = mergePoint(b, x0, x1, x2) 10672 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10673 v.reset(OpCopy) 10674 v.AddArg(v0) 10675 v0.AuxInt = i0 10676 v0.Aux = s 10677 v0.AddArg(p) 10678 v0.AddArg(idx) 10679 v0.AddArg(mem) 10680 return true 10681 } 10682 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10683 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10684 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10685 for { 10686 s1 := v.Args[0] 10687 if s1.Op != Op386SHLLconst { 10688 break 10689 } 10690 if s1.AuxInt != 24 { 10691 break 10692 } 10693 x2 := s1.Args[0] 10694 if x2.Op != Op386MOVBloadidx1 { 10695 break 10696 } 10697 i3 := x2.AuxInt 10698 s := x2.Aux 10699 idx := x2.Args[0] 10700 p := x2.Args[1] 10701 mem := x2.Args[2] 10702 o0 := v.Args[1] 10703 if o0.Op != Op386ORL { 10704 break 10705 } 10706 x0 := o0.Args[0] 10707 if x0.Op != Op386MOVWloadidx1 { 10708 break 10709 } 10710 i0 := x0.AuxInt 10711 if x0.Aux != s { 10712 break 10713 } 10714 if p != x0.Args[0] { 10715 break 10716 } 10717 if idx != x0.Args[1] { 10718 break 10719 } 10720 if mem != x0.Args[2] { 10721 break 10722 } 10723 s0 := o0.Args[1] 10724 if s0.Op != Op386SHLLconst { 10725 break 10726 } 10727 if s0.AuxInt != 16 { 10728 break 10729 } 10730 x1 := s0.Args[0] 10731 if x1.Op != Op386MOVBloadidx1 { 10732 break 10733 } 10734 i2 := x1.AuxInt 10735 if x1.Aux != s { 10736 break 10737 } 10738 if p != x1.Args[0] { 10739 break 10740 } 10741 if idx != x1.Args[1] { 10742 break 10743 } 10744 if mem != x1.Args[2] { 10745 break 10746 } 10747 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10748 break 10749 } 10750 b = mergePoint(b, x0, x1, x2) 10751 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10752 v.reset(OpCopy) 10753 v.AddArg(v0) 10754 v0.AuxInt = i0 10755 v0.Aux = s 10756 v0.AddArg(p) 10757 v0.AddArg(idx) 10758 v0.AddArg(mem) 10759 return true 10760 } 10761 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10762 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10763 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10764 for { 10765 s1 := v.Args[0] 10766 if s1.Op != Op386SHLLconst { 10767 break 10768 } 10769 if s1.AuxInt != 24 { 10770 break 10771 } 10772 x2 := s1.Args[0] 10773 if x2.Op != Op386MOVBloadidx1 { 10774 break 10775 } 10776 i3 := x2.AuxInt 10777 s := x2.Aux 10778 p := x2.Args[0] 10779 idx := x2.Args[1] 10780 mem := x2.Args[2] 10781 o0 := v.Args[1] 10782 if o0.Op != Op386ORL { 10783 break 10784 } 10785 x0 := o0.Args[0] 10786 if x0.Op != Op386MOVWloadidx1 { 10787 break 10788 } 10789 i0 := x0.AuxInt 10790 if x0.Aux != s { 10791 break 10792 } 10793 if idx != x0.Args[0] { 10794 break 10795 } 10796 if p != x0.Args[1] { 10797 break 10798 } 10799 if mem != x0.Args[2] { 10800 break 10801 } 10802 s0 := o0.Args[1] 10803 if s0.Op != Op386SHLLconst { 10804 break 10805 } 10806 if s0.AuxInt != 16 { 10807 break 10808 } 10809 x1 := s0.Args[0] 10810 if x1.Op != Op386MOVBloadidx1 { 10811 break 10812 } 10813 i2 := x1.AuxInt 10814 if x1.Aux != s { 10815 break 10816 } 10817 if p != x1.Args[0] { 10818 break 10819 } 10820 if idx != x1.Args[1] { 10821 break 10822 } 10823 if mem != x1.Args[2] { 10824 break 10825 } 10826 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10827 break 10828 } 10829 b = mergePoint(b, x0, x1, x2) 10830 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10831 v.reset(OpCopy) 10832 v.AddArg(v0) 10833 v0.AuxInt = i0 10834 v0.Aux = s 10835 v0.AddArg(p) 10836 v0.AddArg(idx) 10837 v0.AddArg(mem) 10838 return true 10839 } 10840 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10841 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10842 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10843 for { 10844 s1 := v.Args[0] 10845 if s1.Op != Op386SHLLconst { 10846 break 10847 } 10848 if s1.AuxInt != 24 { 10849 break 10850 } 10851 x2 := s1.Args[0] 10852 if x2.Op != Op386MOVBloadidx1 { 10853 break 10854 } 10855 i3 := x2.AuxInt 10856 s := x2.Aux 10857 idx := x2.Args[0] 10858 p := x2.Args[1] 10859 mem := x2.Args[2] 10860 o0 := v.Args[1] 10861 if o0.Op != Op386ORL { 10862 break 10863 } 10864 x0 := o0.Args[0] 10865 if x0.Op != Op386MOVWloadidx1 { 10866 break 10867 } 10868 i0 := x0.AuxInt 10869 if x0.Aux != s { 10870 break 10871 } 10872 if idx != x0.Args[0] { 10873 break 10874 } 10875 if p != x0.Args[1] { 10876 break 10877 } 10878 if mem != x0.Args[2] { 10879 break 10880 } 10881 s0 := o0.Args[1] 10882 if s0.Op != Op386SHLLconst { 10883 break 10884 } 10885 if s0.AuxInt != 16 { 10886 break 10887 } 10888 x1 := s0.Args[0] 10889 if x1.Op != Op386MOVBloadidx1 { 10890 break 10891 } 10892 i2 := x1.AuxInt 10893 if x1.Aux != s { 10894 break 10895 } 10896 if p != x1.Args[0] { 10897 break 10898 } 10899 if idx != x1.Args[1] { 10900 break 10901 } 10902 if mem != x1.Args[2] { 10903 break 10904 } 10905 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10906 break 10907 } 10908 b = mergePoint(b, x0, x1, x2) 10909 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10910 v.reset(OpCopy) 10911 v.AddArg(v0) 10912 v0.AuxInt = i0 10913 v0.Aux = s 10914 v0.AddArg(p) 10915 v0.AddArg(idx) 10916 v0.AddArg(mem) 10917 return true 10918 } 10919 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 10920 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10921 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10922 for { 10923 s1 := v.Args[0] 10924 if s1.Op != Op386SHLLconst { 10925 break 10926 } 10927 if s1.AuxInt != 24 { 10928 break 10929 } 10930 x2 := s1.Args[0] 10931 if x2.Op != Op386MOVBloadidx1 { 10932 break 10933 } 10934 i3 := x2.AuxInt 10935 s := x2.Aux 10936 p := x2.Args[0] 10937 idx := x2.Args[1] 10938 mem := x2.Args[2] 10939 o0 := v.Args[1] 10940 if o0.Op != Op386ORL { 10941 break 10942 } 10943 x0 := o0.Args[0] 10944 if x0.Op != Op386MOVWloadidx1 { 10945 break 10946 } 10947 i0 := x0.AuxInt 10948 if x0.Aux != s { 10949 break 10950 } 10951 if p != x0.Args[0] { 10952 break 10953 } 10954 if idx != x0.Args[1] { 10955 break 10956 } 10957 if mem != x0.Args[2] { 10958 break 10959 } 10960 s0 := o0.Args[1] 10961 if s0.Op != Op386SHLLconst { 10962 break 10963 } 10964 if s0.AuxInt != 16 { 10965 break 10966 } 10967 x1 := s0.Args[0] 10968 if x1.Op != Op386MOVBloadidx1 { 10969 break 10970 } 10971 i2 := x1.AuxInt 10972 if x1.Aux != s { 10973 break 10974 } 10975 if idx != x1.Args[0] { 10976 break 10977 } 10978 if p != x1.Args[1] { 10979 break 10980 } 10981 if mem != x1.Args[2] { 10982 break 10983 } 10984 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10985 break 10986 } 10987 b = mergePoint(b, x0, x1, x2) 10988 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10989 v.reset(OpCopy) 10990 v.AddArg(v0) 10991 v0.AuxInt = i0 10992 v0.Aux = s 10993 v0.AddArg(p) 10994 v0.AddArg(idx) 10995 v0.AddArg(mem) 10996 return true 10997 } 10998 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 10999 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11000 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11001 for { 11002 s1 := v.Args[0] 11003 if s1.Op != Op386SHLLconst { 11004 break 11005 } 11006 if s1.AuxInt != 24 { 11007 break 11008 } 11009 x2 := s1.Args[0] 11010 if x2.Op != Op386MOVBloadidx1 { 11011 break 11012 } 11013 i3 := x2.AuxInt 11014 s := x2.Aux 11015 idx := x2.Args[0] 11016 p := x2.Args[1] 11017 mem := x2.Args[2] 11018 o0 := v.Args[1] 11019 if o0.Op != Op386ORL { 11020 break 11021 } 11022 x0 := o0.Args[0] 11023 if x0.Op != Op386MOVWloadidx1 { 11024 break 11025 } 11026 i0 := x0.AuxInt 11027 if x0.Aux != s { 11028 break 11029 } 11030 if p != x0.Args[0] { 11031 break 11032 } 11033 if idx != x0.Args[1] { 11034 break 11035 } 11036 if mem != x0.Args[2] { 11037 break 11038 } 11039 s0 := o0.Args[1] 11040 if s0.Op != Op386SHLLconst { 11041 break 11042 } 11043 if s0.AuxInt != 16 { 11044 break 11045 } 11046 x1 := s0.Args[0] 11047 if x1.Op != Op386MOVBloadidx1 { 11048 break 11049 } 11050 i2 := x1.AuxInt 11051 if x1.Aux != s { 11052 break 11053 } 11054 if idx != x1.Args[0] { 11055 break 11056 } 11057 if p != x1.Args[1] { 11058 break 11059 } 11060 if mem != x1.Args[2] { 11061 break 11062 } 11063 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11064 break 11065 } 11066 b = mergePoint(b, x0, x1, x2) 11067 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11068 v.reset(OpCopy) 11069 v.AddArg(v0) 11070 v0.AuxInt = i0 11071 v0.Aux = s 11072 v0.AddArg(p) 11073 v0.AddArg(idx) 11074 v0.AddArg(mem) 11075 return true 11076 } 11077 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 11078 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11079 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11080 for { 11081 s1 := v.Args[0] 11082 if s1.Op != Op386SHLLconst { 11083 break 11084 } 11085 if s1.AuxInt != 24 { 11086 break 11087 } 11088 x2 := s1.Args[0] 11089 if x2.Op != Op386MOVBloadidx1 { 11090 break 11091 } 11092 i3 := x2.AuxInt 11093 s := x2.Aux 11094 p := x2.Args[0] 11095 idx := x2.Args[1] 11096 mem := x2.Args[2] 11097 o0 := v.Args[1] 11098 if o0.Op != Op386ORL { 11099 break 11100 } 11101 x0 := o0.Args[0] 11102 if x0.Op != Op386MOVWloadidx1 { 11103 break 11104 } 11105 i0 := x0.AuxInt 11106 if x0.Aux != s { 11107 break 11108 } 11109 if idx != x0.Args[0] { 11110 break 11111 } 11112 if p != x0.Args[1] { 11113 break 11114 } 11115 if mem != x0.Args[2] { 11116 break 11117 } 11118 s0 := o0.Args[1] 11119 if s0.Op != Op386SHLLconst { 11120 break 11121 } 11122 if s0.AuxInt != 16 { 11123 break 11124 } 11125 x1 := s0.Args[0] 11126 if x1.Op != Op386MOVBloadidx1 { 11127 break 11128 } 11129 i2 := x1.AuxInt 11130 if x1.Aux != s { 11131 break 11132 } 11133 if idx != x1.Args[0] { 11134 break 11135 } 11136 if p != x1.Args[1] { 11137 break 11138 } 11139 if mem != x1.Args[2] { 11140 break 11141 } 11142 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11143 break 11144 } 11145 b = mergePoint(b, x0, x1, x2) 11146 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11147 v.reset(OpCopy) 11148 v.AddArg(v0) 11149 v0.AuxInt = i0 11150 v0.Aux = s 11151 v0.AddArg(p) 11152 v0.AddArg(idx) 11153 v0.AddArg(mem) 11154 return true 11155 } 11156 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 11157 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11158 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11159 for { 11160 s1 := v.Args[0] 11161 if s1.Op != Op386SHLLconst { 11162 break 11163 } 11164 if s1.AuxInt != 24 { 11165 break 11166 } 11167 x2 := s1.Args[0] 11168 if x2.Op != Op386MOVBloadidx1 { 11169 break 11170 } 11171 i3 := x2.AuxInt 11172 s := x2.Aux 11173 idx := x2.Args[0] 11174 p := x2.Args[1] 11175 mem := x2.Args[2] 11176 o0 := v.Args[1] 11177 if o0.Op != Op386ORL { 11178 break 11179 } 11180 x0 := o0.Args[0] 11181 if x0.Op != Op386MOVWloadidx1 { 11182 break 11183 } 11184 i0 := x0.AuxInt 11185 if x0.Aux != s { 11186 break 11187 } 11188 if idx != x0.Args[0] { 11189 break 11190 } 11191 if p != x0.Args[1] { 11192 break 11193 } 11194 if mem != x0.Args[2] { 11195 break 11196 } 11197 s0 := o0.Args[1] 11198 if s0.Op != Op386SHLLconst { 11199 break 11200 } 11201 if s0.AuxInt != 16 { 11202 break 11203 } 11204 x1 := s0.Args[0] 11205 if x1.Op != Op386MOVBloadidx1 { 11206 break 11207 } 11208 i2 := x1.AuxInt 11209 if x1.Aux != s { 11210 break 11211 } 11212 if idx != x1.Args[0] { 11213 break 11214 } 11215 if p != x1.Args[1] { 11216 break 11217 } 11218 if mem != x1.Args[2] { 11219 break 11220 } 11221 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11222 break 11223 } 11224 b = mergePoint(b, x0, x1, x2) 11225 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11226 v.reset(OpCopy) 11227 v.AddArg(v0) 11228 v0.AuxInt = i0 11229 v0.Aux = s 11230 v0.AddArg(p) 11231 v0.AddArg(idx) 11232 v0.AddArg(mem) 11233 return true 11234 } 11235 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11236 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11237 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11238 for { 11239 s1 := v.Args[0] 11240 if s1.Op != Op386SHLLconst { 11241 break 11242 } 11243 if s1.AuxInt != 24 { 11244 break 11245 } 11246 x2 := s1.Args[0] 11247 if x2.Op != Op386MOVBloadidx1 { 11248 break 11249 } 11250 i3 := x2.AuxInt 11251 s := x2.Aux 11252 p := x2.Args[0] 11253 idx := x2.Args[1] 11254 mem := x2.Args[2] 11255 o0 := v.Args[1] 11256 if o0.Op != Op386ORL { 11257 break 11258 } 11259 s0 := o0.Args[0] 11260 if s0.Op != Op386SHLLconst { 11261 break 11262 } 11263 if s0.AuxInt != 16 { 11264 break 11265 } 11266 x1 := s0.Args[0] 11267 if x1.Op != Op386MOVBloadidx1 { 11268 break 11269 } 11270 i2 := x1.AuxInt 11271 if x1.Aux != s { 11272 break 11273 } 11274 if p != x1.Args[0] { 11275 break 11276 } 11277 if idx != x1.Args[1] { 11278 break 11279 } 11280 if mem != x1.Args[2] { 11281 break 11282 } 11283 x0 := o0.Args[1] 11284 if x0.Op != Op386MOVWloadidx1 { 11285 break 11286 } 11287 i0 := x0.AuxInt 11288 if x0.Aux != s { 11289 break 11290 } 11291 if p != x0.Args[0] { 11292 break 11293 } 11294 if idx != x0.Args[1] { 11295 break 11296 } 11297 if mem != x0.Args[2] { 11298 break 11299 } 11300 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11301 break 11302 } 11303 b = mergePoint(b, x0, x1, x2) 11304 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11305 v.reset(OpCopy) 11306 v.AddArg(v0) 11307 v0.AuxInt = i0 11308 v0.Aux = s 11309 v0.AddArg(p) 11310 v0.AddArg(idx) 11311 v0.AddArg(mem) 11312 return true 11313 } 11314 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11315 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11316 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11317 for { 11318 s1 := v.Args[0] 11319 if s1.Op != Op386SHLLconst { 11320 break 11321 } 11322 if s1.AuxInt != 24 { 11323 break 11324 } 11325 x2 := s1.Args[0] 11326 if x2.Op != Op386MOVBloadidx1 { 11327 break 11328 } 11329 i3 := x2.AuxInt 11330 s := x2.Aux 11331 idx := x2.Args[0] 11332 p := x2.Args[1] 11333 mem := x2.Args[2] 11334 o0 := v.Args[1] 11335 if o0.Op != Op386ORL { 11336 break 11337 } 11338 s0 := o0.Args[0] 11339 if s0.Op != Op386SHLLconst { 11340 break 11341 } 11342 if s0.AuxInt != 16 { 11343 break 11344 } 11345 x1 := s0.Args[0] 11346 if x1.Op != Op386MOVBloadidx1 { 11347 break 11348 } 11349 i2 := x1.AuxInt 11350 if x1.Aux != s { 11351 break 11352 } 11353 if p != x1.Args[0] { 11354 break 11355 } 11356 if idx != x1.Args[1] { 11357 break 11358 } 11359 if mem != x1.Args[2] { 11360 break 11361 } 11362 x0 := o0.Args[1] 11363 if x0.Op != Op386MOVWloadidx1 { 11364 break 11365 } 11366 i0 := x0.AuxInt 11367 if x0.Aux != s { 11368 break 11369 } 11370 if p != x0.Args[0] { 11371 break 11372 } 11373 if idx != x0.Args[1] { 11374 break 11375 } 11376 if mem != x0.Args[2] { 11377 break 11378 } 11379 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11380 break 11381 } 11382 b = mergePoint(b, x0, x1, x2) 11383 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11384 v.reset(OpCopy) 11385 v.AddArg(v0) 11386 v0.AuxInt = i0 11387 v0.Aux = s 11388 v0.AddArg(p) 11389 v0.AddArg(idx) 11390 v0.AddArg(mem) 11391 return true 11392 } 11393 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11394 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11395 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11396 for { 11397 s1 := v.Args[0] 11398 if s1.Op != Op386SHLLconst { 11399 break 11400 } 11401 if s1.AuxInt != 24 { 11402 break 11403 } 11404 x2 := s1.Args[0] 11405 if x2.Op != Op386MOVBloadidx1 { 11406 break 11407 } 11408 i3 := x2.AuxInt 11409 s := x2.Aux 11410 p := x2.Args[0] 11411 idx := x2.Args[1] 11412 mem := x2.Args[2] 11413 o0 := v.Args[1] 11414 if o0.Op != Op386ORL { 11415 break 11416 } 11417 s0 := o0.Args[0] 11418 if s0.Op != Op386SHLLconst { 11419 break 11420 } 11421 if s0.AuxInt != 16 { 11422 break 11423 } 11424 x1 := s0.Args[0] 11425 if x1.Op != Op386MOVBloadidx1 { 11426 break 11427 } 11428 i2 := x1.AuxInt 11429 if x1.Aux != s { 11430 break 11431 } 11432 if idx != x1.Args[0] { 11433 break 11434 } 11435 if p != x1.Args[1] { 11436 break 11437 } 11438 if mem != x1.Args[2] { 11439 break 11440 } 11441 x0 := o0.Args[1] 11442 if x0.Op != Op386MOVWloadidx1 { 11443 break 11444 } 11445 i0 := x0.AuxInt 11446 if x0.Aux != s { 11447 break 11448 } 11449 if p != x0.Args[0] { 11450 break 11451 } 11452 if idx != x0.Args[1] { 11453 break 11454 } 11455 if mem != x0.Args[2] { 11456 break 11457 } 11458 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11459 break 11460 } 11461 b = mergePoint(b, x0, x1, x2) 11462 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11463 v.reset(OpCopy) 11464 v.AddArg(v0) 11465 v0.AuxInt = i0 11466 v0.Aux = s 11467 v0.AddArg(p) 11468 v0.AddArg(idx) 11469 v0.AddArg(mem) 11470 return true 11471 } 11472 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11473 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11474 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11475 for { 11476 s1 := v.Args[0] 11477 if s1.Op != Op386SHLLconst { 11478 break 11479 } 11480 if s1.AuxInt != 24 { 11481 break 11482 } 11483 x2 := s1.Args[0] 11484 if x2.Op != Op386MOVBloadidx1 { 11485 break 11486 } 11487 i3 := x2.AuxInt 11488 s := x2.Aux 11489 idx := x2.Args[0] 11490 p := x2.Args[1] 11491 mem := x2.Args[2] 11492 o0 := v.Args[1] 11493 if o0.Op != Op386ORL { 11494 break 11495 } 11496 s0 := o0.Args[0] 11497 if s0.Op != Op386SHLLconst { 11498 break 11499 } 11500 if s0.AuxInt != 16 { 11501 break 11502 } 11503 x1 := s0.Args[0] 11504 if x1.Op != Op386MOVBloadidx1 { 11505 break 11506 } 11507 i2 := x1.AuxInt 11508 if x1.Aux != s { 11509 break 11510 } 11511 if idx != x1.Args[0] { 11512 break 11513 } 11514 if p != x1.Args[1] { 11515 break 11516 } 11517 if mem != x1.Args[2] { 11518 break 11519 } 11520 x0 := o0.Args[1] 11521 if x0.Op != Op386MOVWloadidx1 { 11522 break 11523 } 11524 i0 := x0.AuxInt 11525 if x0.Aux != s { 11526 break 11527 } 11528 if p != x0.Args[0] { 11529 break 11530 } 11531 if idx != x0.Args[1] { 11532 break 11533 } 11534 if mem != x0.Args[2] { 11535 break 11536 } 11537 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11538 break 11539 } 11540 b = mergePoint(b, x0, x1, x2) 11541 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11542 v.reset(OpCopy) 11543 v.AddArg(v0) 11544 v0.AuxInt = i0 11545 v0.Aux = s 11546 v0.AddArg(p) 11547 v0.AddArg(idx) 11548 v0.AddArg(mem) 11549 return true 11550 } 11551 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11552 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11553 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11554 for { 11555 s1 := v.Args[0] 11556 if s1.Op != Op386SHLLconst { 11557 break 11558 } 11559 if s1.AuxInt != 24 { 11560 break 11561 } 11562 x2 := s1.Args[0] 11563 if x2.Op != Op386MOVBloadidx1 { 11564 break 11565 } 11566 i3 := x2.AuxInt 11567 s := x2.Aux 11568 p := x2.Args[0] 11569 idx := x2.Args[1] 11570 mem := x2.Args[2] 11571 o0 := v.Args[1] 11572 if o0.Op != Op386ORL { 11573 break 11574 } 11575 s0 := o0.Args[0] 11576 if s0.Op != Op386SHLLconst { 11577 break 11578 } 11579 if s0.AuxInt != 16 { 11580 break 11581 } 11582 x1 := s0.Args[0] 11583 if x1.Op != Op386MOVBloadidx1 { 11584 break 11585 } 11586 i2 := x1.AuxInt 11587 if x1.Aux != s { 11588 break 11589 } 11590 if p != x1.Args[0] { 11591 break 11592 } 11593 if idx != x1.Args[1] { 11594 break 11595 } 11596 if mem != x1.Args[2] { 11597 break 11598 } 11599 x0 := o0.Args[1] 11600 if x0.Op != Op386MOVWloadidx1 { 11601 break 11602 } 11603 i0 := x0.AuxInt 11604 if x0.Aux != s { 11605 break 11606 } 11607 if idx != x0.Args[0] { 11608 break 11609 } 11610 if p != x0.Args[1] { 11611 break 11612 } 11613 if mem != x0.Args[2] { 11614 break 11615 } 11616 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11617 break 11618 } 11619 b = mergePoint(b, x0, x1, x2) 11620 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11621 v.reset(OpCopy) 11622 v.AddArg(v0) 11623 v0.AuxInt = i0 11624 v0.Aux = s 11625 v0.AddArg(p) 11626 v0.AddArg(idx) 11627 v0.AddArg(mem) 11628 return true 11629 } 11630 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11631 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11632 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11633 for { 11634 s1 := v.Args[0] 11635 if s1.Op != Op386SHLLconst { 11636 break 11637 } 11638 if s1.AuxInt != 24 { 11639 break 11640 } 11641 x2 := s1.Args[0] 11642 if x2.Op != Op386MOVBloadidx1 { 11643 break 11644 } 11645 i3 := x2.AuxInt 11646 s := x2.Aux 11647 idx := x2.Args[0] 11648 p := x2.Args[1] 11649 mem := x2.Args[2] 11650 o0 := v.Args[1] 11651 if o0.Op != Op386ORL { 11652 break 11653 } 11654 s0 := o0.Args[0] 11655 if s0.Op != Op386SHLLconst { 11656 break 11657 } 11658 if s0.AuxInt != 16 { 11659 break 11660 } 11661 x1 := s0.Args[0] 11662 if x1.Op != Op386MOVBloadidx1 { 11663 break 11664 } 11665 i2 := x1.AuxInt 11666 if x1.Aux != s { 11667 break 11668 } 11669 if p != x1.Args[0] { 11670 break 11671 } 11672 if idx != x1.Args[1] { 11673 break 11674 } 11675 if mem != x1.Args[2] { 11676 break 11677 } 11678 x0 := o0.Args[1] 11679 if x0.Op != Op386MOVWloadidx1 { 11680 break 11681 } 11682 i0 := x0.AuxInt 11683 if x0.Aux != s { 11684 break 11685 } 11686 if idx != x0.Args[0] { 11687 break 11688 } 11689 if p != x0.Args[1] { 11690 break 11691 } 11692 if mem != x0.Args[2] { 11693 break 11694 } 11695 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11696 break 11697 } 11698 b = mergePoint(b, x0, x1, x2) 11699 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11700 v.reset(OpCopy) 11701 v.AddArg(v0) 11702 v0.AuxInt = i0 11703 v0.Aux = s 11704 v0.AddArg(p) 11705 v0.AddArg(idx) 11706 v0.AddArg(mem) 11707 return true 11708 } 11709 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11710 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11711 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11712 for { 11713 s1 := v.Args[0] 11714 if s1.Op != Op386SHLLconst { 11715 break 11716 } 11717 if s1.AuxInt != 24 { 11718 break 11719 } 11720 x2 := s1.Args[0] 11721 if x2.Op != Op386MOVBloadidx1 { 11722 break 11723 } 11724 i3 := x2.AuxInt 11725 s := x2.Aux 11726 p := x2.Args[0] 11727 idx := x2.Args[1] 11728 mem := x2.Args[2] 11729 o0 := v.Args[1] 11730 if o0.Op != Op386ORL { 11731 break 11732 } 11733 s0 := o0.Args[0] 11734 if s0.Op != Op386SHLLconst { 11735 break 11736 } 11737 if s0.AuxInt != 16 { 11738 break 11739 } 11740 x1 := s0.Args[0] 11741 if x1.Op != Op386MOVBloadidx1 { 11742 break 11743 } 11744 i2 := x1.AuxInt 11745 if x1.Aux != s { 11746 break 11747 } 11748 if idx != x1.Args[0] { 11749 break 11750 } 11751 if p != x1.Args[1] { 11752 break 11753 } 11754 if mem != x1.Args[2] { 11755 break 11756 } 11757 x0 := o0.Args[1] 11758 if x0.Op != Op386MOVWloadidx1 { 11759 break 11760 } 11761 i0 := x0.AuxInt 11762 if x0.Aux != s { 11763 break 11764 } 11765 if idx != x0.Args[0] { 11766 break 11767 } 11768 if p != x0.Args[1] { 11769 break 11770 } 11771 if mem != x0.Args[2] { 11772 break 11773 } 11774 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11775 break 11776 } 11777 b = mergePoint(b, x0, x1, x2) 11778 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11779 v.reset(OpCopy) 11780 v.AddArg(v0) 11781 v0.AuxInt = i0 11782 v0.Aux = s 11783 v0.AddArg(p) 11784 v0.AddArg(idx) 11785 v0.AddArg(mem) 11786 return true 11787 } 11788 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11789 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11790 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11791 for { 11792 s1 := v.Args[0] 11793 if s1.Op != Op386SHLLconst { 11794 break 11795 } 11796 if s1.AuxInt != 24 { 11797 break 11798 } 11799 x2 := s1.Args[0] 11800 if x2.Op != Op386MOVBloadidx1 { 11801 break 11802 } 11803 i3 := x2.AuxInt 11804 s := x2.Aux 11805 idx := x2.Args[0] 11806 p := x2.Args[1] 11807 mem := x2.Args[2] 11808 o0 := v.Args[1] 11809 if o0.Op != Op386ORL { 11810 break 11811 } 11812 s0 := o0.Args[0] 11813 if s0.Op != Op386SHLLconst { 11814 break 11815 } 11816 if s0.AuxInt != 16 { 11817 break 11818 } 11819 x1 := s0.Args[0] 11820 if x1.Op != Op386MOVBloadidx1 { 11821 break 11822 } 11823 i2 := x1.AuxInt 11824 if x1.Aux != s { 11825 break 11826 } 11827 if idx != x1.Args[0] { 11828 break 11829 } 11830 if p != x1.Args[1] { 11831 break 11832 } 11833 if mem != x1.Args[2] { 11834 break 11835 } 11836 x0 := o0.Args[1] 11837 if x0.Op != Op386MOVWloadidx1 { 11838 break 11839 } 11840 i0 := x0.AuxInt 11841 if x0.Aux != s { 11842 break 11843 } 11844 if idx != x0.Args[0] { 11845 break 11846 } 11847 if p != x0.Args[1] { 11848 break 11849 } 11850 if mem != x0.Args[2] { 11851 break 11852 } 11853 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11854 break 11855 } 11856 b = mergePoint(b, x0, x1, x2) 11857 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11858 v.reset(OpCopy) 11859 v.AddArg(v0) 11860 v0.AuxInt = i0 11861 v0.Aux = s 11862 v0.AddArg(p) 11863 v0.AddArg(idx) 11864 v0.AddArg(mem) 11865 return true 11866 } 11867 return false 11868 } 11869 func rewriteValue386_Op386ORLconst(v *Value) bool { 11870 // match: (ORLconst [c] x) 11871 // cond: int32(c)==0 11872 // result: x 11873 for { 11874 c := v.AuxInt 11875 x := v.Args[0] 11876 if !(int32(c) == 0) { 11877 break 11878 } 11879 v.reset(OpCopy) 11880 v.Type = x.Type 11881 v.AddArg(x) 11882 return true 11883 } 11884 // match: (ORLconst [c] _) 11885 // cond: int32(c)==-1 11886 // result: (MOVLconst [-1]) 11887 for { 11888 c := v.AuxInt 11889 if !(int32(c) == -1) { 11890 break 11891 } 11892 v.reset(Op386MOVLconst) 11893 v.AuxInt = -1 11894 return true 11895 } 11896 // match: (ORLconst [c] (MOVLconst [d])) 11897 // cond: 11898 // result: (MOVLconst [c|d]) 11899 for { 11900 c := v.AuxInt 11901 v_0 := v.Args[0] 11902 if v_0.Op != Op386MOVLconst { 11903 break 11904 } 11905 d := v_0.AuxInt 11906 v.reset(Op386MOVLconst) 11907 v.AuxInt = c | d 11908 return true 11909 } 11910 return false 11911 } 11912 func rewriteValue386_Op386ROLBconst(v *Value) bool { 11913 // match: (ROLBconst [c] (ROLBconst [d] x)) 11914 // cond: 11915 // result: (ROLBconst [(c+d)& 7] x) 11916 for { 11917 c := v.AuxInt 11918 v_0 := v.Args[0] 11919 if v_0.Op != Op386ROLBconst { 11920 break 11921 } 11922 d := v_0.AuxInt 11923 x := v_0.Args[0] 11924 v.reset(Op386ROLBconst) 11925 v.AuxInt = (c + d) & 7 11926 v.AddArg(x) 11927 return true 11928 } 11929 // match: (ROLBconst [0] x) 11930 // cond: 11931 // result: x 11932 for { 11933 if v.AuxInt != 0 { 11934 break 11935 } 11936 x := v.Args[0] 11937 v.reset(OpCopy) 11938 v.Type = x.Type 11939 v.AddArg(x) 11940 return true 11941 } 11942 return false 11943 } 11944 func rewriteValue386_Op386ROLLconst(v *Value) bool { 11945 // match: (ROLLconst [c] (ROLLconst [d] x)) 11946 // cond: 11947 // result: (ROLLconst [(c+d)&31] x) 11948 for { 11949 c := v.AuxInt 11950 v_0 := v.Args[0] 11951 if v_0.Op != Op386ROLLconst { 11952 break 11953 } 11954 d := v_0.AuxInt 11955 x := v_0.Args[0] 11956 v.reset(Op386ROLLconst) 11957 v.AuxInt = (c + d) & 31 11958 v.AddArg(x) 11959 return true 11960 } 11961 // match: (ROLLconst [0] x) 11962 // cond: 11963 // result: x 11964 for { 11965 if v.AuxInt != 0 { 11966 break 11967 } 11968 x := v.Args[0] 11969 v.reset(OpCopy) 11970 v.Type = x.Type 11971 v.AddArg(x) 11972 return true 11973 } 11974 return false 11975 } 11976 func rewriteValue386_Op386ROLWconst(v *Value) bool { 11977 // match: (ROLWconst [c] (ROLWconst [d] x)) 11978 // cond: 11979 // result: (ROLWconst [(c+d)&15] x) 11980 for { 11981 c := v.AuxInt 11982 v_0 := v.Args[0] 11983 if v_0.Op != Op386ROLWconst { 11984 break 11985 } 11986 d := v_0.AuxInt 11987 x := v_0.Args[0] 11988 v.reset(Op386ROLWconst) 11989 v.AuxInt = (c + d) & 15 11990 v.AddArg(x) 11991 return true 11992 } 11993 // match: (ROLWconst [0] x) 11994 // cond: 11995 // result: x 11996 for { 11997 if v.AuxInt != 0 { 11998 break 11999 } 12000 x := v.Args[0] 12001 v.reset(OpCopy) 12002 v.Type = x.Type 12003 v.AddArg(x) 12004 return true 12005 } 12006 return false 12007 } 12008 func rewriteValue386_Op386SARB(v *Value) bool { 12009 // match: (SARB x (MOVLconst [c])) 12010 // cond: 12011 // result: (SARBconst [min(c&31,7)] x) 12012 for { 12013 x := v.Args[0] 12014 v_1 := v.Args[1] 12015 if v_1.Op != Op386MOVLconst { 12016 break 12017 } 12018 c := v_1.AuxInt 12019 v.reset(Op386SARBconst) 12020 v.AuxInt = min(c&31, 7) 12021 v.AddArg(x) 12022 return true 12023 } 12024 return false 12025 } 12026 func rewriteValue386_Op386SARBconst(v *Value) bool { 12027 // match: (SARBconst x [0]) 12028 // cond: 12029 // result: x 12030 for { 12031 if v.AuxInt != 0 { 12032 break 12033 } 12034 x := v.Args[0] 12035 v.reset(OpCopy) 12036 v.Type = x.Type 12037 v.AddArg(x) 12038 return true 12039 } 12040 // match: (SARBconst [c] (MOVLconst [d])) 12041 // cond: 12042 // result: (MOVLconst [d>>uint64(c)]) 12043 for { 12044 c := v.AuxInt 12045 v_0 := v.Args[0] 12046 if v_0.Op != Op386MOVLconst { 12047 break 12048 } 12049 d := v_0.AuxInt 12050 v.reset(Op386MOVLconst) 12051 v.AuxInt = d >> uint64(c) 12052 return true 12053 } 12054 return false 12055 } 12056 func rewriteValue386_Op386SARL(v *Value) bool { 12057 // match: (SARL x (MOVLconst [c])) 12058 // cond: 12059 // result: (SARLconst [c&31] x) 12060 for { 12061 x := v.Args[0] 12062 v_1 := v.Args[1] 12063 if v_1.Op != Op386MOVLconst { 12064 break 12065 } 12066 c := v_1.AuxInt 12067 v.reset(Op386SARLconst) 12068 v.AuxInt = c & 31 12069 v.AddArg(x) 12070 return true 12071 } 12072 // match: (SARL x (ANDLconst [31] y)) 12073 // cond: 12074 // result: (SARL x y) 12075 for { 12076 x := v.Args[0] 12077 v_1 := v.Args[1] 12078 if v_1.Op != Op386ANDLconst { 12079 break 12080 } 12081 if v_1.AuxInt != 31 { 12082 break 12083 } 12084 y := v_1.Args[0] 12085 v.reset(Op386SARL) 12086 v.AddArg(x) 12087 v.AddArg(y) 12088 return true 12089 } 12090 return false 12091 } 12092 func rewriteValue386_Op386SARLconst(v *Value) bool { 12093 // match: (SARLconst x [0]) 12094 // cond: 12095 // result: x 12096 for { 12097 if v.AuxInt != 0 { 12098 break 12099 } 12100 x := v.Args[0] 12101 v.reset(OpCopy) 12102 v.Type = x.Type 12103 v.AddArg(x) 12104 return true 12105 } 12106 // match: (SARLconst [c] (MOVLconst [d])) 12107 // cond: 12108 // result: (MOVLconst [d>>uint64(c)]) 12109 for { 12110 c := v.AuxInt 12111 v_0 := v.Args[0] 12112 if v_0.Op != Op386MOVLconst { 12113 break 12114 } 12115 d := v_0.AuxInt 12116 v.reset(Op386MOVLconst) 12117 v.AuxInt = d >> uint64(c) 12118 return true 12119 } 12120 return false 12121 } 12122 func rewriteValue386_Op386SARW(v *Value) bool { 12123 // match: (SARW x (MOVLconst [c])) 12124 // cond: 12125 // result: (SARWconst [min(c&31,15)] x) 12126 for { 12127 x := v.Args[0] 12128 v_1 := v.Args[1] 12129 if v_1.Op != Op386MOVLconst { 12130 break 12131 } 12132 c := v_1.AuxInt 12133 v.reset(Op386SARWconst) 12134 v.AuxInt = min(c&31, 15) 12135 v.AddArg(x) 12136 return true 12137 } 12138 return false 12139 } 12140 func rewriteValue386_Op386SARWconst(v *Value) bool { 12141 // match: (SARWconst x [0]) 12142 // cond: 12143 // result: x 12144 for { 12145 if v.AuxInt != 0 { 12146 break 12147 } 12148 x := v.Args[0] 12149 v.reset(OpCopy) 12150 v.Type = x.Type 12151 v.AddArg(x) 12152 return true 12153 } 12154 // match: (SARWconst [c] (MOVLconst [d])) 12155 // cond: 12156 // result: (MOVLconst [d>>uint64(c)]) 12157 for { 12158 c := v.AuxInt 12159 v_0 := v.Args[0] 12160 if v_0.Op != Op386MOVLconst { 12161 break 12162 } 12163 d := v_0.AuxInt 12164 v.reset(Op386MOVLconst) 12165 v.AuxInt = d >> uint64(c) 12166 return true 12167 } 12168 return false 12169 } 12170 func rewriteValue386_Op386SBBL(v *Value) bool { 12171 // match: (SBBL x (MOVLconst [c]) f) 12172 // cond: 12173 // result: (SBBLconst [c] x f) 12174 for { 12175 x := v.Args[0] 12176 v_1 := v.Args[1] 12177 if v_1.Op != Op386MOVLconst { 12178 break 12179 } 12180 c := v_1.AuxInt 12181 f := v.Args[2] 12182 v.reset(Op386SBBLconst) 12183 v.AuxInt = c 12184 v.AddArg(x) 12185 v.AddArg(f) 12186 return true 12187 } 12188 return false 12189 } 12190 func rewriteValue386_Op386SBBLcarrymask(v *Value) bool { 12191 // match: (SBBLcarrymask (FlagEQ)) 12192 // cond: 12193 // result: (MOVLconst [0]) 12194 for { 12195 v_0 := v.Args[0] 12196 if v_0.Op != Op386FlagEQ { 12197 break 12198 } 12199 v.reset(Op386MOVLconst) 12200 v.AuxInt = 0 12201 return true 12202 } 12203 // match: (SBBLcarrymask (FlagLT_ULT)) 12204 // cond: 12205 // result: (MOVLconst [-1]) 12206 for { 12207 v_0 := v.Args[0] 12208 if v_0.Op != Op386FlagLT_ULT { 12209 break 12210 } 12211 v.reset(Op386MOVLconst) 12212 v.AuxInt = -1 12213 return true 12214 } 12215 // match: (SBBLcarrymask (FlagLT_UGT)) 12216 // cond: 12217 // result: (MOVLconst [0]) 12218 for { 12219 v_0 := v.Args[0] 12220 if v_0.Op != Op386FlagLT_UGT { 12221 break 12222 } 12223 v.reset(Op386MOVLconst) 12224 v.AuxInt = 0 12225 return true 12226 } 12227 // match: (SBBLcarrymask (FlagGT_ULT)) 12228 // cond: 12229 // result: (MOVLconst [-1]) 12230 for { 12231 v_0 := v.Args[0] 12232 if v_0.Op != Op386FlagGT_ULT { 12233 break 12234 } 12235 v.reset(Op386MOVLconst) 12236 v.AuxInt = -1 12237 return true 12238 } 12239 // match: (SBBLcarrymask (FlagGT_UGT)) 12240 // cond: 12241 // result: (MOVLconst [0]) 12242 for { 12243 v_0 := v.Args[0] 12244 if v_0.Op != Op386FlagGT_UGT { 12245 break 12246 } 12247 v.reset(Op386MOVLconst) 12248 v.AuxInt = 0 12249 return true 12250 } 12251 return false 12252 } 12253 func rewriteValue386_Op386SETA(v *Value) bool { 12254 // match: (SETA (InvertFlags x)) 12255 // cond: 12256 // result: (SETB x) 12257 for { 12258 v_0 := v.Args[0] 12259 if v_0.Op != Op386InvertFlags { 12260 break 12261 } 12262 x := v_0.Args[0] 12263 v.reset(Op386SETB) 12264 v.AddArg(x) 12265 return true 12266 } 12267 // match: (SETA (FlagEQ)) 12268 // cond: 12269 // result: (MOVLconst [0]) 12270 for { 12271 v_0 := v.Args[0] 12272 if v_0.Op != Op386FlagEQ { 12273 break 12274 } 12275 v.reset(Op386MOVLconst) 12276 v.AuxInt = 0 12277 return true 12278 } 12279 // match: (SETA (FlagLT_ULT)) 12280 // cond: 12281 // result: (MOVLconst [0]) 12282 for { 12283 v_0 := v.Args[0] 12284 if v_0.Op != Op386FlagLT_ULT { 12285 break 12286 } 12287 v.reset(Op386MOVLconst) 12288 v.AuxInt = 0 12289 return true 12290 } 12291 // match: (SETA (FlagLT_UGT)) 12292 // cond: 12293 // result: (MOVLconst [1]) 12294 for { 12295 v_0 := v.Args[0] 12296 if v_0.Op != Op386FlagLT_UGT { 12297 break 12298 } 12299 v.reset(Op386MOVLconst) 12300 v.AuxInt = 1 12301 return true 12302 } 12303 // match: (SETA (FlagGT_ULT)) 12304 // cond: 12305 // result: (MOVLconst [0]) 12306 for { 12307 v_0 := v.Args[0] 12308 if v_0.Op != Op386FlagGT_ULT { 12309 break 12310 } 12311 v.reset(Op386MOVLconst) 12312 v.AuxInt = 0 12313 return true 12314 } 12315 // match: (SETA (FlagGT_UGT)) 12316 // cond: 12317 // result: (MOVLconst [1]) 12318 for { 12319 v_0 := v.Args[0] 12320 if v_0.Op != Op386FlagGT_UGT { 12321 break 12322 } 12323 v.reset(Op386MOVLconst) 12324 v.AuxInt = 1 12325 return true 12326 } 12327 return false 12328 } 12329 func rewriteValue386_Op386SETAE(v *Value) bool { 12330 // match: (SETAE (InvertFlags x)) 12331 // cond: 12332 // result: (SETBE x) 12333 for { 12334 v_0 := v.Args[0] 12335 if v_0.Op != Op386InvertFlags { 12336 break 12337 } 12338 x := v_0.Args[0] 12339 v.reset(Op386SETBE) 12340 v.AddArg(x) 12341 return true 12342 } 12343 // match: (SETAE (FlagEQ)) 12344 // cond: 12345 // result: (MOVLconst [1]) 12346 for { 12347 v_0 := v.Args[0] 12348 if v_0.Op != Op386FlagEQ { 12349 break 12350 } 12351 v.reset(Op386MOVLconst) 12352 v.AuxInt = 1 12353 return true 12354 } 12355 // match: (SETAE (FlagLT_ULT)) 12356 // cond: 12357 // result: (MOVLconst [0]) 12358 for { 12359 v_0 := v.Args[0] 12360 if v_0.Op != Op386FlagLT_ULT { 12361 break 12362 } 12363 v.reset(Op386MOVLconst) 12364 v.AuxInt = 0 12365 return true 12366 } 12367 // match: (SETAE (FlagLT_UGT)) 12368 // cond: 12369 // result: (MOVLconst [1]) 12370 for { 12371 v_0 := v.Args[0] 12372 if v_0.Op != Op386FlagLT_UGT { 12373 break 12374 } 12375 v.reset(Op386MOVLconst) 12376 v.AuxInt = 1 12377 return true 12378 } 12379 // match: (SETAE (FlagGT_ULT)) 12380 // cond: 12381 // result: (MOVLconst [0]) 12382 for { 12383 v_0 := v.Args[0] 12384 if v_0.Op != Op386FlagGT_ULT { 12385 break 12386 } 12387 v.reset(Op386MOVLconst) 12388 v.AuxInt = 0 12389 return true 12390 } 12391 // match: (SETAE (FlagGT_UGT)) 12392 // cond: 12393 // result: (MOVLconst [1]) 12394 for { 12395 v_0 := v.Args[0] 12396 if v_0.Op != Op386FlagGT_UGT { 12397 break 12398 } 12399 v.reset(Op386MOVLconst) 12400 v.AuxInt = 1 12401 return true 12402 } 12403 return false 12404 } 12405 func rewriteValue386_Op386SETB(v *Value) bool { 12406 // match: (SETB (InvertFlags x)) 12407 // cond: 12408 // result: (SETA x) 12409 for { 12410 v_0 := v.Args[0] 12411 if v_0.Op != Op386InvertFlags { 12412 break 12413 } 12414 x := v_0.Args[0] 12415 v.reset(Op386SETA) 12416 v.AddArg(x) 12417 return true 12418 } 12419 // match: (SETB (FlagEQ)) 12420 // cond: 12421 // result: (MOVLconst [0]) 12422 for { 12423 v_0 := v.Args[0] 12424 if v_0.Op != Op386FlagEQ { 12425 break 12426 } 12427 v.reset(Op386MOVLconst) 12428 v.AuxInt = 0 12429 return true 12430 } 12431 // match: (SETB (FlagLT_ULT)) 12432 // cond: 12433 // result: (MOVLconst [1]) 12434 for { 12435 v_0 := v.Args[0] 12436 if v_0.Op != Op386FlagLT_ULT { 12437 break 12438 } 12439 v.reset(Op386MOVLconst) 12440 v.AuxInt = 1 12441 return true 12442 } 12443 // match: (SETB (FlagLT_UGT)) 12444 // cond: 12445 // result: (MOVLconst [0]) 12446 for { 12447 v_0 := v.Args[0] 12448 if v_0.Op != Op386FlagLT_UGT { 12449 break 12450 } 12451 v.reset(Op386MOVLconst) 12452 v.AuxInt = 0 12453 return true 12454 } 12455 // match: (SETB (FlagGT_ULT)) 12456 // cond: 12457 // result: (MOVLconst [1]) 12458 for { 12459 v_0 := v.Args[0] 12460 if v_0.Op != Op386FlagGT_ULT { 12461 break 12462 } 12463 v.reset(Op386MOVLconst) 12464 v.AuxInt = 1 12465 return true 12466 } 12467 // match: (SETB (FlagGT_UGT)) 12468 // cond: 12469 // result: (MOVLconst [0]) 12470 for { 12471 v_0 := v.Args[0] 12472 if v_0.Op != Op386FlagGT_UGT { 12473 break 12474 } 12475 v.reset(Op386MOVLconst) 12476 v.AuxInt = 0 12477 return true 12478 } 12479 return false 12480 } 12481 func rewriteValue386_Op386SETBE(v *Value) bool { 12482 // match: (SETBE (InvertFlags x)) 12483 // cond: 12484 // result: (SETAE x) 12485 for { 12486 v_0 := v.Args[0] 12487 if v_0.Op != Op386InvertFlags { 12488 break 12489 } 12490 x := v_0.Args[0] 12491 v.reset(Op386SETAE) 12492 v.AddArg(x) 12493 return true 12494 } 12495 // match: (SETBE (FlagEQ)) 12496 // cond: 12497 // result: (MOVLconst [1]) 12498 for { 12499 v_0 := v.Args[0] 12500 if v_0.Op != Op386FlagEQ { 12501 break 12502 } 12503 v.reset(Op386MOVLconst) 12504 v.AuxInt = 1 12505 return true 12506 } 12507 // match: (SETBE (FlagLT_ULT)) 12508 // cond: 12509 // result: (MOVLconst [1]) 12510 for { 12511 v_0 := v.Args[0] 12512 if v_0.Op != Op386FlagLT_ULT { 12513 break 12514 } 12515 v.reset(Op386MOVLconst) 12516 v.AuxInt = 1 12517 return true 12518 } 12519 // match: (SETBE (FlagLT_UGT)) 12520 // cond: 12521 // result: (MOVLconst [0]) 12522 for { 12523 v_0 := v.Args[0] 12524 if v_0.Op != Op386FlagLT_UGT { 12525 break 12526 } 12527 v.reset(Op386MOVLconst) 12528 v.AuxInt = 0 12529 return true 12530 } 12531 // match: (SETBE (FlagGT_ULT)) 12532 // cond: 12533 // result: (MOVLconst [1]) 12534 for { 12535 v_0 := v.Args[0] 12536 if v_0.Op != Op386FlagGT_ULT { 12537 break 12538 } 12539 v.reset(Op386MOVLconst) 12540 v.AuxInt = 1 12541 return true 12542 } 12543 // match: (SETBE (FlagGT_UGT)) 12544 // cond: 12545 // result: (MOVLconst [0]) 12546 for { 12547 v_0 := v.Args[0] 12548 if v_0.Op != Op386FlagGT_UGT { 12549 break 12550 } 12551 v.reset(Op386MOVLconst) 12552 v.AuxInt = 0 12553 return true 12554 } 12555 return false 12556 } 12557 func rewriteValue386_Op386SETEQ(v *Value) bool { 12558 // match: (SETEQ (InvertFlags x)) 12559 // cond: 12560 // result: (SETEQ x) 12561 for { 12562 v_0 := v.Args[0] 12563 if v_0.Op != Op386InvertFlags { 12564 break 12565 } 12566 x := v_0.Args[0] 12567 v.reset(Op386SETEQ) 12568 v.AddArg(x) 12569 return true 12570 } 12571 // match: (SETEQ (FlagEQ)) 12572 // cond: 12573 // result: (MOVLconst [1]) 12574 for { 12575 v_0 := v.Args[0] 12576 if v_0.Op != Op386FlagEQ { 12577 break 12578 } 12579 v.reset(Op386MOVLconst) 12580 v.AuxInt = 1 12581 return true 12582 } 12583 // match: (SETEQ (FlagLT_ULT)) 12584 // cond: 12585 // result: (MOVLconst [0]) 12586 for { 12587 v_0 := v.Args[0] 12588 if v_0.Op != Op386FlagLT_ULT { 12589 break 12590 } 12591 v.reset(Op386MOVLconst) 12592 v.AuxInt = 0 12593 return true 12594 } 12595 // match: (SETEQ (FlagLT_UGT)) 12596 // cond: 12597 // result: (MOVLconst [0]) 12598 for { 12599 v_0 := v.Args[0] 12600 if v_0.Op != Op386FlagLT_UGT { 12601 break 12602 } 12603 v.reset(Op386MOVLconst) 12604 v.AuxInt = 0 12605 return true 12606 } 12607 // match: (SETEQ (FlagGT_ULT)) 12608 // cond: 12609 // result: (MOVLconst [0]) 12610 for { 12611 v_0 := v.Args[0] 12612 if v_0.Op != Op386FlagGT_ULT { 12613 break 12614 } 12615 v.reset(Op386MOVLconst) 12616 v.AuxInt = 0 12617 return true 12618 } 12619 // match: (SETEQ (FlagGT_UGT)) 12620 // cond: 12621 // result: (MOVLconst [0]) 12622 for { 12623 v_0 := v.Args[0] 12624 if v_0.Op != Op386FlagGT_UGT { 12625 break 12626 } 12627 v.reset(Op386MOVLconst) 12628 v.AuxInt = 0 12629 return true 12630 } 12631 return false 12632 } 12633 func rewriteValue386_Op386SETG(v *Value) bool { 12634 // match: (SETG (InvertFlags x)) 12635 // cond: 12636 // result: (SETL x) 12637 for { 12638 v_0 := v.Args[0] 12639 if v_0.Op != Op386InvertFlags { 12640 break 12641 } 12642 x := v_0.Args[0] 12643 v.reset(Op386SETL) 12644 v.AddArg(x) 12645 return true 12646 } 12647 // match: (SETG (FlagEQ)) 12648 // cond: 12649 // result: (MOVLconst [0]) 12650 for { 12651 v_0 := v.Args[0] 12652 if v_0.Op != Op386FlagEQ { 12653 break 12654 } 12655 v.reset(Op386MOVLconst) 12656 v.AuxInt = 0 12657 return true 12658 } 12659 // match: (SETG (FlagLT_ULT)) 12660 // cond: 12661 // result: (MOVLconst [0]) 12662 for { 12663 v_0 := v.Args[0] 12664 if v_0.Op != Op386FlagLT_ULT { 12665 break 12666 } 12667 v.reset(Op386MOVLconst) 12668 v.AuxInt = 0 12669 return true 12670 } 12671 // match: (SETG (FlagLT_UGT)) 12672 // cond: 12673 // result: (MOVLconst [0]) 12674 for { 12675 v_0 := v.Args[0] 12676 if v_0.Op != Op386FlagLT_UGT { 12677 break 12678 } 12679 v.reset(Op386MOVLconst) 12680 v.AuxInt = 0 12681 return true 12682 } 12683 // match: (SETG (FlagGT_ULT)) 12684 // cond: 12685 // result: (MOVLconst [1]) 12686 for { 12687 v_0 := v.Args[0] 12688 if v_0.Op != Op386FlagGT_ULT { 12689 break 12690 } 12691 v.reset(Op386MOVLconst) 12692 v.AuxInt = 1 12693 return true 12694 } 12695 // match: (SETG (FlagGT_UGT)) 12696 // cond: 12697 // result: (MOVLconst [1]) 12698 for { 12699 v_0 := v.Args[0] 12700 if v_0.Op != Op386FlagGT_UGT { 12701 break 12702 } 12703 v.reset(Op386MOVLconst) 12704 v.AuxInt = 1 12705 return true 12706 } 12707 return false 12708 } 12709 func rewriteValue386_Op386SETGE(v *Value) bool { 12710 // match: (SETGE (InvertFlags x)) 12711 // cond: 12712 // result: (SETLE x) 12713 for { 12714 v_0 := v.Args[0] 12715 if v_0.Op != Op386InvertFlags { 12716 break 12717 } 12718 x := v_0.Args[0] 12719 v.reset(Op386SETLE) 12720 v.AddArg(x) 12721 return true 12722 } 12723 // match: (SETGE (FlagEQ)) 12724 // cond: 12725 // result: (MOVLconst [1]) 12726 for { 12727 v_0 := v.Args[0] 12728 if v_0.Op != Op386FlagEQ { 12729 break 12730 } 12731 v.reset(Op386MOVLconst) 12732 v.AuxInt = 1 12733 return true 12734 } 12735 // match: (SETGE (FlagLT_ULT)) 12736 // cond: 12737 // result: (MOVLconst [0]) 12738 for { 12739 v_0 := v.Args[0] 12740 if v_0.Op != Op386FlagLT_ULT { 12741 break 12742 } 12743 v.reset(Op386MOVLconst) 12744 v.AuxInt = 0 12745 return true 12746 } 12747 // match: (SETGE (FlagLT_UGT)) 12748 // cond: 12749 // result: (MOVLconst [0]) 12750 for { 12751 v_0 := v.Args[0] 12752 if v_0.Op != Op386FlagLT_UGT { 12753 break 12754 } 12755 v.reset(Op386MOVLconst) 12756 v.AuxInt = 0 12757 return true 12758 } 12759 // match: (SETGE (FlagGT_ULT)) 12760 // cond: 12761 // result: (MOVLconst [1]) 12762 for { 12763 v_0 := v.Args[0] 12764 if v_0.Op != Op386FlagGT_ULT { 12765 break 12766 } 12767 v.reset(Op386MOVLconst) 12768 v.AuxInt = 1 12769 return true 12770 } 12771 // match: (SETGE (FlagGT_UGT)) 12772 // cond: 12773 // result: (MOVLconst [1]) 12774 for { 12775 v_0 := v.Args[0] 12776 if v_0.Op != Op386FlagGT_UGT { 12777 break 12778 } 12779 v.reset(Op386MOVLconst) 12780 v.AuxInt = 1 12781 return true 12782 } 12783 return false 12784 } 12785 func rewriteValue386_Op386SETL(v *Value) bool { 12786 // match: (SETL (InvertFlags x)) 12787 // cond: 12788 // result: (SETG x) 12789 for { 12790 v_0 := v.Args[0] 12791 if v_0.Op != Op386InvertFlags { 12792 break 12793 } 12794 x := v_0.Args[0] 12795 v.reset(Op386SETG) 12796 v.AddArg(x) 12797 return true 12798 } 12799 // match: (SETL (FlagEQ)) 12800 // cond: 12801 // result: (MOVLconst [0]) 12802 for { 12803 v_0 := v.Args[0] 12804 if v_0.Op != Op386FlagEQ { 12805 break 12806 } 12807 v.reset(Op386MOVLconst) 12808 v.AuxInt = 0 12809 return true 12810 } 12811 // match: (SETL (FlagLT_ULT)) 12812 // cond: 12813 // result: (MOVLconst [1]) 12814 for { 12815 v_0 := v.Args[0] 12816 if v_0.Op != Op386FlagLT_ULT { 12817 break 12818 } 12819 v.reset(Op386MOVLconst) 12820 v.AuxInt = 1 12821 return true 12822 } 12823 // match: (SETL (FlagLT_UGT)) 12824 // cond: 12825 // result: (MOVLconst [1]) 12826 for { 12827 v_0 := v.Args[0] 12828 if v_0.Op != Op386FlagLT_UGT { 12829 break 12830 } 12831 v.reset(Op386MOVLconst) 12832 v.AuxInt = 1 12833 return true 12834 } 12835 // match: (SETL (FlagGT_ULT)) 12836 // cond: 12837 // result: (MOVLconst [0]) 12838 for { 12839 v_0 := v.Args[0] 12840 if v_0.Op != Op386FlagGT_ULT { 12841 break 12842 } 12843 v.reset(Op386MOVLconst) 12844 v.AuxInt = 0 12845 return true 12846 } 12847 // match: (SETL (FlagGT_UGT)) 12848 // cond: 12849 // result: (MOVLconst [0]) 12850 for { 12851 v_0 := v.Args[0] 12852 if v_0.Op != Op386FlagGT_UGT { 12853 break 12854 } 12855 v.reset(Op386MOVLconst) 12856 v.AuxInt = 0 12857 return true 12858 } 12859 return false 12860 } 12861 func rewriteValue386_Op386SETLE(v *Value) bool { 12862 // match: (SETLE (InvertFlags x)) 12863 // cond: 12864 // result: (SETGE x) 12865 for { 12866 v_0 := v.Args[0] 12867 if v_0.Op != Op386InvertFlags { 12868 break 12869 } 12870 x := v_0.Args[0] 12871 v.reset(Op386SETGE) 12872 v.AddArg(x) 12873 return true 12874 } 12875 // match: (SETLE (FlagEQ)) 12876 // cond: 12877 // result: (MOVLconst [1]) 12878 for { 12879 v_0 := v.Args[0] 12880 if v_0.Op != Op386FlagEQ { 12881 break 12882 } 12883 v.reset(Op386MOVLconst) 12884 v.AuxInt = 1 12885 return true 12886 } 12887 // match: (SETLE (FlagLT_ULT)) 12888 // cond: 12889 // result: (MOVLconst [1]) 12890 for { 12891 v_0 := v.Args[0] 12892 if v_0.Op != Op386FlagLT_ULT { 12893 break 12894 } 12895 v.reset(Op386MOVLconst) 12896 v.AuxInt = 1 12897 return true 12898 } 12899 // match: (SETLE (FlagLT_UGT)) 12900 // cond: 12901 // result: (MOVLconst [1]) 12902 for { 12903 v_0 := v.Args[0] 12904 if v_0.Op != Op386FlagLT_UGT { 12905 break 12906 } 12907 v.reset(Op386MOVLconst) 12908 v.AuxInt = 1 12909 return true 12910 } 12911 // match: (SETLE (FlagGT_ULT)) 12912 // cond: 12913 // result: (MOVLconst [0]) 12914 for { 12915 v_0 := v.Args[0] 12916 if v_0.Op != Op386FlagGT_ULT { 12917 break 12918 } 12919 v.reset(Op386MOVLconst) 12920 v.AuxInt = 0 12921 return true 12922 } 12923 // match: (SETLE (FlagGT_UGT)) 12924 // cond: 12925 // result: (MOVLconst [0]) 12926 for { 12927 v_0 := v.Args[0] 12928 if v_0.Op != Op386FlagGT_UGT { 12929 break 12930 } 12931 v.reset(Op386MOVLconst) 12932 v.AuxInt = 0 12933 return true 12934 } 12935 return false 12936 } 12937 func rewriteValue386_Op386SETNE(v *Value) bool { 12938 // match: (SETNE (InvertFlags x)) 12939 // cond: 12940 // result: (SETNE x) 12941 for { 12942 v_0 := v.Args[0] 12943 if v_0.Op != Op386InvertFlags { 12944 break 12945 } 12946 x := v_0.Args[0] 12947 v.reset(Op386SETNE) 12948 v.AddArg(x) 12949 return true 12950 } 12951 // match: (SETNE (FlagEQ)) 12952 // cond: 12953 // result: (MOVLconst [0]) 12954 for { 12955 v_0 := v.Args[0] 12956 if v_0.Op != Op386FlagEQ { 12957 break 12958 } 12959 v.reset(Op386MOVLconst) 12960 v.AuxInt = 0 12961 return true 12962 } 12963 // match: (SETNE (FlagLT_ULT)) 12964 // cond: 12965 // result: (MOVLconst [1]) 12966 for { 12967 v_0 := v.Args[0] 12968 if v_0.Op != Op386FlagLT_ULT { 12969 break 12970 } 12971 v.reset(Op386MOVLconst) 12972 v.AuxInt = 1 12973 return true 12974 } 12975 // match: (SETNE (FlagLT_UGT)) 12976 // cond: 12977 // result: (MOVLconst [1]) 12978 for { 12979 v_0 := v.Args[0] 12980 if v_0.Op != Op386FlagLT_UGT { 12981 break 12982 } 12983 v.reset(Op386MOVLconst) 12984 v.AuxInt = 1 12985 return true 12986 } 12987 // match: (SETNE (FlagGT_ULT)) 12988 // cond: 12989 // result: (MOVLconst [1]) 12990 for { 12991 v_0 := v.Args[0] 12992 if v_0.Op != Op386FlagGT_ULT { 12993 break 12994 } 12995 v.reset(Op386MOVLconst) 12996 v.AuxInt = 1 12997 return true 12998 } 12999 // match: (SETNE (FlagGT_UGT)) 13000 // cond: 13001 // result: (MOVLconst [1]) 13002 for { 13003 v_0 := v.Args[0] 13004 if v_0.Op != Op386FlagGT_UGT { 13005 break 13006 } 13007 v.reset(Op386MOVLconst) 13008 v.AuxInt = 1 13009 return true 13010 } 13011 return false 13012 } 13013 func rewriteValue386_Op386SHLL(v *Value) bool { 13014 // match: (SHLL x (MOVLconst [c])) 13015 // cond: 13016 // result: (SHLLconst [c&31] x) 13017 for { 13018 x := v.Args[0] 13019 v_1 := v.Args[1] 13020 if v_1.Op != Op386MOVLconst { 13021 break 13022 } 13023 c := v_1.AuxInt 13024 v.reset(Op386SHLLconst) 13025 v.AuxInt = c & 31 13026 v.AddArg(x) 13027 return true 13028 } 13029 // match: (SHLL x (ANDLconst [31] y)) 13030 // cond: 13031 // result: (SHLL x y) 13032 for { 13033 x := v.Args[0] 13034 v_1 := v.Args[1] 13035 if v_1.Op != Op386ANDLconst { 13036 break 13037 } 13038 if v_1.AuxInt != 31 { 13039 break 13040 } 13041 y := v_1.Args[0] 13042 v.reset(Op386SHLL) 13043 v.AddArg(x) 13044 v.AddArg(y) 13045 return true 13046 } 13047 return false 13048 } 13049 func rewriteValue386_Op386SHLLconst(v *Value) bool { 13050 // match: (SHLLconst x [0]) 13051 // cond: 13052 // result: x 13053 for { 13054 if v.AuxInt != 0 { 13055 break 13056 } 13057 x := v.Args[0] 13058 v.reset(OpCopy) 13059 v.Type = x.Type 13060 v.AddArg(x) 13061 return true 13062 } 13063 return false 13064 } 13065 func rewriteValue386_Op386SHRB(v *Value) bool { 13066 // match: (SHRB x (MOVLconst [c])) 13067 // cond: c&31 < 8 13068 // result: (SHRBconst [c&31] x) 13069 for { 13070 x := v.Args[0] 13071 v_1 := v.Args[1] 13072 if v_1.Op != Op386MOVLconst { 13073 break 13074 } 13075 c := v_1.AuxInt 13076 if !(c&31 < 8) { 13077 break 13078 } 13079 v.reset(Op386SHRBconst) 13080 v.AuxInt = c & 31 13081 v.AddArg(x) 13082 return true 13083 } 13084 // match: (SHRB _ (MOVLconst [c])) 13085 // cond: c&31 >= 8 13086 // result: (MOVLconst [0]) 13087 for { 13088 v_1 := v.Args[1] 13089 if v_1.Op != Op386MOVLconst { 13090 break 13091 } 13092 c := v_1.AuxInt 13093 if !(c&31 >= 8) { 13094 break 13095 } 13096 v.reset(Op386MOVLconst) 13097 v.AuxInt = 0 13098 return true 13099 } 13100 return false 13101 } 13102 func rewriteValue386_Op386SHRBconst(v *Value) bool { 13103 // match: (SHRBconst x [0]) 13104 // cond: 13105 // result: x 13106 for { 13107 if v.AuxInt != 0 { 13108 break 13109 } 13110 x := v.Args[0] 13111 v.reset(OpCopy) 13112 v.Type = x.Type 13113 v.AddArg(x) 13114 return true 13115 } 13116 return false 13117 } 13118 func rewriteValue386_Op386SHRL(v *Value) bool { 13119 // match: (SHRL x (MOVLconst [c])) 13120 // cond: 13121 // result: (SHRLconst [c&31] x) 13122 for { 13123 x := v.Args[0] 13124 v_1 := v.Args[1] 13125 if v_1.Op != Op386MOVLconst { 13126 break 13127 } 13128 c := v_1.AuxInt 13129 v.reset(Op386SHRLconst) 13130 v.AuxInt = c & 31 13131 v.AddArg(x) 13132 return true 13133 } 13134 // match: (SHRL x (ANDLconst [31] y)) 13135 // cond: 13136 // result: (SHRL x y) 13137 for { 13138 x := v.Args[0] 13139 v_1 := v.Args[1] 13140 if v_1.Op != Op386ANDLconst { 13141 break 13142 } 13143 if v_1.AuxInt != 31 { 13144 break 13145 } 13146 y := v_1.Args[0] 13147 v.reset(Op386SHRL) 13148 v.AddArg(x) 13149 v.AddArg(y) 13150 return true 13151 } 13152 return false 13153 } 13154 func rewriteValue386_Op386SHRLconst(v *Value) bool { 13155 // match: (SHRLconst x [0]) 13156 // cond: 13157 // result: x 13158 for { 13159 if v.AuxInt != 0 { 13160 break 13161 } 13162 x := v.Args[0] 13163 v.reset(OpCopy) 13164 v.Type = x.Type 13165 v.AddArg(x) 13166 return true 13167 } 13168 return false 13169 } 13170 func rewriteValue386_Op386SHRW(v *Value) bool { 13171 // match: (SHRW x (MOVLconst [c])) 13172 // cond: c&31 < 16 13173 // result: (SHRWconst [c&31] x) 13174 for { 13175 x := v.Args[0] 13176 v_1 := v.Args[1] 13177 if v_1.Op != Op386MOVLconst { 13178 break 13179 } 13180 c := v_1.AuxInt 13181 if !(c&31 < 16) { 13182 break 13183 } 13184 v.reset(Op386SHRWconst) 13185 v.AuxInt = c & 31 13186 v.AddArg(x) 13187 return true 13188 } 13189 // match: (SHRW _ (MOVLconst [c])) 13190 // cond: c&31 >= 16 13191 // result: (MOVLconst [0]) 13192 for { 13193 v_1 := v.Args[1] 13194 if v_1.Op != Op386MOVLconst { 13195 break 13196 } 13197 c := v_1.AuxInt 13198 if !(c&31 >= 16) { 13199 break 13200 } 13201 v.reset(Op386MOVLconst) 13202 v.AuxInt = 0 13203 return true 13204 } 13205 return false 13206 } 13207 func rewriteValue386_Op386SHRWconst(v *Value) bool { 13208 // match: (SHRWconst x [0]) 13209 // cond: 13210 // result: x 13211 for { 13212 if v.AuxInt != 0 { 13213 break 13214 } 13215 x := v.Args[0] 13216 v.reset(OpCopy) 13217 v.Type = x.Type 13218 v.AddArg(x) 13219 return true 13220 } 13221 return false 13222 } 13223 func rewriteValue386_Op386SUBL(v *Value) bool { 13224 b := v.Block 13225 _ = b 13226 // match: (SUBL x (MOVLconst [c])) 13227 // cond: 13228 // result: (SUBLconst x [c]) 13229 for { 13230 x := v.Args[0] 13231 v_1 := v.Args[1] 13232 if v_1.Op != Op386MOVLconst { 13233 break 13234 } 13235 c := v_1.AuxInt 13236 v.reset(Op386SUBLconst) 13237 v.AuxInt = c 13238 v.AddArg(x) 13239 return true 13240 } 13241 // match: (SUBL (MOVLconst [c]) x) 13242 // cond: 13243 // result: (NEGL (SUBLconst <v.Type> x [c])) 13244 for { 13245 v_0 := v.Args[0] 13246 if v_0.Op != Op386MOVLconst { 13247 break 13248 } 13249 c := v_0.AuxInt 13250 x := v.Args[1] 13251 v.reset(Op386NEGL) 13252 v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) 13253 v0.AuxInt = c 13254 v0.AddArg(x) 13255 v.AddArg(v0) 13256 return true 13257 } 13258 // match: (SUBL x x) 13259 // cond: 13260 // result: (MOVLconst [0]) 13261 for { 13262 x := v.Args[0] 13263 if x != v.Args[1] { 13264 break 13265 } 13266 v.reset(Op386MOVLconst) 13267 v.AuxInt = 0 13268 return true 13269 } 13270 return false 13271 } 13272 func rewriteValue386_Op386SUBLcarry(v *Value) bool { 13273 // match: (SUBLcarry x (MOVLconst [c])) 13274 // cond: 13275 // result: (SUBLconstcarry [c] x) 13276 for { 13277 x := v.Args[0] 13278 v_1 := v.Args[1] 13279 if v_1.Op != Op386MOVLconst { 13280 break 13281 } 13282 c := v_1.AuxInt 13283 v.reset(Op386SUBLconstcarry) 13284 v.AuxInt = c 13285 v.AddArg(x) 13286 return true 13287 } 13288 return false 13289 } 13290 func rewriteValue386_Op386SUBLconst(v *Value) bool { 13291 // match: (SUBLconst [c] x) 13292 // cond: int32(c) == 0 13293 // result: x 13294 for { 13295 c := v.AuxInt 13296 x := v.Args[0] 13297 if !(int32(c) == 0) { 13298 break 13299 } 13300 v.reset(OpCopy) 13301 v.Type = x.Type 13302 v.AddArg(x) 13303 return true 13304 } 13305 // match: (SUBLconst [c] x) 13306 // cond: 13307 // result: (ADDLconst [int64(int32(-c))] x) 13308 for { 13309 c := v.AuxInt 13310 x := v.Args[0] 13311 v.reset(Op386ADDLconst) 13312 v.AuxInt = int64(int32(-c)) 13313 v.AddArg(x) 13314 return true 13315 } 13316 } 13317 func rewriteValue386_Op386XORL(v *Value) bool { 13318 // match: (XORL x (MOVLconst [c])) 13319 // cond: 13320 // result: (XORLconst [c] x) 13321 for { 13322 x := v.Args[0] 13323 v_1 := v.Args[1] 13324 if v_1.Op != Op386MOVLconst { 13325 break 13326 } 13327 c := v_1.AuxInt 13328 v.reset(Op386XORLconst) 13329 v.AuxInt = c 13330 v.AddArg(x) 13331 return true 13332 } 13333 // match: (XORL (MOVLconst [c]) x) 13334 // cond: 13335 // result: (XORLconst [c] x) 13336 for { 13337 v_0 := v.Args[0] 13338 if v_0.Op != Op386MOVLconst { 13339 break 13340 } 13341 c := v_0.AuxInt 13342 x := v.Args[1] 13343 v.reset(Op386XORLconst) 13344 v.AuxInt = c 13345 v.AddArg(x) 13346 return true 13347 } 13348 // match: (XORL (SHLLconst [c] x) (SHRLconst [d] x)) 13349 // cond: d == 32-c 13350 // result: (ROLLconst [c] x) 13351 for { 13352 v_0 := v.Args[0] 13353 if v_0.Op != Op386SHLLconst { 13354 break 13355 } 13356 c := v_0.AuxInt 13357 x := v_0.Args[0] 13358 v_1 := v.Args[1] 13359 if v_1.Op != Op386SHRLconst { 13360 break 13361 } 13362 d := v_1.AuxInt 13363 if x != v_1.Args[0] { 13364 break 13365 } 13366 if !(d == 32-c) { 13367 break 13368 } 13369 v.reset(Op386ROLLconst) 13370 v.AuxInt = c 13371 v.AddArg(x) 13372 return true 13373 } 13374 // match: (XORL (SHRLconst [d] x) (SHLLconst [c] x)) 13375 // cond: d == 32-c 13376 // result: (ROLLconst [c] x) 13377 for { 13378 v_0 := v.Args[0] 13379 if v_0.Op != Op386SHRLconst { 13380 break 13381 } 13382 d := v_0.AuxInt 13383 x := v_0.Args[0] 13384 v_1 := v.Args[1] 13385 if v_1.Op != Op386SHLLconst { 13386 break 13387 } 13388 c := v_1.AuxInt 13389 if x != v_1.Args[0] { 13390 break 13391 } 13392 if !(d == 32-c) { 13393 break 13394 } 13395 v.reset(Op386ROLLconst) 13396 v.AuxInt = c 13397 v.AddArg(x) 13398 return true 13399 } 13400 // match: (XORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 13401 // cond: c < 16 && d == 16-c && t.Size() == 2 13402 // result: (ROLWconst x [c]) 13403 for { 13404 t := v.Type 13405 v_0 := v.Args[0] 13406 if v_0.Op != Op386SHLLconst { 13407 break 13408 } 13409 c := v_0.AuxInt 13410 x := v_0.Args[0] 13411 v_1 := v.Args[1] 13412 if v_1.Op != Op386SHRWconst { 13413 break 13414 } 13415 d := v_1.AuxInt 13416 if x != v_1.Args[0] { 13417 break 13418 } 13419 if !(c < 16 && d == 16-c && t.Size() == 2) { 13420 break 13421 } 13422 v.reset(Op386ROLWconst) 13423 v.AuxInt = c 13424 v.AddArg(x) 13425 return true 13426 } 13427 // match: (XORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 13428 // cond: c < 16 && d == 16-c && t.Size() == 2 13429 // result: (ROLWconst x [c]) 13430 for { 13431 t := v.Type 13432 v_0 := v.Args[0] 13433 if v_0.Op != Op386SHRWconst { 13434 break 13435 } 13436 d := v_0.AuxInt 13437 x := v_0.Args[0] 13438 v_1 := v.Args[1] 13439 if v_1.Op != Op386SHLLconst { 13440 break 13441 } 13442 c := v_1.AuxInt 13443 if x != v_1.Args[0] { 13444 break 13445 } 13446 if !(c < 16 && d == 16-c && t.Size() == 2) { 13447 break 13448 } 13449 v.reset(Op386ROLWconst) 13450 v.AuxInt = c 13451 v.AddArg(x) 13452 return true 13453 } 13454 // match: (XORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 13455 // cond: c < 8 && d == 8-c && t.Size() == 1 13456 // result: (ROLBconst x [c]) 13457 for { 13458 t := v.Type 13459 v_0 := v.Args[0] 13460 if v_0.Op != Op386SHLLconst { 13461 break 13462 } 13463 c := v_0.AuxInt 13464 x := v_0.Args[0] 13465 v_1 := v.Args[1] 13466 if v_1.Op != Op386SHRBconst { 13467 break 13468 } 13469 d := v_1.AuxInt 13470 if x != v_1.Args[0] { 13471 break 13472 } 13473 if !(c < 8 && d == 8-c && t.Size() == 1) { 13474 break 13475 } 13476 v.reset(Op386ROLBconst) 13477 v.AuxInt = c 13478 v.AddArg(x) 13479 return true 13480 } 13481 // match: (XORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 13482 // cond: c < 8 && d == 8-c && t.Size() == 1 13483 // result: (ROLBconst x [c]) 13484 for { 13485 t := v.Type 13486 v_0 := v.Args[0] 13487 if v_0.Op != Op386SHRBconst { 13488 break 13489 } 13490 d := v_0.AuxInt 13491 x := v_0.Args[0] 13492 v_1 := v.Args[1] 13493 if v_1.Op != Op386SHLLconst { 13494 break 13495 } 13496 c := v_1.AuxInt 13497 if x != v_1.Args[0] { 13498 break 13499 } 13500 if !(c < 8 && d == 8-c && t.Size() == 1) { 13501 break 13502 } 13503 v.reset(Op386ROLBconst) 13504 v.AuxInt = c 13505 v.AddArg(x) 13506 return true 13507 } 13508 // match: (XORL x x) 13509 // cond: 13510 // result: (MOVLconst [0]) 13511 for { 13512 x := v.Args[0] 13513 if x != v.Args[1] { 13514 break 13515 } 13516 v.reset(Op386MOVLconst) 13517 v.AuxInt = 0 13518 return true 13519 } 13520 return false 13521 } 13522 func rewriteValue386_Op386XORLconst(v *Value) bool { 13523 // match: (XORLconst [c] (XORLconst [d] x)) 13524 // cond: 13525 // result: (XORLconst [c ^ d] x) 13526 for { 13527 c := v.AuxInt 13528 v_0 := v.Args[0] 13529 if v_0.Op != Op386XORLconst { 13530 break 13531 } 13532 d := v_0.AuxInt 13533 x := v_0.Args[0] 13534 v.reset(Op386XORLconst) 13535 v.AuxInt = c ^ d 13536 v.AddArg(x) 13537 return true 13538 } 13539 // match: (XORLconst [c] x) 13540 // cond: int32(c)==0 13541 // result: x 13542 for { 13543 c := v.AuxInt 13544 x := v.Args[0] 13545 if !(int32(c) == 0) { 13546 break 13547 } 13548 v.reset(OpCopy) 13549 v.Type = x.Type 13550 v.AddArg(x) 13551 return true 13552 } 13553 // match: (XORLconst [c] (MOVLconst [d])) 13554 // cond: 13555 // result: (MOVLconst [c^d]) 13556 for { 13557 c := v.AuxInt 13558 v_0 := v.Args[0] 13559 if v_0.Op != Op386MOVLconst { 13560 break 13561 } 13562 d := v_0.AuxInt 13563 v.reset(Op386MOVLconst) 13564 v.AuxInt = c ^ d 13565 return true 13566 } 13567 return false 13568 } 13569 func rewriteValue386_OpAdd16(v *Value) bool { 13570 // match: (Add16 x y) 13571 // cond: 13572 // result: (ADDL x y) 13573 for { 13574 x := v.Args[0] 13575 y := v.Args[1] 13576 v.reset(Op386ADDL) 13577 v.AddArg(x) 13578 v.AddArg(y) 13579 return true 13580 } 13581 } 13582 func rewriteValue386_OpAdd32(v *Value) bool { 13583 // match: (Add32 x y) 13584 // cond: 13585 // result: (ADDL x y) 13586 for { 13587 x := v.Args[0] 13588 y := v.Args[1] 13589 v.reset(Op386ADDL) 13590 v.AddArg(x) 13591 v.AddArg(y) 13592 return true 13593 } 13594 } 13595 func rewriteValue386_OpAdd32F(v *Value) bool { 13596 // match: (Add32F x y) 13597 // cond: 13598 // result: (ADDSS x y) 13599 for { 13600 x := v.Args[0] 13601 y := v.Args[1] 13602 v.reset(Op386ADDSS) 13603 v.AddArg(x) 13604 v.AddArg(y) 13605 return true 13606 } 13607 } 13608 func rewriteValue386_OpAdd32carry(v *Value) bool { 13609 // match: (Add32carry x y) 13610 // cond: 13611 // result: (ADDLcarry x y) 13612 for { 13613 x := v.Args[0] 13614 y := v.Args[1] 13615 v.reset(Op386ADDLcarry) 13616 v.AddArg(x) 13617 v.AddArg(y) 13618 return true 13619 } 13620 } 13621 func rewriteValue386_OpAdd32withcarry(v *Value) bool { 13622 // match: (Add32withcarry x y c) 13623 // cond: 13624 // result: (ADCL x y c) 13625 for { 13626 x := v.Args[0] 13627 y := v.Args[1] 13628 c := v.Args[2] 13629 v.reset(Op386ADCL) 13630 v.AddArg(x) 13631 v.AddArg(y) 13632 v.AddArg(c) 13633 return true 13634 } 13635 } 13636 func rewriteValue386_OpAdd64F(v *Value) bool { 13637 // match: (Add64F x y) 13638 // cond: 13639 // result: (ADDSD x y) 13640 for { 13641 x := v.Args[0] 13642 y := v.Args[1] 13643 v.reset(Op386ADDSD) 13644 v.AddArg(x) 13645 v.AddArg(y) 13646 return true 13647 } 13648 } 13649 func rewriteValue386_OpAdd8(v *Value) bool { 13650 // match: (Add8 x y) 13651 // cond: 13652 // result: (ADDL x y) 13653 for { 13654 x := v.Args[0] 13655 y := v.Args[1] 13656 v.reset(Op386ADDL) 13657 v.AddArg(x) 13658 v.AddArg(y) 13659 return true 13660 } 13661 } 13662 func rewriteValue386_OpAddPtr(v *Value) bool { 13663 // match: (AddPtr x y) 13664 // cond: 13665 // result: (ADDL x y) 13666 for { 13667 x := v.Args[0] 13668 y := v.Args[1] 13669 v.reset(Op386ADDL) 13670 v.AddArg(x) 13671 v.AddArg(y) 13672 return true 13673 } 13674 } 13675 func rewriteValue386_OpAddr(v *Value) bool { 13676 // match: (Addr {sym} base) 13677 // cond: 13678 // result: (LEAL {sym} base) 13679 for { 13680 sym := v.Aux 13681 base := v.Args[0] 13682 v.reset(Op386LEAL) 13683 v.Aux = sym 13684 v.AddArg(base) 13685 return true 13686 } 13687 } 13688 func rewriteValue386_OpAnd16(v *Value) bool { 13689 // match: (And16 x y) 13690 // cond: 13691 // result: (ANDL x y) 13692 for { 13693 x := v.Args[0] 13694 y := v.Args[1] 13695 v.reset(Op386ANDL) 13696 v.AddArg(x) 13697 v.AddArg(y) 13698 return true 13699 } 13700 } 13701 func rewriteValue386_OpAnd32(v *Value) bool { 13702 // match: (And32 x y) 13703 // cond: 13704 // result: (ANDL x y) 13705 for { 13706 x := v.Args[0] 13707 y := v.Args[1] 13708 v.reset(Op386ANDL) 13709 v.AddArg(x) 13710 v.AddArg(y) 13711 return true 13712 } 13713 } 13714 func rewriteValue386_OpAnd8(v *Value) bool { 13715 // match: (And8 x y) 13716 // cond: 13717 // result: (ANDL x y) 13718 for { 13719 x := v.Args[0] 13720 y := v.Args[1] 13721 v.reset(Op386ANDL) 13722 v.AddArg(x) 13723 v.AddArg(y) 13724 return true 13725 } 13726 } 13727 func rewriteValue386_OpAndB(v *Value) bool { 13728 // match: (AndB x y) 13729 // cond: 13730 // result: (ANDL x y) 13731 for { 13732 x := v.Args[0] 13733 y := v.Args[1] 13734 v.reset(Op386ANDL) 13735 v.AddArg(x) 13736 v.AddArg(y) 13737 return true 13738 } 13739 } 13740 func rewriteValue386_OpAvg32u(v *Value) bool { 13741 // match: (Avg32u x y) 13742 // cond: 13743 // result: (AVGLU x y) 13744 for { 13745 x := v.Args[0] 13746 y := v.Args[1] 13747 v.reset(Op386AVGLU) 13748 v.AddArg(x) 13749 v.AddArg(y) 13750 return true 13751 } 13752 } 13753 func rewriteValue386_OpBswap32(v *Value) bool { 13754 // match: (Bswap32 x) 13755 // cond: 13756 // result: (BSWAPL x) 13757 for { 13758 x := v.Args[0] 13759 v.reset(Op386BSWAPL) 13760 v.AddArg(x) 13761 return true 13762 } 13763 } 13764 func rewriteValue386_OpClosureCall(v *Value) bool { 13765 // match: (ClosureCall [argwid] entry closure mem) 13766 // cond: 13767 // result: (CALLclosure [argwid] entry closure mem) 13768 for { 13769 argwid := v.AuxInt 13770 entry := v.Args[0] 13771 closure := v.Args[1] 13772 mem := v.Args[2] 13773 v.reset(Op386CALLclosure) 13774 v.AuxInt = argwid 13775 v.AddArg(entry) 13776 v.AddArg(closure) 13777 v.AddArg(mem) 13778 return true 13779 } 13780 } 13781 func rewriteValue386_OpCom16(v *Value) bool { 13782 // match: (Com16 x) 13783 // cond: 13784 // result: (NOTL x) 13785 for { 13786 x := v.Args[0] 13787 v.reset(Op386NOTL) 13788 v.AddArg(x) 13789 return true 13790 } 13791 } 13792 func rewriteValue386_OpCom32(v *Value) bool { 13793 // match: (Com32 x) 13794 // cond: 13795 // result: (NOTL x) 13796 for { 13797 x := v.Args[0] 13798 v.reset(Op386NOTL) 13799 v.AddArg(x) 13800 return true 13801 } 13802 } 13803 func rewriteValue386_OpCom8(v *Value) bool { 13804 // match: (Com8 x) 13805 // cond: 13806 // result: (NOTL x) 13807 for { 13808 x := v.Args[0] 13809 v.reset(Op386NOTL) 13810 v.AddArg(x) 13811 return true 13812 } 13813 } 13814 func rewriteValue386_OpConst16(v *Value) bool { 13815 // match: (Const16 [val]) 13816 // cond: 13817 // result: (MOVLconst [val]) 13818 for { 13819 val := v.AuxInt 13820 v.reset(Op386MOVLconst) 13821 v.AuxInt = val 13822 return true 13823 } 13824 } 13825 func rewriteValue386_OpConst32(v *Value) bool { 13826 // match: (Const32 [val]) 13827 // cond: 13828 // result: (MOVLconst [val]) 13829 for { 13830 val := v.AuxInt 13831 v.reset(Op386MOVLconst) 13832 v.AuxInt = val 13833 return true 13834 } 13835 } 13836 func rewriteValue386_OpConst32F(v *Value) bool { 13837 // match: (Const32F [val]) 13838 // cond: 13839 // result: (MOVSSconst [val]) 13840 for { 13841 val := v.AuxInt 13842 v.reset(Op386MOVSSconst) 13843 v.AuxInt = val 13844 return true 13845 } 13846 } 13847 func rewriteValue386_OpConst64F(v *Value) bool { 13848 // match: (Const64F [val]) 13849 // cond: 13850 // result: (MOVSDconst [val]) 13851 for { 13852 val := v.AuxInt 13853 v.reset(Op386MOVSDconst) 13854 v.AuxInt = val 13855 return true 13856 } 13857 } 13858 func rewriteValue386_OpConst8(v *Value) bool { 13859 // match: (Const8 [val]) 13860 // cond: 13861 // result: (MOVLconst [val]) 13862 for { 13863 val := v.AuxInt 13864 v.reset(Op386MOVLconst) 13865 v.AuxInt = val 13866 return true 13867 } 13868 } 13869 func rewriteValue386_OpConstBool(v *Value) bool { 13870 // match: (ConstBool [b]) 13871 // cond: 13872 // result: (MOVLconst [b]) 13873 for { 13874 b := v.AuxInt 13875 v.reset(Op386MOVLconst) 13876 v.AuxInt = b 13877 return true 13878 } 13879 } 13880 func rewriteValue386_OpConstNil(v *Value) bool { 13881 // match: (ConstNil) 13882 // cond: 13883 // result: (MOVLconst [0]) 13884 for { 13885 v.reset(Op386MOVLconst) 13886 v.AuxInt = 0 13887 return true 13888 } 13889 } 13890 func rewriteValue386_OpConvert(v *Value) bool { 13891 // match: (Convert <t> x mem) 13892 // cond: 13893 // result: (MOVLconvert <t> x mem) 13894 for { 13895 t := v.Type 13896 x := v.Args[0] 13897 mem := v.Args[1] 13898 v.reset(Op386MOVLconvert) 13899 v.Type = t 13900 v.AddArg(x) 13901 v.AddArg(mem) 13902 return true 13903 } 13904 } 13905 func rewriteValue386_OpCvt32Fto32(v *Value) bool { 13906 // match: (Cvt32Fto32 x) 13907 // cond: 13908 // result: (CVTTSS2SL x) 13909 for { 13910 x := v.Args[0] 13911 v.reset(Op386CVTTSS2SL) 13912 v.AddArg(x) 13913 return true 13914 } 13915 } 13916 func rewriteValue386_OpCvt32Fto64F(v *Value) bool { 13917 // match: (Cvt32Fto64F x) 13918 // cond: 13919 // result: (CVTSS2SD x) 13920 for { 13921 x := v.Args[0] 13922 v.reset(Op386CVTSS2SD) 13923 v.AddArg(x) 13924 return true 13925 } 13926 } 13927 func rewriteValue386_OpCvt32to32F(v *Value) bool { 13928 // match: (Cvt32to32F x) 13929 // cond: 13930 // result: (CVTSL2SS x) 13931 for { 13932 x := v.Args[0] 13933 v.reset(Op386CVTSL2SS) 13934 v.AddArg(x) 13935 return true 13936 } 13937 } 13938 func rewriteValue386_OpCvt32to64F(v *Value) bool { 13939 // match: (Cvt32to64F x) 13940 // cond: 13941 // result: (CVTSL2SD x) 13942 for { 13943 x := v.Args[0] 13944 v.reset(Op386CVTSL2SD) 13945 v.AddArg(x) 13946 return true 13947 } 13948 } 13949 func rewriteValue386_OpCvt64Fto32(v *Value) bool { 13950 // match: (Cvt64Fto32 x) 13951 // cond: 13952 // result: (CVTTSD2SL x) 13953 for { 13954 x := v.Args[0] 13955 v.reset(Op386CVTTSD2SL) 13956 v.AddArg(x) 13957 return true 13958 } 13959 } 13960 func rewriteValue386_OpCvt64Fto32F(v *Value) bool { 13961 // match: (Cvt64Fto32F x) 13962 // cond: 13963 // result: (CVTSD2SS x) 13964 for { 13965 x := v.Args[0] 13966 v.reset(Op386CVTSD2SS) 13967 v.AddArg(x) 13968 return true 13969 } 13970 } 13971 func rewriteValue386_OpDiv16(v *Value) bool { 13972 // match: (Div16 x y) 13973 // cond: 13974 // result: (DIVW x y) 13975 for { 13976 x := v.Args[0] 13977 y := v.Args[1] 13978 v.reset(Op386DIVW) 13979 v.AddArg(x) 13980 v.AddArg(y) 13981 return true 13982 } 13983 } 13984 func rewriteValue386_OpDiv16u(v *Value) bool { 13985 // match: (Div16u x y) 13986 // cond: 13987 // result: (DIVWU x y) 13988 for { 13989 x := v.Args[0] 13990 y := v.Args[1] 13991 v.reset(Op386DIVWU) 13992 v.AddArg(x) 13993 v.AddArg(y) 13994 return true 13995 } 13996 } 13997 func rewriteValue386_OpDiv32(v *Value) bool { 13998 // match: (Div32 x y) 13999 // cond: 14000 // result: (DIVL x y) 14001 for { 14002 x := v.Args[0] 14003 y := v.Args[1] 14004 v.reset(Op386DIVL) 14005 v.AddArg(x) 14006 v.AddArg(y) 14007 return true 14008 } 14009 } 14010 func rewriteValue386_OpDiv32F(v *Value) bool { 14011 // match: (Div32F x y) 14012 // cond: 14013 // result: (DIVSS x y) 14014 for { 14015 x := v.Args[0] 14016 y := v.Args[1] 14017 v.reset(Op386DIVSS) 14018 v.AddArg(x) 14019 v.AddArg(y) 14020 return true 14021 } 14022 } 14023 func rewriteValue386_OpDiv32u(v *Value) bool { 14024 // match: (Div32u x y) 14025 // cond: 14026 // result: (DIVLU x y) 14027 for { 14028 x := v.Args[0] 14029 y := v.Args[1] 14030 v.reset(Op386DIVLU) 14031 v.AddArg(x) 14032 v.AddArg(y) 14033 return true 14034 } 14035 } 14036 func rewriteValue386_OpDiv64F(v *Value) bool { 14037 // match: (Div64F x y) 14038 // cond: 14039 // result: (DIVSD x y) 14040 for { 14041 x := v.Args[0] 14042 y := v.Args[1] 14043 v.reset(Op386DIVSD) 14044 v.AddArg(x) 14045 v.AddArg(y) 14046 return true 14047 } 14048 } 14049 func rewriteValue386_OpDiv8(v *Value) bool { 14050 b := v.Block 14051 _ = b 14052 types := &b.Func.Config.Types 14053 _ = types 14054 // match: (Div8 x y) 14055 // cond: 14056 // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) 14057 for { 14058 x := v.Args[0] 14059 y := v.Args[1] 14060 v.reset(Op386DIVW) 14061 v0 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 14062 v0.AddArg(x) 14063 v.AddArg(v0) 14064 v1 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 14065 v1.AddArg(y) 14066 v.AddArg(v1) 14067 return true 14068 } 14069 } 14070 func rewriteValue386_OpDiv8u(v *Value) bool { 14071 b := v.Block 14072 _ = b 14073 types := &b.Func.Config.Types 14074 _ = types 14075 // match: (Div8u x y) 14076 // cond: 14077 // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 14078 for { 14079 x := v.Args[0] 14080 y := v.Args[1] 14081 v.reset(Op386DIVWU) 14082 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 14083 v0.AddArg(x) 14084 v.AddArg(v0) 14085 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 14086 v1.AddArg(y) 14087 v.AddArg(v1) 14088 return true 14089 } 14090 } 14091 func rewriteValue386_OpEq16(v *Value) bool { 14092 b := v.Block 14093 _ = b 14094 // match: (Eq16 x y) 14095 // cond: 14096 // result: (SETEQ (CMPW x y)) 14097 for { 14098 x := v.Args[0] 14099 y := v.Args[1] 14100 v.reset(Op386SETEQ) 14101 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14102 v0.AddArg(x) 14103 v0.AddArg(y) 14104 v.AddArg(v0) 14105 return true 14106 } 14107 } 14108 func rewriteValue386_OpEq32(v *Value) bool { 14109 b := v.Block 14110 _ = b 14111 // match: (Eq32 x y) 14112 // cond: 14113 // result: (SETEQ (CMPL x y)) 14114 for { 14115 x := v.Args[0] 14116 y := v.Args[1] 14117 v.reset(Op386SETEQ) 14118 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14119 v0.AddArg(x) 14120 v0.AddArg(y) 14121 v.AddArg(v0) 14122 return true 14123 } 14124 } 14125 func rewriteValue386_OpEq32F(v *Value) bool { 14126 b := v.Block 14127 _ = b 14128 // match: (Eq32F x y) 14129 // cond: 14130 // result: (SETEQF (UCOMISS x y)) 14131 for { 14132 x := v.Args[0] 14133 y := v.Args[1] 14134 v.reset(Op386SETEQF) 14135 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14136 v0.AddArg(x) 14137 v0.AddArg(y) 14138 v.AddArg(v0) 14139 return true 14140 } 14141 } 14142 func rewriteValue386_OpEq64F(v *Value) bool { 14143 b := v.Block 14144 _ = b 14145 // match: (Eq64F x y) 14146 // cond: 14147 // result: (SETEQF (UCOMISD x y)) 14148 for { 14149 x := v.Args[0] 14150 y := v.Args[1] 14151 v.reset(Op386SETEQF) 14152 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14153 v0.AddArg(x) 14154 v0.AddArg(y) 14155 v.AddArg(v0) 14156 return true 14157 } 14158 } 14159 func rewriteValue386_OpEq8(v *Value) bool { 14160 b := v.Block 14161 _ = b 14162 // match: (Eq8 x y) 14163 // cond: 14164 // result: (SETEQ (CMPB x y)) 14165 for { 14166 x := v.Args[0] 14167 y := v.Args[1] 14168 v.reset(Op386SETEQ) 14169 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14170 v0.AddArg(x) 14171 v0.AddArg(y) 14172 v.AddArg(v0) 14173 return true 14174 } 14175 } 14176 func rewriteValue386_OpEqB(v *Value) bool { 14177 b := v.Block 14178 _ = b 14179 // match: (EqB x y) 14180 // cond: 14181 // result: (SETEQ (CMPB x y)) 14182 for { 14183 x := v.Args[0] 14184 y := v.Args[1] 14185 v.reset(Op386SETEQ) 14186 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14187 v0.AddArg(x) 14188 v0.AddArg(y) 14189 v.AddArg(v0) 14190 return true 14191 } 14192 } 14193 func rewriteValue386_OpEqPtr(v *Value) bool { 14194 b := v.Block 14195 _ = b 14196 // match: (EqPtr x y) 14197 // cond: 14198 // result: (SETEQ (CMPL x y)) 14199 for { 14200 x := v.Args[0] 14201 y := v.Args[1] 14202 v.reset(Op386SETEQ) 14203 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14204 v0.AddArg(x) 14205 v0.AddArg(y) 14206 v.AddArg(v0) 14207 return true 14208 } 14209 } 14210 func rewriteValue386_OpGeq16(v *Value) bool { 14211 b := v.Block 14212 _ = b 14213 // match: (Geq16 x y) 14214 // cond: 14215 // result: (SETGE (CMPW x y)) 14216 for { 14217 x := v.Args[0] 14218 y := v.Args[1] 14219 v.reset(Op386SETGE) 14220 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14221 v0.AddArg(x) 14222 v0.AddArg(y) 14223 v.AddArg(v0) 14224 return true 14225 } 14226 } 14227 func rewriteValue386_OpGeq16U(v *Value) bool { 14228 b := v.Block 14229 _ = b 14230 // match: (Geq16U x y) 14231 // cond: 14232 // result: (SETAE (CMPW x y)) 14233 for { 14234 x := v.Args[0] 14235 y := v.Args[1] 14236 v.reset(Op386SETAE) 14237 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14238 v0.AddArg(x) 14239 v0.AddArg(y) 14240 v.AddArg(v0) 14241 return true 14242 } 14243 } 14244 func rewriteValue386_OpGeq32(v *Value) bool { 14245 b := v.Block 14246 _ = b 14247 // match: (Geq32 x y) 14248 // cond: 14249 // result: (SETGE (CMPL x y)) 14250 for { 14251 x := v.Args[0] 14252 y := v.Args[1] 14253 v.reset(Op386SETGE) 14254 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14255 v0.AddArg(x) 14256 v0.AddArg(y) 14257 v.AddArg(v0) 14258 return true 14259 } 14260 } 14261 func rewriteValue386_OpGeq32F(v *Value) bool { 14262 b := v.Block 14263 _ = b 14264 // match: (Geq32F x y) 14265 // cond: 14266 // result: (SETGEF (UCOMISS x y)) 14267 for { 14268 x := v.Args[0] 14269 y := v.Args[1] 14270 v.reset(Op386SETGEF) 14271 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14272 v0.AddArg(x) 14273 v0.AddArg(y) 14274 v.AddArg(v0) 14275 return true 14276 } 14277 } 14278 func rewriteValue386_OpGeq32U(v *Value) bool { 14279 b := v.Block 14280 _ = b 14281 // match: (Geq32U x y) 14282 // cond: 14283 // result: (SETAE (CMPL x y)) 14284 for { 14285 x := v.Args[0] 14286 y := v.Args[1] 14287 v.reset(Op386SETAE) 14288 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14289 v0.AddArg(x) 14290 v0.AddArg(y) 14291 v.AddArg(v0) 14292 return true 14293 } 14294 } 14295 func rewriteValue386_OpGeq64F(v *Value) bool { 14296 b := v.Block 14297 _ = b 14298 // match: (Geq64F x y) 14299 // cond: 14300 // result: (SETGEF (UCOMISD x y)) 14301 for { 14302 x := v.Args[0] 14303 y := v.Args[1] 14304 v.reset(Op386SETGEF) 14305 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14306 v0.AddArg(x) 14307 v0.AddArg(y) 14308 v.AddArg(v0) 14309 return true 14310 } 14311 } 14312 func rewriteValue386_OpGeq8(v *Value) bool { 14313 b := v.Block 14314 _ = b 14315 // match: (Geq8 x y) 14316 // cond: 14317 // result: (SETGE (CMPB x y)) 14318 for { 14319 x := v.Args[0] 14320 y := v.Args[1] 14321 v.reset(Op386SETGE) 14322 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14323 v0.AddArg(x) 14324 v0.AddArg(y) 14325 v.AddArg(v0) 14326 return true 14327 } 14328 } 14329 func rewriteValue386_OpGeq8U(v *Value) bool { 14330 b := v.Block 14331 _ = b 14332 // match: (Geq8U x y) 14333 // cond: 14334 // result: (SETAE (CMPB x y)) 14335 for { 14336 x := v.Args[0] 14337 y := v.Args[1] 14338 v.reset(Op386SETAE) 14339 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14340 v0.AddArg(x) 14341 v0.AddArg(y) 14342 v.AddArg(v0) 14343 return true 14344 } 14345 } 14346 func rewriteValue386_OpGetClosurePtr(v *Value) bool { 14347 // match: (GetClosurePtr) 14348 // cond: 14349 // result: (LoweredGetClosurePtr) 14350 for { 14351 v.reset(Op386LoweredGetClosurePtr) 14352 return true 14353 } 14354 } 14355 func rewriteValue386_OpGetG(v *Value) bool { 14356 // match: (GetG mem) 14357 // cond: 14358 // result: (LoweredGetG mem) 14359 for { 14360 mem := v.Args[0] 14361 v.reset(Op386LoweredGetG) 14362 v.AddArg(mem) 14363 return true 14364 } 14365 } 14366 func rewriteValue386_OpGreater16(v *Value) bool { 14367 b := v.Block 14368 _ = b 14369 // match: (Greater16 x y) 14370 // cond: 14371 // result: (SETG (CMPW x y)) 14372 for { 14373 x := v.Args[0] 14374 y := v.Args[1] 14375 v.reset(Op386SETG) 14376 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14377 v0.AddArg(x) 14378 v0.AddArg(y) 14379 v.AddArg(v0) 14380 return true 14381 } 14382 } 14383 func rewriteValue386_OpGreater16U(v *Value) bool { 14384 b := v.Block 14385 _ = b 14386 // match: (Greater16U x y) 14387 // cond: 14388 // result: (SETA (CMPW x y)) 14389 for { 14390 x := v.Args[0] 14391 y := v.Args[1] 14392 v.reset(Op386SETA) 14393 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14394 v0.AddArg(x) 14395 v0.AddArg(y) 14396 v.AddArg(v0) 14397 return true 14398 } 14399 } 14400 func rewriteValue386_OpGreater32(v *Value) bool { 14401 b := v.Block 14402 _ = b 14403 // match: (Greater32 x y) 14404 // cond: 14405 // result: (SETG (CMPL x y)) 14406 for { 14407 x := v.Args[0] 14408 y := v.Args[1] 14409 v.reset(Op386SETG) 14410 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14411 v0.AddArg(x) 14412 v0.AddArg(y) 14413 v.AddArg(v0) 14414 return true 14415 } 14416 } 14417 func rewriteValue386_OpGreater32F(v *Value) bool { 14418 b := v.Block 14419 _ = b 14420 // match: (Greater32F x y) 14421 // cond: 14422 // result: (SETGF (UCOMISS x y)) 14423 for { 14424 x := v.Args[0] 14425 y := v.Args[1] 14426 v.reset(Op386SETGF) 14427 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14428 v0.AddArg(x) 14429 v0.AddArg(y) 14430 v.AddArg(v0) 14431 return true 14432 } 14433 } 14434 func rewriteValue386_OpGreater32U(v *Value) bool { 14435 b := v.Block 14436 _ = b 14437 // match: (Greater32U x y) 14438 // cond: 14439 // result: (SETA (CMPL x y)) 14440 for { 14441 x := v.Args[0] 14442 y := v.Args[1] 14443 v.reset(Op386SETA) 14444 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14445 v0.AddArg(x) 14446 v0.AddArg(y) 14447 v.AddArg(v0) 14448 return true 14449 } 14450 } 14451 func rewriteValue386_OpGreater64F(v *Value) bool { 14452 b := v.Block 14453 _ = b 14454 // match: (Greater64F x y) 14455 // cond: 14456 // result: (SETGF (UCOMISD x y)) 14457 for { 14458 x := v.Args[0] 14459 y := v.Args[1] 14460 v.reset(Op386SETGF) 14461 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14462 v0.AddArg(x) 14463 v0.AddArg(y) 14464 v.AddArg(v0) 14465 return true 14466 } 14467 } 14468 func rewriteValue386_OpGreater8(v *Value) bool { 14469 b := v.Block 14470 _ = b 14471 // match: (Greater8 x y) 14472 // cond: 14473 // result: (SETG (CMPB x y)) 14474 for { 14475 x := v.Args[0] 14476 y := v.Args[1] 14477 v.reset(Op386SETG) 14478 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14479 v0.AddArg(x) 14480 v0.AddArg(y) 14481 v.AddArg(v0) 14482 return true 14483 } 14484 } 14485 func rewriteValue386_OpGreater8U(v *Value) bool { 14486 b := v.Block 14487 _ = b 14488 // match: (Greater8U x y) 14489 // cond: 14490 // result: (SETA (CMPB x y)) 14491 for { 14492 x := v.Args[0] 14493 y := v.Args[1] 14494 v.reset(Op386SETA) 14495 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14496 v0.AddArg(x) 14497 v0.AddArg(y) 14498 v.AddArg(v0) 14499 return true 14500 } 14501 } 14502 func rewriteValue386_OpHmul32(v *Value) bool { 14503 // match: (Hmul32 x y) 14504 // cond: 14505 // result: (HMULL x y) 14506 for { 14507 x := v.Args[0] 14508 y := v.Args[1] 14509 v.reset(Op386HMULL) 14510 v.AddArg(x) 14511 v.AddArg(y) 14512 return true 14513 } 14514 } 14515 func rewriteValue386_OpHmul32u(v *Value) bool { 14516 // match: (Hmul32u x y) 14517 // cond: 14518 // result: (HMULLU x y) 14519 for { 14520 x := v.Args[0] 14521 y := v.Args[1] 14522 v.reset(Op386HMULLU) 14523 v.AddArg(x) 14524 v.AddArg(y) 14525 return true 14526 } 14527 } 14528 func rewriteValue386_OpInterCall(v *Value) bool { 14529 // match: (InterCall [argwid] entry mem) 14530 // cond: 14531 // result: (CALLinter [argwid] entry mem) 14532 for { 14533 argwid := v.AuxInt 14534 entry := v.Args[0] 14535 mem := v.Args[1] 14536 v.reset(Op386CALLinter) 14537 v.AuxInt = argwid 14538 v.AddArg(entry) 14539 v.AddArg(mem) 14540 return true 14541 } 14542 } 14543 func rewriteValue386_OpIsInBounds(v *Value) bool { 14544 b := v.Block 14545 _ = b 14546 // match: (IsInBounds idx len) 14547 // cond: 14548 // result: (SETB (CMPL idx len)) 14549 for { 14550 idx := v.Args[0] 14551 len := v.Args[1] 14552 v.reset(Op386SETB) 14553 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14554 v0.AddArg(idx) 14555 v0.AddArg(len) 14556 v.AddArg(v0) 14557 return true 14558 } 14559 } 14560 func rewriteValue386_OpIsNonNil(v *Value) bool { 14561 b := v.Block 14562 _ = b 14563 // match: (IsNonNil p) 14564 // cond: 14565 // result: (SETNE (TESTL p p)) 14566 for { 14567 p := v.Args[0] 14568 v.reset(Op386SETNE) 14569 v0 := b.NewValue0(v.Pos, Op386TESTL, TypeFlags) 14570 v0.AddArg(p) 14571 v0.AddArg(p) 14572 v.AddArg(v0) 14573 return true 14574 } 14575 } 14576 func rewriteValue386_OpIsSliceInBounds(v *Value) bool { 14577 b := v.Block 14578 _ = b 14579 // match: (IsSliceInBounds idx len) 14580 // cond: 14581 // result: (SETBE (CMPL idx len)) 14582 for { 14583 idx := v.Args[0] 14584 len := v.Args[1] 14585 v.reset(Op386SETBE) 14586 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14587 v0.AddArg(idx) 14588 v0.AddArg(len) 14589 v.AddArg(v0) 14590 return true 14591 } 14592 } 14593 func rewriteValue386_OpLeq16(v *Value) bool { 14594 b := v.Block 14595 _ = b 14596 // match: (Leq16 x y) 14597 // cond: 14598 // result: (SETLE (CMPW x y)) 14599 for { 14600 x := v.Args[0] 14601 y := v.Args[1] 14602 v.reset(Op386SETLE) 14603 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14604 v0.AddArg(x) 14605 v0.AddArg(y) 14606 v.AddArg(v0) 14607 return true 14608 } 14609 } 14610 func rewriteValue386_OpLeq16U(v *Value) bool { 14611 b := v.Block 14612 _ = b 14613 // match: (Leq16U x y) 14614 // cond: 14615 // result: (SETBE (CMPW x y)) 14616 for { 14617 x := v.Args[0] 14618 y := v.Args[1] 14619 v.reset(Op386SETBE) 14620 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14621 v0.AddArg(x) 14622 v0.AddArg(y) 14623 v.AddArg(v0) 14624 return true 14625 } 14626 } 14627 func rewriteValue386_OpLeq32(v *Value) bool { 14628 b := v.Block 14629 _ = b 14630 // match: (Leq32 x y) 14631 // cond: 14632 // result: (SETLE (CMPL x y)) 14633 for { 14634 x := v.Args[0] 14635 y := v.Args[1] 14636 v.reset(Op386SETLE) 14637 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14638 v0.AddArg(x) 14639 v0.AddArg(y) 14640 v.AddArg(v0) 14641 return true 14642 } 14643 } 14644 func rewriteValue386_OpLeq32F(v *Value) bool { 14645 b := v.Block 14646 _ = b 14647 // match: (Leq32F x y) 14648 // cond: 14649 // result: (SETGEF (UCOMISS y x)) 14650 for { 14651 x := v.Args[0] 14652 y := v.Args[1] 14653 v.reset(Op386SETGEF) 14654 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14655 v0.AddArg(y) 14656 v0.AddArg(x) 14657 v.AddArg(v0) 14658 return true 14659 } 14660 } 14661 func rewriteValue386_OpLeq32U(v *Value) bool { 14662 b := v.Block 14663 _ = b 14664 // match: (Leq32U x y) 14665 // cond: 14666 // result: (SETBE (CMPL x y)) 14667 for { 14668 x := v.Args[0] 14669 y := v.Args[1] 14670 v.reset(Op386SETBE) 14671 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14672 v0.AddArg(x) 14673 v0.AddArg(y) 14674 v.AddArg(v0) 14675 return true 14676 } 14677 } 14678 func rewriteValue386_OpLeq64F(v *Value) bool { 14679 b := v.Block 14680 _ = b 14681 // match: (Leq64F x y) 14682 // cond: 14683 // result: (SETGEF (UCOMISD y x)) 14684 for { 14685 x := v.Args[0] 14686 y := v.Args[1] 14687 v.reset(Op386SETGEF) 14688 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14689 v0.AddArg(y) 14690 v0.AddArg(x) 14691 v.AddArg(v0) 14692 return true 14693 } 14694 } 14695 func rewriteValue386_OpLeq8(v *Value) bool { 14696 b := v.Block 14697 _ = b 14698 // match: (Leq8 x y) 14699 // cond: 14700 // result: (SETLE (CMPB x y)) 14701 for { 14702 x := v.Args[0] 14703 y := v.Args[1] 14704 v.reset(Op386SETLE) 14705 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14706 v0.AddArg(x) 14707 v0.AddArg(y) 14708 v.AddArg(v0) 14709 return true 14710 } 14711 } 14712 func rewriteValue386_OpLeq8U(v *Value) bool { 14713 b := v.Block 14714 _ = b 14715 // match: (Leq8U x y) 14716 // cond: 14717 // result: (SETBE (CMPB x y)) 14718 for { 14719 x := v.Args[0] 14720 y := v.Args[1] 14721 v.reset(Op386SETBE) 14722 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14723 v0.AddArg(x) 14724 v0.AddArg(y) 14725 v.AddArg(v0) 14726 return true 14727 } 14728 } 14729 func rewriteValue386_OpLess16(v *Value) bool { 14730 b := v.Block 14731 _ = b 14732 // match: (Less16 x y) 14733 // cond: 14734 // result: (SETL (CMPW x y)) 14735 for { 14736 x := v.Args[0] 14737 y := v.Args[1] 14738 v.reset(Op386SETL) 14739 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14740 v0.AddArg(x) 14741 v0.AddArg(y) 14742 v.AddArg(v0) 14743 return true 14744 } 14745 } 14746 func rewriteValue386_OpLess16U(v *Value) bool { 14747 b := v.Block 14748 _ = b 14749 // match: (Less16U x y) 14750 // cond: 14751 // result: (SETB (CMPW x y)) 14752 for { 14753 x := v.Args[0] 14754 y := v.Args[1] 14755 v.reset(Op386SETB) 14756 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14757 v0.AddArg(x) 14758 v0.AddArg(y) 14759 v.AddArg(v0) 14760 return true 14761 } 14762 } 14763 func rewriteValue386_OpLess32(v *Value) bool { 14764 b := v.Block 14765 _ = b 14766 // match: (Less32 x y) 14767 // cond: 14768 // result: (SETL (CMPL x y)) 14769 for { 14770 x := v.Args[0] 14771 y := v.Args[1] 14772 v.reset(Op386SETL) 14773 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14774 v0.AddArg(x) 14775 v0.AddArg(y) 14776 v.AddArg(v0) 14777 return true 14778 } 14779 } 14780 func rewriteValue386_OpLess32F(v *Value) bool { 14781 b := v.Block 14782 _ = b 14783 // match: (Less32F x y) 14784 // cond: 14785 // result: (SETGF (UCOMISS y x)) 14786 for { 14787 x := v.Args[0] 14788 y := v.Args[1] 14789 v.reset(Op386SETGF) 14790 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14791 v0.AddArg(y) 14792 v0.AddArg(x) 14793 v.AddArg(v0) 14794 return true 14795 } 14796 } 14797 func rewriteValue386_OpLess32U(v *Value) bool { 14798 b := v.Block 14799 _ = b 14800 // match: (Less32U x y) 14801 // cond: 14802 // result: (SETB (CMPL x y)) 14803 for { 14804 x := v.Args[0] 14805 y := v.Args[1] 14806 v.reset(Op386SETB) 14807 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14808 v0.AddArg(x) 14809 v0.AddArg(y) 14810 v.AddArg(v0) 14811 return true 14812 } 14813 } 14814 func rewriteValue386_OpLess64F(v *Value) bool { 14815 b := v.Block 14816 _ = b 14817 // match: (Less64F x y) 14818 // cond: 14819 // result: (SETGF (UCOMISD y x)) 14820 for { 14821 x := v.Args[0] 14822 y := v.Args[1] 14823 v.reset(Op386SETGF) 14824 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14825 v0.AddArg(y) 14826 v0.AddArg(x) 14827 v.AddArg(v0) 14828 return true 14829 } 14830 } 14831 func rewriteValue386_OpLess8(v *Value) bool { 14832 b := v.Block 14833 _ = b 14834 // match: (Less8 x y) 14835 // cond: 14836 // result: (SETL (CMPB x y)) 14837 for { 14838 x := v.Args[0] 14839 y := v.Args[1] 14840 v.reset(Op386SETL) 14841 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14842 v0.AddArg(x) 14843 v0.AddArg(y) 14844 v.AddArg(v0) 14845 return true 14846 } 14847 } 14848 func rewriteValue386_OpLess8U(v *Value) bool { 14849 b := v.Block 14850 _ = b 14851 // match: (Less8U x y) 14852 // cond: 14853 // result: (SETB (CMPB x y)) 14854 for { 14855 x := v.Args[0] 14856 y := v.Args[1] 14857 v.reset(Op386SETB) 14858 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14859 v0.AddArg(x) 14860 v0.AddArg(y) 14861 v.AddArg(v0) 14862 return true 14863 } 14864 } 14865 func rewriteValue386_OpLoad(v *Value) bool { 14866 // match: (Load <t> ptr mem) 14867 // cond: (is32BitInt(t) || isPtr(t)) 14868 // result: (MOVLload ptr mem) 14869 for { 14870 t := v.Type 14871 ptr := v.Args[0] 14872 mem := v.Args[1] 14873 if !(is32BitInt(t) || isPtr(t)) { 14874 break 14875 } 14876 v.reset(Op386MOVLload) 14877 v.AddArg(ptr) 14878 v.AddArg(mem) 14879 return true 14880 } 14881 // match: (Load <t> ptr mem) 14882 // cond: is16BitInt(t) 14883 // result: (MOVWload ptr mem) 14884 for { 14885 t := v.Type 14886 ptr := v.Args[0] 14887 mem := v.Args[1] 14888 if !(is16BitInt(t)) { 14889 break 14890 } 14891 v.reset(Op386MOVWload) 14892 v.AddArg(ptr) 14893 v.AddArg(mem) 14894 return true 14895 } 14896 // match: (Load <t> ptr mem) 14897 // cond: (t.IsBoolean() || is8BitInt(t)) 14898 // result: (MOVBload ptr mem) 14899 for { 14900 t := v.Type 14901 ptr := v.Args[0] 14902 mem := v.Args[1] 14903 if !(t.IsBoolean() || is8BitInt(t)) { 14904 break 14905 } 14906 v.reset(Op386MOVBload) 14907 v.AddArg(ptr) 14908 v.AddArg(mem) 14909 return true 14910 } 14911 // match: (Load <t> ptr mem) 14912 // cond: is32BitFloat(t) 14913 // result: (MOVSSload ptr mem) 14914 for { 14915 t := v.Type 14916 ptr := v.Args[0] 14917 mem := v.Args[1] 14918 if !(is32BitFloat(t)) { 14919 break 14920 } 14921 v.reset(Op386MOVSSload) 14922 v.AddArg(ptr) 14923 v.AddArg(mem) 14924 return true 14925 } 14926 // match: (Load <t> ptr mem) 14927 // cond: is64BitFloat(t) 14928 // result: (MOVSDload ptr mem) 14929 for { 14930 t := v.Type 14931 ptr := v.Args[0] 14932 mem := v.Args[1] 14933 if !(is64BitFloat(t)) { 14934 break 14935 } 14936 v.reset(Op386MOVSDload) 14937 v.AddArg(ptr) 14938 v.AddArg(mem) 14939 return true 14940 } 14941 return false 14942 } 14943 func rewriteValue386_OpLsh16x16(v *Value) bool { 14944 b := v.Block 14945 _ = b 14946 // match: (Lsh16x16 <t> x y) 14947 // cond: 14948 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 14949 for { 14950 t := v.Type 14951 x := v.Args[0] 14952 y := v.Args[1] 14953 v.reset(Op386ANDL) 14954 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 14955 v0.AddArg(x) 14956 v0.AddArg(y) 14957 v.AddArg(v0) 14958 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 14959 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 14960 v2.AuxInt = 32 14961 v2.AddArg(y) 14962 v1.AddArg(v2) 14963 v.AddArg(v1) 14964 return true 14965 } 14966 } 14967 func rewriteValue386_OpLsh16x32(v *Value) bool { 14968 b := v.Block 14969 _ = b 14970 // match: (Lsh16x32 <t> x y) 14971 // cond: 14972 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 14973 for { 14974 t := v.Type 14975 x := v.Args[0] 14976 y := v.Args[1] 14977 v.reset(Op386ANDL) 14978 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 14979 v0.AddArg(x) 14980 v0.AddArg(y) 14981 v.AddArg(v0) 14982 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 14983 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 14984 v2.AuxInt = 32 14985 v2.AddArg(y) 14986 v1.AddArg(v2) 14987 v.AddArg(v1) 14988 return true 14989 } 14990 } 14991 func rewriteValue386_OpLsh16x64(v *Value) bool { 14992 // match: (Lsh16x64 x (Const64 [c])) 14993 // cond: uint64(c) < 16 14994 // result: (SHLLconst x [c]) 14995 for { 14996 x := v.Args[0] 14997 v_1 := v.Args[1] 14998 if v_1.Op != OpConst64 { 14999 break 15000 } 15001 c := v_1.AuxInt 15002 if !(uint64(c) < 16) { 15003 break 15004 } 15005 v.reset(Op386SHLLconst) 15006 v.AuxInt = c 15007 v.AddArg(x) 15008 return true 15009 } 15010 // match: (Lsh16x64 _ (Const64 [c])) 15011 // cond: uint64(c) >= 16 15012 // result: (Const16 [0]) 15013 for { 15014 v_1 := v.Args[1] 15015 if v_1.Op != OpConst64 { 15016 break 15017 } 15018 c := v_1.AuxInt 15019 if !(uint64(c) >= 16) { 15020 break 15021 } 15022 v.reset(OpConst16) 15023 v.AuxInt = 0 15024 return true 15025 } 15026 return false 15027 } 15028 func rewriteValue386_OpLsh16x8(v *Value) bool { 15029 b := v.Block 15030 _ = b 15031 // match: (Lsh16x8 <t> x y) 15032 // cond: 15033 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15034 for { 15035 t := v.Type 15036 x := v.Args[0] 15037 y := v.Args[1] 15038 v.reset(Op386ANDL) 15039 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15040 v0.AddArg(x) 15041 v0.AddArg(y) 15042 v.AddArg(v0) 15043 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15044 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 15045 v2.AuxInt = 32 15046 v2.AddArg(y) 15047 v1.AddArg(v2) 15048 v.AddArg(v1) 15049 return true 15050 } 15051 } 15052 func rewriteValue386_OpLsh32x16(v *Value) bool { 15053 b := v.Block 15054 _ = b 15055 // match: (Lsh32x16 <t> x y) 15056 // cond: 15057 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15058 for { 15059 t := v.Type 15060 x := v.Args[0] 15061 y := v.Args[1] 15062 v.reset(Op386ANDL) 15063 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15064 v0.AddArg(x) 15065 v0.AddArg(y) 15066 v.AddArg(v0) 15067 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15068 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 15069 v2.AuxInt = 32 15070 v2.AddArg(y) 15071 v1.AddArg(v2) 15072 v.AddArg(v1) 15073 return true 15074 } 15075 } 15076 func rewriteValue386_OpLsh32x32(v *Value) bool { 15077 b := v.Block 15078 _ = b 15079 // match: (Lsh32x32 <t> x y) 15080 // cond: 15081 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15082 for { 15083 t := v.Type 15084 x := v.Args[0] 15085 y := v.Args[1] 15086 v.reset(Op386ANDL) 15087 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15088 v0.AddArg(x) 15089 v0.AddArg(y) 15090 v.AddArg(v0) 15091 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15092 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 15093 v2.AuxInt = 32 15094 v2.AddArg(y) 15095 v1.AddArg(v2) 15096 v.AddArg(v1) 15097 return true 15098 } 15099 } 15100 func rewriteValue386_OpLsh32x64(v *Value) bool { 15101 // match: (Lsh32x64 x (Const64 [c])) 15102 // cond: uint64(c) < 32 15103 // result: (SHLLconst x [c]) 15104 for { 15105 x := v.Args[0] 15106 v_1 := v.Args[1] 15107 if v_1.Op != OpConst64 { 15108 break 15109 } 15110 c := v_1.AuxInt 15111 if !(uint64(c) < 32) { 15112 break 15113 } 15114 v.reset(Op386SHLLconst) 15115 v.AuxInt = c 15116 v.AddArg(x) 15117 return true 15118 } 15119 // match: (Lsh32x64 _ (Const64 [c])) 15120 // cond: uint64(c) >= 32 15121 // result: (Const32 [0]) 15122 for { 15123 v_1 := v.Args[1] 15124 if v_1.Op != OpConst64 { 15125 break 15126 } 15127 c := v_1.AuxInt 15128 if !(uint64(c) >= 32) { 15129 break 15130 } 15131 v.reset(OpConst32) 15132 v.AuxInt = 0 15133 return true 15134 } 15135 return false 15136 } 15137 func rewriteValue386_OpLsh32x8(v *Value) bool { 15138 b := v.Block 15139 _ = b 15140 // match: (Lsh32x8 <t> x y) 15141 // cond: 15142 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15143 for { 15144 t := v.Type 15145 x := v.Args[0] 15146 y := v.Args[1] 15147 v.reset(Op386ANDL) 15148 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15149 v0.AddArg(x) 15150 v0.AddArg(y) 15151 v.AddArg(v0) 15152 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15153 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 15154 v2.AuxInt = 32 15155 v2.AddArg(y) 15156 v1.AddArg(v2) 15157 v.AddArg(v1) 15158 return true 15159 } 15160 } 15161 func rewriteValue386_OpLsh8x16(v *Value) bool { 15162 b := v.Block 15163 _ = b 15164 // match: (Lsh8x16 <t> x y) 15165 // cond: 15166 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15167 for { 15168 t := v.Type 15169 x := v.Args[0] 15170 y := v.Args[1] 15171 v.reset(Op386ANDL) 15172 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15173 v0.AddArg(x) 15174 v0.AddArg(y) 15175 v.AddArg(v0) 15176 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15177 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 15178 v2.AuxInt = 32 15179 v2.AddArg(y) 15180 v1.AddArg(v2) 15181 v.AddArg(v1) 15182 return true 15183 } 15184 } 15185 func rewriteValue386_OpLsh8x32(v *Value) bool { 15186 b := v.Block 15187 _ = b 15188 // match: (Lsh8x32 <t> x y) 15189 // cond: 15190 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15191 for { 15192 t := v.Type 15193 x := v.Args[0] 15194 y := v.Args[1] 15195 v.reset(Op386ANDL) 15196 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15197 v0.AddArg(x) 15198 v0.AddArg(y) 15199 v.AddArg(v0) 15200 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15201 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 15202 v2.AuxInt = 32 15203 v2.AddArg(y) 15204 v1.AddArg(v2) 15205 v.AddArg(v1) 15206 return true 15207 } 15208 } 15209 func rewriteValue386_OpLsh8x64(v *Value) bool { 15210 // match: (Lsh8x64 x (Const64 [c])) 15211 // cond: uint64(c) < 8 15212 // result: (SHLLconst x [c]) 15213 for { 15214 x := v.Args[0] 15215 v_1 := v.Args[1] 15216 if v_1.Op != OpConst64 { 15217 break 15218 } 15219 c := v_1.AuxInt 15220 if !(uint64(c) < 8) { 15221 break 15222 } 15223 v.reset(Op386SHLLconst) 15224 v.AuxInt = c 15225 v.AddArg(x) 15226 return true 15227 } 15228 // match: (Lsh8x64 _ (Const64 [c])) 15229 // cond: uint64(c) >= 8 15230 // result: (Const8 [0]) 15231 for { 15232 v_1 := v.Args[1] 15233 if v_1.Op != OpConst64 { 15234 break 15235 } 15236 c := v_1.AuxInt 15237 if !(uint64(c) >= 8) { 15238 break 15239 } 15240 v.reset(OpConst8) 15241 v.AuxInt = 0 15242 return true 15243 } 15244 return false 15245 } 15246 func rewriteValue386_OpLsh8x8(v *Value) bool { 15247 b := v.Block 15248 _ = b 15249 // match: (Lsh8x8 <t> x y) 15250 // cond: 15251 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15252 for { 15253 t := v.Type 15254 x := v.Args[0] 15255 y := v.Args[1] 15256 v.reset(Op386ANDL) 15257 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15258 v0.AddArg(x) 15259 v0.AddArg(y) 15260 v.AddArg(v0) 15261 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15262 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 15263 v2.AuxInt = 32 15264 v2.AddArg(y) 15265 v1.AddArg(v2) 15266 v.AddArg(v1) 15267 return true 15268 } 15269 } 15270 func rewriteValue386_OpMod16(v *Value) bool { 15271 // match: (Mod16 x y) 15272 // cond: 15273 // result: (MODW x y) 15274 for { 15275 x := v.Args[0] 15276 y := v.Args[1] 15277 v.reset(Op386MODW) 15278 v.AddArg(x) 15279 v.AddArg(y) 15280 return true 15281 } 15282 } 15283 func rewriteValue386_OpMod16u(v *Value) bool { 15284 // match: (Mod16u x y) 15285 // cond: 15286 // result: (MODWU x y) 15287 for { 15288 x := v.Args[0] 15289 y := v.Args[1] 15290 v.reset(Op386MODWU) 15291 v.AddArg(x) 15292 v.AddArg(y) 15293 return true 15294 } 15295 } 15296 func rewriteValue386_OpMod32(v *Value) bool { 15297 // match: (Mod32 x y) 15298 // cond: 15299 // result: (MODL x y) 15300 for { 15301 x := v.Args[0] 15302 y := v.Args[1] 15303 v.reset(Op386MODL) 15304 v.AddArg(x) 15305 v.AddArg(y) 15306 return true 15307 } 15308 } 15309 func rewriteValue386_OpMod32u(v *Value) bool { 15310 // match: (Mod32u x y) 15311 // cond: 15312 // result: (MODLU x y) 15313 for { 15314 x := v.Args[0] 15315 y := v.Args[1] 15316 v.reset(Op386MODLU) 15317 v.AddArg(x) 15318 v.AddArg(y) 15319 return true 15320 } 15321 } 15322 func rewriteValue386_OpMod8(v *Value) bool { 15323 b := v.Block 15324 _ = b 15325 types := &b.Func.Config.Types 15326 _ = types 15327 // match: (Mod8 x y) 15328 // cond: 15329 // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) 15330 for { 15331 x := v.Args[0] 15332 y := v.Args[1] 15333 v.reset(Op386MODW) 15334 v0 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 15335 v0.AddArg(x) 15336 v.AddArg(v0) 15337 v1 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 15338 v1.AddArg(y) 15339 v.AddArg(v1) 15340 return true 15341 } 15342 } 15343 func rewriteValue386_OpMod8u(v *Value) bool { 15344 b := v.Block 15345 _ = b 15346 types := &b.Func.Config.Types 15347 _ = types 15348 // match: (Mod8u x y) 15349 // cond: 15350 // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 15351 for { 15352 x := v.Args[0] 15353 y := v.Args[1] 15354 v.reset(Op386MODWU) 15355 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 15356 v0.AddArg(x) 15357 v.AddArg(v0) 15358 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 15359 v1.AddArg(y) 15360 v.AddArg(v1) 15361 return true 15362 } 15363 } 15364 func rewriteValue386_OpMove(v *Value) bool { 15365 b := v.Block 15366 _ = b 15367 config := b.Func.Config 15368 _ = config 15369 types := &b.Func.Config.Types 15370 _ = types 15371 // match: (Move [0] _ _ mem) 15372 // cond: 15373 // result: mem 15374 for { 15375 if v.AuxInt != 0 { 15376 break 15377 } 15378 mem := v.Args[2] 15379 v.reset(OpCopy) 15380 v.Type = mem.Type 15381 v.AddArg(mem) 15382 return true 15383 } 15384 // match: (Move [1] dst src mem) 15385 // cond: 15386 // result: (MOVBstore dst (MOVBload src mem) mem) 15387 for { 15388 if v.AuxInt != 1 { 15389 break 15390 } 15391 dst := v.Args[0] 15392 src := v.Args[1] 15393 mem := v.Args[2] 15394 v.reset(Op386MOVBstore) 15395 v.AddArg(dst) 15396 v0 := b.NewValue0(v.Pos, Op386MOVBload, types.UInt8) 15397 v0.AddArg(src) 15398 v0.AddArg(mem) 15399 v.AddArg(v0) 15400 v.AddArg(mem) 15401 return true 15402 } 15403 // match: (Move [2] dst src mem) 15404 // cond: 15405 // result: (MOVWstore dst (MOVWload src mem) mem) 15406 for { 15407 if v.AuxInt != 2 { 15408 break 15409 } 15410 dst := v.Args[0] 15411 src := v.Args[1] 15412 mem := v.Args[2] 15413 v.reset(Op386MOVWstore) 15414 v.AddArg(dst) 15415 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 15416 v0.AddArg(src) 15417 v0.AddArg(mem) 15418 v.AddArg(v0) 15419 v.AddArg(mem) 15420 return true 15421 } 15422 // match: (Move [4] dst src mem) 15423 // cond: 15424 // result: (MOVLstore dst (MOVLload src mem) mem) 15425 for { 15426 if v.AuxInt != 4 { 15427 break 15428 } 15429 dst := v.Args[0] 15430 src := v.Args[1] 15431 mem := v.Args[2] 15432 v.reset(Op386MOVLstore) 15433 v.AddArg(dst) 15434 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15435 v0.AddArg(src) 15436 v0.AddArg(mem) 15437 v.AddArg(v0) 15438 v.AddArg(mem) 15439 return true 15440 } 15441 // match: (Move [3] dst src mem) 15442 // cond: 15443 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) 15444 for { 15445 if v.AuxInt != 3 { 15446 break 15447 } 15448 dst := v.Args[0] 15449 src := v.Args[1] 15450 mem := v.Args[2] 15451 v.reset(Op386MOVBstore) 15452 v.AuxInt = 2 15453 v.AddArg(dst) 15454 v0 := b.NewValue0(v.Pos, Op386MOVBload, types.UInt8) 15455 v0.AuxInt = 2 15456 v0.AddArg(src) 15457 v0.AddArg(mem) 15458 v.AddArg(v0) 15459 v1 := b.NewValue0(v.Pos, Op386MOVWstore, TypeMem) 15460 v1.AddArg(dst) 15461 v2 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 15462 v2.AddArg(src) 15463 v2.AddArg(mem) 15464 v1.AddArg(v2) 15465 v1.AddArg(mem) 15466 v.AddArg(v1) 15467 return true 15468 } 15469 // match: (Move [5] dst src mem) 15470 // cond: 15471 // result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15472 for { 15473 if v.AuxInt != 5 { 15474 break 15475 } 15476 dst := v.Args[0] 15477 src := v.Args[1] 15478 mem := v.Args[2] 15479 v.reset(Op386MOVBstore) 15480 v.AuxInt = 4 15481 v.AddArg(dst) 15482 v0 := b.NewValue0(v.Pos, Op386MOVBload, types.UInt8) 15483 v0.AuxInt = 4 15484 v0.AddArg(src) 15485 v0.AddArg(mem) 15486 v.AddArg(v0) 15487 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15488 v1.AddArg(dst) 15489 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15490 v2.AddArg(src) 15491 v2.AddArg(mem) 15492 v1.AddArg(v2) 15493 v1.AddArg(mem) 15494 v.AddArg(v1) 15495 return true 15496 } 15497 // match: (Move [6] dst src mem) 15498 // cond: 15499 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15500 for { 15501 if v.AuxInt != 6 { 15502 break 15503 } 15504 dst := v.Args[0] 15505 src := v.Args[1] 15506 mem := v.Args[2] 15507 v.reset(Op386MOVWstore) 15508 v.AuxInt = 4 15509 v.AddArg(dst) 15510 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 15511 v0.AuxInt = 4 15512 v0.AddArg(src) 15513 v0.AddArg(mem) 15514 v.AddArg(v0) 15515 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15516 v1.AddArg(dst) 15517 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15518 v2.AddArg(src) 15519 v2.AddArg(mem) 15520 v1.AddArg(v2) 15521 v1.AddArg(mem) 15522 v.AddArg(v1) 15523 return true 15524 } 15525 // match: (Move [7] dst src mem) 15526 // cond: 15527 // result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15528 for { 15529 if v.AuxInt != 7 { 15530 break 15531 } 15532 dst := v.Args[0] 15533 src := v.Args[1] 15534 mem := v.Args[2] 15535 v.reset(Op386MOVLstore) 15536 v.AuxInt = 3 15537 v.AddArg(dst) 15538 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15539 v0.AuxInt = 3 15540 v0.AddArg(src) 15541 v0.AddArg(mem) 15542 v.AddArg(v0) 15543 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15544 v1.AddArg(dst) 15545 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15546 v2.AddArg(src) 15547 v2.AddArg(mem) 15548 v1.AddArg(v2) 15549 v1.AddArg(mem) 15550 v.AddArg(v1) 15551 return true 15552 } 15553 // match: (Move [8] dst src mem) 15554 // cond: 15555 // result: (MOVLstore [4] dst (MOVLload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15556 for { 15557 if v.AuxInt != 8 { 15558 break 15559 } 15560 dst := v.Args[0] 15561 src := v.Args[1] 15562 mem := v.Args[2] 15563 v.reset(Op386MOVLstore) 15564 v.AuxInt = 4 15565 v.AddArg(dst) 15566 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15567 v0.AuxInt = 4 15568 v0.AddArg(src) 15569 v0.AddArg(mem) 15570 v.AddArg(v0) 15571 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15572 v1.AddArg(dst) 15573 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15574 v2.AddArg(src) 15575 v2.AddArg(mem) 15576 v1.AddArg(v2) 15577 v1.AddArg(mem) 15578 v.AddArg(v1) 15579 return true 15580 } 15581 // match: (Move [s] dst src mem) 15582 // cond: s > 8 && s%4 != 0 15583 // result: (Move [s-s%4] (ADDLconst <dst.Type> dst [s%4]) (ADDLconst <src.Type> src [s%4]) (MOVLstore dst (MOVLload src mem) mem)) 15584 for { 15585 s := v.AuxInt 15586 dst := v.Args[0] 15587 src := v.Args[1] 15588 mem := v.Args[2] 15589 if !(s > 8 && s%4 != 0) { 15590 break 15591 } 15592 v.reset(OpMove) 15593 v.AuxInt = s - s%4 15594 v0 := b.NewValue0(v.Pos, Op386ADDLconst, dst.Type) 15595 v0.AuxInt = s % 4 15596 v0.AddArg(dst) 15597 v.AddArg(v0) 15598 v1 := b.NewValue0(v.Pos, Op386ADDLconst, src.Type) 15599 v1.AuxInt = s % 4 15600 v1.AddArg(src) 15601 v.AddArg(v1) 15602 v2 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15603 v2.AddArg(dst) 15604 v3 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15605 v3.AddArg(src) 15606 v3.AddArg(mem) 15607 v2.AddArg(v3) 15608 v2.AddArg(mem) 15609 v.AddArg(v2) 15610 return true 15611 } 15612 // match: (Move [s] dst src mem) 15613 // cond: s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 15614 // result: (DUFFCOPY [10*(128-s/4)] dst src mem) 15615 for { 15616 s := v.AuxInt 15617 dst := v.Args[0] 15618 src := v.Args[1] 15619 mem := v.Args[2] 15620 if !(s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 15621 break 15622 } 15623 v.reset(Op386DUFFCOPY) 15624 v.AuxInt = 10 * (128 - s/4) 15625 v.AddArg(dst) 15626 v.AddArg(src) 15627 v.AddArg(mem) 15628 return true 15629 } 15630 // match: (Move [s] dst src mem) 15631 // cond: (s > 4*128 || config.noDuffDevice) && s%4 == 0 15632 // result: (REPMOVSL dst src (MOVLconst [s/4]) mem) 15633 for { 15634 s := v.AuxInt 15635 dst := v.Args[0] 15636 src := v.Args[1] 15637 mem := v.Args[2] 15638 if !((s > 4*128 || config.noDuffDevice) && s%4 == 0) { 15639 break 15640 } 15641 v.reset(Op386REPMOVSL) 15642 v.AddArg(dst) 15643 v.AddArg(src) 15644 v0 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 15645 v0.AuxInt = s / 4 15646 v.AddArg(v0) 15647 v.AddArg(mem) 15648 return true 15649 } 15650 return false 15651 } 15652 func rewriteValue386_OpMul16(v *Value) bool { 15653 // match: (Mul16 x y) 15654 // cond: 15655 // result: (MULL x y) 15656 for { 15657 x := v.Args[0] 15658 y := v.Args[1] 15659 v.reset(Op386MULL) 15660 v.AddArg(x) 15661 v.AddArg(y) 15662 return true 15663 } 15664 } 15665 func rewriteValue386_OpMul32(v *Value) bool { 15666 // match: (Mul32 x y) 15667 // cond: 15668 // result: (MULL x y) 15669 for { 15670 x := v.Args[0] 15671 y := v.Args[1] 15672 v.reset(Op386MULL) 15673 v.AddArg(x) 15674 v.AddArg(y) 15675 return true 15676 } 15677 } 15678 func rewriteValue386_OpMul32F(v *Value) bool { 15679 // match: (Mul32F x y) 15680 // cond: 15681 // result: (MULSS x y) 15682 for { 15683 x := v.Args[0] 15684 y := v.Args[1] 15685 v.reset(Op386MULSS) 15686 v.AddArg(x) 15687 v.AddArg(y) 15688 return true 15689 } 15690 } 15691 func rewriteValue386_OpMul32uhilo(v *Value) bool { 15692 // match: (Mul32uhilo x y) 15693 // cond: 15694 // result: (MULLQU x y) 15695 for { 15696 x := v.Args[0] 15697 y := v.Args[1] 15698 v.reset(Op386MULLQU) 15699 v.AddArg(x) 15700 v.AddArg(y) 15701 return true 15702 } 15703 } 15704 func rewriteValue386_OpMul64F(v *Value) bool { 15705 // match: (Mul64F x y) 15706 // cond: 15707 // result: (MULSD x y) 15708 for { 15709 x := v.Args[0] 15710 y := v.Args[1] 15711 v.reset(Op386MULSD) 15712 v.AddArg(x) 15713 v.AddArg(y) 15714 return true 15715 } 15716 } 15717 func rewriteValue386_OpMul8(v *Value) bool { 15718 // match: (Mul8 x y) 15719 // cond: 15720 // result: (MULL x y) 15721 for { 15722 x := v.Args[0] 15723 y := v.Args[1] 15724 v.reset(Op386MULL) 15725 v.AddArg(x) 15726 v.AddArg(y) 15727 return true 15728 } 15729 } 15730 func rewriteValue386_OpNeg16(v *Value) bool { 15731 // match: (Neg16 x) 15732 // cond: 15733 // result: (NEGL x) 15734 for { 15735 x := v.Args[0] 15736 v.reset(Op386NEGL) 15737 v.AddArg(x) 15738 return true 15739 } 15740 } 15741 func rewriteValue386_OpNeg32(v *Value) bool { 15742 // match: (Neg32 x) 15743 // cond: 15744 // result: (NEGL x) 15745 for { 15746 x := v.Args[0] 15747 v.reset(Op386NEGL) 15748 v.AddArg(x) 15749 return true 15750 } 15751 } 15752 func rewriteValue386_OpNeg32F(v *Value) bool { 15753 b := v.Block 15754 _ = b 15755 config := b.Func.Config 15756 _ = config 15757 types := &b.Func.Config.Types 15758 _ = types 15759 // match: (Neg32F x) 15760 // cond: !config.use387 15761 // result: (PXOR x (MOVSSconst <types.Float32> [f2i(math.Copysign(0, -1))])) 15762 for { 15763 x := v.Args[0] 15764 if !(!config.use387) { 15765 break 15766 } 15767 v.reset(Op386PXOR) 15768 v.AddArg(x) 15769 v0 := b.NewValue0(v.Pos, Op386MOVSSconst, types.Float32) 15770 v0.AuxInt = f2i(math.Copysign(0, -1)) 15771 v.AddArg(v0) 15772 return true 15773 } 15774 // match: (Neg32F x) 15775 // cond: config.use387 15776 // result: (FCHS x) 15777 for { 15778 x := v.Args[0] 15779 if !(config.use387) { 15780 break 15781 } 15782 v.reset(Op386FCHS) 15783 v.AddArg(x) 15784 return true 15785 } 15786 return false 15787 } 15788 func rewriteValue386_OpNeg64F(v *Value) bool { 15789 b := v.Block 15790 _ = b 15791 config := b.Func.Config 15792 _ = config 15793 types := &b.Func.Config.Types 15794 _ = types 15795 // match: (Neg64F x) 15796 // cond: !config.use387 15797 // result: (PXOR x (MOVSDconst <types.Float64> [f2i(math.Copysign(0, -1))])) 15798 for { 15799 x := v.Args[0] 15800 if !(!config.use387) { 15801 break 15802 } 15803 v.reset(Op386PXOR) 15804 v.AddArg(x) 15805 v0 := b.NewValue0(v.Pos, Op386MOVSDconst, types.Float64) 15806 v0.AuxInt = f2i(math.Copysign(0, -1)) 15807 v.AddArg(v0) 15808 return true 15809 } 15810 // match: (Neg64F x) 15811 // cond: config.use387 15812 // result: (FCHS x) 15813 for { 15814 x := v.Args[0] 15815 if !(config.use387) { 15816 break 15817 } 15818 v.reset(Op386FCHS) 15819 v.AddArg(x) 15820 return true 15821 } 15822 return false 15823 } 15824 func rewriteValue386_OpNeg8(v *Value) bool { 15825 // match: (Neg8 x) 15826 // cond: 15827 // result: (NEGL x) 15828 for { 15829 x := v.Args[0] 15830 v.reset(Op386NEGL) 15831 v.AddArg(x) 15832 return true 15833 } 15834 } 15835 func rewriteValue386_OpNeq16(v *Value) bool { 15836 b := v.Block 15837 _ = b 15838 // match: (Neq16 x y) 15839 // cond: 15840 // result: (SETNE (CMPW x y)) 15841 for { 15842 x := v.Args[0] 15843 y := v.Args[1] 15844 v.reset(Op386SETNE) 15845 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 15846 v0.AddArg(x) 15847 v0.AddArg(y) 15848 v.AddArg(v0) 15849 return true 15850 } 15851 } 15852 func rewriteValue386_OpNeq32(v *Value) bool { 15853 b := v.Block 15854 _ = b 15855 // match: (Neq32 x y) 15856 // cond: 15857 // result: (SETNE (CMPL x y)) 15858 for { 15859 x := v.Args[0] 15860 y := v.Args[1] 15861 v.reset(Op386SETNE) 15862 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 15863 v0.AddArg(x) 15864 v0.AddArg(y) 15865 v.AddArg(v0) 15866 return true 15867 } 15868 } 15869 func rewriteValue386_OpNeq32F(v *Value) bool { 15870 b := v.Block 15871 _ = b 15872 // match: (Neq32F x y) 15873 // cond: 15874 // result: (SETNEF (UCOMISS x y)) 15875 for { 15876 x := v.Args[0] 15877 y := v.Args[1] 15878 v.reset(Op386SETNEF) 15879 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 15880 v0.AddArg(x) 15881 v0.AddArg(y) 15882 v.AddArg(v0) 15883 return true 15884 } 15885 } 15886 func rewriteValue386_OpNeq64F(v *Value) bool { 15887 b := v.Block 15888 _ = b 15889 // match: (Neq64F x y) 15890 // cond: 15891 // result: (SETNEF (UCOMISD x y)) 15892 for { 15893 x := v.Args[0] 15894 y := v.Args[1] 15895 v.reset(Op386SETNEF) 15896 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 15897 v0.AddArg(x) 15898 v0.AddArg(y) 15899 v.AddArg(v0) 15900 return true 15901 } 15902 } 15903 func rewriteValue386_OpNeq8(v *Value) bool { 15904 b := v.Block 15905 _ = b 15906 // match: (Neq8 x y) 15907 // cond: 15908 // result: (SETNE (CMPB x y)) 15909 for { 15910 x := v.Args[0] 15911 y := v.Args[1] 15912 v.reset(Op386SETNE) 15913 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 15914 v0.AddArg(x) 15915 v0.AddArg(y) 15916 v.AddArg(v0) 15917 return true 15918 } 15919 } 15920 func rewriteValue386_OpNeqB(v *Value) bool { 15921 b := v.Block 15922 _ = b 15923 // match: (NeqB x y) 15924 // cond: 15925 // result: (SETNE (CMPB x y)) 15926 for { 15927 x := v.Args[0] 15928 y := v.Args[1] 15929 v.reset(Op386SETNE) 15930 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 15931 v0.AddArg(x) 15932 v0.AddArg(y) 15933 v.AddArg(v0) 15934 return true 15935 } 15936 } 15937 func rewriteValue386_OpNeqPtr(v *Value) bool { 15938 b := v.Block 15939 _ = b 15940 // match: (NeqPtr x y) 15941 // cond: 15942 // result: (SETNE (CMPL x y)) 15943 for { 15944 x := v.Args[0] 15945 y := v.Args[1] 15946 v.reset(Op386SETNE) 15947 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 15948 v0.AddArg(x) 15949 v0.AddArg(y) 15950 v.AddArg(v0) 15951 return true 15952 } 15953 } 15954 func rewriteValue386_OpNilCheck(v *Value) bool { 15955 // match: (NilCheck ptr mem) 15956 // cond: 15957 // result: (LoweredNilCheck ptr mem) 15958 for { 15959 ptr := v.Args[0] 15960 mem := v.Args[1] 15961 v.reset(Op386LoweredNilCheck) 15962 v.AddArg(ptr) 15963 v.AddArg(mem) 15964 return true 15965 } 15966 } 15967 func rewriteValue386_OpNot(v *Value) bool { 15968 // match: (Not x) 15969 // cond: 15970 // result: (XORLconst [1] x) 15971 for { 15972 x := v.Args[0] 15973 v.reset(Op386XORLconst) 15974 v.AuxInt = 1 15975 v.AddArg(x) 15976 return true 15977 } 15978 } 15979 func rewriteValue386_OpOffPtr(v *Value) bool { 15980 // match: (OffPtr [off] ptr) 15981 // cond: 15982 // result: (ADDLconst [off] ptr) 15983 for { 15984 off := v.AuxInt 15985 ptr := v.Args[0] 15986 v.reset(Op386ADDLconst) 15987 v.AuxInt = off 15988 v.AddArg(ptr) 15989 return true 15990 } 15991 } 15992 func rewriteValue386_OpOr16(v *Value) bool { 15993 // match: (Or16 x y) 15994 // cond: 15995 // result: (ORL x y) 15996 for { 15997 x := v.Args[0] 15998 y := v.Args[1] 15999 v.reset(Op386ORL) 16000 v.AddArg(x) 16001 v.AddArg(y) 16002 return true 16003 } 16004 } 16005 func rewriteValue386_OpOr32(v *Value) bool { 16006 // match: (Or32 x y) 16007 // cond: 16008 // result: (ORL x y) 16009 for { 16010 x := v.Args[0] 16011 y := v.Args[1] 16012 v.reset(Op386ORL) 16013 v.AddArg(x) 16014 v.AddArg(y) 16015 return true 16016 } 16017 } 16018 func rewriteValue386_OpOr8(v *Value) bool { 16019 // match: (Or8 x y) 16020 // cond: 16021 // result: (ORL x y) 16022 for { 16023 x := v.Args[0] 16024 y := v.Args[1] 16025 v.reset(Op386ORL) 16026 v.AddArg(x) 16027 v.AddArg(y) 16028 return true 16029 } 16030 } 16031 func rewriteValue386_OpOrB(v *Value) bool { 16032 // match: (OrB x y) 16033 // cond: 16034 // result: (ORL x y) 16035 for { 16036 x := v.Args[0] 16037 y := v.Args[1] 16038 v.reset(Op386ORL) 16039 v.AddArg(x) 16040 v.AddArg(y) 16041 return true 16042 } 16043 } 16044 func rewriteValue386_OpRound32F(v *Value) bool { 16045 // match: (Round32F x) 16046 // cond: 16047 // result: x 16048 for { 16049 x := v.Args[0] 16050 v.reset(OpCopy) 16051 v.Type = x.Type 16052 v.AddArg(x) 16053 return true 16054 } 16055 } 16056 func rewriteValue386_OpRound64F(v *Value) bool { 16057 // match: (Round64F x) 16058 // cond: 16059 // result: x 16060 for { 16061 x := v.Args[0] 16062 v.reset(OpCopy) 16063 v.Type = x.Type 16064 v.AddArg(x) 16065 return true 16066 } 16067 } 16068 func rewriteValue386_OpRsh16Ux16(v *Value) bool { 16069 b := v.Block 16070 _ = b 16071 // match: (Rsh16Ux16 <t> x y) 16072 // cond: 16073 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16]))) 16074 for { 16075 t := v.Type 16076 x := v.Args[0] 16077 y := v.Args[1] 16078 v.reset(Op386ANDL) 16079 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16080 v0.AddArg(x) 16081 v0.AddArg(y) 16082 v.AddArg(v0) 16083 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16084 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16085 v2.AuxInt = 16 16086 v2.AddArg(y) 16087 v1.AddArg(v2) 16088 v.AddArg(v1) 16089 return true 16090 } 16091 } 16092 func rewriteValue386_OpRsh16Ux32(v *Value) bool { 16093 b := v.Block 16094 _ = b 16095 // match: (Rsh16Ux32 <t> x y) 16096 // cond: 16097 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16]))) 16098 for { 16099 t := v.Type 16100 x := v.Args[0] 16101 y := v.Args[1] 16102 v.reset(Op386ANDL) 16103 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16104 v0.AddArg(x) 16105 v0.AddArg(y) 16106 v.AddArg(v0) 16107 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16108 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16109 v2.AuxInt = 16 16110 v2.AddArg(y) 16111 v1.AddArg(v2) 16112 v.AddArg(v1) 16113 return true 16114 } 16115 } 16116 func rewriteValue386_OpRsh16Ux64(v *Value) bool { 16117 // match: (Rsh16Ux64 x (Const64 [c])) 16118 // cond: uint64(c) < 16 16119 // result: (SHRWconst x [c]) 16120 for { 16121 x := v.Args[0] 16122 v_1 := v.Args[1] 16123 if v_1.Op != OpConst64 { 16124 break 16125 } 16126 c := v_1.AuxInt 16127 if !(uint64(c) < 16) { 16128 break 16129 } 16130 v.reset(Op386SHRWconst) 16131 v.AuxInt = c 16132 v.AddArg(x) 16133 return true 16134 } 16135 // match: (Rsh16Ux64 _ (Const64 [c])) 16136 // cond: uint64(c) >= 16 16137 // result: (Const16 [0]) 16138 for { 16139 v_1 := v.Args[1] 16140 if v_1.Op != OpConst64 { 16141 break 16142 } 16143 c := v_1.AuxInt 16144 if !(uint64(c) >= 16) { 16145 break 16146 } 16147 v.reset(OpConst16) 16148 v.AuxInt = 0 16149 return true 16150 } 16151 return false 16152 } 16153 func rewriteValue386_OpRsh16Ux8(v *Value) bool { 16154 b := v.Block 16155 _ = b 16156 // match: (Rsh16Ux8 <t> x y) 16157 // cond: 16158 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16]))) 16159 for { 16160 t := v.Type 16161 x := v.Args[0] 16162 y := v.Args[1] 16163 v.reset(Op386ANDL) 16164 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16165 v0.AddArg(x) 16166 v0.AddArg(y) 16167 v.AddArg(v0) 16168 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16169 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16170 v2.AuxInt = 16 16171 v2.AddArg(y) 16172 v1.AddArg(v2) 16173 v.AddArg(v1) 16174 return true 16175 } 16176 } 16177 func rewriteValue386_OpRsh16x16(v *Value) bool { 16178 b := v.Block 16179 _ = b 16180 // match: (Rsh16x16 <t> x y) 16181 // cond: 16182 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16]))))) 16183 for { 16184 t := v.Type 16185 x := v.Args[0] 16186 y := v.Args[1] 16187 v.reset(Op386SARW) 16188 v.Type = t 16189 v.AddArg(x) 16190 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16191 v0.AddArg(y) 16192 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16193 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16194 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16195 v3.AuxInt = 16 16196 v3.AddArg(y) 16197 v2.AddArg(v3) 16198 v1.AddArg(v2) 16199 v0.AddArg(v1) 16200 v.AddArg(v0) 16201 return true 16202 } 16203 } 16204 func rewriteValue386_OpRsh16x32(v *Value) bool { 16205 b := v.Block 16206 _ = b 16207 // match: (Rsh16x32 <t> x y) 16208 // cond: 16209 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16]))))) 16210 for { 16211 t := v.Type 16212 x := v.Args[0] 16213 y := v.Args[1] 16214 v.reset(Op386SARW) 16215 v.Type = t 16216 v.AddArg(x) 16217 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16218 v0.AddArg(y) 16219 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16220 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16221 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16222 v3.AuxInt = 16 16223 v3.AddArg(y) 16224 v2.AddArg(v3) 16225 v1.AddArg(v2) 16226 v0.AddArg(v1) 16227 v.AddArg(v0) 16228 return true 16229 } 16230 } 16231 func rewriteValue386_OpRsh16x64(v *Value) bool { 16232 // match: (Rsh16x64 x (Const64 [c])) 16233 // cond: uint64(c) < 16 16234 // result: (SARWconst x [c]) 16235 for { 16236 x := v.Args[0] 16237 v_1 := v.Args[1] 16238 if v_1.Op != OpConst64 { 16239 break 16240 } 16241 c := v_1.AuxInt 16242 if !(uint64(c) < 16) { 16243 break 16244 } 16245 v.reset(Op386SARWconst) 16246 v.AuxInt = c 16247 v.AddArg(x) 16248 return true 16249 } 16250 // match: (Rsh16x64 x (Const64 [c])) 16251 // cond: uint64(c) >= 16 16252 // result: (SARWconst x [15]) 16253 for { 16254 x := v.Args[0] 16255 v_1 := v.Args[1] 16256 if v_1.Op != OpConst64 { 16257 break 16258 } 16259 c := v_1.AuxInt 16260 if !(uint64(c) >= 16) { 16261 break 16262 } 16263 v.reset(Op386SARWconst) 16264 v.AuxInt = 15 16265 v.AddArg(x) 16266 return true 16267 } 16268 return false 16269 } 16270 func rewriteValue386_OpRsh16x8(v *Value) bool { 16271 b := v.Block 16272 _ = b 16273 // match: (Rsh16x8 <t> x y) 16274 // cond: 16275 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16]))))) 16276 for { 16277 t := v.Type 16278 x := v.Args[0] 16279 y := v.Args[1] 16280 v.reset(Op386SARW) 16281 v.Type = t 16282 v.AddArg(x) 16283 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16284 v0.AddArg(y) 16285 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16286 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16287 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16288 v3.AuxInt = 16 16289 v3.AddArg(y) 16290 v2.AddArg(v3) 16291 v1.AddArg(v2) 16292 v0.AddArg(v1) 16293 v.AddArg(v0) 16294 return true 16295 } 16296 } 16297 func rewriteValue386_OpRsh32Ux16(v *Value) bool { 16298 b := v.Block 16299 _ = b 16300 // match: (Rsh32Ux16 <t> x y) 16301 // cond: 16302 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 16303 for { 16304 t := v.Type 16305 x := v.Args[0] 16306 y := v.Args[1] 16307 v.reset(Op386ANDL) 16308 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 16309 v0.AddArg(x) 16310 v0.AddArg(y) 16311 v.AddArg(v0) 16312 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16313 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16314 v2.AuxInt = 32 16315 v2.AddArg(y) 16316 v1.AddArg(v2) 16317 v.AddArg(v1) 16318 return true 16319 } 16320 } 16321 func rewriteValue386_OpRsh32Ux32(v *Value) bool { 16322 b := v.Block 16323 _ = b 16324 // match: (Rsh32Ux32 <t> x y) 16325 // cond: 16326 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 16327 for { 16328 t := v.Type 16329 x := v.Args[0] 16330 y := v.Args[1] 16331 v.reset(Op386ANDL) 16332 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 16333 v0.AddArg(x) 16334 v0.AddArg(y) 16335 v.AddArg(v0) 16336 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16337 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16338 v2.AuxInt = 32 16339 v2.AddArg(y) 16340 v1.AddArg(v2) 16341 v.AddArg(v1) 16342 return true 16343 } 16344 } 16345 func rewriteValue386_OpRsh32Ux64(v *Value) bool { 16346 // match: (Rsh32Ux64 x (Const64 [c])) 16347 // cond: uint64(c) < 32 16348 // result: (SHRLconst x [c]) 16349 for { 16350 x := v.Args[0] 16351 v_1 := v.Args[1] 16352 if v_1.Op != OpConst64 { 16353 break 16354 } 16355 c := v_1.AuxInt 16356 if !(uint64(c) < 32) { 16357 break 16358 } 16359 v.reset(Op386SHRLconst) 16360 v.AuxInt = c 16361 v.AddArg(x) 16362 return true 16363 } 16364 // match: (Rsh32Ux64 _ (Const64 [c])) 16365 // cond: uint64(c) >= 32 16366 // result: (Const32 [0]) 16367 for { 16368 v_1 := v.Args[1] 16369 if v_1.Op != OpConst64 { 16370 break 16371 } 16372 c := v_1.AuxInt 16373 if !(uint64(c) >= 32) { 16374 break 16375 } 16376 v.reset(OpConst32) 16377 v.AuxInt = 0 16378 return true 16379 } 16380 return false 16381 } 16382 func rewriteValue386_OpRsh32Ux8(v *Value) bool { 16383 b := v.Block 16384 _ = b 16385 // match: (Rsh32Ux8 <t> x y) 16386 // cond: 16387 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 16388 for { 16389 t := v.Type 16390 x := v.Args[0] 16391 y := v.Args[1] 16392 v.reset(Op386ANDL) 16393 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 16394 v0.AddArg(x) 16395 v0.AddArg(y) 16396 v.AddArg(v0) 16397 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16398 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16399 v2.AuxInt = 32 16400 v2.AddArg(y) 16401 v1.AddArg(v2) 16402 v.AddArg(v1) 16403 return true 16404 } 16405 } 16406 func rewriteValue386_OpRsh32x16(v *Value) bool { 16407 b := v.Block 16408 _ = b 16409 // match: (Rsh32x16 <t> x y) 16410 // cond: 16411 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32]))))) 16412 for { 16413 t := v.Type 16414 x := v.Args[0] 16415 y := v.Args[1] 16416 v.reset(Op386SARL) 16417 v.Type = t 16418 v.AddArg(x) 16419 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16420 v0.AddArg(y) 16421 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16422 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16423 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16424 v3.AuxInt = 32 16425 v3.AddArg(y) 16426 v2.AddArg(v3) 16427 v1.AddArg(v2) 16428 v0.AddArg(v1) 16429 v.AddArg(v0) 16430 return true 16431 } 16432 } 16433 func rewriteValue386_OpRsh32x32(v *Value) bool { 16434 b := v.Block 16435 _ = b 16436 // match: (Rsh32x32 <t> x y) 16437 // cond: 16438 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32]))))) 16439 for { 16440 t := v.Type 16441 x := v.Args[0] 16442 y := v.Args[1] 16443 v.reset(Op386SARL) 16444 v.Type = t 16445 v.AddArg(x) 16446 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16447 v0.AddArg(y) 16448 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16449 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16450 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16451 v3.AuxInt = 32 16452 v3.AddArg(y) 16453 v2.AddArg(v3) 16454 v1.AddArg(v2) 16455 v0.AddArg(v1) 16456 v.AddArg(v0) 16457 return true 16458 } 16459 } 16460 func rewriteValue386_OpRsh32x64(v *Value) bool { 16461 // match: (Rsh32x64 x (Const64 [c])) 16462 // cond: uint64(c) < 32 16463 // result: (SARLconst x [c]) 16464 for { 16465 x := v.Args[0] 16466 v_1 := v.Args[1] 16467 if v_1.Op != OpConst64 { 16468 break 16469 } 16470 c := v_1.AuxInt 16471 if !(uint64(c) < 32) { 16472 break 16473 } 16474 v.reset(Op386SARLconst) 16475 v.AuxInt = c 16476 v.AddArg(x) 16477 return true 16478 } 16479 // match: (Rsh32x64 x (Const64 [c])) 16480 // cond: uint64(c) >= 32 16481 // result: (SARLconst x [31]) 16482 for { 16483 x := v.Args[0] 16484 v_1 := v.Args[1] 16485 if v_1.Op != OpConst64 { 16486 break 16487 } 16488 c := v_1.AuxInt 16489 if !(uint64(c) >= 32) { 16490 break 16491 } 16492 v.reset(Op386SARLconst) 16493 v.AuxInt = 31 16494 v.AddArg(x) 16495 return true 16496 } 16497 return false 16498 } 16499 func rewriteValue386_OpRsh32x8(v *Value) bool { 16500 b := v.Block 16501 _ = b 16502 // match: (Rsh32x8 <t> x y) 16503 // cond: 16504 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32]))))) 16505 for { 16506 t := v.Type 16507 x := v.Args[0] 16508 y := v.Args[1] 16509 v.reset(Op386SARL) 16510 v.Type = t 16511 v.AddArg(x) 16512 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16513 v0.AddArg(y) 16514 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16515 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16516 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16517 v3.AuxInt = 32 16518 v3.AddArg(y) 16519 v2.AddArg(v3) 16520 v1.AddArg(v2) 16521 v0.AddArg(v1) 16522 v.AddArg(v0) 16523 return true 16524 } 16525 } 16526 func rewriteValue386_OpRsh8Ux16(v *Value) bool { 16527 b := v.Block 16528 _ = b 16529 // match: (Rsh8Ux16 <t> x y) 16530 // cond: 16531 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8]))) 16532 for { 16533 t := v.Type 16534 x := v.Args[0] 16535 y := v.Args[1] 16536 v.reset(Op386ANDL) 16537 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 16538 v0.AddArg(x) 16539 v0.AddArg(y) 16540 v.AddArg(v0) 16541 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16542 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16543 v2.AuxInt = 8 16544 v2.AddArg(y) 16545 v1.AddArg(v2) 16546 v.AddArg(v1) 16547 return true 16548 } 16549 } 16550 func rewriteValue386_OpRsh8Ux32(v *Value) bool { 16551 b := v.Block 16552 _ = b 16553 // match: (Rsh8Ux32 <t> x y) 16554 // cond: 16555 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8]))) 16556 for { 16557 t := v.Type 16558 x := v.Args[0] 16559 y := v.Args[1] 16560 v.reset(Op386ANDL) 16561 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 16562 v0.AddArg(x) 16563 v0.AddArg(y) 16564 v.AddArg(v0) 16565 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16566 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16567 v2.AuxInt = 8 16568 v2.AddArg(y) 16569 v1.AddArg(v2) 16570 v.AddArg(v1) 16571 return true 16572 } 16573 } 16574 func rewriteValue386_OpRsh8Ux64(v *Value) bool { 16575 // match: (Rsh8Ux64 x (Const64 [c])) 16576 // cond: uint64(c) < 8 16577 // result: (SHRBconst x [c]) 16578 for { 16579 x := v.Args[0] 16580 v_1 := v.Args[1] 16581 if v_1.Op != OpConst64 { 16582 break 16583 } 16584 c := v_1.AuxInt 16585 if !(uint64(c) < 8) { 16586 break 16587 } 16588 v.reset(Op386SHRBconst) 16589 v.AuxInt = c 16590 v.AddArg(x) 16591 return true 16592 } 16593 // match: (Rsh8Ux64 _ (Const64 [c])) 16594 // cond: uint64(c) >= 8 16595 // result: (Const8 [0]) 16596 for { 16597 v_1 := v.Args[1] 16598 if v_1.Op != OpConst64 { 16599 break 16600 } 16601 c := v_1.AuxInt 16602 if !(uint64(c) >= 8) { 16603 break 16604 } 16605 v.reset(OpConst8) 16606 v.AuxInt = 0 16607 return true 16608 } 16609 return false 16610 } 16611 func rewriteValue386_OpRsh8Ux8(v *Value) bool { 16612 b := v.Block 16613 _ = b 16614 // match: (Rsh8Ux8 <t> x y) 16615 // cond: 16616 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8]))) 16617 for { 16618 t := v.Type 16619 x := v.Args[0] 16620 y := v.Args[1] 16621 v.reset(Op386ANDL) 16622 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 16623 v0.AddArg(x) 16624 v0.AddArg(y) 16625 v.AddArg(v0) 16626 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16627 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16628 v2.AuxInt = 8 16629 v2.AddArg(y) 16630 v1.AddArg(v2) 16631 v.AddArg(v1) 16632 return true 16633 } 16634 } 16635 func rewriteValue386_OpRsh8x16(v *Value) bool { 16636 b := v.Block 16637 _ = b 16638 // match: (Rsh8x16 <t> x y) 16639 // cond: 16640 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8]))))) 16641 for { 16642 t := v.Type 16643 x := v.Args[0] 16644 y := v.Args[1] 16645 v.reset(Op386SARB) 16646 v.Type = t 16647 v.AddArg(x) 16648 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16649 v0.AddArg(y) 16650 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16651 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16652 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16653 v3.AuxInt = 8 16654 v3.AddArg(y) 16655 v2.AddArg(v3) 16656 v1.AddArg(v2) 16657 v0.AddArg(v1) 16658 v.AddArg(v0) 16659 return true 16660 } 16661 } 16662 func rewriteValue386_OpRsh8x32(v *Value) bool { 16663 b := v.Block 16664 _ = b 16665 // match: (Rsh8x32 <t> x y) 16666 // cond: 16667 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8]))))) 16668 for { 16669 t := v.Type 16670 x := v.Args[0] 16671 y := v.Args[1] 16672 v.reset(Op386SARB) 16673 v.Type = t 16674 v.AddArg(x) 16675 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16676 v0.AddArg(y) 16677 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16678 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16679 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16680 v3.AuxInt = 8 16681 v3.AddArg(y) 16682 v2.AddArg(v3) 16683 v1.AddArg(v2) 16684 v0.AddArg(v1) 16685 v.AddArg(v0) 16686 return true 16687 } 16688 } 16689 func rewriteValue386_OpRsh8x64(v *Value) bool { 16690 // match: (Rsh8x64 x (Const64 [c])) 16691 // cond: uint64(c) < 8 16692 // result: (SARBconst x [c]) 16693 for { 16694 x := v.Args[0] 16695 v_1 := v.Args[1] 16696 if v_1.Op != OpConst64 { 16697 break 16698 } 16699 c := v_1.AuxInt 16700 if !(uint64(c) < 8) { 16701 break 16702 } 16703 v.reset(Op386SARBconst) 16704 v.AuxInt = c 16705 v.AddArg(x) 16706 return true 16707 } 16708 // match: (Rsh8x64 x (Const64 [c])) 16709 // cond: uint64(c) >= 8 16710 // result: (SARBconst x [7]) 16711 for { 16712 x := v.Args[0] 16713 v_1 := v.Args[1] 16714 if v_1.Op != OpConst64 { 16715 break 16716 } 16717 c := v_1.AuxInt 16718 if !(uint64(c) >= 8) { 16719 break 16720 } 16721 v.reset(Op386SARBconst) 16722 v.AuxInt = 7 16723 v.AddArg(x) 16724 return true 16725 } 16726 return false 16727 } 16728 func rewriteValue386_OpRsh8x8(v *Value) bool { 16729 b := v.Block 16730 _ = b 16731 // match: (Rsh8x8 <t> x y) 16732 // cond: 16733 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8]))))) 16734 for { 16735 t := v.Type 16736 x := v.Args[0] 16737 y := v.Args[1] 16738 v.reset(Op386SARB) 16739 v.Type = t 16740 v.AddArg(x) 16741 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16742 v0.AddArg(y) 16743 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16744 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16745 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16746 v3.AuxInt = 8 16747 v3.AddArg(y) 16748 v2.AddArg(v3) 16749 v1.AddArg(v2) 16750 v0.AddArg(v1) 16751 v.AddArg(v0) 16752 return true 16753 } 16754 } 16755 func rewriteValue386_OpSignExt16to32(v *Value) bool { 16756 // match: (SignExt16to32 x) 16757 // cond: 16758 // result: (MOVWLSX x) 16759 for { 16760 x := v.Args[0] 16761 v.reset(Op386MOVWLSX) 16762 v.AddArg(x) 16763 return true 16764 } 16765 } 16766 func rewriteValue386_OpSignExt8to16(v *Value) bool { 16767 // match: (SignExt8to16 x) 16768 // cond: 16769 // result: (MOVBLSX x) 16770 for { 16771 x := v.Args[0] 16772 v.reset(Op386MOVBLSX) 16773 v.AddArg(x) 16774 return true 16775 } 16776 } 16777 func rewriteValue386_OpSignExt8to32(v *Value) bool { 16778 // match: (SignExt8to32 x) 16779 // cond: 16780 // result: (MOVBLSX x) 16781 for { 16782 x := v.Args[0] 16783 v.reset(Op386MOVBLSX) 16784 v.AddArg(x) 16785 return true 16786 } 16787 } 16788 func rewriteValue386_OpSignmask(v *Value) bool { 16789 // match: (Signmask x) 16790 // cond: 16791 // result: (SARLconst x [31]) 16792 for { 16793 x := v.Args[0] 16794 v.reset(Op386SARLconst) 16795 v.AuxInt = 31 16796 v.AddArg(x) 16797 return true 16798 } 16799 } 16800 func rewriteValue386_OpSlicemask(v *Value) bool { 16801 b := v.Block 16802 _ = b 16803 // match: (Slicemask <t> x) 16804 // cond: 16805 // result: (SARLconst (NEGL <t> x) [31]) 16806 for { 16807 t := v.Type 16808 x := v.Args[0] 16809 v.reset(Op386SARLconst) 16810 v.AuxInt = 31 16811 v0 := b.NewValue0(v.Pos, Op386NEGL, t) 16812 v0.AddArg(x) 16813 v.AddArg(v0) 16814 return true 16815 } 16816 } 16817 func rewriteValue386_OpSqrt(v *Value) bool { 16818 // match: (Sqrt x) 16819 // cond: 16820 // result: (SQRTSD x) 16821 for { 16822 x := v.Args[0] 16823 v.reset(Op386SQRTSD) 16824 v.AddArg(x) 16825 return true 16826 } 16827 } 16828 func rewriteValue386_OpStaticCall(v *Value) bool { 16829 // match: (StaticCall [argwid] {target} mem) 16830 // cond: 16831 // result: (CALLstatic [argwid] {target} mem) 16832 for { 16833 argwid := v.AuxInt 16834 target := v.Aux 16835 mem := v.Args[0] 16836 v.reset(Op386CALLstatic) 16837 v.AuxInt = argwid 16838 v.Aux = target 16839 v.AddArg(mem) 16840 return true 16841 } 16842 } 16843 func rewriteValue386_OpStore(v *Value) bool { 16844 // match: (Store {t} ptr val mem) 16845 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 16846 // result: (MOVSDstore ptr val mem) 16847 for { 16848 t := v.Aux 16849 ptr := v.Args[0] 16850 val := v.Args[1] 16851 mem := v.Args[2] 16852 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 16853 break 16854 } 16855 v.reset(Op386MOVSDstore) 16856 v.AddArg(ptr) 16857 v.AddArg(val) 16858 v.AddArg(mem) 16859 return true 16860 } 16861 // match: (Store {t} ptr val mem) 16862 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 16863 // result: (MOVSSstore ptr val mem) 16864 for { 16865 t := v.Aux 16866 ptr := v.Args[0] 16867 val := v.Args[1] 16868 mem := v.Args[2] 16869 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 16870 break 16871 } 16872 v.reset(Op386MOVSSstore) 16873 v.AddArg(ptr) 16874 v.AddArg(val) 16875 v.AddArg(mem) 16876 return true 16877 } 16878 // match: (Store {t} ptr val mem) 16879 // cond: t.(Type).Size() == 4 16880 // result: (MOVLstore ptr val mem) 16881 for { 16882 t := v.Aux 16883 ptr := v.Args[0] 16884 val := v.Args[1] 16885 mem := v.Args[2] 16886 if !(t.(Type).Size() == 4) { 16887 break 16888 } 16889 v.reset(Op386MOVLstore) 16890 v.AddArg(ptr) 16891 v.AddArg(val) 16892 v.AddArg(mem) 16893 return true 16894 } 16895 // match: (Store {t} ptr val mem) 16896 // cond: t.(Type).Size() == 2 16897 // result: (MOVWstore ptr val mem) 16898 for { 16899 t := v.Aux 16900 ptr := v.Args[0] 16901 val := v.Args[1] 16902 mem := v.Args[2] 16903 if !(t.(Type).Size() == 2) { 16904 break 16905 } 16906 v.reset(Op386MOVWstore) 16907 v.AddArg(ptr) 16908 v.AddArg(val) 16909 v.AddArg(mem) 16910 return true 16911 } 16912 // match: (Store {t} ptr val mem) 16913 // cond: t.(Type).Size() == 1 16914 // result: (MOVBstore ptr val mem) 16915 for { 16916 t := v.Aux 16917 ptr := v.Args[0] 16918 val := v.Args[1] 16919 mem := v.Args[2] 16920 if !(t.(Type).Size() == 1) { 16921 break 16922 } 16923 v.reset(Op386MOVBstore) 16924 v.AddArg(ptr) 16925 v.AddArg(val) 16926 v.AddArg(mem) 16927 return true 16928 } 16929 return false 16930 } 16931 func rewriteValue386_OpSub16(v *Value) bool { 16932 // match: (Sub16 x y) 16933 // cond: 16934 // result: (SUBL x y) 16935 for { 16936 x := v.Args[0] 16937 y := v.Args[1] 16938 v.reset(Op386SUBL) 16939 v.AddArg(x) 16940 v.AddArg(y) 16941 return true 16942 } 16943 } 16944 func rewriteValue386_OpSub32(v *Value) bool { 16945 // match: (Sub32 x y) 16946 // cond: 16947 // result: (SUBL x y) 16948 for { 16949 x := v.Args[0] 16950 y := v.Args[1] 16951 v.reset(Op386SUBL) 16952 v.AddArg(x) 16953 v.AddArg(y) 16954 return true 16955 } 16956 } 16957 func rewriteValue386_OpSub32F(v *Value) bool { 16958 // match: (Sub32F x y) 16959 // cond: 16960 // result: (SUBSS x y) 16961 for { 16962 x := v.Args[0] 16963 y := v.Args[1] 16964 v.reset(Op386SUBSS) 16965 v.AddArg(x) 16966 v.AddArg(y) 16967 return true 16968 } 16969 } 16970 func rewriteValue386_OpSub32carry(v *Value) bool { 16971 // match: (Sub32carry x y) 16972 // cond: 16973 // result: (SUBLcarry x y) 16974 for { 16975 x := v.Args[0] 16976 y := v.Args[1] 16977 v.reset(Op386SUBLcarry) 16978 v.AddArg(x) 16979 v.AddArg(y) 16980 return true 16981 } 16982 } 16983 func rewriteValue386_OpSub32withcarry(v *Value) bool { 16984 // match: (Sub32withcarry x y c) 16985 // cond: 16986 // result: (SBBL x y c) 16987 for { 16988 x := v.Args[0] 16989 y := v.Args[1] 16990 c := v.Args[2] 16991 v.reset(Op386SBBL) 16992 v.AddArg(x) 16993 v.AddArg(y) 16994 v.AddArg(c) 16995 return true 16996 } 16997 } 16998 func rewriteValue386_OpSub64F(v *Value) bool { 16999 // match: (Sub64F x y) 17000 // cond: 17001 // result: (SUBSD x y) 17002 for { 17003 x := v.Args[0] 17004 y := v.Args[1] 17005 v.reset(Op386SUBSD) 17006 v.AddArg(x) 17007 v.AddArg(y) 17008 return true 17009 } 17010 } 17011 func rewriteValue386_OpSub8(v *Value) bool { 17012 // match: (Sub8 x y) 17013 // cond: 17014 // result: (SUBL x y) 17015 for { 17016 x := v.Args[0] 17017 y := v.Args[1] 17018 v.reset(Op386SUBL) 17019 v.AddArg(x) 17020 v.AddArg(y) 17021 return true 17022 } 17023 } 17024 func rewriteValue386_OpSubPtr(v *Value) bool { 17025 // match: (SubPtr x y) 17026 // cond: 17027 // result: (SUBL x y) 17028 for { 17029 x := v.Args[0] 17030 y := v.Args[1] 17031 v.reset(Op386SUBL) 17032 v.AddArg(x) 17033 v.AddArg(y) 17034 return true 17035 } 17036 } 17037 func rewriteValue386_OpTrunc16to8(v *Value) bool { 17038 // match: (Trunc16to8 x) 17039 // cond: 17040 // result: x 17041 for { 17042 x := v.Args[0] 17043 v.reset(OpCopy) 17044 v.Type = x.Type 17045 v.AddArg(x) 17046 return true 17047 } 17048 } 17049 func rewriteValue386_OpTrunc32to16(v *Value) bool { 17050 // match: (Trunc32to16 x) 17051 // cond: 17052 // result: x 17053 for { 17054 x := v.Args[0] 17055 v.reset(OpCopy) 17056 v.Type = x.Type 17057 v.AddArg(x) 17058 return true 17059 } 17060 } 17061 func rewriteValue386_OpTrunc32to8(v *Value) bool { 17062 // match: (Trunc32to8 x) 17063 // cond: 17064 // result: x 17065 for { 17066 x := v.Args[0] 17067 v.reset(OpCopy) 17068 v.Type = x.Type 17069 v.AddArg(x) 17070 return true 17071 } 17072 } 17073 func rewriteValue386_OpXor16(v *Value) bool { 17074 // match: (Xor16 x y) 17075 // cond: 17076 // result: (XORL x y) 17077 for { 17078 x := v.Args[0] 17079 y := v.Args[1] 17080 v.reset(Op386XORL) 17081 v.AddArg(x) 17082 v.AddArg(y) 17083 return true 17084 } 17085 } 17086 func rewriteValue386_OpXor32(v *Value) bool { 17087 // match: (Xor32 x y) 17088 // cond: 17089 // result: (XORL x y) 17090 for { 17091 x := v.Args[0] 17092 y := v.Args[1] 17093 v.reset(Op386XORL) 17094 v.AddArg(x) 17095 v.AddArg(y) 17096 return true 17097 } 17098 } 17099 func rewriteValue386_OpXor8(v *Value) bool { 17100 // match: (Xor8 x y) 17101 // cond: 17102 // result: (XORL x y) 17103 for { 17104 x := v.Args[0] 17105 y := v.Args[1] 17106 v.reset(Op386XORL) 17107 v.AddArg(x) 17108 v.AddArg(y) 17109 return true 17110 } 17111 } 17112 func rewriteValue386_OpZero(v *Value) bool { 17113 b := v.Block 17114 _ = b 17115 config := b.Func.Config 17116 _ = config 17117 types := &b.Func.Config.Types 17118 _ = types 17119 // match: (Zero [0] _ mem) 17120 // cond: 17121 // result: mem 17122 for { 17123 if v.AuxInt != 0 { 17124 break 17125 } 17126 mem := v.Args[1] 17127 v.reset(OpCopy) 17128 v.Type = mem.Type 17129 v.AddArg(mem) 17130 return true 17131 } 17132 // match: (Zero [1] destptr mem) 17133 // cond: 17134 // result: (MOVBstoreconst [0] destptr mem) 17135 for { 17136 if v.AuxInt != 1 { 17137 break 17138 } 17139 destptr := v.Args[0] 17140 mem := v.Args[1] 17141 v.reset(Op386MOVBstoreconst) 17142 v.AuxInt = 0 17143 v.AddArg(destptr) 17144 v.AddArg(mem) 17145 return true 17146 } 17147 // match: (Zero [2] destptr mem) 17148 // cond: 17149 // result: (MOVWstoreconst [0] destptr mem) 17150 for { 17151 if v.AuxInt != 2 { 17152 break 17153 } 17154 destptr := v.Args[0] 17155 mem := v.Args[1] 17156 v.reset(Op386MOVWstoreconst) 17157 v.AuxInt = 0 17158 v.AddArg(destptr) 17159 v.AddArg(mem) 17160 return true 17161 } 17162 // match: (Zero [4] destptr mem) 17163 // cond: 17164 // result: (MOVLstoreconst [0] destptr mem) 17165 for { 17166 if v.AuxInt != 4 { 17167 break 17168 } 17169 destptr := v.Args[0] 17170 mem := v.Args[1] 17171 v.reset(Op386MOVLstoreconst) 17172 v.AuxInt = 0 17173 v.AddArg(destptr) 17174 v.AddArg(mem) 17175 return true 17176 } 17177 // match: (Zero [3] destptr mem) 17178 // cond: 17179 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVWstoreconst [0] destptr mem)) 17180 for { 17181 if v.AuxInt != 3 { 17182 break 17183 } 17184 destptr := v.Args[0] 17185 mem := v.Args[1] 17186 v.reset(Op386MOVBstoreconst) 17187 v.AuxInt = makeValAndOff(0, 2) 17188 v.AddArg(destptr) 17189 v0 := b.NewValue0(v.Pos, Op386MOVWstoreconst, TypeMem) 17190 v0.AuxInt = 0 17191 v0.AddArg(destptr) 17192 v0.AddArg(mem) 17193 v.AddArg(v0) 17194 return true 17195 } 17196 // match: (Zero [5] destptr mem) 17197 // cond: 17198 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 17199 for { 17200 if v.AuxInt != 5 { 17201 break 17202 } 17203 destptr := v.Args[0] 17204 mem := v.Args[1] 17205 v.reset(Op386MOVBstoreconst) 17206 v.AuxInt = makeValAndOff(0, 4) 17207 v.AddArg(destptr) 17208 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17209 v0.AuxInt = 0 17210 v0.AddArg(destptr) 17211 v0.AddArg(mem) 17212 v.AddArg(v0) 17213 return true 17214 } 17215 // match: (Zero [6] destptr mem) 17216 // cond: 17217 // result: (MOVWstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 17218 for { 17219 if v.AuxInt != 6 { 17220 break 17221 } 17222 destptr := v.Args[0] 17223 mem := v.Args[1] 17224 v.reset(Op386MOVWstoreconst) 17225 v.AuxInt = makeValAndOff(0, 4) 17226 v.AddArg(destptr) 17227 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17228 v0.AuxInt = 0 17229 v0.AddArg(destptr) 17230 v0.AddArg(mem) 17231 v.AddArg(v0) 17232 return true 17233 } 17234 // match: (Zero [7] destptr mem) 17235 // cond: 17236 // result: (MOVLstoreconst [makeValAndOff(0,3)] destptr (MOVLstoreconst [0] destptr mem)) 17237 for { 17238 if v.AuxInt != 7 { 17239 break 17240 } 17241 destptr := v.Args[0] 17242 mem := v.Args[1] 17243 v.reset(Op386MOVLstoreconst) 17244 v.AuxInt = makeValAndOff(0, 3) 17245 v.AddArg(destptr) 17246 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17247 v0.AuxInt = 0 17248 v0.AddArg(destptr) 17249 v0.AddArg(mem) 17250 v.AddArg(v0) 17251 return true 17252 } 17253 // match: (Zero [s] destptr mem) 17254 // cond: s%4 != 0 && s > 4 17255 // result: (Zero [s-s%4] (ADDLconst destptr [s%4]) (MOVLstoreconst [0] destptr mem)) 17256 for { 17257 s := v.AuxInt 17258 destptr := v.Args[0] 17259 mem := v.Args[1] 17260 if !(s%4 != 0 && s > 4) { 17261 break 17262 } 17263 v.reset(OpZero) 17264 v.AuxInt = s - s%4 17265 v0 := b.NewValue0(v.Pos, Op386ADDLconst, types.UInt32) 17266 v0.AuxInt = s % 4 17267 v0.AddArg(destptr) 17268 v.AddArg(v0) 17269 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17270 v1.AuxInt = 0 17271 v1.AddArg(destptr) 17272 v1.AddArg(mem) 17273 v.AddArg(v1) 17274 return true 17275 } 17276 // match: (Zero [8] destptr mem) 17277 // cond: 17278 // result: (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 17279 for { 17280 if v.AuxInt != 8 { 17281 break 17282 } 17283 destptr := v.Args[0] 17284 mem := v.Args[1] 17285 v.reset(Op386MOVLstoreconst) 17286 v.AuxInt = makeValAndOff(0, 4) 17287 v.AddArg(destptr) 17288 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17289 v0.AuxInt = 0 17290 v0.AddArg(destptr) 17291 v0.AddArg(mem) 17292 v.AddArg(v0) 17293 return true 17294 } 17295 // match: (Zero [12] destptr mem) 17296 // cond: 17297 // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) 17298 for { 17299 if v.AuxInt != 12 { 17300 break 17301 } 17302 destptr := v.Args[0] 17303 mem := v.Args[1] 17304 v.reset(Op386MOVLstoreconst) 17305 v.AuxInt = makeValAndOff(0, 8) 17306 v.AddArg(destptr) 17307 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17308 v0.AuxInt = makeValAndOff(0, 4) 17309 v0.AddArg(destptr) 17310 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17311 v1.AuxInt = 0 17312 v1.AddArg(destptr) 17313 v1.AddArg(mem) 17314 v0.AddArg(v1) 17315 v.AddArg(v0) 17316 return true 17317 } 17318 // match: (Zero [16] destptr mem) 17319 // cond: 17320 // result: (MOVLstoreconst [makeValAndOff(0,12)] destptr (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)))) 17321 for { 17322 if v.AuxInt != 16 { 17323 break 17324 } 17325 destptr := v.Args[0] 17326 mem := v.Args[1] 17327 v.reset(Op386MOVLstoreconst) 17328 v.AuxInt = makeValAndOff(0, 12) 17329 v.AddArg(destptr) 17330 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17331 v0.AuxInt = makeValAndOff(0, 8) 17332 v0.AddArg(destptr) 17333 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17334 v1.AuxInt = makeValAndOff(0, 4) 17335 v1.AddArg(destptr) 17336 v2 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17337 v2.AuxInt = 0 17338 v2.AddArg(destptr) 17339 v2.AddArg(mem) 17340 v1.AddArg(v2) 17341 v0.AddArg(v1) 17342 v.AddArg(v0) 17343 return true 17344 } 17345 // match: (Zero [s] destptr mem) 17346 // cond: s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 17347 // result: (DUFFZERO [1*(128-s/4)] destptr (MOVLconst [0]) mem) 17348 for { 17349 s := v.AuxInt 17350 destptr := v.Args[0] 17351 mem := v.Args[1] 17352 if !(s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 17353 break 17354 } 17355 v.reset(Op386DUFFZERO) 17356 v.AuxInt = 1 * (128 - s/4) 17357 v.AddArg(destptr) 17358 v0 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 17359 v0.AuxInt = 0 17360 v.AddArg(v0) 17361 v.AddArg(mem) 17362 return true 17363 } 17364 // match: (Zero [s] destptr mem) 17365 // cond: (s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0 17366 // result: (REPSTOSL destptr (MOVLconst [s/4]) (MOVLconst [0]) mem) 17367 for { 17368 s := v.AuxInt 17369 destptr := v.Args[0] 17370 mem := v.Args[1] 17371 if !((s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0) { 17372 break 17373 } 17374 v.reset(Op386REPSTOSL) 17375 v.AddArg(destptr) 17376 v0 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 17377 v0.AuxInt = s / 4 17378 v.AddArg(v0) 17379 v1 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 17380 v1.AuxInt = 0 17381 v.AddArg(v1) 17382 v.AddArg(mem) 17383 return true 17384 } 17385 return false 17386 } 17387 func rewriteValue386_OpZeroExt16to32(v *Value) bool { 17388 // match: (ZeroExt16to32 x) 17389 // cond: 17390 // result: (MOVWLZX x) 17391 for { 17392 x := v.Args[0] 17393 v.reset(Op386MOVWLZX) 17394 v.AddArg(x) 17395 return true 17396 } 17397 } 17398 func rewriteValue386_OpZeroExt8to16(v *Value) bool { 17399 // match: (ZeroExt8to16 x) 17400 // cond: 17401 // result: (MOVBLZX x) 17402 for { 17403 x := v.Args[0] 17404 v.reset(Op386MOVBLZX) 17405 v.AddArg(x) 17406 return true 17407 } 17408 } 17409 func rewriteValue386_OpZeroExt8to32(v *Value) bool { 17410 // match: (ZeroExt8to32 x) 17411 // cond: 17412 // result: (MOVBLZX x) 17413 for { 17414 x := v.Args[0] 17415 v.reset(Op386MOVBLZX) 17416 v.AddArg(x) 17417 return true 17418 } 17419 } 17420 func rewriteValue386_OpZeromask(v *Value) bool { 17421 b := v.Block 17422 _ = b 17423 // match: (Zeromask <t> x) 17424 // cond: 17425 // result: (XORLconst [-1] (SBBLcarrymask <t> (CMPLconst x [1]))) 17426 for { 17427 t := v.Type 17428 x := v.Args[0] 17429 v.reset(Op386XORLconst) 17430 v.AuxInt = -1 17431 v0 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17432 v1 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 17433 v1.AuxInt = 1 17434 v1.AddArg(x) 17435 v0.AddArg(v1) 17436 v.AddArg(v0) 17437 return true 17438 } 17439 } 17440 func rewriteBlock386(b *Block) bool { 17441 config := b.Func.Config 17442 _ = config 17443 fe := b.Func.fe 17444 _ = fe 17445 types := &config.Types 17446 _ = types 17447 switch b.Kind { 17448 case Block386EQ: 17449 // match: (EQ (InvertFlags cmp) yes no) 17450 // cond: 17451 // result: (EQ cmp yes no) 17452 for { 17453 v := b.Control 17454 if v.Op != Op386InvertFlags { 17455 break 17456 } 17457 cmp := v.Args[0] 17458 yes := b.Succs[0] 17459 no := b.Succs[1] 17460 b.Kind = Block386EQ 17461 b.SetControl(cmp) 17462 _ = yes 17463 _ = no 17464 return true 17465 } 17466 // match: (EQ (FlagEQ) yes no) 17467 // cond: 17468 // result: (First nil yes no) 17469 for { 17470 v := b.Control 17471 if v.Op != Op386FlagEQ { 17472 break 17473 } 17474 yes := b.Succs[0] 17475 no := b.Succs[1] 17476 b.Kind = BlockFirst 17477 b.SetControl(nil) 17478 _ = yes 17479 _ = no 17480 return true 17481 } 17482 // match: (EQ (FlagLT_ULT) yes no) 17483 // cond: 17484 // result: (First nil no yes) 17485 for { 17486 v := b.Control 17487 if v.Op != Op386FlagLT_ULT { 17488 break 17489 } 17490 yes := b.Succs[0] 17491 no := b.Succs[1] 17492 b.Kind = BlockFirst 17493 b.SetControl(nil) 17494 b.swapSuccessors() 17495 _ = no 17496 _ = yes 17497 return true 17498 } 17499 // match: (EQ (FlagLT_UGT) yes no) 17500 // cond: 17501 // result: (First nil no yes) 17502 for { 17503 v := b.Control 17504 if v.Op != Op386FlagLT_UGT { 17505 break 17506 } 17507 yes := b.Succs[0] 17508 no := b.Succs[1] 17509 b.Kind = BlockFirst 17510 b.SetControl(nil) 17511 b.swapSuccessors() 17512 _ = no 17513 _ = yes 17514 return true 17515 } 17516 // match: (EQ (FlagGT_ULT) yes no) 17517 // cond: 17518 // result: (First nil no yes) 17519 for { 17520 v := b.Control 17521 if v.Op != Op386FlagGT_ULT { 17522 break 17523 } 17524 yes := b.Succs[0] 17525 no := b.Succs[1] 17526 b.Kind = BlockFirst 17527 b.SetControl(nil) 17528 b.swapSuccessors() 17529 _ = no 17530 _ = yes 17531 return true 17532 } 17533 // match: (EQ (FlagGT_UGT) yes no) 17534 // cond: 17535 // result: (First nil no yes) 17536 for { 17537 v := b.Control 17538 if v.Op != Op386FlagGT_UGT { 17539 break 17540 } 17541 yes := b.Succs[0] 17542 no := b.Succs[1] 17543 b.Kind = BlockFirst 17544 b.SetControl(nil) 17545 b.swapSuccessors() 17546 _ = no 17547 _ = yes 17548 return true 17549 } 17550 case Block386GE: 17551 // match: (GE (InvertFlags cmp) yes no) 17552 // cond: 17553 // result: (LE cmp yes no) 17554 for { 17555 v := b.Control 17556 if v.Op != Op386InvertFlags { 17557 break 17558 } 17559 cmp := v.Args[0] 17560 yes := b.Succs[0] 17561 no := b.Succs[1] 17562 b.Kind = Block386LE 17563 b.SetControl(cmp) 17564 _ = yes 17565 _ = no 17566 return true 17567 } 17568 // match: (GE (FlagEQ) yes no) 17569 // cond: 17570 // result: (First nil yes no) 17571 for { 17572 v := b.Control 17573 if v.Op != Op386FlagEQ { 17574 break 17575 } 17576 yes := b.Succs[0] 17577 no := b.Succs[1] 17578 b.Kind = BlockFirst 17579 b.SetControl(nil) 17580 _ = yes 17581 _ = no 17582 return true 17583 } 17584 // match: (GE (FlagLT_ULT) yes no) 17585 // cond: 17586 // result: (First nil no yes) 17587 for { 17588 v := b.Control 17589 if v.Op != Op386FlagLT_ULT { 17590 break 17591 } 17592 yes := b.Succs[0] 17593 no := b.Succs[1] 17594 b.Kind = BlockFirst 17595 b.SetControl(nil) 17596 b.swapSuccessors() 17597 _ = no 17598 _ = yes 17599 return true 17600 } 17601 // match: (GE (FlagLT_UGT) yes no) 17602 // cond: 17603 // result: (First nil no yes) 17604 for { 17605 v := b.Control 17606 if v.Op != Op386FlagLT_UGT { 17607 break 17608 } 17609 yes := b.Succs[0] 17610 no := b.Succs[1] 17611 b.Kind = BlockFirst 17612 b.SetControl(nil) 17613 b.swapSuccessors() 17614 _ = no 17615 _ = yes 17616 return true 17617 } 17618 // match: (GE (FlagGT_ULT) yes no) 17619 // cond: 17620 // result: (First nil yes no) 17621 for { 17622 v := b.Control 17623 if v.Op != Op386FlagGT_ULT { 17624 break 17625 } 17626 yes := b.Succs[0] 17627 no := b.Succs[1] 17628 b.Kind = BlockFirst 17629 b.SetControl(nil) 17630 _ = yes 17631 _ = no 17632 return true 17633 } 17634 // match: (GE (FlagGT_UGT) yes no) 17635 // cond: 17636 // result: (First nil yes no) 17637 for { 17638 v := b.Control 17639 if v.Op != Op386FlagGT_UGT { 17640 break 17641 } 17642 yes := b.Succs[0] 17643 no := b.Succs[1] 17644 b.Kind = BlockFirst 17645 b.SetControl(nil) 17646 _ = yes 17647 _ = no 17648 return true 17649 } 17650 case Block386GT: 17651 // match: (GT (InvertFlags cmp) yes no) 17652 // cond: 17653 // result: (LT cmp yes no) 17654 for { 17655 v := b.Control 17656 if v.Op != Op386InvertFlags { 17657 break 17658 } 17659 cmp := v.Args[0] 17660 yes := b.Succs[0] 17661 no := b.Succs[1] 17662 b.Kind = Block386LT 17663 b.SetControl(cmp) 17664 _ = yes 17665 _ = no 17666 return true 17667 } 17668 // match: (GT (FlagEQ) yes no) 17669 // cond: 17670 // result: (First nil no yes) 17671 for { 17672 v := b.Control 17673 if v.Op != Op386FlagEQ { 17674 break 17675 } 17676 yes := b.Succs[0] 17677 no := b.Succs[1] 17678 b.Kind = BlockFirst 17679 b.SetControl(nil) 17680 b.swapSuccessors() 17681 _ = no 17682 _ = yes 17683 return true 17684 } 17685 // match: (GT (FlagLT_ULT) yes no) 17686 // cond: 17687 // result: (First nil no yes) 17688 for { 17689 v := b.Control 17690 if v.Op != Op386FlagLT_ULT { 17691 break 17692 } 17693 yes := b.Succs[0] 17694 no := b.Succs[1] 17695 b.Kind = BlockFirst 17696 b.SetControl(nil) 17697 b.swapSuccessors() 17698 _ = no 17699 _ = yes 17700 return true 17701 } 17702 // match: (GT (FlagLT_UGT) yes no) 17703 // cond: 17704 // result: (First nil no yes) 17705 for { 17706 v := b.Control 17707 if v.Op != Op386FlagLT_UGT { 17708 break 17709 } 17710 yes := b.Succs[0] 17711 no := b.Succs[1] 17712 b.Kind = BlockFirst 17713 b.SetControl(nil) 17714 b.swapSuccessors() 17715 _ = no 17716 _ = yes 17717 return true 17718 } 17719 // match: (GT (FlagGT_ULT) yes no) 17720 // cond: 17721 // result: (First nil yes no) 17722 for { 17723 v := b.Control 17724 if v.Op != Op386FlagGT_ULT { 17725 break 17726 } 17727 yes := b.Succs[0] 17728 no := b.Succs[1] 17729 b.Kind = BlockFirst 17730 b.SetControl(nil) 17731 _ = yes 17732 _ = no 17733 return true 17734 } 17735 // match: (GT (FlagGT_UGT) yes no) 17736 // cond: 17737 // result: (First nil yes no) 17738 for { 17739 v := b.Control 17740 if v.Op != Op386FlagGT_UGT { 17741 break 17742 } 17743 yes := b.Succs[0] 17744 no := b.Succs[1] 17745 b.Kind = BlockFirst 17746 b.SetControl(nil) 17747 _ = yes 17748 _ = no 17749 return true 17750 } 17751 case BlockIf: 17752 // match: (If (SETL cmp) yes no) 17753 // cond: 17754 // result: (LT cmp yes no) 17755 for { 17756 v := b.Control 17757 if v.Op != Op386SETL { 17758 break 17759 } 17760 cmp := v.Args[0] 17761 yes := b.Succs[0] 17762 no := b.Succs[1] 17763 b.Kind = Block386LT 17764 b.SetControl(cmp) 17765 _ = yes 17766 _ = no 17767 return true 17768 } 17769 // match: (If (SETLE cmp) yes no) 17770 // cond: 17771 // result: (LE cmp yes no) 17772 for { 17773 v := b.Control 17774 if v.Op != Op386SETLE { 17775 break 17776 } 17777 cmp := v.Args[0] 17778 yes := b.Succs[0] 17779 no := b.Succs[1] 17780 b.Kind = Block386LE 17781 b.SetControl(cmp) 17782 _ = yes 17783 _ = no 17784 return true 17785 } 17786 // match: (If (SETG cmp) yes no) 17787 // cond: 17788 // result: (GT cmp yes no) 17789 for { 17790 v := b.Control 17791 if v.Op != Op386SETG { 17792 break 17793 } 17794 cmp := v.Args[0] 17795 yes := b.Succs[0] 17796 no := b.Succs[1] 17797 b.Kind = Block386GT 17798 b.SetControl(cmp) 17799 _ = yes 17800 _ = no 17801 return true 17802 } 17803 // match: (If (SETGE cmp) yes no) 17804 // cond: 17805 // result: (GE cmp yes no) 17806 for { 17807 v := b.Control 17808 if v.Op != Op386SETGE { 17809 break 17810 } 17811 cmp := v.Args[0] 17812 yes := b.Succs[0] 17813 no := b.Succs[1] 17814 b.Kind = Block386GE 17815 b.SetControl(cmp) 17816 _ = yes 17817 _ = no 17818 return true 17819 } 17820 // match: (If (SETEQ cmp) yes no) 17821 // cond: 17822 // result: (EQ cmp yes no) 17823 for { 17824 v := b.Control 17825 if v.Op != Op386SETEQ { 17826 break 17827 } 17828 cmp := v.Args[0] 17829 yes := b.Succs[0] 17830 no := b.Succs[1] 17831 b.Kind = Block386EQ 17832 b.SetControl(cmp) 17833 _ = yes 17834 _ = no 17835 return true 17836 } 17837 // match: (If (SETNE cmp) yes no) 17838 // cond: 17839 // result: (NE cmp yes no) 17840 for { 17841 v := b.Control 17842 if v.Op != Op386SETNE { 17843 break 17844 } 17845 cmp := v.Args[0] 17846 yes := b.Succs[0] 17847 no := b.Succs[1] 17848 b.Kind = Block386NE 17849 b.SetControl(cmp) 17850 _ = yes 17851 _ = no 17852 return true 17853 } 17854 // match: (If (SETB cmp) yes no) 17855 // cond: 17856 // result: (ULT cmp yes no) 17857 for { 17858 v := b.Control 17859 if v.Op != Op386SETB { 17860 break 17861 } 17862 cmp := v.Args[0] 17863 yes := b.Succs[0] 17864 no := b.Succs[1] 17865 b.Kind = Block386ULT 17866 b.SetControl(cmp) 17867 _ = yes 17868 _ = no 17869 return true 17870 } 17871 // match: (If (SETBE cmp) yes no) 17872 // cond: 17873 // result: (ULE cmp yes no) 17874 for { 17875 v := b.Control 17876 if v.Op != Op386SETBE { 17877 break 17878 } 17879 cmp := v.Args[0] 17880 yes := b.Succs[0] 17881 no := b.Succs[1] 17882 b.Kind = Block386ULE 17883 b.SetControl(cmp) 17884 _ = yes 17885 _ = no 17886 return true 17887 } 17888 // match: (If (SETA cmp) yes no) 17889 // cond: 17890 // result: (UGT cmp yes no) 17891 for { 17892 v := b.Control 17893 if v.Op != Op386SETA { 17894 break 17895 } 17896 cmp := v.Args[0] 17897 yes := b.Succs[0] 17898 no := b.Succs[1] 17899 b.Kind = Block386UGT 17900 b.SetControl(cmp) 17901 _ = yes 17902 _ = no 17903 return true 17904 } 17905 // match: (If (SETAE cmp) yes no) 17906 // cond: 17907 // result: (UGE cmp yes no) 17908 for { 17909 v := b.Control 17910 if v.Op != Op386SETAE { 17911 break 17912 } 17913 cmp := v.Args[0] 17914 yes := b.Succs[0] 17915 no := b.Succs[1] 17916 b.Kind = Block386UGE 17917 b.SetControl(cmp) 17918 _ = yes 17919 _ = no 17920 return true 17921 } 17922 // match: (If (SETGF cmp) yes no) 17923 // cond: 17924 // result: (UGT cmp yes no) 17925 for { 17926 v := b.Control 17927 if v.Op != Op386SETGF { 17928 break 17929 } 17930 cmp := v.Args[0] 17931 yes := b.Succs[0] 17932 no := b.Succs[1] 17933 b.Kind = Block386UGT 17934 b.SetControl(cmp) 17935 _ = yes 17936 _ = no 17937 return true 17938 } 17939 // match: (If (SETGEF cmp) yes no) 17940 // cond: 17941 // result: (UGE cmp yes no) 17942 for { 17943 v := b.Control 17944 if v.Op != Op386SETGEF { 17945 break 17946 } 17947 cmp := v.Args[0] 17948 yes := b.Succs[0] 17949 no := b.Succs[1] 17950 b.Kind = Block386UGE 17951 b.SetControl(cmp) 17952 _ = yes 17953 _ = no 17954 return true 17955 } 17956 // match: (If (SETEQF cmp) yes no) 17957 // cond: 17958 // result: (EQF cmp yes no) 17959 for { 17960 v := b.Control 17961 if v.Op != Op386SETEQF { 17962 break 17963 } 17964 cmp := v.Args[0] 17965 yes := b.Succs[0] 17966 no := b.Succs[1] 17967 b.Kind = Block386EQF 17968 b.SetControl(cmp) 17969 _ = yes 17970 _ = no 17971 return true 17972 } 17973 // match: (If (SETNEF cmp) yes no) 17974 // cond: 17975 // result: (NEF cmp yes no) 17976 for { 17977 v := b.Control 17978 if v.Op != Op386SETNEF { 17979 break 17980 } 17981 cmp := v.Args[0] 17982 yes := b.Succs[0] 17983 no := b.Succs[1] 17984 b.Kind = Block386NEF 17985 b.SetControl(cmp) 17986 _ = yes 17987 _ = no 17988 return true 17989 } 17990 // match: (If cond yes no) 17991 // cond: 17992 // result: (NE (TESTB cond cond) yes no) 17993 for { 17994 v := b.Control 17995 _ = v 17996 cond := b.Control 17997 yes := b.Succs[0] 17998 no := b.Succs[1] 17999 b.Kind = Block386NE 18000 v0 := b.NewValue0(v.Pos, Op386TESTB, TypeFlags) 18001 v0.AddArg(cond) 18002 v0.AddArg(cond) 18003 b.SetControl(v0) 18004 _ = yes 18005 _ = no 18006 return true 18007 } 18008 case Block386LE: 18009 // match: (LE (InvertFlags cmp) yes no) 18010 // cond: 18011 // result: (GE cmp yes no) 18012 for { 18013 v := b.Control 18014 if v.Op != Op386InvertFlags { 18015 break 18016 } 18017 cmp := v.Args[0] 18018 yes := b.Succs[0] 18019 no := b.Succs[1] 18020 b.Kind = Block386GE 18021 b.SetControl(cmp) 18022 _ = yes 18023 _ = no 18024 return true 18025 } 18026 // match: (LE (FlagEQ) yes no) 18027 // cond: 18028 // result: (First nil yes no) 18029 for { 18030 v := b.Control 18031 if v.Op != Op386FlagEQ { 18032 break 18033 } 18034 yes := b.Succs[0] 18035 no := b.Succs[1] 18036 b.Kind = BlockFirst 18037 b.SetControl(nil) 18038 _ = yes 18039 _ = no 18040 return true 18041 } 18042 // match: (LE (FlagLT_ULT) yes no) 18043 // cond: 18044 // result: (First nil yes no) 18045 for { 18046 v := b.Control 18047 if v.Op != Op386FlagLT_ULT { 18048 break 18049 } 18050 yes := b.Succs[0] 18051 no := b.Succs[1] 18052 b.Kind = BlockFirst 18053 b.SetControl(nil) 18054 _ = yes 18055 _ = no 18056 return true 18057 } 18058 // match: (LE (FlagLT_UGT) yes no) 18059 // cond: 18060 // result: (First nil yes no) 18061 for { 18062 v := b.Control 18063 if v.Op != Op386FlagLT_UGT { 18064 break 18065 } 18066 yes := b.Succs[0] 18067 no := b.Succs[1] 18068 b.Kind = BlockFirst 18069 b.SetControl(nil) 18070 _ = yes 18071 _ = no 18072 return true 18073 } 18074 // match: (LE (FlagGT_ULT) yes no) 18075 // cond: 18076 // result: (First nil no yes) 18077 for { 18078 v := b.Control 18079 if v.Op != Op386FlagGT_ULT { 18080 break 18081 } 18082 yes := b.Succs[0] 18083 no := b.Succs[1] 18084 b.Kind = BlockFirst 18085 b.SetControl(nil) 18086 b.swapSuccessors() 18087 _ = no 18088 _ = yes 18089 return true 18090 } 18091 // match: (LE (FlagGT_UGT) yes no) 18092 // cond: 18093 // result: (First nil no yes) 18094 for { 18095 v := b.Control 18096 if v.Op != Op386FlagGT_UGT { 18097 break 18098 } 18099 yes := b.Succs[0] 18100 no := b.Succs[1] 18101 b.Kind = BlockFirst 18102 b.SetControl(nil) 18103 b.swapSuccessors() 18104 _ = no 18105 _ = yes 18106 return true 18107 } 18108 case Block386LT: 18109 // match: (LT (InvertFlags cmp) yes no) 18110 // cond: 18111 // result: (GT cmp yes no) 18112 for { 18113 v := b.Control 18114 if v.Op != Op386InvertFlags { 18115 break 18116 } 18117 cmp := v.Args[0] 18118 yes := b.Succs[0] 18119 no := b.Succs[1] 18120 b.Kind = Block386GT 18121 b.SetControl(cmp) 18122 _ = yes 18123 _ = no 18124 return true 18125 } 18126 // match: (LT (FlagEQ) yes no) 18127 // cond: 18128 // result: (First nil no yes) 18129 for { 18130 v := b.Control 18131 if v.Op != Op386FlagEQ { 18132 break 18133 } 18134 yes := b.Succs[0] 18135 no := b.Succs[1] 18136 b.Kind = BlockFirst 18137 b.SetControl(nil) 18138 b.swapSuccessors() 18139 _ = no 18140 _ = yes 18141 return true 18142 } 18143 // match: (LT (FlagLT_ULT) yes no) 18144 // cond: 18145 // result: (First nil yes no) 18146 for { 18147 v := b.Control 18148 if v.Op != Op386FlagLT_ULT { 18149 break 18150 } 18151 yes := b.Succs[0] 18152 no := b.Succs[1] 18153 b.Kind = BlockFirst 18154 b.SetControl(nil) 18155 _ = yes 18156 _ = no 18157 return true 18158 } 18159 // match: (LT (FlagLT_UGT) yes no) 18160 // cond: 18161 // result: (First nil yes no) 18162 for { 18163 v := b.Control 18164 if v.Op != Op386FlagLT_UGT { 18165 break 18166 } 18167 yes := b.Succs[0] 18168 no := b.Succs[1] 18169 b.Kind = BlockFirst 18170 b.SetControl(nil) 18171 _ = yes 18172 _ = no 18173 return true 18174 } 18175 // match: (LT (FlagGT_ULT) yes no) 18176 // cond: 18177 // result: (First nil no yes) 18178 for { 18179 v := b.Control 18180 if v.Op != Op386FlagGT_ULT { 18181 break 18182 } 18183 yes := b.Succs[0] 18184 no := b.Succs[1] 18185 b.Kind = BlockFirst 18186 b.SetControl(nil) 18187 b.swapSuccessors() 18188 _ = no 18189 _ = yes 18190 return true 18191 } 18192 // match: (LT (FlagGT_UGT) yes no) 18193 // cond: 18194 // result: (First nil no yes) 18195 for { 18196 v := b.Control 18197 if v.Op != Op386FlagGT_UGT { 18198 break 18199 } 18200 yes := b.Succs[0] 18201 no := b.Succs[1] 18202 b.Kind = BlockFirst 18203 b.SetControl(nil) 18204 b.swapSuccessors() 18205 _ = no 18206 _ = yes 18207 return true 18208 } 18209 case Block386NE: 18210 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18211 // cond: 18212 // result: (LT cmp yes no) 18213 for { 18214 v := b.Control 18215 if v.Op != Op386TESTB { 18216 break 18217 } 18218 v_0 := v.Args[0] 18219 if v_0.Op != Op386SETL { 18220 break 18221 } 18222 cmp := v_0.Args[0] 18223 v_1 := v.Args[1] 18224 if v_1.Op != Op386SETL { 18225 break 18226 } 18227 if cmp != v_1.Args[0] { 18228 break 18229 } 18230 yes := b.Succs[0] 18231 no := b.Succs[1] 18232 b.Kind = Block386LT 18233 b.SetControl(cmp) 18234 _ = yes 18235 _ = no 18236 return true 18237 } 18238 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18239 // cond: 18240 // result: (LT cmp yes no) 18241 for { 18242 v := b.Control 18243 if v.Op != Op386TESTB { 18244 break 18245 } 18246 v_0 := v.Args[0] 18247 if v_0.Op != Op386SETL { 18248 break 18249 } 18250 cmp := v_0.Args[0] 18251 v_1 := v.Args[1] 18252 if v_1.Op != Op386SETL { 18253 break 18254 } 18255 if cmp != v_1.Args[0] { 18256 break 18257 } 18258 yes := b.Succs[0] 18259 no := b.Succs[1] 18260 b.Kind = Block386LT 18261 b.SetControl(cmp) 18262 _ = yes 18263 _ = no 18264 return true 18265 } 18266 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 18267 // cond: 18268 // result: (LE cmp yes no) 18269 for { 18270 v := b.Control 18271 if v.Op != Op386TESTB { 18272 break 18273 } 18274 v_0 := v.Args[0] 18275 if v_0.Op != Op386SETLE { 18276 break 18277 } 18278 cmp := v_0.Args[0] 18279 v_1 := v.Args[1] 18280 if v_1.Op != Op386SETLE { 18281 break 18282 } 18283 if cmp != v_1.Args[0] { 18284 break 18285 } 18286 yes := b.Succs[0] 18287 no := b.Succs[1] 18288 b.Kind = Block386LE 18289 b.SetControl(cmp) 18290 _ = yes 18291 _ = no 18292 return true 18293 } 18294 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 18295 // cond: 18296 // result: (LE cmp yes no) 18297 for { 18298 v := b.Control 18299 if v.Op != Op386TESTB { 18300 break 18301 } 18302 v_0 := v.Args[0] 18303 if v_0.Op != Op386SETLE { 18304 break 18305 } 18306 cmp := v_0.Args[0] 18307 v_1 := v.Args[1] 18308 if v_1.Op != Op386SETLE { 18309 break 18310 } 18311 if cmp != v_1.Args[0] { 18312 break 18313 } 18314 yes := b.Succs[0] 18315 no := b.Succs[1] 18316 b.Kind = Block386LE 18317 b.SetControl(cmp) 18318 _ = yes 18319 _ = no 18320 return true 18321 } 18322 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 18323 // cond: 18324 // result: (GT cmp yes no) 18325 for { 18326 v := b.Control 18327 if v.Op != Op386TESTB { 18328 break 18329 } 18330 v_0 := v.Args[0] 18331 if v_0.Op != Op386SETG { 18332 break 18333 } 18334 cmp := v_0.Args[0] 18335 v_1 := v.Args[1] 18336 if v_1.Op != Op386SETG { 18337 break 18338 } 18339 if cmp != v_1.Args[0] { 18340 break 18341 } 18342 yes := b.Succs[0] 18343 no := b.Succs[1] 18344 b.Kind = Block386GT 18345 b.SetControl(cmp) 18346 _ = yes 18347 _ = no 18348 return true 18349 } 18350 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 18351 // cond: 18352 // result: (GT cmp yes no) 18353 for { 18354 v := b.Control 18355 if v.Op != Op386TESTB { 18356 break 18357 } 18358 v_0 := v.Args[0] 18359 if v_0.Op != Op386SETG { 18360 break 18361 } 18362 cmp := v_0.Args[0] 18363 v_1 := v.Args[1] 18364 if v_1.Op != Op386SETG { 18365 break 18366 } 18367 if cmp != v_1.Args[0] { 18368 break 18369 } 18370 yes := b.Succs[0] 18371 no := b.Succs[1] 18372 b.Kind = Block386GT 18373 b.SetControl(cmp) 18374 _ = yes 18375 _ = no 18376 return true 18377 } 18378 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 18379 // cond: 18380 // result: (GE cmp yes no) 18381 for { 18382 v := b.Control 18383 if v.Op != Op386TESTB { 18384 break 18385 } 18386 v_0 := v.Args[0] 18387 if v_0.Op != Op386SETGE { 18388 break 18389 } 18390 cmp := v_0.Args[0] 18391 v_1 := v.Args[1] 18392 if v_1.Op != Op386SETGE { 18393 break 18394 } 18395 if cmp != v_1.Args[0] { 18396 break 18397 } 18398 yes := b.Succs[0] 18399 no := b.Succs[1] 18400 b.Kind = Block386GE 18401 b.SetControl(cmp) 18402 _ = yes 18403 _ = no 18404 return true 18405 } 18406 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 18407 // cond: 18408 // result: (GE cmp yes no) 18409 for { 18410 v := b.Control 18411 if v.Op != Op386TESTB { 18412 break 18413 } 18414 v_0 := v.Args[0] 18415 if v_0.Op != Op386SETGE { 18416 break 18417 } 18418 cmp := v_0.Args[0] 18419 v_1 := v.Args[1] 18420 if v_1.Op != Op386SETGE { 18421 break 18422 } 18423 if cmp != v_1.Args[0] { 18424 break 18425 } 18426 yes := b.Succs[0] 18427 no := b.Succs[1] 18428 b.Kind = Block386GE 18429 b.SetControl(cmp) 18430 _ = yes 18431 _ = no 18432 return true 18433 } 18434 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 18435 // cond: 18436 // result: (EQ cmp yes no) 18437 for { 18438 v := b.Control 18439 if v.Op != Op386TESTB { 18440 break 18441 } 18442 v_0 := v.Args[0] 18443 if v_0.Op != Op386SETEQ { 18444 break 18445 } 18446 cmp := v_0.Args[0] 18447 v_1 := v.Args[1] 18448 if v_1.Op != Op386SETEQ { 18449 break 18450 } 18451 if cmp != v_1.Args[0] { 18452 break 18453 } 18454 yes := b.Succs[0] 18455 no := b.Succs[1] 18456 b.Kind = Block386EQ 18457 b.SetControl(cmp) 18458 _ = yes 18459 _ = no 18460 return true 18461 } 18462 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 18463 // cond: 18464 // result: (EQ cmp yes no) 18465 for { 18466 v := b.Control 18467 if v.Op != Op386TESTB { 18468 break 18469 } 18470 v_0 := v.Args[0] 18471 if v_0.Op != Op386SETEQ { 18472 break 18473 } 18474 cmp := v_0.Args[0] 18475 v_1 := v.Args[1] 18476 if v_1.Op != Op386SETEQ { 18477 break 18478 } 18479 if cmp != v_1.Args[0] { 18480 break 18481 } 18482 yes := b.Succs[0] 18483 no := b.Succs[1] 18484 b.Kind = Block386EQ 18485 b.SetControl(cmp) 18486 _ = yes 18487 _ = no 18488 return true 18489 } 18490 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 18491 // cond: 18492 // result: (NE cmp yes no) 18493 for { 18494 v := b.Control 18495 if v.Op != Op386TESTB { 18496 break 18497 } 18498 v_0 := v.Args[0] 18499 if v_0.Op != Op386SETNE { 18500 break 18501 } 18502 cmp := v_0.Args[0] 18503 v_1 := v.Args[1] 18504 if v_1.Op != Op386SETNE { 18505 break 18506 } 18507 if cmp != v_1.Args[0] { 18508 break 18509 } 18510 yes := b.Succs[0] 18511 no := b.Succs[1] 18512 b.Kind = Block386NE 18513 b.SetControl(cmp) 18514 _ = yes 18515 _ = no 18516 return true 18517 } 18518 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 18519 // cond: 18520 // result: (NE cmp yes no) 18521 for { 18522 v := b.Control 18523 if v.Op != Op386TESTB { 18524 break 18525 } 18526 v_0 := v.Args[0] 18527 if v_0.Op != Op386SETNE { 18528 break 18529 } 18530 cmp := v_0.Args[0] 18531 v_1 := v.Args[1] 18532 if v_1.Op != Op386SETNE { 18533 break 18534 } 18535 if cmp != v_1.Args[0] { 18536 break 18537 } 18538 yes := b.Succs[0] 18539 no := b.Succs[1] 18540 b.Kind = Block386NE 18541 b.SetControl(cmp) 18542 _ = yes 18543 _ = no 18544 return true 18545 } 18546 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 18547 // cond: 18548 // result: (ULT cmp yes no) 18549 for { 18550 v := b.Control 18551 if v.Op != Op386TESTB { 18552 break 18553 } 18554 v_0 := v.Args[0] 18555 if v_0.Op != Op386SETB { 18556 break 18557 } 18558 cmp := v_0.Args[0] 18559 v_1 := v.Args[1] 18560 if v_1.Op != Op386SETB { 18561 break 18562 } 18563 if cmp != v_1.Args[0] { 18564 break 18565 } 18566 yes := b.Succs[0] 18567 no := b.Succs[1] 18568 b.Kind = Block386ULT 18569 b.SetControl(cmp) 18570 _ = yes 18571 _ = no 18572 return true 18573 } 18574 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 18575 // cond: 18576 // result: (ULT cmp yes no) 18577 for { 18578 v := b.Control 18579 if v.Op != Op386TESTB { 18580 break 18581 } 18582 v_0 := v.Args[0] 18583 if v_0.Op != Op386SETB { 18584 break 18585 } 18586 cmp := v_0.Args[0] 18587 v_1 := v.Args[1] 18588 if v_1.Op != Op386SETB { 18589 break 18590 } 18591 if cmp != v_1.Args[0] { 18592 break 18593 } 18594 yes := b.Succs[0] 18595 no := b.Succs[1] 18596 b.Kind = Block386ULT 18597 b.SetControl(cmp) 18598 _ = yes 18599 _ = no 18600 return true 18601 } 18602 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 18603 // cond: 18604 // result: (ULE cmp yes no) 18605 for { 18606 v := b.Control 18607 if v.Op != Op386TESTB { 18608 break 18609 } 18610 v_0 := v.Args[0] 18611 if v_0.Op != Op386SETBE { 18612 break 18613 } 18614 cmp := v_0.Args[0] 18615 v_1 := v.Args[1] 18616 if v_1.Op != Op386SETBE { 18617 break 18618 } 18619 if cmp != v_1.Args[0] { 18620 break 18621 } 18622 yes := b.Succs[0] 18623 no := b.Succs[1] 18624 b.Kind = Block386ULE 18625 b.SetControl(cmp) 18626 _ = yes 18627 _ = no 18628 return true 18629 } 18630 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 18631 // cond: 18632 // result: (ULE cmp yes no) 18633 for { 18634 v := b.Control 18635 if v.Op != Op386TESTB { 18636 break 18637 } 18638 v_0 := v.Args[0] 18639 if v_0.Op != Op386SETBE { 18640 break 18641 } 18642 cmp := v_0.Args[0] 18643 v_1 := v.Args[1] 18644 if v_1.Op != Op386SETBE { 18645 break 18646 } 18647 if cmp != v_1.Args[0] { 18648 break 18649 } 18650 yes := b.Succs[0] 18651 no := b.Succs[1] 18652 b.Kind = Block386ULE 18653 b.SetControl(cmp) 18654 _ = yes 18655 _ = no 18656 return true 18657 } 18658 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 18659 // cond: 18660 // result: (UGT cmp yes no) 18661 for { 18662 v := b.Control 18663 if v.Op != Op386TESTB { 18664 break 18665 } 18666 v_0 := v.Args[0] 18667 if v_0.Op != Op386SETA { 18668 break 18669 } 18670 cmp := v_0.Args[0] 18671 v_1 := v.Args[1] 18672 if v_1.Op != Op386SETA { 18673 break 18674 } 18675 if cmp != v_1.Args[0] { 18676 break 18677 } 18678 yes := b.Succs[0] 18679 no := b.Succs[1] 18680 b.Kind = Block386UGT 18681 b.SetControl(cmp) 18682 _ = yes 18683 _ = no 18684 return true 18685 } 18686 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 18687 // cond: 18688 // result: (UGT cmp yes no) 18689 for { 18690 v := b.Control 18691 if v.Op != Op386TESTB { 18692 break 18693 } 18694 v_0 := v.Args[0] 18695 if v_0.Op != Op386SETA { 18696 break 18697 } 18698 cmp := v_0.Args[0] 18699 v_1 := v.Args[1] 18700 if v_1.Op != Op386SETA { 18701 break 18702 } 18703 if cmp != v_1.Args[0] { 18704 break 18705 } 18706 yes := b.Succs[0] 18707 no := b.Succs[1] 18708 b.Kind = Block386UGT 18709 b.SetControl(cmp) 18710 _ = yes 18711 _ = no 18712 return true 18713 } 18714 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 18715 // cond: 18716 // result: (UGE cmp yes no) 18717 for { 18718 v := b.Control 18719 if v.Op != Op386TESTB { 18720 break 18721 } 18722 v_0 := v.Args[0] 18723 if v_0.Op != Op386SETAE { 18724 break 18725 } 18726 cmp := v_0.Args[0] 18727 v_1 := v.Args[1] 18728 if v_1.Op != Op386SETAE { 18729 break 18730 } 18731 if cmp != v_1.Args[0] { 18732 break 18733 } 18734 yes := b.Succs[0] 18735 no := b.Succs[1] 18736 b.Kind = Block386UGE 18737 b.SetControl(cmp) 18738 _ = yes 18739 _ = no 18740 return true 18741 } 18742 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 18743 // cond: 18744 // result: (UGE cmp yes no) 18745 for { 18746 v := b.Control 18747 if v.Op != Op386TESTB { 18748 break 18749 } 18750 v_0 := v.Args[0] 18751 if v_0.Op != Op386SETAE { 18752 break 18753 } 18754 cmp := v_0.Args[0] 18755 v_1 := v.Args[1] 18756 if v_1.Op != Op386SETAE { 18757 break 18758 } 18759 if cmp != v_1.Args[0] { 18760 break 18761 } 18762 yes := b.Succs[0] 18763 no := b.Succs[1] 18764 b.Kind = Block386UGE 18765 b.SetControl(cmp) 18766 _ = yes 18767 _ = no 18768 return true 18769 } 18770 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 18771 // cond: 18772 // result: (UGT cmp yes no) 18773 for { 18774 v := b.Control 18775 if v.Op != Op386TESTB { 18776 break 18777 } 18778 v_0 := v.Args[0] 18779 if v_0.Op != Op386SETGF { 18780 break 18781 } 18782 cmp := v_0.Args[0] 18783 v_1 := v.Args[1] 18784 if v_1.Op != Op386SETGF { 18785 break 18786 } 18787 if cmp != v_1.Args[0] { 18788 break 18789 } 18790 yes := b.Succs[0] 18791 no := b.Succs[1] 18792 b.Kind = Block386UGT 18793 b.SetControl(cmp) 18794 _ = yes 18795 _ = no 18796 return true 18797 } 18798 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 18799 // cond: 18800 // result: (UGT cmp yes no) 18801 for { 18802 v := b.Control 18803 if v.Op != Op386TESTB { 18804 break 18805 } 18806 v_0 := v.Args[0] 18807 if v_0.Op != Op386SETGF { 18808 break 18809 } 18810 cmp := v_0.Args[0] 18811 v_1 := v.Args[1] 18812 if v_1.Op != Op386SETGF { 18813 break 18814 } 18815 if cmp != v_1.Args[0] { 18816 break 18817 } 18818 yes := b.Succs[0] 18819 no := b.Succs[1] 18820 b.Kind = Block386UGT 18821 b.SetControl(cmp) 18822 _ = yes 18823 _ = no 18824 return true 18825 } 18826 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 18827 // cond: 18828 // result: (UGE cmp yes no) 18829 for { 18830 v := b.Control 18831 if v.Op != Op386TESTB { 18832 break 18833 } 18834 v_0 := v.Args[0] 18835 if v_0.Op != Op386SETGEF { 18836 break 18837 } 18838 cmp := v_0.Args[0] 18839 v_1 := v.Args[1] 18840 if v_1.Op != Op386SETGEF { 18841 break 18842 } 18843 if cmp != v_1.Args[0] { 18844 break 18845 } 18846 yes := b.Succs[0] 18847 no := b.Succs[1] 18848 b.Kind = Block386UGE 18849 b.SetControl(cmp) 18850 _ = yes 18851 _ = no 18852 return true 18853 } 18854 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 18855 // cond: 18856 // result: (UGE cmp yes no) 18857 for { 18858 v := b.Control 18859 if v.Op != Op386TESTB { 18860 break 18861 } 18862 v_0 := v.Args[0] 18863 if v_0.Op != Op386SETGEF { 18864 break 18865 } 18866 cmp := v_0.Args[0] 18867 v_1 := v.Args[1] 18868 if v_1.Op != Op386SETGEF { 18869 break 18870 } 18871 if cmp != v_1.Args[0] { 18872 break 18873 } 18874 yes := b.Succs[0] 18875 no := b.Succs[1] 18876 b.Kind = Block386UGE 18877 b.SetControl(cmp) 18878 _ = yes 18879 _ = no 18880 return true 18881 } 18882 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 18883 // cond: 18884 // result: (EQF cmp yes no) 18885 for { 18886 v := b.Control 18887 if v.Op != Op386TESTB { 18888 break 18889 } 18890 v_0 := v.Args[0] 18891 if v_0.Op != Op386SETEQF { 18892 break 18893 } 18894 cmp := v_0.Args[0] 18895 v_1 := v.Args[1] 18896 if v_1.Op != Op386SETEQF { 18897 break 18898 } 18899 if cmp != v_1.Args[0] { 18900 break 18901 } 18902 yes := b.Succs[0] 18903 no := b.Succs[1] 18904 b.Kind = Block386EQF 18905 b.SetControl(cmp) 18906 _ = yes 18907 _ = no 18908 return true 18909 } 18910 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 18911 // cond: 18912 // result: (EQF cmp yes no) 18913 for { 18914 v := b.Control 18915 if v.Op != Op386TESTB { 18916 break 18917 } 18918 v_0 := v.Args[0] 18919 if v_0.Op != Op386SETEQF { 18920 break 18921 } 18922 cmp := v_0.Args[0] 18923 v_1 := v.Args[1] 18924 if v_1.Op != Op386SETEQF { 18925 break 18926 } 18927 if cmp != v_1.Args[0] { 18928 break 18929 } 18930 yes := b.Succs[0] 18931 no := b.Succs[1] 18932 b.Kind = Block386EQF 18933 b.SetControl(cmp) 18934 _ = yes 18935 _ = no 18936 return true 18937 } 18938 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 18939 // cond: 18940 // result: (NEF cmp yes no) 18941 for { 18942 v := b.Control 18943 if v.Op != Op386TESTB { 18944 break 18945 } 18946 v_0 := v.Args[0] 18947 if v_0.Op != Op386SETNEF { 18948 break 18949 } 18950 cmp := v_0.Args[0] 18951 v_1 := v.Args[1] 18952 if v_1.Op != Op386SETNEF { 18953 break 18954 } 18955 if cmp != v_1.Args[0] { 18956 break 18957 } 18958 yes := b.Succs[0] 18959 no := b.Succs[1] 18960 b.Kind = Block386NEF 18961 b.SetControl(cmp) 18962 _ = yes 18963 _ = no 18964 return true 18965 } 18966 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 18967 // cond: 18968 // result: (NEF cmp yes no) 18969 for { 18970 v := b.Control 18971 if v.Op != Op386TESTB { 18972 break 18973 } 18974 v_0 := v.Args[0] 18975 if v_0.Op != Op386SETNEF { 18976 break 18977 } 18978 cmp := v_0.Args[0] 18979 v_1 := v.Args[1] 18980 if v_1.Op != Op386SETNEF { 18981 break 18982 } 18983 if cmp != v_1.Args[0] { 18984 break 18985 } 18986 yes := b.Succs[0] 18987 no := b.Succs[1] 18988 b.Kind = Block386NEF 18989 b.SetControl(cmp) 18990 _ = yes 18991 _ = no 18992 return true 18993 } 18994 // match: (NE (InvertFlags cmp) yes no) 18995 // cond: 18996 // result: (NE cmp yes no) 18997 for { 18998 v := b.Control 18999 if v.Op != Op386InvertFlags { 19000 break 19001 } 19002 cmp := v.Args[0] 19003 yes := b.Succs[0] 19004 no := b.Succs[1] 19005 b.Kind = Block386NE 19006 b.SetControl(cmp) 19007 _ = yes 19008 _ = no 19009 return true 19010 } 19011 // match: (NE (FlagEQ) yes no) 19012 // cond: 19013 // result: (First nil no yes) 19014 for { 19015 v := b.Control 19016 if v.Op != Op386FlagEQ { 19017 break 19018 } 19019 yes := b.Succs[0] 19020 no := b.Succs[1] 19021 b.Kind = BlockFirst 19022 b.SetControl(nil) 19023 b.swapSuccessors() 19024 _ = no 19025 _ = yes 19026 return true 19027 } 19028 // match: (NE (FlagLT_ULT) yes no) 19029 // cond: 19030 // result: (First nil yes no) 19031 for { 19032 v := b.Control 19033 if v.Op != Op386FlagLT_ULT { 19034 break 19035 } 19036 yes := b.Succs[0] 19037 no := b.Succs[1] 19038 b.Kind = BlockFirst 19039 b.SetControl(nil) 19040 _ = yes 19041 _ = no 19042 return true 19043 } 19044 // match: (NE (FlagLT_UGT) yes no) 19045 // cond: 19046 // result: (First nil yes no) 19047 for { 19048 v := b.Control 19049 if v.Op != Op386FlagLT_UGT { 19050 break 19051 } 19052 yes := b.Succs[0] 19053 no := b.Succs[1] 19054 b.Kind = BlockFirst 19055 b.SetControl(nil) 19056 _ = yes 19057 _ = no 19058 return true 19059 } 19060 // match: (NE (FlagGT_ULT) yes no) 19061 // cond: 19062 // result: (First nil yes no) 19063 for { 19064 v := b.Control 19065 if v.Op != Op386FlagGT_ULT { 19066 break 19067 } 19068 yes := b.Succs[0] 19069 no := b.Succs[1] 19070 b.Kind = BlockFirst 19071 b.SetControl(nil) 19072 _ = yes 19073 _ = no 19074 return true 19075 } 19076 // match: (NE (FlagGT_UGT) yes no) 19077 // cond: 19078 // result: (First nil yes no) 19079 for { 19080 v := b.Control 19081 if v.Op != Op386FlagGT_UGT { 19082 break 19083 } 19084 yes := b.Succs[0] 19085 no := b.Succs[1] 19086 b.Kind = BlockFirst 19087 b.SetControl(nil) 19088 _ = yes 19089 _ = no 19090 return true 19091 } 19092 case Block386UGE: 19093 // match: (UGE (InvertFlags cmp) yes no) 19094 // cond: 19095 // result: (ULE cmp yes no) 19096 for { 19097 v := b.Control 19098 if v.Op != Op386InvertFlags { 19099 break 19100 } 19101 cmp := v.Args[0] 19102 yes := b.Succs[0] 19103 no := b.Succs[1] 19104 b.Kind = Block386ULE 19105 b.SetControl(cmp) 19106 _ = yes 19107 _ = no 19108 return true 19109 } 19110 // match: (UGE (FlagEQ) yes no) 19111 // cond: 19112 // result: (First nil yes no) 19113 for { 19114 v := b.Control 19115 if v.Op != Op386FlagEQ { 19116 break 19117 } 19118 yes := b.Succs[0] 19119 no := b.Succs[1] 19120 b.Kind = BlockFirst 19121 b.SetControl(nil) 19122 _ = yes 19123 _ = no 19124 return true 19125 } 19126 // match: (UGE (FlagLT_ULT) yes no) 19127 // cond: 19128 // result: (First nil no yes) 19129 for { 19130 v := b.Control 19131 if v.Op != Op386FlagLT_ULT { 19132 break 19133 } 19134 yes := b.Succs[0] 19135 no := b.Succs[1] 19136 b.Kind = BlockFirst 19137 b.SetControl(nil) 19138 b.swapSuccessors() 19139 _ = no 19140 _ = yes 19141 return true 19142 } 19143 // match: (UGE (FlagLT_UGT) yes no) 19144 // cond: 19145 // result: (First nil yes no) 19146 for { 19147 v := b.Control 19148 if v.Op != Op386FlagLT_UGT { 19149 break 19150 } 19151 yes := b.Succs[0] 19152 no := b.Succs[1] 19153 b.Kind = BlockFirst 19154 b.SetControl(nil) 19155 _ = yes 19156 _ = no 19157 return true 19158 } 19159 // match: (UGE (FlagGT_ULT) yes no) 19160 // cond: 19161 // result: (First nil no yes) 19162 for { 19163 v := b.Control 19164 if v.Op != Op386FlagGT_ULT { 19165 break 19166 } 19167 yes := b.Succs[0] 19168 no := b.Succs[1] 19169 b.Kind = BlockFirst 19170 b.SetControl(nil) 19171 b.swapSuccessors() 19172 _ = no 19173 _ = yes 19174 return true 19175 } 19176 // match: (UGE (FlagGT_UGT) yes no) 19177 // cond: 19178 // result: (First nil yes no) 19179 for { 19180 v := b.Control 19181 if v.Op != Op386FlagGT_UGT { 19182 break 19183 } 19184 yes := b.Succs[0] 19185 no := b.Succs[1] 19186 b.Kind = BlockFirst 19187 b.SetControl(nil) 19188 _ = yes 19189 _ = no 19190 return true 19191 } 19192 case Block386UGT: 19193 // match: (UGT (InvertFlags cmp) yes no) 19194 // cond: 19195 // result: (ULT cmp yes no) 19196 for { 19197 v := b.Control 19198 if v.Op != Op386InvertFlags { 19199 break 19200 } 19201 cmp := v.Args[0] 19202 yes := b.Succs[0] 19203 no := b.Succs[1] 19204 b.Kind = Block386ULT 19205 b.SetControl(cmp) 19206 _ = yes 19207 _ = no 19208 return true 19209 } 19210 // match: (UGT (FlagEQ) yes no) 19211 // cond: 19212 // result: (First nil no yes) 19213 for { 19214 v := b.Control 19215 if v.Op != Op386FlagEQ { 19216 break 19217 } 19218 yes := b.Succs[0] 19219 no := b.Succs[1] 19220 b.Kind = BlockFirst 19221 b.SetControl(nil) 19222 b.swapSuccessors() 19223 _ = no 19224 _ = yes 19225 return true 19226 } 19227 // match: (UGT (FlagLT_ULT) yes no) 19228 // cond: 19229 // result: (First nil no yes) 19230 for { 19231 v := b.Control 19232 if v.Op != Op386FlagLT_ULT { 19233 break 19234 } 19235 yes := b.Succs[0] 19236 no := b.Succs[1] 19237 b.Kind = BlockFirst 19238 b.SetControl(nil) 19239 b.swapSuccessors() 19240 _ = no 19241 _ = yes 19242 return true 19243 } 19244 // match: (UGT (FlagLT_UGT) yes no) 19245 // cond: 19246 // result: (First nil yes no) 19247 for { 19248 v := b.Control 19249 if v.Op != Op386FlagLT_UGT { 19250 break 19251 } 19252 yes := b.Succs[0] 19253 no := b.Succs[1] 19254 b.Kind = BlockFirst 19255 b.SetControl(nil) 19256 _ = yes 19257 _ = no 19258 return true 19259 } 19260 // match: (UGT (FlagGT_ULT) yes no) 19261 // cond: 19262 // result: (First nil no yes) 19263 for { 19264 v := b.Control 19265 if v.Op != Op386FlagGT_ULT { 19266 break 19267 } 19268 yes := b.Succs[0] 19269 no := b.Succs[1] 19270 b.Kind = BlockFirst 19271 b.SetControl(nil) 19272 b.swapSuccessors() 19273 _ = no 19274 _ = yes 19275 return true 19276 } 19277 // match: (UGT (FlagGT_UGT) yes no) 19278 // cond: 19279 // result: (First nil yes no) 19280 for { 19281 v := b.Control 19282 if v.Op != Op386FlagGT_UGT { 19283 break 19284 } 19285 yes := b.Succs[0] 19286 no := b.Succs[1] 19287 b.Kind = BlockFirst 19288 b.SetControl(nil) 19289 _ = yes 19290 _ = no 19291 return true 19292 } 19293 case Block386ULE: 19294 // match: (ULE (InvertFlags cmp) yes no) 19295 // cond: 19296 // result: (UGE cmp yes no) 19297 for { 19298 v := b.Control 19299 if v.Op != Op386InvertFlags { 19300 break 19301 } 19302 cmp := v.Args[0] 19303 yes := b.Succs[0] 19304 no := b.Succs[1] 19305 b.Kind = Block386UGE 19306 b.SetControl(cmp) 19307 _ = yes 19308 _ = no 19309 return true 19310 } 19311 // match: (ULE (FlagEQ) yes no) 19312 // cond: 19313 // result: (First nil yes no) 19314 for { 19315 v := b.Control 19316 if v.Op != Op386FlagEQ { 19317 break 19318 } 19319 yes := b.Succs[0] 19320 no := b.Succs[1] 19321 b.Kind = BlockFirst 19322 b.SetControl(nil) 19323 _ = yes 19324 _ = no 19325 return true 19326 } 19327 // match: (ULE (FlagLT_ULT) yes no) 19328 // cond: 19329 // result: (First nil yes no) 19330 for { 19331 v := b.Control 19332 if v.Op != Op386FlagLT_ULT { 19333 break 19334 } 19335 yes := b.Succs[0] 19336 no := b.Succs[1] 19337 b.Kind = BlockFirst 19338 b.SetControl(nil) 19339 _ = yes 19340 _ = no 19341 return true 19342 } 19343 // match: (ULE (FlagLT_UGT) yes no) 19344 // cond: 19345 // result: (First nil no yes) 19346 for { 19347 v := b.Control 19348 if v.Op != Op386FlagLT_UGT { 19349 break 19350 } 19351 yes := b.Succs[0] 19352 no := b.Succs[1] 19353 b.Kind = BlockFirst 19354 b.SetControl(nil) 19355 b.swapSuccessors() 19356 _ = no 19357 _ = yes 19358 return true 19359 } 19360 // match: (ULE (FlagGT_ULT) yes no) 19361 // cond: 19362 // result: (First nil yes no) 19363 for { 19364 v := b.Control 19365 if v.Op != Op386FlagGT_ULT { 19366 break 19367 } 19368 yes := b.Succs[0] 19369 no := b.Succs[1] 19370 b.Kind = BlockFirst 19371 b.SetControl(nil) 19372 _ = yes 19373 _ = no 19374 return true 19375 } 19376 // match: (ULE (FlagGT_UGT) yes no) 19377 // cond: 19378 // result: (First nil no yes) 19379 for { 19380 v := b.Control 19381 if v.Op != Op386FlagGT_UGT { 19382 break 19383 } 19384 yes := b.Succs[0] 19385 no := b.Succs[1] 19386 b.Kind = BlockFirst 19387 b.SetControl(nil) 19388 b.swapSuccessors() 19389 _ = no 19390 _ = yes 19391 return true 19392 } 19393 case Block386ULT: 19394 // match: (ULT (InvertFlags cmp) yes no) 19395 // cond: 19396 // result: (UGT cmp yes no) 19397 for { 19398 v := b.Control 19399 if v.Op != Op386InvertFlags { 19400 break 19401 } 19402 cmp := v.Args[0] 19403 yes := b.Succs[0] 19404 no := b.Succs[1] 19405 b.Kind = Block386UGT 19406 b.SetControl(cmp) 19407 _ = yes 19408 _ = no 19409 return true 19410 } 19411 // match: (ULT (FlagEQ) yes no) 19412 // cond: 19413 // result: (First nil no yes) 19414 for { 19415 v := b.Control 19416 if v.Op != Op386FlagEQ { 19417 break 19418 } 19419 yes := b.Succs[0] 19420 no := b.Succs[1] 19421 b.Kind = BlockFirst 19422 b.SetControl(nil) 19423 b.swapSuccessors() 19424 _ = no 19425 _ = yes 19426 return true 19427 } 19428 // match: (ULT (FlagLT_ULT) yes no) 19429 // cond: 19430 // result: (First nil yes no) 19431 for { 19432 v := b.Control 19433 if v.Op != Op386FlagLT_ULT { 19434 break 19435 } 19436 yes := b.Succs[0] 19437 no := b.Succs[1] 19438 b.Kind = BlockFirst 19439 b.SetControl(nil) 19440 _ = yes 19441 _ = no 19442 return true 19443 } 19444 // match: (ULT (FlagLT_UGT) yes no) 19445 // cond: 19446 // result: (First nil no yes) 19447 for { 19448 v := b.Control 19449 if v.Op != Op386FlagLT_UGT { 19450 break 19451 } 19452 yes := b.Succs[0] 19453 no := b.Succs[1] 19454 b.Kind = BlockFirst 19455 b.SetControl(nil) 19456 b.swapSuccessors() 19457 _ = no 19458 _ = yes 19459 return true 19460 } 19461 // match: (ULT (FlagGT_ULT) yes no) 19462 // cond: 19463 // result: (First nil yes no) 19464 for { 19465 v := b.Control 19466 if v.Op != Op386FlagGT_ULT { 19467 break 19468 } 19469 yes := b.Succs[0] 19470 no := b.Succs[1] 19471 b.Kind = BlockFirst 19472 b.SetControl(nil) 19473 _ = yes 19474 _ = no 19475 return true 19476 } 19477 // match: (ULT (FlagGT_UGT) yes no) 19478 // cond: 19479 // result: (First nil no yes) 19480 for { 19481 v := b.Control 19482 if v.Op != Op386FlagGT_UGT { 19483 break 19484 } 19485 yes := b.Succs[0] 19486 no := b.Succs[1] 19487 b.Kind = BlockFirst 19488 b.SetControl(nil) 19489 b.swapSuccessors() 19490 _ = no 19491 _ = yes 19492 return true 19493 } 19494 } 19495 return false 19496 }