github.com/riscv/riscv-go@v0.0.0-20200123204226-124ebd6fcc8e/src/cmd/compile/internal/ssa/rewrite386.go (about) 1 // autogenerated from gen/386.rules: do not edit! 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 8 var _ = math.MinInt8 // in case not otherwise used 9 func rewriteValue386(v *Value, config *Config) bool { 10 switch v.Op { 11 case Op386ADCL: 12 return rewriteValue386_Op386ADCL(v, config) 13 case Op386ADDL: 14 return rewriteValue386_Op386ADDL(v, config) 15 case Op386ADDLcarry: 16 return rewriteValue386_Op386ADDLcarry(v, config) 17 case Op386ADDLconst: 18 return rewriteValue386_Op386ADDLconst(v, config) 19 case Op386ANDL: 20 return rewriteValue386_Op386ANDL(v, config) 21 case Op386ANDLconst: 22 return rewriteValue386_Op386ANDLconst(v, config) 23 case Op386CMPB: 24 return rewriteValue386_Op386CMPB(v, config) 25 case Op386CMPBconst: 26 return rewriteValue386_Op386CMPBconst(v, config) 27 case Op386CMPL: 28 return rewriteValue386_Op386CMPL(v, config) 29 case Op386CMPLconst: 30 return rewriteValue386_Op386CMPLconst(v, config) 31 case Op386CMPW: 32 return rewriteValue386_Op386CMPW(v, config) 33 case Op386CMPWconst: 34 return rewriteValue386_Op386CMPWconst(v, config) 35 case Op386LEAL: 36 return rewriteValue386_Op386LEAL(v, config) 37 case Op386LEAL1: 38 return rewriteValue386_Op386LEAL1(v, config) 39 case Op386LEAL2: 40 return rewriteValue386_Op386LEAL2(v, config) 41 case Op386LEAL4: 42 return rewriteValue386_Op386LEAL4(v, config) 43 case Op386LEAL8: 44 return rewriteValue386_Op386LEAL8(v, config) 45 case Op386MOVBLSX: 46 return rewriteValue386_Op386MOVBLSX(v, config) 47 case Op386MOVBLSXload: 48 return rewriteValue386_Op386MOVBLSXload(v, config) 49 case Op386MOVBLZX: 50 return rewriteValue386_Op386MOVBLZX(v, config) 51 case Op386MOVBload: 52 return rewriteValue386_Op386MOVBload(v, config) 53 case Op386MOVBloadidx1: 54 return rewriteValue386_Op386MOVBloadidx1(v, config) 55 case Op386MOVBstore: 56 return rewriteValue386_Op386MOVBstore(v, config) 57 case Op386MOVBstoreconst: 58 return rewriteValue386_Op386MOVBstoreconst(v, config) 59 case Op386MOVBstoreconstidx1: 60 return rewriteValue386_Op386MOVBstoreconstidx1(v, config) 61 case Op386MOVBstoreidx1: 62 return rewriteValue386_Op386MOVBstoreidx1(v, config) 63 case Op386MOVLload: 64 return rewriteValue386_Op386MOVLload(v, config) 65 case Op386MOVLloadidx1: 66 return rewriteValue386_Op386MOVLloadidx1(v, config) 67 case Op386MOVLloadidx4: 68 return rewriteValue386_Op386MOVLloadidx4(v, config) 69 case Op386MOVLstore: 70 return rewriteValue386_Op386MOVLstore(v, config) 71 case Op386MOVLstoreconst: 72 return rewriteValue386_Op386MOVLstoreconst(v, config) 73 case Op386MOVLstoreconstidx1: 74 return rewriteValue386_Op386MOVLstoreconstidx1(v, config) 75 case Op386MOVLstoreconstidx4: 76 return rewriteValue386_Op386MOVLstoreconstidx4(v, config) 77 case Op386MOVLstoreidx1: 78 return rewriteValue386_Op386MOVLstoreidx1(v, config) 79 case Op386MOVLstoreidx4: 80 return rewriteValue386_Op386MOVLstoreidx4(v, config) 81 case Op386MOVSDconst: 82 return rewriteValue386_Op386MOVSDconst(v, config) 83 case Op386MOVSDload: 84 return rewriteValue386_Op386MOVSDload(v, config) 85 case Op386MOVSDloadidx1: 86 return rewriteValue386_Op386MOVSDloadidx1(v, config) 87 case Op386MOVSDloadidx8: 88 return rewriteValue386_Op386MOVSDloadidx8(v, config) 89 case Op386MOVSDstore: 90 return rewriteValue386_Op386MOVSDstore(v, config) 91 case Op386MOVSDstoreidx1: 92 return rewriteValue386_Op386MOVSDstoreidx1(v, config) 93 case Op386MOVSDstoreidx8: 94 return rewriteValue386_Op386MOVSDstoreidx8(v, config) 95 case Op386MOVSSconst: 96 return rewriteValue386_Op386MOVSSconst(v, config) 97 case Op386MOVSSload: 98 return rewriteValue386_Op386MOVSSload(v, config) 99 case Op386MOVSSloadidx1: 100 return rewriteValue386_Op386MOVSSloadidx1(v, config) 101 case Op386MOVSSloadidx4: 102 return rewriteValue386_Op386MOVSSloadidx4(v, config) 103 case Op386MOVSSstore: 104 return rewriteValue386_Op386MOVSSstore(v, config) 105 case Op386MOVSSstoreidx1: 106 return rewriteValue386_Op386MOVSSstoreidx1(v, config) 107 case Op386MOVSSstoreidx4: 108 return rewriteValue386_Op386MOVSSstoreidx4(v, config) 109 case Op386MOVWLSX: 110 return rewriteValue386_Op386MOVWLSX(v, config) 111 case Op386MOVWLSXload: 112 return rewriteValue386_Op386MOVWLSXload(v, config) 113 case Op386MOVWLZX: 114 return rewriteValue386_Op386MOVWLZX(v, config) 115 case Op386MOVWload: 116 return rewriteValue386_Op386MOVWload(v, config) 117 case Op386MOVWloadidx1: 118 return rewriteValue386_Op386MOVWloadidx1(v, config) 119 case Op386MOVWloadidx2: 120 return rewriteValue386_Op386MOVWloadidx2(v, config) 121 case Op386MOVWstore: 122 return rewriteValue386_Op386MOVWstore(v, config) 123 case Op386MOVWstoreconst: 124 return rewriteValue386_Op386MOVWstoreconst(v, config) 125 case Op386MOVWstoreconstidx1: 126 return rewriteValue386_Op386MOVWstoreconstidx1(v, config) 127 case Op386MOVWstoreconstidx2: 128 return rewriteValue386_Op386MOVWstoreconstidx2(v, config) 129 case Op386MOVWstoreidx1: 130 return rewriteValue386_Op386MOVWstoreidx1(v, config) 131 case Op386MOVWstoreidx2: 132 return rewriteValue386_Op386MOVWstoreidx2(v, config) 133 case Op386MULL: 134 return rewriteValue386_Op386MULL(v, config) 135 case Op386MULLconst: 136 return rewriteValue386_Op386MULLconst(v, config) 137 case Op386NEGL: 138 return rewriteValue386_Op386NEGL(v, config) 139 case Op386NOTL: 140 return rewriteValue386_Op386NOTL(v, config) 141 case Op386ORL: 142 return rewriteValue386_Op386ORL(v, config) 143 case Op386ORLconst: 144 return rewriteValue386_Op386ORLconst(v, config) 145 case Op386ROLBconst: 146 return rewriteValue386_Op386ROLBconst(v, config) 147 case Op386ROLLconst: 148 return rewriteValue386_Op386ROLLconst(v, config) 149 case Op386ROLWconst: 150 return rewriteValue386_Op386ROLWconst(v, config) 151 case Op386SARB: 152 return rewriteValue386_Op386SARB(v, config) 153 case Op386SARBconst: 154 return rewriteValue386_Op386SARBconst(v, config) 155 case Op386SARL: 156 return rewriteValue386_Op386SARL(v, config) 157 case Op386SARLconst: 158 return rewriteValue386_Op386SARLconst(v, config) 159 case Op386SARW: 160 return rewriteValue386_Op386SARW(v, config) 161 case Op386SARWconst: 162 return rewriteValue386_Op386SARWconst(v, config) 163 case Op386SBBL: 164 return rewriteValue386_Op386SBBL(v, config) 165 case Op386SBBLcarrymask: 166 return rewriteValue386_Op386SBBLcarrymask(v, config) 167 case Op386SETA: 168 return rewriteValue386_Op386SETA(v, config) 169 case Op386SETAE: 170 return rewriteValue386_Op386SETAE(v, config) 171 case Op386SETB: 172 return rewriteValue386_Op386SETB(v, config) 173 case Op386SETBE: 174 return rewriteValue386_Op386SETBE(v, config) 175 case Op386SETEQ: 176 return rewriteValue386_Op386SETEQ(v, config) 177 case Op386SETG: 178 return rewriteValue386_Op386SETG(v, config) 179 case Op386SETGE: 180 return rewriteValue386_Op386SETGE(v, config) 181 case Op386SETL: 182 return rewriteValue386_Op386SETL(v, config) 183 case Op386SETLE: 184 return rewriteValue386_Op386SETLE(v, config) 185 case Op386SETNE: 186 return rewriteValue386_Op386SETNE(v, config) 187 case Op386SHLL: 188 return rewriteValue386_Op386SHLL(v, config) 189 case Op386SHLLconst: 190 return rewriteValue386_Op386SHLLconst(v, config) 191 case Op386SHRB: 192 return rewriteValue386_Op386SHRB(v, config) 193 case Op386SHRBconst: 194 return rewriteValue386_Op386SHRBconst(v, config) 195 case Op386SHRL: 196 return rewriteValue386_Op386SHRL(v, config) 197 case Op386SHRLconst: 198 return rewriteValue386_Op386SHRLconst(v, config) 199 case Op386SHRW: 200 return rewriteValue386_Op386SHRW(v, config) 201 case Op386SHRWconst: 202 return rewriteValue386_Op386SHRWconst(v, config) 203 case Op386SUBL: 204 return rewriteValue386_Op386SUBL(v, config) 205 case Op386SUBLcarry: 206 return rewriteValue386_Op386SUBLcarry(v, config) 207 case Op386SUBLconst: 208 return rewriteValue386_Op386SUBLconst(v, config) 209 case Op386XORL: 210 return rewriteValue386_Op386XORL(v, config) 211 case Op386XORLconst: 212 return rewriteValue386_Op386XORLconst(v, config) 213 case OpAdd16: 214 return rewriteValue386_OpAdd16(v, config) 215 case OpAdd32: 216 return rewriteValue386_OpAdd32(v, config) 217 case OpAdd32F: 218 return rewriteValue386_OpAdd32F(v, config) 219 case OpAdd32carry: 220 return rewriteValue386_OpAdd32carry(v, config) 221 case OpAdd32withcarry: 222 return rewriteValue386_OpAdd32withcarry(v, config) 223 case OpAdd64F: 224 return rewriteValue386_OpAdd64F(v, config) 225 case OpAdd8: 226 return rewriteValue386_OpAdd8(v, config) 227 case OpAddPtr: 228 return rewriteValue386_OpAddPtr(v, config) 229 case OpAddr: 230 return rewriteValue386_OpAddr(v, config) 231 case OpAnd16: 232 return rewriteValue386_OpAnd16(v, config) 233 case OpAnd32: 234 return rewriteValue386_OpAnd32(v, config) 235 case OpAnd8: 236 return rewriteValue386_OpAnd8(v, config) 237 case OpAndB: 238 return rewriteValue386_OpAndB(v, config) 239 case OpBswap32: 240 return rewriteValue386_OpBswap32(v, config) 241 case OpClosureCall: 242 return rewriteValue386_OpClosureCall(v, config) 243 case OpCom16: 244 return rewriteValue386_OpCom16(v, config) 245 case OpCom32: 246 return rewriteValue386_OpCom32(v, config) 247 case OpCom8: 248 return rewriteValue386_OpCom8(v, config) 249 case OpConst16: 250 return rewriteValue386_OpConst16(v, config) 251 case OpConst32: 252 return rewriteValue386_OpConst32(v, config) 253 case OpConst32F: 254 return rewriteValue386_OpConst32F(v, config) 255 case OpConst64F: 256 return rewriteValue386_OpConst64F(v, config) 257 case OpConst8: 258 return rewriteValue386_OpConst8(v, config) 259 case OpConstBool: 260 return rewriteValue386_OpConstBool(v, config) 261 case OpConstNil: 262 return rewriteValue386_OpConstNil(v, config) 263 case OpConvert: 264 return rewriteValue386_OpConvert(v, config) 265 case OpCvt32Fto32: 266 return rewriteValue386_OpCvt32Fto32(v, config) 267 case OpCvt32Fto64F: 268 return rewriteValue386_OpCvt32Fto64F(v, config) 269 case OpCvt32to32F: 270 return rewriteValue386_OpCvt32to32F(v, config) 271 case OpCvt32to64F: 272 return rewriteValue386_OpCvt32to64F(v, config) 273 case OpCvt64Fto32: 274 return rewriteValue386_OpCvt64Fto32(v, config) 275 case OpCvt64Fto32F: 276 return rewriteValue386_OpCvt64Fto32F(v, config) 277 case OpDeferCall: 278 return rewriteValue386_OpDeferCall(v, config) 279 case OpDiv16: 280 return rewriteValue386_OpDiv16(v, config) 281 case OpDiv16u: 282 return rewriteValue386_OpDiv16u(v, config) 283 case OpDiv32: 284 return rewriteValue386_OpDiv32(v, config) 285 case OpDiv32F: 286 return rewriteValue386_OpDiv32F(v, config) 287 case OpDiv32u: 288 return rewriteValue386_OpDiv32u(v, config) 289 case OpDiv64F: 290 return rewriteValue386_OpDiv64F(v, config) 291 case OpDiv8: 292 return rewriteValue386_OpDiv8(v, config) 293 case OpDiv8u: 294 return rewriteValue386_OpDiv8u(v, config) 295 case OpEq16: 296 return rewriteValue386_OpEq16(v, config) 297 case OpEq32: 298 return rewriteValue386_OpEq32(v, config) 299 case OpEq32F: 300 return rewriteValue386_OpEq32F(v, config) 301 case OpEq64F: 302 return rewriteValue386_OpEq64F(v, config) 303 case OpEq8: 304 return rewriteValue386_OpEq8(v, config) 305 case OpEqB: 306 return rewriteValue386_OpEqB(v, config) 307 case OpEqPtr: 308 return rewriteValue386_OpEqPtr(v, config) 309 case OpGeq16: 310 return rewriteValue386_OpGeq16(v, config) 311 case OpGeq16U: 312 return rewriteValue386_OpGeq16U(v, config) 313 case OpGeq32: 314 return rewriteValue386_OpGeq32(v, config) 315 case OpGeq32F: 316 return rewriteValue386_OpGeq32F(v, config) 317 case OpGeq32U: 318 return rewriteValue386_OpGeq32U(v, config) 319 case OpGeq64F: 320 return rewriteValue386_OpGeq64F(v, config) 321 case OpGeq8: 322 return rewriteValue386_OpGeq8(v, config) 323 case OpGeq8U: 324 return rewriteValue386_OpGeq8U(v, config) 325 case OpGetClosurePtr: 326 return rewriteValue386_OpGetClosurePtr(v, config) 327 case OpGetG: 328 return rewriteValue386_OpGetG(v, config) 329 case OpGoCall: 330 return rewriteValue386_OpGoCall(v, config) 331 case OpGreater16: 332 return rewriteValue386_OpGreater16(v, config) 333 case OpGreater16U: 334 return rewriteValue386_OpGreater16U(v, config) 335 case OpGreater32: 336 return rewriteValue386_OpGreater32(v, config) 337 case OpGreater32F: 338 return rewriteValue386_OpGreater32F(v, config) 339 case OpGreater32U: 340 return rewriteValue386_OpGreater32U(v, config) 341 case OpGreater64F: 342 return rewriteValue386_OpGreater64F(v, config) 343 case OpGreater8: 344 return rewriteValue386_OpGreater8(v, config) 345 case OpGreater8U: 346 return rewriteValue386_OpGreater8U(v, config) 347 case OpHmul16: 348 return rewriteValue386_OpHmul16(v, config) 349 case OpHmul16u: 350 return rewriteValue386_OpHmul16u(v, config) 351 case OpHmul32: 352 return rewriteValue386_OpHmul32(v, config) 353 case OpHmul32u: 354 return rewriteValue386_OpHmul32u(v, config) 355 case OpHmul8: 356 return rewriteValue386_OpHmul8(v, config) 357 case OpHmul8u: 358 return rewriteValue386_OpHmul8u(v, config) 359 case OpInterCall: 360 return rewriteValue386_OpInterCall(v, config) 361 case OpIsInBounds: 362 return rewriteValue386_OpIsInBounds(v, config) 363 case OpIsNonNil: 364 return rewriteValue386_OpIsNonNil(v, config) 365 case OpIsSliceInBounds: 366 return rewriteValue386_OpIsSliceInBounds(v, config) 367 case OpLeq16: 368 return rewriteValue386_OpLeq16(v, config) 369 case OpLeq16U: 370 return rewriteValue386_OpLeq16U(v, config) 371 case OpLeq32: 372 return rewriteValue386_OpLeq32(v, config) 373 case OpLeq32F: 374 return rewriteValue386_OpLeq32F(v, config) 375 case OpLeq32U: 376 return rewriteValue386_OpLeq32U(v, config) 377 case OpLeq64F: 378 return rewriteValue386_OpLeq64F(v, config) 379 case OpLeq8: 380 return rewriteValue386_OpLeq8(v, config) 381 case OpLeq8U: 382 return rewriteValue386_OpLeq8U(v, config) 383 case OpLess16: 384 return rewriteValue386_OpLess16(v, config) 385 case OpLess16U: 386 return rewriteValue386_OpLess16U(v, config) 387 case OpLess32: 388 return rewriteValue386_OpLess32(v, config) 389 case OpLess32F: 390 return rewriteValue386_OpLess32F(v, config) 391 case OpLess32U: 392 return rewriteValue386_OpLess32U(v, config) 393 case OpLess64F: 394 return rewriteValue386_OpLess64F(v, config) 395 case OpLess8: 396 return rewriteValue386_OpLess8(v, config) 397 case OpLess8U: 398 return rewriteValue386_OpLess8U(v, config) 399 case OpLoad: 400 return rewriteValue386_OpLoad(v, config) 401 case OpLsh16x16: 402 return rewriteValue386_OpLsh16x16(v, config) 403 case OpLsh16x32: 404 return rewriteValue386_OpLsh16x32(v, config) 405 case OpLsh16x64: 406 return rewriteValue386_OpLsh16x64(v, config) 407 case OpLsh16x8: 408 return rewriteValue386_OpLsh16x8(v, config) 409 case OpLsh32x16: 410 return rewriteValue386_OpLsh32x16(v, config) 411 case OpLsh32x32: 412 return rewriteValue386_OpLsh32x32(v, config) 413 case OpLsh32x64: 414 return rewriteValue386_OpLsh32x64(v, config) 415 case OpLsh32x8: 416 return rewriteValue386_OpLsh32x8(v, config) 417 case OpLsh8x16: 418 return rewriteValue386_OpLsh8x16(v, config) 419 case OpLsh8x32: 420 return rewriteValue386_OpLsh8x32(v, config) 421 case OpLsh8x64: 422 return rewriteValue386_OpLsh8x64(v, config) 423 case OpLsh8x8: 424 return rewriteValue386_OpLsh8x8(v, config) 425 case OpMod16: 426 return rewriteValue386_OpMod16(v, config) 427 case OpMod16u: 428 return rewriteValue386_OpMod16u(v, config) 429 case OpMod32: 430 return rewriteValue386_OpMod32(v, config) 431 case OpMod32u: 432 return rewriteValue386_OpMod32u(v, config) 433 case OpMod8: 434 return rewriteValue386_OpMod8(v, config) 435 case OpMod8u: 436 return rewriteValue386_OpMod8u(v, config) 437 case OpMove: 438 return rewriteValue386_OpMove(v, config) 439 case OpMul16: 440 return rewriteValue386_OpMul16(v, config) 441 case OpMul32: 442 return rewriteValue386_OpMul32(v, config) 443 case OpMul32F: 444 return rewriteValue386_OpMul32F(v, config) 445 case OpMul32uhilo: 446 return rewriteValue386_OpMul32uhilo(v, config) 447 case OpMul64F: 448 return rewriteValue386_OpMul64F(v, config) 449 case OpMul8: 450 return rewriteValue386_OpMul8(v, config) 451 case OpNeg16: 452 return rewriteValue386_OpNeg16(v, config) 453 case OpNeg32: 454 return rewriteValue386_OpNeg32(v, config) 455 case OpNeg32F: 456 return rewriteValue386_OpNeg32F(v, config) 457 case OpNeg64F: 458 return rewriteValue386_OpNeg64F(v, config) 459 case OpNeg8: 460 return rewriteValue386_OpNeg8(v, config) 461 case OpNeq16: 462 return rewriteValue386_OpNeq16(v, config) 463 case OpNeq32: 464 return rewriteValue386_OpNeq32(v, config) 465 case OpNeq32F: 466 return rewriteValue386_OpNeq32F(v, config) 467 case OpNeq64F: 468 return rewriteValue386_OpNeq64F(v, config) 469 case OpNeq8: 470 return rewriteValue386_OpNeq8(v, config) 471 case OpNeqB: 472 return rewriteValue386_OpNeqB(v, config) 473 case OpNeqPtr: 474 return rewriteValue386_OpNeqPtr(v, config) 475 case OpNilCheck: 476 return rewriteValue386_OpNilCheck(v, config) 477 case OpNot: 478 return rewriteValue386_OpNot(v, config) 479 case OpOffPtr: 480 return rewriteValue386_OpOffPtr(v, config) 481 case OpOr16: 482 return rewriteValue386_OpOr16(v, config) 483 case OpOr32: 484 return rewriteValue386_OpOr32(v, config) 485 case OpOr8: 486 return rewriteValue386_OpOr8(v, config) 487 case OpOrB: 488 return rewriteValue386_OpOrB(v, config) 489 case OpRsh16Ux16: 490 return rewriteValue386_OpRsh16Ux16(v, config) 491 case OpRsh16Ux32: 492 return rewriteValue386_OpRsh16Ux32(v, config) 493 case OpRsh16Ux64: 494 return rewriteValue386_OpRsh16Ux64(v, config) 495 case OpRsh16Ux8: 496 return rewriteValue386_OpRsh16Ux8(v, config) 497 case OpRsh16x16: 498 return rewriteValue386_OpRsh16x16(v, config) 499 case OpRsh16x32: 500 return rewriteValue386_OpRsh16x32(v, config) 501 case OpRsh16x64: 502 return rewriteValue386_OpRsh16x64(v, config) 503 case OpRsh16x8: 504 return rewriteValue386_OpRsh16x8(v, config) 505 case OpRsh32Ux16: 506 return rewriteValue386_OpRsh32Ux16(v, config) 507 case OpRsh32Ux32: 508 return rewriteValue386_OpRsh32Ux32(v, config) 509 case OpRsh32Ux64: 510 return rewriteValue386_OpRsh32Ux64(v, config) 511 case OpRsh32Ux8: 512 return rewriteValue386_OpRsh32Ux8(v, config) 513 case OpRsh32x16: 514 return rewriteValue386_OpRsh32x16(v, config) 515 case OpRsh32x32: 516 return rewriteValue386_OpRsh32x32(v, config) 517 case OpRsh32x64: 518 return rewriteValue386_OpRsh32x64(v, config) 519 case OpRsh32x8: 520 return rewriteValue386_OpRsh32x8(v, config) 521 case OpRsh8Ux16: 522 return rewriteValue386_OpRsh8Ux16(v, config) 523 case OpRsh8Ux32: 524 return rewriteValue386_OpRsh8Ux32(v, config) 525 case OpRsh8Ux64: 526 return rewriteValue386_OpRsh8Ux64(v, config) 527 case OpRsh8Ux8: 528 return rewriteValue386_OpRsh8Ux8(v, config) 529 case OpRsh8x16: 530 return rewriteValue386_OpRsh8x16(v, config) 531 case OpRsh8x32: 532 return rewriteValue386_OpRsh8x32(v, config) 533 case OpRsh8x64: 534 return rewriteValue386_OpRsh8x64(v, config) 535 case OpRsh8x8: 536 return rewriteValue386_OpRsh8x8(v, config) 537 case OpSignExt16to32: 538 return rewriteValue386_OpSignExt16to32(v, config) 539 case OpSignExt8to16: 540 return rewriteValue386_OpSignExt8to16(v, config) 541 case OpSignExt8to32: 542 return rewriteValue386_OpSignExt8to32(v, config) 543 case OpSignmask: 544 return rewriteValue386_OpSignmask(v, config) 545 case OpSlicemask: 546 return rewriteValue386_OpSlicemask(v, config) 547 case OpSqrt: 548 return rewriteValue386_OpSqrt(v, config) 549 case OpStaticCall: 550 return rewriteValue386_OpStaticCall(v, config) 551 case OpStore: 552 return rewriteValue386_OpStore(v, config) 553 case OpSub16: 554 return rewriteValue386_OpSub16(v, config) 555 case OpSub32: 556 return rewriteValue386_OpSub32(v, config) 557 case OpSub32F: 558 return rewriteValue386_OpSub32F(v, config) 559 case OpSub32carry: 560 return rewriteValue386_OpSub32carry(v, config) 561 case OpSub32withcarry: 562 return rewriteValue386_OpSub32withcarry(v, config) 563 case OpSub64F: 564 return rewriteValue386_OpSub64F(v, config) 565 case OpSub8: 566 return rewriteValue386_OpSub8(v, config) 567 case OpSubPtr: 568 return rewriteValue386_OpSubPtr(v, config) 569 case OpTrunc16to8: 570 return rewriteValue386_OpTrunc16to8(v, config) 571 case OpTrunc32to16: 572 return rewriteValue386_OpTrunc32to16(v, config) 573 case OpTrunc32to8: 574 return rewriteValue386_OpTrunc32to8(v, config) 575 case OpXor16: 576 return rewriteValue386_OpXor16(v, config) 577 case OpXor32: 578 return rewriteValue386_OpXor32(v, config) 579 case OpXor8: 580 return rewriteValue386_OpXor8(v, config) 581 case OpZero: 582 return rewriteValue386_OpZero(v, config) 583 case OpZeroExt16to32: 584 return rewriteValue386_OpZeroExt16to32(v, config) 585 case OpZeroExt8to16: 586 return rewriteValue386_OpZeroExt8to16(v, config) 587 case OpZeroExt8to32: 588 return rewriteValue386_OpZeroExt8to32(v, config) 589 case OpZeromask: 590 return rewriteValue386_OpZeromask(v, config) 591 } 592 return false 593 } 594 func rewriteValue386_Op386ADCL(v *Value, config *Config) bool { 595 b := v.Block 596 _ = b 597 // match: (ADCL x (MOVLconst [c]) f) 598 // cond: 599 // result: (ADCLconst [c] x f) 600 for { 601 x := v.Args[0] 602 v_1 := v.Args[1] 603 if v_1.Op != Op386MOVLconst { 604 break 605 } 606 c := v_1.AuxInt 607 f := v.Args[2] 608 v.reset(Op386ADCLconst) 609 v.AuxInt = c 610 v.AddArg(x) 611 v.AddArg(f) 612 return true 613 } 614 // match: (ADCL (MOVLconst [c]) x f) 615 // cond: 616 // result: (ADCLconst [c] x f) 617 for { 618 v_0 := v.Args[0] 619 if v_0.Op != Op386MOVLconst { 620 break 621 } 622 c := v_0.AuxInt 623 x := v.Args[1] 624 f := v.Args[2] 625 v.reset(Op386ADCLconst) 626 v.AuxInt = c 627 v.AddArg(x) 628 v.AddArg(f) 629 return true 630 } 631 return false 632 } 633 func rewriteValue386_Op386ADDL(v *Value, config *Config) bool { 634 b := v.Block 635 _ = b 636 // match: (ADDL x (MOVLconst [c])) 637 // cond: 638 // result: (ADDLconst [c] x) 639 for { 640 x := v.Args[0] 641 v_1 := v.Args[1] 642 if v_1.Op != Op386MOVLconst { 643 break 644 } 645 c := v_1.AuxInt 646 v.reset(Op386ADDLconst) 647 v.AuxInt = c 648 v.AddArg(x) 649 return true 650 } 651 // match: (ADDL (MOVLconst [c]) x) 652 // cond: 653 // result: (ADDLconst [c] x) 654 for { 655 v_0 := v.Args[0] 656 if v_0.Op != Op386MOVLconst { 657 break 658 } 659 c := v_0.AuxInt 660 x := v.Args[1] 661 v.reset(Op386ADDLconst) 662 v.AuxInt = c 663 v.AddArg(x) 664 return true 665 } 666 // match: (ADDL (SHLLconst [c] x) (SHRLconst [32-c] x)) 667 // cond: 668 // result: (ROLLconst [c ] x) 669 for { 670 v_0 := v.Args[0] 671 if v_0.Op != Op386SHLLconst { 672 break 673 } 674 c := v_0.AuxInt 675 x := v_0.Args[0] 676 v_1 := v.Args[1] 677 if v_1.Op != Op386SHRLconst { 678 break 679 } 680 if v_1.AuxInt != 32-c { 681 break 682 } 683 if x != v_1.Args[0] { 684 break 685 } 686 v.reset(Op386ROLLconst) 687 v.AuxInt = c 688 v.AddArg(x) 689 return true 690 } 691 // match: (ADDL (SHRLconst [c] x) (SHLLconst [32-c] x)) 692 // cond: 693 // result: (ROLLconst [32-c] x) 694 for { 695 v_0 := v.Args[0] 696 if v_0.Op != Op386SHRLconst { 697 break 698 } 699 c := v_0.AuxInt 700 x := v_0.Args[0] 701 v_1 := v.Args[1] 702 if v_1.Op != Op386SHLLconst { 703 break 704 } 705 if v_1.AuxInt != 32-c { 706 break 707 } 708 if x != v_1.Args[0] { 709 break 710 } 711 v.reset(Op386ROLLconst) 712 v.AuxInt = 32 - c 713 v.AddArg(x) 714 return true 715 } 716 // match: (ADDL <t> (SHLLconst x [c]) (SHRWconst x [16-c])) 717 // cond: c < 16 && t.Size() == 2 718 // result: (ROLWconst x [ c]) 719 for { 720 t := v.Type 721 v_0 := v.Args[0] 722 if v_0.Op != Op386SHLLconst { 723 break 724 } 725 c := v_0.AuxInt 726 x := v_0.Args[0] 727 v_1 := v.Args[1] 728 if v_1.Op != Op386SHRWconst { 729 break 730 } 731 if v_1.AuxInt != 16-c { 732 break 733 } 734 if x != v_1.Args[0] { 735 break 736 } 737 if !(c < 16 && t.Size() == 2) { 738 break 739 } 740 v.reset(Op386ROLWconst) 741 v.AuxInt = c 742 v.AddArg(x) 743 return true 744 } 745 // match: (ADDL <t> (SHRWconst x [c]) (SHLLconst x [16-c])) 746 // cond: c > 0 && t.Size() == 2 747 // result: (ROLWconst x [16-c]) 748 for { 749 t := v.Type 750 v_0 := v.Args[0] 751 if v_0.Op != Op386SHRWconst { 752 break 753 } 754 c := v_0.AuxInt 755 x := v_0.Args[0] 756 v_1 := v.Args[1] 757 if v_1.Op != Op386SHLLconst { 758 break 759 } 760 if v_1.AuxInt != 16-c { 761 break 762 } 763 if x != v_1.Args[0] { 764 break 765 } 766 if !(c > 0 && t.Size() == 2) { 767 break 768 } 769 v.reset(Op386ROLWconst) 770 v.AuxInt = 16 - c 771 v.AddArg(x) 772 return true 773 } 774 // match: (ADDL <t> (SHLLconst x [c]) (SHRBconst x [ 8-c])) 775 // cond: c < 8 && t.Size() == 1 776 // result: (ROLBconst x [ c]) 777 for { 778 t := v.Type 779 v_0 := v.Args[0] 780 if v_0.Op != Op386SHLLconst { 781 break 782 } 783 c := v_0.AuxInt 784 x := v_0.Args[0] 785 v_1 := v.Args[1] 786 if v_1.Op != Op386SHRBconst { 787 break 788 } 789 if v_1.AuxInt != 8-c { 790 break 791 } 792 if x != v_1.Args[0] { 793 break 794 } 795 if !(c < 8 && t.Size() == 1) { 796 break 797 } 798 v.reset(Op386ROLBconst) 799 v.AuxInt = c 800 v.AddArg(x) 801 return true 802 } 803 // match: (ADDL <t> (SHRBconst x [c]) (SHLLconst x [ 8-c])) 804 // cond: c > 0 && t.Size() == 1 805 // result: (ROLBconst x [ 8-c]) 806 for { 807 t := v.Type 808 v_0 := v.Args[0] 809 if v_0.Op != Op386SHRBconst { 810 break 811 } 812 c := v_0.AuxInt 813 x := v_0.Args[0] 814 v_1 := v.Args[1] 815 if v_1.Op != Op386SHLLconst { 816 break 817 } 818 if v_1.AuxInt != 8-c { 819 break 820 } 821 if x != v_1.Args[0] { 822 break 823 } 824 if !(c > 0 && t.Size() == 1) { 825 break 826 } 827 v.reset(Op386ROLBconst) 828 v.AuxInt = 8 - c 829 v.AddArg(x) 830 return true 831 } 832 // match: (ADDL x (SHLLconst [3] y)) 833 // cond: 834 // result: (LEAL8 x y) 835 for { 836 x := v.Args[0] 837 v_1 := v.Args[1] 838 if v_1.Op != Op386SHLLconst { 839 break 840 } 841 if v_1.AuxInt != 3 { 842 break 843 } 844 y := v_1.Args[0] 845 v.reset(Op386LEAL8) 846 v.AddArg(x) 847 v.AddArg(y) 848 return true 849 } 850 // match: (ADDL x (SHLLconst [2] y)) 851 // cond: 852 // result: (LEAL4 x y) 853 for { 854 x := v.Args[0] 855 v_1 := v.Args[1] 856 if v_1.Op != Op386SHLLconst { 857 break 858 } 859 if v_1.AuxInt != 2 { 860 break 861 } 862 y := v_1.Args[0] 863 v.reset(Op386LEAL4) 864 v.AddArg(x) 865 v.AddArg(y) 866 return true 867 } 868 // match: (ADDL x (SHLLconst [1] y)) 869 // cond: 870 // result: (LEAL2 x y) 871 for { 872 x := v.Args[0] 873 v_1 := v.Args[1] 874 if v_1.Op != Op386SHLLconst { 875 break 876 } 877 if v_1.AuxInt != 1 { 878 break 879 } 880 y := v_1.Args[0] 881 v.reset(Op386LEAL2) 882 v.AddArg(x) 883 v.AddArg(y) 884 return true 885 } 886 // match: (ADDL x (ADDL y y)) 887 // cond: 888 // result: (LEAL2 x y) 889 for { 890 x := v.Args[0] 891 v_1 := v.Args[1] 892 if v_1.Op != Op386ADDL { 893 break 894 } 895 y := v_1.Args[0] 896 if y != v_1.Args[1] { 897 break 898 } 899 v.reset(Op386LEAL2) 900 v.AddArg(x) 901 v.AddArg(y) 902 return true 903 } 904 // match: (ADDL x (ADDL x y)) 905 // cond: 906 // result: (LEAL2 y x) 907 for { 908 x := v.Args[0] 909 v_1 := v.Args[1] 910 if v_1.Op != Op386ADDL { 911 break 912 } 913 if x != v_1.Args[0] { 914 break 915 } 916 y := v_1.Args[1] 917 v.reset(Op386LEAL2) 918 v.AddArg(y) 919 v.AddArg(x) 920 return true 921 } 922 // match: (ADDL x (ADDL y x)) 923 // cond: 924 // result: (LEAL2 y x) 925 for { 926 x := v.Args[0] 927 v_1 := v.Args[1] 928 if v_1.Op != Op386ADDL { 929 break 930 } 931 y := v_1.Args[0] 932 if x != v_1.Args[1] { 933 break 934 } 935 v.reset(Op386LEAL2) 936 v.AddArg(y) 937 v.AddArg(x) 938 return true 939 } 940 // match: (ADDL (ADDLconst [c] x) y) 941 // cond: 942 // result: (LEAL1 [c] x y) 943 for { 944 v_0 := v.Args[0] 945 if v_0.Op != Op386ADDLconst { 946 break 947 } 948 c := v_0.AuxInt 949 x := v_0.Args[0] 950 y := v.Args[1] 951 v.reset(Op386LEAL1) 952 v.AuxInt = c 953 v.AddArg(x) 954 v.AddArg(y) 955 return true 956 } 957 // match: (ADDL x (ADDLconst [c] y)) 958 // cond: 959 // result: (LEAL1 [c] x y) 960 for { 961 x := v.Args[0] 962 v_1 := v.Args[1] 963 if v_1.Op != Op386ADDLconst { 964 break 965 } 966 c := v_1.AuxInt 967 y := v_1.Args[0] 968 v.reset(Op386LEAL1) 969 v.AuxInt = c 970 v.AddArg(x) 971 v.AddArg(y) 972 return true 973 } 974 // match: (ADDL x (LEAL [c] {s} y)) 975 // cond: x.Op != OpSB && y.Op != OpSB 976 // result: (LEAL1 [c] {s} x y) 977 for { 978 x := v.Args[0] 979 v_1 := v.Args[1] 980 if v_1.Op != Op386LEAL { 981 break 982 } 983 c := v_1.AuxInt 984 s := v_1.Aux 985 y := v_1.Args[0] 986 if !(x.Op != OpSB && y.Op != OpSB) { 987 break 988 } 989 v.reset(Op386LEAL1) 990 v.AuxInt = c 991 v.Aux = s 992 v.AddArg(x) 993 v.AddArg(y) 994 return true 995 } 996 // match: (ADDL (LEAL [c] {s} x) y) 997 // cond: x.Op != OpSB && y.Op != OpSB 998 // result: (LEAL1 [c] {s} x y) 999 for { 1000 v_0 := v.Args[0] 1001 if v_0.Op != Op386LEAL { 1002 break 1003 } 1004 c := v_0.AuxInt 1005 s := v_0.Aux 1006 x := v_0.Args[0] 1007 y := v.Args[1] 1008 if !(x.Op != OpSB && y.Op != OpSB) { 1009 break 1010 } 1011 v.reset(Op386LEAL1) 1012 v.AuxInt = c 1013 v.Aux = s 1014 v.AddArg(x) 1015 v.AddArg(y) 1016 return true 1017 } 1018 // match: (ADDL x (NEGL y)) 1019 // cond: 1020 // result: (SUBL x y) 1021 for { 1022 x := v.Args[0] 1023 v_1 := v.Args[1] 1024 if v_1.Op != Op386NEGL { 1025 break 1026 } 1027 y := v_1.Args[0] 1028 v.reset(Op386SUBL) 1029 v.AddArg(x) 1030 v.AddArg(y) 1031 return true 1032 } 1033 return false 1034 } 1035 func rewriteValue386_Op386ADDLcarry(v *Value, config *Config) bool { 1036 b := v.Block 1037 _ = b 1038 // match: (ADDLcarry x (MOVLconst [c])) 1039 // cond: 1040 // result: (ADDLconstcarry [c] x) 1041 for { 1042 x := v.Args[0] 1043 v_1 := v.Args[1] 1044 if v_1.Op != Op386MOVLconst { 1045 break 1046 } 1047 c := v_1.AuxInt 1048 v.reset(Op386ADDLconstcarry) 1049 v.AuxInt = c 1050 v.AddArg(x) 1051 return true 1052 } 1053 // match: (ADDLcarry (MOVLconst [c]) x) 1054 // cond: 1055 // result: (ADDLconstcarry [c] x) 1056 for { 1057 v_0 := v.Args[0] 1058 if v_0.Op != Op386MOVLconst { 1059 break 1060 } 1061 c := v_0.AuxInt 1062 x := v.Args[1] 1063 v.reset(Op386ADDLconstcarry) 1064 v.AuxInt = c 1065 v.AddArg(x) 1066 return true 1067 } 1068 return false 1069 } 1070 func rewriteValue386_Op386ADDLconst(v *Value, config *Config) bool { 1071 b := v.Block 1072 _ = b 1073 // match: (ADDLconst [c] (ADDL x y)) 1074 // cond: 1075 // result: (LEAL1 [c] x y) 1076 for { 1077 c := v.AuxInt 1078 v_0 := v.Args[0] 1079 if v_0.Op != Op386ADDL { 1080 break 1081 } 1082 x := v_0.Args[0] 1083 y := v_0.Args[1] 1084 v.reset(Op386LEAL1) 1085 v.AuxInt = c 1086 v.AddArg(x) 1087 v.AddArg(y) 1088 return true 1089 } 1090 // match: (ADDLconst [c] (LEAL [d] {s} x)) 1091 // cond: is32Bit(c+d) 1092 // result: (LEAL [c+d] {s} x) 1093 for { 1094 c := v.AuxInt 1095 v_0 := v.Args[0] 1096 if v_0.Op != Op386LEAL { 1097 break 1098 } 1099 d := v_0.AuxInt 1100 s := v_0.Aux 1101 x := v_0.Args[0] 1102 if !(is32Bit(c + d)) { 1103 break 1104 } 1105 v.reset(Op386LEAL) 1106 v.AuxInt = c + d 1107 v.Aux = s 1108 v.AddArg(x) 1109 return true 1110 } 1111 // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) 1112 // cond: is32Bit(c+d) 1113 // result: (LEAL1 [c+d] {s} x y) 1114 for { 1115 c := v.AuxInt 1116 v_0 := v.Args[0] 1117 if v_0.Op != Op386LEAL1 { 1118 break 1119 } 1120 d := v_0.AuxInt 1121 s := v_0.Aux 1122 x := v_0.Args[0] 1123 y := v_0.Args[1] 1124 if !(is32Bit(c + d)) { 1125 break 1126 } 1127 v.reset(Op386LEAL1) 1128 v.AuxInt = c + d 1129 v.Aux = s 1130 v.AddArg(x) 1131 v.AddArg(y) 1132 return true 1133 } 1134 // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) 1135 // cond: is32Bit(c+d) 1136 // result: (LEAL2 [c+d] {s} x y) 1137 for { 1138 c := v.AuxInt 1139 v_0 := v.Args[0] 1140 if v_0.Op != Op386LEAL2 { 1141 break 1142 } 1143 d := v_0.AuxInt 1144 s := v_0.Aux 1145 x := v_0.Args[0] 1146 y := v_0.Args[1] 1147 if !(is32Bit(c + d)) { 1148 break 1149 } 1150 v.reset(Op386LEAL2) 1151 v.AuxInt = c + d 1152 v.Aux = s 1153 v.AddArg(x) 1154 v.AddArg(y) 1155 return true 1156 } 1157 // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) 1158 // cond: is32Bit(c+d) 1159 // result: (LEAL4 [c+d] {s} x y) 1160 for { 1161 c := v.AuxInt 1162 v_0 := v.Args[0] 1163 if v_0.Op != Op386LEAL4 { 1164 break 1165 } 1166 d := v_0.AuxInt 1167 s := v_0.Aux 1168 x := v_0.Args[0] 1169 y := v_0.Args[1] 1170 if !(is32Bit(c + d)) { 1171 break 1172 } 1173 v.reset(Op386LEAL4) 1174 v.AuxInt = c + d 1175 v.Aux = s 1176 v.AddArg(x) 1177 v.AddArg(y) 1178 return true 1179 } 1180 // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) 1181 // cond: is32Bit(c+d) 1182 // result: (LEAL8 [c+d] {s} x y) 1183 for { 1184 c := v.AuxInt 1185 v_0 := v.Args[0] 1186 if v_0.Op != Op386LEAL8 { 1187 break 1188 } 1189 d := v_0.AuxInt 1190 s := v_0.Aux 1191 x := v_0.Args[0] 1192 y := v_0.Args[1] 1193 if !(is32Bit(c + d)) { 1194 break 1195 } 1196 v.reset(Op386LEAL8) 1197 v.AuxInt = c + d 1198 v.Aux = s 1199 v.AddArg(x) 1200 v.AddArg(y) 1201 return true 1202 } 1203 // match: (ADDLconst [c] x) 1204 // cond: int32(c)==0 1205 // result: x 1206 for { 1207 c := v.AuxInt 1208 x := v.Args[0] 1209 if !(int32(c) == 0) { 1210 break 1211 } 1212 v.reset(OpCopy) 1213 v.Type = x.Type 1214 v.AddArg(x) 1215 return true 1216 } 1217 // match: (ADDLconst [c] (MOVLconst [d])) 1218 // cond: 1219 // result: (MOVLconst [int64(int32(c+d))]) 1220 for { 1221 c := v.AuxInt 1222 v_0 := v.Args[0] 1223 if v_0.Op != Op386MOVLconst { 1224 break 1225 } 1226 d := v_0.AuxInt 1227 v.reset(Op386MOVLconst) 1228 v.AuxInt = int64(int32(c + d)) 1229 return true 1230 } 1231 // match: (ADDLconst [c] (ADDLconst [d] x)) 1232 // cond: 1233 // result: (ADDLconst [int64(int32(c+d))] x) 1234 for { 1235 c := v.AuxInt 1236 v_0 := v.Args[0] 1237 if v_0.Op != Op386ADDLconst { 1238 break 1239 } 1240 d := v_0.AuxInt 1241 x := v_0.Args[0] 1242 v.reset(Op386ADDLconst) 1243 v.AuxInt = int64(int32(c + d)) 1244 v.AddArg(x) 1245 return true 1246 } 1247 return false 1248 } 1249 func rewriteValue386_Op386ANDL(v *Value, config *Config) bool { 1250 b := v.Block 1251 _ = b 1252 // match: (ANDL x (MOVLconst [c])) 1253 // cond: 1254 // result: (ANDLconst [c] x) 1255 for { 1256 x := v.Args[0] 1257 v_1 := v.Args[1] 1258 if v_1.Op != Op386MOVLconst { 1259 break 1260 } 1261 c := v_1.AuxInt 1262 v.reset(Op386ANDLconst) 1263 v.AuxInt = c 1264 v.AddArg(x) 1265 return true 1266 } 1267 // match: (ANDL (MOVLconst [c]) x) 1268 // cond: 1269 // result: (ANDLconst [c] x) 1270 for { 1271 v_0 := v.Args[0] 1272 if v_0.Op != Op386MOVLconst { 1273 break 1274 } 1275 c := v_0.AuxInt 1276 x := v.Args[1] 1277 v.reset(Op386ANDLconst) 1278 v.AuxInt = c 1279 v.AddArg(x) 1280 return true 1281 } 1282 // match: (ANDL x x) 1283 // cond: 1284 // result: x 1285 for { 1286 x := v.Args[0] 1287 if x != v.Args[1] { 1288 break 1289 } 1290 v.reset(OpCopy) 1291 v.Type = x.Type 1292 v.AddArg(x) 1293 return true 1294 } 1295 return false 1296 } 1297 func rewriteValue386_Op386ANDLconst(v *Value, config *Config) bool { 1298 b := v.Block 1299 _ = b 1300 // match: (ANDLconst [c] (ANDLconst [d] x)) 1301 // cond: 1302 // result: (ANDLconst [c & d] x) 1303 for { 1304 c := v.AuxInt 1305 v_0 := v.Args[0] 1306 if v_0.Op != Op386ANDLconst { 1307 break 1308 } 1309 d := v_0.AuxInt 1310 x := v_0.Args[0] 1311 v.reset(Op386ANDLconst) 1312 v.AuxInt = c & d 1313 v.AddArg(x) 1314 return true 1315 } 1316 // match: (ANDLconst [c] _) 1317 // cond: int32(c)==0 1318 // result: (MOVLconst [0]) 1319 for { 1320 c := v.AuxInt 1321 if !(int32(c) == 0) { 1322 break 1323 } 1324 v.reset(Op386MOVLconst) 1325 v.AuxInt = 0 1326 return true 1327 } 1328 // match: (ANDLconst [c] x) 1329 // cond: int32(c)==-1 1330 // result: x 1331 for { 1332 c := v.AuxInt 1333 x := v.Args[0] 1334 if !(int32(c) == -1) { 1335 break 1336 } 1337 v.reset(OpCopy) 1338 v.Type = x.Type 1339 v.AddArg(x) 1340 return true 1341 } 1342 // match: (ANDLconst [c] (MOVLconst [d])) 1343 // cond: 1344 // result: (MOVLconst [c&d]) 1345 for { 1346 c := v.AuxInt 1347 v_0 := v.Args[0] 1348 if v_0.Op != Op386MOVLconst { 1349 break 1350 } 1351 d := v_0.AuxInt 1352 v.reset(Op386MOVLconst) 1353 v.AuxInt = c & d 1354 return true 1355 } 1356 return false 1357 } 1358 func rewriteValue386_Op386CMPB(v *Value, config *Config) bool { 1359 b := v.Block 1360 _ = b 1361 // match: (CMPB x (MOVLconst [c])) 1362 // cond: 1363 // result: (CMPBconst x [int64(int8(c))]) 1364 for { 1365 x := v.Args[0] 1366 v_1 := v.Args[1] 1367 if v_1.Op != Op386MOVLconst { 1368 break 1369 } 1370 c := v_1.AuxInt 1371 v.reset(Op386CMPBconst) 1372 v.AuxInt = int64(int8(c)) 1373 v.AddArg(x) 1374 return true 1375 } 1376 // match: (CMPB (MOVLconst [c]) x) 1377 // cond: 1378 // result: (InvertFlags (CMPBconst x [int64(int8(c))])) 1379 for { 1380 v_0 := v.Args[0] 1381 if v_0.Op != Op386MOVLconst { 1382 break 1383 } 1384 c := v_0.AuxInt 1385 x := v.Args[1] 1386 v.reset(Op386InvertFlags) 1387 v0 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 1388 v0.AuxInt = int64(int8(c)) 1389 v0.AddArg(x) 1390 v.AddArg(v0) 1391 return true 1392 } 1393 return false 1394 } 1395 func rewriteValue386_Op386CMPBconst(v *Value, config *Config) bool { 1396 b := v.Block 1397 _ = b 1398 // match: (CMPBconst (MOVLconst [x]) [y]) 1399 // cond: int8(x)==int8(y) 1400 // result: (FlagEQ) 1401 for { 1402 y := v.AuxInt 1403 v_0 := v.Args[0] 1404 if v_0.Op != Op386MOVLconst { 1405 break 1406 } 1407 x := v_0.AuxInt 1408 if !(int8(x) == int8(y)) { 1409 break 1410 } 1411 v.reset(Op386FlagEQ) 1412 return true 1413 } 1414 // match: (CMPBconst (MOVLconst [x]) [y]) 1415 // cond: int8(x)<int8(y) && uint8(x)<uint8(y) 1416 // result: (FlagLT_ULT) 1417 for { 1418 y := v.AuxInt 1419 v_0 := v.Args[0] 1420 if v_0.Op != Op386MOVLconst { 1421 break 1422 } 1423 x := v_0.AuxInt 1424 if !(int8(x) < int8(y) && uint8(x) < uint8(y)) { 1425 break 1426 } 1427 v.reset(Op386FlagLT_ULT) 1428 return true 1429 } 1430 // match: (CMPBconst (MOVLconst [x]) [y]) 1431 // cond: int8(x)<int8(y) && uint8(x)>uint8(y) 1432 // result: (FlagLT_UGT) 1433 for { 1434 y := v.AuxInt 1435 v_0 := v.Args[0] 1436 if v_0.Op != Op386MOVLconst { 1437 break 1438 } 1439 x := v_0.AuxInt 1440 if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { 1441 break 1442 } 1443 v.reset(Op386FlagLT_UGT) 1444 return true 1445 } 1446 // match: (CMPBconst (MOVLconst [x]) [y]) 1447 // cond: int8(x)>int8(y) && uint8(x)<uint8(y) 1448 // result: (FlagGT_ULT) 1449 for { 1450 y := v.AuxInt 1451 v_0 := v.Args[0] 1452 if v_0.Op != Op386MOVLconst { 1453 break 1454 } 1455 x := v_0.AuxInt 1456 if !(int8(x) > int8(y) && uint8(x) < uint8(y)) { 1457 break 1458 } 1459 v.reset(Op386FlagGT_ULT) 1460 return true 1461 } 1462 // match: (CMPBconst (MOVLconst [x]) [y]) 1463 // cond: int8(x)>int8(y) && uint8(x)>uint8(y) 1464 // result: (FlagGT_UGT) 1465 for { 1466 y := v.AuxInt 1467 v_0 := v.Args[0] 1468 if v_0.Op != Op386MOVLconst { 1469 break 1470 } 1471 x := v_0.AuxInt 1472 if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { 1473 break 1474 } 1475 v.reset(Op386FlagGT_UGT) 1476 return true 1477 } 1478 // match: (CMPBconst (ANDLconst _ [m]) [n]) 1479 // cond: 0 <= int8(m) && int8(m) < int8(n) 1480 // result: (FlagLT_ULT) 1481 for { 1482 n := v.AuxInt 1483 v_0 := v.Args[0] 1484 if v_0.Op != Op386ANDLconst { 1485 break 1486 } 1487 m := v_0.AuxInt 1488 if !(0 <= int8(m) && int8(m) < int8(n)) { 1489 break 1490 } 1491 v.reset(Op386FlagLT_ULT) 1492 return true 1493 } 1494 // match: (CMPBconst (ANDL x y) [0]) 1495 // cond: 1496 // result: (TESTB x y) 1497 for { 1498 if v.AuxInt != 0 { 1499 break 1500 } 1501 v_0 := v.Args[0] 1502 if v_0.Op != Op386ANDL { 1503 break 1504 } 1505 x := v_0.Args[0] 1506 y := v_0.Args[1] 1507 v.reset(Op386TESTB) 1508 v.AddArg(x) 1509 v.AddArg(y) 1510 return true 1511 } 1512 // match: (CMPBconst (ANDLconst [c] x) [0]) 1513 // cond: 1514 // result: (TESTBconst [int64(int8(c))] x) 1515 for { 1516 if v.AuxInt != 0 { 1517 break 1518 } 1519 v_0 := v.Args[0] 1520 if v_0.Op != Op386ANDLconst { 1521 break 1522 } 1523 c := v_0.AuxInt 1524 x := v_0.Args[0] 1525 v.reset(Op386TESTBconst) 1526 v.AuxInt = int64(int8(c)) 1527 v.AddArg(x) 1528 return true 1529 } 1530 // match: (CMPBconst x [0]) 1531 // cond: 1532 // result: (TESTB x x) 1533 for { 1534 if v.AuxInt != 0 { 1535 break 1536 } 1537 x := v.Args[0] 1538 v.reset(Op386TESTB) 1539 v.AddArg(x) 1540 v.AddArg(x) 1541 return true 1542 } 1543 return false 1544 } 1545 func rewriteValue386_Op386CMPL(v *Value, config *Config) bool { 1546 b := v.Block 1547 _ = b 1548 // match: (CMPL x (MOVLconst [c])) 1549 // cond: 1550 // result: (CMPLconst x [c]) 1551 for { 1552 x := v.Args[0] 1553 v_1 := v.Args[1] 1554 if v_1.Op != Op386MOVLconst { 1555 break 1556 } 1557 c := v_1.AuxInt 1558 v.reset(Op386CMPLconst) 1559 v.AuxInt = c 1560 v.AddArg(x) 1561 return true 1562 } 1563 // match: (CMPL (MOVLconst [c]) x) 1564 // cond: 1565 // result: (InvertFlags (CMPLconst x [c])) 1566 for { 1567 v_0 := v.Args[0] 1568 if v_0.Op != Op386MOVLconst { 1569 break 1570 } 1571 c := v_0.AuxInt 1572 x := v.Args[1] 1573 v.reset(Op386InvertFlags) 1574 v0 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 1575 v0.AuxInt = c 1576 v0.AddArg(x) 1577 v.AddArg(v0) 1578 return true 1579 } 1580 return false 1581 } 1582 func rewriteValue386_Op386CMPLconst(v *Value, config *Config) bool { 1583 b := v.Block 1584 _ = b 1585 // match: (CMPLconst (MOVLconst [x]) [y]) 1586 // cond: int32(x)==int32(y) 1587 // result: (FlagEQ) 1588 for { 1589 y := v.AuxInt 1590 v_0 := v.Args[0] 1591 if v_0.Op != Op386MOVLconst { 1592 break 1593 } 1594 x := v_0.AuxInt 1595 if !(int32(x) == int32(y)) { 1596 break 1597 } 1598 v.reset(Op386FlagEQ) 1599 return true 1600 } 1601 // match: (CMPLconst (MOVLconst [x]) [y]) 1602 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 1603 // result: (FlagLT_ULT) 1604 for { 1605 y := v.AuxInt 1606 v_0 := v.Args[0] 1607 if v_0.Op != Op386MOVLconst { 1608 break 1609 } 1610 x := v_0.AuxInt 1611 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 1612 break 1613 } 1614 v.reset(Op386FlagLT_ULT) 1615 return true 1616 } 1617 // match: (CMPLconst (MOVLconst [x]) [y]) 1618 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 1619 // result: (FlagLT_UGT) 1620 for { 1621 y := v.AuxInt 1622 v_0 := v.Args[0] 1623 if v_0.Op != Op386MOVLconst { 1624 break 1625 } 1626 x := v_0.AuxInt 1627 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 1628 break 1629 } 1630 v.reset(Op386FlagLT_UGT) 1631 return true 1632 } 1633 // match: (CMPLconst (MOVLconst [x]) [y]) 1634 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 1635 // result: (FlagGT_ULT) 1636 for { 1637 y := v.AuxInt 1638 v_0 := v.Args[0] 1639 if v_0.Op != Op386MOVLconst { 1640 break 1641 } 1642 x := v_0.AuxInt 1643 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 1644 break 1645 } 1646 v.reset(Op386FlagGT_ULT) 1647 return true 1648 } 1649 // match: (CMPLconst (MOVLconst [x]) [y]) 1650 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 1651 // result: (FlagGT_UGT) 1652 for { 1653 y := v.AuxInt 1654 v_0 := v.Args[0] 1655 if v_0.Op != Op386MOVLconst { 1656 break 1657 } 1658 x := v_0.AuxInt 1659 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 1660 break 1661 } 1662 v.reset(Op386FlagGT_UGT) 1663 return true 1664 } 1665 // match: (CMPLconst (SHRLconst _ [c]) [n]) 1666 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 1667 // result: (FlagLT_ULT) 1668 for { 1669 n := v.AuxInt 1670 v_0 := v.Args[0] 1671 if v_0.Op != Op386SHRLconst { 1672 break 1673 } 1674 c := v_0.AuxInt 1675 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 1676 break 1677 } 1678 v.reset(Op386FlagLT_ULT) 1679 return true 1680 } 1681 // match: (CMPLconst (ANDLconst _ [m]) [n]) 1682 // cond: 0 <= int32(m) && int32(m) < int32(n) 1683 // result: (FlagLT_ULT) 1684 for { 1685 n := v.AuxInt 1686 v_0 := v.Args[0] 1687 if v_0.Op != Op386ANDLconst { 1688 break 1689 } 1690 m := v_0.AuxInt 1691 if !(0 <= int32(m) && int32(m) < int32(n)) { 1692 break 1693 } 1694 v.reset(Op386FlagLT_ULT) 1695 return true 1696 } 1697 // match: (CMPLconst (ANDL x y) [0]) 1698 // cond: 1699 // result: (TESTL x y) 1700 for { 1701 if v.AuxInt != 0 { 1702 break 1703 } 1704 v_0 := v.Args[0] 1705 if v_0.Op != Op386ANDL { 1706 break 1707 } 1708 x := v_0.Args[0] 1709 y := v_0.Args[1] 1710 v.reset(Op386TESTL) 1711 v.AddArg(x) 1712 v.AddArg(y) 1713 return true 1714 } 1715 // match: (CMPLconst (ANDLconst [c] x) [0]) 1716 // cond: 1717 // result: (TESTLconst [c] x) 1718 for { 1719 if v.AuxInt != 0 { 1720 break 1721 } 1722 v_0 := v.Args[0] 1723 if v_0.Op != Op386ANDLconst { 1724 break 1725 } 1726 c := v_0.AuxInt 1727 x := v_0.Args[0] 1728 v.reset(Op386TESTLconst) 1729 v.AuxInt = c 1730 v.AddArg(x) 1731 return true 1732 } 1733 // match: (CMPLconst x [0]) 1734 // cond: 1735 // result: (TESTL x x) 1736 for { 1737 if v.AuxInt != 0 { 1738 break 1739 } 1740 x := v.Args[0] 1741 v.reset(Op386TESTL) 1742 v.AddArg(x) 1743 v.AddArg(x) 1744 return true 1745 } 1746 return false 1747 } 1748 func rewriteValue386_Op386CMPW(v *Value, config *Config) bool { 1749 b := v.Block 1750 _ = b 1751 // match: (CMPW x (MOVLconst [c])) 1752 // cond: 1753 // result: (CMPWconst x [int64(int16(c))]) 1754 for { 1755 x := v.Args[0] 1756 v_1 := v.Args[1] 1757 if v_1.Op != Op386MOVLconst { 1758 break 1759 } 1760 c := v_1.AuxInt 1761 v.reset(Op386CMPWconst) 1762 v.AuxInt = int64(int16(c)) 1763 v.AddArg(x) 1764 return true 1765 } 1766 // match: (CMPW (MOVLconst [c]) x) 1767 // cond: 1768 // result: (InvertFlags (CMPWconst x [int64(int16(c))])) 1769 for { 1770 v_0 := v.Args[0] 1771 if v_0.Op != Op386MOVLconst { 1772 break 1773 } 1774 c := v_0.AuxInt 1775 x := v.Args[1] 1776 v.reset(Op386InvertFlags) 1777 v0 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 1778 v0.AuxInt = int64(int16(c)) 1779 v0.AddArg(x) 1780 v.AddArg(v0) 1781 return true 1782 } 1783 return false 1784 } 1785 func rewriteValue386_Op386CMPWconst(v *Value, config *Config) bool { 1786 b := v.Block 1787 _ = b 1788 // match: (CMPWconst (MOVLconst [x]) [y]) 1789 // cond: int16(x)==int16(y) 1790 // result: (FlagEQ) 1791 for { 1792 y := v.AuxInt 1793 v_0 := v.Args[0] 1794 if v_0.Op != Op386MOVLconst { 1795 break 1796 } 1797 x := v_0.AuxInt 1798 if !(int16(x) == int16(y)) { 1799 break 1800 } 1801 v.reset(Op386FlagEQ) 1802 return true 1803 } 1804 // match: (CMPWconst (MOVLconst [x]) [y]) 1805 // cond: int16(x)<int16(y) && uint16(x)<uint16(y) 1806 // result: (FlagLT_ULT) 1807 for { 1808 y := v.AuxInt 1809 v_0 := v.Args[0] 1810 if v_0.Op != Op386MOVLconst { 1811 break 1812 } 1813 x := v_0.AuxInt 1814 if !(int16(x) < int16(y) && uint16(x) < uint16(y)) { 1815 break 1816 } 1817 v.reset(Op386FlagLT_ULT) 1818 return true 1819 } 1820 // match: (CMPWconst (MOVLconst [x]) [y]) 1821 // cond: int16(x)<int16(y) && uint16(x)>uint16(y) 1822 // result: (FlagLT_UGT) 1823 for { 1824 y := v.AuxInt 1825 v_0 := v.Args[0] 1826 if v_0.Op != Op386MOVLconst { 1827 break 1828 } 1829 x := v_0.AuxInt 1830 if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { 1831 break 1832 } 1833 v.reset(Op386FlagLT_UGT) 1834 return true 1835 } 1836 // match: (CMPWconst (MOVLconst [x]) [y]) 1837 // cond: int16(x)>int16(y) && uint16(x)<uint16(y) 1838 // result: (FlagGT_ULT) 1839 for { 1840 y := v.AuxInt 1841 v_0 := v.Args[0] 1842 if v_0.Op != Op386MOVLconst { 1843 break 1844 } 1845 x := v_0.AuxInt 1846 if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { 1847 break 1848 } 1849 v.reset(Op386FlagGT_ULT) 1850 return true 1851 } 1852 // match: (CMPWconst (MOVLconst [x]) [y]) 1853 // cond: int16(x)>int16(y) && uint16(x)>uint16(y) 1854 // result: (FlagGT_UGT) 1855 for { 1856 y := v.AuxInt 1857 v_0 := v.Args[0] 1858 if v_0.Op != Op386MOVLconst { 1859 break 1860 } 1861 x := v_0.AuxInt 1862 if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { 1863 break 1864 } 1865 v.reset(Op386FlagGT_UGT) 1866 return true 1867 } 1868 // match: (CMPWconst (ANDLconst _ [m]) [n]) 1869 // cond: 0 <= int16(m) && int16(m) < int16(n) 1870 // result: (FlagLT_ULT) 1871 for { 1872 n := v.AuxInt 1873 v_0 := v.Args[0] 1874 if v_0.Op != Op386ANDLconst { 1875 break 1876 } 1877 m := v_0.AuxInt 1878 if !(0 <= int16(m) && int16(m) < int16(n)) { 1879 break 1880 } 1881 v.reset(Op386FlagLT_ULT) 1882 return true 1883 } 1884 // match: (CMPWconst (ANDL x y) [0]) 1885 // cond: 1886 // result: (TESTW x y) 1887 for { 1888 if v.AuxInt != 0 { 1889 break 1890 } 1891 v_0 := v.Args[0] 1892 if v_0.Op != Op386ANDL { 1893 break 1894 } 1895 x := v_0.Args[0] 1896 y := v_0.Args[1] 1897 v.reset(Op386TESTW) 1898 v.AddArg(x) 1899 v.AddArg(y) 1900 return true 1901 } 1902 // match: (CMPWconst (ANDLconst [c] x) [0]) 1903 // cond: 1904 // result: (TESTWconst [int64(int16(c))] x) 1905 for { 1906 if v.AuxInt != 0 { 1907 break 1908 } 1909 v_0 := v.Args[0] 1910 if v_0.Op != Op386ANDLconst { 1911 break 1912 } 1913 c := v_0.AuxInt 1914 x := v_0.Args[0] 1915 v.reset(Op386TESTWconst) 1916 v.AuxInt = int64(int16(c)) 1917 v.AddArg(x) 1918 return true 1919 } 1920 // match: (CMPWconst x [0]) 1921 // cond: 1922 // result: (TESTW x x) 1923 for { 1924 if v.AuxInt != 0 { 1925 break 1926 } 1927 x := v.Args[0] 1928 v.reset(Op386TESTW) 1929 v.AddArg(x) 1930 v.AddArg(x) 1931 return true 1932 } 1933 return false 1934 } 1935 func rewriteValue386_Op386LEAL(v *Value, config *Config) bool { 1936 b := v.Block 1937 _ = b 1938 // match: (LEAL [c] {s} (ADDLconst [d] x)) 1939 // cond: is32Bit(c+d) 1940 // result: (LEAL [c+d] {s} x) 1941 for { 1942 c := v.AuxInt 1943 s := v.Aux 1944 v_0 := v.Args[0] 1945 if v_0.Op != Op386ADDLconst { 1946 break 1947 } 1948 d := v_0.AuxInt 1949 x := v_0.Args[0] 1950 if !(is32Bit(c + d)) { 1951 break 1952 } 1953 v.reset(Op386LEAL) 1954 v.AuxInt = c + d 1955 v.Aux = s 1956 v.AddArg(x) 1957 return true 1958 } 1959 // match: (LEAL [c] {s} (ADDL x y)) 1960 // cond: x.Op != OpSB && y.Op != OpSB 1961 // result: (LEAL1 [c] {s} x y) 1962 for { 1963 c := v.AuxInt 1964 s := v.Aux 1965 v_0 := v.Args[0] 1966 if v_0.Op != Op386ADDL { 1967 break 1968 } 1969 x := v_0.Args[0] 1970 y := v_0.Args[1] 1971 if !(x.Op != OpSB && y.Op != OpSB) { 1972 break 1973 } 1974 v.reset(Op386LEAL1) 1975 v.AuxInt = c 1976 v.Aux = s 1977 v.AddArg(x) 1978 v.AddArg(y) 1979 return true 1980 } 1981 // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) 1982 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 1983 // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) 1984 for { 1985 off1 := v.AuxInt 1986 sym1 := v.Aux 1987 v_0 := v.Args[0] 1988 if v_0.Op != Op386LEAL { 1989 break 1990 } 1991 off2 := v_0.AuxInt 1992 sym2 := v_0.Aux 1993 x := v_0.Args[0] 1994 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 1995 break 1996 } 1997 v.reset(Op386LEAL) 1998 v.AuxInt = off1 + off2 1999 v.Aux = mergeSym(sym1, sym2) 2000 v.AddArg(x) 2001 return true 2002 } 2003 // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) 2004 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2005 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2006 for { 2007 off1 := v.AuxInt 2008 sym1 := v.Aux 2009 v_0 := v.Args[0] 2010 if v_0.Op != Op386LEAL1 { 2011 break 2012 } 2013 off2 := v_0.AuxInt 2014 sym2 := v_0.Aux 2015 x := v_0.Args[0] 2016 y := v_0.Args[1] 2017 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2018 break 2019 } 2020 v.reset(Op386LEAL1) 2021 v.AuxInt = off1 + off2 2022 v.Aux = mergeSym(sym1, sym2) 2023 v.AddArg(x) 2024 v.AddArg(y) 2025 return true 2026 } 2027 // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) 2028 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2029 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2030 for { 2031 off1 := v.AuxInt 2032 sym1 := v.Aux 2033 v_0 := v.Args[0] 2034 if v_0.Op != Op386LEAL2 { 2035 break 2036 } 2037 off2 := v_0.AuxInt 2038 sym2 := v_0.Aux 2039 x := v_0.Args[0] 2040 y := v_0.Args[1] 2041 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2042 break 2043 } 2044 v.reset(Op386LEAL2) 2045 v.AuxInt = off1 + off2 2046 v.Aux = mergeSym(sym1, sym2) 2047 v.AddArg(x) 2048 v.AddArg(y) 2049 return true 2050 } 2051 // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) 2052 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2053 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2054 for { 2055 off1 := v.AuxInt 2056 sym1 := v.Aux 2057 v_0 := v.Args[0] 2058 if v_0.Op != Op386LEAL4 { 2059 break 2060 } 2061 off2 := v_0.AuxInt 2062 sym2 := v_0.Aux 2063 x := v_0.Args[0] 2064 y := v_0.Args[1] 2065 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2066 break 2067 } 2068 v.reset(Op386LEAL4) 2069 v.AuxInt = off1 + off2 2070 v.Aux = mergeSym(sym1, sym2) 2071 v.AddArg(x) 2072 v.AddArg(y) 2073 return true 2074 } 2075 // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) 2076 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2077 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2078 for { 2079 off1 := v.AuxInt 2080 sym1 := v.Aux 2081 v_0 := v.Args[0] 2082 if v_0.Op != Op386LEAL8 { 2083 break 2084 } 2085 off2 := v_0.AuxInt 2086 sym2 := v_0.Aux 2087 x := v_0.Args[0] 2088 y := v_0.Args[1] 2089 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2090 break 2091 } 2092 v.reset(Op386LEAL8) 2093 v.AuxInt = off1 + off2 2094 v.Aux = mergeSym(sym1, sym2) 2095 v.AddArg(x) 2096 v.AddArg(y) 2097 return true 2098 } 2099 return false 2100 } 2101 func rewriteValue386_Op386LEAL1(v *Value, config *Config) bool { 2102 b := v.Block 2103 _ = b 2104 // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) 2105 // cond: is32Bit(c+d) && x.Op != OpSB 2106 // result: (LEAL1 [c+d] {s} x y) 2107 for { 2108 c := v.AuxInt 2109 s := v.Aux 2110 v_0 := v.Args[0] 2111 if v_0.Op != Op386ADDLconst { 2112 break 2113 } 2114 d := v_0.AuxInt 2115 x := v_0.Args[0] 2116 y := v.Args[1] 2117 if !(is32Bit(c+d) && x.Op != OpSB) { 2118 break 2119 } 2120 v.reset(Op386LEAL1) 2121 v.AuxInt = c + d 2122 v.Aux = s 2123 v.AddArg(x) 2124 v.AddArg(y) 2125 return true 2126 } 2127 // match: (LEAL1 [c] {s} x (ADDLconst [d] y)) 2128 // cond: is32Bit(c+d) && y.Op != OpSB 2129 // result: (LEAL1 [c+d] {s} x y) 2130 for { 2131 c := v.AuxInt 2132 s := v.Aux 2133 x := v.Args[0] 2134 v_1 := v.Args[1] 2135 if v_1.Op != Op386ADDLconst { 2136 break 2137 } 2138 d := v_1.AuxInt 2139 y := v_1.Args[0] 2140 if !(is32Bit(c+d) && y.Op != OpSB) { 2141 break 2142 } 2143 v.reset(Op386LEAL1) 2144 v.AuxInt = c + d 2145 v.Aux = s 2146 v.AddArg(x) 2147 v.AddArg(y) 2148 return true 2149 } 2150 // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) 2151 // cond: 2152 // result: (LEAL2 [c] {s} x y) 2153 for { 2154 c := v.AuxInt 2155 s := v.Aux 2156 x := v.Args[0] 2157 v_1 := v.Args[1] 2158 if v_1.Op != Op386SHLLconst { 2159 break 2160 } 2161 if v_1.AuxInt != 1 { 2162 break 2163 } 2164 y := v_1.Args[0] 2165 v.reset(Op386LEAL2) 2166 v.AuxInt = c 2167 v.Aux = s 2168 v.AddArg(x) 2169 v.AddArg(y) 2170 return true 2171 } 2172 // match: (LEAL1 [c] {s} (SHLLconst [1] x) y) 2173 // cond: 2174 // result: (LEAL2 [c] {s} y x) 2175 for { 2176 c := v.AuxInt 2177 s := v.Aux 2178 v_0 := v.Args[0] 2179 if v_0.Op != Op386SHLLconst { 2180 break 2181 } 2182 if v_0.AuxInt != 1 { 2183 break 2184 } 2185 x := v_0.Args[0] 2186 y := v.Args[1] 2187 v.reset(Op386LEAL2) 2188 v.AuxInt = c 2189 v.Aux = s 2190 v.AddArg(y) 2191 v.AddArg(x) 2192 return true 2193 } 2194 // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) 2195 // cond: 2196 // result: (LEAL4 [c] {s} x y) 2197 for { 2198 c := v.AuxInt 2199 s := v.Aux 2200 x := v.Args[0] 2201 v_1 := v.Args[1] 2202 if v_1.Op != Op386SHLLconst { 2203 break 2204 } 2205 if v_1.AuxInt != 2 { 2206 break 2207 } 2208 y := v_1.Args[0] 2209 v.reset(Op386LEAL4) 2210 v.AuxInt = c 2211 v.Aux = s 2212 v.AddArg(x) 2213 v.AddArg(y) 2214 return true 2215 } 2216 // match: (LEAL1 [c] {s} (SHLLconst [2] x) y) 2217 // cond: 2218 // result: (LEAL4 [c] {s} y x) 2219 for { 2220 c := v.AuxInt 2221 s := v.Aux 2222 v_0 := v.Args[0] 2223 if v_0.Op != Op386SHLLconst { 2224 break 2225 } 2226 if v_0.AuxInt != 2 { 2227 break 2228 } 2229 x := v_0.Args[0] 2230 y := v.Args[1] 2231 v.reset(Op386LEAL4) 2232 v.AuxInt = c 2233 v.Aux = s 2234 v.AddArg(y) 2235 v.AddArg(x) 2236 return true 2237 } 2238 // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) 2239 // cond: 2240 // result: (LEAL8 [c] {s} x y) 2241 for { 2242 c := v.AuxInt 2243 s := v.Aux 2244 x := v.Args[0] 2245 v_1 := v.Args[1] 2246 if v_1.Op != Op386SHLLconst { 2247 break 2248 } 2249 if v_1.AuxInt != 3 { 2250 break 2251 } 2252 y := v_1.Args[0] 2253 v.reset(Op386LEAL8) 2254 v.AuxInt = c 2255 v.Aux = s 2256 v.AddArg(x) 2257 v.AddArg(y) 2258 return true 2259 } 2260 // match: (LEAL1 [c] {s} (SHLLconst [3] x) y) 2261 // cond: 2262 // result: (LEAL8 [c] {s} y x) 2263 for { 2264 c := v.AuxInt 2265 s := v.Aux 2266 v_0 := v.Args[0] 2267 if v_0.Op != Op386SHLLconst { 2268 break 2269 } 2270 if v_0.AuxInt != 3 { 2271 break 2272 } 2273 x := v_0.Args[0] 2274 y := v.Args[1] 2275 v.reset(Op386LEAL8) 2276 v.AuxInt = c 2277 v.Aux = s 2278 v.AddArg(y) 2279 v.AddArg(x) 2280 return true 2281 } 2282 // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2283 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2284 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2285 for { 2286 off1 := v.AuxInt 2287 sym1 := v.Aux 2288 v_0 := v.Args[0] 2289 if v_0.Op != Op386LEAL { 2290 break 2291 } 2292 off2 := v_0.AuxInt 2293 sym2 := v_0.Aux 2294 x := v_0.Args[0] 2295 y := v.Args[1] 2296 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2297 break 2298 } 2299 v.reset(Op386LEAL1) 2300 v.AuxInt = off1 + off2 2301 v.Aux = mergeSym(sym1, sym2) 2302 v.AddArg(x) 2303 v.AddArg(y) 2304 return true 2305 } 2306 // match: (LEAL1 [off1] {sym1} x (LEAL [off2] {sym2} y)) 2307 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 2308 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2309 for { 2310 off1 := v.AuxInt 2311 sym1 := v.Aux 2312 x := v.Args[0] 2313 v_1 := v.Args[1] 2314 if v_1.Op != Op386LEAL { 2315 break 2316 } 2317 off2 := v_1.AuxInt 2318 sym2 := v_1.Aux 2319 y := v_1.Args[0] 2320 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 2321 break 2322 } 2323 v.reset(Op386LEAL1) 2324 v.AuxInt = off1 + off2 2325 v.Aux = mergeSym(sym1, sym2) 2326 v.AddArg(x) 2327 v.AddArg(y) 2328 return true 2329 } 2330 return false 2331 } 2332 func rewriteValue386_Op386LEAL2(v *Value, config *Config) bool { 2333 b := v.Block 2334 _ = b 2335 // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) 2336 // cond: is32Bit(c+d) && x.Op != OpSB 2337 // result: (LEAL2 [c+d] {s} x y) 2338 for { 2339 c := v.AuxInt 2340 s := v.Aux 2341 v_0 := v.Args[0] 2342 if v_0.Op != Op386ADDLconst { 2343 break 2344 } 2345 d := v_0.AuxInt 2346 x := v_0.Args[0] 2347 y := v.Args[1] 2348 if !(is32Bit(c+d) && x.Op != OpSB) { 2349 break 2350 } 2351 v.reset(Op386LEAL2) 2352 v.AuxInt = c + d 2353 v.Aux = s 2354 v.AddArg(x) 2355 v.AddArg(y) 2356 return true 2357 } 2358 // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) 2359 // cond: is32Bit(c+2*d) && y.Op != OpSB 2360 // result: (LEAL2 [c+2*d] {s} x y) 2361 for { 2362 c := v.AuxInt 2363 s := v.Aux 2364 x := v.Args[0] 2365 v_1 := v.Args[1] 2366 if v_1.Op != Op386ADDLconst { 2367 break 2368 } 2369 d := v_1.AuxInt 2370 y := v_1.Args[0] 2371 if !(is32Bit(c+2*d) && y.Op != OpSB) { 2372 break 2373 } 2374 v.reset(Op386LEAL2) 2375 v.AuxInt = c + 2*d 2376 v.Aux = s 2377 v.AddArg(x) 2378 v.AddArg(y) 2379 return true 2380 } 2381 // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) 2382 // cond: 2383 // result: (LEAL4 [c] {s} x y) 2384 for { 2385 c := v.AuxInt 2386 s := v.Aux 2387 x := v.Args[0] 2388 v_1 := v.Args[1] 2389 if v_1.Op != Op386SHLLconst { 2390 break 2391 } 2392 if v_1.AuxInt != 1 { 2393 break 2394 } 2395 y := v_1.Args[0] 2396 v.reset(Op386LEAL4) 2397 v.AuxInt = c 2398 v.Aux = s 2399 v.AddArg(x) 2400 v.AddArg(y) 2401 return true 2402 } 2403 // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) 2404 // cond: 2405 // result: (LEAL8 [c] {s} x y) 2406 for { 2407 c := v.AuxInt 2408 s := v.Aux 2409 x := v.Args[0] 2410 v_1 := v.Args[1] 2411 if v_1.Op != Op386SHLLconst { 2412 break 2413 } 2414 if v_1.AuxInt != 2 { 2415 break 2416 } 2417 y := v_1.Args[0] 2418 v.reset(Op386LEAL8) 2419 v.AuxInt = c 2420 v.Aux = s 2421 v.AddArg(x) 2422 v.AddArg(y) 2423 return true 2424 } 2425 // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2426 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2427 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2428 for { 2429 off1 := v.AuxInt 2430 sym1 := v.Aux 2431 v_0 := v.Args[0] 2432 if v_0.Op != Op386LEAL { 2433 break 2434 } 2435 off2 := v_0.AuxInt 2436 sym2 := v_0.Aux 2437 x := v_0.Args[0] 2438 y := v.Args[1] 2439 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2440 break 2441 } 2442 v.reset(Op386LEAL2) 2443 v.AuxInt = off1 + off2 2444 v.Aux = mergeSym(sym1, sym2) 2445 v.AddArg(x) 2446 v.AddArg(y) 2447 return true 2448 } 2449 return false 2450 } 2451 func rewriteValue386_Op386LEAL4(v *Value, config *Config) bool { 2452 b := v.Block 2453 _ = b 2454 // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) 2455 // cond: is32Bit(c+d) && x.Op != OpSB 2456 // result: (LEAL4 [c+d] {s} x y) 2457 for { 2458 c := v.AuxInt 2459 s := v.Aux 2460 v_0 := v.Args[0] 2461 if v_0.Op != Op386ADDLconst { 2462 break 2463 } 2464 d := v_0.AuxInt 2465 x := v_0.Args[0] 2466 y := v.Args[1] 2467 if !(is32Bit(c+d) && x.Op != OpSB) { 2468 break 2469 } 2470 v.reset(Op386LEAL4) 2471 v.AuxInt = c + d 2472 v.Aux = s 2473 v.AddArg(x) 2474 v.AddArg(y) 2475 return true 2476 } 2477 // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) 2478 // cond: is32Bit(c+4*d) && y.Op != OpSB 2479 // result: (LEAL4 [c+4*d] {s} x y) 2480 for { 2481 c := v.AuxInt 2482 s := v.Aux 2483 x := v.Args[0] 2484 v_1 := v.Args[1] 2485 if v_1.Op != Op386ADDLconst { 2486 break 2487 } 2488 d := v_1.AuxInt 2489 y := v_1.Args[0] 2490 if !(is32Bit(c+4*d) && y.Op != OpSB) { 2491 break 2492 } 2493 v.reset(Op386LEAL4) 2494 v.AuxInt = c + 4*d 2495 v.Aux = s 2496 v.AddArg(x) 2497 v.AddArg(y) 2498 return true 2499 } 2500 // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) 2501 // cond: 2502 // result: (LEAL8 [c] {s} x y) 2503 for { 2504 c := v.AuxInt 2505 s := v.Aux 2506 x := v.Args[0] 2507 v_1 := v.Args[1] 2508 if v_1.Op != Op386SHLLconst { 2509 break 2510 } 2511 if v_1.AuxInt != 1 { 2512 break 2513 } 2514 y := v_1.Args[0] 2515 v.reset(Op386LEAL8) 2516 v.AuxInt = c 2517 v.Aux = s 2518 v.AddArg(x) 2519 v.AddArg(y) 2520 return true 2521 } 2522 // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2523 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2524 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2525 for { 2526 off1 := v.AuxInt 2527 sym1 := v.Aux 2528 v_0 := v.Args[0] 2529 if v_0.Op != Op386LEAL { 2530 break 2531 } 2532 off2 := v_0.AuxInt 2533 sym2 := v_0.Aux 2534 x := v_0.Args[0] 2535 y := v.Args[1] 2536 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2537 break 2538 } 2539 v.reset(Op386LEAL4) 2540 v.AuxInt = off1 + off2 2541 v.Aux = mergeSym(sym1, sym2) 2542 v.AddArg(x) 2543 v.AddArg(y) 2544 return true 2545 } 2546 return false 2547 } 2548 func rewriteValue386_Op386LEAL8(v *Value, config *Config) bool { 2549 b := v.Block 2550 _ = b 2551 // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) 2552 // cond: is32Bit(c+d) && x.Op != OpSB 2553 // result: (LEAL8 [c+d] {s} x y) 2554 for { 2555 c := v.AuxInt 2556 s := v.Aux 2557 v_0 := v.Args[0] 2558 if v_0.Op != Op386ADDLconst { 2559 break 2560 } 2561 d := v_0.AuxInt 2562 x := v_0.Args[0] 2563 y := v.Args[1] 2564 if !(is32Bit(c+d) && x.Op != OpSB) { 2565 break 2566 } 2567 v.reset(Op386LEAL8) 2568 v.AuxInt = c + d 2569 v.Aux = s 2570 v.AddArg(x) 2571 v.AddArg(y) 2572 return true 2573 } 2574 // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) 2575 // cond: is32Bit(c+8*d) && y.Op != OpSB 2576 // result: (LEAL8 [c+8*d] {s} x y) 2577 for { 2578 c := v.AuxInt 2579 s := v.Aux 2580 x := v.Args[0] 2581 v_1 := v.Args[1] 2582 if v_1.Op != Op386ADDLconst { 2583 break 2584 } 2585 d := v_1.AuxInt 2586 y := v_1.Args[0] 2587 if !(is32Bit(c+8*d) && y.Op != OpSB) { 2588 break 2589 } 2590 v.reset(Op386LEAL8) 2591 v.AuxInt = c + 8*d 2592 v.Aux = s 2593 v.AddArg(x) 2594 v.AddArg(y) 2595 return true 2596 } 2597 // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2598 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2599 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2600 for { 2601 off1 := v.AuxInt 2602 sym1 := v.Aux 2603 v_0 := v.Args[0] 2604 if v_0.Op != Op386LEAL { 2605 break 2606 } 2607 off2 := v_0.AuxInt 2608 sym2 := v_0.Aux 2609 x := v_0.Args[0] 2610 y := v.Args[1] 2611 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2612 break 2613 } 2614 v.reset(Op386LEAL8) 2615 v.AuxInt = off1 + off2 2616 v.Aux = mergeSym(sym1, sym2) 2617 v.AddArg(x) 2618 v.AddArg(y) 2619 return true 2620 } 2621 return false 2622 } 2623 func rewriteValue386_Op386MOVBLSX(v *Value, config *Config) bool { 2624 b := v.Block 2625 _ = b 2626 // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) 2627 // cond: x.Uses == 1 && clobber(x) 2628 // result: @x.Block (MOVBLSXload <v.Type> [off] {sym} ptr mem) 2629 for { 2630 x := v.Args[0] 2631 if x.Op != Op386MOVBload { 2632 break 2633 } 2634 off := x.AuxInt 2635 sym := x.Aux 2636 ptr := x.Args[0] 2637 mem := x.Args[1] 2638 if !(x.Uses == 1 && clobber(x)) { 2639 break 2640 } 2641 b = x.Block 2642 v0 := b.NewValue0(v.Pos, Op386MOVBLSXload, v.Type) 2643 v.reset(OpCopy) 2644 v.AddArg(v0) 2645 v0.AuxInt = off 2646 v0.Aux = sym 2647 v0.AddArg(ptr) 2648 v0.AddArg(mem) 2649 return true 2650 } 2651 // match: (MOVBLSX (ANDLconst [c] x)) 2652 // cond: c & 0x80 == 0 2653 // result: (ANDLconst [c & 0x7f] x) 2654 for { 2655 v_0 := v.Args[0] 2656 if v_0.Op != Op386ANDLconst { 2657 break 2658 } 2659 c := v_0.AuxInt 2660 x := v_0.Args[0] 2661 if !(c&0x80 == 0) { 2662 break 2663 } 2664 v.reset(Op386ANDLconst) 2665 v.AuxInt = c & 0x7f 2666 v.AddArg(x) 2667 return true 2668 } 2669 return false 2670 } 2671 func rewriteValue386_Op386MOVBLSXload(v *Value, config *Config) bool { 2672 b := v.Block 2673 _ = b 2674 // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2675 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2676 // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2677 for { 2678 off1 := v.AuxInt 2679 sym1 := v.Aux 2680 v_0 := v.Args[0] 2681 if v_0.Op != Op386LEAL { 2682 break 2683 } 2684 off2 := v_0.AuxInt 2685 sym2 := v_0.Aux 2686 base := v_0.Args[0] 2687 mem := v.Args[1] 2688 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2689 break 2690 } 2691 v.reset(Op386MOVBLSXload) 2692 v.AuxInt = off1 + off2 2693 v.Aux = mergeSym(sym1, sym2) 2694 v.AddArg(base) 2695 v.AddArg(mem) 2696 return true 2697 } 2698 return false 2699 } 2700 func rewriteValue386_Op386MOVBLZX(v *Value, config *Config) bool { 2701 b := v.Block 2702 _ = b 2703 // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) 2704 // cond: x.Uses == 1 && clobber(x) 2705 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 2706 for { 2707 x := v.Args[0] 2708 if x.Op != Op386MOVBload { 2709 break 2710 } 2711 off := x.AuxInt 2712 sym := x.Aux 2713 ptr := x.Args[0] 2714 mem := x.Args[1] 2715 if !(x.Uses == 1 && clobber(x)) { 2716 break 2717 } 2718 b = x.Block 2719 v0 := b.NewValue0(v.Pos, Op386MOVBload, v.Type) 2720 v.reset(OpCopy) 2721 v.AddArg(v0) 2722 v0.AuxInt = off 2723 v0.Aux = sym 2724 v0.AddArg(ptr) 2725 v0.AddArg(mem) 2726 return true 2727 } 2728 // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) 2729 // cond: x.Uses == 1 && clobber(x) 2730 // result: @x.Block (MOVBloadidx1 <v.Type> [off] {sym} ptr idx mem) 2731 for { 2732 x := v.Args[0] 2733 if x.Op != Op386MOVBloadidx1 { 2734 break 2735 } 2736 off := x.AuxInt 2737 sym := x.Aux 2738 ptr := x.Args[0] 2739 idx := x.Args[1] 2740 mem := x.Args[2] 2741 if !(x.Uses == 1 && clobber(x)) { 2742 break 2743 } 2744 b = x.Block 2745 v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) 2746 v.reset(OpCopy) 2747 v.AddArg(v0) 2748 v0.AuxInt = off 2749 v0.Aux = sym 2750 v0.AddArg(ptr) 2751 v0.AddArg(idx) 2752 v0.AddArg(mem) 2753 return true 2754 } 2755 // match: (MOVBLZX (ANDLconst [c] x)) 2756 // cond: 2757 // result: (ANDLconst [c & 0xff] x) 2758 for { 2759 v_0 := v.Args[0] 2760 if v_0.Op != Op386ANDLconst { 2761 break 2762 } 2763 c := v_0.AuxInt 2764 x := v_0.Args[0] 2765 v.reset(Op386ANDLconst) 2766 v.AuxInt = c & 0xff 2767 v.AddArg(x) 2768 return true 2769 } 2770 return false 2771 } 2772 func rewriteValue386_Op386MOVBload(v *Value, config *Config) bool { 2773 b := v.Block 2774 _ = b 2775 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 2776 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 2777 // result: x 2778 for { 2779 off := v.AuxInt 2780 sym := v.Aux 2781 ptr := v.Args[0] 2782 v_1 := v.Args[1] 2783 if v_1.Op != Op386MOVBstore { 2784 break 2785 } 2786 off2 := v_1.AuxInt 2787 sym2 := v_1.Aux 2788 ptr2 := v_1.Args[0] 2789 x := v_1.Args[1] 2790 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 2791 break 2792 } 2793 v.reset(OpCopy) 2794 v.Type = x.Type 2795 v.AddArg(x) 2796 return true 2797 } 2798 // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) 2799 // cond: is32Bit(off1+off2) 2800 // result: (MOVBload [off1+off2] {sym} ptr mem) 2801 for { 2802 off1 := v.AuxInt 2803 sym := v.Aux 2804 v_0 := v.Args[0] 2805 if v_0.Op != Op386ADDLconst { 2806 break 2807 } 2808 off2 := v_0.AuxInt 2809 ptr := v_0.Args[0] 2810 mem := v.Args[1] 2811 if !(is32Bit(off1 + off2)) { 2812 break 2813 } 2814 v.reset(Op386MOVBload) 2815 v.AuxInt = off1 + off2 2816 v.Aux = sym 2817 v.AddArg(ptr) 2818 v.AddArg(mem) 2819 return true 2820 } 2821 // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2822 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2823 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2824 for { 2825 off1 := v.AuxInt 2826 sym1 := v.Aux 2827 v_0 := v.Args[0] 2828 if v_0.Op != Op386LEAL { 2829 break 2830 } 2831 off2 := v_0.AuxInt 2832 sym2 := v_0.Aux 2833 base := v_0.Args[0] 2834 mem := v.Args[1] 2835 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2836 break 2837 } 2838 v.reset(Op386MOVBload) 2839 v.AuxInt = off1 + off2 2840 v.Aux = mergeSym(sym1, sym2) 2841 v.AddArg(base) 2842 v.AddArg(mem) 2843 return true 2844 } 2845 // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 2846 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2847 // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 2848 for { 2849 off1 := v.AuxInt 2850 sym1 := v.Aux 2851 v_0 := v.Args[0] 2852 if v_0.Op != Op386LEAL1 { 2853 break 2854 } 2855 off2 := v_0.AuxInt 2856 sym2 := v_0.Aux 2857 ptr := v_0.Args[0] 2858 idx := v_0.Args[1] 2859 mem := v.Args[1] 2860 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2861 break 2862 } 2863 v.reset(Op386MOVBloadidx1) 2864 v.AuxInt = off1 + off2 2865 v.Aux = mergeSym(sym1, sym2) 2866 v.AddArg(ptr) 2867 v.AddArg(idx) 2868 v.AddArg(mem) 2869 return true 2870 } 2871 // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) 2872 // cond: ptr.Op != OpSB 2873 // result: (MOVBloadidx1 [off] {sym} ptr idx mem) 2874 for { 2875 off := v.AuxInt 2876 sym := v.Aux 2877 v_0 := v.Args[0] 2878 if v_0.Op != Op386ADDL { 2879 break 2880 } 2881 ptr := v_0.Args[0] 2882 idx := v_0.Args[1] 2883 mem := v.Args[1] 2884 if !(ptr.Op != OpSB) { 2885 break 2886 } 2887 v.reset(Op386MOVBloadidx1) 2888 v.AuxInt = off 2889 v.Aux = sym 2890 v.AddArg(ptr) 2891 v.AddArg(idx) 2892 v.AddArg(mem) 2893 return true 2894 } 2895 return false 2896 } 2897 func rewriteValue386_Op386MOVBloadidx1(v *Value, config *Config) bool { 2898 b := v.Block 2899 _ = b 2900 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 2901 // cond: 2902 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 2903 for { 2904 c := v.AuxInt 2905 sym := v.Aux 2906 v_0 := v.Args[0] 2907 if v_0.Op != Op386ADDLconst { 2908 break 2909 } 2910 d := v_0.AuxInt 2911 ptr := v_0.Args[0] 2912 idx := v.Args[1] 2913 mem := v.Args[2] 2914 v.reset(Op386MOVBloadidx1) 2915 v.AuxInt = c + d 2916 v.Aux = sym 2917 v.AddArg(ptr) 2918 v.AddArg(idx) 2919 v.AddArg(mem) 2920 return true 2921 } 2922 // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 2923 // cond: 2924 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 2925 for { 2926 c := v.AuxInt 2927 sym := v.Aux 2928 ptr := v.Args[0] 2929 v_1 := v.Args[1] 2930 if v_1.Op != Op386ADDLconst { 2931 break 2932 } 2933 d := v_1.AuxInt 2934 idx := v_1.Args[0] 2935 mem := v.Args[2] 2936 v.reset(Op386MOVBloadidx1) 2937 v.AuxInt = c + d 2938 v.Aux = sym 2939 v.AddArg(ptr) 2940 v.AddArg(idx) 2941 v.AddArg(mem) 2942 return true 2943 } 2944 return false 2945 } 2946 func rewriteValue386_Op386MOVBstore(v *Value, config *Config) bool { 2947 b := v.Block 2948 _ = b 2949 // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) 2950 // cond: 2951 // result: (MOVBstore [off] {sym} ptr x mem) 2952 for { 2953 off := v.AuxInt 2954 sym := v.Aux 2955 ptr := v.Args[0] 2956 v_1 := v.Args[1] 2957 if v_1.Op != Op386MOVBLSX { 2958 break 2959 } 2960 x := v_1.Args[0] 2961 mem := v.Args[2] 2962 v.reset(Op386MOVBstore) 2963 v.AuxInt = off 2964 v.Aux = sym 2965 v.AddArg(ptr) 2966 v.AddArg(x) 2967 v.AddArg(mem) 2968 return true 2969 } 2970 // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) 2971 // cond: 2972 // result: (MOVBstore [off] {sym} ptr x mem) 2973 for { 2974 off := v.AuxInt 2975 sym := v.Aux 2976 ptr := v.Args[0] 2977 v_1 := v.Args[1] 2978 if v_1.Op != Op386MOVBLZX { 2979 break 2980 } 2981 x := v_1.Args[0] 2982 mem := v.Args[2] 2983 v.reset(Op386MOVBstore) 2984 v.AuxInt = off 2985 v.Aux = sym 2986 v.AddArg(ptr) 2987 v.AddArg(x) 2988 v.AddArg(mem) 2989 return true 2990 } 2991 // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 2992 // cond: is32Bit(off1+off2) 2993 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 2994 for { 2995 off1 := v.AuxInt 2996 sym := v.Aux 2997 v_0 := v.Args[0] 2998 if v_0.Op != Op386ADDLconst { 2999 break 3000 } 3001 off2 := v_0.AuxInt 3002 ptr := v_0.Args[0] 3003 val := v.Args[1] 3004 mem := v.Args[2] 3005 if !(is32Bit(off1 + off2)) { 3006 break 3007 } 3008 v.reset(Op386MOVBstore) 3009 v.AuxInt = off1 + off2 3010 v.Aux = sym 3011 v.AddArg(ptr) 3012 v.AddArg(val) 3013 v.AddArg(mem) 3014 return true 3015 } 3016 // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) 3017 // cond: validOff(off) 3018 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 3019 for { 3020 off := v.AuxInt 3021 sym := v.Aux 3022 ptr := v.Args[0] 3023 v_1 := v.Args[1] 3024 if v_1.Op != Op386MOVLconst { 3025 break 3026 } 3027 c := v_1.AuxInt 3028 mem := v.Args[2] 3029 if !(validOff(off)) { 3030 break 3031 } 3032 v.reset(Op386MOVBstoreconst) 3033 v.AuxInt = makeValAndOff(int64(int8(c)), off) 3034 v.Aux = sym 3035 v.AddArg(ptr) 3036 v.AddArg(mem) 3037 return true 3038 } 3039 // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 3040 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3041 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 3042 for { 3043 off1 := v.AuxInt 3044 sym1 := v.Aux 3045 v_0 := v.Args[0] 3046 if v_0.Op != Op386LEAL { 3047 break 3048 } 3049 off2 := v_0.AuxInt 3050 sym2 := v_0.Aux 3051 base := v_0.Args[0] 3052 val := v.Args[1] 3053 mem := v.Args[2] 3054 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3055 break 3056 } 3057 v.reset(Op386MOVBstore) 3058 v.AuxInt = off1 + off2 3059 v.Aux = mergeSym(sym1, sym2) 3060 v.AddArg(base) 3061 v.AddArg(val) 3062 v.AddArg(mem) 3063 return true 3064 } 3065 // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 3066 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3067 // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3068 for { 3069 off1 := v.AuxInt 3070 sym1 := v.Aux 3071 v_0 := v.Args[0] 3072 if v_0.Op != Op386LEAL1 { 3073 break 3074 } 3075 off2 := v_0.AuxInt 3076 sym2 := v_0.Aux 3077 ptr := v_0.Args[0] 3078 idx := v_0.Args[1] 3079 val := v.Args[1] 3080 mem := v.Args[2] 3081 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3082 break 3083 } 3084 v.reset(Op386MOVBstoreidx1) 3085 v.AuxInt = off1 + off2 3086 v.Aux = mergeSym(sym1, sym2) 3087 v.AddArg(ptr) 3088 v.AddArg(idx) 3089 v.AddArg(val) 3090 v.AddArg(mem) 3091 return true 3092 } 3093 // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) 3094 // cond: ptr.Op != OpSB 3095 // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) 3096 for { 3097 off := v.AuxInt 3098 sym := v.Aux 3099 v_0 := v.Args[0] 3100 if v_0.Op != Op386ADDL { 3101 break 3102 } 3103 ptr := v_0.Args[0] 3104 idx := v_0.Args[1] 3105 val := v.Args[1] 3106 mem := v.Args[2] 3107 if !(ptr.Op != OpSB) { 3108 break 3109 } 3110 v.reset(Op386MOVBstoreidx1) 3111 v.AuxInt = off 3112 v.Aux = sym 3113 v.AddArg(ptr) 3114 v.AddArg(idx) 3115 v.AddArg(val) 3116 v.AddArg(mem) 3117 return true 3118 } 3119 // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 3120 // cond: x.Uses == 1 && clobber(x) 3121 // result: (MOVWstore [i-1] {s} p w mem) 3122 for { 3123 i := v.AuxInt 3124 s := v.Aux 3125 p := v.Args[0] 3126 v_1 := v.Args[1] 3127 if v_1.Op != Op386SHRLconst { 3128 break 3129 } 3130 if v_1.AuxInt != 8 { 3131 break 3132 } 3133 w := v_1.Args[0] 3134 x := v.Args[2] 3135 if x.Op != Op386MOVBstore { 3136 break 3137 } 3138 if x.AuxInt != i-1 { 3139 break 3140 } 3141 if x.Aux != s { 3142 break 3143 } 3144 if p != x.Args[0] { 3145 break 3146 } 3147 if w != x.Args[1] { 3148 break 3149 } 3150 mem := x.Args[2] 3151 if !(x.Uses == 1 && clobber(x)) { 3152 break 3153 } 3154 v.reset(Op386MOVWstore) 3155 v.AuxInt = i - 1 3156 v.Aux = s 3157 v.AddArg(p) 3158 v.AddArg(w) 3159 v.AddArg(mem) 3160 return true 3161 } 3162 // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) 3163 // cond: x.Uses == 1 && clobber(x) 3164 // result: (MOVWstore [i-1] {s} p w0 mem) 3165 for { 3166 i := v.AuxInt 3167 s := v.Aux 3168 p := v.Args[0] 3169 v_1 := v.Args[1] 3170 if v_1.Op != Op386SHRLconst { 3171 break 3172 } 3173 j := v_1.AuxInt 3174 w := v_1.Args[0] 3175 x := v.Args[2] 3176 if x.Op != Op386MOVBstore { 3177 break 3178 } 3179 if x.AuxInt != i-1 { 3180 break 3181 } 3182 if x.Aux != s { 3183 break 3184 } 3185 if p != x.Args[0] { 3186 break 3187 } 3188 w0 := x.Args[1] 3189 if w0.Op != Op386SHRLconst { 3190 break 3191 } 3192 if w0.AuxInt != j-8 { 3193 break 3194 } 3195 if w != w0.Args[0] { 3196 break 3197 } 3198 mem := x.Args[2] 3199 if !(x.Uses == 1 && clobber(x)) { 3200 break 3201 } 3202 v.reset(Op386MOVWstore) 3203 v.AuxInt = i - 1 3204 v.Aux = s 3205 v.AddArg(p) 3206 v.AddArg(w0) 3207 v.AddArg(mem) 3208 return true 3209 } 3210 return false 3211 } 3212 func rewriteValue386_Op386MOVBstoreconst(v *Value, config *Config) bool { 3213 b := v.Block 3214 _ = b 3215 // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 3216 // cond: ValAndOff(sc).canAdd(off) 3217 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 3218 for { 3219 sc := v.AuxInt 3220 s := v.Aux 3221 v_0 := v.Args[0] 3222 if v_0.Op != Op386ADDLconst { 3223 break 3224 } 3225 off := v_0.AuxInt 3226 ptr := v_0.Args[0] 3227 mem := v.Args[1] 3228 if !(ValAndOff(sc).canAdd(off)) { 3229 break 3230 } 3231 v.reset(Op386MOVBstoreconst) 3232 v.AuxInt = ValAndOff(sc).add(off) 3233 v.Aux = s 3234 v.AddArg(ptr) 3235 v.AddArg(mem) 3236 return true 3237 } 3238 // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 3239 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 3240 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 3241 for { 3242 sc := v.AuxInt 3243 sym1 := v.Aux 3244 v_0 := v.Args[0] 3245 if v_0.Op != Op386LEAL { 3246 break 3247 } 3248 off := v_0.AuxInt 3249 sym2 := v_0.Aux 3250 ptr := v_0.Args[0] 3251 mem := v.Args[1] 3252 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 3253 break 3254 } 3255 v.reset(Op386MOVBstoreconst) 3256 v.AuxInt = ValAndOff(sc).add(off) 3257 v.Aux = mergeSym(sym1, sym2) 3258 v.AddArg(ptr) 3259 v.AddArg(mem) 3260 return true 3261 } 3262 // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 3263 // cond: canMergeSym(sym1, sym2) 3264 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 3265 for { 3266 x := v.AuxInt 3267 sym1 := v.Aux 3268 v_0 := v.Args[0] 3269 if v_0.Op != Op386LEAL1 { 3270 break 3271 } 3272 off := v_0.AuxInt 3273 sym2 := v_0.Aux 3274 ptr := v_0.Args[0] 3275 idx := v_0.Args[1] 3276 mem := v.Args[1] 3277 if !(canMergeSym(sym1, sym2)) { 3278 break 3279 } 3280 v.reset(Op386MOVBstoreconstidx1) 3281 v.AuxInt = ValAndOff(x).add(off) 3282 v.Aux = mergeSym(sym1, sym2) 3283 v.AddArg(ptr) 3284 v.AddArg(idx) 3285 v.AddArg(mem) 3286 return true 3287 } 3288 // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) 3289 // cond: 3290 // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) 3291 for { 3292 x := v.AuxInt 3293 sym := v.Aux 3294 v_0 := v.Args[0] 3295 if v_0.Op != Op386ADDL { 3296 break 3297 } 3298 ptr := v_0.Args[0] 3299 idx := v_0.Args[1] 3300 mem := v.Args[1] 3301 v.reset(Op386MOVBstoreconstidx1) 3302 v.AuxInt = x 3303 v.Aux = sym 3304 v.AddArg(ptr) 3305 v.AddArg(idx) 3306 v.AddArg(mem) 3307 return true 3308 } 3309 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 3310 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3311 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 3312 for { 3313 c := v.AuxInt 3314 s := v.Aux 3315 p := v.Args[0] 3316 x := v.Args[1] 3317 if x.Op != Op386MOVBstoreconst { 3318 break 3319 } 3320 a := x.AuxInt 3321 if x.Aux != s { 3322 break 3323 } 3324 if p != x.Args[0] { 3325 break 3326 } 3327 mem := x.Args[1] 3328 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3329 break 3330 } 3331 v.reset(Op386MOVWstoreconst) 3332 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3333 v.Aux = s 3334 v.AddArg(p) 3335 v.AddArg(mem) 3336 return true 3337 } 3338 return false 3339 } 3340 func rewriteValue386_Op386MOVBstoreconstidx1(v *Value, config *Config) bool { 3341 b := v.Block 3342 _ = b 3343 // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 3344 // cond: 3345 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3346 for { 3347 x := v.AuxInt 3348 sym := v.Aux 3349 v_0 := v.Args[0] 3350 if v_0.Op != Op386ADDLconst { 3351 break 3352 } 3353 c := v_0.AuxInt 3354 ptr := v_0.Args[0] 3355 idx := v.Args[1] 3356 mem := v.Args[2] 3357 v.reset(Op386MOVBstoreconstidx1) 3358 v.AuxInt = ValAndOff(x).add(c) 3359 v.Aux = sym 3360 v.AddArg(ptr) 3361 v.AddArg(idx) 3362 v.AddArg(mem) 3363 return true 3364 } 3365 // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 3366 // cond: 3367 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3368 for { 3369 x := v.AuxInt 3370 sym := v.Aux 3371 ptr := v.Args[0] 3372 v_1 := v.Args[1] 3373 if v_1.Op != Op386ADDLconst { 3374 break 3375 } 3376 c := v_1.AuxInt 3377 idx := v_1.Args[0] 3378 mem := v.Args[2] 3379 v.reset(Op386MOVBstoreconstidx1) 3380 v.AuxInt = ValAndOff(x).add(c) 3381 v.Aux = sym 3382 v.AddArg(ptr) 3383 v.AddArg(idx) 3384 v.AddArg(mem) 3385 return true 3386 } 3387 // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) 3388 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3389 // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) 3390 for { 3391 c := v.AuxInt 3392 s := v.Aux 3393 p := v.Args[0] 3394 i := v.Args[1] 3395 x := v.Args[2] 3396 if x.Op != Op386MOVBstoreconstidx1 { 3397 break 3398 } 3399 a := x.AuxInt 3400 if x.Aux != s { 3401 break 3402 } 3403 if p != x.Args[0] { 3404 break 3405 } 3406 if i != x.Args[1] { 3407 break 3408 } 3409 mem := x.Args[2] 3410 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3411 break 3412 } 3413 v.reset(Op386MOVWstoreconstidx1) 3414 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3415 v.Aux = s 3416 v.AddArg(p) 3417 v.AddArg(i) 3418 v.AddArg(mem) 3419 return true 3420 } 3421 return false 3422 } 3423 func rewriteValue386_Op386MOVBstoreidx1(v *Value, config *Config) bool { 3424 b := v.Block 3425 _ = b 3426 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 3427 // cond: 3428 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3429 for { 3430 c := v.AuxInt 3431 sym := v.Aux 3432 v_0 := v.Args[0] 3433 if v_0.Op != Op386ADDLconst { 3434 break 3435 } 3436 d := v_0.AuxInt 3437 ptr := v_0.Args[0] 3438 idx := v.Args[1] 3439 val := v.Args[2] 3440 mem := v.Args[3] 3441 v.reset(Op386MOVBstoreidx1) 3442 v.AuxInt = c + d 3443 v.Aux = sym 3444 v.AddArg(ptr) 3445 v.AddArg(idx) 3446 v.AddArg(val) 3447 v.AddArg(mem) 3448 return true 3449 } 3450 // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 3451 // cond: 3452 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3453 for { 3454 c := v.AuxInt 3455 sym := v.Aux 3456 ptr := v.Args[0] 3457 v_1 := v.Args[1] 3458 if v_1.Op != Op386ADDLconst { 3459 break 3460 } 3461 d := v_1.AuxInt 3462 idx := v_1.Args[0] 3463 val := v.Args[2] 3464 mem := v.Args[3] 3465 v.reset(Op386MOVBstoreidx1) 3466 v.AuxInt = c + d 3467 v.Aux = sym 3468 v.AddArg(ptr) 3469 v.AddArg(idx) 3470 v.AddArg(val) 3471 v.AddArg(mem) 3472 return true 3473 } 3474 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3475 // cond: x.Uses == 1 && clobber(x) 3476 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3477 for { 3478 i := v.AuxInt 3479 s := v.Aux 3480 p := v.Args[0] 3481 idx := v.Args[1] 3482 v_2 := v.Args[2] 3483 if v_2.Op != Op386SHRLconst { 3484 break 3485 } 3486 if v_2.AuxInt != 8 { 3487 break 3488 } 3489 w := v_2.Args[0] 3490 x := v.Args[3] 3491 if x.Op != Op386MOVBstoreidx1 { 3492 break 3493 } 3494 if x.AuxInt != i-1 { 3495 break 3496 } 3497 if x.Aux != s { 3498 break 3499 } 3500 if p != x.Args[0] { 3501 break 3502 } 3503 if idx != x.Args[1] { 3504 break 3505 } 3506 if w != x.Args[2] { 3507 break 3508 } 3509 mem := x.Args[3] 3510 if !(x.Uses == 1 && clobber(x)) { 3511 break 3512 } 3513 v.reset(Op386MOVWstoreidx1) 3514 v.AuxInt = i - 1 3515 v.Aux = s 3516 v.AddArg(p) 3517 v.AddArg(idx) 3518 v.AddArg(w) 3519 v.AddArg(mem) 3520 return true 3521 } 3522 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 3523 // cond: x.Uses == 1 && clobber(x) 3524 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 3525 for { 3526 i := v.AuxInt 3527 s := v.Aux 3528 p := v.Args[0] 3529 idx := v.Args[1] 3530 v_2 := v.Args[2] 3531 if v_2.Op != Op386SHRLconst { 3532 break 3533 } 3534 j := v_2.AuxInt 3535 w := v_2.Args[0] 3536 x := v.Args[3] 3537 if x.Op != Op386MOVBstoreidx1 { 3538 break 3539 } 3540 if x.AuxInt != i-1 { 3541 break 3542 } 3543 if x.Aux != s { 3544 break 3545 } 3546 if p != x.Args[0] { 3547 break 3548 } 3549 if idx != x.Args[1] { 3550 break 3551 } 3552 w0 := x.Args[2] 3553 if w0.Op != Op386SHRLconst { 3554 break 3555 } 3556 if w0.AuxInt != j-8 { 3557 break 3558 } 3559 if w != w0.Args[0] { 3560 break 3561 } 3562 mem := x.Args[3] 3563 if !(x.Uses == 1 && clobber(x)) { 3564 break 3565 } 3566 v.reset(Op386MOVWstoreidx1) 3567 v.AuxInt = i - 1 3568 v.Aux = s 3569 v.AddArg(p) 3570 v.AddArg(idx) 3571 v.AddArg(w0) 3572 v.AddArg(mem) 3573 return true 3574 } 3575 return false 3576 } 3577 func rewriteValue386_Op386MOVLload(v *Value, config *Config) bool { 3578 b := v.Block 3579 _ = b 3580 // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) 3581 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3582 // result: x 3583 for { 3584 off := v.AuxInt 3585 sym := v.Aux 3586 ptr := v.Args[0] 3587 v_1 := v.Args[1] 3588 if v_1.Op != Op386MOVLstore { 3589 break 3590 } 3591 off2 := v_1.AuxInt 3592 sym2 := v_1.Aux 3593 ptr2 := v_1.Args[0] 3594 x := v_1.Args[1] 3595 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3596 break 3597 } 3598 v.reset(OpCopy) 3599 v.Type = x.Type 3600 v.AddArg(x) 3601 return true 3602 } 3603 // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) 3604 // cond: is32Bit(off1+off2) 3605 // result: (MOVLload [off1+off2] {sym} ptr mem) 3606 for { 3607 off1 := v.AuxInt 3608 sym := v.Aux 3609 v_0 := v.Args[0] 3610 if v_0.Op != Op386ADDLconst { 3611 break 3612 } 3613 off2 := v_0.AuxInt 3614 ptr := v_0.Args[0] 3615 mem := v.Args[1] 3616 if !(is32Bit(off1 + off2)) { 3617 break 3618 } 3619 v.reset(Op386MOVLload) 3620 v.AuxInt = off1 + off2 3621 v.Aux = sym 3622 v.AddArg(ptr) 3623 v.AddArg(mem) 3624 return true 3625 } 3626 // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 3627 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3628 // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) 3629 for { 3630 off1 := v.AuxInt 3631 sym1 := v.Aux 3632 v_0 := v.Args[0] 3633 if v_0.Op != Op386LEAL { 3634 break 3635 } 3636 off2 := v_0.AuxInt 3637 sym2 := v_0.Aux 3638 base := v_0.Args[0] 3639 mem := v.Args[1] 3640 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3641 break 3642 } 3643 v.reset(Op386MOVLload) 3644 v.AuxInt = off1 + off2 3645 v.Aux = mergeSym(sym1, sym2) 3646 v.AddArg(base) 3647 v.AddArg(mem) 3648 return true 3649 } 3650 // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 3651 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3652 // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 3653 for { 3654 off1 := v.AuxInt 3655 sym1 := v.Aux 3656 v_0 := v.Args[0] 3657 if v_0.Op != Op386LEAL1 { 3658 break 3659 } 3660 off2 := v_0.AuxInt 3661 sym2 := v_0.Aux 3662 ptr := v_0.Args[0] 3663 idx := v_0.Args[1] 3664 mem := v.Args[1] 3665 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3666 break 3667 } 3668 v.reset(Op386MOVLloadidx1) 3669 v.AuxInt = off1 + off2 3670 v.Aux = mergeSym(sym1, sym2) 3671 v.AddArg(ptr) 3672 v.AddArg(idx) 3673 v.AddArg(mem) 3674 return true 3675 } 3676 // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 3677 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3678 // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 3679 for { 3680 off1 := v.AuxInt 3681 sym1 := v.Aux 3682 v_0 := v.Args[0] 3683 if v_0.Op != Op386LEAL4 { 3684 break 3685 } 3686 off2 := v_0.AuxInt 3687 sym2 := v_0.Aux 3688 ptr := v_0.Args[0] 3689 idx := v_0.Args[1] 3690 mem := v.Args[1] 3691 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3692 break 3693 } 3694 v.reset(Op386MOVLloadidx4) 3695 v.AuxInt = off1 + off2 3696 v.Aux = mergeSym(sym1, sym2) 3697 v.AddArg(ptr) 3698 v.AddArg(idx) 3699 v.AddArg(mem) 3700 return true 3701 } 3702 // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) 3703 // cond: ptr.Op != OpSB 3704 // result: (MOVLloadidx1 [off] {sym} ptr idx mem) 3705 for { 3706 off := v.AuxInt 3707 sym := v.Aux 3708 v_0 := v.Args[0] 3709 if v_0.Op != Op386ADDL { 3710 break 3711 } 3712 ptr := v_0.Args[0] 3713 idx := v_0.Args[1] 3714 mem := v.Args[1] 3715 if !(ptr.Op != OpSB) { 3716 break 3717 } 3718 v.reset(Op386MOVLloadidx1) 3719 v.AuxInt = off 3720 v.Aux = sym 3721 v.AddArg(ptr) 3722 v.AddArg(idx) 3723 v.AddArg(mem) 3724 return true 3725 } 3726 return false 3727 } 3728 func rewriteValue386_Op386MOVLloadidx1(v *Value, config *Config) bool { 3729 b := v.Block 3730 _ = b 3731 // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 3732 // cond: 3733 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 3734 for { 3735 c := v.AuxInt 3736 sym := v.Aux 3737 ptr := v.Args[0] 3738 v_1 := v.Args[1] 3739 if v_1.Op != Op386SHLLconst { 3740 break 3741 } 3742 if v_1.AuxInt != 2 { 3743 break 3744 } 3745 idx := v_1.Args[0] 3746 mem := v.Args[2] 3747 v.reset(Op386MOVLloadidx4) 3748 v.AuxInt = c 3749 v.Aux = sym 3750 v.AddArg(ptr) 3751 v.AddArg(idx) 3752 v.AddArg(mem) 3753 return true 3754 } 3755 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 3756 // cond: 3757 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 3758 for { 3759 c := v.AuxInt 3760 sym := v.Aux 3761 v_0 := v.Args[0] 3762 if v_0.Op != Op386ADDLconst { 3763 break 3764 } 3765 d := v_0.AuxInt 3766 ptr := v_0.Args[0] 3767 idx := v.Args[1] 3768 mem := v.Args[2] 3769 v.reset(Op386MOVLloadidx1) 3770 v.AuxInt = c + d 3771 v.Aux = sym 3772 v.AddArg(ptr) 3773 v.AddArg(idx) 3774 v.AddArg(mem) 3775 return true 3776 } 3777 // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 3778 // cond: 3779 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 3780 for { 3781 c := v.AuxInt 3782 sym := v.Aux 3783 ptr := v.Args[0] 3784 v_1 := v.Args[1] 3785 if v_1.Op != Op386ADDLconst { 3786 break 3787 } 3788 d := v_1.AuxInt 3789 idx := v_1.Args[0] 3790 mem := v.Args[2] 3791 v.reset(Op386MOVLloadidx1) 3792 v.AuxInt = c + d 3793 v.Aux = sym 3794 v.AddArg(ptr) 3795 v.AddArg(idx) 3796 v.AddArg(mem) 3797 return true 3798 } 3799 return false 3800 } 3801 func rewriteValue386_Op386MOVLloadidx4(v *Value, config *Config) bool { 3802 b := v.Block 3803 _ = b 3804 // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 3805 // cond: 3806 // result: (MOVLloadidx4 [c+d] {sym} ptr idx mem) 3807 for { 3808 c := v.AuxInt 3809 sym := v.Aux 3810 v_0 := v.Args[0] 3811 if v_0.Op != Op386ADDLconst { 3812 break 3813 } 3814 d := v_0.AuxInt 3815 ptr := v_0.Args[0] 3816 idx := v.Args[1] 3817 mem := v.Args[2] 3818 v.reset(Op386MOVLloadidx4) 3819 v.AuxInt = c + d 3820 v.Aux = sym 3821 v.AddArg(ptr) 3822 v.AddArg(idx) 3823 v.AddArg(mem) 3824 return true 3825 } 3826 // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 3827 // cond: 3828 // result: (MOVLloadidx4 [c+4*d] {sym} ptr idx mem) 3829 for { 3830 c := v.AuxInt 3831 sym := v.Aux 3832 ptr := v.Args[0] 3833 v_1 := v.Args[1] 3834 if v_1.Op != Op386ADDLconst { 3835 break 3836 } 3837 d := v_1.AuxInt 3838 idx := v_1.Args[0] 3839 mem := v.Args[2] 3840 v.reset(Op386MOVLloadidx4) 3841 v.AuxInt = c + 4*d 3842 v.Aux = sym 3843 v.AddArg(ptr) 3844 v.AddArg(idx) 3845 v.AddArg(mem) 3846 return true 3847 } 3848 return false 3849 } 3850 func rewriteValue386_Op386MOVLstore(v *Value, config *Config) bool { 3851 b := v.Block 3852 _ = b 3853 // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 3854 // cond: is32Bit(off1+off2) 3855 // result: (MOVLstore [off1+off2] {sym} ptr val mem) 3856 for { 3857 off1 := v.AuxInt 3858 sym := v.Aux 3859 v_0 := v.Args[0] 3860 if v_0.Op != Op386ADDLconst { 3861 break 3862 } 3863 off2 := v_0.AuxInt 3864 ptr := v_0.Args[0] 3865 val := v.Args[1] 3866 mem := v.Args[2] 3867 if !(is32Bit(off1 + off2)) { 3868 break 3869 } 3870 v.reset(Op386MOVLstore) 3871 v.AuxInt = off1 + off2 3872 v.Aux = sym 3873 v.AddArg(ptr) 3874 v.AddArg(val) 3875 v.AddArg(mem) 3876 return true 3877 } 3878 // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) 3879 // cond: validOff(off) 3880 // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 3881 for { 3882 off := v.AuxInt 3883 sym := v.Aux 3884 ptr := v.Args[0] 3885 v_1 := v.Args[1] 3886 if v_1.Op != Op386MOVLconst { 3887 break 3888 } 3889 c := v_1.AuxInt 3890 mem := v.Args[2] 3891 if !(validOff(off)) { 3892 break 3893 } 3894 v.reset(Op386MOVLstoreconst) 3895 v.AuxInt = makeValAndOff(int64(int32(c)), off) 3896 v.Aux = sym 3897 v.AddArg(ptr) 3898 v.AddArg(mem) 3899 return true 3900 } 3901 // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 3902 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3903 // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 3904 for { 3905 off1 := v.AuxInt 3906 sym1 := v.Aux 3907 v_0 := v.Args[0] 3908 if v_0.Op != Op386LEAL { 3909 break 3910 } 3911 off2 := v_0.AuxInt 3912 sym2 := v_0.Aux 3913 base := v_0.Args[0] 3914 val := v.Args[1] 3915 mem := v.Args[2] 3916 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3917 break 3918 } 3919 v.reset(Op386MOVLstore) 3920 v.AuxInt = off1 + off2 3921 v.Aux = mergeSym(sym1, sym2) 3922 v.AddArg(base) 3923 v.AddArg(val) 3924 v.AddArg(mem) 3925 return true 3926 } 3927 // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 3928 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3929 // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3930 for { 3931 off1 := v.AuxInt 3932 sym1 := v.Aux 3933 v_0 := v.Args[0] 3934 if v_0.Op != Op386LEAL1 { 3935 break 3936 } 3937 off2 := v_0.AuxInt 3938 sym2 := v_0.Aux 3939 ptr := v_0.Args[0] 3940 idx := v_0.Args[1] 3941 val := v.Args[1] 3942 mem := v.Args[2] 3943 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3944 break 3945 } 3946 v.reset(Op386MOVLstoreidx1) 3947 v.AuxInt = off1 + off2 3948 v.Aux = mergeSym(sym1, sym2) 3949 v.AddArg(ptr) 3950 v.AddArg(idx) 3951 v.AddArg(val) 3952 v.AddArg(mem) 3953 return true 3954 } 3955 // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 3956 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3957 // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3958 for { 3959 off1 := v.AuxInt 3960 sym1 := v.Aux 3961 v_0 := v.Args[0] 3962 if v_0.Op != Op386LEAL4 { 3963 break 3964 } 3965 off2 := v_0.AuxInt 3966 sym2 := v_0.Aux 3967 ptr := v_0.Args[0] 3968 idx := v_0.Args[1] 3969 val := v.Args[1] 3970 mem := v.Args[2] 3971 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3972 break 3973 } 3974 v.reset(Op386MOVLstoreidx4) 3975 v.AuxInt = off1 + off2 3976 v.Aux = mergeSym(sym1, sym2) 3977 v.AddArg(ptr) 3978 v.AddArg(idx) 3979 v.AddArg(val) 3980 v.AddArg(mem) 3981 return true 3982 } 3983 // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) 3984 // cond: ptr.Op != OpSB 3985 // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) 3986 for { 3987 off := v.AuxInt 3988 sym := v.Aux 3989 v_0 := v.Args[0] 3990 if v_0.Op != Op386ADDL { 3991 break 3992 } 3993 ptr := v_0.Args[0] 3994 idx := v_0.Args[1] 3995 val := v.Args[1] 3996 mem := v.Args[2] 3997 if !(ptr.Op != OpSB) { 3998 break 3999 } 4000 v.reset(Op386MOVLstoreidx1) 4001 v.AuxInt = off 4002 v.Aux = sym 4003 v.AddArg(ptr) 4004 v.AddArg(idx) 4005 v.AddArg(val) 4006 v.AddArg(mem) 4007 return true 4008 } 4009 return false 4010 } 4011 func rewriteValue386_Op386MOVLstoreconst(v *Value, config *Config) bool { 4012 b := v.Block 4013 _ = b 4014 // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 4015 // cond: ValAndOff(sc).canAdd(off) 4016 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 4017 for { 4018 sc := v.AuxInt 4019 s := v.Aux 4020 v_0 := v.Args[0] 4021 if v_0.Op != Op386ADDLconst { 4022 break 4023 } 4024 off := v_0.AuxInt 4025 ptr := v_0.Args[0] 4026 mem := v.Args[1] 4027 if !(ValAndOff(sc).canAdd(off)) { 4028 break 4029 } 4030 v.reset(Op386MOVLstoreconst) 4031 v.AuxInt = ValAndOff(sc).add(off) 4032 v.Aux = s 4033 v.AddArg(ptr) 4034 v.AddArg(mem) 4035 return true 4036 } 4037 // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 4038 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 4039 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 4040 for { 4041 sc := v.AuxInt 4042 sym1 := v.Aux 4043 v_0 := v.Args[0] 4044 if v_0.Op != Op386LEAL { 4045 break 4046 } 4047 off := v_0.AuxInt 4048 sym2 := v_0.Aux 4049 ptr := v_0.Args[0] 4050 mem := v.Args[1] 4051 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 4052 break 4053 } 4054 v.reset(Op386MOVLstoreconst) 4055 v.AuxInt = ValAndOff(sc).add(off) 4056 v.Aux = mergeSym(sym1, sym2) 4057 v.AddArg(ptr) 4058 v.AddArg(mem) 4059 return true 4060 } 4061 // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 4062 // cond: canMergeSym(sym1, sym2) 4063 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4064 for { 4065 x := v.AuxInt 4066 sym1 := v.Aux 4067 v_0 := v.Args[0] 4068 if v_0.Op != Op386LEAL1 { 4069 break 4070 } 4071 off := v_0.AuxInt 4072 sym2 := v_0.Aux 4073 ptr := v_0.Args[0] 4074 idx := v_0.Args[1] 4075 mem := v.Args[1] 4076 if !(canMergeSym(sym1, sym2)) { 4077 break 4078 } 4079 v.reset(Op386MOVLstoreconstidx1) 4080 v.AuxInt = ValAndOff(x).add(off) 4081 v.Aux = mergeSym(sym1, sym2) 4082 v.AddArg(ptr) 4083 v.AddArg(idx) 4084 v.AddArg(mem) 4085 return true 4086 } 4087 // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) 4088 // cond: canMergeSym(sym1, sym2) 4089 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4090 for { 4091 x := v.AuxInt 4092 sym1 := v.Aux 4093 v_0 := v.Args[0] 4094 if v_0.Op != Op386LEAL4 { 4095 break 4096 } 4097 off := v_0.AuxInt 4098 sym2 := v_0.Aux 4099 ptr := v_0.Args[0] 4100 idx := v_0.Args[1] 4101 mem := v.Args[1] 4102 if !(canMergeSym(sym1, sym2)) { 4103 break 4104 } 4105 v.reset(Op386MOVLstoreconstidx4) 4106 v.AuxInt = ValAndOff(x).add(off) 4107 v.Aux = mergeSym(sym1, sym2) 4108 v.AddArg(ptr) 4109 v.AddArg(idx) 4110 v.AddArg(mem) 4111 return true 4112 } 4113 // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) 4114 // cond: 4115 // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) 4116 for { 4117 x := v.AuxInt 4118 sym := v.Aux 4119 v_0 := v.Args[0] 4120 if v_0.Op != Op386ADDL { 4121 break 4122 } 4123 ptr := v_0.Args[0] 4124 idx := v_0.Args[1] 4125 mem := v.Args[1] 4126 v.reset(Op386MOVLstoreconstidx1) 4127 v.AuxInt = x 4128 v.Aux = sym 4129 v.AddArg(ptr) 4130 v.AddArg(idx) 4131 v.AddArg(mem) 4132 return true 4133 } 4134 return false 4135 } 4136 func rewriteValue386_Op386MOVLstoreconstidx1(v *Value, config *Config) bool { 4137 b := v.Block 4138 _ = b 4139 // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4140 // cond: 4141 // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) 4142 for { 4143 c := v.AuxInt 4144 sym := v.Aux 4145 ptr := v.Args[0] 4146 v_1 := v.Args[1] 4147 if v_1.Op != Op386SHLLconst { 4148 break 4149 } 4150 if v_1.AuxInt != 2 { 4151 break 4152 } 4153 idx := v_1.Args[0] 4154 mem := v.Args[2] 4155 v.reset(Op386MOVLstoreconstidx4) 4156 v.AuxInt = c 4157 v.Aux = sym 4158 v.AddArg(ptr) 4159 v.AddArg(idx) 4160 v.AddArg(mem) 4161 return true 4162 } 4163 // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 4164 // cond: 4165 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4166 for { 4167 x := v.AuxInt 4168 sym := v.Aux 4169 v_0 := v.Args[0] 4170 if v_0.Op != Op386ADDLconst { 4171 break 4172 } 4173 c := v_0.AuxInt 4174 ptr := v_0.Args[0] 4175 idx := v.Args[1] 4176 mem := v.Args[2] 4177 v.reset(Op386MOVLstoreconstidx1) 4178 v.AuxInt = ValAndOff(x).add(c) 4179 v.Aux = sym 4180 v.AddArg(ptr) 4181 v.AddArg(idx) 4182 v.AddArg(mem) 4183 return true 4184 } 4185 // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 4186 // cond: 4187 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4188 for { 4189 x := v.AuxInt 4190 sym := v.Aux 4191 ptr := v.Args[0] 4192 v_1 := v.Args[1] 4193 if v_1.Op != Op386ADDLconst { 4194 break 4195 } 4196 c := v_1.AuxInt 4197 idx := v_1.Args[0] 4198 mem := v.Args[2] 4199 v.reset(Op386MOVLstoreconstidx1) 4200 v.AuxInt = ValAndOff(x).add(c) 4201 v.Aux = sym 4202 v.AddArg(ptr) 4203 v.AddArg(idx) 4204 v.AddArg(mem) 4205 return true 4206 } 4207 return false 4208 } 4209 func rewriteValue386_Op386MOVLstoreconstidx4(v *Value, config *Config) bool { 4210 b := v.Block 4211 _ = b 4212 // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) 4213 // cond: 4214 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4215 for { 4216 x := v.AuxInt 4217 sym := v.Aux 4218 v_0 := v.Args[0] 4219 if v_0.Op != Op386ADDLconst { 4220 break 4221 } 4222 c := v_0.AuxInt 4223 ptr := v_0.Args[0] 4224 idx := v.Args[1] 4225 mem := v.Args[2] 4226 v.reset(Op386MOVLstoreconstidx4) 4227 v.AuxInt = ValAndOff(x).add(c) 4228 v.Aux = sym 4229 v.AddArg(ptr) 4230 v.AddArg(idx) 4231 v.AddArg(mem) 4232 return true 4233 } 4234 // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) 4235 // cond: 4236 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) 4237 for { 4238 x := v.AuxInt 4239 sym := v.Aux 4240 ptr := v.Args[0] 4241 v_1 := v.Args[1] 4242 if v_1.Op != Op386ADDLconst { 4243 break 4244 } 4245 c := v_1.AuxInt 4246 idx := v_1.Args[0] 4247 mem := v.Args[2] 4248 v.reset(Op386MOVLstoreconstidx4) 4249 v.AuxInt = ValAndOff(x).add(4 * c) 4250 v.Aux = sym 4251 v.AddArg(ptr) 4252 v.AddArg(idx) 4253 v.AddArg(mem) 4254 return true 4255 } 4256 return false 4257 } 4258 func rewriteValue386_Op386MOVLstoreidx1(v *Value, config *Config) bool { 4259 b := v.Block 4260 _ = b 4261 // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) 4262 // cond: 4263 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 4264 for { 4265 c := v.AuxInt 4266 sym := v.Aux 4267 ptr := v.Args[0] 4268 v_1 := v.Args[1] 4269 if v_1.Op != Op386SHLLconst { 4270 break 4271 } 4272 if v_1.AuxInt != 2 { 4273 break 4274 } 4275 idx := v_1.Args[0] 4276 val := v.Args[2] 4277 mem := v.Args[3] 4278 v.reset(Op386MOVLstoreidx4) 4279 v.AuxInt = c 4280 v.Aux = sym 4281 v.AddArg(ptr) 4282 v.AddArg(idx) 4283 v.AddArg(val) 4284 v.AddArg(mem) 4285 return true 4286 } 4287 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4288 // cond: 4289 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4290 for { 4291 c := v.AuxInt 4292 sym := v.Aux 4293 v_0 := v.Args[0] 4294 if v_0.Op != Op386ADDLconst { 4295 break 4296 } 4297 d := v_0.AuxInt 4298 ptr := v_0.Args[0] 4299 idx := v.Args[1] 4300 val := v.Args[2] 4301 mem := v.Args[3] 4302 v.reset(Op386MOVLstoreidx1) 4303 v.AuxInt = c + d 4304 v.Aux = sym 4305 v.AddArg(ptr) 4306 v.AddArg(idx) 4307 v.AddArg(val) 4308 v.AddArg(mem) 4309 return true 4310 } 4311 // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 4312 // cond: 4313 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4314 for { 4315 c := v.AuxInt 4316 sym := v.Aux 4317 ptr := v.Args[0] 4318 v_1 := v.Args[1] 4319 if v_1.Op != Op386ADDLconst { 4320 break 4321 } 4322 d := v_1.AuxInt 4323 idx := v_1.Args[0] 4324 val := v.Args[2] 4325 mem := v.Args[3] 4326 v.reset(Op386MOVLstoreidx1) 4327 v.AuxInt = c + d 4328 v.Aux = sym 4329 v.AddArg(ptr) 4330 v.AddArg(idx) 4331 v.AddArg(val) 4332 v.AddArg(mem) 4333 return true 4334 } 4335 return false 4336 } 4337 func rewriteValue386_Op386MOVLstoreidx4(v *Value, config *Config) bool { 4338 b := v.Block 4339 _ = b 4340 // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4341 // cond: 4342 // result: (MOVLstoreidx4 [c+d] {sym} ptr idx val mem) 4343 for { 4344 c := v.AuxInt 4345 sym := v.Aux 4346 v_0 := v.Args[0] 4347 if v_0.Op != Op386ADDLconst { 4348 break 4349 } 4350 d := v_0.AuxInt 4351 ptr := v_0.Args[0] 4352 idx := v.Args[1] 4353 val := v.Args[2] 4354 mem := v.Args[3] 4355 v.reset(Op386MOVLstoreidx4) 4356 v.AuxInt = c + d 4357 v.Aux = sym 4358 v.AddArg(ptr) 4359 v.AddArg(idx) 4360 v.AddArg(val) 4361 v.AddArg(mem) 4362 return true 4363 } 4364 // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 4365 // cond: 4366 // result: (MOVLstoreidx4 [c+4*d] {sym} ptr idx val mem) 4367 for { 4368 c := v.AuxInt 4369 sym := v.Aux 4370 ptr := v.Args[0] 4371 v_1 := v.Args[1] 4372 if v_1.Op != Op386ADDLconst { 4373 break 4374 } 4375 d := v_1.AuxInt 4376 idx := v_1.Args[0] 4377 val := v.Args[2] 4378 mem := v.Args[3] 4379 v.reset(Op386MOVLstoreidx4) 4380 v.AuxInt = c + 4*d 4381 v.Aux = sym 4382 v.AddArg(ptr) 4383 v.AddArg(idx) 4384 v.AddArg(val) 4385 v.AddArg(mem) 4386 return true 4387 } 4388 return false 4389 } 4390 func rewriteValue386_Op386MOVSDconst(v *Value, config *Config) bool { 4391 b := v.Block 4392 _ = b 4393 // match: (MOVSDconst [c]) 4394 // cond: config.ctxt.Flag_shared 4395 // result: (MOVSDconst2 (MOVSDconst1 [c])) 4396 for { 4397 c := v.AuxInt 4398 if !(config.ctxt.Flag_shared) { 4399 break 4400 } 4401 v.reset(Op386MOVSDconst2) 4402 v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, config.fe.TypeUInt32()) 4403 v0.AuxInt = c 4404 v.AddArg(v0) 4405 return true 4406 } 4407 return false 4408 } 4409 func rewriteValue386_Op386MOVSDload(v *Value, config *Config) bool { 4410 b := v.Block 4411 _ = b 4412 // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) 4413 // cond: is32Bit(off1+off2) 4414 // result: (MOVSDload [off1+off2] {sym} ptr mem) 4415 for { 4416 off1 := v.AuxInt 4417 sym := v.Aux 4418 v_0 := v.Args[0] 4419 if v_0.Op != Op386ADDLconst { 4420 break 4421 } 4422 off2 := v_0.AuxInt 4423 ptr := v_0.Args[0] 4424 mem := v.Args[1] 4425 if !(is32Bit(off1 + off2)) { 4426 break 4427 } 4428 v.reset(Op386MOVSDload) 4429 v.AuxInt = off1 + off2 4430 v.Aux = sym 4431 v.AddArg(ptr) 4432 v.AddArg(mem) 4433 return true 4434 } 4435 // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 4436 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4437 // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 4438 for { 4439 off1 := v.AuxInt 4440 sym1 := v.Aux 4441 v_0 := v.Args[0] 4442 if v_0.Op != Op386LEAL { 4443 break 4444 } 4445 off2 := v_0.AuxInt 4446 sym2 := v_0.Aux 4447 base := v_0.Args[0] 4448 mem := v.Args[1] 4449 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4450 break 4451 } 4452 v.reset(Op386MOVSDload) 4453 v.AuxInt = off1 + off2 4454 v.Aux = mergeSym(sym1, sym2) 4455 v.AddArg(base) 4456 v.AddArg(mem) 4457 return true 4458 } 4459 // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 4460 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4461 // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4462 for { 4463 off1 := v.AuxInt 4464 sym1 := v.Aux 4465 v_0 := v.Args[0] 4466 if v_0.Op != Op386LEAL1 { 4467 break 4468 } 4469 off2 := v_0.AuxInt 4470 sym2 := v_0.Aux 4471 ptr := v_0.Args[0] 4472 idx := v_0.Args[1] 4473 mem := v.Args[1] 4474 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4475 break 4476 } 4477 v.reset(Op386MOVSDloadidx1) 4478 v.AuxInt = off1 + off2 4479 v.Aux = mergeSym(sym1, sym2) 4480 v.AddArg(ptr) 4481 v.AddArg(idx) 4482 v.AddArg(mem) 4483 return true 4484 } 4485 // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) 4486 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4487 // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4488 for { 4489 off1 := v.AuxInt 4490 sym1 := v.Aux 4491 v_0 := v.Args[0] 4492 if v_0.Op != Op386LEAL8 { 4493 break 4494 } 4495 off2 := v_0.AuxInt 4496 sym2 := v_0.Aux 4497 ptr := v_0.Args[0] 4498 idx := v_0.Args[1] 4499 mem := v.Args[1] 4500 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4501 break 4502 } 4503 v.reset(Op386MOVSDloadidx8) 4504 v.AuxInt = off1 + off2 4505 v.Aux = mergeSym(sym1, sym2) 4506 v.AddArg(ptr) 4507 v.AddArg(idx) 4508 v.AddArg(mem) 4509 return true 4510 } 4511 // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) 4512 // cond: ptr.Op != OpSB 4513 // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) 4514 for { 4515 off := v.AuxInt 4516 sym := v.Aux 4517 v_0 := v.Args[0] 4518 if v_0.Op != Op386ADDL { 4519 break 4520 } 4521 ptr := v_0.Args[0] 4522 idx := v_0.Args[1] 4523 mem := v.Args[1] 4524 if !(ptr.Op != OpSB) { 4525 break 4526 } 4527 v.reset(Op386MOVSDloadidx1) 4528 v.AuxInt = off 4529 v.Aux = sym 4530 v.AddArg(ptr) 4531 v.AddArg(idx) 4532 v.AddArg(mem) 4533 return true 4534 } 4535 return false 4536 } 4537 func rewriteValue386_Op386MOVSDloadidx1(v *Value, config *Config) bool { 4538 b := v.Block 4539 _ = b 4540 // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 4541 // cond: 4542 // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem) 4543 for { 4544 c := v.AuxInt 4545 sym := v.Aux 4546 v_0 := v.Args[0] 4547 if v_0.Op != Op386ADDLconst { 4548 break 4549 } 4550 d := v_0.AuxInt 4551 ptr := v_0.Args[0] 4552 idx := v.Args[1] 4553 mem := v.Args[2] 4554 v.reset(Op386MOVSDloadidx1) 4555 v.AuxInt = c + d 4556 v.Aux = sym 4557 v.AddArg(ptr) 4558 v.AddArg(idx) 4559 v.AddArg(mem) 4560 return true 4561 } 4562 // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 4563 // cond: 4564 // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem) 4565 for { 4566 c := v.AuxInt 4567 sym := v.Aux 4568 ptr := v.Args[0] 4569 v_1 := v.Args[1] 4570 if v_1.Op != Op386ADDLconst { 4571 break 4572 } 4573 d := v_1.AuxInt 4574 idx := v_1.Args[0] 4575 mem := v.Args[2] 4576 v.reset(Op386MOVSDloadidx1) 4577 v.AuxInt = c + d 4578 v.Aux = sym 4579 v.AddArg(ptr) 4580 v.AddArg(idx) 4581 v.AddArg(mem) 4582 return true 4583 } 4584 return false 4585 } 4586 func rewriteValue386_Op386MOVSDloadidx8(v *Value, config *Config) bool { 4587 b := v.Block 4588 _ = b 4589 // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) 4590 // cond: 4591 // result: (MOVSDloadidx8 [c+d] {sym} ptr idx mem) 4592 for { 4593 c := v.AuxInt 4594 sym := v.Aux 4595 v_0 := v.Args[0] 4596 if v_0.Op != Op386ADDLconst { 4597 break 4598 } 4599 d := v_0.AuxInt 4600 ptr := v_0.Args[0] 4601 idx := v.Args[1] 4602 mem := v.Args[2] 4603 v.reset(Op386MOVSDloadidx8) 4604 v.AuxInt = c + d 4605 v.Aux = sym 4606 v.AddArg(ptr) 4607 v.AddArg(idx) 4608 v.AddArg(mem) 4609 return true 4610 } 4611 // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) 4612 // cond: 4613 // result: (MOVSDloadidx8 [c+8*d] {sym} ptr idx mem) 4614 for { 4615 c := v.AuxInt 4616 sym := v.Aux 4617 ptr := v.Args[0] 4618 v_1 := v.Args[1] 4619 if v_1.Op != Op386ADDLconst { 4620 break 4621 } 4622 d := v_1.AuxInt 4623 idx := v_1.Args[0] 4624 mem := v.Args[2] 4625 v.reset(Op386MOVSDloadidx8) 4626 v.AuxInt = c + 8*d 4627 v.Aux = sym 4628 v.AddArg(ptr) 4629 v.AddArg(idx) 4630 v.AddArg(mem) 4631 return true 4632 } 4633 return false 4634 } 4635 func rewriteValue386_Op386MOVSDstore(v *Value, config *Config) bool { 4636 b := v.Block 4637 _ = b 4638 // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 4639 // cond: is32Bit(off1+off2) 4640 // result: (MOVSDstore [off1+off2] {sym} ptr val mem) 4641 for { 4642 off1 := v.AuxInt 4643 sym := v.Aux 4644 v_0 := v.Args[0] 4645 if v_0.Op != Op386ADDLconst { 4646 break 4647 } 4648 off2 := v_0.AuxInt 4649 ptr := v_0.Args[0] 4650 val := v.Args[1] 4651 mem := v.Args[2] 4652 if !(is32Bit(off1 + off2)) { 4653 break 4654 } 4655 v.reset(Op386MOVSDstore) 4656 v.AuxInt = off1 + off2 4657 v.Aux = sym 4658 v.AddArg(ptr) 4659 v.AddArg(val) 4660 v.AddArg(mem) 4661 return true 4662 } 4663 // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 4664 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4665 // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 4666 for { 4667 off1 := v.AuxInt 4668 sym1 := v.Aux 4669 v_0 := v.Args[0] 4670 if v_0.Op != Op386LEAL { 4671 break 4672 } 4673 off2 := v_0.AuxInt 4674 sym2 := v_0.Aux 4675 base := v_0.Args[0] 4676 val := v.Args[1] 4677 mem := v.Args[2] 4678 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4679 break 4680 } 4681 v.reset(Op386MOVSDstore) 4682 v.AuxInt = off1 + off2 4683 v.Aux = mergeSym(sym1, sym2) 4684 v.AddArg(base) 4685 v.AddArg(val) 4686 v.AddArg(mem) 4687 return true 4688 } 4689 // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 4690 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4691 // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4692 for { 4693 off1 := v.AuxInt 4694 sym1 := v.Aux 4695 v_0 := v.Args[0] 4696 if v_0.Op != Op386LEAL1 { 4697 break 4698 } 4699 off2 := v_0.AuxInt 4700 sym2 := v_0.Aux 4701 ptr := v_0.Args[0] 4702 idx := v_0.Args[1] 4703 val := v.Args[1] 4704 mem := v.Args[2] 4705 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4706 break 4707 } 4708 v.reset(Op386MOVSDstoreidx1) 4709 v.AuxInt = off1 + off2 4710 v.Aux = mergeSym(sym1, sym2) 4711 v.AddArg(ptr) 4712 v.AddArg(idx) 4713 v.AddArg(val) 4714 v.AddArg(mem) 4715 return true 4716 } 4717 // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) 4718 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4719 // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4720 for { 4721 off1 := v.AuxInt 4722 sym1 := v.Aux 4723 v_0 := v.Args[0] 4724 if v_0.Op != Op386LEAL8 { 4725 break 4726 } 4727 off2 := v_0.AuxInt 4728 sym2 := v_0.Aux 4729 ptr := v_0.Args[0] 4730 idx := v_0.Args[1] 4731 val := v.Args[1] 4732 mem := v.Args[2] 4733 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4734 break 4735 } 4736 v.reset(Op386MOVSDstoreidx8) 4737 v.AuxInt = off1 + off2 4738 v.Aux = mergeSym(sym1, sym2) 4739 v.AddArg(ptr) 4740 v.AddArg(idx) 4741 v.AddArg(val) 4742 v.AddArg(mem) 4743 return true 4744 } 4745 // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) 4746 // cond: ptr.Op != OpSB 4747 // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) 4748 for { 4749 off := v.AuxInt 4750 sym := v.Aux 4751 v_0 := v.Args[0] 4752 if v_0.Op != Op386ADDL { 4753 break 4754 } 4755 ptr := v_0.Args[0] 4756 idx := v_0.Args[1] 4757 val := v.Args[1] 4758 mem := v.Args[2] 4759 if !(ptr.Op != OpSB) { 4760 break 4761 } 4762 v.reset(Op386MOVSDstoreidx1) 4763 v.AuxInt = off 4764 v.Aux = sym 4765 v.AddArg(ptr) 4766 v.AddArg(idx) 4767 v.AddArg(val) 4768 v.AddArg(mem) 4769 return true 4770 } 4771 return false 4772 } 4773 func rewriteValue386_Op386MOVSDstoreidx1(v *Value, config *Config) bool { 4774 b := v.Block 4775 _ = b 4776 // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4777 // cond: 4778 // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem) 4779 for { 4780 c := v.AuxInt 4781 sym := v.Aux 4782 v_0 := v.Args[0] 4783 if v_0.Op != Op386ADDLconst { 4784 break 4785 } 4786 d := v_0.AuxInt 4787 ptr := v_0.Args[0] 4788 idx := v.Args[1] 4789 val := v.Args[2] 4790 mem := v.Args[3] 4791 v.reset(Op386MOVSDstoreidx1) 4792 v.AuxInt = c + d 4793 v.Aux = sym 4794 v.AddArg(ptr) 4795 v.AddArg(idx) 4796 v.AddArg(val) 4797 v.AddArg(mem) 4798 return true 4799 } 4800 // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 4801 // cond: 4802 // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem) 4803 for { 4804 c := v.AuxInt 4805 sym := v.Aux 4806 ptr := v.Args[0] 4807 v_1 := v.Args[1] 4808 if v_1.Op != Op386ADDLconst { 4809 break 4810 } 4811 d := v_1.AuxInt 4812 idx := v_1.Args[0] 4813 val := v.Args[2] 4814 mem := v.Args[3] 4815 v.reset(Op386MOVSDstoreidx1) 4816 v.AuxInt = c + d 4817 v.Aux = sym 4818 v.AddArg(ptr) 4819 v.AddArg(idx) 4820 v.AddArg(val) 4821 v.AddArg(mem) 4822 return true 4823 } 4824 return false 4825 } 4826 func rewriteValue386_Op386MOVSDstoreidx8(v *Value, config *Config) bool { 4827 b := v.Block 4828 _ = b 4829 // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4830 // cond: 4831 // result: (MOVSDstoreidx8 [c+d] {sym} ptr idx val mem) 4832 for { 4833 c := v.AuxInt 4834 sym := v.Aux 4835 v_0 := v.Args[0] 4836 if v_0.Op != Op386ADDLconst { 4837 break 4838 } 4839 d := v_0.AuxInt 4840 ptr := v_0.Args[0] 4841 idx := v.Args[1] 4842 val := v.Args[2] 4843 mem := v.Args[3] 4844 v.reset(Op386MOVSDstoreidx8) 4845 v.AuxInt = c + d 4846 v.Aux = sym 4847 v.AddArg(ptr) 4848 v.AddArg(idx) 4849 v.AddArg(val) 4850 v.AddArg(mem) 4851 return true 4852 } 4853 // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) 4854 // cond: 4855 // result: (MOVSDstoreidx8 [c+8*d] {sym} ptr idx val mem) 4856 for { 4857 c := v.AuxInt 4858 sym := v.Aux 4859 ptr := v.Args[0] 4860 v_1 := v.Args[1] 4861 if v_1.Op != Op386ADDLconst { 4862 break 4863 } 4864 d := v_1.AuxInt 4865 idx := v_1.Args[0] 4866 val := v.Args[2] 4867 mem := v.Args[3] 4868 v.reset(Op386MOVSDstoreidx8) 4869 v.AuxInt = c + 8*d 4870 v.Aux = sym 4871 v.AddArg(ptr) 4872 v.AddArg(idx) 4873 v.AddArg(val) 4874 v.AddArg(mem) 4875 return true 4876 } 4877 return false 4878 } 4879 func rewriteValue386_Op386MOVSSconst(v *Value, config *Config) bool { 4880 b := v.Block 4881 _ = b 4882 // match: (MOVSSconst [c]) 4883 // cond: config.ctxt.Flag_shared 4884 // result: (MOVSSconst2 (MOVSSconst1 [c])) 4885 for { 4886 c := v.AuxInt 4887 if !(config.ctxt.Flag_shared) { 4888 break 4889 } 4890 v.reset(Op386MOVSSconst2) 4891 v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, config.fe.TypeUInt32()) 4892 v0.AuxInt = c 4893 v.AddArg(v0) 4894 return true 4895 } 4896 return false 4897 } 4898 func rewriteValue386_Op386MOVSSload(v *Value, config *Config) bool { 4899 b := v.Block 4900 _ = b 4901 // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) 4902 // cond: is32Bit(off1+off2) 4903 // result: (MOVSSload [off1+off2] {sym} ptr mem) 4904 for { 4905 off1 := v.AuxInt 4906 sym := v.Aux 4907 v_0 := v.Args[0] 4908 if v_0.Op != Op386ADDLconst { 4909 break 4910 } 4911 off2 := v_0.AuxInt 4912 ptr := v_0.Args[0] 4913 mem := v.Args[1] 4914 if !(is32Bit(off1 + off2)) { 4915 break 4916 } 4917 v.reset(Op386MOVSSload) 4918 v.AuxInt = off1 + off2 4919 v.Aux = sym 4920 v.AddArg(ptr) 4921 v.AddArg(mem) 4922 return true 4923 } 4924 // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 4925 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4926 // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 4927 for { 4928 off1 := v.AuxInt 4929 sym1 := v.Aux 4930 v_0 := v.Args[0] 4931 if v_0.Op != Op386LEAL { 4932 break 4933 } 4934 off2 := v_0.AuxInt 4935 sym2 := v_0.Aux 4936 base := v_0.Args[0] 4937 mem := v.Args[1] 4938 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4939 break 4940 } 4941 v.reset(Op386MOVSSload) 4942 v.AuxInt = off1 + off2 4943 v.Aux = mergeSym(sym1, sym2) 4944 v.AddArg(base) 4945 v.AddArg(mem) 4946 return true 4947 } 4948 // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 4949 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4950 // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4951 for { 4952 off1 := v.AuxInt 4953 sym1 := v.Aux 4954 v_0 := v.Args[0] 4955 if v_0.Op != Op386LEAL1 { 4956 break 4957 } 4958 off2 := v_0.AuxInt 4959 sym2 := v_0.Aux 4960 ptr := v_0.Args[0] 4961 idx := v_0.Args[1] 4962 mem := v.Args[1] 4963 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4964 break 4965 } 4966 v.reset(Op386MOVSSloadidx1) 4967 v.AuxInt = off1 + off2 4968 v.Aux = mergeSym(sym1, sym2) 4969 v.AddArg(ptr) 4970 v.AddArg(idx) 4971 v.AddArg(mem) 4972 return true 4973 } 4974 // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 4975 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4976 // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4977 for { 4978 off1 := v.AuxInt 4979 sym1 := v.Aux 4980 v_0 := v.Args[0] 4981 if v_0.Op != Op386LEAL4 { 4982 break 4983 } 4984 off2 := v_0.AuxInt 4985 sym2 := v_0.Aux 4986 ptr := v_0.Args[0] 4987 idx := v_0.Args[1] 4988 mem := v.Args[1] 4989 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4990 break 4991 } 4992 v.reset(Op386MOVSSloadidx4) 4993 v.AuxInt = off1 + off2 4994 v.Aux = mergeSym(sym1, sym2) 4995 v.AddArg(ptr) 4996 v.AddArg(idx) 4997 v.AddArg(mem) 4998 return true 4999 } 5000 // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) 5001 // cond: ptr.Op != OpSB 5002 // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) 5003 for { 5004 off := v.AuxInt 5005 sym := v.Aux 5006 v_0 := v.Args[0] 5007 if v_0.Op != Op386ADDL { 5008 break 5009 } 5010 ptr := v_0.Args[0] 5011 idx := v_0.Args[1] 5012 mem := v.Args[1] 5013 if !(ptr.Op != OpSB) { 5014 break 5015 } 5016 v.reset(Op386MOVSSloadidx1) 5017 v.AuxInt = off 5018 v.Aux = sym 5019 v.AddArg(ptr) 5020 v.AddArg(idx) 5021 v.AddArg(mem) 5022 return true 5023 } 5024 return false 5025 } 5026 func rewriteValue386_Op386MOVSSloadidx1(v *Value, config *Config) bool { 5027 b := v.Block 5028 _ = b 5029 // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5030 // cond: 5031 // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem) 5032 for { 5033 c := v.AuxInt 5034 sym := v.Aux 5035 v_0 := v.Args[0] 5036 if v_0.Op != Op386ADDLconst { 5037 break 5038 } 5039 d := v_0.AuxInt 5040 ptr := v_0.Args[0] 5041 idx := v.Args[1] 5042 mem := v.Args[2] 5043 v.reset(Op386MOVSSloadidx1) 5044 v.AuxInt = c + d 5045 v.Aux = sym 5046 v.AddArg(ptr) 5047 v.AddArg(idx) 5048 v.AddArg(mem) 5049 return true 5050 } 5051 // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5052 // cond: 5053 // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem) 5054 for { 5055 c := v.AuxInt 5056 sym := v.Aux 5057 ptr := v.Args[0] 5058 v_1 := v.Args[1] 5059 if v_1.Op != Op386ADDLconst { 5060 break 5061 } 5062 d := v_1.AuxInt 5063 idx := v_1.Args[0] 5064 mem := v.Args[2] 5065 v.reset(Op386MOVSSloadidx1) 5066 v.AuxInt = c + d 5067 v.Aux = sym 5068 v.AddArg(ptr) 5069 v.AddArg(idx) 5070 v.AddArg(mem) 5071 return true 5072 } 5073 return false 5074 } 5075 func rewriteValue386_Op386MOVSSloadidx4(v *Value, config *Config) bool { 5076 b := v.Block 5077 _ = b 5078 // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 5079 // cond: 5080 // result: (MOVSSloadidx4 [c+d] {sym} ptr idx mem) 5081 for { 5082 c := v.AuxInt 5083 sym := v.Aux 5084 v_0 := v.Args[0] 5085 if v_0.Op != Op386ADDLconst { 5086 break 5087 } 5088 d := v_0.AuxInt 5089 ptr := v_0.Args[0] 5090 idx := v.Args[1] 5091 mem := v.Args[2] 5092 v.reset(Op386MOVSSloadidx4) 5093 v.AuxInt = c + d 5094 v.Aux = sym 5095 v.AddArg(ptr) 5096 v.AddArg(idx) 5097 v.AddArg(mem) 5098 return true 5099 } 5100 // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 5101 // cond: 5102 // result: (MOVSSloadidx4 [c+4*d] {sym} ptr idx mem) 5103 for { 5104 c := v.AuxInt 5105 sym := v.Aux 5106 ptr := v.Args[0] 5107 v_1 := v.Args[1] 5108 if v_1.Op != Op386ADDLconst { 5109 break 5110 } 5111 d := v_1.AuxInt 5112 idx := v_1.Args[0] 5113 mem := v.Args[2] 5114 v.reset(Op386MOVSSloadidx4) 5115 v.AuxInt = c + 4*d 5116 v.Aux = sym 5117 v.AddArg(ptr) 5118 v.AddArg(idx) 5119 v.AddArg(mem) 5120 return true 5121 } 5122 return false 5123 } 5124 func rewriteValue386_Op386MOVSSstore(v *Value, config *Config) bool { 5125 b := v.Block 5126 _ = b 5127 // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5128 // cond: is32Bit(off1+off2) 5129 // result: (MOVSSstore [off1+off2] {sym} ptr val mem) 5130 for { 5131 off1 := v.AuxInt 5132 sym := v.Aux 5133 v_0 := v.Args[0] 5134 if v_0.Op != Op386ADDLconst { 5135 break 5136 } 5137 off2 := v_0.AuxInt 5138 ptr := v_0.Args[0] 5139 val := v.Args[1] 5140 mem := v.Args[2] 5141 if !(is32Bit(off1 + off2)) { 5142 break 5143 } 5144 v.reset(Op386MOVSSstore) 5145 v.AuxInt = off1 + off2 5146 v.Aux = sym 5147 v.AddArg(ptr) 5148 v.AddArg(val) 5149 v.AddArg(mem) 5150 return true 5151 } 5152 // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5153 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5154 // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5155 for { 5156 off1 := v.AuxInt 5157 sym1 := v.Aux 5158 v_0 := v.Args[0] 5159 if v_0.Op != Op386LEAL { 5160 break 5161 } 5162 off2 := v_0.AuxInt 5163 sym2 := v_0.Aux 5164 base := v_0.Args[0] 5165 val := v.Args[1] 5166 mem := v.Args[2] 5167 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5168 break 5169 } 5170 v.reset(Op386MOVSSstore) 5171 v.AuxInt = off1 + off2 5172 v.Aux = mergeSym(sym1, sym2) 5173 v.AddArg(base) 5174 v.AddArg(val) 5175 v.AddArg(mem) 5176 return true 5177 } 5178 // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5179 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5180 // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5181 for { 5182 off1 := v.AuxInt 5183 sym1 := v.Aux 5184 v_0 := v.Args[0] 5185 if v_0.Op != Op386LEAL1 { 5186 break 5187 } 5188 off2 := v_0.AuxInt 5189 sym2 := v_0.Aux 5190 ptr := v_0.Args[0] 5191 idx := v_0.Args[1] 5192 val := v.Args[1] 5193 mem := v.Args[2] 5194 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5195 break 5196 } 5197 v.reset(Op386MOVSSstoreidx1) 5198 v.AuxInt = off1 + off2 5199 v.Aux = mergeSym(sym1, sym2) 5200 v.AddArg(ptr) 5201 v.AddArg(idx) 5202 v.AddArg(val) 5203 v.AddArg(mem) 5204 return true 5205 } 5206 // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 5207 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5208 // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5209 for { 5210 off1 := v.AuxInt 5211 sym1 := v.Aux 5212 v_0 := v.Args[0] 5213 if v_0.Op != Op386LEAL4 { 5214 break 5215 } 5216 off2 := v_0.AuxInt 5217 sym2 := v_0.Aux 5218 ptr := v_0.Args[0] 5219 idx := v_0.Args[1] 5220 val := v.Args[1] 5221 mem := v.Args[2] 5222 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5223 break 5224 } 5225 v.reset(Op386MOVSSstoreidx4) 5226 v.AuxInt = off1 + off2 5227 v.Aux = mergeSym(sym1, sym2) 5228 v.AddArg(ptr) 5229 v.AddArg(idx) 5230 v.AddArg(val) 5231 v.AddArg(mem) 5232 return true 5233 } 5234 // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) 5235 // cond: ptr.Op != OpSB 5236 // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) 5237 for { 5238 off := v.AuxInt 5239 sym := v.Aux 5240 v_0 := v.Args[0] 5241 if v_0.Op != Op386ADDL { 5242 break 5243 } 5244 ptr := v_0.Args[0] 5245 idx := v_0.Args[1] 5246 val := v.Args[1] 5247 mem := v.Args[2] 5248 if !(ptr.Op != OpSB) { 5249 break 5250 } 5251 v.reset(Op386MOVSSstoreidx1) 5252 v.AuxInt = off 5253 v.Aux = sym 5254 v.AddArg(ptr) 5255 v.AddArg(idx) 5256 v.AddArg(val) 5257 v.AddArg(mem) 5258 return true 5259 } 5260 return false 5261 } 5262 func rewriteValue386_Op386MOVSSstoreidx1(v *Value, config *Config) bool { 5263 b := v.Block 5264 _ = b 5265 // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5266 // cond: 5267 // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem) 5268 for { 5269 c := v.AuxInt 5270 sym := v.Aux 5271 v_0 := v.Args[0] 5272 if v_0.Op != Op386ADDLconst { 5273 break 5274 } 5275 d := v_0.AuxInt 5276 ptr := v_0.Args[0] 5277 idx := v.Args[1] 5278 val := v.Args[2] 5279 mem := v.Args[3] 5280 v.reset(Op386MOVSSstoreidx1) 5281 v.AuxInt = c + d 5282 v.Aux = sym 5283 v.AddArg(ptr) 5284 v.AddArg(idx) 5285 v.AddArg(val) 5286 v.AddArg(mem) 5287 return true 5288 } 5289 // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5290 // cond: 5291 // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem) 5292 for { 5293 c := v.AuxInt 5294 sym := v.Aux 5295 ptr := v.Args[0] 5296 v_1 := v.Args[1] 5297 if v_1.Op != Op386ADDLconst { 5298 break 5299 } 5300 d := v_1.AuxInt 5301 idx := v_1.Args[0] 5302 val := v.Args[2] 5303 mem := v.Args[3] 5304 v.reset(Op386MOVSSstoreidx1) 5305 v.AuxInt = c + d 5306 v.Aux = sym 5307 v.AddArg(ptr) 5308 v.AddArg(idx) 5309 v.AddArg(val) 5310 v.AddArg(mem) 5311 return true 5312 } 5313 return false 5314 } 5315 func rewriteValue386_Op386MOVSSstoreidx4(v *Value, config *Config) bool { 5316 b := v.Block 5317 _ = b 5318 // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5319 // cond: 5320 // result: (MOVSSstoreidx4 [c+d] {sym} ptr idx val mem) 5321 for { 5322 c := v.AuxInt 5323 sym := v.Aux 5324 v_0 := v.Args[0] 5325 if v_0.Op != Op386ADDLconst { 5326 break 5327 } 5328 d := v_0.AuxInt 5329 ptr := v_0.Args[0] 5330 idx := v.Args[1] 5331 val := v.Args[2] 5332 mem := v.Args[3] 5333 v.reset(Op386MOVSSstoreidx4) 5334 v.AuxInt = c + d 5335 v.Aux = sym 5336 v.AddArg(ptr) 5337 v.AddArg(idx) 5338 v.AddArg(val) 5339 v.AddArg(mem) 5340 return true 5341 } 5342 // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5343 // cond: 5344 // result: (MOVSSstoreidx4 [c+4*d] {sym} ptr idx val mem) 5345 for { 5346 c := v.AuxInt 5347 sym := v.Aux 5348 ptr := v.Args[0] 5349 v_1 := v.Args[1] 5350 if v_1.Op != Op386ADDLconst { 5351 break 5352 } 5353 d := v_1.AuxInt 5354 idx := v_1.Args[0] 5355 val := v.Args[2] 5356 mem := v.Args[3] 5357 v.reset(Op386MOVSSstoreidx4) 5358 v.AuxInt = c + 4*d 5359 v.Aux = sym 5360 v.AddArg(ptr) 5361 v.AddArg(idx) 5362 v.AddArg(val) 5363 v.AddArg(mem) 5364 return true 5365 } 5366 return false 5367 } 5368 func rewriteValue386_Op386MOVWLSX(v *Value, config *Config) bool { 5369 b := v.Block 5370 _ = b 5371 // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) 5372 // cond: x.Uses == 1 && clobber(x) 5373 // result: @x.Block (MOVWLSXload <v.Type> [off] {sym} ptr mem) 5374 for { 5375 x := v.Args[0] 5376 if x.Op != Op386MOVWload { 5377 break 5378 } 5379 off := x.AuxInt 5380 sym := x.Aux 5381 ptr := x.Args[0] 5382 mem := x.Args[1] 5383 if !(x.Uses == 1 && clobber(x)) { 5384 break 5385 } 5386 b = x.Block 5387 v0 := b.NewValue0(v.Pos, Op386MOVWLSXload, v.Type) 5388 v.reset(OpCopy) 5389 v.AddArg(v0) 5390 v0.AuxInt = off 5391 v0.Aux = sym 5392 v0.AddArg(ptr) 5393 v0.AddArg(mem) 5394 return true 5395 } 5396 // match: (MOVWLSX (ANDLconst [c] x)) 5397 // cond: c & 0x8000 == 0 5398 // result: (ANDLconst [c & 0x7fff] x) 5399 for { 5400 v_0 := v.Args[0] 5401 if v_0.Op != Op386ANDLconst { 5402 break 5403 } 5404 c := v_0.AuxInt 5405 x := v_0.Args[0] 5406 if !(c&0x8000 == 0) { 5407 break 5408 } 5409 v.reset(Op386ANDLconst) 5410 v.AuxInt = c & 0x7fff 5411 v.AddArg(x) 5412 return true 5413 } 5414 return false 5415 } 5416 func rewriteValue386_Op386MOVWLSXload(v *Value, config *Config) bool { 5417 b := v.Block 5418 _ = b 5419 // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5420 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5421 // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5422 for { 5423 off1 := v.AuxInt 5424 sym1 := v.Aux 5425 v_0 := v.Args[0] 5426 if v_0.Op != Op386LEAL { 5427 break 5428 } 5429 off2 := v_0.AuxInt 5430 sym2 := v_0.Aux 5431 base := v_0.Args[0] 5432 mem := v.Args[1] 5433 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5434 break 5435 } 5436 v.reset(Op386MOVWLSXload) 5437 v.AuxInt = off1 + off2 5438 v.Aux = mergeSym(sym1, sym2) 5439 v.AddArg(base) 5440 v.AddArg(mem) 5441 return true 5442 } 5443 return false 5444 } 5445 func rewriteValue386_Op386MOVWLZX(v *Value, config *Config) bool { 5446 b := v.Block 5447 _ = b 5448 // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) 5449 // cond: x.Uses == 1 && clobber(x) 5450 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 5451 for { 5452 x := v.Args[0] 5453 if x.Op != Op386MOVWload { 5454 break 5455 } 5456 off := x.AuxInt 5457 sym := x.Aux 5458 ptr := x.Args[0] 5459 mem := x.Args[1] 5460 if !(x.Uses == 1 && clobber(x)) { 5461 break 5462 } 5463 b = x.Block 5464 v0 := b.NewValue0(v.Pos, Op386MOVWload, v.Type) 5465 v.reset(OpCopy) 5466 v.AddArg(v0) 5467 v0.AuxInt = off 5468 v0.Aux = sym 5469 v0.AddArg(ptr) 5470 v0.AddArg(mem) 5471 return true 5472 } 5473 // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) 5474 // cond: x.Uses == 1 && clobber(x) 5475 // result: @x.Block (MOVWloadidx1 <v.Type> [off] {sym} ptr idx mem) 5476 for { 5477 x := v.Args[0] 5478 if x.Op != Op386MOVWloadidx1 { 5479 break 5480 } 5481 off := x.AuxInt 5482 sym := x.Aux 5483 ptr := x.Args[0] 5484 idx := x.Args[1] 5485 mem := x.Args[2] 5486 if !(x.Uses == 1 && clobber(x)) { 5487 break 5488 } 5489 b = x.Block 5490 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 5491 v.reset(OpCopy) 5492 v.AddArg(v0) 5493 v0.AuxInt = off 5494 v0.Aux = sym 5495 v0.AddArg(ptr) 5496 v0.AddArg(idx) 5497 v0.AddArg(mem) 5498 return true 5499 } 5500 // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) 5501 // cond: x.Uses == 1 && clobber(x) 5502 // result: @x.Block (MOVWloadidx2 <v.Type> [off] {sym} ptr idx mem) 5503 for { 5504 x := v.Args[0] 5505 if x.Op != Op386MOVWloadidx2 { 5506 break 5507 } 5508 off := x.AuxInt 5509 sym := x.Aux 5510 ptr := x.Args[0] 5511 idx := x.Args[1] 5512 mem := x.Args[2] 5513 if !(x.Uses == 1 && clobber(x)) { 5514 break 5515 } 5516 b = x.Block 5517 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) 5518 v.reset(OpCopy) 5519 v.AddArg(v0) 5520 v0.AuxInt = off 5521 v0.Aux = sym 5522 v0.AddArg(ptr) 5523 v0.AddArg(idx) 5524 v0.AddArg(mem) 5525 return true 5526 } 5527 // match: (MOVWLZX (ANDLconst [c] x)) 5528 // cond: 5529 // result: (ANDLconst [c & 0xffff] x) 5530 for { 5531 v_0 := v.Args[0] 5532 if v_0.Op != Op386ANDLconst { 5533 break 5534 } 5535 c := v_0.AuxInt 5536 x := v_0.Args[0] 5537 v.reset(Op386ANDLconst) 5538 v.AuxInt = c & 0xffff 5539 v.AddArg(x) 5540 return true 5541 } 5542 return false 5543 } 5544 func rewriteValue386_Op386MOVWload(v *Value, config *Config) bool { 5545 b := v.Block 5546 _ = b 5547 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 5548 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5549 // result: x 5550 for { 5551 off := v.AuxInt 5552 sym := v.Aux 5553 ptr := v.Args[0] 5554 v_1 := v.Args[1] 5555 if v_1.Op != Op386MOVWstore { 5556 break 5557 } 5558 off2 := v_1.AuxInt 5559 sym2 := v_1.Aux 5560 ptr2 := v_1.Args[0] 5561 x := v_1.Args[1] 5562 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5563 break 5564 } 5565 v.reset(OpCopy) 5566 v.Type = x.Type 5567 v.AddArg(x) 5568 return true 5569 } 5570 // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) 5571 // cond: is32Bit(off1+off2) 5572 // result: (MOVWload [off1+off2] {sym} ptr mem) 5573 for { 5574 off1 := v.AuxInt 5575 sym := v.Aux 5576 v_0 := v.Args[0] 5577 if v_0.Op != Op386ADDLconst { 5578 break 5579 } 5580 off2 := v_0.AuxInt 5581 ptr := v_0.Args[0] 5582 mem := v.Args[1] 5583 if !(is32Bit(off1 + off2)) { 5584 break 5585 } 5586 v.reset(Op386MOVWload) 5587 v.AuxInt = off1 + off2 5588 v.Aux = sym 5589 v.AddArg(ptr) 5590 v.AddArg(mem) 5591 return true 5592 } 5593 // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5594 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5595 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5596 for { 5597 off1 := v.AuxInt 5598 sym1 := v.Aux 5599 v_0 := v.Args[0] 5600 if v_0.Op != Op386LEAL { 5601 break 5602 } 5603 off2 := v_0.AuxInt 5604 sym2 := v_0.Aux 5605 base := v_0.Args[0] 5606 mem := v.Args[1] 5607 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5608 break 5609 } 5610 v.reset(Op386MOVWload) 5611 v.AuxInt = off1 + off2 5612 v.Aux = mergeSym(sym1, sym2) 5613 v.AddArg(base) 5614 v.AddArg(mem) 5615 return true 5616 } 5617 // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5618 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5619 // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5620 for { 5621 off1 := v.AuxInt 5622 sym1 := v.Aux 5623 v_0 := v.Args[0] 5624 if v_0.Op != Op386LEAL1 { 5625 break 5626 } 5627 off2 := v_0.AuxInt 5628 sym2 := v_0.Aux 5629 ptr := v_0.Args[0] 5630 idx := v_0.Args[1] 5631 mem := v.Args[1] 5632 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5633 break 5634 } 5635 v.reset(Op386MOVWloadidx1) 5636 v.AuxInt = off1 + off2 5637 v.Aux = mergeSym(sym1, sym2) 5638 v.AddArg(ptr) 5639 v.AddArg(idx) 5640 v.AddArg(mem) 5641 return true 5642 } 5643 // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) 5644 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5645 // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5646 for { 5647 off1 := v.AuxInt 5648 sym1 := v.Aux 5649 v_0 := v.Args[0] 5650 if v_0.Op != Op386LEAL2 { 5651 break 5652 } 5653 off2 := v_0.AuxInt 5654 sym2 := v_0.Aux 5655 ptr := v_0.Args[0] 5656 idx := v_0.Args[1] 5657 mem := v.Args[1] 5658 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5659 break 5660 } 5661 v.reset(Op386MOVWloadidx2) 5662 v.AuxInt = off1 + off2 5663 v.Aux = mergeSym(sym1, sym2) 5664 v.AddArg(ptr) 5665 v.AddArg(idx) 5666 v.AddArg(mem) 5667 return true 5668 } 5669 // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) 5670 // cond: ptr.Op != OpSB 5671 // result: (MOVWloadidx1 [off] {sym} ptr idx mem) 5672 for { 5673 off := v.AuxInt 5674 sym := v.Aux 5675 v_0 := v.Args[0] 5676 if v_0.Op != Op386ADDL { 5677 break 5678 } 5679 ptr := v_0.Args[0] 5680 idx := v_0.Args[1] 5681 mem := v.Args[1] 5682 if !(ptr.Op != OpSB) { 5683 break 5684 } 5685 v.reset(Op386MOVWloadidx1) 5686 v.AuxInt = off 5687 v.Aux = sym 5688 v.AddArg(ptr) 5689 v.AddArg(idx) 5690 v.AddArg(mem) 5691 return true 5692 } 5693 return false 5694 } 5695 func rewriteValue386_Op386MOVWloadidx1(v *Value, config *Config) bool { 5696 b := v.Block 5697 _ = b 5698 // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 5699 // cond: 5700 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 5701 for { 5702 c := v.AuxInt 5703 sym := v.Aux 5704 ptr := v.Args[0] 5705 v_1 := v.Args[1] 5706 if v_1.Op != Op386SHLLconst { 5707 break 5708 } 5709 if v_1.AuxInt != 1 { 5710 break 5711 } 5712 idx := v_1.Args[0] 5713 mem := v.Args[2] 5714 v.reset(Op386MOVWloadidx2) 5715 v.AuxInt = c 5716 v.Aux = sym 5717 v.AddArg(ptr) 5718 v.AddArg(idx) 5719 v.AddArg(mem) 5720 return true 5721 } 5722 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5723 // cond: 5724 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 5725 for { 5726 c := v.AuxInt 5727 sym := v.Aux 5728 v_0 := v.Args[0] 5729 if v_0.Op != Op386ADDLconst { 5730 break 5731 } 5732 d := v_0.AuxInt 5733 ptr := v_0.Args[0] 5734 idx := v.Args[1] 5735 mem := v.Args[2] 5736 v.reset(Op386MOVWloadidx1) 5737 v.AuxInt = c + d 5738 v.Aux = sym 5739 v.AddArg(ptr) 5740 v.AddArg(idx) 5741 v.AddArg(mem) 5742 return true 5743 } 5744 // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5745 // cond: 5746 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 5747 for { 5748 c := v.AuxInt 5749 sym := v.Aux 5750 ptr := v.Args[0] 5751 v_1 := v.Args[1] 5752 if v_1.Op != Op386ADDLconst { 5753 break 5754 } 5755 d := v_1.AuxInt 5756 idx := v_1.Args[0] 5757 mem := v.Args[2] 5758 v.reset(Op386MOVWloadidx1) 5759 v.AuxInt = c + d 5760 v.Aux = sym 5761 v.AddArg(ptr) 5762 v.AddArg(idx) 5763 v.AddArg(mem) 5764 return true 5765 } 5766 return false 5767 } 5768 func rewriteValue386_Op386MOVWloadidx2(v *Value, config *Config) bool { 5769 b := v.Block 5770 _ = b 5771 // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) 5772 // cond: 5773 // result: (MOVWloadidx2 [c+d] {sym} ptr idx mem) 5774 for { 5775 c := v.AuxInt 5776 sym := v.Aux 5777 v_0 := v.Args[0] 5778 if v_0.Op != Op386ADDLconst { 5779 break 5780 } 5781 d := v_0.AuxInt 5782 ptr := v_0.Args[0] 5783 idx := v.Args[1] 5784 mem := v.Args[2] 5785 v.reset(Op386MOVWloadidx2) 5786 v.AuxInt = c + d 5787 v.Aux = sym 5788 v.AddArg(ptr) 5789 v.AddArg(idx) 5790 v.AddArg(mem) 5791 return true 5792 } 5793 // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) 5794 // cond: 5795 // result: (MOVWloadidx2 [c+2*d] {sym} ptr idx mem) 5796 for { 5797 c := v.AuxInt 5798 sym := v.Aux 5799 ptr := v.Args[0] 5800 v_1 := v.Args[1] 5801 if v_1.Op != Op386ADDLconst { 5802 break 5803 } 5804 d := v_1.AuxInt 5805 idx := v_1.Args[0] 5806 mem := v.Args[2] 5807 v.reset(Op386MOVWloadidx2) 5808 v.AuxInt = c + 2*d 5809 v.Aux = sym 5810 v.AddArg(ptr) 5811 v.AddArg(idx) 5812 v.AddArg(mem) 5813 return true 5814 } 5815 return false 5816 } 5817 func rewriteValue386_Op386MOVWstore(v *Value, config *Config) bool { 5818 b := v.Block 5819 _ = b 5820 // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) 5821 // cond: 5822 // result: (MOVWstore [off] {sym} ptr x mem) 5823 for { 5824 off := v.AuxInt 5825 sym := v.Aux 5826 ptr := v.Args[0] 5827 v_1 := v.Args[1] 5828 if v_1.Op != Op386MOVWLSX { 5829 break 5830 } 5831 x := v_1.Args[0] 5832 mem := v.Args[2] 5833 v.reset(Op386MOVWstore) 5834 v.AuxInt = off 5835 v.Aux = sym 5836 v.AddArg(ptr) 5837 v.AddArg(x) 5838 v.AddArg(mem) 5839 return true 5840 } 5841 // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) 5842 // cond: 5843 // result: (MOVWstore [off] {sym} ptr x mem) 5844 for { 5845 off := v.AuxInt 5846 sym := v.Aux 5847 ptr := v.Args[0] 5848 v_1 := v.Args[1] 5849 if v_1.Op != Op386MOVWLZX { 5850 break 5851 } 5852 x := v_1.Args[0] 5853 mem := v.Args[2] 5854 v.reset(Op386MOVWstore) 5855 v.AuxInt = off 5856 v.Aux = sym 5857 v.AddArg(ptr) 5858 v.AddArg(x) 5859 v.AddArg(mem) 5860 return true 5861 } 5862 // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5863 // cond: is32Bit(off1+off2) 5864 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 5865 for { 5866 off1 := v.AuxInt 5867 sym := v.Aux 5868 v_0 := v.Args[0] 5869 if v_0.Op != Op386ADDLconst { 5870 break 5871 } 5872 off2 := v_0.AuxInt 5873 ptr := v_0.Args[0] 5874 val := v.Args[1] 5875 mem := v.Args[2] 5876 if !(is32Bit(off1 + off2)) { 5877 break 5878 } 5879 v.reset(Op386MOVWstore) 5880 v.AuxInt = off1 + off2 5881 v.Aux = sym 5882 v.AddArg(ptr) 5883 v.AddArg(val) 5884 v.AddArg(mem) 5885 return true 5886 } 5887 // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) 5888 // cond: validOff(off) 5889 // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 5890 for { 5891 off := v.AuxInt 5892 sym := v.Aux 5893 ptr := v.Args[0] 5894 v_1 := v.Args[1] 5895 if v_1.Op != Op386MOVLconst { 5896 break 5897 } 5898 c := v_1.AuxInt 5899 mem := v.Args[2] 5900 if !(validOff(off)) { 5901 break 5902 } 5903 v.reset(Op386MOVWstoreconst) 5904 v.AuxInt = makeValAndOff(int64(int16(c)), off) 5905 v.Aux = sym 5906 v.AddArg(ptr) 5907 v.AddArg(mem) 5908 return true 5909 } 5910 // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5911 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5912 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5913 for { 5914 off1 := v.AuxInt 5915 sym1 := v.Aux 5916 v_0 := v.Args[0] 5917 if v_0.Op != Op386LEAL { 5918 break 5919 } 5920 off2 := v_0.AuxInt 5921 sym2 := v_0.Aux 5922 base := v_0.Args[0] 5923 val := v.Args[1] 5924 mem := v.Args[2] 5925 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5926 break 5927 } 5928 v.reset(Op386MOVWstore) 5929 v.AuxInt = off1 + off2 5930 v.Aux = mergeSym(sym1, sym2) 5931 v.AddArg(base) 5932 v.AddArg(val) 5933 v.AddArg(mem) 5934 return true 5935 } 5936 // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5937 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5938 // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5939 for { 5940 off1 := v.AuxInt 5941 sym1 := v.Aux 5942 v_0 := v.Args[0] 5943 if v_0.Op != Op386LEAL1 { 5944 break 5945 } 5946 off2 := v_0.AuxInt 5947 sym2 := v_0.Aux 5948 ptr := v_0.Args[0] 5949 idx := v_0.Args[1] 5950 val := v.Args[1] 5951 mem := v.Args[2] 5952 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5953 break 5954 } 5955 v.reset(Op386MOVWstoreidx1) 5956 v.AuxInt = off1 + off2 5957 v.Aux = mergeSym(sym1, sym2) 5958 v.AddArg(ptr) 5959 v.AddArg(idx) 5960 v.AddArg(val) 5961 v.AddArg(mem) 5962 return true 5963 } 5964 // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) 5965 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5966 // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5967 for { 5968 off1 := v.AuxInt 5969 sym1 := v.Aux 5970 v_0 := v.Args[0] 5971 if v_0.Op != Op386LEAL2 { 5972 break 5973 } 5974 off2 := v_0.AuxInt 5975 sym2 := v_0.Aux 5976 ptr := v_0.Args[0] 5977 idx := v_0.Args[1] 5978 val := v.Args[1] 5979 mem := v.Args[2] 5980 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5981 break 5982 } 5983 v.reset(Op386MOVWstoreidx2) 5984 v.AuxInt = off1 + off2 5985 v.Aux = mergeSym(sym1, sym2) 5986 v.AddArg(ptr) 5987 v.AddArg(idx) 5988 v.AddArg(val) 5989 v.AddArg(mem) 5990 return true 5991 } 5992 // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) 5993 // cond: ptr.Op != OpSB 5994 // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) 5995 for { 5996 off := v.AuxInt 5997 sym := v.Aux 5998 v_0 := v.Args[0] 5999 if v_0.Op != Op386ADDL { 6000 break 6001 } 6002 ptr := v_0.Args[0] 6003 idx := v_0.Args[1] 6004 val := v.Args[1] 6005 mem := v.Args[2] 6006 if !(ptr.Op != OpSB) { 6007 break 6008 } 6009 v.reset(Op386MOVWstoreidx1) 6010 v.AuxInt = off 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 // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) 6019 // cond: x.Uses == 1 && clobber(x) 6020 // result: (MOVLstore [i-2] {s} p w mem) 6021 for { 6022 i := v.AuxInt 6023 s := v.Aux 6024 p := v.Args[0] 6025 v_1 := v.Args[1] 6026 if v_1.Op != Op386SHRLconst { 6027 break 6028 } 6029 if v_1.AuxInt != 16 { 6030 break 6031 } 6032 w := v_1.Args[0] 6033 x := v.Args[2] 6034 if x.Op != Op386MOVWstore { 6035 break 6036 } 6037 if x.AuxInt != i-2 { 6038 break 6039 } 6040 if x.Aux != s { 6041 break 6042 } 6043 if p != x.Args[0] { 6044 break 6045 } 6046 if w != x.Args[1] { 6047 break 6048 } 6049 mem := x.Args[2] 6050 if !(x.Uses == 1 && clobber(x)) { 6051 break 6052 } 6053 v.reset(Op386MOVLstore) 6054 v.AuxInt = i - 2 6055 v.Aux = s 6056 v.AddArg(p) 6057 v.AddArg(w) 6058 v.AddArg(mem) 6059 return true 6060 } 6061 // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) 6062 // cond: x.Uses == 1 && clobber(x) 6063 // result: (MOVLstore [i-2] {s} p w0 mem) 6064 for { 6065 i := v.AuxInt 6066 s := v.Aux 6067 p := v.Args[0] 6068 v_1 := v.Args[1] 6069 if v_1.Op != Op386SHRLconst { 6070 break 6071 } 6072 j := v_1.AuxInt 6073 w := v_1.Args[0] 6074 x := v.Args[2] 6075 if x.Op != Op386MOVWstore { 6076 break 6077 } 6078 if x.AuxInt != i-2 { 6079 break 6080 } 6081 if x.Aux != s { 6082 break 6083 } 6084 if p != x.Args[0] { 6085 break 6086 } 6087 w0 := x.Args[1] 6088 if w0.Op != Op386SHRLconst { 6089 break 6090 } 6091 if w0.AuxInt != j-16 { 6092 break 6093 } 6094 if w != w0.Args[0] { 6095 break 6096 } 6097 mem := x.Args[2] 6098 if !(x.Uses == 1 && clobber(x)) { 6099 break 6100 } 6101 v.reset(Op386MOVLstore) 6102 v.AuxInt = i - 2 6103 v.Aux = s 6104 v.AddArg(p) 6105 v.AddArg(w0) 6106 v.AddArg(mem) 6107 return true 6108 } 6109 return false 6110 } 6111 func rewriteValue386_Op386MOVWstoreconst(v *Value, config *Config) bool { 6112 b := v.Block 6113 _ = b 6114 // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 6115 // cond: ValAndOff(sc).canAdd(off) 6116 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 6117 for { 6118 sc := v.AuxInt 6119 s := v.Aux 6120 v_0 := v.Args[0] 6121 if v_0.Op != Op386ADDLconst { 6122 break 6123 } 6124 off := v_0.AuxInt 6125 ptr := v_0.Args[0] 6126 mem := v.Args[1] 6127 if !(ValAndOff(sc).canAdd(off)) { 6128 break 6129 } 6130 v.reset(Op386MOVWstoreconst) 6131 v.AuxInt = ValAndOff(sc).add(off) 6132 v.Aux = s 6133 v.AddArg(ptr) 6134 v.AddArg(mem) 6135 return true 6136 } 6137 // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 6138 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 6139 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 6140 for { 6141 sc := v.AuxInt 6142 sym1 := v.Aux 6143 v_0 := v.Args[0] 6144 if v_0.Op != Op386LEAL { 6145 break 6146 } 6147 off := v_0.AuxInt 6148 sym2 := v_0.Aux 6149 ptr := v_0.Args[0] 6150 mem := v.Args[1] 6151 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 6152 break 6153 } 6154 v.reset(Op386MOVWstoreconst) 6155 v.AuxInt = ValAndOff(sc).add(off) 6156 v.Aux = mergeSym(sym1, sym2) 6157 v.AddArg(ptr) 6158 v.AddArg(mem) 6159 return true 6160 } 6161 // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 6162 // cond: canMergeSym(sym1, sym2) 6163 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 6164 for { 6165 x := v.AuxInt 6166 sym1 := v.Aux 6167 v_0 := v.Args[0] 6168 if v_0.Op != Op386LEAL1 { 6169 break 6170 } 6171 off := v_0.AuxInt 6172 sym2 := v_0.Aux 6173 ptr := v_0.Args[0] 6174 idx := v_0.Args[1] 6175 mem := v.Args[1] 6176 if !(canMergeSym(sym1, sym2)) { 6177 break 6178 } 6179 v.reset(Op386MOVWstoreconstidx1) 6180 v.AuxInt = ValAndOff(x).add(off) 6181 v.Aux = mergeSym(sym1, sym2) 6182 v.AddArg(ptr) 6183 v.AddArg(idx) 6184 v.AddArg(mem) 6185 return true 6186 } 6187 // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) 6188 // cond: canMergeSym(sym1, sym2) 6189 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 6190 for { 6191 x := v.AuxInt 6192 sym1 := v.Aux 6193 v_0 := v.Args[0] 6194 if v_0.Op != Op386LEAL2 { 6195 break 6196 } 6197 off := v_0.AuxInt 6198 sym2 := v_0.Aux 6199 ptr := v_0.Args[0] 6200 idx := v_0.Args[1] 6201 mem := v.Args[1] 6202 if !(canMergeSym(sym1, sym2)) { 6203 break 6204 } 6205 v.reset(Op386MOVWstoreconstidx2) 6206 v.AuxInt = ValAndOff(x).add(off) 6207 v.Aux = mergeSym(sym1, sym2) 6208 v.AddArg(ptr) 6209 v.AddArg(idx) 6210 v.AddArg(mem) 6211 return true 6212 } 6213 // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) 6214 // cond: 6215 // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) 6216 for { 6217 x := v.AuxInt 6218 sym := v.Aux 6219 v_0 := v.Args[0] 6220 if v_0.Op != Op386ADDL { 6221 break 6222 } 6223 ptr := v_0.Args[0] 6224 idx := v_0.Args[1] 6225 mem := v.Args[1] 6226 v.reset(Op386MOVWstoreconstidx1) 6227 v.AuxInt = x 6228 v.Aux = sym 6229 v.AddArg(ptr) 6230 v.AddArg(idx) 6231 v.AddArg(mem) 6232 return true 6233 } 6234 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 6235 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 6236 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 6237 for { 6238 c := v.AuxInt 6239 s := v.Aux 6240 p := v.Args[0] 6241 x := v.Args[1] 6242 if x.Op != Op386MOVWstoreconst { 6243 break 6244 } 6245 a := x.AuxInt 6246 if x.Aux != s { 6247 break 6248 } 6249 if p != x.Args[0] { 6250 break 6251 } 6252 mem := x.Args[1] 6253 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 6254 break 6255 } 6256 v.reset(Op386MOVLstoreconst) 6257 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 6258 v.Aux = s 6259 v.AddArg(p) 6260 v.AddArg(mem) 6261 return true 6262 } 6263 return false 6264 } 6265 func rewriteValue386_Op386MOVWstoreconstidx1(v *Value, config *Config) bool { 6266 b := v.Block 6267 _ = b 6268 // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 6269 // cond: 6270 // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) 6271 for { 6272 c := v.AuxInt 6273 sym := v.Aux 6274 ptr := v.Args[0] 6275 v_1 := v.Args[1] 6276 if v_1.Op != Op386SHLLconst { 6277 break 6278 } 6279 if v_1.AuxInt != 1 { 6280 break 6281 } 6282 idx := v_1.Args[0] 6283 mem := v.Args[2] 6284 v.reset(Op386MOVWstoreconstidx2) 6285 v.AuxInt = c 6286 v.Aux = sym 6287 v.AddArg(ptr) 6288 v.AddArg(idx) 6289 v.AddArg(mem) 6290 return true 6291 } 6292 // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 6293 // cond: 6294 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 6295 for { 6296 x := v.AuxInt 6297 sym := v.Aux 6298 v_0 := v.Args[0] 6299 if v_0.Op != Op386ADDLconst { 6300 break 6301 } 6302 c := v_0.AuxInt 6303 ptr := v_0.Args[0] 6304 idx := v.Args[1] 6305 mem := v.Args[2] 6306 v.reset(Op386MOVWstoreconstidx1) 6307 v.AuxInt = ValAndOff(x).add(c) 6308 v.Aux = sym 6309 v.AddArg(ptr) 6310 v.AddArg(idx) 6311 v.AddArg(mem) 6312 return true 6313 } 6314 // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 6315 // cond: 6316 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 6317 for { 6318 x := v.AuxInt 6319 sym := v.Aux 6320 ptr := v.Args[0] 6321 v_1 := v.Args[1] 6322 if v_1.Op != Op386ADDLconst { 6323 break 6324 } 6325 c := v_1.AuxInt 6326 idx := v_1.Args[0] 6327 mem := v.Args[2] 6328 v.reset(Op386MOVWstoreconstidx1) 6329 v.AuxInt = ValAndOff(x).add(c) 6330 v.Aux = sym 6331 v.AddArg(ptr) 6332 v.AddArg(idx) 6333 v.AddArg(mem) 6334 return true 6335 } 6336 // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) 6337 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 6338 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) 6339 for { 6340 c := v.AuxInt 6341 s := v.Aux 6342 p := v.Args[0] 6343 i := v.Args[1] 6344 x := v.Args[2] 6345 if x.Op != Op386MOVWstoreconstidx1 { 6346 break 6347 } 6348 a := x.AuxInt 6349 if x.Aux != s { 6350 break 6351 } 6352 if p != x.Args[0] { 6353 break 6354 } 6355 if i != x.Args[1] { 6356 break 6357 } 6358 mem := x.Args[2] 6359 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 6360 break 6361 } 6362 v.reset(Op386MOVLstoreconstidx1) 6363 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 6364 v.Aux = s 6365 v.AddArg(p) 6366 v.AddArg(i) 6367 v.AddArg(mem) 6368 return true 6369 } 6370 return false 6371 } 6372 func rewriteValue386_Op386MOVWstoreconstidx2(v *Value, config *Config) bool { 6373 b := v.Block 6374 _ = b 6375 // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) 6376 // cond: 6377 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) 6378 for { 6379 x := v.AuxInt 6380 sym := v.Aux 6381 v_0 := v.Args[0] 6382 if v_0.Op != Op386ADDLconst { 6383 break 6384 } 6385 c := v_0.AuxInt 6386 ptr := v_0.Args[0] 6387 idx := v.Args[1] 6388 mem := v.Args[2] 6389 v.reset(Op386MOVWstoreconstidx2) 6390 v.AuxInt = ValAndOff(x).add(c) 6391 v.Aux = sym 6392 v.AddArg(ptr) 6393 v.AddArg(idx) 6394 v.AddArg(mem) 6395 return true 6396 } 6397 // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) 6398 // cond: 6399 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) 6400 for { 6401 x := v.AuxInt 6402 sym := v.Aux 6403 ptr := v.Args[0] 6404 v_1 := v.Args[1] 6405 if v_1.Op != Op386ADDLconst { 6406 break 6407 } 6408 c := v_1.AuxInt 6409 idx := v_1.Args[0] 6410 mem := v.Args[2] 6411 v.reset(Op386MOVWstoreconstidx2) 6412 v.AuxInt = ValAndOff(x).add(2 * c) 6413 v.Aux = sym 6414 v.AddArg(ptr) 6415 v.AddArg(idx) 6416 v.AddArg(mem) 6417 return true 6418 } 6419 // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) 6420 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 6421 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst <i.Type> [1] i) mem) 6422 for { 6423 c := v.AuxInt 6424 s := v.Aux 6425 p := v.Args[0] 6426 i := v.Args[1] 6427 x := v.Args[2] 6428 if x.Op != Op386MOVWstoreconstidx2 { 6429 break 6430 } 6431 a := x.AuxInt 6432 if x.Aux != s { 6433 break 6434 } 6435 if p != x.Args[0] { 6436 break 6437 } 6438 if i != x.Args[1] { 6439 break 6440 } 6441 mem := x.Args[2] 6442 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 6443 break 6444 } 6445 v.reset(Op386MOVLstoreconstidx1) 6446 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 6447 v.Aux = s 6448 v.AddArg(p) 6449 v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) 6450 v0.AuxInt = 1 6451 v0.AddArg(i) 6452 v.AddArg(v0) 6453 v.AddArg(mem) 6454 return true 6455 } 6456 return false 6457 } 6458 func rewriteValue386_Op386MOVWstoreidx1(v *Value, config *Config) bool { 6459 b := v.Block 6460 _ = b 6461 // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) 6462 // cond: 6463 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 6464 for { 6465 c := v.AuxInt 6466 sym := v.Aux 6467 ptr := v.Args[0] 6468 v_1 := v.Args[1] 6469 if v_1.Op != Op386SHLLconst { 6470 break 6471 } 6472 if v_1.AuxInt != 1 { 6473 break 6474 } 6475 idx := v_1.Args[0] 6476 val := v.Args[2] 6477 mem := v.Args[3] 6478 v.reset(Op386MOVWstoreidx2) 6479 v.AuxInt = c 6480 v.Aux = sym 6481 v.AddArg(ptr) 6482 v.AddArg(idx) 6483 v.AddArg(val) 6484 v.AddArg(mem) 6485 return true 6486 } 6487 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6488 // cond: 6489 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 6490 for { 6491 c := v.AuxInt 6492 sym := v.Aux 6493 v_0 := v.Args[0] 6494 if v_0.Op != Op386ADDLconst { 6495 break 6496 } 6497 d := v_0.AuxInt 6498 ptr := v_0.Args[0] 6499 idx := v.Args[1] 6500 val := v.Args[2] 6501 mem := v.Args[3] 6502 v.reset(Op386MOVWstoreidx1) 6503 v.AuxInt = c + d 6504 v.Aux = sym 6505 v.AddArg(ptr) 6506 v.AddArg(idx) 6507 v.AddArg(val) 6508 v.AddArg(mem) 6509 return true 6510 } 6511 // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6512 // cond: 6513 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 6514 for { 6515 c := v.AuxInt 6516 sym := v.Aux 6517 ptr := v.Args[0] 6518 v_1 := v.Args[1] 6519 if v_1.Op != Op386ADDLconst { 6520 break 6521 } 6522 d := v_1.AuxInt 6523 idx := v_1.Args[0] 6524 val := v.Args[2] 6525 mem := v.Args[3] 6526 v.reset(Op386MOVWstoreidx1) 6527 v.AuxInt = c + d 6528 v.Aux = sym 6529 v.AddArg(ptr) 6530 v.AddArg(idx) 6531 v.AddArg(val) 6532 v.AddArg(mem) 6533 return true 6534 } 6535 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 6536 // cond: x.Uses == 1 && clobber(x) 6537 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 6538 for { 6539 i := v.AuxInt 6540 s := v.Aux 6541 p := v.Args[0] 6542 idx := v.Args[1] 6543 v_2 := v.Args[2] 6544 if v_2.Op != Op386SHRLconst { 6545 break 6546 } 6547 if v_2.AuxInt != 16 { 6548 break 6549 } 6550 w := v_2.Args[0] 6551 x := v.Args[3] 6552 if x.Op != Op386MOVWstoreidx1 { 6553 break 6554 } 6555 if x.AuxInt != i-2 { 6556 break 6557 } 6558 if x.Aux != s { 6559 break 6560 } 6561 if p != x.Args[0] { 6562 break 6563 } 6564 if idx != x.Args[1] { 6565 break 6566 } 6567 if w != x.Args[2] { 6568 break 6569 } 6570 mem := x.Args[3] 6571 if !(x.Uses == 1 && clobber(x)) { 6572 break 6573 } 6574 v.reset(Op386MOVLstoreidx1) 6575 v.AuxInt = i - 2 6576 v.Aux = s 6577 v.AddArg(p) 6578 v.AddArg(idx) 6579 v.AddArg(w) 6580 v.AddArg(mem) 6581 return true 6582 } 6583 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 6584 // cond: x.Uses == 1 && clobber(x) 6585 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 6586 for { 6587 i := v.AuxInt 6588 s := v.Aux 6589 p := v.Args[0] 6590 idx := v.Args[1] 6591 v_2 := v.Args[2] 6592 if v_2.Op != Op386SHRLconst { 6593 break 6594 } 6595 j := v_2.AuxInt 6596 w := v_2.Args[0] 6597 x := v.Args[3] 6598 if x.Op != Op386MOVWstoreidx1 { 6599 break 6600 } 6601 if x.AuxInt != i-2 { 6602 break 6603 } 6604 if x.Aux != s { 6605 break 6606 } 6607 if p != x.Args[0] { 6608 break 6609 } 6610 if idx != x.Args[1] { 6611 break 6612 } 6613 w0 := x.Args[2] 6614 if w0.Op != Op386SHRLconst { 6615 break 6616 } 6617 if w0.AuxInt != j-16 { 6618 break 6619 } 6620 if w != w0.Args[0] { 6621 break 6622 } 6623 mem := x.Args[3] 6624 if !(x.Uses == 1 && clobber(x)) { 6625 break 6626 } 6627 v.reset(Op386MOVLstoreidx1) 6628 v.AuxInt = i - 2 6629 v.Aux = s 6630 v.AddArg(p) 6631 v.AddArg(idx) 6632 v.AddArg(w0) 6633 v.AddArg(mem) 6634 return true 6635 } 6636 return false 6637 } 6638 func rewriteValue386_Op386MOVWstoreidx2(v *Value, config *Config) bool { 6639 b := v.Block 6640 _ = b 6641 // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6642 // cond: 6643 // result: (MOVWstoreidx2 [c+d] {sym} ptr idx val mem) 6644 for { 6645 c := v.AuxInt 6646 sym := v.Aux 6647 v_0 := v.Args[0] 6648 if v_0.Op != Op386ADDLconst { 6649 break 6650 } 6651 d := v_0.AuxInt 6652 ptr := v_0.Args[0] 6653 idx := v.Args[1] 6654 val := v.Args[2] 6655 mem := v.Args[3] 6656 v.reset(Op386MOVWstoreidx2) 6657 v.AuxInt = c + d 6658 v.Aux = sym 6659 v.AddArg(ptr) 6660 v.AddArg(idx) 6661 v.AddArg(val) 6662 v.AddArg(mem) 6663 return true 6664 } 6665 // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6666 // cond: 6667 // result: (MOVWstoreidx2 [c+2*d] {sym} ptr idx val mem) 6668 for { 6669 c := v.AuxInt 6670 sym := v.Aux 6671 ptr := v.Args[0] 6672 v_1 := v.Args[1] 6673 if v_1.Op != Op386ADDLconst { 6674 break 6675 } 6676 d := v_1.AuxInt 6677 idx := v_1.Args[0] 6678 val := v.Args[2] 6679 mem := v.Args[3] 6680 v.reset(Op386MOVWstoreidx2) 6681 v.AuxInt = c + 2*d 6682 v.Aux = sym 6683 v.AddArg(ptr) 6684 v.AddArg(idx) 6685 v.AddArg(val) 6686 v.AddArg(mem) 6687 return true 6688 } 6689 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) 6690 // cond: x.Uses == 1 && clobber(x) 6691 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w mem) 6692 for { 6693 i := v.AuxInt 6694 s := v.Aux 6695 p := v.Args[0] 6696 idx := v.Args[1] 6697 v_2 := v.Args[2] 6698 if v_2.Op != Op386SHRLconst { 6699 break 6700 } 6701 if v_2.AuxInt != 16 { 6702 break 6703 } 6704 w := v_2.Args[0] 6705 x := v.Args[3] 6706 if x.Op != Op386MOVWstoreidx2 { 6707 break 6708 } 6709 if x.AuxInt != i-2 { 6710 break 6711 } 6712 if x.Aux != s { 6713 break 6714 } 6715 if p != x.Args[0] { 6716 break 6717 } 6718 if idx != x.Args[1] { 6719 break 6720 } 6721 if w != x.Args[2] { 6722 break 6723 } 6724 mem := x.Args[3] 6725 if !(x.Uses == 1 && clobber(x)) { 6726 break 6727 } 6728 v.reset(Op386MOVLstoreidx1) 6729 v.AuxInt = i - 2 6730 v.Aux = s 6731 v.AddArg(p) 6732 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 6733 v0.AuxInt = 1 6734 v0.AddArg(idx) 6735 v.AddArg(v0) 6736 v.AddArg(w) 6737 v.AddArg(mem) 6738 return true 6739 } 6740 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 6741 // cond: x.Uses == 1 && clobber(x) 6742 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w0 mem) 6743 for { 6744 i := v.AuxInt 6745 s := v.Aux 6746 p := v.Args[0] 6747 idx := v.Args[1] 6748 v_2 := v.Args[2] 6749 if v_2.Op != Op386SHRLconst { 6750 break 6751 } 6752 j := v_2.AuxInt 6753 w := v_2.Args[0] 6754 x := v.Args[3] 6755 if x.Op != Op386MOVWstoreidx2 { 6756 break 6757 } 6758 if x.AuxInt != i-2 { 6759 break 6760 } 6761 if x.Aux != s { 6762 break 6763 } 6764 if p != x.Args[0] { 6765 break 6766 } 6767 if idx != x.Args[1] { 6768 break 6769 } 6770 w0 := x.Args[2] 6771 if w0.Op != Op386SHRLconst { 6772 break 6773 } 6774 if w0.AuxInt != j-16 { 6775 break 6776 } 6777 if w != w0.Args[0] { 6778 break 6779 } 6780 mem := x.Args[3] 6781 if !(x.Uses == 1 && clobber(x)) { 6782 break 6783 } 6784 v.reset(Op386MOVLstoreidx1) 6785 v.AuxInt = i - 2 6786 v.Aux = s 6787 v.AddArg(p) 6788 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 6789 v0.AuxInt = 1 6790 v0.AddArg(idx) 6791 v.AddArg(v0) 6792 v.AddArg(w0) 6793 v.AddArg(mem) 6794 return true 6795 } 6796 return false 6797 } 6798 func rewriteValue386_Op386MULL(v *Value, config *Config) bool { 6799 b := v.Block 6800 _ = b 6801 // match: (MULL x (MOVLconst [c])) 6802 // cond: 6803 // result: (MULLconst [c] x) 6804 for { 6805 x := v.Args[0] 6806 v_1 := v.Args[1] 6807 if v_1.Op != Op386MOVLconst { 6808 break 6809 } 6810 c := v_1.AuxInt 6811 v.reset(Op386MULLconst) 6812 v.AuxInt = c 6813 v.AddArg(x) 6814 return true 6815 } 6816 // match: (MULL (MOVLconst [c]) x) 6817 // cond: 6818 // result: (MULLconst [c] x) 6819 for { 6820 v_0 := v.Args[0] 6821 if v_0.Op != Op386MOVLconst { 6822 break 6823 } 6824 c := v_0.AuxInt 6825 x := v.Args[1] 6826 v.reset(Op386MULLconst) 6827 v.AuxInt = c 6828 v.AddArg(x) 6829 return true 6830 } 6831 return false 6832 } 6833 func rewriteValue386_Op386MULLconst(v *Value, config *Config) bool { 6834 b := v.Block 6835 _ = b 6836 // match: (MULLconst [c] (MULLconst [d] x)) 6837 // cond: 6838 // result: (MULLconst [int64(int32(c * d))] x) 6839 for { 6840 c := v.AuxInt 6841 v_0 := v.Args[0] 6842 if v_0.Op != Op386MULLconst { 6843 break 6844 } 6845 d := v_0.AuxInt 6846 x := v_0.Args[0] 6847 v.reset(Op386MULLconst) 6848 v.AuxInt = int64(int32(c * d)) 6849 v.AddArg(x) 6850 return true 6851 } 6852 // match: (MULLconst [-1] x) 6853 // cond: 6854 // result: (NEGL x) 6855 for { 6856 if v.AuxInt != -1 { 6857 break 6858 } 6859 x := v.Args[0] 6860 v.reset(Op386NEGL) 6861 v.AddArg(x) 6862 return true 6863 } 6864 // match: (MULLconst [0] _) 6865 // cond: 6866 // result: (MOVLconst [0]) 6867 for { 6868 if v.AuxInt != 0 { 6869 break 6870 } 6871 v.reset(Op386MOVLconst) 6872 v.AuxInt = 0 6873 return true 6874 } 6875 // match: (MULLconst [1] x) 6876 // cond: 6877 // result: x 6878 for { 6879 if v.AuxInt != 1 { 6880 break 6881 } 6882 x := v.Args[0] 6883 v.reset(OpCopy) 6884 v.Type = x.Type 6885 v.AddArg(x) 6886 return true 6887 } 6888 // match: (MULLconst [3] x) 6889 // cond: 6890 // result: (LEAL2 x x) 6891 for { 6892 if v.AuxInt != 3 { 6893 break 6894 } 6895 x := v.Args[0] 6896 v.reset(Op386LEAL2) 6897 v.AddArg(x) 6898 v.AddArg(x) 6899 return true 6900 } 6901 // match: (MULLconst [5] x) 6902 // cond: 6903 // result: (LEAL4 x x) 6904 for { 6905 if v.AuxInt != 5 { 6906 break 6907 } 6908 x := v.Args[0] 6909 v.reset(Op386LEAL4) 6910 v.AddArg(x) 6911 v.AddArg(x) 6912 return true 6913 } 6914 // match: (MULLconst [7] x) 6915 // cond: 6916 // result: (LEAL8 (NEGL <v.Type> x) x) 6917 for { 6918 if v.AuxInt != 7 { 6919 break 6920 } 6921 x := v.Args[0] 6922 v.reset(Op386LEAL8) 6923 v0 := b.NewValue0(v.Pos, Op386NEGL, v.Type) 6924 v0.AddArg(x) 6925 v.AddArg(v0) 6926 v.AddArg(x) 6927 return true 6928 } 6929 // match: (MULLconst [9] x) 6930 // cond: 6931 // result: (LEAL8 x x) 6932 for { 6933 if v.AuxInt != 9 { 6934 break 6935 } 6936 x := v.Args[0] 6937 v.reset(Op386LEAL8) 6938 v.AddArg(x) 6939 v.AddArg(x) 6940 return true 6941 } 6942 // match: (MULLconst [11] x) 6943 // cond: 6944 // result: (LEAL2 x (LEAL4 <v.Type> x x)) 6945 for { 6946 if v.AuxInt != 11 { 6947 break 6948 } 6949 x := v.Args[0] 6950 v.reset(Op386LEAL2) 6951 v.AddArg(x) 6952 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 6953 v0.AddArg(x) 6954 v0.AddArg(x) 6955 v.AddArg(v0) 6956 return true 6957 } 6958 // match: (MULLconst [13] x) 6959 // cond: 6960 // result: (LEAL4 x (LEAL2 <v.Type> x x)) 6961 for { 6962 if v.AuxInt != 13 { 6963 break 6964 } 6965 x := v.Args[0] 6966 v.reset(Op386LEAL4) 6967 v.AddArg(x) 6968 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 6969 v0.AddArg(x) 6970 v0.AddArg(x) 6971 v.AddArg(v0) 6972 return true 6973 } 6974 // match: (MULLconst [21] x) 6975 // cond: 6976 // result: (LEAL4 x (LEAL4 <v.Type> x x)) 6977 for { 6978 if v.AuxInt != 21 { 6979 break 6980 } 6981 x := v.Args[0] 6982 v.reset(Op386LEAL4) 6983 v.AddArg(x) 6984 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 6985 v0.AddArg(x) 6986 v0.AddArg(x) 6987 v.AddArg(v0) 6988 return true 6989 } 6990 // match: (MULLconst [25] x) 6991 // cond: 6992 // result: (LEAL8 x (LEAL2 <v.Type> x x)) 6993 for { 6994 if v.AuxInt != 25 { 6995 break 6996 } 6997 x := v.Args[0] 6998 v.reset(Op386LEAL8) 6999 v.AddArg(x) 7000 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 7001 v0.AddArg(x) 7002 v0.AddArg(x) 7003 v.AddArg(v0) 7004 return true 7005 } 7006 // match: (MULLconst [37] x) 7007 // cond: 7008 // result: (LEAL4 x (LEAL8 <v.Type> x x)) 7009 for { 7010 if v.AuxInt != 37 { 7011 break 7012 } 7013 x := v.Args[0] 7014 v.reset(Op386LEAL4) 7015 v.AddArg(x) 7016 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 7017 v0.AddArg(x) 7018 v0.AddArg(x) 7019 v.AddArg(v0) 7020 return true 7021 } 7022 // match: (MULLconst [41] x) 7023 // cond: 7024 // result: (LEAL8 x (LEAL4 <v.Type> x x)) 7025 for { 7026 if v.AuxInt != 41 { 7027 break 7028 } 7029 x := v.Args[0] 7030 v.reset(Op386LEAL8) 7031 v.AddArg(x) 7032 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 7033 v0.AddArg(x) 7034 v0.AddArg(x) 7035 v.AddArg(v0) 7036 return true 7037 } 7038 // match: (MULLconst [73] x) 7039 // cond: 7040 // result: (LEAL8 x (LEAL8 <v.Type> x x)) 7041 for { 7042 if v.AuxInt != 73 { 7043 break 7044 } 7045 x := v.Args[0] 7046 v.reset(Op386LEAL8) 7047 v.AddArg(x) 7048 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 7049 v0.AddArg(x) 7050 v0.AddArg(x) 7051 v.AddArg(v0) 7052 return true 7053 } 7054 // match: (MULLconst [c] x) 7055 // cond: isPowerOfTwo(c) 7056 // result: (SHLLconst [log2(c)] x) 7057 for { 7058 c := v.AuxInt 7059 x := v.Args[0] 7060 if !(isPowerOfTwo(c)) { 7061 break 7062 } 7063 v.reset(Op386SHLLconst) 7064 v.AuxInt = log2(c) 7065 v.AddArg(x) 7066 return true 7067 } 7068 // match: (MULLconst [c] x) 7069 // cond: isPowerOfTwo(c+1) && c >= 15 7070 // result: (SUBL (SHLLconst <v.Type> [log2(c+1)] x) x) 7071 for { 7072 c := v.AuxInt 7073 x := v.Args[0] 7074 if !(isPowerOfTwo(c+1) && c >= 15) { 7075 break 7076 } 7077 v.reset(Op386SUBL) 7078 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 7079 v0.AuxInt = log2(c + 1) 7080 v0.AddArg(x) 7081 v.AddArg(v0) 7082 v.AddArg(x) 7083 return true 7084 } 7085 // match: (MULLconst [c] x) 7086 // cond: isPowerOfTwo(c-1) && c >= 17 7087 // result: (LEAL1 (SHLLconst <v.Type> [log2(c-1)] x) x) 7088 for { 7089 c := v.AuxInt 7090 x := v.Args[0] 7091 if !(isPowerOfTwo(c-1) && c >= 17) { 7092 break 7093 } 7094 v.reset(Op386LEAL1) 7095 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 7096 v0.AuxInt = log2(c - 1) 7097 v0.AddArg(x) 7098 v.AddArg(v0) 7099 v.AddArg(x) 7100 return true 7101 } 7102 // match: (MULLconst [c] x) 7103 // cond: isPowerOfTwo(c-2) && c >= 34 7104 // result: (LEAL2 (SHLLconst <v.Type> [log2(c-2)] x) x) 7105 for { 7106 c := v.AuxInt 7107 x := v.Args[0] 7108 if !(isPowerOfTwo(c-2) && c >= 34) { 7109 break 7110 } 7111 v.reset(Op386LEAL2) 7112 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 7113 v0.AuxInt = log2(c - 2) 7114 v0.AddArg(x) 7115 v.AddArg(v0) 7116 v.AddArg(x) 7117 return true 7118 } 7119 // match: (MULLconst [c] x) 7120 // cond: isPowerOfTwo(c-4) && c >= 68 7121 // result: (LEAL4 (SHLLconst <v.Type> [log2(c-4)] x) x) 7122 for { 7123 c := v.AuxInt 7124 x := v.Args[0] 7125 if !(isPowerOfTwo(c-4) && c >= 68) { 7126 break 7127 } 7128 v.reset(Op386LEAL4) 7129 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 7130 v0.AuxInt = log2(c - 4) 7131 v0.AddArg(x) 7132 v.AddArg(v0) 7133 v.AddArg(x) 7134 return true 7135 } 7136 // match: (MULLconst [c] x) 7137 // cond: isPowerOfTwo(c-8) && c >= 136 7138 // result: (LEAL8 (SHLLconst <v.Type> [log2(c-8)] x) x) 7139 for { 7140 c := v.AuxInt 7141 x := v.Args[0] 7142 if !(isPowerOfTwo(c-8) && c >= 136) { 7143 break 7144 } 7145 v.reset(Op386LEAL8) 7146 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 7147 v0.AuxInt = log2(c - 8) 7148 v0.AddArg(x) 7149 v.AddArg(v0) 7150 v.AddArg(x) 7151 return true 7152 } 7153 // match: (MULLconst [c] x) 7154 // cond: c%3 == 0 && isPowerOfTwo(c/3) 7155 // result: (SHLLconst [log2(c/3)] (LEAL2 <v.Type> x x)) 7156 for { 7157 c := v.AuxInt 7158 x := v.Args[0] 7159 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 7160 break 7161 } 7162 v.reset(Op386SHLLconst) 7163 v.AuxInt = log2(c / 3) 7164 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 7165 v0.AddArg(x) 7166 v0.AddArg(x) 7167 v.AddArg(v0) 7168 return true 7169 } 7170 // match: (MULLconst [c] x) 7171 // cond: c%5 == 0 && isPowerOfTwo(c/5) 7172 // result: (SHLLconst [log2(c/5)] (LEAL4 <v.Type> x x)) 7173 for { 7174 c := v.AuxInt 7175 x := v.Args[0] 7176 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 7177 break 7178 } 7179 v.reset(Op386SHLLconst) 7180 v.AuxInt = log2(c / 5) 7181 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 7182 v0.AddArg(x) 7183 v0.AddArg(x) 7184 v.AddArg(v0) 7185 return true 7186 } 7187 // match: (MULLconst [c] x) 7188 // cond: c%9 == 0 && isPowerOfTwo(c/9) 7189 // result: (SHLLconst [log2(c/9)] (LEAL8 <v.Type> x x)) 7190 for { 7191 c := v.AuxInt 7192 x := v.Args[0] 7193 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 7194 break 7195 } 7196 v.reset(Op386SHLLconst) 7197 v.AuxInt = log2(c / 9) 7198 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 7199 v0.AddArg(x) 7200 v0.AddArg(x) 7201 v.AddArg(v0) 7202 return true 7203 } 7204 // match: (MULLconst [c] (MOVLconst [d])) 7205 // cond: 7206 // result: (MOVLconst [int64(int32(c*d))]) 7207 for { 7208 c := v.AuxInt 7209 v_0 := v.Args[0] 7210 if v_0.Op != Op386MOVLconst { 7211 break 7212 } 7213 d := v_0.AuxInt 7214 v.reset(Op386MOVLconst) 7215 v.AuxInt = int64(int32(c * d)) 7216 return true 7217 } 7218 return false 7219 } 7220 func rewriteValue386_Op386NEGL(v *Value, config *Config) bool { 7221 b := v.Block 7222 _ = b 7223 // match: (NEGL (MOVLconst [c])) 7224 // cond: 7225 // result: (MOVLconst [int64(int32(-c))]) 7226 for { 7227 v_0 := v.Args[0] 7228 if v_0.Op != Op386MOVLconst { 7229 break 7230 } 7231 c := v_0.AuxInt 7232 v.reset(Op386MOVLconst) 7233 v.AuxInt = int64(int32(-c)) 7234 return true 7235 } 7236 return false 7237 } 7238 func rewriteValue386_Op386NOTL(v *Value, config *Config) bool { 7239 b := v.Block 7240 _ = b 7241 // match: (NOTL (MOVLconst [c])) 7242 // cond: 7243 // result: (MOVLconst [^c]) 7244 for { 7245 v_0 := v.Args[0] 7246 if v_0.Op != Op386MOVLconst { 7247 break 7248 } 7249 c := v_0.AuxInt 7250 v.reset(Op386MOVLconst) 7251 v.AuxInt = ^c 7252 return true 7253 } 7254 return false 7255 } 7256 func rewriteValue386_Op386ORL(v *Value, config *Config) bool { 7257 b := v.Block 7258 _ = b 7259 // match: (ORL x (MOVLconst [c])) 7260 // cond: 7261 // result: (ORLconst [c] x) 7262 for { 7263 x := v.Args[0] 7264 v_1 := v.Args[1] 7265 if v_1.Op != Op386MOVLconst { 7266 break 7267 } 7268 c := v_1.AuxInt 7269 v.reset(Op386ORLconst) 7270 v.AuxInt = c 7271 v.AddArg(x) 7272 return true 7273 } 7274 // match: (ORL (MOVLconst [c]) x) 7275 // cond: 7276 // result: (ORLconst [c] x) 7277 for { 7278 v_0 := v.Args[0] 7279 if v_0.Op != Op386MOVLconst { 7280 break 7281 } 7282 c := v_0.AuxInt 7283 x := v.Args[1] 7284 v.reset(Op386ORLconst) 7285 v.AuxInt = c 7286 v.AddArg(x) 7287 return true 7288 } 7289 // match: ( ORL (SHLLconst [c] x) (SHRLconst [32-c] x)) 7290 // cond: 7291 // result: (ROLLconst [c ] x) 7292 for { 7293 v_0 := v.Args[0] 7294 if v_0.Op != Op386SHLLconst { 7295 break 7296 } 7297 c := v_0.AuxInt 7298 x := v_0.Args[0] 7299 v_1 := v.Args[1] 7300 if v_1.Op != Op386SHRLconst { 7301 break 7302 } 7303 if v_1.AuxInt != 32-c { 7304 break 7305 } 7306 if x != v_1.Args[0] { 7307 break 7308 } 7309 v.reset(Op386ROLLconst) 7310 v.AuxInt = c 7311 v.AddArg(x) 7312 return true 7313 } 7314 // match: ( ORL (SHRLconst [c] x) (SHLLconst [32-c] x)) 7315 // cond: 7316 // result: (ROLLconst [32-c] x) 7317 for { 7318 v_0 := v.Args[0] 7319 if v_0.Op != Op386SHRLconst { 7320 break 7321 } 7322 c := v_0.AuxInt 7323 x := v_0.Args[0] 7324 v_1 := v.Args[1] 7325 if v_1.Op != Op386SHLLconst { 7326 break 7327 } 7328 if v_1.AuxInt != 32-c { 7329 break 7330 } 7331 if x != v_1.Args[0] { 7332 break 7333 } 7334 v.reset(Op386ROLLconst) 7335 v.AuxInt = 32 - c 7336 v.AddArg(x) 7337 return true 7338 } 7339 // match: ( ORL <t> (SHLLconst x [c]) (SHRWconst x [16-c])) 7340 // cond: c < 16 && t.Size() == 2 7341 // result: (ROLWconst x [ c]) 7342 for { 7343 t := v.Type 7344 v_0 := v.Args[0] 7345 if v_0.Op != Op386SHLLconst { 7346 break 7347 } 7348 c := v_0.AuxInt 7349 x := v_0.Args[0] 7350 v_1 := v.Args[1] 7351 if v_1.Op != Op386SHRWconst { 7352 break 7353 } 7354 if v_1.AuxInt != 16-c { 7355 break 7356 } 7357 if x != v_1.Args[0] { 7358 break 7359 } 7360 if !(c < 16 && t.Size() == 2) { 7361 break 7362 } 7363 v.reset(Op386ROLWconst) 7364 v.AuxInt = c 7365 v.AddArg(x) 7366 return true 7367 } 7368 // match: ( ORL <t> (SHRWconst x [c]) (SHLLconst x [16-c])) 7369 // cond: c > 0 && t.Size() == 2 7370 // result: (ROLWconst x [16-c]) 7371 for { 7372 t := v.Type 7373 v_0 := v.Args[0] 7374 if v_0.Op != Op386SHRWconst { 7375 break 7376 } 7377 c := v_0.AuxInt 7378 x := v_0.Args[0] 7379 v_1 := v.Args[1] 7380 if v_1.Op != Op386SHLLconst { 7381 break 7382 } 7383 if v_1.AuxInt != 16-c { 7384 break 7385 } 7386 if x != v_1.Args[0] { 7387 break 7388 } 7389 if !(c > 0 && t.Size() == 2) { 7390 break 7391 } 7392 v.reset(Op386ROLWconst) 7393 v.AuxInt = 16 - c 7394 v.AddArg(x) 7395 return true 7396 } 7397 // match: ( ORL <t> (SHLLconst x [c]) (SHRBconst x [ 8-c])) 7398 // cond: c < 8 && t.Size() == 1 7399 // result: (ROLBconst x [ c]) 7400 for { 7401 t := v.Type 7402 v_0 := v.Args[0] 7403 if v_0.Op != Op386SHLLconst { 7404 break 7405 } 7406 c := v_0.AuxInt 7407 x := v_0.Args[0] 7408 v_1 := v.Args[1] 7409 if v_1.Op != Op386SHRBconst { 7410 break 7411 } 7412 if v_1.AuxInt != 8-c { 7413 break 7414 } 7415 if x != v_1.Args[0] { 7416 break 7417 } 7418 if !(c < 8 && t.Size() == 1) { 7419 break 7420 } 7421 v.reset(Op386ROLBconst) 7422 v.AuxInt = c 7423 v.AddArg(x) 7424 return true 7425 } 7426 // match: ( ORL <t> (SHRBconst x [c]) (SHLLconst x [ 8-c])) 7427 // cond: c > 0 && t.Size() == 1 7428 // result: (ROLBconst x [ 8-c]) 7429 for { 7430 t := v.Type 7431 v_0 := v.Args[0] 7432 if v_0.Op != Op386SHRBconst { 7433 break 7434 } 7435 c := v_0.AuxInt 7436 x := v_0.Args[0] 7437 v_1 := v.Args[1] 7438 if v_1.Op != Op386SHLLconst { 7439 break 7440 } 7441 if v_1.AuxInt != 8-c { 7442 break 7443 } 7444 if x != v_1.Args[0] { 7445 break 7446 } 7447 if !(c > 0 && t.Size() == 1) { 7448 break 7449 } 7450 v.reset(Op386ROLBconst) 7451 v.AuxInt = 8 - c 7452 v.AddArg(x) 7453 return true 7454 } 7455 // match: (ORL x x) 7456 // cond: 7457 // result: x 7458 for { 7459 x := v.Args[0] 7460 if x != v.Args[1] { 7461 break 7462 } 7463 v.reset(OpCopy) 7464 v.Type = x.Type 7465 v.AddArg(x) 7466 return true 7467 } 7468 // match: (ORL x0:(MOVBload [i] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i+1] {s} p mem))) 7469 // cond: x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 7470 // result: @mergePoint(b,x0,x1) (MOVWload [i] {s} p mem) 7471 for { 7472 x0 := v.Args[0] 7473 if x0.Op != Op386MOVBload { 7474 break 7475 } 7476 i := x0.AuxInt 7477 s := x0.Aux 7478 p := x0.Args[0] 7479 mem := x0.Args[1] 7480 s0 := v.Args[1] 7481 if s0.Op != Op386SHLLconst { 7482 break 7483 } 7484 if s0.AuxInt != 8 { 7485 break 7486 } 7487 x1 := s0.Args[0] 7488 if x1.Op != Op386MOVBload { 7489 break 7490 } 7491 if x1.AuxInt != i+1 { 7492 break 7493 } 7494 if x1.Aux != s { 7495 break 7496 } 7497 if p != x1.Args[0] { 7498 break 7499 } 7500 if mem != x1.Args[1] { 7501 break 7502 } 7503 if !(x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 7504 break 7505 } 7506 b = mergePoint(b, x0, x1) 7507 v0 := b.NewValue0(v.Pos, Op386MOVWload, config.fe.TypeUInt16()) 7508 v.reset(OpCopy) 7509 v.AddArg(v0) 7510 v0.AuxInt = i 7511 v0.Aux = s 7512 v0.AddArg(p) 7513 v0.AddArg(mem) 7514 return true 7515 } 7516 // match: (ORL o0:(ORL x0:(MOVWload [i] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i+2] {s} p mem))) s1:(SHLLconst [24] x2:(MOVBload [i+3] {s} p mem))) 7517 // cond: 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) 7518 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i] {s} p mem) 7519 for { 7520 o0 := v.Args[0] 7521 if o0.Op != Op386ORL { 7522 break 7523 } 7524 x0 := o0.Args[0] 7525 if x0.Op != Op386MOVWload { 7526 break 7527 } 7528 i := x0.AuxInt 7529 s := x0.Aux 7530 p := x0.Args[0] 7531 mem := x0.Args[1] 7532 s0 := o0.Args[1] 7533 if s0.Op != Op386SHLLconst { 7534 break 7535 } 7536 if s0.AuxInt != 16 { 7537 break 7538 } 7539 x1 := s0.Args[0] 7540 if x1.Op != Op386MOVBload { 7541 break 7542 } 7543 if x1.AuxInt != i+2 { 7544 break 7545 } 7546 if x1.Aux != s { 7547 break 7548 } 7549 if p != x1.Args[0] { 7550 break 7551 } 7552 if mem != x1.Args[1] { 7553 break 7554 } 7555 s1 := v.Args[1] 7556 if s1.Op != Op386SHLLconst { 7557 break 7558 } 7559 if s1.AuxInt != 24 { 7560 break 7561 } 7562 x2 := s1.Args[0] 7563 if x2.Op != Op386MOVBload { 7564 break 7565 } 7566 if x2.AuxInt != i+3 { 7567 break 7568 } 7569 if x2.Aux != s { 7570 break 7571 } 7572 if p != x2.Args[0] { 7573 break 7574 } 7575 if mem != x2.Args[1] { 7576 break 7577 } 7578 if !(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)) { 7579 break 7580 } 7581 b = mergePoint(b, x0, x1, x2) 7582 v0 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 7583 v.reset(OpCopy) 7584 v.AddArg(v0) 7585 v0.AuxInt = i 7586 v0.Aux = s 7587 v0.AddArg(p) 7588 v0.AddArg(mem) 7589 return true 7590 } 7591 // match: (ORL x0:(MOVBloadidx1 [i] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i+1] {s} p idx mem))) 7592 // cond: x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 7593 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i] {s} p idx mem) 7594 for { 7595 x0 := v.Args[0] 7596 if x0.Op != Op386MOVBloadidx1 { 7597 break 7598 } 7599 i := x0.AuxInt 7600 s := x0.Aux 7601 p := x0.Args[0] 7602 idx := x0.Args[1] 7603 mem := x0.Args[2] 7604 s0 := v.Args[1] 7605 if s0.Op != Op386SHLLconst { 7606 break 7607 } 7608 if s0.AuxInt != 8 { 7609 break 7610 } 7611 x1 := s0.Args[0] 7612 if x1.Op != Op386MOVBloadidx1 { 7613 break 7614 } 7615 if x1.AuxInt != i+1 { 7616 break 7617 } 7618 if x1.Aux != s { 7619 break 7620 } 7621 if p != x1.Args[0] { 7622 break 7623 } 7624 if idx != x1.Args[1] { 7625 break 7626 } 7627 if mem != x1.Args[2] { 7628 break 7629 } 7630 if !(x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 7631 break 7632 } 7633 b = mergePoint(b, x0, x1) 7634 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 7635 v.reset(OpCopy) 7636 v.AddArg(v0) 7637 v0.AuxInt = i 7638 v0.Aux = s 7639 v0.AddArg(p) 7640 v0.AddArg(idx) 7641 v0.AddArg(mem) 7642 return true 7643 } 7644 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i+2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i+3] {s} p idx mem))) 7645 // cond: 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) 7646 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i] {s} p idx mem) 7647 for { 7648 o0 := v.Args[0] 7649 if o0.Op != Op386ORL { 7650 break 7651 } 7652 x0 := o0.Args[0] 7653 if x0.Op != Op386MOVWloadidx1 { 7654 break 7655 } 7656 i := x0.AuxInt 7657 s := x0.Aux 7658 p := x0.Args[0] 7659 idx := x0.Args[1] 7660 mem := x0.Args[2] 7661 s0 := o0.Args[1] 7662 if s0.Op != Op386SHLLconst { 7663 break 7664 } 7665 if s0.AuxInt != 16 { 7666 break 7667 } 7668 x1 := s0.Args[0] 7669 if x1.Op != Op386MOVBloadidx1 { 7670 break 7671 } 7672 if x1.AuxInt != i+2 { 7673 break 7674 } 7675 if x1.Aux != s { 7676 break 7677 } 7678 if p != x1.Args[0] { 7679 break 7680 } 7681 if idx != x1.Args[1] { 7682 break 7683 } 7684 if mem != x1.Args[2] { 7685 break 7686 } 7687 s1 := v.Args[1] 7688 if s1.Op != Op386SHLLconst { 7689 break 7690 } 7691 if s1.AuxInt != 24 { 7692 break 7693 } 7694 x2 := s1.Args[0] 7695 if x2.Op != Op386MOVBloadidx1 { 7696 break 7697 } 7698 if x2.AuxInt != i+3 { 7699 break 7700 } 7701 if x2.Aux != s { 7702 break 7703 } 7704 if p != x2.Args[0] { 7705 break 7706 } 7707 if idx != x2.Args[1] { 7708 break 7709 } 7710 if mem != x2.Args[2] { 7711 break 7712 } 7713 if !(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)) { 7714 break 7715 } 7716 b = mergePoint(b, x0, x1, x2) 7717 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 7718 v.reset(OpCopy) 7719 v.AddArg(v0) 7720 v0.AuxInt = i 7721 v0.Aux = s 7722 v0.AddArg(p) 7723 v0.AddArg(idx) 7724 v0.AddArg(mem) 7725 return true 7726 } 7727 return false 7728 } 7729 func rewriteValue386_Op386ORLconst(v *Value, config *Config) bool { 7730 b := v.Block 7731 _ = b 7732 // match: (ORLconst [c] x) 7733 // cond: int32(c)==0 7734 // result: x 7735 for { 7736 c := v.AuxInt 7737 x := v.Args[0] 7738 if !(int32(c) == 0) { 7739 break 7740 } 7741 v.reset(OpCopy) 7742 v.Type = x.Type 7743 v.AddArg(x) 7744 return true 7745 } 7746 // match: (ORLconst [c] _) 7747 // cond: int32(c)==-1 7748 // result: (MOVLconst [-1]) 7749 for { 7750 c := v.AuxInt 7751 if !(int32(c) == -1) { 7752 break 7753 } 7754 v.reset(Op386MOVLconst) 7755 v.AuxInt = -1 7756 return true 7757 } 7758 // match: (ORLconst [c] (MOVLconst [d])) 7759 // cond: 7760 // result: (MOVLconst [c|d]) 7761 for { 7762 c := v.AuxInt 7763 v_0 := v.Args[0] 7764 if v_0.Op != Op386MOVLconst { 7765 break 7766 } 7767 d := v_0.AuxInt 7768 v.reset(Op386MOVLconst) 7769 v.AuxInt = c | d 7770 return true 7771 } 7772 return false 7773 } 7774 func rewriteValue386_Op386ROLBconst(v *Value, config *Config) bool { 7775 b := v.Block 7776 _ = b 7777 // match: (ROLBconst [c] (ROLBconst [d] x)) 7778 // cond: 7779 // result: (ROLBconst [(c+d)& 7] x) 7780 for { 7781 c := v.AuxInt 7782 v_0 := v.Args[0] 7783 if v_0.Op != Op386ROLBconst { 7784 break 7785 } 7786 d := v_0.AuxInt 7787 x := v_0.Args[0] 7788 v.reset(Op386ROLBconst) 7789 v.AuxInt = (c + d) & 7 7790 v.AddArg(x) 7791 return true 7792 } 7793 // match: (ROLBconst [0] x) 7794 // cond: 7795 // result: x 7796 for { 7797 if v.AuxInt != 0 { 7798 break 7799 } 7800 x := v.Args[0] 7801 v.reset(OpCopy) 7802 v.Type = x.Type 7803 v.AddArg(x) 7804 return true 7805 } 7806 return false 7807 } 7808 func rewriteValue386_Op386ROLLconst(v *Value, config *Config) bool { 7809 b := v.Block 7810 _ = b 7811 // match: (ROLLconst [c] (ROLLconst [d] x)) 7812 // cond: 7813 // result: (ROLLconst [(c+d)&31] x) 7814 for { 7815 c := v.AuxInt 7816 v_0 := v.Args[0] 7817 if v_0.Op != Op386ROLLconst { 7818 break 7819 } 7820 d := v_0.AuxInt 7821 x := v_0.Args[0] 7822 v.reset(Op386ROLLconst) 7823 v.AuxInt = (c + d) & 31 7824 v.AddArg(x) 7825 return true 7826 } 7827 // match: (ROLLconst [0] x) 7828 // cond: 7829 // result: x 7830 for { 7831 if v.AuxInt != 0 { 7832 break 7833 } 7834 x := v.Args[0] 7835 v.reset(OpCopy) 7836 v.Type = x.Type 7837 v.AddArg(x) 7838 return true 7839 } 7840 return false 7841 } 7842 func rewriteValue386_Op386ROLWconst(v *Value, config *Config) bool { 7843 b := v.Block 7844 _ = b 7845 // match: (ROLWconst [c] (ROLWconst [d] x)) 7846 // cond: 7847 // result: (ROLWconst [(c+d)&15] x) 7848 for { 7849 c := v.AuxInt 7850 v_0 := v.Args[0] 7851 if v_0.Op != Op386ROLWconst { 7852 break 7853 } 7854 d := v_0.AuxInt 7855 x := v_0.Args[0] 7856 v.reset(Op386ROLWconst) 7857 v.AuxInt = (c + d) & 15 7858 v.AddArg(x) 7859 return true 7860 } 7861 // match: (ROLWconst [0] x) 7862 // cond: 7863 // result: x 7864 for { 7865 if v.AuxInt != 0 { 7866 break 7867 } 7868 x := v.Args[0] 7869 v.reset(OpCopy) 7870 v.Type = x.Type 7871 v.AddArg(x) 7872 return true 7873 } 7874 return false 7875 } 7876 func rewriteValue386_Op386SARB(v *Value, config *Config) bool { 7877 b := v.Block 7878 _ = b 7879 // match: (SARB x (MOVLconst [c])) 7880 // cond: 7881 // result: (SARBconst [min(c&31,7)] x) 7882 for { 7883 x := v.Args[0] 7884 v_1 := v.Args[1] 7885 if v_1.Op != Op386MOVLconst { 7886 break 7887 } 7888 c := v_1.AuxInt 7889 v.reset(Op386SARBconst) 7890 v.AuxInt = min(c&31, 7) 7891 v.AddArg(x) 7892 return true 7893 } 7894 return false 7895 } 7896 func rewriteValue386_Op386SARBconst(v *Value, config *Config) bool { 7897 b := v.Block 7898 _ = b 7899 // match: (SARBconst x [0]) 7900 // cond: 7901 // result: x 7902 for { 7903 if v.AuxInt != 0 { 7904 break 7905 } 7906 x := v.Args[0] 7907 v.reset(OpCopy) 7908 v.Type = x.Type 7909 v.AddArg(x) 7910 return true 7911 } 7912 // match: (SARBconst [c] (MOVLconst [d])) 7913 // cond: 7914 // result: (MOVLconst [d>>uint64(c)]) 7915 for { 7916 c := v.AuxInt 7917 v_0 := v.Args[0] 7918 if v_0.Op != Op386MOVLconst { 7919 break 7920 } 7921 d := v_0.AuxInt 7922 v.reset(Op386MOVLconst) 7923 v.AuxInt = d >> uint64(c) 7924 return true 7925 } 7926 return false 7927 } 7928 func rewriteValue386_Op386SARL(v *Value, config *Config) bool { 7929 b := v.Block 7930 _ = b 7931 // match: (SARL x (MOVLconst [c])) 7932 // cond: 7933 // result: (SARLconst [c&31] x) 7934 for { 7935 x := v.Args[0] 7936 v_1 := v.Args[1] 7937 if v_1.Op != Op386MOVLconst { 7938 break 7939 } 7940 c := v_1.AuxInt 7941 v.reset(Op386SARLconst) 7942 v.AuxInt = c & 31 7943 v.AddArg(x) 7944 return true 7945 } 7946 // match: (SARL x (ANDLconst [31] y)) 7947 // cond: 7948 // result: (SARL x y) 7949 for { 7950 x := v.Args[0] 7951 v_1 := v.Args[1] 7952 if v_1.Op != Op386ANDLconst { 7953 break 7954 } 7955 if v_1.AuxInt != 31 { 7956 break 7957 } 7958 y := v_1.Args[0] 7959 v.reset(Op386SARL) 7960 v.AddArg(x) 7961 v.AddArg(y) 7962 return true 7963 } 7964 return false 7965 } 7966 func rewriteValue386_Op386SARLconst(v *Value, config *Config) bool { 7967 b := v.Block 7968 _ = b 7969 // match: (SARLconst x [0]) 7970 // cond: 7971 // result: x 7972 for { 7973 if v.AuxInt != 0 { 7974 break 7975 } 7976 x := v.Args[0] 7977 v.reset(OpCopy) 7978 v.Type = x.Type 7979 v.AddArg(x) 7980 return true 7981 } 7982 // match: (SARLconst [c] (MOVLconst [d])) 7983 // cond: 7984 // result: (MOVLconst [d>>uint64(c)]) 7985 for { 7986 c := v.AuxInt 7987 v_0 := v.Args[0] 7988 if v_0.Op != Op386MOVLconst { 7989 break 7990 } 7991 d := v_0.AuxInt 7992 v.reset(Op386MOVLconst) 7993 v.AuxInt = d >> uint64(c) 7994 return true 7995 } 7996 return false 7997 } 7998 func rewriteValue386_Op386SARW(v *Value, config *Config) bool { 7999 b := v.Block 8000 _ = b 8001 // match: (SARW x (MOVLconst [c])) 8002 // cond: 8003 // result: (SARWconst [min(c&31,15)] x) 8004 for { 8005 x := v.Args[0] 8006 v_1 := v.Args[1] 8007 if v_1.Op != Op386MOVLconst { 8008 break 8009 } 8010 c := v_1.AuxInt 8011 v.reset(Op386SARWconst) 8012 v.AuxInt = min(c&31, 15) 8013 v.AddArg(x) 8014 return true 8015 } 8016 return false 8017 } 8018 func rewriteValue386_Op386SARWconst(v *Value, config *Config) bool { 8019 b := v.Block 8020 _ = b 8021 // match: (SARWconst x [0]) 8022 // cond: 8023 // result: x 8024 for { 8025 if v.AuxInt != 0 { 8026 break 8027 } 8028 x := v.Args[0] 8029 v.reset(OpCopy) 8030 v.Type = x.Type 8031 v.AddArg(x) 8032 return true 8033 } 8034 // match: (SARWconst [c] (MOVLconst [d])) 8035 // cond: 8036 // result: (MOVLconst [d>>uint64(c)]) 8037 for { 8038 c := v.AuxInt 8039 v_0 := v.Args[0] 8040 if v_0.Op != Op386MOVLconst { 8041 break 8042 } 8043 d := v_0.AuxInt 8044 v.reset(Op386MOVLconst) 8045 v.AuxInt = d >> uint64(c) 8046 return true 8047 } 8048 return false 8049 } 8050 func rewriteValue386_Op386SBBL(v *Value, config *Config) bool { 8051 b := v.Block 8052 _ = b 8053 // match: (SBBL x (MOVLconst [c]) f) 8054 // cond: 8055 // result: (SBBLconst [c] x f) 8056 for { 8057 x := v.Args[0] 8058 v_1 := v.Args[1] 8059 if v_1.Op != Op386MOVLconst { 8060 break 8061 } 8062 c := v_1.AuxInt 8063 f := v.Args[2] 8064 v.reset(Op386SBBLconst) 8065 v.AuxInt = c 8066 v.AddArg(x) 8067 v.AddArg(f) 8068 return true 8069 } 8070 return false 8071 } 8072 func rewriteValue386_Op386SBBLcarrymask(v *Value, config *Config) bool { 8073 b := v.Block 8074 _ = b 8075 // match: (SBBLcarrymask (FlagEQ)) 8076 // cond: 8077 // result: (MOVLconst [0]) 8078 for { 8079 v_0 := v.Args[0] 8080 if v_0.Op != Op386FlagEQ { 8081 break 8082 } 8083 v.reset(Op386MOVLconst) 8084 v.AuxInt = 0 8085 return true 8086 } 8087 // match: (SBBLcarrymask (FlagLT_ULT)) 8088 // cond: 8089 // result: (MOVLconst [-1]) 8090 for { 8091 v_0 := v.Args[0] 8092 if v_0.Op != Op386FlagLT_ULT { 8093 break 8094 } 8095 v.reset(Op386MOVLconst) 8096 v.AuxInt = -1 8097 return true 8098 } 8099 // match: (SBBLcarrymask (FlagLT_UGT)) 8100 // cond: 8101 // result: (MOVLconst [0]) 8102 for { 8103 v_0 := v.Args[0] 8104 if v_0.Op != Op386FlagLT_UGT { 8105 break 8106 } 8107 v.reset(Op386MOVLconst) 8108 v.AuxInt = 0 8109 return true 8110 } 8111 // match: (SBBLcarrymask (FlagGT_ULT)) 8112 // cond: 8113 // result: (MOVLconst [-1]) 8114 for { 8115 v_0 := v.Args[0] 8116 if v_0.Op != Op386FlagGT_ULT { 8117 break 8118 } 8119 v.reset(Op386MOVLconst) 8120 v.AuxInt = -1 8121 return true 8122 } 8123 // match: (SBBLcarrymask (FlagGT_UGT)) 8124 // cond: 8125 // result: (MOVLconst [0]) 8126 for { 8127 v_0 := v.Args[0] 8128 if v_0.Op != Op386FlagGT_UGT { 8129 break 8130 } 8131 v.reset(Op386MOVLconst) 8132 v.AuxInt = 0 8133 return true 8134 } 8135 return false 8136 } 8137 func rewriteValue386_Op386SETA(v *Value, config *Config) bool { 8138 b := v.Block 8139 _ = b 8140 // match: (SETA (InvertFlags x)) 8141 // cond: 8142 // result: (SETB x) 8143 for { 8144 v_0 := v.Args[0] 8145 if v_0.Op != Op386InvertFlags { 8146 break 8147 } 8148 x := v_0.Args[0] 8149 v.reset(Op386SETB) 8150 v.AddArg(x) 8151 return true 8152 } 8153 // match: (SETA (FlagEQ)) 8154 // cond: 8155 // result: (MOVLconst [0]) 8156 for { 8157 v_0 := v.Args[0] 8158 if v_0.Op != Op386FlagEQ { 8159 break 8160 } 8161 v.reset(Op386MOVLconst) 8162 v.AuxInt = 0 8163 return true 8164 } 8165 // match: (SETA (FlagLT_ULT)) 8166 // cond: 8167 // result: (MOVLconst [0]) 8168 for { 8169 v_0 := v.Args[0] 8170 if v_0.Op != Op386FlagLT_ULT { 8171 break 8172 } 8173 v.reset(Op386MOVLconst) 8174 v.AuxInt = 0 8175 return true 8176 } 8177 // match: (SETA (FlagLT_UGT)) 8178 // cond: 8179 // result: (MOVLconst [1]) 8180 for { 8181 v_0 := v.Args[0] 8182 if v_0.Op != Op386FlagLT_UGT { 8183 break 8184 } 8185 v.reset(Op386MOVLconst) 8186 v.AuxInt = 1 8187 return true 8188 } 8189 // match: (SETA (FlagGT_ULT)) 8190 // cond: 8191 // result: (MOVLconst [0]) 8192 for { 8193 v_0 := v.Args[0] 8194 if v_0.Op != Op386FlagGT_ULT { 8195 break 8196 } 8197 v.reset(Op386MOVLconst) 8198 v.AuxInt = 0 8199 return true 8200 } 8201 // match: (SETA (FlagGT_UGT)) 8202 // cond: 8203 // result: (MOVLconst [1]) 8204 for { 8205 v_0 := v.Args[0] 8206 if v_0.Op != Op386FlagGT_UGT { 8207 break 8208 } 8209 v.reset(Op386MOVLconst) 8210 v.AuxInt = 1 8211 return true 8212 } 8213 return false 8214 } 8215 func rewriteValue386_Op386SETAE(v *Value, config *Config) bool { 8216 b := v.Block 8217 _ = b 8218 // match: (SETAE (InvertFlags x)) 8219 // cond: 8220 // result: (SETBE x) 8221 for { 8222 v_0 := v.Args[0] 8223 if v_0.Op != Op386InvertFlags { 8224 break 8225 } 8226 x := v_0.Args[0] 8227 v.reset(Op386SETBE) 8228 v.AddArg(x) 8229 return true 8230 } 8231 // match: (SETAE (FlagEQ)) 8232 // cond: 8233 // result: (MOVLconst [1]) 8234 for { 8235 v_0 := v.Args[0] 8236 if v_0.Op != Op386FlagEQ { 8237 break 8238 } 8239 v.reset(Op386MOVLconst) 8240 v.AuxInt = 1 8241 return true 8242 } 8243 // match: (SETAE (FlagLT_ULT)) 8244 // cond: 8245 // result: (MOVLconst [0]) 8246 for { 8247 v_0 := v.Args[0] 8248 if v_0.Op != Op386FlagLT_ULT { 8249 break 8250 } 8251 v.reset(Op386MOVLconst) 8252 v.AuxInt = 0 8253 return true 8254 } 8255 // match: (SETAE (FlagLT_UGT)) 8256 // cond: 8257 // result: (MOVLconst [1]) 8258 for { 8259 v_0 := v.Args[0] 8260 if v_0.Op != Op386FlagLT_UGT { 8261 break 8262 } 8263 v.reset(Op386MOVLconst) 8264 v.AuxInt = 1 8265 return true 8266 } 8267 // match: (SETAE (FlagGT_ULT)) 8268 // cond: 8269 // result: (MOVLconst [0]) 8270 for { 8271 v_0 := v.Args[0] 8272 if v_0.Op != Op386FlagGT_ULT { 8273 break 8274 } 8275 v.reset(Op386MOVLconst) 8276 v.AuxInt = 0 8277 return true 8278 } 8279 // match: (SETAE (FlagGT_UGT)) 8280 // cond: 8281 // result: (MOVLconst [1]) 8282 for { 8283 v_0 := v.Args[0] 8284 if v_0.Op != Op386FlagGT_UGT { 8285 break 8286 } 8287 v.reset(Op386MOVLconst) 8288 v.AuxInt = 1 8289 return true 8290 } 8291 return false 8292 } 8293 func rewriteValue386_Op386SETB(v *Value, config *Config) bool { 8294 b := v.Block 8295 _ = b 8296 // match: (SETB (InvertFlags x)) 8297 // cond: 8298 // result: (SETA x) 8299 for { 8300 v_0 := v.Args[0] 8301 if v_0.Op != Op386InvertFlags { 8302 break 8303 } 8304 x := v_0.Args[0] 8305 v.reset(Op386SETA) 8306 v.AddArg(x) 8307 return true 8308 } 8309 // match: (SETB (FlagEQ)) 8310 // cond: 8311 // result: (MOVLconst [0]) 8312 for { 8313 v_0 := v.Args[0] 8314 if v_0.Op != Op386FlagEQ { 8315 break 8316 } 8317 v.reset(Op386MOVLconst) 8318 v.AuxInt = 0 8319 return true 8320 } 8321 // match: (SETB (FlagLT_ULT)) 8322 // cond: 8323 // result: (MOVLconst [1]) 8324 for { 8325 v_0 := v.Args[0] 8326 if v_0.Op != Op386FlagLT_ULT { 8327 break 8328 } 8329 v.reset(Op386MOVLconst) 8330 v.AuxInt = 1 8331 return true 8332 } 8333 // match: (SETB (FlagLT_UGT)) 8334 // cond: 8335 // result: (MOVLconst [0]) 8336 for { 8337 v_0 := v.Args[0] 8338 if v_0.Op != Op386FlagLT_UGT { 8339 break 8340 } 8341 v.reset(Op386MOVLconst) 8342 v.AuxInt = 0 8343 return true 8344 } 8345 // match: (SETB (FlagGT_ULT)) 8346 // cond: 8347 // result: (MOVLconst [1]) 8348 for { 8349 v_0 := v.Args[0] 8350 if v_0.Op != Op386FlagGT_ULT { 8351 break 8352 } 8353 v.reset(Op386MOVLconst) 8354 v.AuxInt = 1 8355 return true 8356 } 8357 // match: (SETB (FlagGT_UGT)) 8358 // cond: 8359 // result: (MOVLconst [0]) 8360 for { 8361 v_0 := v.Args[0] 8362 if v_0.Op != Op386FlagGT_UGT { 8363 break 8364 } 8365 v.reset(Op386MOVLconst) 8366 v.AuxInt = 0 8367 return true 8368 } 8369 return false 8370 } 8371 func rewriteValue386_Op386SETBE(v *Value, config *Config) bool { 8372 b := v.Block 8373 _ = b 8374 // match: (SETBE (InvertFlags x)) 8375 // cond: 8376 // result: (SETAE x) 8377 for { 8378 v_0 := v.Args[0] 8379 if v_0.Op != Op386InvertFlags { 8380 break 8381 } 8382 x := v_0.Args[0] 8383 v.reset(Op386SETAE) 8384 v.AddArg(x) 8385 return true 8386 } 8387 // match: (SETBE (FlagEQ)) 8388 // cond: 8389 // result: (MOVLconst [1]) 8390 for { 8391 v_0 := v.Args[0] 8392 if v_0.Op != Op386FlagEQ { 8393 break 8394 } 8395 v.reset(Op386MOVLconst) 8396 v.AuxInt = 1 8397 return true 8398 } 8399 // match: (SETBE (FlagLT_ULT)) 8400 // cond: 8401 // result: (MOVLconst [1]) 8402 for { 8403 v_0 := v.Args[0] 8404 if v_0.Op != Op386FlagLT_ULT { 8405 break 8406 } 8407 v.reset(Op386MOVLconst) 8408 v.AuxInt = 1 8409 return true 8410 } 8411 // match: (SETBE (FlagLT_UGT)) 8412 // cond: 8413 // result: (MOVLconst [0]) 8414 for { 8415 v_0 := v.Args[0] 8416 if v_0.Op != Op386FlagLT_UGT { 8417 break 8418 } 8419 v.reset(Op386MOVLconst) 8420 v.AuxInt = 0 8421 return true 8422 } 8423 // match: (SETBE (FlagGT_ULT)) 8424 // cond: 8425 // result: (MOVLconst [1]) 8426 for { 8427 v_0 := v.Args[0] 8428 if v_0.Op != Op386FlagGT_ULT { 8429 break 8430 } 8431 v.reset(Op386MOVLconst) 8432 v.AuxInt = 1 8433 return true 8434 } 8435 // match: (SETBE (FlagGT_UGT)) 8436 // cond: 8437 // result: (MOVLconst [0]) 8438 for { 8439 v_0 := v.Args[0] 8440 if v_0.Op != Op386FlagGT_UGT { 8441 break 8442 } 8443 v.reset(Op386MOVLconst) 8444 v.AuxInt = 0 8445 return true 8446 } 8447 return false 8448 } 8449 func rewriteValue386_Op386SETEQ(v *Value, config *Config) bool { 8450 b := v.Block 8451 _ = b 8452 // match: (SETEQ (InvertFlags x)) 8453 // cond: 8454 // result: (SETEQ x) 8455 for { 8456 v_0 := v.Args[0] 8457 if v_0.Op != Op386InvertFlags { 8458 break 8459 } 8460 x := v_0.Args[0] 8461 v.reset(Op386SETEQ) 8462 v.AddArg(x) 8463 return true 8464 } 8465 // match: (SETEQ (FlagEQ)) 8466 // cond: 8467 // result: (MOVLconst [1]) 8468 for { 8469 v_0 := v.Args[0] 8470 if v_0.Op != Op386FlagEQ { 8471 break 8472 } 8473 v.reset(Op386MOVLconst) 8474 v.AuxInt = 1 8475 return true 8476 } 8477 // match: (SETEQ (FlagLT_ULT)) 8478 // cond: 8479 // result: (MOVLconst [0]) 8480 for { 8481 v_0 := v.Args[0] 8482 if v_0.Op != Op386FlagLT_ULT { 8483 break 8484 } 8485 v.reset(Op386MOVLconst) 8486 v.AuxInt = 0 8487 return true 8488 } 8489 // match: (SETEQ (FlagLT_UGT)) 8490 // cond: 8491 // result: (MOVLconst [0]) 8492 for { 8493 v_0 := v.Args[0] 8494 if v_0.Op != Op386FlagLT_UGT { 8495 break 8496 } 8497 v.reset(Op386MOVLconst) 8498 v.AuxInt = 0 8499 return true 8500 } 8501 // match: (SETEQ (FlagGT_ULT)) 8502 // cond: 8503 // result: (MOVLconst [0]) 8504 for { 8505 v_0 := v.Args[0] 8506 if v_0.Op != Op386FlagGT_ULT { 8507 break 8508 } 8509 v.reset(Op386MOVLconst) 8510 v.AuxInt = 0 8511 return true 8512 } 8513 // match: (SETEQ (FlagGT_UGT)) 8514 // cond: 8515 // result: (MOVLconst [0]) 8516 for { 8517 v_0 := v.Args[0] 8518 if v_0.Op != Op386FlagGT_UGT { 8519 break 8520 } 8521 v.reset(Op386MOVLconst) 8522 v.AuxInt = 0 8523 return true 8524 } 8525 return false 8526 } 8527 func rewriteValue386_Op386SETG(v *Value, config *Config) bool { 8528 b := v.Block 8529 _ = b 8530 // match: (SETG (InvertFlags x)) 8531 // cond: 8532 // result: (SETL x) 8533 for { 8534 v_0 := v.Args[0] 8535 if v_0.Op != Op386InvertFlags { 8536 break 8537 } 8538 x := v_0.Args[0] 8539 v.reset(Op386SETL) 8540 v.AddArg(x) 8541 return true 8542 } 8543 // match: (SETG (FlagEQ)) 8544 // cond: 8545 // result: (MOVLconst [0]) 8546 for { 8547 v_0 := v.Args[0] 8548 if v_0.Op != Op386FlagEQ { 8549 break 8550 } 8551 v.reset(Op386MOVLconst) 8552 v.AuxInt = 0 8553 return true 8554 } 8555 // match: (SETG (FlagLT_ULT)) 8556 // cond: 8557 // result: (MOVLconst [0]) 8558 for { 8559 v_0 := v.Args[0] 8560 if v_0.Op != Op386FlagLT_ULT { 8561 break 8562 } 8563 v.reset(Op386MOVLconst) 8564 v.AuxInt = 0 8565 return true 8566 } 8567 // match: (SETG (FlagLT_UGT)) 8568 // cond: 8569 // result: (MOVLconst [0]) 8570 for { 8571 v_0 := v.Args[0] 8572 if v_0.Op != Op386FlagLT_UGT { 8573 break 8574 } 8575 v.reset(Op386MOVLconst) 8576 v.AuxInt = 0 8577 return true 8578 } 8579 // match: (SETG (FlagGT_ULT)) 8580 // cond: 8581 // result: (MOVLconst [1]) 8582 for { 8583 v_0 := v.Args[0] 8584 if v_0.Op != Op386FlagGT_ULT { 8585 break 8586 } 8587 v.reset(Op386MOVLconst) 8588 v.AuxInt = 1 8589 return true 8590 } 8591 // match: (SETG (FlagGT_UGT)) 8592 // cond: 8593 // result: (MOVLconst [1]) 8594 for { 8595 v_0 := v.Args[0] 8596 if v_0.Op != Op386FlagGT_UGT { 8597 break 8598 } 8599 v.reset(Op386MOVLconst) 8600 v.AuxInt = 1 8601 return true 8602 } 8603 return false 8604 } 8605 func rewriteValue386_Op386SETGE(v *Value, config *Config) bool { 8606 b := v.Block 8607 _ = b 8608 // match: (SETGE (InvertFlags x)) 8609 // cond: 8610 // result: (SETLE x) 8611 for { 8612 v_0 := v.Args[0] 8613 if v_0.Op != Op386InvertFlags { 8614 break 8615 } 8616 x := v_0.Args[0] 8617 v.reset(Op386SETLE) 8618 v.AddArg(x) 8619 return true 8620 } 8621 // match: (SETGE (FlagEQ)) 8622 // cond: 8623 // result: (MOVLconst [1]) 8624 for { 8625 v_0 := v.Args[0] 8626 if v_0.Op != Op386FlagEQ { 8627 break 8628 } 8629 v.reset(Op386MOVLconst) 8630 v.AuxInt = 1 8631 return true 8632 } 8633 // match: (SETGE (FlagLT_ULT)) 8634 // cond: 8635 // result: (MOVLconst [0]) 8636 for { 8637 v_0 := v.Args[0] 8638 if v_0.Op != Op386FlagLT_ULT { 8639 break 8640 } 8641 v.reset(Op386MOVLconst) 8642 v.AuxInt = 0 8643 return true 8644 } 8645 // match: (SETGE (FlagLT_UGT)) 8646 // cond: 8647 // result: (MOVLconst [0]) 8648 for { 8649 v_0 := v.Args[0] 8650 if v_0.Op != Op386FlagLT_UGT { 8651 break 8652 } 8653 v.reset(Op386MOVLconst) 8654 v.AuxInt = 0 8655 return true 8656 } 8657 // match: (SETGE (FlagGT_ULT)) 8658 // cond: 8659 // result: (MOVLconst [1]) 8660 for { 8661 v_0 := v.Args[0] 8662 if v_0.Op != Op386FlagGT_ULT { 8663 break 8664 } 8665 v.reset(Op386MOVLconst) 8666 v.AuxInt = 1 8667 return true 8668 } 8669 // match: (SETGE (FlagGT_UGT)) 8670 // cond: 8671 // result: (MOVLconst [1]) 8672 for { 8673 v_0 := v.Args[0] 8674 if v_0.Op != Op386FlagGT_UGT { 8675 break 8676 } 8677 v.reset(Op386MOVLconst) 8678 v.AuxInt = 1 8679 return true 8680 } 8681 return false 8682 } 8683 func rewriteValue386_Op386SETL(v *Value, config *Config) bool { 8684 b := v.Block 8685 _ = b 8686 // match: (SETL (InvertFlags x)) 8687 // cond: 8688 // result: (SETG x) 8689 for { 8690 v_0 := v.Args[0] 8691 if v_0.Op != Op386InvertFlags { 8692 break 8693 } 8694 x := v_0.Args[0] 8695 v.reset(Op386SETG) 8696 v.AddArg(x) 8697 return true 8698 } 8699 // match: (SETL (FlagEQ)) 8700 // cond: 8701 // result: (MOVLconst [0]) 8702 for { 8703 v_0 := v.Args[0] 8704 if v_0.Op != Op386FlagEQ { 8705 break 8706 } 8707 v.reset(Op386MOVLconst) 8708 v.AuxInt = 0 8709 return true 8710 } 8711 // match: (SETL (FlagLT_ULT)) 8712 // cond: 8713 // result: (MOVLconst [1]) 8714 for { 8715 v_0 := v.Args[0] 8716 if v_0.Op != Op386FlagLT_ULT { 8717 break 8718 } 8719 v.reset(Op386MOVLconst) 8720 v.AuxInt = 1 8721 return true 8722 } 8723 // match: (SETL (FlagLT_UGT)) 8724 // cond: 8725 // result: (MOVLconst [1]) 8726 for { 8727 v_0 := v.Args[0] 8728 if v_0.Op != Op386FlagLT_UGT { 8729 break 8730 } 8731 v.reset(Op386MOVLconst) 8732 v.AuxInt = 1 8733 return true 8734 } 8735 // match: (SETL (FlagGT_ULT)) 8736 // cond: 8737 // result: (MOVLconst [0]) 8738 for { 8739 v_0 := v.Args[0] 8740 if v_0.Op != Op386FlagGT_ULT { 8741 break 8742 } 8743 v.reset(Op386MOVLconst) 8744 v.AuxInt = 0 8745 return true 8746 } 8747 // match: (SETL (FlagGT_UGT)) 8748 // cond: 8749 // result: (MOVLconst [0]) 8750 for { 8751 v_0 := v.Args[0] 8752 if v_0.Op != Op386FlagGT_UGT { 8753 break 8754 } 8755 v.reset(Op386MOVLconst) 8756 v.AuxInt = 0 8757 return true 8758 } 8759 return false 8760 } 8761 func rewriteValue386_Op386SETLE(v *Value, config *Config) bool { 8762 b := v.Block 8763 _ = b 8764 // match: (SETLE (InvertFlags x)) 8765 // cond: 8766 // result: (SETGE x) 8767 for { 8768 v_0 := v.Args[0] 8769 if v_0.Op != Op386InvertFlags { 8770 break 8771 } 8772 x := v_0.Args[0] 8773 v.reset(Op386SETGE) 8774 v.AddArg(x) 8775 return true 8776 } 8777 // match: (SETLE (FlagEQ)) 8778 // cond: 8779 // result: (MOVLconst [1]) 8780 for { 8781 v_0 := v.Args[0] 8782 if v_0.Op != Op386FlagEQ { 8783 break 8784 } 8785 v.reset(Op386MOVLconst) 8786 v.AuxInt = 1 8787 return true 8788 } 8789 // match: (SETLE (FlagLT_ULT)) 8790 // cond: 8791 // result: (MOVLconst [1]) 8792 for { 8793 v_0 := v.Args[0] 8794 if v_0.Op != Op386FlagLT_ULT { 8795 break 8796 } 8797 v.reset(Op386MOVLconst) 8798 v.AuxInt = 1 8799 return true 8800 } 8801 // match: (SETLE (FlagLT_UGT)) 8802 // cond: 8803 // result: (MOVLconst [1]) 8804 for { 8805 v_0 := v.Args[0] 8806 if v_0.Op != Op386FlagLT_UGT { 8807 break 8808 } 8809 v.reset(Op386MOVLconst) 8810 v.AuxInt = 1 8811 return true 8812 } 8813 // match: (SETLE (FlagGT_ULT)) 8814 // cond: 8815 // result: (MOVLconst [0]) 8816 for { 8817 v_0 := v.Args[0] 8818 if v_0.Op != Op386FlagGT_ULT { 8819 break 8820 } 8821 v.reset(Op386MOVLconst) 8822 v.AuxInt = 0 8823 return true 8824 } 8825 // match: (SETLE (FlagGT_UGT)) 8826 // cond: 8827 // result: (MOVLconst [0]) 8828 for { 8829 v_0 := v.Args[0] 8830 if v_0.Op != Op386FlagGT_UGT { 8831 break 8832 } 8833 v.reset(Op386MOVLconst) 8834 v.AuxInt = 0 8835 return true 8836 } 8837 return false 8838 } 8839 func rewriteValue386_Op386SETNE(v *Value, config *Config) bool { 8840 b := v.Block 8841 _ = b 8842 // match: (SETNE (InvertFlags x)) 8843 // cond: 8844 // result: (SETNE x) 8845 for { 8846 v_0 := v.Args[0] 8847 if v_0.Op != Op386InvertFlags { 8848 break 8849 } 8850 x := v_0.Args[0] 8851 v.reset(Op386SETNE) 8852 v.AddArg(x) 8853 return true 8854 } 8855 // match: (SETNE (FlagEQ)) 8856 // cond: 8857 // result: (MOVLconst [0]) 8858 for { 8859 v_0 := v.Args[0] 8860 if v_0.Op != Op386FlagEQ { 8861 break 8862 } 8863 v.reset(Op386MOVLconst) 8864 v.AuxInt = 0 8865 return true 8866 } 8867 // match: (SETNE (FlagLT_ULT)) 8868 // cond: 8869 // result: (MOVLconst [1]) 8870 for { 8871 v_0 := v.Args[0] 8872 if v_0.Op != Op386FlagLT_ULT { 8873 break 8874 } 8875 v.reset(Op386MOVLconst) 8876 v.AuxInt = 1 8877 return true 8878 } 8879 // match: (SETNE (FlagLT_UGT)) 8880 // cond: 8881 // result: (MOVLconst [1]) 8882 for { 8883 v_0 := v.Args[0] 8884 if v_0.Op != Op386FlagLT_UGT { 8885 break 8886 } 8887 v.reset(Op386MOVLconst) 8888 v.AuxInt = 1 8889 return true 8890 } 8891 // match: (SETNE (FlagGT_ULT)) 8892 // cond: 8893 // result: (MOVLconst [1]) 8894 for { 8895 v_0 := v.Args[0] 8896 if v_0.Op != Op386FlagGT_ULT { 8897 break 8898 } 8899 v.reset(Op386MOVLconst) 8900 v.AuxInt = 1 8901 return true 8902 } 8903 // match: (SETNE (FlagGT_UGT)) 8904 // cond: 8905 // result: (MOVLconst [1]) 8906 for { 8907 v_0 := v.Args[0] 8908 if v_0.Op != Op386FlagGT_UGT { 8909 break 8910 } 8911 v.reset(Op386MOVLconst) 8912 v.AuxInt = 1 8913 return true 8914 } 8915 return false 8916 } 8917 func rewriteValue386_Op386SHLL(v *Value, config *Config) bool { 8918 b := v.Block 8919 _ = b 8920 // match: (SHLL x (MOVLconst [c])) 8921 // cond: 8922 // result: (SHLLconst [c&31] x) 8923 for { 8924 x := v.Args[0] 8925 v_1 := v.Args[1] 8926 if v_1.Op != Op386MOVLconst { 8927 break 8928 } 8929 c := v_1.AuxInt 8930 v.reset(Op386SHLLconst) 8931 v.AuxInt = c & 31 8932 v.AddArg(x) 8933 return true 8934 } 8935 // match: (SHLL x (ANDLconst [31] y)) 8936 // cond: 8937 // result: (SHLL x y) 8938 for { 8939 x := v.Args[0] 8940 v_1 := v.Args[1] 8941 if v_1.Op != Op386ANDLconst { 8942 break 8943 } 8944 if v_1.AuxInt != 31 { 8945 break 8946 } 8947 y := v_1.Args[0] 8948 v.reset(Op386SHLL) 8949 v.AddArg(x) 8950 v.AddArg(y) 8951 return true 8952 } 8953 return false 8954 } 8955 func rewriteValue386_Op386SHLLconst(v *Value, config *Config) bool { 8956 b := v.Block 8957 _ = b 8958 // match: (SHLLconst x [0]) 8959 // cond: 8960 // result: x 8961 for { 8962 if v.AuxInt != 0 { 8963 break 8964 } 8965 x := v.Args[0] 8966 v.reset(OpCopy) 8967 v.Type = x.Type 8968 v.AddArg(x) 8969 return true 8970 } 8971 return false 8972 } 8973 func rewriteValue386_Op386SHRB(v *Value, config *Config) bool { 8974 b := v.Block 8975 _ = b 8976 // match: (SHRB x (MOVLconst [c])) 8977 // cond: c&31 < 8 8978 // result: (SHRBconst [c&31] x) 8979 for { 8980 x := v.Args[0] 8981 v_1 := v.Args[1] 8982 if v_1.Op != Op386MOVLconst { 8983 break 8984 } 8985 c := v_1.AuxInt 8986 if !(c&31 < 8) { 8987 break 8988 } 8989 v.reset(Op386SHRBconst) 8990 v.AuxInt = c & 31 8991 v.AddArg(x) 8992 return true 8993 } 8994 // match: (SHRB _ (MOVLconst [c])) 8995 // cond: c&31 >= 8 8996 // result: (MOVLconst [0]) 8997 for { 8998 v_1 := v.Args[1] 8999 if v_1.Op != Op386MOVLconst { 9000 break 9001 } 9002 c := v_1.AuxInt 9003 if !(c&31 >= 8) { 9004 break 9005 } 9006 v.reset(Op386MOVLconst) 9007 v.AuxInt = 0 9008 return true 9009 } 9010 return false 9011 } 9012 func rewriteValue386_Op386SHRBconst(v *Value, config *Config) bool { 9013 b := v.Block 9014 _ = b 9015 // match: (SHRBconst x [0]) 9016 // cond: 9017 // result: x 9018 for { 9019 if v.AuxInt != 0 { 9020 break 9021 } 9022 x := v.Args[0] 9023 v.reset(OpCopy) 9024 v.Type = x.Type 9025 v.AddArg(x) 9026 return true 9027 } 9028 return false 9029 } 9030 func rewriteValue386_Op386SHRL(v *Value, config *Config) bool { 9031 b := v.Block 9032 _ = b 9033 // match: (SHRL x (MOVLconst [c])) 9034 // cond: 9035 // result: (SHRLconst [c&31] x) 9036 for { 9037 x := v.Args[0] 9038 v_1 := v.Args[1] 9039 if v_1.Op != Op386MOVLconst { 9040 break 9041 } 9042 c := v_1.AuxInt 9043 v.reset(Op386SHRLconst) 9044 v.AuxInt = c & 31 9045 v.AddArg(x) 9046 return true 9047 } 9048 // match: (SHRL x (ANDLconst [31] y)) 9049 // cond: 9050 // result: (SHRL x y) 9051 for { 9052 x := v.Args[0] 9053 v_1 := v.Args[1] 9054 if v_1.Op != Op386ANDLconst { 9055 break 9056 } 9057 if v_1.AuxInt != 31 { 9058 break 9059 } 9060 y := v_1.Args[0] 9061 v.reset(Op386SHRL) 9062 v.AddArg(x) 9063 v.AddArg(y) 9064 return true 9065 } 9066 return false 9067 } 9068 func rewriteValue386_Op386SHRLconst(v *Value, config *Config) bool { 9069 b := v.Block 9070 _ = b 9071 // match: (SHRLconst x [0]) 9072 // cond: 9073 // result: x 9074 for { 9075 if v.AuxInt != 0 { 9076 break 9077 } 9078 x := v.Args[0] 9079 v.reset(OpCopy) 9080 v.Type = x.Type 9081 v.AddArg(x) 9082 return true 9083 } 9084 return false 9085 } 9086 func rewriteValue386_Op386SHRW(v *Value, config *Config) bool { 9087 b := v.Block 9088 _ = b 9089 // match: (SHRW x (MOVLconst [c])) 9090 // cond: c&31 < 16 9091 // result: (SHRWconst [c&31] x) 9092 for { 9093 x := v.Args[0] 9094 v_1 := v.Args[1] 9095 if v_1.Op != Op386MOVLconst { 9096 break 9097 } 9098 c := v_1.AuxInt 9099 if !(c&31 < 16) { 9100 break 9101 } 9102 v.reset(Op386SHRWconst) 9103 v.AuxInt = c & 31 9104 v.AddArg(x) 9105 return true 9106 } 9107 // match: (SHRW _ (MOVLconst [c])) 9108 // cond: c&31 >= 16 9109 // result: (MOVLconst [0]) 9110 for { 9111 v_1 := v.Args[1] 9112 if v_1.Op != Op386MOVLconst { 9113 break 9114 } 9115 c := v_1.AuxInt 9116 if !(c&31 >= 16) { 9117 break 9118 } 9119 v.reset(Op386MOVLconst) 9120 v.AuxInt = 0 9121 return true 9122 } 9123 return false 9124 } 9125 func rewriteValue386_Op386SHRWconst(v *Value, config *Config) bool { 9126 b := v.Block 9127 _ = b 9128 // match: (SHRWconst x [0]) 9129 // cond: 9130 // result: x 9131 for { 9132 if v.AuxInt != 0 { 9133 break 9134 } 9135 x := v.Args[0] 9136 v.reset(OpCopy) 9137 v.Type = x.Type 9138 v.AddArg(x) 9139 return true 9140 } 9141 return false 9142 } 9143 func rewriteValue386_Op386SUBL(v *Value, config *Config) bool { 9144 b := v.Block 9145 _ = b 9146 // match: (SUBL x (MOVLconst [c])) 9147 // cond: 9148 // result: (SUBLconst x [c]) 9149 for { 9150 x := v.Args[0] 9151 v_1 := v.Args[1] 9152 if v_1.Op != Op386MOVLconst { 9153 break 9154 } 9155 c := v_1.AuxInt 9156 v.reset(Op386SUBLconst) 9157 v.AuxInt = c 9158 v.AddArg(x) 9159 return true 9160 } 9161 // match: (SUBL (MOVLconst [c]) x) 9162 // cond: 9163 // result: (NEGL (SUBLconst <v.Type> x [c])) 9164 for { 9165 v_0 := v.Args[0] 9166 if v_0.Op != Op386MOVLconst { 9167 break 9168 } 9169 c := v_0.AuxInt 9170 x := v.Args[1] 9171 v.reset(Op386NEGL) 9172 v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) 9173 v0.AuxInt = c 9174 v0.AddArg(x) 9175 v.AddArg(v0) 9176 return true 9177 } 9178 // match: (SUBL x x) 9179 // cond: 9180 // result: (MOVLconst [0]) 9181 for { 9182 x := v.Args[0] 9183 if x != v.Args[1] { 9184 break 9185 } 9186 v.reset(Op386MOVLconst) 9187 v.AuxInt = 0 9188 return true 9189 } 9190 return false 9191 } 9192 func rewriteValue386_Op386SUBLcarry(v *Value, config *Config) bool { 9193 b := v.Block 9194 _ = b 9195 // match: (SUBLcarry x (MOVLconst [c])) 9196 // cond: 9197 // result: (SUBLconstcarry [c] x) 9198 for { 9199 x := v.Args[0] 9200 v_1 := v.Args[1] 9201 if v_1.Op != Op386MOVLconst { 9202 break 9203 } 9204 c := v_1.AuxInt 9205 v.reset(Op386SUBLconstcarry) 9206 v.AuxInt = c 9207 v.AddArg(x) 9208 return true 9209 } 9210 return false 9211 } 9212 func rewriteValue386_Op386SUBLconst(v *Value, config *Config) bool { 9213 b := v.Block 9214 _ = b 9215 // match: (SUBLconst [c] x) 9216 // cond: int32(c) == 0 9217 // result: x 9218 for { 9219 c := v.AuxInt 9220 x := v.Args[0] 9221 if !(int32(c) == 0) { 9222 break 9223 } 9224 v.reset(OpCopy) 9225 v.Type = x.Type 9226 v.AddArg(x) 9227 return true 9228 } 9229 // match: (SUBLconst [c] x) 9230 // cond: 9231 // result: (ADDLconst [int64(int32(-c))] x) 9232 for { 9233 c := v.AuxInt 9234 x := v.Args[0] 9235 v.reset(Op386ADDLconst) 9236 v.AuxInt = int64(int32(-c)) 9237 v.AddArg(x) 9238 return true 9239 } 9240 } 9241 func rewriteValue386_Op386XORL(v *Value, config *Config) bool { 9242 b := v.Block 9243 _ = b 9244 // match: (XORL x (MOVLconst [c])) 9245 // cond: 9246 // result: (XORLconst [c] x) 9247 for { 9248 x := v.Args[0] 9249 v_1 := v.Args[1] 9250 if v_1.Op != Op386MOVLconst { 9251 break 9252 } 9253 c := v_1.AuxInt 9254 v.reset(Op386XORLconst) 9255 v.AuxInt = c 9256 v.AddArg(x) 9257 return true 9258 } 9259 // match: (XORL (MOVLconst [c]) x) 9260 // cond: 9261 // result: (XORLconst [c] x) 9262 for { 9263 v_0 := v.Args[0] 9264 if v_0.Op != Op386MOVLconst { 9265 break 9266 } 9267 c := v_0.AuxInt 9268 x := v.Args[1] 9269 v.reset(Op386XORLconst) 9270 v.AuxInt = c 9271 v.AddArg(x) 9272 return true 9273 } 9274 // match: (XORL (SHLLconst [c] x) (SHRLconst [32-c] x)) 9275 // cond: 9276 // result: (ROLLconst [c ] x) 9277 for { 9278 v_0 := v.Args[0] 9279 if v_0.Op != Op386SHLLconst { 9280 break 9281 } 9282 c := v_0.AuxInt 9283 x := v_0.Args[0] 9284 v_1 := v.Args[1] 9285 if v_1.Op != Op386SHRLconst { 9286 break 9287 } 9288 if v_1.AuxInt != 32-c { 9289 break 9290 } 9291 if x != v_1.Args[0] { 9292 break 9293 } 9294 v.reset(Op386ROLLconst) 9295 v.AuxInt = c 9296 v.AddArg(x) 9297 return true 9298 } 9299 // match: (XORL (SHRLconst [c] x) (SHLLconst [32-c] x)) 9300 // cond: 9301 // result: (ROLLconst [32-c] x) 9302 for { 9303 v_0 := v.Args[0] 9304 if v_0.Op != Op386SHRLconst { 9305 break 9306 } 9307 c := v_0.AuxInt 9308 x := v_0.Args[0] 9309 v_1 := v.Args[1] 9310 if v_1.Op != Op386SHLLconst { 9311 break 9312 } 9313 if v_1.AuxInt != 32-c { 9314 break 9315 } 9316 if x != v_1.Args[0] { 9317 break 9318 } 9319 v.reset(Op386ROLLconst) 9320 v.AuxInt = 32 - c 9321 v.AddArg(x) 9322 return true 9323 } 9324 // match: (XORL <t> (SHLLconst x [c]) (SHRWconst x [16-c])) 9325 // cond: c < 16 && t.Size() == 2 9326 // result: (ROLWconst x [ c]) 9327 for { 9328 t := v.Type 9329 v_0 := v.Args[0] 9330 if v_0.Op != Op386SHLLconst { 9331 break 9332 } 9333 c := v_0.AuxInt 9334 x := v_0.Args[0] 9335 v_1 := v.Args[1] 9336 if v_1.Op != Op386SHRWconst { 9337 break 9338 } 9339 if v_1.AuxInt != 16-c { 9340 break 9341 } 9342 if x != v_1.Args[0] { 9343 break 9344 } 9345 if !(c < 16 && t.Size() == 2) { 9346 break 9347 } 9348 v.reset(Op386ROLWconst) 9349 v.AuxInt = c 9350 v.AddArg(x) 9351 return true 9352 } 9353 // match: (XORL <t> (SHRWconst x [c]) (SHLLconst x [16-c])) 9354 // cond: c > 0 && t.Size() == 2 9355 // result: (ROLWconst x [16-c]) 9356 for { 9357 t := v.Type 9358 v_0 := v.Args[0] 9359 if v_0.Op != Op386SHRWconst { 9360 break 9361 } 9362 c := v_0.AuxInt 9363 x := v_0.Args[0] 9364 v_1 := v.Args[1] 9365 if v_1.Op != Op386SHLLconst { 9366 break 9367 } 9368 if v_1.AuxInt != 16-c { 9369 break 9370 } 9371 if x != v_1.Args[0] { 9372 break 9373 } 9374 if !(c > 0 && t.Size() == 2) { 9375 break 9376 } 9377 v.reset(Op386ROLWconst) 9378 v.AuxInt = 16 - c 9379 v.AddArg(x) 9380 return true 9381 } 9382 // match: (XORL <t> (SHLLconst x [c]) (SHRBconst x [ 8-c])) 9383 // cond: c < 8 && t.Size() == 1 9384 // result: (ROLBconst x [ c]) 9385 for { 9386 t := v.Type 9387 v_0 := v.Args[0] 9388 if v_0.Op != Op386SHLLconst { 9389 break 9390 } 9391 c := v_0.AuxInt 9392 x := v_0.Args[0] 9393 v_1 := v.Args[1] 9394 if v_1.Op != Op386SHRBconst { 9395 break 9396 } 9397 if v_1.AuxInt != 8-c { 9398 break 9399 } 9400 if x != v_1.Args[0] { 9401 break 9402 } 9403 if !(c < 8 && t.Size() == 1) { 9404 break 9405 } 9406 v.reset(Op386ROLBconst) 9407 v.AuxInt = c 9408 v.AddArg(x) 9409 return true 9410 } 9411 // match: (XORL <t> (SHRBconst x [c]) (SHLLconst x [ 8-c])) 9412 // cond: c > 0 && t.Size() == 1 9413 // result: (ROLBconst x [ 8-c]) 9414 for { 9415 t := v.Type 9416 v_0 := v.Args[0] 9417 if v_0.Op != Op386SHRBconst { 9418 break 9419 } 9420 c := v_0.AuxInt 9421 x := v_0.Args[0] 9422 v_1 := v.Args[1] 9423 if v_1.Op != Op386SHLLconst { 9424 break 9425 } 9426 if v_1.AuxInt != 8-c { 9427 break 9428 } 9429 if x != v_1.Args[0] { 9430 break 9431 } 9432 if !(c > 0 && t.Size() == 1) { 9433 break 9434 } 9435 v.reset(Op386ROLBconst) 9436 v.AuxInt = 8 - c 9437 v.AddArg(x) 9438 return true 9439 } 9440 // match: (XORL x x) 9441 // cond: 9442 // result: (MOVLconst [0]) 9443 for { 9444 x := v.Args[0] 9445 if x != v.Args[1] { 9446 break 9447 } 9448 v.reset(Op386MOVLconst) 9449 v.AuxInt = 0 9450 return true 9451 } 9452 return false 9453 } 9454 func rewriteValue386_Op386XORLconst(v *Value, config *Config) bool { 9455 b := v.Block 9456 _ = b 9457 // match: (XORLconst [c] (XORLconst [d] x)) 9458 // cond: 9459 // result: (XORLconst [c ^ d] x) 9460 for { 9461 c := v.AuxInt 9462 v_0 := v.Args[0] 9463 if v_0.Op != Op386XORLconst { 9464 break 9465 } 9466 d := v_0.AuxInt 9467 x := v_0.Args[0] 9468 v.reset(Op386XORLconst) 9469 v.AuxInt = c ^ d 9470 v.AddArg(x) 9471 return true 9472 } 9473 // match: (XORLconst [c] x) 9474 // cond: int32(c)==0 9475 // result: x 9476 for { 9477 c := v.AuxInt 9478 x := v.Args[0] 9479 if !(int32(c) == 0) { 9480 break 9481 } 9482 v.reset(OpCopy) 9483 v.Type = x.Type 9484 v.AddArg(x) 9485 return true 9486 } 9487 // match: (XORLconst [c] (MOVLconst [d])) 9488 // cond: 9489 // result: (MOVLconst [c^d]) 9490 for { 9491 c := v.AuxInt 9492 v_0 := v.Args[0] 9493 if v_0.Op != Op386MOVLconst { 9494 break 9495 } 9496 d := v_0.AuxInt 9497 v.reset(Op386MOVLconst) 9498 v.AuxInt = c ^ d 9499 return true 9500 } 9501 return false 9502 } 9503 func rewriteValue386_OpAdd16(v *Value, config *Config) bool { 9504 b := v.Block 9505 _ = b 9506 // match: (Add16 x y) 9507 // cond: 9508 // result: (ADDL x y) 9509 for { 9510 x := v.Args[0] 9511 y := v.Args[1] 9512 v.reset(Op386ADDL) 9513 v.AddArg(x) 9514 v.AddArg(y) 9515 return true 9516 } 9517 } 9518 func rewriteValue386_OpAdd32(v *Value, config *Config) bool { 9519 b := v.Block 9520 _ = b 9521 // match: (Add32 x y) 9522 // cond: 9523 // result: (ADDL x y) 9524 for { 9525 x := v.Args[0] 9526 y := v.Args[1] 9527 v.reset(Op386ADDL) 9528 v.AddArg(x) 9529 v.AddArg(y) 9530 return true 9531 } 9532 } 9533 func rewriteValue386_OpAdd32F(v *Value, config *Config) bool { 9534 b := v.Block 9535 _ = b 9536 // match: (Add32F x y) 9537 // cond: 9538 // result: (ADDSS x y) 9539 for { 9540 x := v.Args[0] 9541 y := v.Args[1] 9542 v.reset(Op386ADDSS) 9543 v.AddArg(x) 9544 v.AddArg(y) 9545 return true 9546 } 9547 } 9548 func rewriteValue386_OpAdd32carry(v *Value, config *Config) bool { 9549 b := v.Block 9550 _ = b 9551 // match: (Add32carry x y) 9552 // cond: 9553 // result: (ADDLcarry x y) 9554 for { 9555 x := v.Args[0] 9556 y := v.Args[1] 9557 v.reset(Op386ADDLcarry) 9558 v.AddArg(x) 9559 v.AddArg(y) 9560 return true 9561 } 9562 } 9563 func rewriteValue386_OpAdd32withcarry(v *Value, config *Config) bool { 9564 b := v.Block 9565 _ = b 9566 // match: (Add32withcarry x y c) 9567 // cond: 9568 // result: (ADCL x y c) 9569 for { 9570 x := v.Args[0] 9571 y := v.Args[1] 9572 c := v.Args[2] 9573 v.reset(Op386ADCL) 9574 v.AddArg(x) 9575 v.AddArg(y) 9576 v.AddArg(c) 9577 return true 9578 } 9579 } 9580 func rewriteValue386_OpAdd64F(v *Value, config *Config) bool { 9581 b := v.Block 9582 _ = b 9583 // match: (Add64F x y) 9584 // cond: 9585 // result: (ADDSD x y) 9586 for { 9587 x := v.Args[0] 9588 y := v.Args[1] 9589 v.reset(Op386ADDSD) 9590 v.AddArg(x) 9591 v.AddArg(y) 9592 return true 9593 } 9594 } 9595 func rewriteValue386_OpAdd8(v *Value, config *Config) bool { 9596 b := v.Block 9597 _ = b 9598 // match: (Add8 x y) 9599 // cond: 9600 // result: (ADDL x y) 9601 for { 9602 x := v.Args[0] 9603 y := v.Args[1] 9604 v.reset(Op386ADDL) 9605 v.AddArg(x) 9606 v.AddArg(y) 9607 return true 9608 } 9609 } 9610 func rewriteValue386_OpAddPtr(v *Value, config *Config) bool { 9611 b := v.Block 9612 _ = b 9613 // match: (AddPtr x y) 9614 // cond: 9615 // result: (ADDL x y) 9616 for { 9617 x := v.Args[0] 9618 y := v.Args[1] 9619 v.reset(Op386ADDL) 9620 v.AddArg(x) 9621 v.AddArg(y) 9622 return true 9623 } 9624 } 9625 func rewriteValue386_OpAddr(v *Value, config *Config) bool { 9626 b := v.Block 9627 _ = b 9628 // match: (Addr {sym} base) 9629 // cond: 9630 // result: (LEAL {sym} base) 9631 for { 9632 sym := v.Aux 9633 base := v.Args[0] 9634 v.reset(Op386LEAL) 9635 v.Aux = sym 9636 v.AddArg(base) 9637 return true 9638 } 9639 } 9640 func rewriteValue386_OpAnd16(v *Value, config *Config) bool { 9641 b := v.Block 9642 _ = b 9643 // match: (And16 x y) 9644 // cond: 9645 // result: (ANDL x y) 9646 for { 9647 x := v.Args[0] 9648 y := v.Args[1] 9649 v.reset(Op386ANDL) 9650 v.AddArg(x) 9651 v.AddArg(y) 9652 return true 9653 } 9654 } 9655 func rewriteValue386_OpAnd32(v *Value, config *Config) bool { 9656 b := v.Block 9657 _ = b 9658 // match: (And32 x y) 9659 // cond: 9660 // result: (ANDL x y) 9661 for { 9662 x := v.Args[0] 9663 y := v.Args[1] 9664 v.reset(Op386ANDL) 9665 v.AddArg(x) 9666 v.AddArg(y) 9667 return true 9668 } 9669 } 9670 func rewriteValue386_OpAnd8(v *Value, config *Config) bool { 9671 b := v.Block 9672 _ = b 9673 // match: (And8 x y) 9674 // cond: 9675 // result: (ANDL x y) 9676 for { 9677 x := v.Args[0] 9678 y := v.Args[1] 9679 v.reset(Op386ANDL) 9680 v.AddArg(x) 9681 v.AddArg(y) 9682 return true 9683 } 9684 } 9685 func rewriteValue386_OpAndB(v *Value, config *Config) bool { 9686 b := v.Block 9687 _ = b 9688 // match: (AndB x y) 9689 // cond: 9690 // result: (ANDL x y) 9691 for { 9692 x := v.Args[0] 9693 y := v.Args[1] 9694 v.reset(Op386ANDL) 9695 v.AddArg(x) 9696 v.AddArg(y) 9697 return true 9698 } 9699 } 9700 func rewriteValue386_OpBswap32(v *Value, config *Config) bool { 9701 b := v.Block 9702 _ = b 9703 // match: (Bswap32 x) 9704 // cond: 9705 // result: (BSWAPL x) 9706 for { 9707 x := v.Args[0] 9708 v.reset(Op386BSWAPL) 9709 v.AddArg(x) 9710 return true 9711 } 9712 } 9713 func rewriteValue386_OpClosureCall(v *Value, config *Config) bool { 9714 b := v.Block 9715 _ = b 9716 // match: (ClosureCall [argwid] entry closure mem) 9717 // cond: 9718 // result: (CALLclosure [argwid] entry closure mem) 9719 for { 9720 argwid := v.AuxInt 9721 entry := v.Args[0] 9722 closure := v.Args[1] 9723 mem := v.Args[2] 9724 v.reset(Op386CALLclosure) 9725 v.AuxInt = argwid 9726 v.AddArg(entry) 9727 v.AddArg(closure) 9728 v.AddArg(mem) 9729 return true 9730 } 9731 } 9732 func rewriteValue386_OpCom16(v *Value, config *Config) bool { 9733 b := v.Block 9734 _ = b 9735 // match: (Com16 x) 9736 // cond: 9737 // result: (NOTL x) 9738 for { 9739 x := v.Args[0] 9740 v.reset(Op386NOTL) 9741 v.AddArg(x) 9742 return true 9743 } 9744 } 9745 func rewriteValue386_OpCom32(v *Value, config *Config) bool { 9746 b := v.Block 9747 _ = b 9748 // match: (Com32 x) 9749 // cond: 9750 // result: (NOTL x) 9751 for { 9752 x := v.Args[0] 9753 v.reset(Op386NOTL) 9754 v.AddArg(x) 9755 return true 9756 } 9757 } 9758 func rewriteValue386_OpCom8(v *Value, config *Config) bool { 9759 b := v.Block 9760 _ = b 9761 // match: (Com8 x) 9762 // cond: 9763 // result: (NOTL x) 9764 for { 9765 x := v.Args[0] 9766 v.reset(Op386NOTL) 9767 v.AddArg(x) 9768 return true 9769 } 9770 } 9771 func rewriteValue386_OpConst16(v *Value, config *Config) bool { 9772 b := v.Block 9773 _ = b 9774 // match: (Const16 [val]) 9775 // cond: 9776 // result: (MOVLconst [val]) 9777 for { 9778 val := v.AuxInt 9779 v.reset(Op386MOVLconst) 9780 v.AuxInt = val 9781 return true 9782 } 9783 } 9784 func rewriteValue386_OpConst32(v *Value, config *Config) bool { 9785 b := v.Block 9786 _ = b 9787 // match: (Const32 [val]) 9788 // cond: 9789 // result: (MOVLconst [val]) 9790 for { 9791 val := v.AuxInt 9792 v.reset(Op386MOVLconst) 9793 v.AuxInt = val 9794 return true 9795 } 9796 } 9797 func rewriteValue386_OpConst32F(v *Value, config *Config) bool { 9798 b := v.Block 9799 _ = b 9800 // match: (Const32F [val]) 9801 // cond: 9802 // result: (MOVSSconst [val]) 9803 for { 9804 val := v.AuxInt 9805 v.reset(Op386MOVSSconst) 9806 v.AuxInt = val 9807 return true 9808 } 9809 } 9810 func rewriteValue386_OpConst64F(v *Value, config *Config) bool { 9811 b := v.Block 9812 _ = b 9813 // match: (Const64F [val]) 9814 // cond: 9815 // result: (MOVSDconst [val]) 9816 for { 9817 val := v.AuxInt 9818 v.reset(Op386MOVSDconst) 9819 v.AuxInt = val 9820 return true 9821 } 9822 } 9823 func rewriteValue386_OpConst8(v *Value, config *Config) bool { 9824 b := v.Block 9825 _ = b 9826 // match: (Const8 [val]) 9827 // cond: 9828 // result: (MOVLconst [val]) 9829 for { 9830 val := v.AuxInt 9831 v.reset(Op386MOVLconst) 9832 v.AuxInt = val 9833 return true 9834 } 9835 } 9836 func rewriteValue386_OpConstBool(v *Value, config *Config) bool { 9837 b := v.Block 9838 _ = b 9839 // match: (ConstBool [b]) 9840 // cond: 9841 // result: (MOVLconst [b]) 9842 for { 9843 b := v.AuxInt 9844 v.reset(Op386MOVLconst) 9845 v.AuxInt = b 9846 return true 9847 } 9848 } 9849 func rewriteValue386_OpConstNil(v *Value, config *Config) bool { 9850 b := v.Block 9851 _ = b 9852 // match: (ConstNil) 9853 // cond: 9854 // result: (MOVLconst [0]) 9855 for { 9856 v.reset(Op386MOVLconst) 9857 v.AuxInt = 0 9858 return true 9859 } 9860 } 9861 func rewriteValue386_OpConvert(v *Value, config *Config) bool { 9862 b := v.Block 9863 _ = b 9864 // match: (Convert <t> x mem) 9865 // cond: 9866 // result: (MOVLconvert <t> x mem) 9867 for { 9868 t := v.Type 9869 x := v.Args[0] 9870 mem := v.Args[1] 9871 v.reset(Op386MOVLconvert) 9872 v.Type = t 9873 v.AddArg(x) 9874 v.AddArg(mem) 9875 return true 9876 } 9877 } 9878 func rewriteValue386_OpCvt32Fto32(v *Value, config *Config) bool { 9879 b := v.Block 9880 _ = b 9881 // match: (Cvt32Fto32 x) 9882 // cond: 9883 // result: (CVTTSS2SL x) 9884 for { 9885 x := v.Args[0] 9886 v.reset(Op386CVTTSS2SL) 9887 v.AddArg(x) 9888 return true 9889 } 9890 } 9891 func rewriteValue386_OpCvt32Fto64F(v *Value, config *Config) bool { 9892 b := v.Block 9893 _ = b 9894 // match: (Cvt32Fto64F x) 9895 // cond: 9896 // result: (CVTSS2SD x) 9897 for { 9898 x := v.Args[0] 9899 v.reset(Op386CVTSS2SD) 9900 v.AddArg(x) 9901 return true 9902 } 9903 } 9904 func rewriteValue386_OpCvt32to32F(v *Value, config *Config) bool { 9905 b := v.Block 9906 _ = b 9907 // match: (Cvt32to32F x) 9908 // cond: 9909 // result: (CVTSL2SS x) 9910 for { 9911 x := v.Args[0] 9912 v.reset(Op386CVTSL2SS) 9913 v.AddArg(x) 9914 return true 9915 } 9916 } 9917 func rewriteValue386_OpCvt32to64F(v *Value, config *Config) bool { 9918 b := v.Block 9919 _ = b 9920 // match: (Cvt32to64F x) 9921 // cond: 9922 // result: (CVTSL2SD x) 9923 for { 9924 x := v.Args[0] 9925 v.reset(Op386CVTSL2SD) 9926 v.AddArg(x) 9927 return true 9928 } 9929 } 9930 func rewriteValue386_OpCvt64Fto32(v *Value, config *Config) bool { 9931 b := v.Block 9932 _ = b 9933 // match: (Cvt64Fto32 x) 9934 // cond: 9935 // result: (CVTTSD2SL x) 9936 for { 9937 x := v.Args[0] 9938 v.reset(Op386CVTTSD2SL) 9939 v.AddArg(x) 9940 return true 9941 } 9942 } 9943 func rewriteValue386_OpCvt64Fto32F(v *Value, config *Config) bool { 9944 b := v.Block 9945 _ = b 9946 // match: (Cvt64Fto32F x) 9947 // cond: 9948 // result: (CVTSD2SS x) 9949 for { 9950 x := v.Args[0] 9951 v.reset(Op386CVTSD2SS) 9952 v.AddArg(x) 9953 return true 9954 } 9955 } 9956 func rewriteValue386_OpDeferCall(v *Value, config *Config) bool { 9957 b := v.Block 9958 _ = b 9959 // match: (DeferCall [argwid] mem) 9960 // cond: 9961 // result: (CALLdefer [argwid] mem) 9962 for { 9963 argwid := v.AuxInt 9964 mem := v.Args[0] 9965 v.reset(Op386CALLdefer) 9966 v.AuxInt = argwid 9967 v.AddArg(mem) 9968 return true 9969 } 9970 } 9971 func rewriteValue386_OpDiv16(v *Value, config *Config) bool { 9972 b := v.Block 9973 _ = b 9974 // match: (Div16 x y) 9975 // cond: 9976 // result: (DIVW x y) 9977 for { 9978 x := v.Args[0] 9979 y := v.Args[1] 9980 v.reset(Op386DIVW) 9981 v.AddArg(x) 9982 v.AddArg(y) 9983 return true 9984 } 9985 } 9986 func rewriteValue386_OpDiv16u(v *Value, config *Config) bool { 9987 b := v.Block 9988 _ = b 9989 // match: (Div16u x y) 9990 // cond: 9991 // result: (DIVWU x y) 9992 for { 9993 x := v.Args[0] 9994 y := v.Args[1] 9995 v.reset(Op386DIVWU) 9996 v.AddArg(x) 9997 v.AddArg(y) 9998 return true 9999 } 10000 } 10001 func rewriteValue386_OpDiv32(v *Value, config *Config) bool { 10002 b := v.Block 10003 _ = b 10004 // match: (Div32 x y) 10005 // cond: 10006 // result: (DIVL x y) 10007 for { 10008 x := v.Args[0] 10009 y := v.Args[1] 10010 v.reset(Op386DIVL) 10011 v.AddArg(x) 10012 v.AddArg(y) 10013 return true 10014 } 10015 } 10016 func rewriteValue386_OpDiv32F(v *Value, config *Config) bool { 10017 b := v.Block 10018 _ = b 10019 // match: (Div32F x y) 10020 // cond: 10021 // result: (DIVSS x y) 10022 for { 10023 x := v.Args[0] 10024 y := v.Args[1] 10025 v.reset(Op386DIVSS) 10026 v.AddArg(x) 10027 v.AddArg(y) 10028 return true 10029 } 10030 } 10031 func rewriteValue386_OpDiv32u(v *Value, config *Config) bool { 10032 b := v.Block 10033 _ = b 10034 // match: (Div32u x y) 10035 // cond: 10036 // result: (DIVLU x y) 10037 for { 10038 x := v.Args[0] 10039 y := v.Args[1] 10040 v.reset(Op386DIVLU) 10041 v.AddArg(x) 10042 v.AddArg(y) 10043 return true 10044 } 10045 } 10046 func rewriteValue386_OpDiv64F(v *Value, config *Config) bool { 10047 b := v.Block 10048 _ = b 10049 // match: (Div64F x y) 10050 // cond: 10051 // result: (DIVSD x y) 10052 for { 10053 x := v.Args[0] 10054 y := v.Args[1] 10055 v.reset(Op386DIVSD) 10056 v.AddArg(x) 10057 v.AddArg(y) 10058 return true 10059 } 10060 } 10061 func rewriteValue386_OpDiv8(v *Value, config *Config) bool { 10062 b := v.Block 10063 _ = b 10064 // match: (Div8 x y) 10065 // cond: 10066 // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) 10067 for { 10068 x := v.Args[0] 10069 y := v.Args[1] 10070 v.reset(Op386DIVW) 10071 v0 := b.NewValue0(v.Pos, OpSignExt8to16, config.fe.TypeInt16()) 10072 v0.AddArg(x) 10073 v.AddArg(v0) 10074 v1 := b.NewValue0(v.Pos, OpSignExt8to16, config.fe.TypeInt16()) 10075 v1.AddArg(y) 10076 v.AddArg(v1) 10077 return true 10078 } 10079 } 10080 func rewriteValue386_OpDiv8u(v *Value, config *Config) bool { 10081 b := v.Block 10082 _ = b 10083 // match: (Div8u x y) 10084 // cond: 10085 // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 10086 for { 10087 x := v.Args[0] 10088 y := v.Args[1] 10089 v.reset(Op386DIVWU) 10090 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, config.fe.TypeUInt16()) 10091 v0.AddArg(x) 10092 v.AddArg(v0) 10093 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, config.fe.TypeUInt16()) 10094 v1.AddArg(y) 10095 v.AddArg(v1) 10096 return true 10097 } 10098 } 10099 func rewriteValue386_OpEq16(v *Value, config *Config) bool { 10100 b := v.Block 10101 _ = b 10102 // match: (Eq16 x y) 10103 // cond: 10104 // result: (SETEQ (CMPW x y)) 10105 for { 10106 x := v.Args[0] 10107 y := v.Args[1] 10108 v.reset(Op386SETEQ) 10109 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10110 v0.AddArg(x) 10111 v0.AddArg(y) 10112 v.AddArg(v0) 10113 return true 10114 } 10115 } 10116 func rewriteValue386_OpEq32(v *Value, config *Config) bool { 10117 b := v.Block 10118 _ = b 10119 // match: (Eq32 x y) 10120 // cond: 10121 // result: (SETEQ (CMPL x y)) 10122 for { 10123 x := v.Args[0] 10124 y := v.Args[1] 10125 v.reset(Op386SETEQ) 10126 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10127 v0.AddArg(x) 10128 v0.AddArg(y) 10129 v.AddArg(v0) 10130 return true 10131 } 10132 } 10133 func rewriteValue386_OpEq32F(v *Value, config *Config) bool { 10134 b := v.Block 10135 _ = b 10136 // match: (Eq32F x y) 10137 // cond: 10138 // result: (SETEQF (UCOMISS x y)) 10139 for { 10140 x := v.Args[0] 10141 y := v.Args[1] 10142 v.reset(Op386SETEQF) 10143 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 10144 v0.AddArg(x) 10145 v0.AddArg(y) 10146 v.AddArg(v0) 10147 return true 10148 } 10149 } 10150 func rewriteValue386_OpEq64F(v *Value, config *Config) bool { 10151 b := v.Block 10152 _ = b 10153 // match: (Eq64F x y) 10154 // cond: 10155 // result: (SETEQF (UCOMISD x y)) 10156 for { 10157 x := v.Args[0] 10158 y := v.Args[1] 10159 v.reset(Op386SETEQF) 10160 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 10161 v0.AddArg(x) 10162 v0.AddArg(y) 10163 v.AddArg(v0) 10164 return true 10165 } 10166 } 10167 func rewriteValue386_OpEq8(v *Value, config *Config) bool { 10168 b := v.Block 10169 _ = b 10170 // match: (Eq8 x y) 10171 // cond: 10172 // result: (SETEQ (CMPB x y)) 10173 for { 10174 x := v.Args[0] 10175 y := v.Args[1] 10176 v.reset(Op386SETEQ) 10177 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10178 v0.AddArg(x) 10179 v0.AddArg(y) 10180 v.AddArg(v0) 10181 return true 10182 } 10183 } 10184 func rewriteValue386_OpEqB(v *Value, config *Config) bool { 10185 b := v.Block 10186 _ = b 10187 // match: (EqB x y) 10188 // cond: 10189 // result: (SETEQ (CMPB x y)) 10190 for { 10191 x := v.Args[0] 10192 y := v.Args[1] 10193 v.reset(Op386SETEQ) 10194 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10195 v0.AddArg(x) 10196 v0.AddArg(y) 10197 v.AddArg(v0) 10198 return true 10199 } 10200 } 10201 func rewriteValue386_OpEqPtr(v *Value, config *Config) bool { 10202 b := v.Block 10203 _ = b 10204 // match: (EqPtr x y) 10205 // cond: 10206 // result: (SETEQ (CMPL x y)) 10207 for { 10208 x := v.Args[0] 10209 y := v.Args[1] 10210 v.reset(Op386SETEQ) 10211 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10212 v0.AddArg(x) 10213 v0.AddArg(y) 10214 v.AddArg(v0) 10215 return true 10216 } 10217 } 10218 func rewriteValue386_OpGeq16(v *Value, config *Config) bool { 10219 b := v.Block 10220 _ = b 10221 // match: (Geq16 x y) 10222 // cond: 10223 // result: (SETGE (CMPW x y)) 10224 for { 10225 x := v.Args[0] 10226 y := v.Args[1] 10227 v.reset(Op386SETGE) 10228 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10229 v0.AddArg(x) 10230 v0.AddArg(y) 10231 v.AddArg(v0) 10232 return true 10233 } 10234 } 10235 func rewriteValue386_OpGeq16U(v *Value, config *Config) bool { 10236 b := v.Block 10237 _ = b 10238 // match: (Geq16U x y) 10239 // cond: 10240 // result: (SETAE (CMPW x y)) 10241 for { 10242 x := v.Args[0] 10243 y := v.Args[1] 10244 v.reset(Op386SETAE) 10245 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10246 v0.AddArg(x) 10247 v0.AddArg(y) 10248 v.AddArg(v0) 10249 return true 10250 } 10251 } 10252 func rewriteValue386_OpGeq32(v *Value, config *Config) bool { 10253 b := v.Block 10254 _ = b 10255 // match: (Geq32 x y) 10256 // cond: 10257 // result: (SETGE (CMPL x y)) 10258 for { 10259 x := v.Args[0] 10260 y := v.Args[1] 10261 v.reset(Op386SETGE) 10262 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10263 v0.AddArg(x) 10264 v0.AddArg(y) 10265 v.AddArg(v0) 10266 return true 10267 } 10268 } 10269 func rewriteValue386_OpGeq32F(v *Value, config *Config) bool { 10270 b := v.Block 10271 _ = b 10272 // match: (Geq32F x y) 10273 // cond: 10274 // result: (SETGEF (UCOMISS x y)) 10275 for { 10276 x := v.Args[0] 10277 y := v.Args[1] 10278 v.reset(Op386SETGEF) 10279 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 10280 v0.AddArg(x) 10281 v0.AddArg(y) 10282 v.AddArg(v0) 10283 return true 10284 } 10285 } 10286 func rewriteValue386_OpGeq32U(v *Value, config *Config) bool { 10287 b := v.Block 10288 _ = b 10289 // match: (Geq32U x y) 10290 // cond: 10291 // result: (SETAE (CMPL x y)) 10292 for { 10293 x := v.Args[0] 10294 y := v.Args[1] 10295 v.reset(Op386SETAE) 10296 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10297 v0.AddArg(x) 10298 v0.AddArg(y) 10299 v.AddArg(v0) 10300 return true 10301 } 10302 } 10303 func rewriteValue386_OpGeq64F(v *Value, config *Config) bool { 10304 b := v.Block 10305 _ = b 10306 // match: (Geq64F x y) 10307 // cond: 10308 // result: (SETGEF (UCOMISD x y)) 10309 for { 10310 x := v.Args[0] 10311 y := v.Args[1] 10312 v.reset(Op386SETGEF) 10313 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 10314 v0.AddArg(x) 10315 v0.AddArg(y) 10316 v.AddArg(v0) 10317 return true 10318 } 10319 } 10320 func rewriteValue386_OpGeq8(v *Value, config *Config) bool { 10321 b := v.Block 10322 _ = b 10323 // match: (Geq8 x y) 10324 // cond: 10325 // result: (SETGE (CMPB x y)) 10326 for { 10327 x := v.Args[0] 10328 y := v.Args[1] 10329 v.reset(Op386SETGE) 10330 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10331 v0.AddArg(x) 10332 v0.AddArg(y) 10333 v.AddArg(v0) 10334 return true 10335 } 10336 } 10337 func rewriteValue386_OpGeq8U(v *Value, config *Config) bool { 10338 b := v.Block 10339 _ = b 10340 // match: (Geq8U x y) 10341 // cond: 10342 // result: (SETAE (CMPB x y)) 10343 for { 10344 x := v.Args[0] 10345 y := v.Args[1] 10346 v.reset(Op386SETAE) 10347 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10348 v0.AddArg(x) 10349 v0.AddArg(y) 10350 v.AddArg(v0) 10351 return true 10352 } 10353 } 10354 func rewriteValue386_OpGetClosurePtr(v *Value, config *Config) bool { 10355 b := v.Block 10356 _ = b 10357 // match: (GetClosurePtr) 10358 // cond: 10359 // result: (LoweredGetClosurePtr) 10360 for { 10361 v.reset(Op386LoweredGetClosurePtr) 10362 return true 10363 } 10364 } 10365 func rewriteValue386_OpGetG(v *Value, config *Config) bool { 10366 b := v.Block 10367 _ = b 10368 // match: (GetG mem) 10369 // cond: 10370 // result: (LoweredGetG mem) 10371 for { 10372 mem := v.Args[0] 10373 v.reset(Op386LoweredGetG) 10374 v.AddArg(mem) 10375 return true 10376 } 10377 } 10378 func rewriteValue386_OpGoCall(v *Value, config *Config) bool { 10379 b := v.Block 10380 _ = b 10381 // match: (GoCall [argwid] mem) 10382 // cond: 10383 // result: (CALLgo [argwid] mem) 10384 for { 10385 argwid := v.AuxInt 10386 mem := v.Args[0] 10387 v.reset(Op386CALLgo) 10388 v.AuxInt = argwid 10389 v.AddArg(mem) 10390 return true 10391 } 10392 } 10393 func rewriteValue386_OpGreater16(v *Value, config *Config) bool { 10394 b := v.Block 10395 _ = b 10396 // match: (Greater16 x y) 10397 // cond: 10398 // result: (SETG (CMPW x y)) 10399 for { 10400 x := v.Args[0] 10401 y := v.Args[1] 10402 v.reset(Op386SETG) 10403 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10404 v0.AddArg(x) 10405 v0.AddArg(y) 10406 v.AddArg(v0) 10407 return true 10408 } 10409 } 10410 func rewriteValue386_OpGreater16U(v *Value, config *Config) bool { 10411 b := v.Block 10412 _ = b 10413 // match: (Greater16U x y) 10414 // cond: 10415 // result: (SETA (CMPW x y)) 10416 for { 10417 x := v.Args[0] 10418 y := v.Args[1] 10419 v.reset(Op386SETA) 10420 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10421 v0.AddArg(x) 10422 v0.AddArg(y) 10423 v.AddArg(v0) 10424 return true 10425 } 10426 } 10427 func rewriteValue386_OpGreater32(v *Value, config *Config) bool { 10428 b := v.Block 10429 _ = b 10430 // match: (Greater32 x y) 10431 // cond: 10432 // result: (SETG (CMPL x y)) 10433 for { 10434 x := v.Args[0] 10435 y := v.Args[1] 10436 v.reset(Op386SETG) 10437 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10438 v0.AddArg(x) 10439 v0.AddArg(y) 10440 v.AddArg(v0) 10441 return true 10442 } 10443 } 10444 func rewriteValue386_OpGreater32F(v *Value, config *Config) bool { 10445 b := v.Block 10446 _ = b 10447 // match: (Greater32F x y) 10448 // cond: 10449 // result: (SETGF (UCOMISS x y)) 10450 for { 10451 x := v.Args[0] 10452 y := v.Args[1] 10453 v.reset(Op386SETGF) 10454 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 10455 v0.AddArg(x) 10456 v0.AddArg(y) 10457 v.AddArg(v0) 10458 return true 10459 } 10460 } 10461 func rewriteValue386_OpGreater32U(v *Value, config *Config) bool { 10462 b := v.Block 10463 _ = b 10464 // match: (Greater32U x y) 10465 // cond: 10466 // result: (SETA (CMPL x y)) 10467 for { 10468 x := v.Args[0] 10469 y := v.Args[1] 10470 v.reset(Op386SETA) 10471 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10472 v0.AddArg(x) 10473 v0.AddArg(y) 10474 v.AddArg(v0) 10475 return true 10476 } 10477 } 10478 func rewriteValue386_OpGreater64F(v *Value, config *Config) bool { 10479 b := v.Block 10480 _ = b 10481 // match: (Greater64F x y) 10482 // cond: 10483 // result: (SETGF (UCOMISD x y)) 10484 for { 10485 x := v.Args[0] 10486 y := v.Args[1] 10487 v.reset(Op386SETGF) 10488 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 10489 v0.AddArg(x) 10490 v0.AddArg(y) 10491 v.AddArg(v0) 10492 return true 10493 } 10494 } 10495 func rewriteValue386_OpGreater8(v *Value, config *Config) bool { 10496 b := v.Block 10497 _ = b 10498 // match: (Greater8 x y) 10499 // cond: 10500 // result: (SETG (CMPB x y)) 10501 for { 10502 x := v.Args[0] 10503 y := v.Args[1] 10504 v.reset(Op386SETG) 10505 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10506 v0.AddArg(x) 10507 v0.AddArg(y) 10508 v.AddArg(v0) 10509 return true 10510 } 10511 } 10512 func rewriteValue386_OpGreater8U(v *Value, config *Config) bool { 10513 b := v.Block 10514 _ = b 10515 // match: (Greater8U x y) 10516 // cond: 10517 // result: (SETA (CMPB x y)) 10518 for { 10519 x := v.Args[0] 10520 y := v.Args[1] 10521 v.reset(Op386SETA) 10522 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10523 v0.AddArg(x) 10524 v0.AddArg(y) 10525 v.AddArg(v0) 10526 return true 10527 } 10528 } 10529 func rewriteValue386_OpHmul16(v *Value, config *Config) bool { 10530 b := v.Block 10531 _ = b 10532 // match: (Hmul16 x y) 10533 // cond: 10534 // result: (HMULW x y) 10535 for { 10536 x := v.Args[0] 10537 y := v.Args[1] 10538 v.reset(Op386HMULW) 10539 v.AddArg(x) 10540 v.AddArg(y) 10541 return true 10542 } 10543 } 10544 func rewriteValue386_OpHmul16u(v *Value, config *Config) bool { 10545 b := v.Block 10546 _ = b 10547 // match: (Hmul16u x y) 10548 // cond: 10549 // result: (HMULWU x y) 10550 for { 10551 x := v.Args[0] 10552 y := v.Args[1] 10553 v.reset(Op386HMULWU) 10554 v.AddArg(x) 10555 v.AddArg(y) 10556 return true 10557 } 10558 } 10559 func rewriteValue386_OpHmul32(v *Value, config *Config) bool { 10560 b := v.Block 10561 _ = b 10562 // match: (Hmul32 x y) 10563 // cond: 10564 // result: (HMULL x y) 10565 for { 10566 x := v.Args[0] 10567 y := v.Args[1] 10568 v.reset(Op386HMULL) 10569 v.AddArg(x) 10570 v.AddArg(y) 10571 return true 10572 } 10573 } 10574 func rewriteValue386_OpHmul32u(v *Value, config *Config) bool { 10575 b := v.Block 10576 _ = b 10577 // match: (Hmul32u x y) 10578 // cond: 10579 // result: (HMULLU x y) 10580 for { 10581 x := v.Args[0] 10582 y := v.Args[1] 10583 v.reset(Op386HMULLU) 10584 v.AddArg(x) 10585 v.AddArg(y) 10586 return true 10587 } 10588 } 10589 func rewriteValue386_OpHmul8(v *Value, config *Config) bool { 10590 b := v.Block 10591 _ = b 10592 // match: (Hmul8 x y) 10593 // cond: 10594 // result: (HMULB x y) 10595 for { 10596 x := v.Args[0] 10597 y := v.Args[1] 10598 v.reset(Op386HMULB) 10599 v.AddArg(x) 10600 v.AddArg(y) 10601 return true 10602 } 10603 } 10604 func rewriteValue386_OpHmul8u(v *Value, config *Config) bool { 10605 b := v.Block 10606 _ = b 10607 // match: (Hmul8u x y) 10608 // cond: 10609 // result: (HMULBU x y) 10610 for { 10611 x := v.Args[0] 10612 y := v.Args[1] 10613 v.reset(Op386HMULBU) 10614 v.AddArg(x) 10615 v.AddArg(y) 10616 return true 10617 } 10618 } 10619 func rewriteValue386_OpInterCall(v *Value, config *Config) bool { 10620 b := v.Block 10621 _ = b 10622 // match: (InterCall [argwid] entry mem) 10623 // cond: 10624 // result: (CALLinter [argwid] entry mem) 10625 for { 10626 argwid := v.AuxInt 10627 entry := v.Args[0] 10628 mem := v.Args[1] 10629 v.reset(Op386CALLinter) 10630 v.AuxInt = argwid 10631 v.AddArg(entry) 10632 v.AddArg(mem) 10633 return true 10634 } 10635 } 10636 func rewriteValue386_OpIsInBounds(v *Value, config *Config) bool { 10637 b := v.Block 10638 _ = b 10639 // match: (IsInBounds idx len) 10640 // cond: 10641 // result: (SETB (CMPL idx len)) 10642 for { 10643 idx := v.Args[0] 10644 len := v.Args[1] 10645 v.reset(Op386SETB) 10646 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10647 v0.AddArg(idx) 10648 v0.AddArg(len) 10649 v.AddArg(v0) 10650 return true 10651 } 10652 } 10653 func rewriteValue386_OpIsNonNil(v *Value, config *Config) bool { 10654 b := v.Block 10655 _ = b 10656 // match: (IsNonNil p) 10657 // cond: 10658 // result: (SETNE (TESTL p p)) 10659 for { 10660 p := v.Args[0] 10661 v.reset(Op386SETNE) 10662 v0 := b.NewValue0(v.Pos, Op386TESTL, TypeFlags) 10663 v0.AddArg(p) 10664 v0.AddArg(p) 10665 v.AddArg(v0) 10666 return true 10667 } 10668 } 10669 func rewriteValue386_OpIsSliceInBounds(v *Value, config *Config) bool { 10670 b := v.Block 10671 _ = b 10672 // match: (IsSliceInBounds idx len) 10673 // cond: 10674 // result: (SETBE (CMPL idx len)) 10675 for { 10676 idx := v.Args[0] 10677 len := v.Args[1] 10678 v.reset(Op386SETBE) 10679 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10680 v0.AddArg(idx) 10681 v0.AddArg(len) 10682 v.AddArg(v0) 10683 return true 10684 } 10685 } 10686 func rewriteValue386_OpLeq16(v *Value, config *Config) bool { 10687 b := v.Block 10688 _ = b 10689 // match: (Leq16 x y) 10690 // cond: 10691 // result: (SETLE (CMPW x y)) 10692 for { 10693 x := v.Args[0] 10694 y := v.Args[1] 10695 v.reset(Op386SETLE) 10696 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10697 v0.AddArg(x) 10698 v0.AddArg(y) 10699 v.AddArg(v0) 10700 return true 10701 } 10702 } 10703 func rewriteValue386_OpLeq16U(v *Value, config *Config) bool { 10704 b := v.Block 10705 _ = b 10706 // match: (Leq16U x y) 10707 // cond: 10708 // result: (SETBE (CMPW x y)) 10709 for { 10710 x := v.Args[0] 10711 y := v.Args[1] 10712 v.reset(Op386SETBE) 10713 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10714 v0.AddArg(x) 10715 v0.AddArg(y) 10716 v.AddArg(v0) 10717 return true 10718 } 10719 } 10720 func rewriteValue386_OpLeq32(v *Value, config *Config) bool { 10721 b := v.Block 10722 _ = b 10723 // match: (Leq32 x y) 10724 // cond: 10725 // result: (SETLE (CMPL x y)) 10726 for { 10727 x := v.Args[0] 10728 y := v.Args[1] 10729 v.reset(Op386SETLE) 10730 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10731 v0.AddArg(x) 10732 v0.AddArg(y) 10733 v.AddArg(v0) 10734 return true 10735 } 10736 } 10737 func rewriteValue386_OpLeq32F(v *Value, config *Config) bool { 10738 b := v.Block 10739 _ = b 10740 // match: (Leq32F x y) 10741 // cond: 10742 // result: (SETGEF (UCOMISS y x)) 10743 for { 10744 x := v.Args[0] 10745 y := v.Args[1] 10746 v.reset(Op386SETGEF) 10747 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 10748 v0.AddArg(y) 10749 v0.AddArg(x) 10750 v.AddArg(v0) 10751 return true 10752 } 10753 } 10754 func rewriteValue386_OpLeq32U(v *Value, config *Config) bool { 10755 b := v.Block 10756 _ = b 10757 // match: (Leq32U x y) 10758 // cond: 10759 // result: (SETBE (CMPL x y)) 10760 for { 10761 x := v.Args[0] 10762 y := v.Args[1] 10763 v.reset(Op386SETBE) 10764 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10765 v0.AddArg(x) 10766 v0.AddArg(y) 10767 v.AddArg(v0) 10768 return true 10769 } 10770 } 10771 func rewriteValue386_OpLeq64F(v *Value, config *Config) bool { 10772 b := v.Block 10773 _ = b 10774 // match: (Leq64F x y) 10775 // cond: 10776 // result: (SETGEF (UCOMISD y x)) 10777 for { 10778 x := v.Args[0] 10779 y := v.Args[1] 10780 v.reset(Op386SETGEF) 10781 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 10782 v0.AddArg(y) 10783 v0.AddArg(x) 10784 v.AddArg(v0) 10785 return true 10786 } 10787 } 10788 func rewriteValue386_OpLeq8(v *Value, config *Config) bool { 10789 b := v.Block 10790 _ = b 10791 // match: (Leq8 x y) 10792 // cond: 10793 // result: (SETLE (CMPB x y)) 10794 for { 10795 x := v.Args[0] 10796 y := v.Args[1] 10797 v.reset(Op386SETLE) 10798 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10799 v0.AddArg(x) 10800 v0.AddArg(y) 10801 v.AddArg(v0) 10802 return true 10803 } 10804 } 10805 func rewriteValue386_OpLeq8U(v *Value, config *Config) bool { 10806 b := v.Block 10807 _ = b 10808 // match: (Leq8U x y) 10809 // cond: 10810 // result: (SETBE (CMPB x y)) 10811 for { 10812 x := v.Args[0] 10813 y := v.Args[1] 10814 v.reset(Op386SETBE) 10815 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10816 v0.AddArg(x) 10817 v0.AddArg(y) 10818 v.AddArg(v0) 10819 return true 10820 } 10821 } 10822 func rewriteValue386_OpLess16(v *Value, config *Config) bool { 10823 b := v.Block 10824 _ = b 10825 // match: (Less16 x y) 10826 // cond: 10827 // result: (SETL (CMPW x y)) 10828 for { 10829 x := v.Args[0] 10830 y := v.Args[1] 10831 v.reset(Op386SETL) 10832 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10833 v0.AddArg(x) 10834 v0.AddArg(y) 10835 v.AddArg(v0) 10836 return true 10837 } 10838 } 10839 func rewriteValue386_OpLess16U(v *Value, config *Config) bool { 10840 b := v.Block 10841 _ = b 10842 // match: (Less16U x y) 10843 // cond: 10844 // result: (SETB (CMPW x y)) 10845 for { 10846 x := v.Args[0] 10847 y := v.Args[1] 10848 v.reset(Op386SETB) 10849 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 10850 v0.AddArg(x) 10851 v0.AddArg(y) 10852 v.AddArg(v0) 10853 return true 10854 } 10855 } 10856 func rewriteValue386_OpLess32(v *Value, config *Config) bool { 10857 b := v.Block 10858 _ = b 10859 // match: (Less32 x y) 10860 // cond: 10861 // result: (SETL (CMPL x y)) 10862 for { 10863 x := v.Args[0] 10864 y := v.Args[1] 10865 v.reset(Op386SETL) 10866 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10867 v0.AddArg(x) 10868 v0.AddArg(y) 10869 v.AddArg(v0) 10870 return true 10871 } 10872 } 10873 func rewriteValue386_OpLess32F(v *Value, config *Config) bool { 10874 b := v.Block 10875 _ = b 10876 // match: (Less32F x y) 10877 // cond: 10878 // result: (SETGF (UCOMISS y x)) 10879 for { 10880 x := v.Args[0] 10881 y := v.Args[1] 10882 v.reset(Op386SETGF) 10883 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 10884 v0.AddArg(y) 10885 v0.AddArg(x) 10886 v.AddArg(v0) 10887 return true 10888 } 10889 } 10890 func rewriteValue386_OpLess32U(v *Value, config *Config) bool { 10891 b := v.Block 10892 _ = b 10893 // match: (Less32U x y) 10894 // cond: 10895 // result: (SETB (CMPL x y)) 10896 for { 10897 x := v.Args[0] 10898 y := v.Args[1] 10899 v.reset(Op386SETB) 10900 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 10901 v0.AddArg(x) 10902 v0.AddArg(y) 10903 v.AddArg(v0) 10904 return true 10905 } 10906 } 10907 func rewriteValue386_OpLess64F(v *Value, config *Config) bool { 10908 b := v.Block 10909 _ = b 10910 // match: (Less64F x y) 10911 // cond: 10912 // result: (SETGF (UCOMISD y x)) 10913 for { 10914 x := v.Args[0] 10915 y := v.Args[1] 10916 v.reset(Op386SETGF) 10917 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 10918 v0.AddArg(y) 10919 v0.AddArg(x) 10920 v.AddArg(v0) 10921 return true 10922 } 10923 } 10924 func rewriteValue386_OpLess8(v *Value, config *Config) bool { 10925 b := v.Block 10926 _ = b 10927 // match: (Less8 x y) 10928 // cond: 10929 // result: (SETL (CMPB x y)) 10930 for { 10931 x := v.Args[0] 10932 y := v.Args[1] 10933 v.reset(Op386SETL) 10934 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10935 v0.AddArg(x) 10936 v0.AddArg(y) 10937 v.AddArg(v0) 10938 return true 10939 } 10940 } 10941 func rewriteValue386_OpLess8U(v *Value, config *Config) bool { 10942 b := v.Block 10943 _ = b 10944 // match: (Less8U x y) 10945 // cond: 10946 // result: (SETB (CMPB x y)) 10947 for { 10948 x := v.Args[0] 10949 y := v.Args[1] 10950 v.reset(Op386SETB) 10951 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 10952 v0.AddArg(x) 10953 v0.AddArg(y) 10954 v.AddArg(v0) 10955 return true 10956 } 10957 } 10958 func rewriteValue386_OpLoad(v *Value, config *Config) bool { 10959 b := v.Block 10960 _ = b 10961 // match: (Load <t> ptr mem) 10962 // cond: (is32BitInt(t) || isPtr(t)) 10963 // result: (MOVLload ptr mem) 10964 for { 10965 t := v.Type 10966 ptr := v.Args[0] 10967 mem := v.Args[1] 10968 if !(is32BitInt(t) || isPtr(t)) { 10969 break 10970 } 10971 v.reset(Op386MOVLload) 10972 v.AddArg(ptr) 10973 v.AddArg(mem) 10974 return true 10975 } 10976 // match: (Load <t> ptr mem) 10977 // cond: is16BitInt(t) 10978 // result: (MOVWload ptr mem) 10979 for { 10980 t := v.Type 10981 ptr := v.Args[0] 10982 mem := v.Args[1] 10983 if !(is16BitInt(t)) { 10984 break 10985 } 10986 v.reset(Op386MOVWload) 10987 v.AddArg(ptr) 10988 v.AddArg(mem) 10989 return true 10990 } 10991 // match: (Load <t> ptr mem) 10992 // cond: (t.IsBoolean() || is8BitInt(t)) 10993 // result: (MOVBload ptr mem) 10994 for { 10995 t := v.Type 10996 ptr := v.Args[0] 10997 mem := v.Args[1] 10998 if !(t.IsBoolean() || is8BitInt(t)) { 10999 break 11000 } 11001 v.reset(Op386MOVBload) 11002 v.AddArg(ptr) 11003 v.AddArg(mem) 11004 return true 11005 } 11006 // match: (Load <t> ptr mem) 11007 // cond: is32BitFloat(t) 11008 // result: (MOVSSload ptr mem) 11009 for { 11010 t := v.Type 11011 ptr := v.Args[0] 11012 mem := v.Args[1] 11013 if !(is32BitFloat(t)) { 11014 break 11015 } 11016 v.reset(Op386MOVSSload) 11017 v.AddArg(ptr) 11018 v.AddArg(mem) 11019 return true 11020 } 11021 // match: (Load <t> ptr mem) 11022 // cond: is64BitFloat(t) 11023 // result: (MOVSDload ptr mem) 11024 for { 11025 t := v.Type 11026 ptr := v.Args[0] 11027 mem := v.Args[1] 11028 if !(is64BitFloat(t)) { 11029 break 11030 } 11031 v.reset(Op386MOVSDload) 11032 v.AddArg(ptr) 11033 v.AddArg(mem) 11034 return true 11035 } 11036 return false 11037 } 11038 func rewriteValue386_OpLsh16x16(v *Value, config *Config) bool { 11039 b := v.Block 11040 _ = b 11041 // match: (Lsh16x16 <t> x y) 11042 // cond: 11043 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 11044 for { 11045 t := v.Type 11046 x := v.Args[0] 11047 y := v.Args[1] 11048 v.reset(Op386ANDL) 11049 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11050 v0.AddArg(x) 11051 v0.AddArg(y) 11052 v.AddArg(v0) 11053 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11054 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 11055 v2.AuxInt = 32 11056 v2.AddArg(y) 11057 v1.AddArg(v2) 11058 v.AddArg(v1) 11059 return true 11060 } 11061 } 11062 func rewriteValue386_OpLsh16x32(v *Value, config *Config) bool { 11063 b := v.Block 11064 _ = b 11065 // match: (Lsh16x32 <t> x y) 11066 // cond: 11067 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 11068 for { 11069 t := v.Type 11070 x := v.Args[0] 11071 y := v.Args[1] 11072 v.reset(Op386ANDL) 11073 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11074 v0.AddArg(x) 11075 v0.AddArg(y) 11076 v.AddArg(v0) 11077 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11078 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 11079 v2.AuxInt = 32 11080 v2.AddArg(y) 11081 v1.AddArg(v2) 11082 v.AddArg(v1) 11083 return true 11084 } 11085 } 11086 func rewriteValue386_OpLsh16x64(v *Value, config *Config) bool { 11087 b := v.Block 11088 _ = b 11089 // match: (Lsh16x64 x (Const64 [c])) 11090 // cond: uint64(c) < 16 11091 // result: (SHLLconst x [c]) 11092 for { 11093 x := v.Args[0] 11094 v_1 := v.Args[1] 11095 if v_1.Op != OpConst64 { 11096 break 11097 } 11098 c := v_1.AuxInt 11099 if !(uint64(c) < 16) { 11100 break 11101 } 11102 v.reset(Op386SHLLconst) 11103 v.AuxInt = c 11104 v.AddArg(x) 11105 return true 11106 } 11107 // match: (Lsh16x64 _ (Const64 [c])) 11108 // cond: uint64(c) >= 16 11109 // result: (Const16 [0]) 11110 for { 11111 v_1 := v.Args[1] 11112 if v_1.Op != OpConst64 { 11113 break 11114 } 11115 c := v_1.AuxInt 11116 if !(uint64(c) >= 16) { 11117 break 11118 } 11119 v.reset(OpConst16) 11120 v.AuxInt = 0 11121 return true 11122 } 11123 return false 11124 } 11125 func rewriteValue386_OpLsh16x8(v *Value, config *Config) bool { 11126 b := v.Block 11127 _ = b 11128 // match: (Lsh16x8 <t> x y) 11129 // cond: 11130 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 11131 for { 11132 t := v.Type 11133 x := v.Args[0] 11134 y := v.Args[1] 11135 v.reset(Op386ANDL) 11136 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11137 v0.AddArg(x) 11138 v0.AddArg(y) 11139 v.AddArg(v0) 11140 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11141 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 11142 v2.AuxInt = 32 11143 v2.AddArg(y) 11144 v1.AddArg(v2) 11145 v.AddArg(v1) 11146 return true 11147 } 11148 } 11149 func rewriteValue386_OpLsh32x16(v *Value, config *Config) bool { 11150 b := v.Block 11151 _ = b 11152 // match: (Lsh32x16 <t> x y) 11153 // cond: 11154 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 11155 for { 11156 t := v.Type 11157 x := v.Args[0] 11158 y := v.Args[1] 11159 v.reset(Op386ANDL) 11160 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11161 v0.AddArg(x) 11162 v0.AddArg(y) 11163 v.AddArg(v0) 11164 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11165 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 11166 v2.AuxInt = 32 11167 v2.AddArg(y) 11168 v1.AddArg(v2) 11169 v.AddArg(v1) 11170 return true 11171 } 11172 } 11173 func rewriteValue386_OpLsh32x32(v *Value, config *Config) bool { 11174 b := v.Block 11175 _ = b 11176 // match: (Lsh32x32 <t> x y) 11177 // cond: 11178 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 11179 for { 11180 t := v.Type 11181 x := v.Args[0] 11182 y := v.Args[1] 11183 v.reset(Op386ANDL) 11184 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11185 v0.AddArg(x) 11186 v0.AddArg(y) 11187 v.AddArg(v0) 11188 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11189 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 11190 v2.AuxInt = 32 11191 v2.AddArg(y) 11192 v1.AddArg(v2) 11193 v.AddArg(v1) 11194 return true 11195 } 11196 } 11197 func rewriteValue386_OpLsh32x64(v *Value, config *Config) bool { 11198 b := v.Block 11199 _ = b 11200 // match: (Lsh32x64 x (Const64 [c])) 11201 // cond: uint64(c) < 32 11202 // result: (SHLLconst x [c]) 11203 for { 11204 x := v.Args[0] 11205 v_1 := v.Args[1] 11206 if v_1.Op != OpConst64 { 11207 break 11208 } 11209 c := v_1.AuxInt 11210 if !(uint64(c) < 32) { 11211 break 11212 } 11213 v.reset(Op386SHLLconst) 11214 v.AuxInt = c 11215 v.AddArg(x) 11216 return true 11217 } 11218 // match: (Lsh32x64 _ (Const64 [c])) 11219 // cond: uint64(c) >= 32 11220 // result: (Const32 [0]) 11221 for { 11222 v_1 := v.Args[1] 11223 if v_1.Op != OpConst64 { 11224 break 11225 } 11226 c := v_1.AuxInt 11227 if !(uint64(c) >= 32) { 11228 break 11229 } 11230 v.reset(OpConst32) 11231 v.AuxInt = 0 11232 return true 11233 } 11234 return false 11235 } 11236 func rewriteValue386_OpLsh32x8(v *Value, config *Config) bool { 11237 b := v.Block 11238 _ = b 11239 // match: (Lsh32x8 <t> x y) 11240 // cond: 11241 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 11242 for { 11243 t := v.Type 11244 x := v.Args[0] 11245 y := v.Args[1] 11246 v.reset(Op386ANDL) 11247 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11248 v0.AddArg(x) 11249 v0.AddArg(y) 11250 v.AddArg(v0) 11251 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11252 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 11253 v2.AuxInt = 32 11254 v2.AddArg(y) 11255 v1.AddArg(v2) 11256 v.AddArg(v1) 11257 return true 11258 } 11259 } 11260 func rewriteValue386_OpLsh8x16(v *Value, config *Config) bool { 11261 b := v.Block 11262 _ = b 11263 // match: (Lsh8x16 <t> x y) 11264 // cond: 11265 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 11266 for { 11267 t := v.Type 11268 x := v.Args[0] 11269 y := v.Args[1] 11270 v.reset(Op386ANDL) 11271 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11272 v0.AddArg(x) 11273 v0.AddArg(y) 11274 v.AddArg(v0) 11275 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11276 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 11277 v2.AuxInt = 32 11278 v2.AddArg(y) 11279 v1.AddArg(v2) 11280 v.AddArg(v1) 11281 return true 11282 } 11283 } 11284 func rewriteValue386_OpLsh8x32(v *Value, config *Config) bool { 11285 b := v.Block 11286 _ = b 11287 // match: (Lsh8x32 <t> x y) 11288 // cond: 11289 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 11290 for { 11291 t := v.Type 11292 x := v.Args[0] 11293 y := v.Args[1] 11294 v.reset(Op386ANDL) 11295 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11296 v0.AddArg(x) 11297 v0.AddArg(y) 11298 v.AddArg(v0) 11299 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11300 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 11301 v2.AuxInt = 32 11302 v2.AddArg(y) 11303 v1.AddArg(v2) 11304 v.AddArg(v1) 11305 return true 11306 } 11307 } 11308 func rewriteValue386_OpLsh8x64(v *Value, config *Config) bool { 11309 b := v.Block 11310 _ = b 11311 // match: (Lsh8x64 x (Const64 [c])) 11312 // cond: uint64(c) < 8 11313 // result: (SHLLconst x [c]) 11314 for { 11315 x := v.Args[0] 11316 v_1 := v.Args[1] 11317 if v_1.Op != OpConst64 { 11318 break 11319 } 11320 c := v_1.AuxInt 11321 if !(uint64(c) < 8) { 11322 break 11323 } 11324 v.reset(Op386SHLLconst) 11325 v.AuxInt = c 11326 v.AddArg(x) 11327 return true 11328 } 11329 // match: (Lsh8x64 _ (Const64 [c])) 11330 // cond: uint64(c) >= 8 11331 // result: (Const8 [0]) 11332 for { 11333 v_1 := v.Args[1] 11334 if v_1.Op != OpConst64 { 11335 break 11336 } 11337 c := v_1.AuxInt 11338 if !(uint64(c) >= 8) { 11339 break 11340 } 11341 v.reset(OpConst8) 11342 v.AuxInt = 0 11343 return true 11344 } 11345 return false 11346 } 11347 func rewriteValue386_OpLsh8x8(v *Value, config *Config) bool { 11348 b := v.Block 11349 _ = b 11350 // match: (Lsh8x8 <t> x y) 11351 // cond: 11352 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 11353 for { 11354 t := v.Type 11355 x := v.Args[0] 11356 y := v.Args[1] 11357 v.reset(Op386ANDL) 11358 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 11359 v0.AddArg(x) 11360 v0.AddArg(y) 11361 v.AddArg(v0) 11362 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 11363 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 11364 v2.AuxInt = 32 11365 v2.AddArg(y) 11366 v1.AddArg(v2) 11367 v.AddArg(v1) 11368 return true 11369 } 11370 } 11371 func rewriteValue386_OpMod16(v *Value, config *Config) bool { 11372 b := v.Block 11373 _ = b 11374 // match: (Mod16 x y) 11375 // cond: 11376 // result: (MODW x y) 11377 for { 11378 x := v.Args[0] 11379 y := v.Args[1] 11380 v.reset(Op386MODW) 11381 v.AddArg(x) 11382 v.AddArg(y) 11383 return true 11384 } 11385 } 11386 func rewriteValue386_OpMod16u(v *Value, config *Config) bool { 11387 b := v.Block 11388 _ = b 11389 // match: (Mod16u x y) 11390 // cond: 11391 // result: (MODWU x y) 11392 for { 11393 x := v.Args[0] 11394 y := v.Args[1] 11395 v.reset(Op386MODWU) 11396 v.AddArg(x) 11397 v.AddArg(y) 11398 return true 11399 } 11400 } 11401 func rewriteValue386_OpMod32(v *Value, config *Config) bool { 11402 b := v.Block 11403 _ = b 11404 // match: (Mod32 x y) 11405 // cond: 11406 // result: (MODL x y) 11407 for { 11408 x := v.Args[0] 11409 y := v.Args[1] 11410 v.reset(Op386MODL) 11411 v.AddArg(x) 11412 v.AddArg(y) 11413 return true 11414 } 11415 } 11416 func rewriteValue386_OpMod32u(v *Value, config *Config) bool { 11417 b := v.Block 11418 _ = b 11419 // match: (Mod32u x y) 11420 // cond: 11421 // result: (MODLU x y) 11422 for { 11423 x := v.Args[0] 11424 y := v.Args[1] 11425 v.reset(Op386MODLU) 11426 v.AddArg(x) 11427 v.AddArg(y) 11428 return true 11429 } 11430 } 11431 func rewriteValue386_OpMod8(v *Value, config *Config) bool { 11432 b := v.Block 11433 _ = b 11434 // match: (Mod8 x y) 11435 // cond: 11436 // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) 11437 for { 11438 x := v.Args[0] 11439 y := v.Args[1] 11440 v.reset(Op386MODW) 11441 v0 := b.NewValue0(v.Pos, OpSignExt8to16, config.fe.TypeInt16()) 11442 v0.AddArg(x) 11443 v.AddArg(v0) 11444 v1 := b.NewValue0(v.Pos, OpSignExt8to16, config.fe.TypeInt16()) 11445 v1.AddArg(y) 11446 v.AddArg(v1) 11447 return true 11448 } 11449 } 11450 func rewriteValue386_OpMod8u(v *Value, config *Config) bool { 11451 b := v.Block 11452 _ = b 11453 // match: (Mod8u x y) 11454 // cond: 11455 // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 11456 for { 11457 x := v.Args[0] 11458 y := v.Args[1] 11459 v.reset(Op386MODWU) 11460 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, config.fe.TypeUInt16()) 11461 v0.AddArg(x) 11462 v.AddArg(v0) 11463 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, config.fe.TypeUInt16()) 11464 v1.AddArg(y) 11465 v.AddArg(v1) 11466 return true 11467 } 11468 } 11469 func rewriteValue386_OpMove(v *Value, config *Config) bool { 11470 b := v.Block 11471 _ = b 11472 // match: (Move [s] _ _ mem) 11473 // cond: SizeAndAlign(s).Size() == 0 11474 // result: mem 11475 for { 11476 s := v.AuxInt 11477 mem := v.Args[2] 11478 if !(SizeAndAlign(s).Size() == 0) { 11479 break 11480 } 11481 v.reset(OpCopy) 11482 v.Type = mem.Type 11483 v.AddArg(mem) 11484 return true 11485 } 11486 // match: (Move [s] dst src mem) 11487 // cond: SizeAndAlign(s).Size() == 1 11488 // result: (MOVBstore dst (MOVBload src mem) mem) 11489 for { 11490 s := v.AuxInt 11491 dst := v.Args[0] 11492 src := v.Args[1] 11493 mem := v.Args[2] 11494 if !(SizeAndAlign(s).Size() == 1) { 11495 break 11496 } 11497 v.reset(Op386MOVBstore) 11498 v.AddArg(dst) 11499 v0 := b.NewValue0(v.Pos, Op386MOVBload, config.fe.TypeUInt8()) 11500 v0.AddArg(src) 11501 v0.AddArg(mem) 11502 v.AddArg(v0) 11503 v.AddArg(mem) 11504 return true 11505 } 11506 // match: (Move [s] dst src mem) 11507 // cond: SizeAndAlign(s).Size() == 2 11508 // result: (MOVWstore dst (MOVWload src mem) mem) 11509 for { 11510 s := v.AuxInt 11511 dst := v.Args[0] 11512 src := v.Args[1] 11513 mem := v.Args[2] 11514 if !(SizeAndAlign(s).Size() == 2) { 11515 break 11516 } 11517 v.reset(Op386MOVWstore) 11518 v.AddArg(dst) 11519 v0 := b.NewValue0(v.Pos, Op386MOVWload, config.fe.TypeUInt16()) 11520 v0.AddArg(src) 11521 v0.AddArg(mem) 11522 v.AddArg(v0) 11523 v.AddArg(mem) 11524 return true 11525 } 11526 // match: (Move [s] dst src mem) 11527 // cond: SizeAndAlign(s).Size() == 4 11528 // result: (MOVLstore dst (MOVLload src mem) mem) 11529 for { 11530 s := v.AuxInt 11531 dst := v.Args[0] 11532 src := v.Args[1] 11533 mem := v.Args[2] 11534 if !(SizeAndAlign(s).Size() == 4) { 11535 break 11536 } 11537 v.reset(Op386MOVLstore) 11538 v.AddArg(dst) 11539 v0 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11540 v0.AddArg(src) 11541 v0.AddArg(mem) 11542 v.AddArg(v0) 11543 v.AddArg(mem) 11544 return true 11545 } 11546 // match: (Move [s] dst src mem) 11547 // cond: SizeAndAlign(s).Size() == 3 11548 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) 11549 for { 11550 s := v.AuxInt 11551 dst := v.Args[0] 11552 src := v.Args[1] 11553 mem := v.Args[2] 11554 if !(SizeAndAlign(s).Size() == 3) { 11555 break 11556 } 11557 v.reset(Op386MOVBstore) 11558 v.AuxInt = 2 11559 v.AddArg(dst) 11560 v0 := b.NewValue0(v.Pos, Op386MOVBload, config.fe.TypeUInt8()) 11561 v0.AuxInt = 2 11562 v0.AddArg(src) 11563 v0.AddArg(mem) 11564 v.AddArg(v0) 11565 v1 := b.NewValue0(v.Pos, Op386MOVWstore, TypeMem) 11566 v1.AddArg(dst) 11567 v2 := b.NewValue0(v.Pos, Op386MOVWload, config.fe.TypeUInt16()) 11568 v2.AddArg(src) 11569 v2.AddArg(mem) 11570 v1.AddArg(v2) 11571 v1.AddArg(mem) 11572 v.AddArg(v1) 11573 return true 11574 } 11575 // match: (Move [s] dst src mem) 11576 // cond: SizeAndAlign(s).Size() == 5 11577 // result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 11578 for { 11579 s := v.AuxInt 11580 dst := v.Args[0] 11581 src := v.Args[1] 11582 mem := v.Args[2] 11583 if !(SizeAndAlign(s).Size() == 5) { 11584 break 11585 } 11586 v.reset(Op386MOVBstore) 11587 v.AuxInt = 4 11588 v.AddArg(dst) 11589 v0 := b.NewValue0(v.Pos, Op386MOVBload, config.fe.TypeUInt8()) 11590 v0.AuxInt = 4 11591 v0.AddArg(src) 11592 v0.AddArg(mem) 11593 v.AddArg(v0) 11594 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 11595 v1.AddArg(dst) 11596 v2 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11597 v2.AddArg(src) 11598 v2.AddArg(mem) 11599 v1.AddArg(v2) 11600 v1.AddArg(mem) 11601 v.AddArg(v1) 11602 return true 11603 } 11604 // match: (Move [s] dst src mem) 11605 // cond: SizeAndAlign(s).Size() == 6 11606 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 11607 for { 11608 s := v.AuxInt 11609 dst := v.Args[0] 11610 src := v.Args[1] 11611 mem := v.Args[2] 11612 if !(SizeAndAlign(s).Size() == 6) { 11613 break 11614 } 11615 v.reset(Op386MOVWstore) 11616 v.AuxInt = 4 11617 v.AddArg(dst) 11618 v0 := b.NewValue0(v.Pos, Op386MOVWload, config.fe.TypeUInt16()) 11619 v0.AuxInt = 4 11620 v0.AddArg(src) 11621 v0.AddArg(mem) 11622 v.AddArg(v0) 11623 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 11624 v1.AddArg(dst) 11625 v2 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11626 v2.AddArg(src) 11627 v2.AddArg(mem) 11628 v1.AddArg(v2) 11629 v1.AddArg(mem) 11630 v.AddArg(v1) 11631 return true 11632 } 11633 // match: (Move [s] dst src mem) 11634 // cond: SizeAndAlign(s).Size() == 7 11635 // result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem)) 11636 for { 11637 s := v.AuxInt 11638 dst := v.Args[0] 11639 src := v.Args[1] 11640 mem := v.Args[2] 11641 if !(SizeAndAlign(s).Size() == 7) { 11642 break 11643 } 11644 v.reset(Op386MOVLstore) 11645 v.AuxInt = 3 11646 v.AddArg(dst) 11647 v0 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11648 v0.AuxInt = 3 11649 v0.AddArg(src) 11650 v0.AddArg(mem) 11651 v.AddArg(v0) 11652 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 11653 v1.AddArg(dst) 11654 v2 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11655 v2.AddArg(src) 11656 v2.AddArg(mem) 11657 v1.AddArg(v2) 11658 v1.AddArg(mem) 11659 v.AddArg(v1) 11660 return true 11661 } 11662 // match: (Move [s] dst src mem) 11663 // cond: SizeAndAlign(s).Size() == 8 11664 // result: (MOVLstore [4] dst (MOVLload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 11665 for { 11666 s := v.AuxInt 11667 dst := v.Args[0] 11668 src := v.Args[1] 11669 mem := v.Args[2] 11670 if !(SizeAndAlign(s).Size() == 8) { 11671 break 11672 } 11673 v.reset(Op386MOVLstore) 11674 v.AuxInt = 4 11675 v.AddArg(dst) 11676 v0 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11677 v0.AuxInt = 4 11678 v0.AddArg(src) 11679 v0.AddArg(mem) 11680 v.AddArg(v0) 11681 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 11682 v1.AddArg(dst) 11683 v2 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11684 v2.AddArg(src) 11685 v2.AddArg(mem) 11686 v1.AddArg(v2) 11687 v1.AddArg(mem) 11688 v.AddArg(v1) 11689 return true 11690 } 11691 // match: (Move [s] dst src mem) 11692 // cond: SizeAndAlign(s).Size() > 8 && SizeAndAlign(s).Size()%4 != 0 11693 // result: (Move [SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%4] (ADDLconst <dst.Type> dst [SizeAndAlign(s).Size()%4]) (ADDLconst <src.Type> src [SizeAndAlign(s).Size()%4]) (MOVLstore dst (MOVLload src mem) mem)) 11694 for { 11695 s := v.AuxInt 11696 dst := v.Args[0] 11697 src := v.Args[1] 11698 mem := v.Args[2] 11699 if !(SizeAndAlign(s).Size() > 8 && SizeAndAlign(s).Size()%4 != 0) { 11700 break 11701 } 11702 v.reset(OpMove) 11703 v.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%4 11704 v0 := b.NewValue0(v.Pos, Op386ADDLconst, dst.Type) 11705 v0.AuxInt = SizeAndAlign(s).Size() % 4 11706 v0.AddArg(dst) 11707 v.AddArg(v0) 11708 v1 := b.NewValue0(v.Pos, Op386ADDLconst, src.Type) 11709 v1.AuxInt = SizeAndAlign(s).Size() % 4 11710 v1.AddArg(src) 11711 v.AddArg(v1) 11712 v2 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 11713 v2.AddArg(dst) 11714 v3 := b.NewValue0(v.Pos, Op386MOVLload, config.fe.TypeUInt32()) 11715 v3.AddArg(src) 11716 v3.AddArg(mem) 11717 v2.AddArg(v3) 11718 v2.AddArg(mem) 11719 v.AddArg(v2) 11720 return true 11721 } 11722 // match: (Move [s] dst src mem) 11723 // cond: SizeAndAlign(s).Size() > 8 && SizeAndAlign(s).Size() <= 4*128 && SizeAndAlign(s).Size()%4 == 0 && !config.noDuffDevice 11724 // result: (DUFFCOPY [10*(128-SizeAndAlign(s).Size()/4)] dst src mem) 11725 for { 11726 s := v.AuxInt 11727 dst := v.Args[0] 11728 src := v.Args[1] 11729 mem := v.Args[2] 11730 if !(SizeAndAlign(s).Size() > 8 && SizeAndAlign(s).Size() <= 4*128 && SizeAndAlign(s).Size()%4 == 0 && !config.noDuffDevice) { 11731 break 11732 } 11733 v.reset(Op386DUFFCOPY) 11734 v.AuxInt = 10 * (128 - SizeAndAlign(s).Size()/4) 11735 v.AddArg(dst) 11736 v.AddArg(src) 11737 v.AddArg(mem) 11738 return true 11739 } 11740 // match: (Move [s] dst src mem) 11741 // cond: (SizeAndAlign(s).Size() > 4*128 || config.noDuffDevice) && SizeAndAlign(s).Size()%4 == 0 11742 // result: (REPMOVSL dst src (MOVLconst [SizeAndAlign(s).Size()/4]) mem) 11743 for { 11744 s := v.AuxInt 11745 dst := v.Args[0] 11746 src := v.Args[1] 11747 mem := v.Args[2] 11748 if !((SizeAndAlign(s).Size() > 4*128 || config.noDuffDevice) && SizeAndAlign(s).Size()%4 == 0) { 11749 break 11750 } 11751 v.reset(Op386REPMOVSL) 11752 v.AddArg(dst) 11753 v.AddArg(src) 11754 v0 := b.NewValue0(v.Pos, Op386MOVLconst, config.fe.TypeUInt32()) 11755 v0.AuxInt = SizeAndAlign(s).Size() / 4 11756 v.AddArg(v0) 11757 v.AddArg(mem) 11758 return true 11759 } 11760 return false 11761 } 11762 func rewriteValue386_OpMul16(v *Value, config *Config) bool { 11763 b := v.Block 11764 _ = b 11765 // match: (Mul16 x y) 11766 // cond: 11767 // result: (MULL x y) 11768 for { 11769 x := v.Args[0] 11770 y := v.Args[1] 11771 v.reset(Op386MULL) 11772 v.AddArg(x) 11773 v.AddArg(y) 11774 return true 11775 } 11776 } 11777 func rewriteValue386_OpMul32(v *Value, config *Config) bool { 11778 b := v.Block 11779 _ = b 11780 // match: (Mul32 x y) 11781 // cond: 11782 // result: (MULL x y) 11783 for { 11784 x := v.Args[0] 11785 y := v.Args[1] 11786 v.reset(Op386MULL) 11787 v.AddArg(x) 11788 v.AddArg(y) 11789 return true 11790 } 11791 } 11792 func rewriteValue386_OpMul32F(v *Value, config *Config) bool { 11793 b := v.Block 11794 _ = b 11795 // match: (Mul32F x y) 11796 // cond: 11797 // result: (MULSS x y) 11798 for { 11799 x := v.Args[0] 11800 y := v.Args[1] 11801 v.reset(Op386MULSS) 11802 v.AddArg(x) 11803 v.AddArg(y) 11804 return true 11805 } 11806 } 11807 func rewriteValue386_OpMul32uhilo(v *Value, config *Config) bool { 11808 b := v.Block 11809 _ = b 11810 // match: (Mul32uhilo x y) 11811 // cond: 11812 // result: (MULLQU x y) 11813 for { 11814 x := v.Args[0] 11815 y := v.Args[1] 11816 v.reset(Op386MULLQU) 11817 v.AddArg(x) 11818 v.AddArg(y) 11819 return true 11820 } 11821 } 11822 func rewriteValue386_OpMul64F(v *Value, config *Config) bool { 11823 b := v.Block 11824 _ = b 11825 // match: (Mul64F x y) 11826 // cond: 11827 // result: (MULSD x y) 11828 for { 11829 x := v.Args[0] 11830 y := v.Args[1] 11831 v.reset(Op386MULSD) 11832 v.AddArg(x) 11833 v.AddArg(y) 11834 return true 11835 } 11836 } 11837 func rewriteValue386_OpMul8(v *Value, config *Config) bool { 11838 b := v.Block 11839 _ = b 11840 // match: (Mul8 x y) 11841 // cond: 11842 // result: (MULL x y) 11843 for { 11844 x := v.Args[0] 11845 y := v.Args[1] 11846 v.reset(Op386MULL) 11847 v.AddArg(x) 11848 v.AddArg(y) 11849 return true 11850 } 11851 } 11852 func rewriteValue386_OpNeg16(v *Value, config *Config) bool { 11853 b := v.Block 11854 _ = b 11855 // match: (Neg16 x) 11856 // cond: 11857 // result: (NEGL x) 11858 for { 11859 x := v.Args[0] 11860 v.reset(Op386NEGL) 11861 v.AddArg(x) 11862 return true 11863 } 11864 } 11865 func rewriteValue386_OpNeg32(v *Value, config *Config) bool { 11866 b := v.Block 11867 _ = b 11868 // match: (Neg32 x) 11869 // cond: 11870 // result: (NEGL x) 11871 for { 11872 x := v.Args[0] 11873 v.reset(Op386NEGL) 11874 v.AddArg(x) 11875 return true 11876 } 11877 } 11878 func rewriteValue386_OpNeg32F(v *Value, config *Config) bool { 11879 b := v.Block 11880 _ = b 11881 // match: (Neg32F x) 11882 // cond: !config.use387 11883 // result: (PXOR x (MOVSSconst <config.Frontend().TypeFloat32()> [f2i(math.Copysign(0, -1))])) 11884 for { 11885 x := v.Args[0] 11886 if !(!config.use387) { 11887 break 11888 } 11889 v.reset(Op386PXOR) 11890 v.AddArg(x) 11891 v0 := b.NewValue0(v.Pos, Op386MOVSSconst, config.Frontend().TypeFloat32()) 11892 v0.AuxInt = f2i(math.Copysign(0, -1)) 11893 v.AddArg(v0) 11894 return true 11895 } 11896 // match: (Neg32F x) 11897 // cond: config.use387 11898 // result: (FCHS x) 11899 for { 11900 x := v.Args[0] 11901 if !(config.use387) { 11902 break 11903 } 11904 v.reset(Op386FCHS) 11905 v.AddArg(x) 11906 return true 11907 } 11908 return false 11909 } 11910 func rewriteValue386_OpNeg64F(v *Value, config *Config) bool { 11911 b := v.Block 11912 _ = b 11913 // match: (Neg64F x) 11914 // cond: !config.use387 11915 // result: (PXOR x (MOVSDconst <config.Frontend().TypeFloat64()> [f2i(math.Copysign(0, -1))])) 11916 for { 11917 x := v.Args[0] 11918 if !(!config.use387) { 11919 break 11920 } 11921 v.reset(Op386PXOR) 11922 v.AddArg(x) 11923 v0 := b.NewValue0(v.Pos, Op386MOVSDconst, config.Frontend().TypeFloat64()) 11924 v0.AuxInt = f2i(math.Copysign(0, -1)) 11925 v.AddArg(v0) 11926 return true 11927 } 11928 // match: (Neg64F x) 11929 // cond: config.use387 11930 // result: (FCHS x) 11931 for { 11932 x := v.Args[0] 11933 if !(config.use387) { 11934 break 11935 } 11936 v.reset(Op386FCHS) 11937 v.AddArg(x) 11938 return true 11939 } 11940 return false 11941 } 11942 func rewriteValue386_OpNeg8(v *Value, config *Config) bool { 11943 b := v.Block 11944 _ = b 11945 // match: (Neg8 x) 11946 // cond: 11947 // result: (NEGL x) 11948 for { 11949 x := v.Args[0] 11950 v.reset(Op386NEGL) 11951 v.AddArg(x) 11952 return true 11953 } 11954 } 11955 func rewriteValue386_OpNeq16(v *Value, config *Config) bool { 11956 b := v.Block 11957 _ = b 11958 // match: (Neq16 x y) 11959 // cond: 11960 // result: (SETNE (CMPW x y)) 11961 for { 11962 x := v.Args[0] 11963 y := v.Args[1] 11964 v.reset(Op386SETNE) 11965 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 11966 v0.AddArg(x) 11967 v0.AddArg(y) 11968 v.AddArg(v0) 11969 return true 11970 } 11971 } 11972 func rewriteValue386_OpNeq32(v *Value, config *Config) bool { 11973 b := v.Block 11974 _ = b 11975 // match: (Neq32 x y) 11976 // cond: 11977 // result: (SETNE (CMPL x y)) 11978 for { 11979 x := v.Args[0] 11980 y := v.Args[1] 11981 v.reset(Op386SETNE) 11982 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 11983 v0.AddArg(x) 11984 v0.AddArg(y) 11985 v.AddArg(v0) 11986 return true 11987 } 11988 } 11989 func rewriteValue386_OpNeq32F(v *Value, config *Config) bool { 11990 b := v.Block 11991 _ = b 11992 // match: (Neq32F x y) 11993 // cond: 11994 // result: (SETNEF (UCOMISS x y)) 11995 for { 11996 x := v.Args[0] 11997 y := v.Args[1] 11998 v.reset(Op386SETNEF) 11999 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 12000 v0.AddArg(x) 12001 v0.AddArg(y) 12002 v.AddArg(v0) 12003 return true 12004 } 12005 } 12006 func rewriteValue386_OpNeq64F(v *Value, config *Config) bool { 12007 b := v.Block 12008 _ = b 12009 // match: (Neq64F x y) 12010 // cond: 12011 // result: (SETNEF (UCOMISD x y)) 12012 for { 12013 x := v.Args[0] 12014 y := v.Args[1] 12015 v.reset(Op386SETNEF) 12016 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 12017 v0.AddArg(x) 12018 v0.AddArg(y) 12019 v.AddArg(v0) 12020 return true 12021 } 12022 } 12023 func rewriteValue386_OpNeq8(v *Value, config *Config) bool { 12024 b := v.Block 12025 _ = b 12026 // match: (Neq8 x y) 12027 // cond: 12028 // result: (SETNE (CMPB x y)) 12029 for { 12030 x := v.Args[0] 12031 y := v.Args[1] 12032 v.reset(Op386SETNE) 12033 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 12034 v0.AddArg(x) 12035 v0.AddArg(y) 12036 v.AddArg(v0) 12037 return true 12038 } 12039 } 12040 func rewriteValue386_OpNeqB(v *Value, config *Config) bool { 12041 b := v.Block 12042 _ = b 12043 // match: (NeqB x y) 12044 // cond: 12045 // result: (SETNE (CMPB x y)) 12046 for { 12047 x := v.Args[0] 12048 y := v.Args[1] 12049 v.reset(Op386SETNE) 12050 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 12051 v0.AddArg(x) 12052 v0.AddArg(y) 12053 v.AddArg(v0) 12054 return true 12055 } 12056 } 12057 func rewriteValue386_OpNeqPtr(v *Value, config *Config) bool { 12058 b := v.Block 12059 _ = b 12060 // match: (NeqPtr x y) 12061 // cond: 12062 // result: (SETNE (CMPL x y)) 12063 for { 12064 x := v.Args[0] 12065 y := v.Args[1] 12066 v.reset(Op386SETNE) 12067 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 12068 v0.AddArg(x) 12069 v0.AddArg(y) 12070 v.AddArg(v0) 12071 return true 12072 } 12073 } 12074 func rewriteValue386_OpNilCheck(v *Value, config *Config) bool { 12075 b := v.Block 12076 _ = b 12077 // match: (NilCheck ptr mem) 12078 // cond: 12079 // result: (LoweredNilCheck ptr mem) 12080 for { 12081 ptr := v.Args[0] 12082 mem := v.Args[1] 12083 v.reset(Op386LoweredNilCheck) 12084 v.AddArg(ptr) 12085 v.AddArg(mem) 12086 return true 12087 } 12088 } 12089 func rewriteValue386_OpNot(v *Value, config *Config) bool { 12090 b := v.Block 12091 _ = b 12092 // match: (Not x) 12093 // cond: 12094 // result: (XORLconst [1] x) 12095 for { 12096 x := v.Args[0] 12097 v.reset(Op386XORLconst) 12098 v.AuxInt = 1 12099 v.AddArg(x) 12100 return true 12101 } 12102 } 12103 func rewriteValue386_OpOffPtr(v *Value, config *Config) bool { 12104 b := v.Block 12105 _ = b 12106 // match: (OffPtr [off] ptr) 12107 // cond: 12108 // result: (ADDLconst [off] ptr) 12109 for { 12110 off := v.AuxInt 12111 ptr := v.Args[0] 12112 v.reset(Op386ADDLconst) 12113 v.AuxInt = off 12114 v.AddArg(ptr) 12115 return true 12116 } 12117 } 12118 func rewriteValue386_OpOr16(v *Value, config *Config) bool { 12119 b := v.Block 12120 _ = b 12121 // match: (Or16 x y) 12122 // cond: 12123 // result: (ORL x y) 12124 for { 12125 x := v.Args[0] 12126 y := v.Args[1] 12127 v.reset(Op386ORL) 12128 v.AddArg(x) 12129 v.AddArg(y) 12130 return true 12131 } 12132 } 12133 func rewriteValue386_OpOr32(v *Value, config *Config) bool { 12134 b := v.Block 12135 _ = b 12136 // match: (Or32 x y) 12137 // cond: 12138 // result: (ORL x y) 12139 for { 12140 x := v.Args[0] 12141 y := v.Args[1] 12142 v.reset(Op386ORL) 12143 v.AddArg(x) 12144 v.AddArg(y) 12145 return true 12146 } 12147 } 12148 func rewriteValue386_OpOr8(v *Value, config *Config) bool { 12149 b := v.Block 12150 _ = b 12151 // match: (Or8 x y) 12152 // cond: 12153 // result: (ORL x y) 12154 for { 12155 x := v.Args[0] 12156 y := v.Args[1] 12157 v.reset(Op386ORL) 12158 v.AddArg(x) 12159 v.AddArg(y) 12160 return true 12161 } 12162 } 12163 func rewriteValue386_OpOrB(v *Value, config *Config) bool { 12164 b := v.Block 12165 _ = b 12166 // match: (OrB x y) 12167 // cond: 12168 // result: (ORL x y) 12169 for { 12170 x := v.Args[0] 12171 y := v.Args[1] 12172 v.reset(Op386ORL) 12173 v.AddArg(x) 12174 v.AddArg(y) 12175 return true 12176 } 12177 } 12178 func rewriteValue386_OpRsh16Ux16(v *Value, config *Config) bool { 12179 b := v.Block 12180 _ = b 12181 // match: (Rsh16Ux16 <t> x y) 12182 // cond: 12183 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16]))) 12184 for { 12185 t := v.Type 12186 x := v.Args[0] 12187 y := v.Args[1] 12188 v.reset(Op386ANDL) 12189 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 12190 v0.AddArg(x) 12191 v0.AddArg(y) 12192 v.AddArg(v0) 12193 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12194 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 12195 v2.AuxInt = 16 12196 v2.AddArg(y) 12197 v1.AddArg(v2) 12198 v.AddArg(v1) 12199 return true 12200 } 12201 } 12202 func rewriteValue386_OpRsh16Ux32(v *Value, config *Config) bool { 12203 b := v.Block 12204 _ = b 12205 // match: (Rsh16Ux32 <t> x y) 12206 // cond: 12207 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16]))) 12208 for { 12209 t := v.Type 12210 x := v.Args[0] 12211 y := v.Args[1] 12212 v.reset(Op386ANDL) 12213 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 12214 v0.AddArg(x) 12215 v0.AddArg(y) 12216 v.AddArg(v0) 12217 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12218 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 12219 v2.AuxInt = 16 12220 v2.AddArg(y) 12221 v1.AddArg(v2) 12222 v.AddArg(v1) 12223 return true 12224 } 12225 } 12226 func rewriteValue386_OpRsh16Ux64(v *Value, config *Config) bool { 12227 b := v.Block 12228 _ = b 12229 // match: (Rsh16Ux64 x (Const64 [c])) 12230 // cond: uint64(c) < 16 12231 // result: (SHRWconst x [c]) 12232 for { 12233 x := v.Args[0] 12234 v_1 := v.Args[1] 12235 if v_1.Op != OpConst64 { 12236 break 12237 } 12238 c := v_1.AuxInt 12239 if !(uint64(c) < 16) { 12240 break 12241 } 12242 v.reset(Op386SHRWconst) 12243 v.AuxInt = c 12244 v.AddArg(x) 12245 return true 12246 } 12247 // match: (Rsh16Ux64 _ (Const64 [c])) 12248 // cond: uint64(c) >= 16 12249 // result: (Const16 [0]) 12250 for { 12251 v_1 := v.Args[1] 12252 if v_1.Op != OpConst64 { 12253 break 12254 } 12255 c := v_1.AuxInt 12256 if !(uint64(c) >= 16) { 12257 break 12258 } 12259 v.reset(OpConst16) 12260 v.AuxInt = 0 12261 return true 12262 } 12263 return false 12264 } 12265 func rewriteValue386_OpRsh16Ux8(v *Value, config *Config) bool { 12266 b := v.Block 12267 _ = b 12268 // match: (Rsh16Ux8 <t> x y) 12269 // cond: 12270 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16]))) 12271 for { 12272 t := v.Type 12273 x := v.Args[0] 12274 y := v.Args[1] 12275 v.reset(Op386ANDL) 12276 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 12277 v0.AddArg(x) 12278 v0.AddArg(y) 12279 v.AddArg(v0) 12280 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12281 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 12282 v2.AuxInt = 16 12283 v2.AddArg(y) 12284 v1.AddArg(v2) 12285 v.AddArg(v1) 12286 return true 12287 } 12288 } 12289 func rewriteValue386_OpRsh16x16(v *Value, config *Config) bool { 12290 b := v.Block 12291 _ = b 12292 // match: (Rsh16x16 <t> x y) 12293 // cond: 12294 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16]))))) 12295 for { 12296 t := v.Type 12297 x := v.Args[0] 12298 y := v.Args[1] 12299 v.reset(Op386SARW) 12300 v.Type = t 12301 v.AddArg(x) 12302 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12303 v0.AddArg(y) 12304 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12305 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12306 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 12307 v3.AuxInt = 16 12308 v3.AddArg(y) 12309 v2.AddArg(v3) 12310 v1.AddArg(v2) 12311 v0.AddArg(v1) 12312 v.AddArg(v0) 12313 return true 12314 } 12315 } 12316 func rewriteValue386_OpRsh16x32(v *Value, config *Config) bool { 12317 b := v.Block 12318 _ = b 12319 // match: (Rsh16x32 <t> x y) 12320 // cond: 12321 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16]))))) 12322 for { 12323 t := v.Type 12324 x := v.Args[0] 12325 y := v.Args[1] 12326 v.reset(Op386SARW) 12327 v.Type = t 12328 v.AddArg(x) 12329 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12330 v0.AddArg(y) 12331 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12332 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12333 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 12334 v3.AuxInt = 16 12335 v3.AddArg(y) 12336 v2.AddArg(v3) 12337 v1.AddArg(v2) 12338 v0.AddArg(v1) 12339 v.AddArg(v0) 12340 return true 12341 } 12342 } 12343 func rewriteValue386_OpRsh16x64(v *Value, config *Config) bool { 12344 b := v.Block 12345 _ = b 12346 // match: (Rsh16x64 x (Const64 [c])) 12347 // cond: uint64(c) < 16 12348 // result: (SARWconst x [c]) 12349 for { 12350 x := v.Args[0] 12351 v_1 := v.Args[1] 12352 if v_1.Op != OpConst64 { 12353 break 12354 } 12355 c := v_1.AuxInt 12356 if !(uint64(c) < 16) { 12357 break 12358 } 12359 v.reset(Op386SARWconst) 12360 v.AuxInt = c 12361 v.AddArg(x) 12362 return true 12363 } 12364 // match: (Rsh16x64 x (Const64 [c])) 12365 // cond: uint64(c) >= 16 12366 // result: (SARWconst x [15]) 12367 for { 12368 x := v.Args[0] 12369 v_1 := v.Args[1] 12370 if v_1.Op != OpConst64 { 12371 break 12372 } 12373 c := v_1.AuxInt 12374 if !(uint64(c) >= 16) { 12375 break 12376 } 12377 v.reset(Op386SARWconst) 12378 v.AuxInt = 15 12379 v.AddArg(x) 12380 return true 12381 } 12382 return false 12383 } 12384 func rewriteValue386_OpRsh16x8(v *Value, config *Config) bool { 12385 b := v.Block 12386 _ = b 12387 // match: (Rsh16x8 <t> x y) 12388 // cond: 12389 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16]))))) 12390 for { 12391 t := v.Type 12392 x := v.Args[0] 12393 y := v.Args[1] 12394 v.reset(Op386SARW) 12395 v.Type = t 12396 v.AddArg(x) 12397 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12398 v0.AddArg(y) 12399 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12400 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12401 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 12402 v3.AuxInt = 16 12403 v3.AddArg(y) 12404 v2.AddArg(v3) 12405 v1.AddArg(v2) 12406 v0.AddArg(v1) 12407 v.AddArg(v0) 12408 return true 12409 } 12410 } 12411 func rewriteValue386_OpRsh32Ux16(v *Value, config *Config) bool { 12412 b := v.Block 12413 _ = b 12414 // match: (Rsh32Ux16 <t> x y) 12415 // cond: 12416 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 12417 for { 12418 t := v.Type 12419 x := v.Args[0] 12420 y := v.Args[1] 12421 v.reset(Op386ANDL) 12422 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 12423 v0.AddArg(x) 12424 v0.AddArg(y) 12425 v.AddArg(v0) 12426 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12427 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 12428 v2.AuxInt = 32 12429 v2.AddArg(y) 12430 v1.AddArg(v2) 12431 v.AddArg(v1) 12432 return true 12433 } 12434 } 12435 func rewriteValue386_OpRsh32Ux32(v *Value, config *Config) bool { 12436 b := v.Block 12437 _ = b 12438 // match: (Rsh32Ux32 <t> x y) 12439 // cond: 12440 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 12441 for { 12442 t := v.Type 12443 x := v.Args[0] 12444 y := v.Args[1] 12445 v.reset(Op386ANDL) 12446 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 12447 v0.AddArg(x) 12448 v0.AddArg(y) 12449 v.AddArg(v0) 12450 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12451 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 12452 v2.AuxInt = 32 12453 v2.AddArg(y) 12454 v1.AddArg(v2) 12455 v.AddArg(v1) 12456 return true 12457 } 12458 } 12459 func rewriteValue386_OpRsh32Ux64(v *Value, config *Config) bool { 12460 b := v.Block 12461 _ = b 12462 // match: (Rsh32Ux64 x (Const64 [c])) 12463 // cond: uint64(c) < 32 12464 // result: (SHRLconst x [c]) 12465 for { 12466 x := v.Args[0] 12467 v_1 := v.Args[1] 12468 if v_1.Op != OpConst64 { 12469 break 12470 } 12471 c := v_1.AuxInt 12472 if !(uint64(c) < 32) { 12473 break 12474 } 12475 v.reset(Op386SHRLconst) 12476 v.AuxInt = c 12477 v.AddArg(x) 12478 return true 12479 } 12480 // match: (Rsh32Ux64 _ (Const64 [c])) 12481 // cond: uint64(c) >= 32 12482 // result: (Const32 [0]) 12483 for { 12484 v_1 := v.Args[1] 12485 if v_1.Op != OpConst64 { 12486 break 12487 } 12488 c := v_1.AuxInt 12489 if !(uint64(c) >= 32) { 12490 break 12491 } 12492 v.reset(OpConst32) 12493 v.AuxInt = 0 12494 return true 12495 } 12496 return false 12497 } 12498 func rewriteValue386_OpRsh32Ux8(v *Value, config *Config) bool { 12499 b := v.Block 12500 _ = b 12501 // match: (Rsh32Ux8 <t> x y) 12502 // cond: 12503 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 12504 for { 12505 t := v.Type 12506 x := v.Args[0] 12507 y := v.Args[1] 12508 v.reset(Op386ANDL) 12509 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 12510 v0.AddArg(x) 12511 v0.AddArg(y) 12512 v.AddArg(v0) 12513 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12514 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 12515 v2.AuxInt = 32 12516 v2.AddArg(y) 12517 v1.AddArg(v2) 12518 v.AddArg(v1) 12519 return true 12520 } 12521 } 12522 func rewriteValue386_OpRsh32x16(v *Value, config *Config) bool { 12523 b := v.Block 12524 _ = b 12525 // match: (Rsh32x16 <t> x y) 12526 // cond: 12527 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32]))))) 12528 for { 12529 t := v.Type 12530 x := v.Args[0] 12531 y := v.Args[1] 12532 v.reset(Op386SARL) 12533 v.Type = t 12534 v.AddArg(x) 12535 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12536 v0.AddArg(y) 12537 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12538 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12539 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 12540 v3.AuxInt = 32 12541 v3.AddArg(y) 12542 v2.AddArg(v3) 12543 v1.AddArg(v2) 12544 v0.AddArg(v1) 12545 v.AddArg(v0) 12546 return true 12547 } 12548 } 12549 func rewriteValue386_OpRsh32x32(v *Value, config *Config) bool { 12550 b := v.Block 12551 _ = b 12552 // match: (Rsh32x32 <t> x y) 12553 // cond: 12554 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32]))))) 12555 for { 12556 t := v.Type 12557 x := v.Args[0] 12558 y := v.Args[1] 12559 v.reset(Op386SARL) 12560 v.Type = t 12561 v.AddArg(x) 12562 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12563 v0.AddArg(y) 12564 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12565 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12566 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 12567 v3.AuxInt = 32 12568 v3.AddArg(y) 12569 v2.AddArg(v3) 12570 v1.AddArg(v2) 12571 v0.AddArg(v1) 12572 v.AddArg(v0) 12573 return true 12574 } 12575 } 12576 func rewriteValue386_OpRsh32x64(v *Value, config *Config) bool { 12577 b := v.Block 12578 _ = b 12579 // match: (Rsh32x64 x (Const64 [c])) 12580 // cond: uint64(c) < 32 12581 // result: (SARLconst x [c]) 12582 for { 12583 x := v.Args[0] 12584 v_1 := v.Args[1] 12585 if v_1.Op != OpConst64 { 12586 break 12587 } 12588 c := v_1.AuxInt 12589 if !(uint64(c) < 32) { 12590 break 12591 } 12592 v.reset(Op386SARLconst) 12593 v.AuxInt = c 12594 v.AddArg(x) 12595 return true 12596 } 12597 // match: (Rsh32x64 x (Const64 [c])) 12598 // cond: uint64(c) >= 32 12599 // result: (SARLconst x [31]) 12600 for { 12601 x := v.Args[0] 12602 v_1 := v.Args[1] 12603 if v_1.Op != OpConst64 { 12604 break 12605 } 12606 c := v_1.AuxInt 12607 if !(uint64(c) >= 32) { 12608 break 12609 } 12610 v.reset(Op386SARLconst) 12611 v.AuxInt = 31 12612 v.AddArg(x) 12613 return true 12614 } 12615 return false 12616 } 12617 func rewriteValue386_OpRsh32x8(v *Value, config *Config) bool { 12618 b := v.Block 12619 _ = b 12620 // match: (Rsh32x8 <t> x y) 12621 // cond: 12622 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32]))))) 12623 for { 12624 t := v.Type 12625 x := v.Args[0] 12626 y := v.Args[1] 12627 v.reset(Op386SARL) 12628 v.Type = t 12629 v.AddArg(x) 12630 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12631 v0.AddArg(y) 12632 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12633 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12634 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 12635 v3.AuxInt = 32 12636 v3.AddArg(y) 12637 v2.AddArg(v3) 12638 v1.AddArg(v2) 12639 v0.AddArg(v1) 12640 v.AddArg(v0) 12641 return true 12642 } 12643 } 12644 func rewriteValue386_OpRsh8Ux16(v *Value, config *Config) bool { 12645 b := v.Block 12646 _ = b 12647 // match: (Rsh8Ux16 <t> x y) 12648 // cond: 12649 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8]))) 12650 for { 12651 t := v.Type 12652 x := v.Args[0] 12653 y := v.Args[1] 12654 v.reset(Op386ANDL) 12655 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 12656 v0.AddArg(x) 12657 v0.AddArg(y) 12658 v.AddArg(v0) 12659 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12660 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 12661 v2.AuxInt = 8 12662 v2.AddArg(y) 12663 v1.AddArg(v2) 12664 v.AddArg(v1) 12665 return true 12666 } 12667 } 12668 func rewriteValue386_OpRsh8Ux32(v *Value, config *Config) bool { 12669 b := v.Block 12670 _ = b 12671 // match: (Rsh8Ux32 <t> x y) 12672 // cond: 12673 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8]))) 12674 for { 12675 t := v.Type 12676 x := v.Args[0] 12677 y := v.Args[1] 12678 v.reset(Op386ANDL) 12679 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 12680 v0.AddArg(x) 12681 v0.AddArg(y) 12682 v.AddArg(v0) 12683 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12684 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 12685 v2.AuxInt = 8 12686 v2.AddArg(y) 12687 v1.AddArg(v2) 12688 v.AddArg(v1) 12689 return true 12690 } 12691 } 12692 func rewriteValue386_OpRsh8Ux64(v *Value, config *Config) bool { 12693 b := v.Block 12694 _ = b 12695 // match: (Rsh8Ux64 x (Const64 [c])) 12696 // cond: uint64(c) < 8 12697 // result: (SHRBconst x [c]) 12698 for { 12699 x := v.Args[0] 12700 v_1 := v.Args[1] 12701 if v_1.Op != OpConst64 { 12702 break 12703 } 12704 c := v_1.AuxInt 12705 if !(uint64(c) < 8) { 12706 break 12707 } 12708 v.reset(Op386SHRBconst) 12709 v.AuxInt = c 12710 v.AddArg(x) 12711 return true 12712 } 12713 // match: (Rsh8Ux64 _ (Const64 [c])) 12714 // cond: uint64(c) >= 8 12715 // result: (Const8 [0]) 12716 for { 12717 v_1 := v.Args[1] 12718 if v_1.Op != OpConst64 { 12719 break 12720 } 12721 c := v_1.AuxInt 12722 if !(uint64(c) >= 8) { 12723 break 12724 } 12725 v.reset(OpConst8) 12726 v.AuxInt = 0 12727 return true 12728 } 12729 return false 12730 } 12731 func rewriteValue386_OpRsh8Ux8(v *Value, config *Config) bool { 12732 b := v.Block 12733 _ = b 12734 // match: (Rsh8Ux8 <t> x y) 12735 // cond: 12736 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8]))) 12737 for { 12738 t := v.Type 12739 x := v.Args[0] 12740 y := v.Args[1] 12741 v.reset(Op386ANDL) 12742 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 12743 v0.AddArg(x) 12744 v0.AddArg(y) 12745 v.AddArg(v0) 12746 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 12747 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 12748 v2.AuxInt = 8 12749 v2.AddArg(y) 12750 v1.AddArg(v2) 12751 v.AddArg(v1) 12752 return true 12753 } 12754 } 12755 func rewriteValue386_OpRsh8x16(v *Value, config *Config) bool { 12756 b := v.Block 12757 _ = b 12758 // match: (Rsh8x16 <t> x y) 12759 // cond: 12760 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8]))))) 12761 for { 12762 t := v.Type 12763 x := v.Args[0] 12764 y := v.Args[1] 12765 v.reset(Op386SARB) 12766 v.Type = t 12767 v.AddArg(x) 12768 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12769 v0.AddArg(y) 12770 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12771 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12772 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 12773 v3.AuxInt = 8 12774 v3.AddArg(y) 12775 v2.AddArg(v3) 12776 v1.AddArg(v2) 12777 v0.AddArg(v1) 12778 v.AddArg(v0) 12779 return true 12780 } 12781 } 12782 func rewriteValue386_OpRsh8x32(v *Value, config *Config) bool { 12783 b := v.Block 12784 _ = b 12785 // match: (Rsh8x32 <t> x y) 12786 // cond: 12787 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8]))))) 12788 for { 12789 t := v.Type 12790 x := v.Args[0] 12791 y := v.Args[1] 12792 v.reset(Op386SARB) 12793 v.Type = t 12794 v.AddArg(x) 12795 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12796 v0.AddArg(y) 12797 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12798 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12799 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 12800 v3.AuxInt = 8 12801 v3.AddArg(y) 12802 v2.AddArg(v3) 12803 v1.AddArg(v2) 12804 v0.AddArg(v1) 12805 v.AddArg(v0) 12806 return true 12807 } 12808 } 12809 func rewriteValue386_OpRsh8x64(v *Value, config *Config) bool { 12810 b := v.Block 12811 _ = b 12812 // match: (Rsh8x64 x (Const64 [c])) 12813 // cond: uint64(c) < 8 12814 // result: (SARBconst x [c]) 12815 for { 12816 x := v.Args[0] 12817 v_1 := v.Args[1] 12818 if v_1.Op != OpConst64 { 12819 break 12820 } 12821 c := v_1.AuxInt 12822 if !(uint64(c) < 8) { 12823 break 12824 } 12825 v.reset(Op386SARBconst) 12826 v.AuxInt = c 12827 v.AddArg(x) 12828 return true 12829 } 12830 // match: (Rsh8x64 x (Const64 [c])) 12831 // cond: uint64(c) >= 8 12832 // result: (SARBconst x [7]) 12833 for { 12834 x := v.Args[0] 12835 v_1 := v.Args[1] 12836 if v_1.Op != OpConst64 { 12837 break 12838 } 12839 c := v_1.AuxInt 12840 if !(uint64(c) >= 8) { 12841 break 12842 } 12843 v.reset(Op386SARBconst) 12844 v.AuxInt = 7 12845 v.AddArg(x) 12846 return true 12847 } 12848 return false 12849 } 12850 func rewriteValue386_OpRsh8x8(v *Value, config *Config) bool { 12851 b := v.Block 12852 _ = b 12853 // match: (Rsh8x8 <t> x y) 12854 // cond: 12855 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8]))))) 12856 for { 12857 t := v.Type 12858 x := v.Args[0] 12859 y := v.Args[1] 12860 v.reset(Op386SARB) 12861 v.Type = t 12862 v.AddArg(x) 12863 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 12864 v0.AddArg(y) 12865 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 12866 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 12867 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 12868 v3.AuxInt = 8 12869 v3.AddArg(y) 12870 v2.AddArg(v3) 12871 v1.AddArg(v2) 12872 v0.AddArg(v1) 12873 v.AddArg(v0) 12874 return true 12875 } 12876 } 12877 func rewriteValue386_OpSignExt16to32(v *Value, config *Config) bool { 12878 b := v.Block 12879 _ = b 12880 // match: (SignExt16to32 x) 12881 // cond: 12882 // result: (MOVWLSX x) 12883 for { 12884 x := v.Args[0] 12885 v.reset(Op386MOVWLSX) 12886 v.AddArg(x) 12887 return true 12888 } 12889 } 12890 func rewriteValue386_OpSignExt8to16(v *Value, config *Config) bool { 12891 b := v.Block 12892 _ = b 12893 // match: (SignExt8to16 x) 12894 // cond: 12895 // result: (MOVBLSX x) 12896 for { 12897 x := v.Args[0] 12898 v.reset(Op386MOVBLSX) 12899 v.AddArg(x) 12900 return true 12901 } 12902 } 12903 func rewriteValue386_OpSignExt8to32(v *Value, config *Config) bool { 12904 b := v.Block 12905 _ = b 12906 // match: (SignExt8to32 x) 12907 // cond: 12908 // result: (MOVBLSX x) 12909 for { 12910 x := v.Args[0] 12911 v.reset(Op386MOVBLSX) 12912 v.AddArg(x) 12913 return true 12914 } 12915 } 12916 func rewriteValue386_OpSignmask(v *Value, config *Config) bool { 12917 b := v.Block 12918 _ = b 12919 // match: (Signmask x) 12920 // cond: 12921 // result: (SARLconst x [31]) 12922 for { 12923 x := v.Args[0] 12924 v.reset(Op386SARLconst) 12925 v.AuxInt = 31 12926 v.AddArg(x) 12927 return true 12928 } 12929 } 12930 func rewriteValue386_OpSlicemask(v *Value, config *Config) bool { 12931 b := v.Block 12932 _ = b 12933 // match: (Slicemask <t> x) 12934 // cond: 12935 // result: (SARLconst (NEGL <t> x) [31]) 12936 for { 12937 t := v.Type 12938 x := v.Args[0] 12939 v.reset(Op386SARLconst) 12940 v.AuxInt = 31 12941 v0 := b.NewValue0(v.Pos, Op386NEGL, t) 12942 v0.AddArg(x) 12943 v.AddArg(v0) 12944 return true 12945 } 12946 } 12947 func rewriteValue386_OpSqrt(v *Value, config *Config) bool { 12948 b := v.Block 12949 _ = b 12950 // match: (Sqrt x) 12951 // cond: 12952 // result: (SQRTSD x) 12953 for { 12954 x := v.Args[0] 12955 v.reset(Op386SQRTSD) 12956 v.AddArg(x) 12957 return true 12958 } 12959 } 12960 func rewriteValue386_OpStaticCall(v *Value, config *Config) bool { 12961 b := v.Block 12962 _ = b 12963 // match: (StaticCall [argwid] {target} mem) 12964 // cond: 12965 // result: (CALLstatic [argwid] {target} mem) 12966 for { 12967 argwid := v.AuxInt 12968 target := v.Aux 12969 mem := v.Args[0] 12970 v.reset(Op386CALLstatic) 12971 v.AuxInt = argwid 12972 v.Aux = target 12973 v.AddArg(mem) 12974 return true 12975 } 12976 } 12977 func rewriteValue386_OpStore(v *Value, config *Config) bool { 12978 b := v.Block 12979 _ = b 12980 // match: (Store [8] ptr val mem) 12981 // cond: is64BitFloat(val.Type) 12982 // result: (MOVSDstore ptr val mem) 12983 for { 12984 if v.AuxInt != 8 { 12985 break 12986 } 12987 ptr := v.Args[0] 12988 val := v.Args[1] 12989 mem := v.Args[2] 12990 if !(is64BitFloat(val.Type)) { 12991 break 12992 } 12993 v.reset(Op386MOVSDstore) 12994 v.AddArg(ptr) 12995 v.AddArg(val) 12996 v.AddArg(mem) 12997 return true 12998 } 12999 // match: (Store [4] ptr val mem) 13000 // cond: is32BitFloat(val.Type) 13001 // result: (MOVSSstore ptr val mem) 13002 for { 13003 if v.AuxInt != 4 { 13004 break 13005 } 13006 ptr := v.Args[0] 13007 val := v.Args[1] 13008 mem := v.Args[2] 13009 if !(is32BitFloat(val.Type)) { 13010 break 13011 } 13012 v.reset(Op386MOVSSstore) 13013 v.AddArg(ptr) 13014 v.AddArg(val) 13015 v.AddArg(mem) 13016 return true 13017 } 13018 // match: (Store [4] ptr val mem) 13019 // cond: 13020 // result: (MOVLstore ptr val mem) 13021 for { 13022 if v.AuxInt != 4 { 13023 break 13024 } 13025 ptr := v.Args[0] 13026 val := v.Args[1] 13027 mem := v.Args[2] 13028 v.reset(Op386MOVLstore) 13029 v.AddArg(ptr) 13030 v.AddArg(val) 13031 v.AddArg(mem) 13032 return true 13033 } 13034 // match: (Store [2] ptr val mem) 13035 // cond: 13036 // result: (MOVWstore ptr val mem) 13037 for { 13038 if v.AuxInt != 2 { 13039 break 13040 } 13041 ptr := v.Args[0] 13042 val := v.Args[1] 13043 mem := v.Args[2] 13044 v.reset(Op386MOVWstore) 13045 v.AddArg(ptr) 13046 v.AddArg(val) 13047 v.AddArg(mem) 13048 return true 13049 } 13050 // match: (Store [1] ptr val mem) 13051 // cond: 13052 // result: (MOVBstore ptr val mem) 13053 for { 13054 if v.AuxInt != 1 { 13055 break 13056 } 13057 ptr := v.Args[0] 13058 val := v.Args[1] 13059 mem := v.Args[2] 13060 v.reset(Op386MOVBstore) 13061 v.AddArg(ptr) 13062 v.AddArg(val) 13063 v.AddArg(mem) 13064 return true 13065 } 13066 return false 13067 } 13068 func rewriteValue386_OpSub16(v *Value, config *Config) bool { 13069 b := v.Block 13070 _ = b 13071 // match: (Sub16 x y) 13072 // cond: 13073 // result: (SUBL x y) 13074 for { 13075 x := v.Args[0] 13076 y := v.Args[1] 13077 v.reset(Op386SUBL) 13078 v.AddArg(x) 13079 v.AddArg(y) 13080 return true 13081 } 13082 } 13083 func rewriteValue386_OpSub32(v *Value, config *Config) bool { 13084 b := v.Block 13085 _ = b 13086 // match: (Sub32 x y) 13087 // cond: 13088 // result: (SUBL x y) 13089 for { 13090 x := v.Args[0] 13091 y := v.Args[1] 13092 v.reset(Op386SUBL) 13093 v.AddArg(x) 13094 v.AddArg(y) 13095 return true 13096 } 13097 } 13098 func rewriteValue386_OpSub32F(v *Value, config *Config) bool { 13099 b := v.Block 13100 _ = b 13101 // match: (Sub32F x y) 13102 // cond: 13103 // result: (SUBSS x y) 13104 for { 13105 x := v.Args[0] 13106 y := v.Args[1] 13107 v.reset(Op386SUBSS) 13108 v.AddArg(x) 13109 v.AddArg(y) 13110 return true 13111 } 13112 } 13113 func rewriteValue386_OpSub32carry(v *Value, config *Config) bool { 13114 b := v.Block 13115 _ = b 13116 // match: (Sub32carry x y) 13117 // cond: 13118 // result: (SUBLcarry x y) 13119 for { 13120 x := v.Args[0] 13121 y := v.Args[1] 13122 v.reset(Op386SUBLcarry) 13123 v.AddArg(x) 13124 v.AddArg(y) 13125 return true 13126 } 13127 } 13128 func rewriteValue386_OpSub32withcarry(v *Value, config *Config) bool { 13129 b := v.Block 13130 _ = b 13131 // match: (Sub32withcarry x y c) 13132 // cond: 13133 // result: (SBBL x y c) 13134 for { 13135 x := v.Args[0] 13136 y := v.Args[1] 13137 c := v.Args[2] 13138 v.reset(Op386SBBL) 13139 v.AddArg(x) 13140 v.AddArg(y) 13141 v.AddArg(c) 13142 return true 13143 } 13144 } 13145 func rewriteValue386_OpSub64F(v *Value, config *Config) bool { 13146 b := v.Block 13147 _ = b 13148 // match: (Sub64F x y) 13149 // cond: 13150 // result: (SUBSD x y) 13151 for { 13152 x := v.Args[0] 13153 y := v.Args[1] 13154 v.reset(Op386SUBSD) 13155 v.AddArg(x) 13156 v.AddArg(y) 13157 return true 13158 } 13159 } 13160 func rewriteValue386_OpSub8(v *Value, config *Config) bool { 13161 b := v.Block 13162 _ = b 13163 // match: (Sub8 x y) 13164 // cond: 13165 // result: (SUBL x y) 13166 for { 13167 x := v.Args[0] 13168 y := v.Args[1] 13169 v.reset(Op386SUBL) 13170 v.AddArg(x) 13171 v.AddArg(y) 13172 return true 13173 } 13174 } 13175 func rewriteValue386_OpSubPtr(v *Value, config *Config) bool { 13176 b := v.Block 13177 _ = b 13178 // match: (SubPtr x y) 13179 // cond: 13180 // result: (SUBL x y) 13181 for { 13182 x := v.Args[0] 13183 y := v.Args[1] 13184 v.reset(Op386SUBL) 13185 v.AddArg(x) 13186 v.AddArg(y) 13187 return true 13188 } 13189 } 13190 func rewriteValue386_OpTrunc16to8(v *Value, config *Config) bool { 13191 b := v.Block 13192 _ = b 13193 // match: (Trunc16to8 x) 13194 // cond: 13195 // result: x 13196 for { 13197 x := v.Args[0] 13198 v.reset(OpCopy) 13199 v.Type = x.Type 13200 v.AddArg(x) 13201 return true 13202 } 13203 } 13204 func rewriteValue386_OpTrunc32to16(v *Value, config *Config) bool { 13205 b := v.Block 13206 _ = b 13207 // match: (Trunc32to16 x) 13208 // cond: 13209 // result: x 13210 for { 13211 x := v.Args[0] 13212 v.reset(OpCopy) 13213 v.Type = x.Type 13214 v.AddArg(x) 13215 return true 13216 } 13217 } 13218 func rewriteValue386_OpTrunc32to8(v *Value, config *Config) bool { 13219 b := v.Block 13220 _ = b 13221 // match: (Trunc32to8 x) 13222 // cond: 13223 // result: x 13224 for { 13225 x := v.Args[0] 13226 v.reset(OpCopy) 13227 v.Type = x.Type 13228 v.AddArg(x) 13229 return true 13230 } 13231 } 13232 func rewriteValue386_OpXor16(v *Value, config *Config) bool { 13233 b := v.Block 13234 _ = b 13235 // match: (Xor16 x y) 13236 // cond: 13237 // result: (XORL x y) 13238 for { 13239 x := v.Args[0] 13240 y := v.Args[1] 13241 v.reset(Op386XORL) 13242 v.AddArg(x) 13243 v.AddArg(y) 13244 return true 13245 } 13246 } 13247 func rewriteValue386_OpXor32(v *Value, config *Config) bool { 13248 b := v.Block 13249 _ = b 13250 // match: (Xor32 x y) 13251 // cond: 13252 // result: (XORL x y) 13253 for { 13254 x := v.Args[0] 13255 y := v.Args[1] 13256 v.reset(Op386XORL) 13257 v.AddArg(x) 13258 v.AddArg(y) 13259 return true 13260 } 13261 } 13262 func rewriteValue386_OpXor8(v *Value, config *Config) bool { 13263 b := v.Block 13264 _ = b 13265 // match: (Xor8 x y) 13266 // cond: 13267 // result: (XORL x y) 13268 for { 13269 x := v.Args[0] 13270 y := v.Args[1] 13271 v.reset(Op386XORL) 13272 v.AddArg(x) 13273 v.AddArg(y) 13274 return true 13275 } 13276 } 13277 func rewriteValue386_OpZero(v *Value, config *Config) bool { 13278 b := v.Block 13279 _ = b 13280 // match: (Zero [s] _ mem) 13281 // cond: SizeAndAlign(s).Size() == 0 13282 // result: mem 13283 for { 13284 s := v.AuxInt 13285 mem := v.Args[1] 13286 if !(SizeAndAlign(s).Size() == 0) { 13287 break 13288 } 13289 v.reset(OpCopy) 13290 v.Type = mem.Type 13291 v.AddArg(mem) 13292 return true 13293 } 13294 // match: (Zero [s] destptr mem) 13295 // cond: SizeAndAlign(s).Size() == 1 13296 // result: (MOVBstoreconst [0] destptr mem) 13297 for { 13298 s := v.AuxInt 13299 destptr := v.Args[0] 13300 mem := v.Args[1] 13301 if !(SizeAndAlign(s).Size() == 1) { 13302 break 13303 } 13304 v.reset(Op386MOVBstoreconst) 13305 v.AuxInt = 0 13306 v.AddArg(destptr) 13307 v.AddArg(mem) 13308 return true 13309 } 13310 // match: (Zero [s] destptr mem) 13311 // cond: SizeAndAlign(s).Size() == 2 13312 // result: (MOVWstoreconst [0] destptr mem) 13313 for { 13314 s := v.AuxInt 13315 destptr := v.Args[0] 13316 mem := v.Args[1] 13317 if !(SizeAndAlign(s).Size() == 2) { 13318 break 13319 } 13320 v.reset(Op386MOVWstoreconst) 13321 v.AuxInt = 0 13322 v.AddArg(destptr) 13323 v.AddArg(mem) 13324 return true 13325 } 13326 // match: (Zero [s] destptr mem) 13327 // cond: SizeAndAlign(s).Size() == 4 13328 // result: (MOVLstoreconst [0] destptr mem) 13329 for { 13330 s := v.AuxInt 13331 destptr := v.Args[0] 13332 mem := v.Args[1] 13333 if !(SizeAndAlign(s).Size() == 4) { 13334 break 13335 } 13336 v.reset(Op386MOVLstoreconst) 13337 v.AuxInt = 0 13338 v.AddArg(destptr) 13339 v.AddArg(mem) 13340 return true 13341 } 13342 // match: (Zero [s] destptr mem) 13343 // cond: SizeAndAlign(s).Size() == 3 13344 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVWstoreconst [0] destptr mem)) 13345 for { 13346 s := v.AuxInt 13347 destptr := v.Args[0] 13348 mem := v.Args[1] 13349 if !(SizeAndAlign(s).Size() == 3) { 13350 break 13351 } 13352 v.reset(Op386MOVBstoreconst) 13353 v.AuxInt = makeValAndOff(0, 2) 13354 v.AddArg(destptr) 13355 v0 := b.NewValue0(v.Pos, Op386MOVWstoreconst, TypeMem) 13356 v0.AuxInt = 0 13357 v0.AddArg(destptr) 13358 v0.AddArg(mem) 13359 v.AddArg(v0) 13360 return true 13361 } 13362 // match: (Zero [s] destptr mem) 13363 // cond: SizeAndAlign(s).Size() == 5 13364 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 13365 for { 13366 s := v.AuxInt 13367 destptr := v.Args[0] 13368 mem := v.Args[1] 13369 if !(SizeAndAlign(s).Size() == 5) { 13370 break 13371 } 13372 v.reset(Op386MOVBstoreconst) 13373 v.AuxInt = makeValAndOff(0, 4) 13374 v.AddArg(destptr) 13375 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13376 v0.AuxInt = 0 13377 v0.AddArg(destptr) 13378 v0.AddArg(mem) 13379 v.AddArg(v0) 13380 return true 13381 } 13382 // match: (Zero [s] destptr mem) 13383 // cond: SizeAndAlign(s).Size() == 6 13384 // result: (MOVWstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 13385 for { 13386 s := v.AuxInt 13387 destptr := v.Args[0] 13388 mem := v.Args[1] 13389 if !(SizeAndAlign(s).Size() == 6) { 13390 break 13391 } 13392 v.reset(Op386MOVWstoreconst) 13393 v.AuxInt = makeValAndOff(0, 4) 13394 v.AddArg(destptr) 13395 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13396 v0.AuxInt = 0 13397 v0.AddArg(destptr) 13398 v0.AddArg(mem) 13399 v.AddArg(v0) 13400 return true 13401 } 13402 // match: (Zero [s] destptr mem) 13403 // cond: SizeAndAlign(s).Size() == 7 13404 // result: (MOVLstoreconst [makeValAndOff(0,3)] destptr (MOVLstoreconst [0] destptr mem)) 13405 for { 13406 s := v.AuxInt 13407 destptr := v.Args[0] 13408 mem := v.Args[1] 13409 if !(SizeAndAlign(s).Size() == 7) { 13410 break 13411 } 13412 v.reset(Op386MOVLstoreconst) 13413 v.AuxInt = makeValAndOff(0, 3) 13414 v.AddArg(destptr) 13415 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13416 v0.AuxInt = 0 13417 v0.AddArg(destptr) 13418 v0.AddArg(mem) 13419 v.AddArg(v0) 13420 return true 13421 } 13422 // match: (Zero [s] destptr mem) 13423 // cond: SizeAndAlign(s).Size()%4 != 0 && SizeAndAlign(s).Size() > 4 13424 // result: (Zero [SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%4] (ADDLconst destptr [SizeAndAlign(s).Size()%4]) (MOVLstoreconst [0] destptr mem)) 13425 for { 13426 s := v.AuxInt 13427 destptr := v.Args[0] 13428 mem := v.Args[1] 13429 if !(SizeAndAlign(s).Size()%4 != 0 && SizeAndAlign(s).Size() > 4) { 13430 break 13431 } 13432 v.reset(OpZero) 13433 v.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%4 13434 v0 := b.NewValue0(v.Pos, Op386ADDLconst, config.fe.TypeUInt32()) 13435 v0.AuxInt = SizeAndAlign(s).Size() % 4 13436 v0.AddArg(destptr) 13437 v.AddArg(v0) 13438 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13439 v1.AuxInt = 0 13440 v1.AddArg(destptr) 13441 v1.AddArg(mem) 13442 v.AddArg(v1) 13443 return true 13444 } 13445 // match: (Zero [s] destptr mem) 13446 // cond: SizeAndAlign(s).Size() == 8 13447 // result: (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 13448 for { 13449 s := v.AuxInt 13450 destptr := v.Args[0] 13451 mem := v.Args[1] 13452 if !(SizeAndAlign(s).Size() == 8) { 13453 break 13454 } 13455 v.reset(Op386MOVLstoreconst) 13456 v.AuxInt = makeValAndOff(0, 4) 13457 v.AddArg(destptr) 13458 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13459 v0.AuxInt = 0 13460 v0.AddArg(destptr) 13461 v0.AddArg(mem) 13462 v.AddArg(v0) 13463 return true 13464 } 13465 // match: (Zero [s] destptr mem) 13466 // cond: SizeAndAlign(s).Size() == 12 13467 // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) 13468 for { 13469 s := v.AuxInt 13470 destptr := v.Args[0] 13471 mem := v.Args[1] 13472 if !(SizeAndAlign(s).Size() == 12) { 13473 break 13474 } 13475 v.reset(Op386MOVLstoreconst) 13476 v.AuxInt = makeValAndOff(0, 8) 13477 v.AddArg(destptr) 13478 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13479 v0.AuxInt = makeValAndOff(0, 4) 13480 v0.AddArg(destptr) 13481 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13482 v1.AuxInt = 0 13483 v1.AddArg(destptr) 13484 v1.AddArg(mem) 13485 v0.AddArg(v1) 13486 v.AddArg(v0) 13487 return true 13488 } 13489 // match: (Zero [s] destptr mem) 13490 // cond: SizeAndAlign(s).Size() == 16 13491 // result: (MOVLstoreconst [makeValAndOff(0,12)] destptr (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)))) 13492 for { 13493 s := v.AuxInt 13494 destptr := v.Args[0] 13495 mem := v.Args[1] 13496 if !(SizeAndAlign(s).Size() == 16) { 13497 break 13498 } 13499 v.reset(Op386MOVLstoreconst) 13500 v.AuxInt = makeValAndOff(0, 12) 13501 v.AddArg(destptr) 13502 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13503 v0.AuxInt = makeValAndOff(0, 8) 13504 v0.AddArg(destptr) 13505 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13506 v1.AuxInt = makeValAndOff(0, 4) 13507 v1.AddArg(destptr) 13508 v2 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 13509 v2.AuxInt = 0 13510 v2.AddArg(destptr) 13511 v2.AddArg(mem) 13512 v1.AddArg(v2) 13513 v0.AddArg(v1) 13514 v.AddArg(v0) 13515 return true 13516 } 13517 // match: (Zero [s] destptr mem) 13518 // cond: SizeAndAlign(s).Size() > 16 && SizeAndAlign(s).Size() <= 4*128 && SizeAndAlign(s).Size()%4 == 0 && !config.noDuffDevice 13519 // result: (DUFFZERO [1*(128-SizeAndAlign(s).Size()/4)] destptr (MOVLconst [0]) mem) 13520 for { 13521 s := v.AuxInt 13522 destptr := v.Args[0] 13523 mem := v.Args[1] 13524 if !(SizeAndAlign(s).Size() > 16 && SizeAndAlign(s).Size() <= 4*128 && SizeAndAlign(s).Size()%4 == 0 && !config.noDuffDevice) { 13525 break 13526 } 13527 v.reset(Op386DUFFZERO) 13528 v.AuxInt = 1 * (128 - SizeAndAlign(s).Size()/4) 13529 v.AddArg(destptr) 13530 v0 := b.NewValue0(v.Pos, Op386MOVLconst, config.fe.TypeUInt32()) 13531 v0.AuxInt = 0 13532 v.AddArg(v0) 13533 v.AddArg(mem) 13534 return true 13535 } 13536 // match: (Zero [s] destptr mem) 13537 // cond: (SizeAndAlign(s).Size() > 4*128 || (config.noDuffDevice && SizeAndAlign(s).Size() > 16)) && SizeAndAlign(s).Size()%4 == 0 13538 // result: (REPSTOSL destptr (MOVLconst [SizeAndAlign(s).Size()/4]) (MOVLconst [0]) mem) 13539 for { 13540 s := v.AuxInt 13541 destptr := v.Args[0] 13542 mem := v.Args[1] 13543 if !((SizeAndAlign(s).Size() > 4*128 || (config.noDuffDevice && SizeAndAlign(s).Size() > 16)) && SizeAndAlign(s).Size()%4 == 0) { 13544 break 13545 } 13546 v.reset(Op386REPSTOSL) 13547 v.AddArg(destptr) 13548 v0 := b.NewValue0(v.Pos, Op386MOVLconst, config.fe.TypeUInt32()) 13549 v0.AuxInt = SizeAndAlign(s).Size() / 4 13550 v.AddArg(v0) 13551 v1 := b.NewValue0(v.Pos, Op386MOVLconst, config.fe.TypeUInt32()) 13552 v1.AuxInt = 0 13553 v.AddArg(v1) 13554 v.AddArg(mem) 13555 return true 13556 } 13557 return false 13558 } 13559 func rewriteValue386_OpZeroExt16to32(v *Value, config *Config) bool { 13560 b := v.Block 13561 _ = b 13562 // match: (ZeroExt16to32 x) 13563 // cond: 13564 // result: (MOVWLZX x) 13565 for { 13566 x := v.Args[0] 13567 v.reset(Op386MOVWLZX) 13568 v.AddArg(x) 13569 return true 13570 } 13571 } 13572 func rewriteValue386_OpZeroExt8to16(v *Value, config *Config) bool { 13573 b := v.Block 13574 _ = b 13575 // match: (ZeroExt8to16 x) 13576 // cond: 13577 // result: (MOVBLZX x) 13578 for { 13579 x := v.Args[0] 13580 v.reset(Op386MOVBLZX) 13581 v.AddArg(x) 13582 return true 13583 } 13584 } 13585 func rewriteValue386_OpZeroExt8to32(v *Value, config *Config) bool { 13586 b := v.Block 13587 _ = b 13588 // match: (ZeroExt8to32 x) 13589 // cond: 13590 // result: (MOVBLZX x) 13591 for { 13592 x := v.Args[0] 13593 v.reset(Op386MOVBLZX) 13594 v.AddArg(x) 13595 return true 13596 } 13597 } 13598 func rewriteValue386_OpZeromask(v *Value, config *Config) bool { 13599 b := v.Block 13600 _ = b 13601 // match: (Zeromask <t> x) 13602 // cond: 13603 // result: (XORLconst [-1] (SBBLcarrymask <t> (CMPLconst x [1]))) 13604 for { 13605 t := v.Type 13606 x := v.Args[0] 13607 v.reset(Op386XORLconst) 13608 v.AuxInt = -1 13609 v0 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 13610 v1 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 13611 v1.AuxInt = 1 13612 v1.AddArg(x) 13613 v0.AddArg(v1) 13614 v.AddArg(v0) 13615 return true 13616 } 13617 } 13618 func rewriteBlock386(b *Block, config *Config) bool { 13619 switch b.Kind { 13620 case Block386EQ: 13621 // match: (EQ (InvertFlags cmp) yes no) 13622 // cond: 13623 // result: (EQ cmp yes no) 13624 for { 13625 v := b.Control 13626 if v.Op != Op386InvertFlags { 13627 break 13628 } 13629 cmp := v.Args[0] 13630 yes := b.Succs[0] 13631 no := b.Succs[1] 13632 b.Kind = Block386EQ 13633 b.SetControl(cmp) 13634 _ = yes 13635 _ = no 13636 return true 13637 } 13638 // match: (EQ (FlagEQ) yes no) 13639 // cond: 13640 // result: (First nil yes no) 13641 for { 13642 v := b.Control 13643 if v.Op != Op386FlagEQ { 13644 break 13645 } 13646 yes := b.Succs[0] 13647 no := b.Succs[1] 13648 b.Kind = BlockFirst 13649 b.SetControl(nil) 13650 _ = yes 13651 _ = no 13652 return true 13653 } 13654 // match: (EQ (FlagLT_ULT) yes no) 13655 // cond: 13656 // result: (First nil no yes) 13657 for { 13658 v := b.Control 13659 if v.Op != Op386FlagLT_ULT { 13660 break 13661 } 13662 yes := b.Succs[0] 13663 no := b.Succs[1] 13664 b.Kind = BlockFirst 13665 b.SetControl(nil) 13666 b.swapSuccessors() 13667 _ = no 13668 _ = yes 13669 return true 13670 } 13671 // match: (EQ (FlagLT_UGT) yes no) 13672 // cond: 13673 // result: (First nil no yes) 13674 for { 13675 v := b.Control 13676 if v.Op != Op386FlagLT_UGT { 13677 break 13678 } 13679 yes := b.Succs[0] 13680 no := b.Succs[1] 13681 b.Kind = BlockFirst 13682 b.SetControl(nil) 13683 b.swapSuccessors() 13684 _ = no 13685 _ = yes 13686 return true 13687 } 13688 // match: (EQ (FlagGT_ULT) yes no) 13689 // cond: 13690 // result: (First nil no yes) 13691 for { 13692 v := b.Control 13693 if v.Op != Op386FlagGT_ULT { 13694 break 13695 } 13696 yes := b.Succs[0] 13697 no := b.Succs[1] 13698 b.Kind = BlockFirst 13699 b.SetControl(nil) 13700 b.swapSuccessors() 13701 _ = no 13702 _ = yes 13703 return true 13704 } 13705 // match: (EQ (FlagGT_UGT) yes no) 13706 // cond: 13707 // result: (First nil no yes) 13708 for { 13709 v := b.Control 13710 if v.Op != Op386FlagGT_UGT { 13711 break 13712 } 13713 yes := b.Succs[0] 13714 no := b.Succs[1] 13715 b.Kind = BlockFirst 13716 b.SetControl(nil) 13717 b.swapSuccessors() 13718 _ = no 13719 _ = yes 13720 return true 13721 } 13722 case Block386GE: 13723 // match: (GE (InvertFlags cmp) yes no) 13724 // cond: 13725 // result: (LE cmp yes no) 13726 for { 13727 v := b.Control 13728 if v.Op != Op386InvertFlags { 13729 break 13730 } 13731 cmp := v.Args[0] 13732 yes := b.Succs[0] 13733 no := b.Succs[1] 13734 b.Kind = Block386LE 13735 b.SetControl(cmp) 13736 _ = yes 13737 _ = no 13738 return true 13739 } 13740 // match: (GE (FlagEQ) yes no) 13741 // cond: 13742 // result: (First nil yes no) 13743 for { 13744 v := b.Control 13745 if v.Op != Op386FlagEQ { 13746 break 13747 } 13748 yes := b.Succs[0] 13749 no := b.Succs[1] 13750 b.Kind = BlockFirst 13751 b.SetControl(nil) 13752 _ = yes 13753 _ = no 13754 return true 13755 } 13756 // match: (GE (FlagLT_ULT) yes no) 13757 // cond: 13758 // result: (First nil no yes) 13759 for { 13760 v := b.Control 13761 if v.Op != Op386FlagLT_ULT { 13762 break 13763 } 13764 yes := b.Succs[0] 13765 no := b.Succs[1] 13766 b.Kind = BlockFirst 13767 b.SetControl(nil) 13768 b.swapSuccessors() 13769 _ = no 13770 _ = yes 13771 return true 13772 } 13773 // match: (GE (FlagLT_UGT) yes no) 13774 // cond: 13775 // result: (First nil no yes) 13776 for { 13777 v := b.Control 13778 if v.Op != Op386FlagLT_UGT { 13779 break 13780 } 13781 yes := b.Succs[0] 13782 no := b.Succs[1] 13783 b.Kind = BlockFirst 13784 b.SetControl(nil) 13785 b.swapSuccessors() 13786 _ = no 13787 _ = yes 13788 return true 13789 } 13790 // match: (GE (FlagGT_ULT) yes no) 13791 // cond: 13792 // result: (First nil yes no) 13793 for { 13794 v := b.Control 13795 if v.Op != Op386FlagGT_ULT { 13796 break 13797 } 13798 yes := b.Succs[0] 13799 no := b.Succs[1] 13800 b.Kind = BlockFirst 13801 b.SetControl(nil) 13802 _ = yes 13803 _ = no 13804 return true 13805 } 13806 // match: (GE (FlagGT_UGT) yes no) 13807 // cond: 13808 // result: (First nil yes no) 13809 for { 13810 v := b.Control 13811 if v.Op != Op386FlagGT_UGT { 13812 break 13813 } 13814 yes := b.Succs[0] 13815 no := b.Succs[1] 13816 b.Kind = BlockFirst 13817 b.SetControl(nil) 13818 _ = yes 13819 _ = no 13820 return true 13821 } 13822 case Block386GT: 13823 // match: (GT (InvertFlags cmp) yes no) 13824 // cond: 13825 // result: (LT cmp yes no) 13826 for { 13827 v := b.Control 13828 if v.Op != Op386InvertFlags { 13829 break 13830 } 13831 cmp := v.Args[0] 13832 yes := b.Succs[0] 13833 no := b.Succs[1] 13834 b.Kind = Block386LT 13835 b.SetControl(cmp) 13836 _ = yes 13837 _ = no 13838 return true 13839 } 13840 // match: (GT (FlagEQ) yes no) 13841 // cond: 13842 // result: (First nil no yes) 13843 for { 13844 v := b.Control 13845 if v.Op != Op386FlagEQ { 13846 break 13847 } 13848 yes := b.Succs[0] 13849 no := b.Succs[1] 13850 b.Kind = BlockFirst 13851 b.SetControl(nil) 13852 b.swapSuccessors() 13853 _ = no 13854 _ = yes 13855 return true 13856 } 13857 // match: (GT (FlagLT_ULT) yes no) 13858 // cond: 13859 // result: (First nil no yes) 13860 for { 13861 v := b.Control 13862 if v.Op != Op386FlagLT_ULT { 13863 break 13864 } 13865 yes := b.Succs[0] 13866 no := b.Succs[1] 13867 b.Kind = BlockFirst 13868 b.SetControl(nil) 13869 b.swapSuccessors() 13870 _ = no 13871 _ = yes 13872 return true 13873 } 13874 // match: (GT (FlagLT_UGT) yes no) 13875 // cond: 13876 // result: (First nil no yes) 13877 for { 13878 v := b.Control 13879 if v.Op != Op386FlagLT_UGT { 13880 break 13881 } 13882 yes := b.Succs[0] 13883 no := b.Succs[1] 13884 b.Kind = BlockFirst 13885 b.SetControl(nil) 13886 b.swapSuccessors() 13887 _ = no 13888 _ = yes 13889 return true 13890 } 13891 // match: (GT (FlagGT_ULT) yes no) 13892 // cond: 13893 // result: (First nil yes no) 13894 for { 13895 v := b.Control 13896 if v.Op != Op386FlagGT_ULT { 13897 break 13898 } 13899 yes := b.Succs[0] 13900 no := b.Succs[1] 13901 b.Kind = BlockFirst 13902 b.SetControl(nil) 13903 _ = yes 13904 _ = no 13905 return true 13906 } 13907 // match: (GT (FlagGT_UGT) yes no) 13908 // cond: 13909 // result: (First nil yes no) 13910 for { 13911 v := b.Control 13912 if v.Op != Op386FlagGT_UGT { 13913 break 13914 } 13915 yes := b.Succs[0] 13916 no := b.Succs[1] 13917 b.Kind = BlockFirst 13918 b.SetControl(nil) 13919 _ = yes 13920 _ = no 13921 return true 13922 } 13923 case BlockIf: 13924 // match: (If (SETL cmp) yes no) 13925 // cond: 13926 // result: (LT cmp yes no) 13927 for { 13928 v := b.Control 13929 if v.Op != Op386SETL { 13930 break 13931 } 13932 cmp := v.Args[0] 13933 yes := b.Succs[0] 13934 no := b.Succs[1] 13935 b.Kind = Block386LT 13936 b.SetControl(cmp) 13937 _ = yes 13938 _ = no 13939 return true 13940 } 13941 // match: (If (SETLE cmp) yes no) 13942 // cond: 13943 // result: (LE cmp yes no) 13944 for { 13945 v := b.Control 13946 if v.Op != Op386SETLE { 13947 break 13948 } 13949 cmp := v.Args[0] 13950 yes := b.Succs[0] 13951 no := b.Succs[1] 13952 b.Kind = Block386LE 13953 b.SetControl(cmp) 13954 _ = yes 13955 _ = no 13956 return true 13957 } 13958 // match: (If (SETG cmp) yes no) 13959 // cond: 13960 // result: (GT cmp yes no) 13961 for { 13962 v := b.Control 13963 if v.Op != Op386SETG { 13964 break 13965 } 13966 cmp := v.Args[0] 13967 yes := b.Succs[0] 13968 no := b.Succs[1] 13969 b.Kind = Block386GT 13970 b.SetControl(cmp) 13971 _ = yes 13972 _ = no 13973 return true 13974 } 13975 // match: (If (SETGE cmp) yes no) 13976 // cond: 13977 // result: (GE cmp yes no) 13978 for { 13979 v := b.Control 13980 if v.Op != Op386SETGE { 13981 break 13982 } 13983 cmp := v.Args[0] 13984 yes := b.Succs[0] 13985 no := b.Succs[1] 13986 b.Kind = Block386GE 13987 b.SetControl(cmp) 13988 _ = yes 13989 _ = no 13990 return true 13991 } 13992 // match: (If (SETEQ cmp) yes no) 13993 // cond: 13994 // result: (EQ cmp yes no) 13995 for { 13996 v := b.Control 13997 if v.Op != Op386SETEQ { 13998 break 13999 } 14000 cmp := v.Args[0] 14001 yes := b.Succs[0] 14002 no := b.Succs[1] 14003 b.Kind = Block386EQ 14004 b.SetControl(cmp) 14005 _ = yes 14006 _ = no 14007 return true 14008 } 14009 // match: (If (SETNE cmp) yes no) 14010 // cond: 14011 // result: (NE cmp yes no) 14012 for { 14013 v := b.Control 14014 if v.Op != Op386SETNE { 14015 break 14016 } 14017 cmp := v.Args[0] 14018 yes := b.Succs[0] 14019 no := b.Succs[1] 14020 b.Kind = Block386NE 14021 b.SetControl(cmp) 14022 _ = yes 14023 _ = no 14024 return true 14025 } 14026 // match: (If (SETB cmp) yes no) 14027 // cond: 14028 // result: (ULT cmp yes no) 14029 for { 14030 v := b.Control 14031 if v.Op != Op386SETB { 14032 break 14033 } 14034 cmp := v.Args[0] 14035 yes := b.Succs[0] 14036 no := b.Succs[1] 14037 b.Kind = Block386ULT 14038 b.SetControl(cmp) 14039 _ = yes 14040 _ = no 14041 return true 14042 } 14043 // match: (If (SETBE cmp) yes no) 14044 // cond: 14045 // result: (ULE cmp yes no) 14046 for { 14047 v := b.Control 14048 if v.Op != Op386SETBE { 14049 break 14050 } 14051 cmp := v.Args[0] 14052 yes := b.Succs[0] 14053 no := b.Succs[1] 14054 b.Kind = Block386ULE 14055 b.SetControl(cmp) 14056 _ = yes 14057 _ = no 14058 return true 14059 } 14060 // match: (If (SETA cmp) yes no) 14061 // cond: 14062 // result: (UGT cmp yes no) 14063 for { 14064 v := b.Control 14065 if v.Op != Op386SETA { 14066 break 14067 } 14068 cmp := v.Args[0] 14069 yes := b.Succs[0] 14070 no := b.Succs[1] 14071 b.Kind = Block386UGT 14072 b.SetControl(cmp) 14073 _ = yes 14074 _ = no 14075 return true 14076 } 14077 // match: (If (SETAE cmp) yes no) 14078 // cond: 14079 // result: (UGE cmp yes no) 14080 for { 14081 v := b.Control 14082 if v.Op != Op386SETAE { 14083 break 14084 } 14085 cmp := v.Args[0] 14086 yes := b.Succs[0] 14087 no := b.Succs[1] 14088 b.Kind = Block386UGE 14089 b.SetControl(cmp) 14090 _ = yes 14091 _ = no 14092 return true 14093 } 14094 // match: (If (SETGF cmp) yes no) 14095 // cond: 14096 // result: (UGT cmp yes no) 14097 for { 14098 v := b.Control 14099 if v.Op != Op386SETGF { 14100 break 14101 } 14102 cmp := v.Args[0] 14103 yes := b.Succs[0] 14104 no := b.Succs[1] 14105 b.Kind = Block386UGT 14106 b.SetControl(cmp) 14107 _ = yes 14108 _ = no 14109 return true 14110 } 14111 // match: (If (SETGEF cmp) yes no) 14112 // cond: 14113 // result: (UGE cmp yes no) 14114 for { 14115 v := b.Control 14116 if v.Op != Op386SETGEF { 14117 break 14118 } 14119 cmp := v.Args[0] 14120 yes := b.Succs[0] 14121 no := b.Succs[1] 14122 b.Kind = Block386UGE 14123 b.SetControl(cmp) 14124 _ = yes 14125 _ = no 14126 return true 14127 } 14128 // match: (If (SETEQF cmp) yes no) 14129 // cond: 14130 // result: (EQF cmp yes no) 14131 for { 14132 v := b.Control 14133 if v.Op != Op386SETEQF { 14134 break 14135 } 14136 cmp := v.Args[0] 14137 yes := b.Succs[0] 14138 no := b.Succs[1] 14139 b.Kind = Block386EQF 14140 b.SetControl(cmp) 14141 _ = yes 14142 _ = no 14143 return true 14144 } 14145 // match: (If (SETNEF cmp) yes no) 14146 // cond: 14147 // result: (NEF cmp yes no) 14148 for { 14149 v := b.Control 14150 if v.Op != Op386SETNEF { 14151 break 14152 } 14153 cmp := v.Args[0] 14154 yes := b.Succs[0] 14155 no := b.Succs[1] 14156 b.Kind = Block386NEF 14157 b.SetControl(cmp) 14158 _ = yes 14159 _ = no 14160 return true 14161 } 14162 // match: (If cond yes no) 14163 // cond: 14164 // result: (NE (TESTB cond cond) yes no) 14165 for { 14166 v := b.Control 14167 _ = v 14168 cond := b.Control 14169 yes := b.Succs[0] 14170 no := b.Succs[1] 14171 b.Kind = Block386NE 14172 v0 := b.NewValue0(v.Pos, Op386TESTB, TypeFlags) 14173 v0.AddArg(cond) 14174 v0.AddArg(cond) 14175 b.SetControl(v0) 14176 _ = yes 14177 _ = no 14178 return true 14179 } 14180 case Block386LE: 14181 // match: (LE (InvertFlags cmp) yes no) 14182 // cond: 14183 // result: (GE cmp yes no) 14184 for { 14185 v := b.Control 14186 if v.Op != Op386InvertFlags { 14187 break 14188 } 14189 cmp := v.Args[0] 14190 yes := b.Succs[0] 14191 no := b.Succs[1] 14192 b.Kind = Block386GE 14193 b.SetControl(cmp) 14194 _ = yes 14195 _ = no 14196 return true 14197 } 14198 // match: (LE (FlagEQ) yes no) 14199 // cond: 14200 // result: (First nil yes no) 14201 for { 14202 v := b.Control 14203 if v.Op != Op386FlagEQ { 14204 break 14205 } 14206 yes := b.Succs[0] 14207 no := b.Succs[1] 14208 b.Kind = BlockFirst 14209 b.SetControl(nil) 14210 _ = yes 14211 _ = no 14212 return true 14213 } 14214 // match: (LE (FlagLT_ULT) yes no) 14215 // cond: 14216 // result: (First nil yes no) 14217 for { 14218 v := b.Control 14219 if v.Op != Op386FlagLT_ULT { 14220 break 14221 } 14222 yes := b.Succs[0] 14223 no := b.Succs[1] 14224 b.Kind = BlockFirst 14225 b.SetControl(nil) 14226 _ = yes 14227 _ = no 14228 return true 14229 } 14230 // match: (LE (FlagLT_UGT) yes no) 14231 // cond: 14232 // result: (First nil yes no) 14233 for { 14234 v := b.Control 14235 if v.Op != Op386FlagLT_UGT { 14236 break 14237 } 14238 yes := b.Succs[0] 14239 no := b.Succs[1] 14240 b.Kind = BlockFirst 14241 b.SetControl(nil) 14242 _ = yes 14243 _ = no 14244 return true 14245 } 14246 // match: (LE (FlagGT_ULT) yes no) 14247 // cond: 14248 // result: (First nil no yes) 14249 for { 14250 v := b.Control 14251 if v.Op != Op386FlagGT_ULT { 14252 break 14253 } 14254 yes := b.Succs[0] 14255 no := b.Succs[1] 14256 b.Kind = BlockFirst 14257 b.SetControl(nil) 14258 b.swapSuccessors() 14259 _ = no 14260 _ = yes 14261 return true 14262 } 14263 // match: (LE (FlagGT_UGT) yes no) 14264 // cond: 14265 // result: (First nil no yes) 14266 for { 14267 v := b.Control 14268 if v.Op != Op386FlagGT_UGT { 14269 break 14270 } 14271 yes := b.Succs[0] 14272 no := b.Succs[1] 14273 b.Kind = BlockFirst 14274 b.SetControl(nil) 14275 b.swapSuccessors() 14276 _ = no 14277 _ = yes 14278 return true 14279 } 14280 case Block386LT: 14281 // match: (LT (InvertFlags cmp) yes no) 14282 // cond: 14283 // result: (GT cmp yes no) 14284 for { 14285 v := b.Control 14286 if v.Op != Op386InvertFlags { 14287 break 14288 } 14289 cmp := v.Args[0] 14290 yes := b.Succs[0] 14291 no := b.Succs[1] 14292 b.Kind = Block386GT 14293 b.SetControl(cmp) 14294 _ = yes 14295 _ = no 14296 return true 14297 } 14298 // match: (LT (FlagEQ) yes no) 14299 // cond: 14300 // result: (First nil no yes) 14301 for { 14302 v := b.Control 14303 if v.Op != Op386FlagEQ { 14304 break 14305 } 14306 yes := b.Succs[0] 14307 no := b.Succs[1] 14308 b.Kind = BlockFirst 14309 b.SetControl(nil) 14310 b.swapSuccessors() 14311 _ = no 14312 _ = yes 14313 return true 14314 } 14315 // match: (LT (FlagLT_ULT) yes no) 14316 // cond: 14317 // result: (First nil yes no) 14318 for { 14319 v := b.Control 14320 if v.Op != Op386FlagLT_ULT { 14321 break 14322 } 14323 yes := b.Succs[0] 14324 no := b.Succs[1] 14325 b.Kind = BlockFirst 14326 b.SetControl(nil) 14327 _ = yes 14328 _ = no 14329 return true 14330 } 14331 // match: (LT (FlagLT_UGT) yes no) 14332 // cond: 14333 // result: (First nil yes no) 14334 for { 14335 v := b.Control 14336 if v.Op != Op386FlagLT_UGT { 14337 break 14338 } 14339 yes := b.Succs[0] 14340 no := b.Succs[1] 14341 b.Kind = BlockFirst 14342 b.SetControl(nil) 14343 _ = yes 14344 _ = no 14345 return true 14346 } 14347 // match: (LT (FlagGT_ULT) yes no) 14348 // cond: 14349 // result: (First nil no yes) 14350 for { 14351 v := b.Control 14352 if v.Op != Op386FlagGT_ULT { 14353 break 14354 } 14355 yes := b.Succs[0] 14356 no := b.Succs[1] 14357 b.Kind = BlockFirst 14358 b.SetControl(nil) 14359 b.swapSuccessors() 14360 _ = no 14361 _ = yes 14362 return true 14363 } 14364 // match: (LT (FlagGT_UGT) yes no) 14365 // cond: 14366 // result: (First nil no yes) 14367 for { 14368 v := b.Control 14369 if v.Op != Op386FlagGT_UGT { 14370 break 14371 } 14372 yes := b.Succs[0] 14373 no := b.Succs[1] 14374 b.Kind = BlockFirst 14375 b.SetControl(nil) 14376 b.swapSuccessors() 14377 _ = no 14378 _ = yes 14379 return true 14380 } 14381 case Block386NE: 14382 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 14383 // cond: 14384 // result: (LT cmp yes no) 14385 for { 14386 v := b.Control 14387 if v.Op != Op386TESTB { 14388 break 14389 } 14390 v_0 := v.Args[0] 14391 if v_0.Op != Op386SETL { 14392 break 14393 } 14394 cmp := v_0.Args[0] 14395 v_1 := v.Args[1] 14396 if v_1.Op != Op386SETL { 14397 break 14398 } 14399 if cmp != v_1.Args[0] { 14400 break 14401 } 14402 yes := b.Succs[0] 14403 no := b.Succs[1] 14404 b.Kind = Block386LT 14405 b.SetControl(cmp) 14406 _ = yes 14407 _ = no 14408 return true 14409 } 14410 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 14411 // cond: 14412 // result: (LE cmp yes no) 14413 for { 14414 v := b.Control 14415 if v.Op != Op386TESTB { 14416 break 14417 } 14418 v_0 := v.Args[0] 14419 if v_0.Op != Op386SETLE { 14420 break 14421 } 14422 cmp := v_0.Args[0] 14423 v_1 := v.Args[1] 14424 if v_1.Op != Op386SETLE { 14425 break 14426 } 14427 if cmp != v_1.Args[0] { 14428 break 14429 } 14430 yes := b.Succs[0] 14431 no := b.Succs[1] 14432 b.Kind = Block386LE 14433 b.SetControl(cmp) 14434 _ = yes 14435 _ = no 14436 return true 14437 } 14438 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 14439 // cond: 14440 // result: (GT cmp yes no) 14441 for { 14442 v := b.Control 14443 if v.Op != Op386TESTB { 14444 break 14445 } 14446 v_0 := v.Args[0] 14447 if v_0.Op != Op386SETG { 14448 break 14449 } 14450 cmp := v_0.Args[0] 14451 v_1 := v.Args[1] 14452 if v_1.Op != Op386SETG { 14453 break 14454 } 14455 if cmp != v_1.Args[0] { 14456 break 14457 } 14458 yes := b.Succs[0] 14459 no := b.Succs[1] 14460 b.Kind = Block386GT 14461 b.SetControl(cmp) 14462 _ = yes 14463 _ = no 14464 return true 14465 } 14466 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 14467 // cond: 14468 // result: (GE cmp yes no) 14469 for { 14470 v := b.Control 14471 if v.Op != Op386TESTB { 14472 break 14473 } 14474 v_0 := v.Args[0] 14475 if v_0.Op != Op386SETGE { 14476 break 14477 } 14478 cmp := v_0.Args[0] 14479 v_1 := v.Args[1] 14480 if v_1.Op != Op386SETGE { 14481 break 14482 } 14483 if cmp != v_1.Args[0] { 14484 break 14485 } 14486 yes := b.Succs[0] 14487 no := b.Succs[1] 14488 b.Kind = Block386GE 14489 b.SetControl(cmp) 14490 _ = yes 14491 _ = no 14492 return true 14493 } 14494 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 14495 // cond: 14496 // result: (EQ cmp yes no) 14497 for { 14498 v := b.Control 14499 if v.Op != Op386TESTB { 14500 break 14501 } 14502 v_0 := v.Args[0] 14503 if v_0.Op != Op386SETEQ { 14504 break 14505 } 14506 cmp := v_0.Args[0] 14507 v_1 := v.Args[1] 14508 if v_1.Op != Op386SETEQ { 14509 break 14510 } 14511 if cmp != v_1.Args[0] { 14512 break 14513 } 14514 yes := b.Succs[0] 14515 no := b.Succs[1] 14516 b.Kind = Block386EQ 14517 b.SetControl(cmp) 14518 _ = yes 14519 _ = no 14520 return true 14521 } 14522 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 14523 // cond: 14524 // result: (NE cmp yes no) 14525 for { 14526 v := b.Control 14527 if v.Op != Op386TESTB { 14528 break 14529 } 14530 v_0 := v.Args[0] 14531 if v_0.Op != Op386SETNE { 14532 break 14533 } 14534 cmp := v_0.Args[0] 14535 v_1 := v.Args[1] 14536 if v_1.Op != Op386SETNE { 14537 break 14538 } 14539 if cmp != v_1.Args[0] { 14540 break 14541 } 14542 yes := b.Succs[0] 14543 no := b.Succs[1] 14544 b.Kind = Block386NE 14545 b.SetControl(cmp) 14546 _ = yes 14547 _ = no 14548 return true 14549 } 14550 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 14551 // cond: 14552 // result: (ULT cmp yes no) 14553 for { 14554 v := b.Control 14555 if v.Op != Op386TESTB { 14556 break 14557 } 14558 v_0 := v.Args[0] 14559 if v_0.Op != Op386SETB { 14560 break 14561 } 14562 cmp := v_0.Args[0] 14563 v_1 := v.Args[1] 14564 if v_1.Op != Op386SETB { 14565 break 14566 } 14567 if cmp != v_1.Args[0] { 14568 break 14569 } 14570 yes := b.Succs[0] 14571 no := b.Succs[1] 14572 b.Kind = Block386ULT 14573 b.SetControl(cmp) 14574 _ = yes 14575 _ = no 14576 return true 14577 } 14578 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 14579 // cond: 14580 // result: (ULE cmp yes no) 14581 for { 14582 v := b.Control 14583 if v.Op != Op386TESTB { 14584 break 14585 } 14586 v_0 := v.Args[0] 14587 if v_0.Op != Op386SETBE { 14588 break 14589 } 14590 cmp := v_0.Args[0] 14591 v_1 := v.Args[1] 14592 if v_1.Op != Op386SETBE { 14593 break 14594 } 14595 if cmp != v_1.Args[0] { 14596 break 14597 } 14598 yes := b.Succs[0] 14599 no := b.Succs[1] 14600 b.Kind = Block386ULE 14601 b.SetControl(cmp) 14602 _ = yes 14603 _ = no 14604 return true 14605 } 14606 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 14607 // cond: 14608 // result: (UGT cmp yes no) 14609 for { 14610 v := b.Control 14611 if v.Op != Op386TESTB { 14612 break 14613 } 14614 v_0 := v.Args[0] 14615 if v_0.Op != Op386SETA { 14616 break 14617 } 14618 cmp := v_0.Args[0] 14619 v_1 := v.Args[1] 14620 if v_1.Op != Op386SETA { 14621 break 14622 } 14623 if cmp != v_1.Args[0] { 14624 break 14625 } 14626 yes := b.Succs[0] 14627 no := b.Succs[1] 14628 b.Kind = Block386UGT 14629 b.SetControl(cmp) 14630 _ = yes 14631 _ = no 14632 return true 14633 } 14634 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 14635 // cond: 14636 // result: (UGE cmp yes no) 14637 for { 14638 v := b.Control 14639 if v.Op != Op386TESTB { 14640 break 14641 } 14642 v_0 := v.Args[0] 14643 if v_0.Op != Op386SETAE { 14644 break 14645 } 14646 cmp := v_0.Args[0] 14647 v_1 := v.Args[1] 14648 if v_1.Op != Op386SETAE { 14649 break 14650 } 14651 if cmp != v_1.Args[0] { 14652 break 14653 } 14654 yes := b.Succs[0] 14655 no := b.Succs[1] 14656 b.Kind = Block386UGE 14657 b.SetControl(cmp) 14658 _ = yes 14659 _ = no 14660 return true 14661 } 14662 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 14663 // cond: 14664 // result: (UGT cmp yes no) 14665 for { 14666 v := b.Control 14667 if v.Op != Op386TESTB { 14668 break 14669 } 14670 v_0 := v.Args[0] 14671 if v_0.Op != Op386SETGF { 14672 break 14673 } 14674 cmp := v_0.Args[0] 14675 v_1 := v.Args[1] 14676 if v_1.Op != Op386SETGF { 14677 break 14678 } 14679 if cmp != v_1.Args[0] { 14680 break 14681 } 14682 yes := b.Succs[0] 14683 no := b.Succs[1] 14684 b.Kind = Block386UGT 14685 b.SetControl(cmp) 14686 _ = yes 14687 _ = no 14688 return true 14689 } 14690 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 14691 // cond: 14692 // result: (UGE cmp yes no) 14693 for { 14694 v := b.Control 14695 if v.Op != Op386TESTB { 14696 break 14697 } 14698 v_0 := v.Args[0] 14699 if v_0.Op != Op386SETGEF { 14700 break 14701 } 14702 cmp := v_0.Args[0] 14703 v_1 := v.Args[1] 14704 if v_1.Op != Op386SETGEF { 14705 break 14706 } 14707 if cmp != v_1.Args[0] { 14708 break 14709 } 14710 yes := b.Succs[0] 14711 no := b.Succs[1] 14712 b.Kind = Block386UGE 14713 b.SetControl(cmp) 14714 _ = yes 14715 _ = no 14716 return true 14717 } 14718 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 14719 // cond: 14720 // result: (EQF cmp yes no) 14721 for { 14722 v := b.Control 14723 if v.Op != Op386TESTB { 14724 break 14725 } 14726 v_0 := v.Args[0] 14727 if v_0.Op != Op386SETEQF { 14728 break 14729 } 14730 cmp := v_0.Args[0] 14731 v_1 := v.Args[1] 14732 if v_1.Op != Op386SETEQF { 14733 break 14734 } 14735 if cmp != v_1.Args[0] { 14736 break 14737 } 14738 yes := b.Succs[0] 14739 no := b.Succs[1] 14740 b.Kind = Block386EQF 14741 b.SetControl(cmp) 14742 _ = yes 14743 _ = no 14744 return true 14745 } 14746 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 14747 // cond: 14748 // result: (NEF cmp yes no) 14749 for { 14750 v := b.Control 14751 if v.Op != Op386TESTB { 14752 break 14753 } 14754 v_0 := v.Args[0] 14755 if v_0.Op != Op386SETNEF { 14756 break 14757 } 14758 cmp := v_0.Args[0] 14759 v_1 := v.Args[1] 14760 if v_1.Op != Op386SETNEF { 14761 break 14762 } 14763 if cmp != v_1.Args[0] { 14764 break 14765 } 14766 yes := b.Succs[0] 14767 no := b.Succs[1] 14768 b.Kind = Block386NEF 14769 b.SetControl(cmp) 14770 _ = yes 14771 _ = no 14772 return true 14773 } 14774 // match: (NE (InvertFlags cmp) yes no) 14775 // cond: 14776 // result: (NE cmp yes no) 14777 for { 14778 v := b.Control 14779 if v.Op != Op386InvertFlags { 14780 break 14781 } 14782 cmp := v.Args[0] 14783 yes := b.Succs[0] 14784 no := b.Succs[1] 14785 b.Kind = Block386NE 14786 b.SetControl(cmp) 14787 _ = yes 14788 _ = no 14789 return true 14790 } 14791 // match: (NE (FlagEQ) yes no) 14792 // cond: 14793 // result: (First nil no yes) 14794 for { 14795 v := b.Control 14796 if v.Op != Op386FlagEQ { 14797 break 14798 } 14799 yes := b.Succs[0] 14800 no := b.Succs[1] 14801 b.Kind = BlockFirst 14802 b.SetControl(nil) 14803 b.swapSuccessors() 14804 _ = no 14805 _ = yes 14806 return true 14807 } 14808 // match: (NE (FlagLT_ULT) yes no) 14809 // cond: 14810 // result: (First nil yes no) 14811 for { 14812 v := b.Control 14813 if v.Op != Op386FlagLT_ULT { 14814 break 14815 } 14816 yes := b.Succs[0] 14817 no := b.Succs[1] 14818 b.Kind = BlockFirst 14819 b.SetControl(nil) 14820 _ = yes 14821 _ = no 14822 return true 14823 } 14824 // match: (NE (FlagLT_UGT) yes no) 14825 // cond: 14826 // result: (First nil yes no) 14827 for { 14828 v := b.Control 14829 if v.Op != Op386FlagLT_UGT { 14830 break 14831 } 14832 yes := b.Succs[0] 14833 no := b.Succs[1] 14834 b.Kind = BlockFirst 14835 b.SetControl(nil) 14836 _ = yes 14837 _ = no 14838 return true 14839 } 14840 // match: (NE (FlagGT_ULT) yes no) 14841 // cond: 14842 // result: (First nil yes no) 14843 for { 14844 v := b.Control 14845 if v.Op != Op386FlagGT_ULT { 14846 break 14847 } 14848 yes := b.Succs[0] 14849 no := b.Succs[1] 14850 b.Kind = BlockFirst 14851 b.SetControl(nil) 14852 _ = yes 14853 _ = no 14854 return true 14855 } 14856 // match: (NE (FlagGT_UGT) yes no) 14857 // cond: 14858 // result: (First nil yes no) 14859 for { 14860 v := b.Control 14861 if v.Op != Op386FlagGT_UGT { 14862 break 14863 } 14864 yes := b.Succs[0] 14865 no := b.Succs[1] 14866 b.Kind = BlockFirst 14867 b.SetControl(nil) 14868 _ = yes 14869 _ = no 14870 return true 14871 } 14872 case Block386UGE: 14873 // match: (UGE (InvertFlags cmp) yes no) 14874 // cond: 14875 // result: (ULE cmp yes no) 14876 for { 14877 v := b.Control 14878 if v.Op != Op386InvertFlags { 14879 break 14880 } 14881 cmp := v.Args[0] 14882 yes := b.Succs[0] 14883 no := b.Succs[1] 14884 b.Kind = Block386ULE 14885 b.SetControl(cmp) 14886 _ = yes 14887 _ = no 14888 return true 14889 } 14890 // match: (UGE (FlagEQ) yes no) 14891 // cond: 14892 // result: (First nil yes no) 14893 for { 14894 v := b.Control 14895 if v.Op != Op386FlagEQ { 14896 break 14897 } 14898 yes := b.Succs[0] 14899 no := b.Succs[1] 14900 b.Kind = BlockFirst 14901 b.SetControl(nil) 14902 _ = yes 14903 _ = no 14904 return true 14905 } 14906 // match: (UGE (FlagLT_ULT) yes no) 14907 // cond: 14908 // result: (First nil no yes) 14909 for { 14910 v := b.Control 14911 if v.Op != Op386FlagLT_ULT { 14912 break 14913 } 14914 yes := b.Succs[0] 14915 no := b.Succs[1] 14916 b.Kind = BlockFirst 14917 b.SetControl(nil) 14918 b.swapSuccessors() 14919 _ = no 14920 _ = yes 14921 return true 14922 } 14923 // match: (UGE (FlagLT_UGT) yes no) 14924 // cond: 14925 // result: (First nil yes no) 14926 for { 14927 v := b.Control 14928 if v.Op != Op386FlagLT_UGT { 14929 break 14930 } 14931 yes := b.Succs[0] 14932 no := b.Succs[1] 14933 b.Kind = BlockFirst 14934 b.SetControl(nil) 14935 _ = yes 14936 _ = no 14937 return true 14938 } 14939 // match: (UGE (FlagGT_ULT) yes no) 14940 // cond: 14941 // result: (First nil no yes) 14942 for { 14943 v := b.Control 14944 if v.Op != Op386FlagGT_ULT { 14945 break 14946 } 14947 yes := b.Succs[0] 14948 no := b.Succs[1] 14949 b.Kind = BlockFirst 14950 b.SetControl(nil) 14951 b.swapSuccessors() 14952 _ = no 14953 _ = yes 14954 return true 14955 } 14956 // match: (UGE (FlagGT_UGT) yes no) 14957 // cond: 14958 // result: (First nil yes no) 14959 for { 14960 v := b.Control 14961 if v.Op != Op386FlagGT_UGT { 14962 break 14963 } 14964 yes := b.Succs[0] 14965 no := b.Succs[1] 14966 b.Kind = BlockFirst 14967 b.SetControl(nil) 14968 _ = yes 14969 _ = no 14970 return true 14971 } 14972 case Block386UGT: 14973 // match: (UGT (InvertFlags cmp) yes no) 14974 // cond: 14975 // result: (ULT cmp yes no) 14976 for { 14977 v := b.Control 14978 if v.Op != Op386InvertFlags { 14979 break 14980 } 14981 cmp := v.Args[0] 14982 yes := b.Succs[0] 14983 no := b.Succs[1] 14984 b.Kind = Block386ULT 14985 b.SetControl(cmp) 14986 _ = yes 14987 _ = no 14988 return true 14989 } 14990 // match: (UGT (FlagEQ) yes no) 14991 // cond: 14992 // result: (First nil no yes) 14993 for { 14994 v := b.Control 14995 if v.Op != Op386FlagEQ { 14996 break 14997 } 14998 yes := b.Succs[0] 14999 no := b.Succs[1] 15000 b.Kind = BlockFirst 15001 b.SetControl(nil) 15002 b.swapSuccessors() 15003 _ = no 15004 _ = yes 15005 return true 15006 } 15007 // match: (UGT (FlagLT_ULT) yes no) 15008 // cond: 15009 // result: (First nil no yes) 15010 for { 15011 v := b.Control 15012 if v.Op != Op386FlagLT_ULT { 15013 break 15014 } 15015 yes := b.Succs[0] 15016 no := b.Succs[1] 15017 b.Kind = BlockFirst 15018 b.SetControl(nil) 15019 b.swapSuccessors() 15020 _ = no 15021 _ = yes 15022 return true 15023 } 15024 // match: (UGT (FlagLT_UGT) yes no) 15025 // cond: 15026 // result: (First nil yes no) 15027 for { 15028 v := b.Control 15029 if v.Op != Op386FlagLT_UGT { 15030 break 15031 } 15032 yes := b.Succs[0] 15033 no := b.Succs[1] 15034 b.Kind = BlockFirst 15035 b.SetControl(nil) 15036 _ = yes 15037 _ = no 15038 return true 15039 } 15040 // match: (UGT (FlagGT_ULT) yes no) 15041 // cond: 15042 // result: (First nil no yes) 15043 for { 15044 v := b.Control 15045 if v.Op != Op386FlagGT_ULT { 15046 break 15047 } 15048 yes := b.Succs[0] 15049 no := b.Succs[1] 15050 b.Kind = BlockFirst 15051 b.SetControl(nil) 15052 b.swapSuccessors() 15053 _ = no 15054 _ = yes 15055 return true 15056 } 15057 // match: (UGT (FlagGT_UGT) yes no) 15058 // cond: 15059 // result: (First nil yes no) 15060 for { 15061 v := b.Control 15062 if v.Op != Op386FlagGT_UGT { 15063 break 15064 } 15065 yes := b.Succs[0] 15066 no := b.Succs[1] 15067 b.Kind = BlockFirst 15068 b.SetControl(nil) 15069 _ = yes 15070 _ = no 15071 return true 15072 } 15073 case Block386ULE: 15074 // match: (ULE (InvertFlags cmp) yes no) 15075 // cond: 15076 // result: (UGE cmp yes no) 15077 for { 15078 v := b.Control 15079 if v.Op != Op386InvertFlags { 15080 break 15081 } 15082 cmp := v.Args[0] 15083 yes := b.Succs[0] 15084 no := b.Succs[1] 15085 b.Kind = Block386UGE 15086 b.SetControl(cmp) 15087 _ = yes 15088 _ = no 15089 return true 15090 } 15091 // match: (ULE (FlagEQ) yes no) 15092 // cond: 15093 // result: (First nil yes no) 15094 for { 15095 v := b.Control 15096 if v.Op != Op386FlagEQ { 15097 break 15098 } 15099 yes := b.Succs[0] 15100 no := b.Succs[1] 15101 b.Kind = BlockFirst 15102 b.SetControl(nil) 15103 _ = yes 15104 _ = no 15105 return true 15106 } 15107 // match: (ULE (FlagLT_ULT) yes no) 15108 // cond: 15109 // result: (First nil yes no) 15110 for { 15111 v := b.Control 15112 if v.Op != Op386FlagLT_ULT { 15113 break 15114 } 15115 yes := b.Succs[0] 15116 no := b.Succs[1] 15117 b.Kind = BlockFirst 15118 b.SetControl(nil) 15119 _ = yes 15120 _ = no 15121 return true 15122 } 15123 // match: (ULE (FlagLT_UGT) yes no) 15124 // cond: 15125 // result: (First nil no yes) 15126 for { 15127 v := b.Control 15128 if v.Op != Op386FlagLT_UGT { 15129 break 15130 } 15131 yes := b.Succs[0] 15132 no := b.Succs[1] 15133 b.Kind = BlockFirst 15134 b.SetControl(nil) 15135 b.swapSuccessors() 15136 _ = no 15137 _ = yes 15138 return true 15139 } 15140 // match: (ULE (FlagGT_ULT) yes no) 15141 // cond: 15142 // result: (First nil yes no) 15143 for { 15144 v := b.Control 15145 if v.Op != Op386FlagGT_ULT { 15146 break 15147 } 15148 yes := b.Succs[0] 15149 no := b.Succs[1] 15150 b.Kind = BlockFirst 15151 b.SetControl(nil) 15152 _ = yes 15153 _ = no 15154 return true 15155 } 15156 // match: (ULE (FlagGT_UGT) yes no) 15157 // cond: 15158 // result: (First nil no yes) 15159 for { 15160 v := b.Control 15161 if v.Op != Op386FlagGT_UGT { 15162 break 15163 } 15164 yes := b.Succs[0] 15165 no := b.Succs[1] 15166 b.Kind = BlockFirst 15167 b.SetControl(nil) 15168 b.swapSuccessors() 15169 _ = no 15170 _ = yes 15171 return true 15172 } 15173 case Block386ULT: 15174 // match: (ULT (InvertFlags cmp) yes no) 15175 // cond: 15176 // result: (UGT cmp yes no) 15177 for { 15178 v := b.Control 15179 if v.Op != Op386InvertFlags { 15180 break 15181 } 15182 cmp := v.Args[0] 15183 yes := b.Succs[0] 15184 no := b.Succs[1] 15185 b.Kind = Block386UGT 15186 b.SetControl(cmp) 15187 _ = yes 15188 _ = no 15189 return true 15190 } 15191 // match: (ULT (FlagEQ) yes no) 15192 // cond: 15193 // result: (First nil no yes) 15194 for { 15195 v := b.Control 15196 if v.Op != Op386FlagEQ { 15197 break 15198 } 15199 yes := b.Succs[0] 15200 no := b.Succs[1] 15201 b.Kind = BlockFirst 15202 b.SetControl(nil) 15203 b.swapSuccessors() 15204 _ = no 15205 _ = yes 15206 return true 15207 } 15208 // match: (ULT (FlagLT_ULT) yes no) 15209 // cond: 15210 // result: (First nil yes no) 15211 for { 15212 v := b.Control 15213 if v.Op != Op386FlagLT_ULT { 15214 break 15215 } 15216 yes := b.Succs[0] 15217 no := b.Succs[1] 15218 b.Kind = BlockFirst 15219 b.SetControl(nil) 15220 _ = yes 15221 _ = no 15222 return true 15223 } 15224 // match: (ULT (FlagLT_UGT) yes no) 15225 // cond: 15226 // result: (First nil no yes) 15227 for { 15228 v := b.Control 15229 if v.Op != Op386FlagLT_UGT { 15230 break 15231 } 15232 yes := b.Succs[0] 15233 no := b.Succs[1] 15234 b.Kind = BlockFirst 15235 b.SetControl(nil) 15236 b.swapSuccessors() 15237 _ = no 15238 _ = yes 15239 return true 15240 } 15241 // match: (ULT (FlagGT_ULT) yes no) 15242 // cond: 15243 // result: (First nil yes no) 15244 for { 15245 v := b.Control 15246 if v.Op != Op386FlagGT_ULT { 15247 break 15248 } 15249 yes := b.Succs[0] 15250 no := b.Succs[1] 15251 b.Kind = BlockFirst 15252 b.SetControl(nil) 15253 _ = yes 15254 _ = no 15255 return true 15256 } 15257 // match: (ULT (FlagGT_UGT) yes no) 15258 // cond: 15259 // result: (First nil no yes) 15260 for { 15261 v := b.Control 15262 if v.Op != Op386FlagGT_UGT { 15263 break 15264 } 15265 yes := b.Succs[0] 15266 no := b.Succs[1] 15267 b.Kind = BlockFirst 15268 b.SetControl(nil) 15269 b.swapSuccessors() 15270 _ = no 15271 _ = yes 15272 return true 15273 } 15274 } 15275 return false 15276 }