github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/cmd/compile/internal/ssa/rewrite386.go (about) 1 // Code generated from gen/386.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 10 var _ = math.MinInt8 // in case not otherwise used 11 var _ = obj.ANOP // in case not otherwise used 12 var _ = objabi.GOROOT // in case not otherwise used 13 14 func rewriteValue386(v *Value) bool { 15 switch v.Op { 16 case Op386ADCL: 17 return rewriteValue386_Op386ADCL_0(v) 18 case Op386ADDL: 19 return rewriteValue386_Op386ADDL_0(v) || rewriteValue386_Op386ADDL_10(v) || rewriteValue386_Op386ADDL_20(v) 20 case Op386ADDLcarry: 21 return rewriteValue386_Op386ADDLcarry_0(v) 22 case Op386ADDLconst: 23 return rewriteValue386_Op386ADDLconst_0(v) 24 case Op386ANDL: 25 return rewriteValue386_Op386ANDL_0(v) 26 case Op386ANDLconst: 27 return rewriteValue386_Op386ANDLconst_0(v) 28 case Op386CMPB: 29 return rewriteValue386_Op386CMPB_0(v) 30 case Op386CMPBconst: 31 return rewriteValue386_Op386CMPBconst_0(v) 32 case Op386CMPL: 33 return rewriteValue386_Op386CMPL_0(v) 34 case Op386CMPLconst: 35 return rewriteValue386_Op386CMPLconst_0(v) 36 case Op386CMPW: 37 return rewriteValue386_Op386CMPW_0(v) 38 case Op386CMPWconst: 39 return rewriteValue386_Op386CMPWconst_0(v) 40 case Op386LEAL: 41 return rewriteValue386_Op386LEAL_0(v) 42 case Op386LEAL1: 43 return rewriteValue386_Op386LEAL1_0(v) 44 case Op386LEAL2: 45 return rewriteValue386_Op386LEAL2_0(v) 46 case Op386LEAL4: 47 return rewriteValue386_Op386LEAL4_0(v) 48 case Op386LEAL8: 49 return rewriteValue386_Op386LEAL8_0(v) 50 case Op386MOVBLSX: 51 return rewriteValue386_Op386MOVBLSX_0(v) 52 case Op386MOVBLSXload: 53 return rewriteValue386_Op386MOVBLSXload_0(v) 54 case Op386MOVBLZX: 55 return rewriteValue386_Op386MOVBLZX_0(v) 56 case Op386MOVBload: 57 return rewriteValue386_Op386MOVBload_0(v) 58 case Op386MOVBloadidx1: 59 return rewriteValue386_Op386MOVBloadidx1_0(v) 60 case Op386MOVBstore: 61 return rewriteValue386_Op386MOVBstore_0(v) 62 case Op386MOVBstoreconst: 63 return rewriteValue386_Op386MOVBstoreconst_0(v) 64 case Op386MOVBstoreconstidx1: 65 return rewriteValue386_Op386MOVBstoreconstidx1_0(v) 66 case Op386MOVBstoreidx1: 67 return rewriteValue386_Op386MOVBstoreidx1_0(v) || rewriteValue386_Op386MOVBstoreidx1_10(v) 68 case Op386MOVLload: 69 return rewriteValue386_Op386MOVLload_0(v) 70 case Op386MOVLloadidx1: 71 return rewriteValue386_Op386MOVLloadidx1_0(v) 72 case Op386MOVLloadidx4: 73 return rewriteValue386_Op386MOVLloadidx4_0(v) 74 case Op386MOVLstore: 75 return rewriteValue386_Op386MOVLstore_0(v) 76 case Op386MOVLstoreconst: 77 return rewriteValue386_Op386MOVLstoreconst_0(v) 78 case Op386MOVLstoreconstidx1: 79 return rewriteValue386_Op386MOVLstoreconstidx1_0(v) 80 case Op386MOVLstoreconstidx4: 81 return rewriteValue386_Op386MOVLstoreconstidx4_0(v) 82 case Op386MOVLstoreidx1: 83 return rewriteValue386_Op386MOVLstoreidx1_0(v) 84 case Op386MOVLstoreidx4: 85 return rewriteValue386_Op386MOVLstoreidx4_0(v) 86 case Op386MOVSDconst: 87 return rewriteValue386_Op386MOVSDconst_0(v) 88 case Op386MOVSDload: 89 return rewriteValue386_Op386MOVSDload_0(v) 90 case Op386MOVSDloadidx1: 91 return rewriteValue386_Op386MOVSDloadidx1_0(v) 92 case Op386MOVSDloadidx8: 93 return rewriteValue386_Op386MOVSDloadidx8_0(v) 94 case Op386MOVSDstore: 95 return rewriteValue386_Op386MOVSDstore_0(v) 96 case Op386MOVSDstoreidx1: 97 return rewriteValue386_Op386MOVSDstoreidx1_0(v) 98 case Op386MOVSDstoreidx8: 99 return rewriteValue386_Op386MOVSDstoreidx8_0(v) 100 case Op386MOVSSconst: 101 return rewriteValue386_Op386MOVSSconst_0(v) 102 case Op386MOVSSload: 103 return rewriteValue386_Op386MOVSSload_0(v) 104 case Op386MOVSSloadidx1: 105 return rewriteValue386_Op386MOVSSloadidx1_0(v) 106 case Op386MOVSSloadidx4: 107 return rewriteValue386_Op386MOVSSloadidx4_0(v) 108 case Op386MOVSSstore: 109 return rewriteValue386_Op386MOVSSstore_0(v) 110 case Op386MOVSSstoreidx1: 111 return rewriteValue386_Op386MOVSSstoreidx1_0(v) 112 case Op386MOVSSstoreidx4: 113 return rewriteValue386_Op386MOVSSstoreidx4_0(v) 114 case Op386MOVWLSX: 115 return rewriteValue386_Op386MOVWLSX_0(v) 116 case Op386MOVWLSXload: 117 return rewriteValue386_Op386MOVWLSXload_0(v) 118 case Op386MOVWLZX: 119 return rewriteValue386_Op386MOVWLZX_0(v) 120 case Op386MOVWload: 121 return rewriteValue386_Op386MOVWload_0(v) 122 case Op386MOVWloadidx1: 123 return rewriteValue386_Op386MOVWloadidx1_0(v) 124 case Op386MOVWloadidx2: 125 return rewriteValue386_Op386MOVWloadidx2_0(v) 126 case Op386MOVWstore: 127 return rewriteValue386_Op386MOVWstore_0(v) 128 case Op386MOVWstoreconst: 129 return rewriteValue386_Op386MOVWstoreconst_0(v) 130 case Op386MOVWstoreconstidx1: 131 return rewriteValue386_Op386MOVWstoreconstidx1_0(v) 132 case Op386MOVWstoreconstidx2: 133 return rewriteValue386_Op386MOVWstoreconstidx2_0(v) 134 case Op386MOVWstoreidx1: 135 return rewriteValue386_Op386MOVWstoreidx1_0(v) || rewriteValue386_Op386MOVWstoreidx1_10(v) 136 case Op386MOVWstoreidx2: 137 return rewriteValue386_Op386MOVWstoreidx2_0(v) 138 case Op386MULL: 139 return rewriteValue386_Op386MULL_0(v) 140 case Op386MULLconst: 141 return rewriteValue386_Op386MULLconst_0(v) || rewriteValue386_Op386MULLconst_10(v) || rewriteValue386_Op386MULLconst_20(v) 142 case Op386NEGL: 143 return rewriteValue386_Op386NEGL_0(v) 144 case Op386NOTL: 145 return rewriteValue386_Op386NOTL_0(v) 146 case Op386ORL: 147 return rewriteValue386_Op386ORL_0(v) || rewriteValue386_Op386ORL_10(v) || rewriteValue386_Op386ORL_20(v) || rewriteValue386_Op386ORL_30(v) || rewriteValue386_Op386ORL_40(v) || rewriteValue386_Op386ORL_50(v) 148 case Op386ORLconst: 149 return rewriteValue386_Op386ORLconst_0(v) 150 case Op386ROLBconst: 151 return rewriteValue386_Op386ROLBconst_0(v) 152 case Op386ROLLconst: 153 return rewriteValue386_Op386ROLLconst_0(v) 154 case Op386ROLWconst: 155 return rewriteValue386_Op386ROLWconst_0(v) 156 case Op386SARB: 157 return rewriteValue386_Op386SARB_0(v) 158 case Op386SARBconst: 159 return rewriteValue386_Op386SARBconst_0(v) 160 case Op386SARL: 161 return rewriteValue386_Op386SARL_0(v) 162 case Op386SARLconst: 163 return rewriteValue386_Op386SARLconst_0(v) 164 case Op386SARW: 165 return rewriteValue386_Op386SARW_0(v) 166 case Op386SARWconst: 167 return rewriteValue386_Op386SARWconst_0(v) 168 case Op386SBBL: 169 return rewriteValue386_Op386SBBL_0(v) 170 case Op386SBBLcarrymask: 171 return rewriteValue386_Op386SBBLcarrymask_0(v) 172 case Op386SETA: 173 return rewriteValue386_Op386SETA_0(v) 174 case Op386SETAE: 175 return rewriteValue386_Op386SETAE_0(v) 176 case Op386SETB: 177 return rewriteValue386_Op386SETB_0(v) 178 case Op386SETBE: 179 return rewriteValue386_Op386SETBE_0(v) 180 case Op386SETEQ: 181 return rewriteValue386_Op386SETEQ_0(v) 182 case Op386SETG: 183 return rewriteValue386_Op386SETG_0(v) 184 case Op386SETGE: 185 return rewriteValue386_Op386SETGE_0(v) 186 case Op386SETL: 187 return rewriteValue386_Op386SETL_0(v) 188 case Op386SETLE: 189 return rewriteValue386_Op386SETLE_0(v) 190 case Op386SETNE: 191 return rewriteValue386_Op386SETNE_0(v) 192 case Op386SHLL: 193 return rewriteValue386_Op386SHLL_0(v) 194 case Op386SHLLconst: 195 return rewriteValue386_Op386SHLLconst_0(v) 196 case Op386SHRB: 197 return rewriteValue386_Op386SHRB_0(v) 198 case Op386SHRBconst: 199 return rewriteValue386_Op386SHRBconst_0(v) 200 case Op386SHRL: 201 return rewriteValue386_Op386SHRL_0(v) 202 case Op386SHRLconst: 203 return rewriteValue386_Op386SHRLconst_0(v) 204 case Op386SHRW: 205 return rewriteValue386_Op386SHRW_0(v) 206 case Op386SHRWconst: 207 return rewriteValue386_Op386SHRWconst_0(v) 208 case Op386SUBL: 209 return rewriteValue386_Op386SUBL_0(v) 210 case Op386SUBLcarry: 211 return rewriteValue386_Op386SUBLcarry_0(v) 212 case Op386SUBLconst: 213 return rewriteValue386_Op386SUBLconst_0(v) 214 case Op386XORL: 215 return rewriteValue386_Op386XORL_0(v) 216 case Op386XORLconst: 217 return rewriteValue386_Op386XORLconst_0(v) 218 case OpAdd16: 219 return rewriteValue386_OpAdd16_0(v) 220 case OpAdd32: 221 return rewriteValue386_OpAdd32_0(v) 222 case OpAdd32F: 223 return rewriteValue386_OpAdd32F_0(v) 224 case OpAdd32carry: 225 return rewriteValue386_OpAdd32carry_0(v) 226 case OpAdd32withcarry: 227 return rewriteValue386_OpAdd32withcarry_0(v) 228 case OpAdd64F: 229 return rewriteValue386_OpAdd64F_0(v) 230 case OpAdd8: 231 return rewriteValue386_OpAdd8_0(v) 232 case OpAddPtr: 233 return rewriteValue386_OpAddPtr_0(v) 234 case OpAddr: 235 return rewriteValue386_OpAddr_0(v) 236 case OpAnd16: 237 return rewriteValue386_OpAnd16_0(v) 238 case OpAnd32: 239 return rewriteValue386_OpAnd32_0(v) 240 case OpAnd8: 241 return rewriteValue386_OpAnd8_0(v) 242 case OpAndB: 243 return rewriteValue386_OpAndB_0(v) 244 case OpAvg32u: 245 return rewriteValue386_OpAvg32u_0(v) 246 case OpBswap32: 247 return rewriteValue386_OpBswap32_0(v) 248 case OpClosureCall: 249 return rewriteValue386_OpClosureCall_0(v) 250 case OpCom16: 251 return rewriteValue386_OpCom16_0(v) 252 case OpCom32: 253 return rewriteValue386_OpCom32_0(v) 254 case OpCom8: 255 return rewriteValue386_OpCom8_0(v) 256 case OpConst16: 257 return rewriteValue386_OpConst16_0(v) 258 case OpConst32: 259 return rewriteValue386_OpConst32_0(v) 260 case OpConst32F: 261 return rewriteValue386_OpConst32F_0(v) 262 case OpConst64F: 263 return rewriteValue386_OpConst64F_0(v) 264 case OpConst8: 265 return rewriteValue386_OpConst8_0(v) 266 case OpConstBool: 267 return rewriteValue386_OpConstBool_0(v) 268 case OpConstNil: 269 return rewriteValue386_OpConstNil_0(v) 270 case OpConvert: 271 return rewriteValue386_OpConvert_0(v) 272 case OpCvt32Fto32: 273 return rewriteValue386_OpCvt32Fto32_0(v) 274 case OpCvt32Fto64F: 275 return rewriteValue386_OpCvt32Fto64F_0(v) 276 case OpCvt32to32F: 277 return rewriteValue386_OpCvt32to32F_0(v) 278 case OpCvt32to64F: 279 return rewriteValue386_OpCvt32to64F_0(v) 280 case OpCvt64Fto32: 281 return rewriteValue386_OpCvt64Fto32_0(v) 282 case OpCvt64Fto32F: 283 return rewriteValue386_OpCvt64Fto32F_0(v) 284 case OpDiv16: 285 return rewriteValue386_OpDiv16_0(v) 286 case OpDiv16u: 287 return rewriteValue386_OpDiv16u_0(v) 288 case OpDiv32: 289 return rewriteValue386_OpDiv32_0(v) 290 case OpDiv32F: 291 return rewriteValue386_OpDiv32F_0(v) 292 case OpDiv32u: 293 return rewriteValue386_OpDiv32u_0(v) 294 case OpDiv64F: 295 return rewriteValue386_OpDiv64F_0(v) 296 case OpDiv8: 297 return rewriteValue386_OpDiv8_0(v) 298 case OpDiv8u: 299 return rewriteValue386_OpDiv8u_0(v) 300 case OpEq16: 301 return rewriteValue386_OpEq16_0(v) 302 case OpEq32: 303 return rewriteValue386_OpEq32_0(v) 304 case OpEq32F: 305 return rewriteValue386_OpEq32F_0(v) 306 case OpEq64F: 307 return rewriteValue386_OpEq64F_0(v) 308 case OpEq8: 309 return rewriteValue386_OpEq8_0(v) 310 case OpEqB: 311 return rewriteValue386_OpEqB_0(v) 312 case OpEqPtr: 313 return rewriteValue386_OpEqPtr_0(v) 314 case OpGeq16: 315 return rewriteValue386_OpGeq16_0(v) 316 case OpGeq16U: 317 return rewriteValue386_OpGeq16U_0(v) 318 case OpGeq32: 319 return rewriteValue386_OpGeq32_0(v) 320 case OpGeq32F: 321 return rewriteValue386_OpGeq32F_0(v) 322 case OpGeq32U: 323 return rewriteValue386_OpGeq32U_0(v) 324 case OpGeq64F: 325 return rewriteValue386_OpGeq64F_0(v) 326 case OpGeq8: 327 return rewriteValue386_OpGeq8_0(v) 328 case OpGeq8U: 329 return rewriteValue386_OpGeq8U_0(v) 330 case OpGetClosurePtr: 331 return rewriteValue386_OpGetClosurePtr_0(v) 332 case OpGetG: 333 return rewriteValue386_OpGetG_0(v) 334 case OpGreater16: 335 return rewriteValue386_OpGreater16_0(v) 336 case OpGreater16U: 337 return rewriteValue386_OpGreater16U_0(v) 338 case OpGreater32: 339 return rewriteValue386_OpGreater32_0(v) 340 case OpGreater32F: 341 return rewriteValue386_OpGreater32F_0(v) 342 case OpGreater32U: 343 return rewriteValue386_OpGreater32U_0(v) 344 case OpGreater64F: 345 return rewriteValue386_OpGreater64F_0(v) 346 case OpGreater8: 347 return rewriteValue386_OpGreater8_0(v) 348 case OpGreater8U: 349 return rewriteValue386_OpGreater8U_0(v) 350 case OpHmul32: 351 return rewriteValue386_OpHmul32_0(v) 352 case OpHmul32u: 353 return rewriteValue386_OpHmul32u_0(v) 354 case OpInterCall: 355 return rewriteValue386_OpInterCall_0(v) 356 case OpIsInBounds: 357 return rewriteValue386_OpIsInBounds_0(v) 358 case OpIsNonNil: 359 return rewriteValue386_OpIsNonNil_0(v) 360 case OpIsSliceInBounds: 361 return rewriteValue386_OpIsSliceInBounds_0(v) 362 case OpLeq16: 363 return rewriteValue386_OpLeq16_0(v) 364 case OpLeq16U: 365 return rewriteValue386_OpLeq16U_0(v) 366 case OpLeq32: 367 return rewriteValue386_OpLeq32_0(v) 368 case OpLeq32F: 369 return rewriteValue386_OpLeq32F_0(v) 370 case OpLeq32U: 371 return rewriteValue386_OpLeq32U_0(v) 372 case OpLeq64F: 373 return rewriteValue386_OpLeq64F_0(v) 374 case OpLeq8: 375 return rewriteValue386_OpLeq8_0(v) 376 case OpLeq8U: 377 return rewriteValue386_OpLeq8U_0(v) 378 case OpLess16: 379 return rewriteValue386_OpLess16_0(v) 380 case OpLess16U: 381 return rewriteValue386_OpLess16U_0(v) 382 case OpLess32: 383 return rewriteValue386_OpLess32_0(v) 384 case OpLess32F: 385 return rewriteValue386_OpLess32F_0(v) 386 case OpLess32U: 387 return rewriteValue386_OpLess32U_0(v) 388 case OpLess64F: 389 return rewriteValue386_OpLess64F_0(v) 390 case OpLess8: 391 return rewriteValue386_OpLess8_0(v) 392 case OpLess8U: 393 return rewriteValue386_OpLess8U_0(v) 394 case OpLoad: 395 return rewriteValue386_OpLoad_0(v) 396 case OpLsh16x16: 397 return rewriteValue386_OpLsh16x16_0(v) 398 case OpLsh16x32: 399 return rewriteValue386_OpLsh16x32_0(v) 400 case OpLsh16x64: 401 return rewriteValue386_OpLsh16x64_0(v) 402 case OpLsh16x8: 403 return rewriteValue386_OpLsh16x8_0(v) 404 case OpLsh32x16: 405 return rewriteValue386_OpLsh32x16_0(v) 406 case OpLsh32x32: 407 return rewriteValue386_OpLsh32x32_0(v) 408 case OpLsh32x64: 409 return rewriteValue386_OpLsh32x64_0(v) 410 case OpLsh32x8: 411 return rewriteValue386_OpLsh32x8_0(v) 412 case OpLsh8x16: 413 return rewriteValue386_OpLsh8x16_0(v) 414 case OpLsh8x32: 415 return rewriteValue386_OpLsh8x32_0(v) 416 case OpLsh8x64: 417 return rewriteValue386_OpLsh8x64_0(v) 418 case OpLsh8x8: 419 return rewriteValue386_OpLsh8x8_0(v) 420 case OpMod16: 421 return rewriteValue386_OpMod16_0(v) 422 case OpMod16u: 423 return rewriteValue386_OpMod16u_0(v) 424 case OpMod32: 425 return rewriteValue386_OpMod32_0(v) 426 case OpMod32u: 427 return rewriteValue386_OpMod32u_0(v) 428 case OpMod8: 429 return rewriteValue386_OpMod8_0(v) 430 case OpMod8u: 431 return rewriteValue386_OpMod8u_0(v) 432 case OpMove: 433 return rewriteValue386_OpMove_0(v) || rewriteValue386_OpMove_10(v) 434 case OpMul16: 435 return rewriteValue386_OpMul16_0(v) 436 case OpMul32: 437 return rewriteValue386_OpMul32_0(v) 438 case OpMul32F: 439 return rewriteValue386_OpMul32F_0(v) 440 case OpMul32uhilo: 441 return rewriteValue386_OpMul32uhilo_0(v) 442 case OpMul64F: 443 return rewriteValue386_OpMul64F_0(v) 444 case OpMul8: 445 return rewriteValue386_OpMul8_0(v) 446 case OpNeg16: 447 return rewriteValue386_OpNeg16_0(v) 448 case OpNeg32: 449 return rewriteValue386_OpNeg32_0(v) 450 case OpNeg32F: 451 return rewriteValue386_OpNeg32F_0(v) 452 case OpNeg64F: 453 return rewriteValue386_OpNeg64F_0(v) 454 case OpNeg8: 455 return rewriteValue386_OpNeg8_0(v) 456 case OpNeq16: 457 return rewriteValue386_OpNeq16_0(v) 458 case OpNeq32: 459 return rewriteValue386_OpNeq32_0(v) 460 case OpNeq32F: 461 return rewriteValue386_OpNeq32F_0(v) 462 case OpNeq64F: 463 return rewriteValue386_OpNeq64F_0(v) 464 case OpNeq8: 465 return rewriteValue386_OpNeq8_0(v) 466 case OpNeqB: 467 return rewriteValue386_OpNeqB_0(v) 468 case OpNeqPtr: 469 return rewriteValue386_OpNeqPtr_0(v) 470 case OpNilCheck: 471 return rewriteValue386_OpNilCheck_0(v) 472 case OpNot: 473 return rewriteValue386_OpNot_0(v) 474 case OpOffPtr: 475 return rewriteValue386_OpOffPtr_0(v) 476 case OpOr16: 477 return rewriteValue386_OpOr16_0(v) 478 case OpOr32: 479 return rewriteValue386_OpOr32_0(v) 480 case OpOr8: 481 return rewriteValue386_OpOr8_0(v) 482 case OpOrB: 483 return rewriteValue386_OpOrB_0(v) 484 case OpRound32F: 485 return rewriteValue386_OpRound32F_0(v) 486 case OpRound64F: 487 return rewriteValue386_OpRound64F_0(v) 488 case OpRsh16Ux16: 489 return rewriteValue386_OpRsh16Ux16_0(v) 490 case OpRsh16Ux32: 491 return rewriteValue386_OpRsh16Ux32_0(v) 492 case OpRsh16Ux64: 493 return rewriteValue386_OpRsh16Ux64_0(v) 494 case OpRsh16Ux8: 495 return rewriteValue386_OpRsh16Ux8_0(v) 496 case OpRsh16x16: 497 return rewriteValue386_OpRsh16x16_0(v) 498 case OpRsh16x32: 499 return rewriteValue386_OpRsh16x32_0(v) 500 case OpRsh16x64: 501 return rewriteValue386_OpRsh16x64_0(v) 502 case OpRsh16x8: 503 return rewriteValue386_OpRsh16x8_0(v) 504 case OpRsh32Ux16: 505 return rewriteValue386_OpRsh32Ux16_0(v) 506 case OpRsh32Ux32: 507 return rewriteValue386_OpRsh32Ux32_0(v) 508 case OpRsh32Ux64: 509 return rewriteValue386_OpRsh32Ux64_0(v) 510 case OpRsh32Ux8: 511 return rewriteValue386_OpRsh32Ux8_0(v) 512 case OpRsh32x16: 513 return rewriteValue386_OpRsh32x16_0(v) 514 case OpRsh32x32: 515 return rewriteValue386_OpRsh32x32_0(v) 516 case OpRsh32x64: 517 return rewriteValue386_OpRsh32x64_0(v) 518 case OpRsh32x8: 519 return rewriteValue386_OpRsh32x8_0(v) 520 case OpRsh8Ux16: 521 return rewriteValue386_OpRsh8Ux16_0(v) 522 case OpRsh8Ux32: 523 return rewriteValue386_OpRsh8Ux32_0(v) 524 case OpRsh8Ux64: 525 return rewriteValue386_OpRsh8Ux64_0(v) 526 case OpRsh8Ux8: 527 return rewriteValue386_OpRsh8Ux8_0(v) 528 case OpRsh8x16: 529 return rewriteValue386_OpRsh8x16_0(v) 530 case OpRsh8x32: 531 return rewriteValue386_OpRsh8x32_0(v) 532 case OpRsh8x64: 533 return rewriteValue386_OpRsh8x64_0(v) 534 case OpRsh8x8: 535 return rewriteValue386_OpRsh8x8_0(v) 536 case OpSignExt16to32: 537 return rewriteValue386_OpSignExt16to32_0(v) 538 case OpSignExt8to16: 539 return rewriteValue386_OpSignExt8to16_0(v) 540 case OpSignExt8to32: 541 return rewriteValue386_OpSignExt8to32_0(v) 542 case OpSignmask: 543 return rewriteValue386_OpSignmask_0(v) 544 case OpSlicemask: 545 return rewriteValue386_OpSlicemask_0(v) 546 case OpSqrt: 547 return rewriteValue386_OpSqrt_0(v) 548 case OpStaticCall: 549 return rewriteValue386_OpStaticCall_0(v) 550 case OpStore: 551 return rewriteValue386_OpStore_0(v) 552 case OpSub16: 553 return rewriteValue386_OpSub16_0(v) 554 case OpSub32: 555 return rewriteValue386_OpSub32_0(v) 556 case OpSub32F: 557 return rewriteValue386_OpSub32F_0(v) 558 case OpSub32carry: 559 return rewriteValue386_OpSub32carry_0(v) 560 case OpSub32withcarry: 561 return rewriteValue386_OpSub32withcarry_0(v) 562 case OpSub64F: 563 return rewriteValue386_OpSub64F_0(v) 564 case OpSub8: 565 return rewriteValue386_OpSub8_0(v) 566 case OpSubPtr: 567 return rewriteValue386_OpSubPtr_0(v) 568 case OpTrunc16to8: 569 return rewriteValue386_OpTrunc16to8_0(v) 570 case OpTrunc32to16: 571 return rewriteValue386_OpTrunc32to16_0(v) 572 case OpTrunc32to8: 573 return rewriteValue386_OpTrunc32to8_0(v) 574 case OpXor16: 575 return rewriteValue386_OpXor16_0(v) 576 case OpXor32: 577 return rewriteValue386_OpXor32_0(v) 578 case OpXor8: 579 return rewriteValue386_OpXor8_0(v) 580 case OpZero: 581 return rewriteValue386_OpZero_0(v) || rewriteValue386_OpZero_10(v) 582 case OpZeroExt16to32: 583 return rewriteValue386_OpZeroExt16to32_0(v) 584 case OpZeroExt8to16: 585 return rewriteValue386_OpZeroExt8to16_0(v) 586 case OpZeroExt8to32: 587 return rewriteValue386_OpZeroExt8to32_0(v) 588 case OpZeromask: 589 return rewriteValue386_OpZeromask_0(v) 590 } 591 return false 592 } 593 func rewriteValue386_Op386ADCL_0(v *Value) bool { 594 // match: (ADCL x (MOVLconst [c]) f) 595 // cond: 596 // result: (ADCLconst [c] x f) 597 for { 598 x := v.Args[0] 599 v_1 := v.Args[1] 600 if v_1.Op != Op386MOVLconst { 601 break 602 } 603 c := v_1.AuxInt 604 f := v.Args[2] 605 v.reset(Op386ADCLconst) 606 v.AuxInt = c 607 v.AddArg(x) 608 v.AddArg(f) 609 return true 610 } 611 // match: (ADCL (MOVLconst [c]) x f) 612 // cond: 613 // result: (ADCLconst [c] x f) 614 for { 615 v_0 := v.Args[0] 616 if v_0.Op != Op386MOVLconst { 617 break 618 } 619 c := v_0.AuxInt 620 x := v.Args[1] 621 f := v.Args[2] 622 v.reset(Op386ADCLconst) 623 v.AuxInt = c 624 v.AddArg(x) 625 v.AddArg(f) 626 return true 627 } 628 // match: (ADCL (MOVLconst [c]) x f) 629 // cond: 630 // result: (ADCLconst [c] x f) 631 for { 632 v_0 := v.Args[0] 633 if v_0.Op != Op386MOVLconst { 634 break 635 } 636 c := v_0.AuxInt 637 x := v.Args[1] 638 f := v.Args[2] 639 v.reset(Op386ADCLconst) 640 v.AuxInt = c 641 v.AddArg(x) 642 v.AddArg(f) 643 return true 644 } 645 // match: (ADCL x (MOVLconst [c]) f) 646 // cond: 647 // result: (ADCLconst [c] x f) 648 for { 649 x := v.Args[0] 650 v_1 := v.Args[1] 651 if v_1.Op != Op386MOVLconst { 652 break 653 } 654 c := v_1.AuxInt 655 f := v.Args[2] 656 v.reset(Op386ADCLconst) 657 v.AuxInt = c 658 v.AddArg(x) 659 v.AddArg(f) 660 return true 661 } 662 return false 663 } 664 func rewriteValue386_Op386ADDL_0(v *Value) bool { 665 // match: (ADDL x (MOVLconst [c])) 666 // cond: 667 // result: (ADDLconst [c] x) 668 for { 669 x := v.Args[0] 670 v_1 := v.Args[1] 671 if v_1.Op != Op386MOVLconst { 672 break 673 } 674 c := v_1.AuxInt 675 v.reset(Op386ADDLconst) 676 v.AuxInt = c 677 v.AddArg(x) 678 return true 679 } 680 // match: (ADDL (MOVLconst [c]) x) 681 // cond: 682 // result: (ADDLconst [c] x) 683 for { 684 v_0 := v.Args[0] 685 if v_0.Op != Op386MOVLconst { 686 break 687 } 688 c := v_0.AuxInt 689 x := v.Args[1] 690 v.reset(Op386ADDLconst) 691 v.AuxInt = c 692 v.AddArg(x) 693 return true 694 } 695 // match: (ADDL (SHLLconst [c] x) (SHRLconst [d] x)) 696 // cond: d == 32-c 697 // result: (ROLLconst [c] x) 698 for { 699 v_0 := v.Args[0] 700 if v_0.Op != Op386SHLLconst { 701 break 702 } 703 c := v_0.AuxInt 704 x := v_0.Args[0] 705 v_1 := v.Args[1] 706 if v_1.Op != Op386SHRLconst { 707 break 708 } 709 d := v_1.AuxInt 710 if x != v_1.Args[0] { 711 break 712 } 713 if !(d == 32-c) { 714 break 715 } 716 v.reset(Op386ROLLconst) 717 v.AuxInt = c 718 v.AddArg(x) 719 return true 720 } 721 // match: (ADDL (SHRLconst [d] x) (SHLLconst [c] x)) 722 // cond: d == 32-c 723 // result: (ROLLconst [c] x) 724 for { 725 v_0 := v.Args[0] 726 if v_0.Op != Op386SHRLconst { 727 break 728 } 729 d := v_0.AuxInt 730 x := v_0.Args[0] 731 v_1 := v.Args[1] 732 if v_1.Op != Op386SHLLconst { 733 break 734 } 735 c := v_1.AuxInt 736 if x != v_1.Args[0] { 737 break 738 } 739 if !(d == 32-c) { 740 break 741 } 742 v.reset(Op386ROLLconst) 743 v.AuxInt = c 744 v.AddArg(x) 745 return true 746 } 747 // match: (ADDL <t> (SHLLconst x [c]) (SHRWconst x [d])) 748 // cond: c < 16 && d == 16-c && t.Size() == 2 749 // result: (ROLWconst x [c]) 750 for { 751 t := v.Type 752 v_0 := v.Args[0] 753 if v_0.Op != Op386SHLLconst { 754 break 755 } 756 c := v_0.AuxInt 757 x := v_0.Args[0] 758 v_1 := v.Args[1] 759 if v_1.Op != Op386SHRWconst { 760 break 761 } 762 d := v_1.AuxInt 763 if x != v_1.Args[0] { 764 break 765 } 766 if !(c < 16 && d == 16-c && t.Size() == 2) { 767 break 768 } 769 v.reset(Op386ROLWconst) 770 v.AuxInt = c 771 v.AddArg(x) 772 return true 773 } 774 // match: (ADDL <t> (SHRWconst x [d]) (SHLLconst x [c])) 775 // cond: c < 16 && d == 16-c && t.Size() == 2 776 // result: (ROLWconst x [c]) 777 for { 778 t := v.Type 779 v_0 := v.Args[0] 780 if v_0.Op != Op386SHRWconst { 781 break 782 } 783 d := v_0.AuxInt 784 x := v_0.Args[0] 785 v_1 := v.Args[1] 786 if v_1.Op != Op386SHLLconst { 787 break 788 } 789 c := v_1.AuxInt 790 if x != v_1.Args[0] { 791 break 792 } 793 if !(c < 16 && d == 16-c && t.Size() == 2) { 794 break 795 } 796 v.reset(Op386ROLWconst) 797 v.AuxInt = c 798 v.AddArg(x) 799 return true 800 } 801 // match: (ADDL <t> (SHLLconst x [c]) (SHRBconst x [d])) 802 // cond: c < 8 && d == 8-c && t.Size() == 1 803 // result: (ROLBconst x [c]) 804 for { 805 t := v.Type 806 v_0 := v.Args[0] 807 if v_0.Op != Op386SHLLconst { 808 break 809 } 810 c := v_0.AuxInt 811 x := v_0.Args[0] 812 v_1 := v.Args[1] 813 if v_1.Op != Op386SHRBconst { 814 break 815 } 816 d := v_1.AuxInt 817 if x != v_1.Args[0] { 818 break 819 } 820 if !(c < 8 && d == 8-c && t.Size() == 1) { 821 break 822 } 823 v.reset(Op386ROLBconst) 824 v.AuxInt = c 825 v.AddArg(x) 826 return true 827 } 828 // match: (ADDL <t> (SHRBconst x [d]) (SHLLconst x [c])) 829 // cond: c < 8 && d == 8-c && t.Size() == 1 830 // result: (ROLBconst x [c]) 831 for { 832 t := v.Type 833 v_0 := v.Args[0] 834 if v_0.Op != Op386SHRBconst { 835 break 836 } 837 d := v_0.AuxInt 838 x := v_0.Args[0] 839 v_1 := v.Args[1] 840 if v_1.Op != Op386SHLLconst { 841 break 842 } 843 c := v_1.AuxInt 844 if x != v_1.Args[0] { 845 break 846 } 847 if !(c < 8 && d == 8-c && t.Size() == 1) { 848 break 849 } 850 v.reset(Op386ROLBconst) 851 v.AuxInt = c 852 v.AddArg(x) 853 return true 854 } 855 // match: (ADDL x (SHLLconst [3] y)) 856 // cond: 857 // result: (LEAL8 x y) 858 for { 859 x := v.Args[0] 860 v_1 := v.Args[1] 861 if v_1.Op != Op386SHLLconst { 862 break 863 } 864 if v_1.AuxInt != 3 { 865 break 866 } 867 y := v_1.Args[0] 868 v.reset(Op386LEAL8) 869 v.AddArg(x) 870 v.AddArg(y) 871 return true 872 } 873 // match: (ADDL (SHLLconst [3] y) x) 874 // cond: 875 // result: (LEAL8 x y) 876 for { 877 v_0 := v.Args[0] 878 if v_0.Op != Op386SHLLconst { 879 break 880 } 881 if v_0.AuxInt != 3 { 882 break 883 } 884 y := v_0.Args[0] 885 x := v.Args[1] 886 v.reset(Op386LEAL8) 887 v.AddArg(x) 888 v.AddArg(y) 889 return true 890 } 891 return false 892 } 893 func rewriteValue386_Op386ADDL_10(v *Value) bool { 894 // match: (ADDL x (SHLLconst [2] y)) 895 // cond: 896 // result: (LEAL4 x y) 897 for { 898 x := v.Args[0] 899 v_1 := v.Args[1] 900 if v_1.Op != Op386SHLLconst { 901 break 902 } 903 if v_1.AuxInt != 2 { 904 break 905 } 906 y := v_1.Args[0] 907 v.reset(Op386LEAL4) 908 v.AddArg(x) 909 v.AddArg(y) 910 return true 911 } 912 // match: (ADDL (SHLLconst [2] y) x) 913 // cond: 914 // result: (LEAL4 x y) 915 for { 916 v_0 := v.Args[0] 917 if v_0.Op != Op386SHLLconst { 918 break 919 } 920 if v_0.AuxInt != 2 { 921 break 922 } 923 y := v_0.Args[0] 924 x := v.Args[1] 925 v.reset(Op386LEAL4) 926 v.AddArg(x) 927 v.AddArg(y) 928 return true 929 } 930 // match: (ADDL x (SHLLconst [1] y)) 931 // cond: 932 // result: (LEAL2 x y) 933 for { 934 x := v.Args[0] 935 v_1 := v.Args[1] 936 if v_1.Op != Op386SHLLconst { 937 break 938 } 939 if v_1.AuxInt != 1 { 940 break 941 } 942 y := v_1.Args[0] 943 v.reset(Op386LEAL2) 944 v.AddArg(x) 945 v.AddArg(y) 946 return true 947 } 948 // match: (ADDL (SHLLconst [1] y) x) 949 // cond: 950 // result: (LEAL2 x y) 951 for { 952 v_0 := v.Args[0] 953 if v_0.Op != Op386SHLLconst { 954 break 955 } 956 if v_0.AuxInt != 1 { 957 break 958 } 959 y := v_0.Args[0] 960 x := v.Args[1] 961 v.reset(Op386LEAL2) 962 v.AddArg(x) 963 v.AddArg(y) 964 return true 965 } 966 // match: (ADDL x (ADDL y y)) 967 // cond: 968 // result: (LEAL2 x y) 969 for { 970 x := v.Args[0] 971 v_1 := v.Args[1] 972 if v_1.Op != Op386ADDL { 973 break 974 } 975 y := v_1.Args[0] 976 if y != v_1.Args[1] { 977 break 978 } 979 v.reset(Op386LEAL2) 980 v.AddArg(x) 981 v.AddArg(y) 982 return true 983 } 984 // match: (ADDL (ADDL y y) x) 985 // cond: 986 // result: (LEAL2 x y) 987 for { 988 v_0 := v.Args[0] 989 if v_0.Op != Op386ADDL { 990 break 991 } 992 y := v_0.Args[0] 993 if y != v_0.Args[1] { 994 break 995 } 996 x := v.Args[1] 997 v.reset(Op386LEAL2) 998 v.AddArg(x) 999 v.AddArg(y) 1000 return true 1001 } 1002 // match: (ADDL x (ADDL x y)) 1003 // cond: 1004 // result: (LEAL2 y x) 1005 for { 1006 x := v.Args[0] 1007 v_1 := v.Args[1] 1008 if v_1.Op != Op386ADDL { 1009 break 1010 } 1011 if x != v_1.Args[0] { 1012 break 1013 } 1014 y := v_1.Args[1] 1015 v.reset(Op386LEAL2) 1016 v.AddArg(y) 1017 v.AddArg(x) 1018 return true 1019 } 1020 // match: (ADDL x (ADDL y x)) 1021 // cond: 1022 // result: (LEAL2 y x) 1023 for { 1024 x := v.Args[0] 1025 v_1 := v.Args[1] 1026 if v_1.Op != Op386ADDL { 1027 break 1028 } 1029 y := v_1.Args[0] 1030 if x != v_1.Args[1] { 1031 break 1032 } 1033 v.reset(Op386LEAL2) 1034 v.AddArg(y) 1035 v.AddArg(x) 1036 return true 1037 } 1038 // match: (ADDL (ADDL x y) x) 1039 // cond: 1040 // result: (LEAL2 y x) 1041 for { 1042 v_0 := v.Args[0] 1043 if v_0.Op != Op386ADDL { 1044 break 1045 } 1046 x := v_0.Args[0] 1047 y := v_0.Args[1] 1048 if x != v.Args[1] { 1049 break 1050 } 1051 v.reset(Op386LEAL2) 1052 v.AddArg(y) 1053 v.AddArg(x) 1054 return true 1055 } 1056 // match: (ADDL (ADDL y x) x) 1057 // cond: 1058 // result: (LEAL2 y x) 1059 for { 1060 v_0 := v.Args[0] 1061 if v_0.Op != Op386ADDL { 1062 break 1063 } 1064 y := v_0.Args[0] 1065 x := v_0.Args[1] 1066 if x != v.Args[1] { 1067 break 1068 } 1069 v.reset(Op386LEAL2) 1070 v.AddArg(y) 1071 v.AddArg(x) 1072 return true 1073 } 1074 return false 1075 } 1076 func rewriteValue386_Op386ADDL_20(v *Value) bool { 1077 // match: (ADDL (ADDLconst [c] x) y) 1078 // cond: 1079 // result: (LEAL1 [c] x y) 1080 for { 1081 v_0 := v.Args[0] 1082 if v_0.Op != Op386ADDLconst { 1083 break 1084 } 1085 c := v_0.AuxInt 1086 x := v_0.Args[0] 1087 y := v.Args[1] 1088 v.reset(Op386LEAL1) 1089 v.AuxInt = c 1090 v.AddArg(x) 1091 v.AddArg(y) 1092 return true 1093 } 1094 // match: (ADDL y (ADDLconst [c] x)) 1095 // cond: 1096 // result: (LEAL1 [c] x y) 1097 for { 1098 y := v.Args[0] 1099 v_1 := v.Args[1] 1100 if v_1.Op != Op386ADDLconst { 1101 break 1102 } 1103 c := v_1.AuxInt 1104 x := v_1.Args[0] 1105 v.reset(Op386LEAL1) 1106 v.AuxInt = c 1107 v.AddArg(x) 1108 v.AddArg(y) 1109 return true 1110 } 1111 // match: (ADDL x (LEAL [c] {s} y)) 1112 // cond: x.Op != OpSB && y.Op != OpSB 1113 // result: (LEAL1 [c] {s} x y) 1114 for { 1115 x := v.Args[0] 1116 v_1 := v.Args[1] 1117 if v_1.Op != Op386LEAL { 1118 break 1119 } 1120 c := v_1.AuxInt 1121 s := v_1.Aux 1122 y := v_1.Args[0] 1123 if !(x.Op != OpSB && y.Op != OpSB) { 1124 break 1125 } 1126 v.reset(Op386LEAL1) 1127 v.AuxInt = c 1128 v.Aux = s 1129 v.AddArg(x) 1130 v.AddArg(y) 1131 return true 1132 } 1133 // match: (ADDL (LEAL [c] {s} y) x) 1134 // cond: x.Op != OpSB && y.Op != OpSB 1135 // result: (LEAL1 [c] {s} x y) 1136 for { 1137 v_0 := v.Args[0] 1138 if v_0.Op != Op386LEAL { 1139 break 1140 } 1141 c := v_0.AuxInt 1142 s := v_0.Aux 1143 y := v_0.Args[0] 1144 x := v.Args[1] 1145 if !(x.Op != OpSB && y.Op != OpSB) { 1146 break 1147 } 1148 v.reset(Op386LEAL1) 1149 v.AuxInt = c 1150 v.Aux = s 1151 v.AddArg(x) 1152 v.AddArg(y) 1153 return true 1154 } 1155 // match: (ADDL x (NEGL y)) 1156 // cond: 1157 // result: (SUBL x y) 1158 for { 1159 x := v.Args[0] 1160 v_1 := v.Args[1] 1161 if v_1.Op != Op386NEGL { 1162 break 1163 } 1164 y := v_1.Args[0] 1165 v.reset(Op386SUBL) 1166 v.AddArg(x) 1167 v.AddArg(y) 1168 return true 1169 } 1170 // match: (ADDL (NEGL y) x) 1171 // cond: 1172 // result: (SUBL x y) 1173 for { 1174 v_0 := v.Args[0] 1175 if v_0.Op != Op386NEGL { 1176 break 1177 } 1178 y := v_0.Args[0] 1179 x := v.Args[1] 1180 v.reset(Op386SUBL) 1181 v.AddArg(x) 1182 v.AddArg(y) 1183 return true 1184 } 1185 return false 1186 } 1187 func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { 1188 // match: (ADDLcarry x (MOVLconst [c])) 1189 // cond: 1190 // result: (ADDLconstcarry [c] x) 1191 for { 1192 x := v.Args[0] 1193 v_1 := v.Args[1] 1194 if v_1.Op != Op386MOVLconst { 1195 break 1196 } 1197 c := v_1.AuxInt 1198 v.reset(Op386ADDLconstcarry) 1199 v.AuxInt = c 1200 v.AddArg(x) 1201 return true 1202 } 1203 // match: (ADDLcarry (MOVLconst [c]) x) 1204 // cond: 1205 // result: (ADDLconstcarry [c] x) 1206 for { 1207 v_0 := v.Args[0] 1208 if v_0.Op != Op386MOVLconst { 1209 break 1210 } 1211 c := v_0.AuxInt 1212 x := v.Args[1] 1213 v.reset(Op386ADDLconstcarry) 1214 v.AuxInt = c 1215 v.AddArg(x) 1216 return true 1217 } 1218 return false 1219 } 1220 func rewriteValue386_Op386ADDLconst_0(v *Value) bool { 1221 // match: (ADDLconst [c] (ADDL x y)) 1222 // cond: 1223 // result: (LEAL1 [c] x y) 1224 for { 1225 c := v.AuxInt 1226 v_0 := v.Args[0] 1227 if v_0.Op != Op386ADDL { 1228 break 1229 } 1230 x := v_0.Args[0] 1231 y := v_0.Args[1] 1232 v.reset(Op386LEAL1) 1233 v.AuxInt = c 1234 v.AddArg(x) 1235 v.AddArg(y) 1236 return true 1237 } 1238 // match: (ADDLconst [c] (LEAL [d] {s} x)) 1239 // cond: is32Bit(c+d) 1240 // result: (LEAL [c+d] {s} x) 1241 for { 1242 c := v.AuxInt 1243 v_0 := v.Args[0] 1244 if v_0.Op != Op386LEAL { 1245 break 1246 } 1247 d := v_0.AuxInt 1248 s := v_0.Aux 1249 x := v_0.Args[0] 1250 if !(is32Bit(c + d)) { 1251 break 1252 } 1253 v.reset(Op386LEAL) 1254 v.AuxInt = c + d 1255 v.Aux = s 1256 v.AddArg(x) 1257 return true 1258 } 1259 // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) 1260 // cond: is32Bit(c+d) 1261 // result: (LEAL1 [c+d] {s} x y) 1262 for { 1263 c := v.AuxInt 1264 v_0 := v.Args[0] 1265 if v_0.Op != Op386LEAL1 { 1266 break 1267 } 1268 d := v_0.AuxInt 1269 s := v_0.Aux 1270 x := v_0.Args[0] 1271 y := v_0.Args[1] 1272 if !(is32Bit(c + d)) { 1273 break 1274 } 1275 v.reset(Op386LEAL1) 1276 v.AuxInt = c + d 1277 v.Aux = s 1278 v.AddArg(x) 1279 v.AddArg(y) 1280 return true 1281 } 1282 // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) 1283 // cond: is32Bit(c+d) 1284 // result: (LEAL2 [c+d] {s} x y) 1285 for { 1286 c := v.AuxInt 1287 v_0 := v.Args[0] 1288 if v_0.Op != Op386LEAL2 { 1289 break 1290 } 1291 d := v_0.AuxInt 1292 s := v_0.Aux 1293 x := v_0.Args[0] 1294 y := v_0.Args[1] 1295 if !(is32Bit(c + d)) { 1296 break 1297 } 1298 v.reset(Op386LEAL2) 1299 v.AuxInt = c + d 1300 v.Aux = s 1301 v.AddArg(x) 1302 v.AddArg(y) 1303 return true 1304 } 1305 // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) 1306 // cond: is32Bit(c+d) 1307 // result: (LEAL4 [c+d] {s} x y) 1308 for { 1309 c := v.AuxInt 1310 v_0 := v.Args[0] 1311 if v_0.Op != Op386LEAL4 { 1312 break 1313 } 1314 d := v_0.AuxInt 1315 s := v_0.Aux 1316 x := v_0.Args[0] 1317 y := v_0.Args[1] 1318 if !(is32Bit(c + d)) { 1319 break 1320 } 1321 v.reset(Op386LEAL4) 1322 v.AuxInt = c + d 1323 v.Aux = s 1324 v.AddArg(x) 1325 v.AddArg(y) 1326 return true 1327 } 1328 // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) 1329 // cond: is32Bit(c+d) 1330 // result: (LEAL8 [c+d] {s} x y) 1331 for { 1332 c := v.AuxInt 1333 v_0 := v.Args[0] 1334 if v_0.Op != Op386LEAL8 { 1335 break 1336 } 1337 d := v_0.AuxInt 1338 s := v_0.Aux 1339 x := v_0.Args[0] 1340 y := v_0.Args[1] 1341 if !(is32Bit(c + d)) { 1342 break 1343 } 1344 v.reset(Op386LEAL8) 1345 v.AuxInt = c + d 1346 v.Aux = s 1347 v.AddArg(x) 1348 v.AddArg(y) 1349 return true 1350 } 1351 // match: (ADDLconst [c] x) 1352 // cond: int32(c)==0 1353 // result: x 1354 for { 1355 c := v.AuxInt 1356 x := v.Args[0] 1357 if !(int32(c) == 0) { 1358 break 1359 } 1360 v.reset(OpCopy) 1361 v.Type = x.Type 1362 v.AddArg(x) 1363 return true 1364 } 1365 // match: (ADDLconst [c] (MOVLconst [d])) 1366 // cond: 1367 // result: (MOVLconst [int64(int32(c+d))]) 1368 for { 1369 c := v.AuxInt 1370 v_0 := v.Args[0] 1371 if v_0.Op != Op386MOVLconst { 1372 break 1373 } 1374 d := v_0.AuxInt 1375 v.reset(Op386MOVLconst) 1376 v.AuxInt = int64(int32(c + d)) 1377 return true 1378 } 1379 // match: (ADDLconst [c] (ADDLconst [d] x)) 1380 // cond: 1381 // result: (ADDLconst [int64(int32(c+d))] x) 1382 for { 1383 c := v.AuxInt 1384 v_0 := v.Args[0] 1385 if v_0.Op != Op386ADDLconst { 1386 break 1387 } 1388 d := v_0.AuxInt 1389 x := v_0.Args[0] 1390 v.reset(Op386ADDLconst) 1391 v.AuxInt = int64(int32(c + d)) 1392 v.AddArg(x) 1393 return true 1394 } 1395 return false 1396 } 1397 func rewriteValue386_Op386ANDL_0(v *Value) bool { 1398 // match: (ANDL x (MOVLconst [c])) 1399 // cond: 1400 // result: (ANDLconst [c] x) 1401 for { 1402 x := v.Args[0] 1403 v_1 := v.Args[1] 1404 if v_1.Op != Op386MOVLconst { 1405 break 1406 } 1407 c := v_1.AuxInt 1408 v.reset(Op386ANDLconst) 1409 v.AuxInt = c 1410 v.AddArg(x) 1411 return true 1412 } 1413 // match: (ANDL (MOVLconst [c]) x) 1414 // cond: 1415 // result: (ANDLconst [c] x) 1416 for { 1417 v_0 := v.Args[0] 1418 if v_0.Op != Op386MOVLconst { 1419 break 1420 } 1421 c := v_0.AuxInt 1422 x := v.Args[1] 1423 v.reset(Op386ANDLconst) 1424 v.AuxInt = c 1425 v.AddArg(x) 1426 return true 1427 } 1428 // match: (ANDL x x) 1429 // cond: 1430 // result: x 1431 for { 1432 x := v.Args[0] 1433 if x != v.Args[1] { 1434 break 1435 } 1436 v.reset(OpCopy) 1437 v.Type = x.Type 1438 v.AddArg(x) 1439 return true 1440 } 1441 return false 1442 } 1443 func rewriteValue386_Op386ANDLconst_0(v *Value) bool { 1444 // match: (ANDLconst [c] (ANDLconst [d] x)) 1445 // cond: 1446 // result: (ANDLconst [c & d] x) 1447 for { 1448 c := v.AuxInt 1449 v_0 := v.Args[0] 1450 if v_0.Op != Op386ANDLconst { 1451 break 1452 } 1453 d := v_0.AuxInt 1454 x := v_0.Args[0] 1455 v.reset(Op386ANDLconst) 1456 v.AuxInt = c & d 1457 v.AddArg(x) 1458 return true 1459 } 1460 // match: (ANDLconst [c] _) 1461 // cond: int32(c)==0 1462 // result: (MOVLconst [0]) 1463 for { 1464 c := v.AuxInt 1465 if !(int32(c) == 0) { 1466 break 1467 } 1468 v.reset(Op386MOVLconst) 1469 v.AuxInt = 0 1470 return true 1471 } 1472 // match: (ANDLconst [c] x) 1473 // cond: int32(c)==-1 1474 // result: x 1475 for { 1476 c := v.AuxInt 1477 x := v.Args[0] 1478 if !(int32(c) == -1) { 1479 break 1480 } 1481 v.reset(OpCopy) 1482 v.Type = x.Type 1483 v.AddArg(x) 1484 return true 1485 } 1486 // match: (ANDLconst [c] (MOVLconst [d])) 1487 // cond: 1488 // result: (MOVLconst [c&d]) 1489 for { 1490 c := v.AuxInt 1491 v_0 := v.Args[0] 1492 if v_0.Op != Op386MOVLconst { 1493 break 1494 } 1495 d := v_0.AuxInt 1496 v.reset(Op386MOVLconst) 1497 v.AuxInt = c & d 1498 return true 1499 } 1500 return false 1501 } 1502 func rewriteValue386_Op386CMPB_0(v *Value) bool { 1503 b := v.Block 1504 _ = b 1505 // match: (CMPB x (MOVLconst [c])) 1506 // cond: 1507 // result: (CMPBconst x [int64(int8(c))]) 1508 for { 1509 x := v.Args[0] 1510 v_1 := v.Args[1] 1511 if v_1.Op != Op386MOVLconst { 1512 break 1513 } 1514 c := v_1.AuxInt 1515 v.reset(Op386CMPBconst) 1516 v.AuxInt = int64(int8(c)) 1517 v.AddArg(x) 1518 return true 1519 } 1520 // match: (CMPB (MOVLconst [c]) x) 1521 // cond: 1522 // result: (InvertFlags (CMPBconst x [int64(int8(c))])) 1523 for { 1524 v_0 := v.Args[0] 1525 if v_0.Op != Op386MOVLconst { 1526 break 1527 } 1528 c := v_0.AuxInt 1529 x := v.Args[1] 1530 v.reset(Op386InvertFlags) 1531 v0 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 1532 v0.AuxInt = int64(int8(c)) 1533 v0.AddArg(x) 1534 v.AddArg(v0) 1535 return true 1536 } 1537 return false 1538 } 1539 func rewriteValue386_Op386CMPBconst_0(v *Value) bool { 1540 // match: (CMPBconst (MOVLconst [x]) [y]) 1541 // cond: int8(x)==int8(y) 1542 // result: (FlagEQ) 1543 for { 1544 y := v.AuxInt 1545 v_0 := v.Args[0] 1546 if v_0.Op != Op386MOVLconst { 1547 break 1548 } 1549 x := v_0.AuxInt 1550 if !(int8(x) == int8(y)) { 1551 break 1552 } 1553 v.reset(Op386FlagEQ) 1554 return true 1555 } 1556 // match: (CMPBconst (MOVLconst [x]) [y]) 1557 // cond: int8(x)<int8(y) && uint8(x)<uint8(y) 1558 // result: (FlagLT_ULT) 1559 for { 1560 y := v.AuxInt 1561 v_0 := v.Args[0] 1562 if v_0.Op != Op386MOVLconst { 1563 break 1564 } 1565 x := v_0.AuxInt 1566 if !(int8(x) < int8(y) && uint8(x) < uint8(y)) { 1567 break 1568 } 1569 v.reset(Op386FlagLT_ULT) 1570 return true 1571 } 1572 // match: (CMPBconst (MOVLconst [x]) [y]) 1573 // cond: int8(x)<int8(y) && uint8(x)>uint8(y) 1574 // result: (FlagLT_UGT) 1575 for { 1576 y := v.AuxInt 1577 v_0 := v.Args[0] 1578 if v_0.Op != Op386MOVLconst { 1579 break 1580 } 1581 x := v_0.AuxInt 1582 if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { 1583 break 1584 } 1585 v.reset(Op386FlagLT_UGT) 1586 return true 1587 } 1588 // match: (CMPBconst (MOVLconst [x]) [y]) 1589 // cond: int8(x)>int8(y) && uint8(x)<uint8(y) 1590 // result: (FlagGT_ULT) 1591 for { 1592 y := v.AuxInt 1593 v_0 := v.Args[0] 1594 if v_0.Op != Op386MOVLconst { 1595 break 1596 } 1597 x := v_0.AuxInt 1598 if !(int8(x) > int8(y) && uint8(x) < uint8(y)) { 1599 break 1600 } 1601 v.reset(Op386FlagGT_ULT) 1602 return true 1603 } 1604 // match: (CMPBconst (MOVLconst [x]) [y]) 1605 // cond: int8(x)>int8(y) && uint8(x)>uint8(y) 1606 // result: (FlagGT_UGT) 1607 for { 1608 y := v.AuxInt 1609 v_0 := v.Args[0] 1610 if v_0.Op != Op386MOVLconst { 1611 break 1612 } 1613 x := v_0.AuxInt 1614 if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { 1615 break 1616 } 1617 v.reset(Op386FlagGT_UGT) 1618 return true 1619 } 1620 // match: (CMPBconst (ANDLconst _ [m]) [n]) 1621 // cond: 0 <= int8(m) && int8(m) < int8(n) 1622 // result: (FlagLT_ULT) 1623 for { 1624 n := v.AuxInt 1625 v_0 := v.Args[0] 1626 if v_0.Op != Op386ANDLconst { 1627 break 1628 } 1629 m := v_0.AuxInt 1630 if !(0 <= int8(m) && int8(m) < int8(n)) { 1631 break 1632 } 1633 v.reset(Op386FlagLT_ULT) 1634 return true 1635 } 1636 // match: (CMPBconst (ANDL x y) [0]) 1637 // cond: 1638 // result: (TESTB x y) 1639 for { 1640 if v.AuxInt != 0 { 1641 break 1642 } 1643 v_0 := v.Args[0] 1644 if v_0.Op != Op386ANDL { 1645 break 1646 } 1647 x := v_0.Args[0] 1648 y := v_0.Args[1] 1649 v.reset(Op386TESTB) 1650 v.AddArg(x) 1651 v.AddArg(y) 1652 return true 1653 } 1654 // match: (CMPBconst (ANDLconst [c] x) [0]) 1655 // cond: 1656 // result: (TESTBconst [int64(int8(c))] x) 1657 for { 1658 if v.AuxInt != 0 { 1659 break 1660 } 1661 v_0 := v.Args[0] 1662 if v_0.Op != Op386ANDLconst { 1663 break 1664 } 1665 c := v_0.AuxInt 1666 x := v_0.Args[0] 1667 v.reset(Op386TESTBconst) 1668 v.AuxInt = int64(int8(c)) 1669 v.AddArg(x) 1670 return true 1671 } 1672 // match: (CMPBconst x [0]) 1673 // cond: 1674 // result: (TESTB x x) 1675 for { 1676 if v.AuxInt != 0 { 1677 break 1678 } 1679 x := v.Args[0] 1680 v.reset(Op386TESTB) 1681 v.AddArg(x) 1682 v.AddArg(x) 1683 return true 1684 } 1685 return false 1686 } 1687 func rewriteValue386_Op386CMPL_0(v *Value) bool { 1688 b := v.Block 1689 _ = b 1690 // match: (CMPL x (MOVLconst [c])) 1691 // cond: 1692 // result: (CMPLconst x [c]) 1693 for { 1694 x := v.Args[0] 1695 v_1 := v.Args[1] 1696 if v_1.Op != Op386MOVLconst { 1697 break 1698 } 1699 c := v_1.AuxInt 1700 v.reset(Op386CMPLconst) 1701 v.AuxInt = c 1702 v.AddArg(x) 1703 return true 1704 } 1705 // match: (CMPL (MOVLconst [c]) x) 1706 // cond: 1707 // result: (InvertFlags (CMPLconst x [c])) 1708 for { 1709 v_0 := v.Args[0] 1710 if v_0.Op != Op386MOVLconst { 1711 break 1712 } 1713 c := v_0.AuxInt 1714 x := v.Args[1] 1715 v.reset(Op386InvertFlags) 1716 v0 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 1717 v0.AuxInt = c 1718 v0.AddArg(x) 1719 v.AddArg(v0) 1720 return true 1721 } 1722 return false 1723 } 1724 func rewriteValue386_Op386CMPLconst_0(v *Value) bool { 1725 // match: (CMPLconst (MOVLconst [x]) [y]) 1726 // cond: int32(x)==int32(y) 1727 // result: (FlagEQ) 1728 for { 1729 y := v.AuxInt 1730 v_0 := v.Args[0] 1731 if v_0.Op != Op386MOVLconst { 1732 break 1733 } 1734 x := v_0.AuxInt 1735 if !(int32(x) == int32(y)) { 1736 break 1737 } 1738 v.reset(Op386FlagEQ) 1739 return true 1740 } 1741 // match: (CMPLconst (MOVLconst [x]) [y]) 1742 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 1743 // result: (FlagLT_ULT) 1744 for { 1745 y := v.AuxInt 1746 v_0 := v.Args[0] 1747 if v_0.Op != Op386MOVLconst { 1748 break 1749 } 1750 x := v_0.AuxInt 1751 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 1752 break 1753 } 1754 v.reset(Op386FlagLT_ULT) 1755 return true 1756 } 1757 // match: (CMPLconst (MOVLconst [x]) [y]) 1758 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 1759 // result: (FlagLT_UGT) 1760 for { 1761 y := v.AuxInt 1762 v_0 := v.Args[0] 1763 if v_0.Op != Op386MOVLconst { 1764 break 1765 } 1766 x := v_0.AuxInt 1767 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 1768 break 1769 } 1770 v.reset(Op386FlagLT_UGT) 1771 return true 1772 } 1773 // match: (CMPLconst (MOVLconst [x]) [y]) 1774 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 1775 // result: (FlagGT_ULT) 1776 for { 1777 y := v.AuxInt 1778 v_0 := v.Args[0] 1779 if v_0.Op != Op386MOVLconst { 1780 break 1781 } 1782 x := v_0.AuxInt 1783 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 1784 break 1785 } 1786 v.reset(Op386FlagGT_ULT) 1787 return true 1788 } 1789 // match: (CMPLconst (MOVLconst [x]) [y]) 1790 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 1791 // result: (FlagGT_UGT) 1792 for { 1793 y := v.AuxInt 1794 v_0 := v.Args[0] 1795 if v_0.Op != Op386MOVLconst { 1796 break 1797 } 1798 x := v_0.AuxInt 1799 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 1800 break 1801 } 1802 v.reset(Op386FlagGT_UGT) 1803 return true 1804 } 1805 // match: (CMPLconst (SHRLconst _ [c]) [n]) 1806 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 1807 // result: (FlagLT_ULT) 1808 for { 1809 n := v.AuxInt 1810 v_0 := v.Args[0] 1811 if v_0.Op != Op386SHRLconst { 1812 break 1813 } 1814 c := v_0.AuxInt 1815 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 1816 break 1817 } 1818 v.reset(Op386FlagLT_ULT) 1819 return true 1820 } 1821 // match: (CMPLconst (ANDLconst _ [m]) [n]) 1822 // cond: 0 <= int32(m) && int32(m) < int32(n) 1823 // result: (FlagLT_ULT) 1824 for { 1825 n := v.AuxInt 1826 v_0 := v.Args[0] 1827 if v_0.Op != Op386ANDLconst { 1828 break 1829 } 1830 m := v_0.AuxInt 1831 if !(0 <= int32(m) && int32(m) < int32(n)) { 1832 break 1833 } 1834 v.reset(Op386FlagLT_ULT) 1835 return true 1836 } 1837 // match: (CMPLconst (ANDL x y) [0]) 1838 // cond: 1839 // result: (TESTL x y) 1840 for { 1841 if v.AuxInt != 0 { 1842 break 1843 } 1844 v_0 := v.Args[0] 1845 if v_0.Op != Op386ANDL { 1846 break 1847 } 1848 x := v_0.Args[0] 1849 y := v_0.Args[1] 1850 v.reset(Op386TESTL) 1851 v.AddArg(x) 1852 v.AddArg(y) 1853 return true 1854 } 1855 // match: (CMPLconst (ANDLconst [c] x) [0]) 1856 // cond: 1857 // result: (TESTLconst [c] x) 1858 for { 1859 if v.AuxInt != 0 { 1860 break 1861 } 1862 v_0 := v.Args[0] 1863 if v_0.Op != Op386ANDLconst { 1864 break 1865 } 1866 c := v_0.AuxInt 1867 x := v_0.Args[0] 1868 v.reset(Op386TESTLconst) 1869 v.AuxInt = c 1870 v.AddArg(x) 1871 return true 1872 } 1873 // match: (CMPLconst x [0]) 1874 // cond: 1875 // result: (TESTL x x) 1876 for { 1877 if v.AuxInt != 0 { 1878 break 1879 } 1880 x := v.Args[0] 1881 v.reset(Op386TESTL) 1882 v.AddArg(x) 1883 v.AddArg(x) 1884 return true 1885 } 1886 return false 1887 } 1888 func rewriteValue386_Op386CMPW_0(v *Value) bool { 1889 b := v.Block 1890 _ = b 1891 // match: (CMPW x (MOVLconst [c])) 1892 // cond: 1893 // result: (CMPWconst x [int64(int16(c))]) 1894 for { 1895 x := v.Args[0] 1896 v_1 := v.Args[1] 1897 if v_1.Op != Op386MOVLconst { 1898 break 1899 } 1900 c := v_1.AuxInt 1901 v.reset(Op386CMPWconst) 1902 v.AuxInt = int64(int16(c)) 1903 v.AddArg(x) 1904 return true 1905 } 1906 // match: (CMPW (MOVLconst [c]) x) 1907 // cond: 1908 // result: (InvertFlags (CMPWconst x [int64(int16(c))])) 1909 for { 1910 v_0 := v.Args[0] 1911 if v_0.Op != Op386MOVLconst { 1912 break 1913 } 1914 c := v_0.AuxInt 1915 x := v.Args[1] 1916 v.reset(Op386InvertFlags) 1917 v0 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 1918 v0.AuxInt = int64(int16(c)) 1919 v0.AddArg(x) 1920 v.AddArg(v0) 1921 return true 1922 } 1923 return false 1924 } 1925 func rewriteValue386_Op386CMPWconst_0(v *Value) bool { 1926 // match: (CMPWconst (MOVLconst [x]) [y]) 1927 // cond: int16(x)==int16(y) 1928 // result: (FlagEQ) 1929 for { 1930 y := v.AuxInt 1931 v_0 := v.Args[0] 1932 if v_0.Op != Op386MOVLconst { 1933 break 1934 } 1935 x := v_0.AuxInt 1936 if !(int16(x) == int16(y)) { 1937 break 1938 } 1939 v.reset(Op386FlagEQ) 1940 return true 1941 } 1942 // match: (CMPWconst (MOVLconst [x]) [y]) 1943 // cond: int16(x)<int16(y) && uint16(x)<uint16(y) 1944 // result: (FlagLT_ULT) 1945 for { 1946 y := v.AuxInt 1947 v_0 := v.Args[0] 1948 if v_0.Op != Op386MOVLconst { 1949 break 1950 } 1951 x := v_0.AuxInt 1952 if !(int16(x) < int16(y) && uint16(x) < uint16(y)) { 1953 break 1954 } 1955 v.reset(Op386FlagLT_ULT) 1956 return true 1957 } 1958 // match: (CMPWconst (MOVLconst [x]) [y]) 1959 // cond: int16(x)<int16(y) && uint16(x)>uint16(y) 1960 // result: (FlagLT_UGT) 1961 for { 1962 y := v.AuxInt 1963 v_0 := v.Args[0] 1964 if v_0.Op != Op386MOVLconst { 1965 break 1966 } 1967 x := v_0.AuxInt 1968 if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { 1969 break 1970 } 1971 v.reset(Op386FlagLT_UGT) 1972 return true 1973 } 1974 // match: (CMPWconst (MOVLconst [x]) [y]) 1975 // cond: int16(x)>int16(y) && uint16(x)<uint16(y) 1976 // result: (FlagGT_ULT) 1977 for { 1978 y := v.AuxInt 1979 v_0 := v.Args[0] 1980 if v_0.Op != Op386MOVLconst { 1981 break 1982 } 1983 x := v_0.AuxInt 1984 if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { 1985 break 1986 } 1987 v.reset(Op386FlagGT_ULT) 1988 return true 1989 } 1990 // match: (CMPWconst (MOVLconst [x]) [y]) 1991 // cond: int16(x)>int16(y) && uint16(x)>uint16(y) 1992 // result: (FlagGT_UGT) 1993 for { 1994 y := v.AuxInt 1995 v_0 := v.Args[0] 1996 if v_0.Op != Op386MOVLconst { 1997 break 1998 } 1999 x := v_0.AuxInt 2000 if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { 2001 break 2002 } 2003 v.reset(Op386FlagGT_UGT) 2004 return true 2005 } 2006 // match: (CMPWconst (ANDLconst _ [m]) [n]) 2007 // cond: 0 <= int16(m) && int16(m) < int16(n) 2008 // result: (FlagLT_ULT) 2009 for { 2010 n := v.AuxInt 2011 v_0 := v.Args[0] 2012 if v_0.Op != Op386ANDLconst { 2013 break 2014 } 2015 m := v_0.AuxInt 2016 if !(0 <= int16(m) && int16(m) < int16(n)) { 2017 break 2018 } 2019 v.reset(Op386FlagLT_ULT) 2020 return true 2021 } 2022 // match: (CMPWconst (ANDL x y) [0]) 2023 // cond: 2024 // result: (TESTW x y) 2025 for { 2026 if v.AuxInt != 0 { 2027 break 2028 } 2029 v_0 := v.Args[0] 2030 if v_0.Op != Op386ANDL { 2031 break 2032 } 2033 x := v_0.Args[0] 2034 y := v_0.Args[1] 2035 v.reset(Op386TESTW) 2036 v.AddArg(x) 2037 v.AddArg(y) 2038 return true 2039 } 2040 // match: (CMPWconst (ANDLconst [c] x) [0]) 2041 // cond: 2042 // result: (TESTWconst [int64(int16(c))] x) 2043 for { 2044 if v.AuxInt != 0 { 2045 break 2046 } 2047 v_0 := v.Args[0] 2048 if v_0.Op != Op386ANDLconst { 2049 break 2050 } 2051 c := v_0.AuxInt 2052 x := v_0.Args[0] 2053 v.reset(Op386TESTWconst) 2054 v.AuxInt = int64(int16(c)) 2055 v.AddArg(x) 2056 return true 2057 } 2058 // match: (CMPWconst x [0]) 2059 // cond: 2060 // result: (TESTW x x) 2061 for { 2062 if v.AuxInt != 0 { 2063 break 2064 } 2065 x := v.Args[0] 2066 v.reset(Op386TESTW) 2067 v.AddArg(x) 2068 v.AddArg(x) 2069 return true 2070 } 2071 return false 2072 } 2073 func rewriteValue386_Op386LEAL_0(v *Value) bool { 2074 // match: (LEAL [c] {s} (ADDLconst [d] x)) 2075 // cond: is32Bit(c+d) 2076 // result: (LEAL [c+d] {s} x) 2077 for { 2078 c := v.AuxInt 2079 s := v.Aux 2080 v_0 := v.Args[0] 2081 if v_0.Op != Op386ADDLconst { 2082 break 2083 } 2084 d := v_0.AuxInt 2085 x := v_0.Args[0] 2086 if !(is32Bit(c + d)) { 2087 break 2088 } 2089 v.reset(Op386LEAL) 2090 v.AuxInt = c + d 2091 v.Aux = s 2092 v.AddArg(x) 2093 return true 2094 } 2095 // match: (LEAL [c] {s} (ADDL x y)) 2096 // cond: x.Op != OpSB && y.Op != OpSB 2097 // result: (LEAL1 [c] {s} x y) 2098 for { 2099 c := v.AuxInt 2100 s := v.Aux 2101 v_0 := v.Args[0] 2102 if v_0.Op != Op386ADDL { 2103 break 2104 } 2105 x := v_0.Args[0] 2106 y := v_0.Args[1] 2107 if !(x.Op != OpSB && y.Op != OpSB) { 2108 break 2109 } 2110 v.reset(Op386LEAL1) 2111 v.AuxInt = c 2112 v.Aux = s 2113 v.AddArg(x) 2114 v.AddArg(y) 2115 return true 2116 } 2117 // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) 2118 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2119 // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) 2120 for { 2121 off1 := v.AuxInt 2122 sym1 := v.Aux 2123 v_0 := v.Args[0] 2124 if v_0.Op != Op386LEAL { 2125 break 2126 } 2127 off2 := v_0.AuxInt 2128 sym2 := v_0.Aux 2129 x := v_0.Args[0] 2130 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2131 break 2132 } 2133 v.reset(Op386LEAL) 2134 v.AuxInt = off1 + off2 2135 v.Aux = mergeSym(sym1, sym2) 2136 v.AddArg(x) 2137 return true 2138 } 2139 // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) 2140 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2141 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2142 for { 2143 off1 := v.AuxInt 2144 sym1 := v.Aux 2145 v_0 := v.Args[0] 2146 if v_0.Op != Op386LEAL1 { 2147 break 2148 } 2149 off2 := v_0.AuxInt 2150 sym2 := v_0.Aux 2151 x := v_0.Args[0] 2152 y := v_0.Args[1] 2153 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2154 break 2155 } 2156 v.reset(Op386LEAL1) 2157 v.AuxInt = off1 + off2 2158 v.Aux = mergeSym(sym1, sym2) 2159 v.AddArg(x) 2160 v.AddArg(y) 2161 return true 2162 } 2163 // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) 2164 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2165 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2166 for { 2167 off1 := v.AuxInt 2168 sym1 := v.Aux 2169 v_0 := v.Args[0] 2170 if v_0.Op != Op386LEAL2 { 2171 break 2172 } 2173 off2 := v_0.AuxInt 2174 sym2 := v_0.Aux 2175 x := v_0.Args[0] 2176 y := v_0.Args[1] 2177 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2178 break 2179 } 2180 v.reset(Op386LEAL2) 2181 v.AuxInt = off1 + off2 2182 v.Aux = mergeSym(sym1, sym2) 2183 v.AddArg(x) 2184 v.AddArg(y) 2185 return true 2186 } 2187 // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) 2188 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2189 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2190 for { 2191 off1 := v.AuxInt 2192 sym1 := v.Aux 2193 v_0 := v.Args[0] 2194 if v_0.Op != Op386LEAL4 { 2195 break 2196 } 2197 off2 := v_0.AuxInt 2198 sym2 := v_0.Aux 2199 x := v_0.Args[0] 2200 y := v_0.Args[1] 2201 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2202 break 2203 } 2204 v.reset(Op386LEAL4) 2205 v.AuxInt = off1 + off2 2206 v.Aux = mergeSym(sym1, sym2) 2207 v.AddArg(x) 2208 v.AddArg(y) 2209 return true 2210 } 2211 // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) 2212 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2213 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2214 for { 2215 off1 := v.AuxInt 2216 sym1 := v.Aux 2217 v_0 := v.Args[0] 2218 if v_0.Op != Op386LEAL8 { 2219 break 2220 } 2221 off2 := v_0.AuxInt 2222 sym2 := v_0.Aux 2223 x := v_0.Args[0] 2224 y := v_0.Args[1] 2225 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2226 break 2227 } 2228 v.reset(Op386LEAL8) 2229 v.AuxInt = off1 + off2 2230 v.Aux = mergeSym(sym1, sym2) 2231 v.AddArg(x) 2232 v.AddArg(y) 2233 return true 2234 } 2235 return false 2236 } 2237 func rewriteValue386_Op386LEAL1_0(v *Value) bool { 2238 // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) 2239 // cond: is32Bit(c+d) && x.Op != OpSB 2240 // result: (LEAL1 [c+d] {s} x y) 2241 for { 2242 c := v.AuxInt 2243 s := v.Aux 2244 v_0 := v.Args[0] 2245 if v_0.Op != Op386ADDLconst { 2246 break 2247 } 2248 d := v_0.AuxInt 2249 x := v_0.Args[0] 2250 y := v.Args[1] 2251 if !(is32Bit(c+d) && x.Op != OpSB) { 2252 break 2253 } 2254 v.reset(Op386LEAL1) 2255 v.AuxInt = c + d 2256 v.Aux = s 2257 v.AddArg(x) 2258 v.AddArg(y) 2259 return true 2260 } 2261 // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) 2262 // cond: is32Bit(c+d) && x.Op != OpSB 2263 // result: (LEAL1 [c+d] {s} x y) 2264 for { 2265 c := v.AuxInt 2266 s := v.Aux 2267 y := v.Args[0] 2268 v_1 := v.Args[1] 2269 if v_1.Op != Op386ADDLconst { 2270 break 2271 } 2272 d := v_1.AuxInt 2273 x := v_1.Args[0] 2274 if !(is32Bit(c+d) && x.Op != OpSB) { 2275 break 2276 } 2277 v.reset(Op386LEAL1) 2278 v.AuxInt = c + d 2279 v.Aux = s 2280 v.AddArg(x) 2281 v.AddArg(y) 2282 return true 2283 } 2284 // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) 2285 // cond: 2286 // result: (LEAL2 [c] {s} x y) 2287 for { 2288 c := v.AuxInt 2289 s := v.Aux 2290 x := v.Args[0] 2291 v_1 := v.Args[1] 2292 if v_1.Op != Op386SHLLconst { 2293 break 2294 } 2295 if v_1.AuxInt != 1 { 2296 break 2297 } 2298 y := v_1.Args[0] 2299 v.reset(Op386LEAL2) 2300 v.AuxInt = c 2301 v.Aux = s 2302 v.AddArg(x) 2303 v.AddArg(y) 2304 return true 2305 } 2306 // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) 2307 // cond: 2308 // result: (LEAL2 [c] {s} x y) 2309 for { 2310 c := v.AuxInt 2311 s := v.Aux 2312 v_0 := v.Args[0] 2313 if v_0.Op != Op386SHLLconst { 2314 break 2315 } 2316 if v_0.AuxInt != 1 { 2317 break 2318 } 2319 y := v_0.Args[0] 2320 x := v.Args[1] 2321 v.reset(Op386LEAL2) 2322 v.AuxInt = c 2323 v.Aux = s 2324 v.AddArg(x) 2325 v.AddArg(y) 2326 return true 2327 } 2328 // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) 2329 // cond: 2330 // result: (LEAL4 [c] {s} x y) 2331 for { 2332 c := v.AuxInt 2333 s := v.Aux 2334 x := v.Args[0] 2335 v_1 := v.Args[1] 2336 if v_1.Op != Op386SHLLconst { 2337 break 2338 } 2339 if v_1.AuxInt != 2 { 2340 break 2341 } 2342 y := v_1.Args[0] 2343 v.reset(Op386LEAL4) 2344 v.AuxInt = c 2345 v.Aux = s 2346 v.AddArg(x) 2347 v.AddArg(y) 2348 return true 2349 } 2350 // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) 2351 // cond: 2352 // result: (LEAL4 [c] {s} x y) 2353 for { 2354 c := v.AuxInt 2355 s := v.Aux 2356 v_0 := v.Args[0] 2357 if v_0.Op != Op386SHLLconst { 2358 break 2359 } 2360 if v_0.AuxInt != 2 { 2361 break 2362 } 2363 y := v_0.Args[0] 2364 x := v.Args[1] 2365 v.reset(Op386LEAL4) 2366 v.AuxInt = c 2367 v.Aux = s 2368 v.AddArg(x) 2369 v.AddArg(y) 2370 return true 2371 } 2372 // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) 2373 // cond: 2374 // result: (LEAL8 [c] {s} x y) 2375 for { 2376 c := v.AuxInt 2377 s := v.Aux 2378 x := v.Args[0] 2379 v_1 := v.Args[1] 2380 if v_1.Op != Op386SHLLconst { 2381 break 2382 } 2383 if v_1.AuxInt != 3 { 2384 break 2385 } 2386 y := v_1.Args[0] 2387 v.reset(Op386LEAL8) 2388 v.AuxInt = c 2389 v.Aux = s 2390 v.AddArg(x) 2391 v.AddArg(y) 2392 return true 2393 } 2394 // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) 2395 // cond: 2396 // result: (LEAL8 [c] {s} x y) 2397 for { 2398 c := v.AuxInt 2399 s := v.Aux 2400 v_0 := v.Args[0] 2401 if v_0.Op != Op386SHLLconst { 2402 break 2403 } 2404 if v_0.AuxInt != 3 { 2405 break 2406 } 2407 y := v_0.Args[0] 2408 x := v.Args[1] 2409 v.reset(Op386LEAL8) 2410 v.AuxInt = c 2411 v.Aux = s 2412 v.AddArg(x) 2413 v.AddArg(y) 2414 return true 2415 } 2416 // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2417 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2418 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2419 for { 2420 off1 := v.AuxInt 2421 sym1 := v.Aux 2422 v_0 := v.Args[0] 2423 if v_0.Op != Op386LEAL { 2424 break 2425 } 2426 off2 := v_0.AuxInt 2427 sym2 := v_0.Aux 2428 x := v_0.Args[0] 2429 y := v.Args[1] 2430 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2431 break 2432 } 2433 v.reset(Op386LEAL1) 2434 v.AuxInt = off1 + off2 2435 v.Aux = mergeSym(sym1, sym2) 2436 v.AddArg(x) 2437 v.AddArg(y) 2438 return true 2439 } 2440 // match: (LEAL1 [off1] {sym1} y (LEAL [off2] {sym2} x)) 2441 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2442 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2443 for { 2444 off1 := v.AuxInt 2445 sym1 := v.Aux 2446 y := v.Args[0] 2447 v_1 := v.Args[1] 2448 if v_1.Op != Op386LEAL { 2449 break 2450 } 2451 off2 := v_1.AuxInt 2452 sym2 := v_1.Aux 2453 x := v_1.Args[0] 2454 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2455 break 2456 } 2457 v.reset(Op386LEAL1) 2458 v.AuxInt = off1 + off2 2459 v.Aux = mergeSym(sym1, sym2) 2460 v.AddArg(x) 2461 v.AddArg(y) 2462 return true 2463 } 2464 return false 2465 } 2466 func rewriteValue386_Op386LEAL2_0(v *Value) bool { 2467 // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) 2468 // cond: is32Bit(c+d) && x.Op != OpSB 2469 // result: (LEAL2 [c+d] {s} x y) 2470 for { 2471 c := v.AuxInt 2472 s := v.Aux 2473 v_0 := v.Args[0] 2474 if v_0.Op != Op386ADDLconst { 2475 break 2476 } 2477 d := v_0.AuxInt 2478 x := v_0.Args[0] 2479 y := v.Args[1] 2480 if !(is32Bit(c+d) && x.Op != OpSB) { 2481 break 2482 } 2483 v.reset(Op386LEAL2) 2484 v.AuxInt = c + d 2485 v.Aux = s 2486 v.AddArg(x) 2487 v.AddArg(y) 2488 return true 2489 } 2490 // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) 2491 // cond: is32Bit(c+2*d) && y.Op != OpSB 2492 // result: (LEAL2 [c+2*d] {s} x y) 2493 for { 2494 c := v.AuxInt 2495 s := v.Aux 2496 x := v.Args[0] 2497 v_1 := v.Args[1] 2498 if v_1.Op != Op386ADDLconst { 2499 break 2500 } 2501 d := v_1.AuxInt 2502 y := v_1.Args[0] 2503 if !(is32Bit(c+2*d) && y.Op != OpSB) { 2504 break 2505 } 2506 v.reset(Op386LEAL2) 2507 v.AuxInt = c + 2*d 2508 v.Aux = s 2509 v.AddArg(x) 2510 v.AddArg(y) 2511 return true 2512 } 2513 // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) 2514 // cond: 2515 // result: (LEAL4 [c] {s} x y) 2516 for { 2517 c := v.AuxInt 2518 s := v.Aux 2519 x := v.Args[0] 2520 v_1 := v.Args[1] 2521 if v_1.Op != Op386SHLLconst { 2522 break 2523 } 2524 if v_1.AuxInt != 1 { 2525 break 2526 } 2527 y := v_1.Args[0] 2528 v.reset(Op386LEAL4) 2529 v.AuxInt = c 2530 v.Aux = s 2531 v.AddArg(x) 2532 v.AddArg(y) 2533 return true 2534 } 2535 // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) 2536 // cond: 2537 // result: (LEAL8 [c] {s} x y) 2538 for { 2539 c := v.AuxInt 2540 s := v.Aux 2541 x := v.Args[0] 2542 v_1 := v.Args[1] 2543 if v_1.Op != Op386SHLLconst { 2544 break 2545 } 2546 if v_1.AuxInt != 2 { 2547 break 2548 } 2549 y := v_1.Args[0] 2550 v.reset(Op386LEAL8) 2551 v.AuxInt = c 2552 v.Aux = s 2553 v.AddArg(x) 2554 v.AddArg(y) 2555 return true 2556 } 2557 // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2558 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2559 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2560 for { 2561 off1 := v.AuxInt 2562 sym1 := v.Aux 2563 v_0 := v.Args[0] 2564 if v_0.Op != Op386LEAL { 2565 break 2566 } 2567 off2 := v_0.AuxInt 2568 sym2 := v_0.Aux 2569 x := v_0.Args[0] 2570 y := v.Args[1] 2571 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2572 break 2573 } 2574 v.reset(Op386LEAL2) 2575 v.AuxInt = off1 + off2 2576 v.Aux = mergeSym(sym1, sym2) 2577 v.AddArg(x) 2578 v.AddArg(y) 2579 return true 2580 } 2581 return false 2582 } 2583 func rewriteValue386_Op386LEAL4_0(v *Value) bool { 2584 // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) 2585 // cond: is32Bit(c+d) && x.Op != OpSB 2586 // result: (LEAL4 [c+d] {s} x y) 2587 for { 2588 c := v.AuxInt 2589 s := v.Aux 2590 v_0 := v.Args[0] 2591 if v_0.Op != Op386ADDLconst { 2592 break 2593 } 2594 d := v_0.AuxInt 2595 x := v_0.Args[0] 2596 y := v.Args[1] 2597 if !(is32Bit(c+d) && x.Op != OpSB) { 2598 break 2599 } 2600 v.reset(Op386LEAL4) 2601 v.AuxInt = c + d 2602 v.Aux = s 2603 v.AddArg(x) 2604 v.AddArg(y) 2605 return true 2606 } 2607 // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) 2608 // cond: is32Bit(c+4*d) && y.Op != OpSB 2609 // result: (LEAL4 [c+4*d] {s} x y) 2610 for { 2611 c := v.AuxInt 2612 s := v.Aux 2613 x := v.Args[0] 2614 v_1 := v.Args[1] 2615 if v_1.Op != Op386ADDLconst { 2616 break 2617 } 2618 d := v_1.AuxInt 2619 y := v_1.Args[0] 2620 if !(is32Bit(c+4*d) && y.Op != OpSB) { 2621 break 2622 } 2623 v.reset(Op386LEAL4) 2624 v.AuxInt = c + 4*d 2625 v.Aux = s 2626 v.AddArg(x) 2627 v.AddArg(y) 2628 return true 2629 } 2630 // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) 2631 // cond: 2632 // result: (LEAL8 [c] {s} x y) 2633 for { 2634 c := v.AuxInt 2635 s := v.Aux 2636 x := v.Args[0] 2637 v_1 := v.Args[1] 2638 if v_1.Op != Op386SHLLconst { 2639 break 2640 } 2641 if v_1.AuxInt != 1 { 2642 break 2643 } 2644 y := v_1.Args[0] 2645 v.reset(Op386LEAL8) 2646 v.AuxInt = c 2647 v.Aux = s 2648 v.AddArg(x) 2649 v.AddArg(y) 2650 return true 2651 } 2652 // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2653 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2654 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2655 for { 2656 off1 := v.AuxInt 2657 sym1 := v.Aux 2658 v_0 := v.Args[0] 2659 if v_0.Op != Op386LEAL { 2660 break 2661 } 2662 off2 := v_0.AuxInt 2663 sym2 := v_0.Aux 2664 x := v_0.Args[0] 2665 y := v.Args[1] 2666 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2667 break 2668 } 2669 v.reset(Op386LEAL4) 2670 v.AuxInt = off1 + off2 2671 v.Aux = mergeSym(sym1, sym2) 2672 v.AddArg(x) 2673 v.AddArg(y) 2674 return true 2675 } 2676 return false 2677 } 2678 func rewriteValue386_Op386LEAL8_0(v *Value) bool { 2679 // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) 2680 // cond: is32Bit(c+d) && x.Op != OpSB 2681 // result: (LEAL8 [c+d] {s} x y) 2682 for { 2683 c := v.AuxInt 2684 s := v.Aux 2685 v_0 := v.Args[0] 2686 if v_0.Op != Op386ADDLconst { 2687 break 2688 } 2689 d := v_0.AuxInt 2690 x := v_0.Args[0] 2691 y := v.Args[1] 2692 if !(is32Bit(c+d) && x.Op != OpSB) { 2693 break 2694 } 2695 v.reset(Op386LEAL8) 2696 v.AuxInt = c + d 2697 v.Aux = s 2698 v.AddArg(x) 2699 v.AddArg(y) 2700 return true 2701 } 2702 // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) 2703 // cond: is32Bit(c+8*d) && y.Op != OpSB 2704 // result: (LEAL8 [c+8*d] {s} x y) 2705 for { 2706 c := v.AuxInt 2707 s := v.Aux 2708 x := v.Args[0] 2709 v_1 := v.Args[1] 2710 if v_1.Op != Op386ADDLconst { 2711 break 2712 } 2713 d := v_1.AuxInt 2714 y := v_1.Args[0] 2715 if !(is32Bit(c+8*d) && y.Op != OpSB) { 2716 break 2717 } 2718 v.reset(Op386LEAL8) 2719 v.AuxInt = c + 8*d 2720 v.Aux = s 2721 v.AddArg(x) 2722 v.AddArg(y) 2723 return true 2724 } 2725 // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2726 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2727 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2728 for { 2729 off1 := v.AuxInt 2730 sym1 := v.Aux 2731 v_0 := v.Args[0] 2732 if v_0.Op != Op386LEAL { 2733 break 2734 } 2735 off2 := v_0.AuxInt 2736 sym2 := v_0.Aux 2737 x := v_0.Args[0] 2738 y := v.Args[1] 2739 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2740 break 2741 } 2742 v.reset(Op386LEAL8) 2743 v.AuxInt = off1 + off2 2744 v.Aux = mergeSym(sym1, sym2) 2745 v.AddArg(x) 2746 v.AddArg(y) 2747 return true 2748 } 2749 return false 2750 } 2751 func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { 2752 b := v.Block 2753 _ = b 2754 // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) 2755 // cond: x.Uses == 1 && clobber(x) 2756 // result: @x.Block (MOVBLSXload <v.Type> [off] {sym} ptr mem) 2757 for { 2758 x := v.Args[0] 2759 if x.Op != Op386MOVBload { 2760 break 2761 } 2762 off := x.AuxInt 2763 sym := x.Aux 2764 ptr := x.Args[0] 2765 mem := x.Args[1] 2766 if !(x.Uses == 1 && clobber(x)) { 2767 break 2768 } 2769 b = x.Block 2770 v0 := b.NewValue0(v.Pos, Op386MOVBLSXload, v.Type) 2771 v.reset(OpCopy) 2772 v.AddArg(v0) 2773 v0.AuxInt = off 2774 v0.Aux = sym 2775 v0.AddArg(ptr) 2776 v0.AddArg(mem) 2777 return true 2778 } 2779 // match: (MOVBLSX (ANDLconst [c] x)) 2780 // cond: c & 0x80 == 0 2781 // result: (ANDLconst [c & 0x7f] x) 2782 for { 2783 v_0 := v.Args[0] 2784 if v_0.Op != Op386ANDLconst { 2785 break 2786 } 2787 c := v_0.AuxInt 2788 x := v_0.Args[0] 2789 if !(c&0x80 == 0) { 2790 break 2791 } 2792 v.reset(Op386ANDLconst) 2793 v.AuxInt = c & 0x7f 2794 v.AddArg(x) 2795 return true 2796 } 2797 return false 2798 } 2799 func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { 2800 b := v.Block 2801 _ = b 2802 config := b.Func.Config 2803 _ = config 2804 // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2805 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2806 // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2807 for { 2808 off1 := v.AuxInt 2809 sym1 := v.Aux 2810 v_0 := v.Args[0] 2811 if v_0.Op != Op386LEAL { 2812 break 2813 } 2814 off2 := v_0.AuxInt 2815 sym2 := v_0.Aux 2816 base := v_0.Args[0] 2817 mem := v.Args[1] 2818 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2819 break 2820 } 2821 v.reset(Op386MOVBLSXload) 2822 v.AuxInt = off1 + off2 2823 v.Aux = mergeSym(sym1, sym2) 2824 v.AddArg(base) 2825 v.AddArg(mem) 2826 return true 2827 } 2828 return false 2829 } 2830 func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { 2831 b := v.Block 2832 _ = b 2833 // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) 2834 // cond: x.Uses == 1 && clobber(x) 2835 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 2836 for { 2837 x := v.Args[0] 2838 if x.Op != Op386MOVBload { 2839 break 2840 } 2841 off := x.AuxInt 2842 sym := x.Aux 2843 ptr := x.Args[0] 2844 mem := x.Args[1] 2845 if !(x.Uses == 1 && clobber(x)) { 2846 break 2847 } 2848 b = x.Block 2849 v0 := b.NewValue0(v.Pos, Op386MOVBload, v.Type) 2850 v.reset(OpCopy) 2851 v.AddArg(v0) 2852 v0.AuxInt = off 2853 v0.Aux = sym 2854 v0.AddArg(ptr) 2855 v0.AddArg(mem) 2856 return true 2857 } 2858 // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) 2859 // cond: x.Uses == 1 && clobber(x) 2860 // result: @x.Block (MOVBloadidx1 <v.Type> [off] {sym} ptr idx mem) 2861 for { 2862 x := v.Args[0] 2863 if x.Op != Op386MOVBloadidx1 { 2864 break 2865 } 2866 off := x.AuxInt 2867 sym := x.Aux 2868 ptr := x.Args[0] 2869 idx := x.Args[1] 2870 mem := x.Args[2] 2871 if !(x.Uses == 1 && clobber(x)) { 2872 break 2873 } 2874 b = x.Block 2875 v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) 2876 v.reset(OpCopy) 2877 v.AddArg(v0) 2878 v0.AuxInt = off 2879 v0.Aux = sym 2880 v0.AddArg(ptr) 2881 v0.AddArg(idx) 2882 v0.AddArg(mem) 2883 return true 2884 } 2885 // match: (MOVBLZX (ANDLconst [c] x)) 2886 // cond: 2887 // result: (ANDLconst [c & 0xff] x) 2888 for { 2889 v_0 := v.Args[0] 2890 if v_0.Op != Op386ANDLconst { 2891 break 2892 } 2893 c := v_0.AuxInt 2894 x := v_0.Args[0] 2895 v.reset(Op386ANDLconst) 2896 v.AuxInt = c & 0xff 2897 v.AddArg(x) 2898 return true 2899 } 2900 return false 2901 } 2902 func rewriteValue386_Op386MOVBload_0(v *Value) bool { 2903 b := v.Block 2904 _ = b 2905 config := b.Func.Config 2906 _ = config 2907 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 2908 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 2909 // result: x 2910 for { 2911 off := v.AuxInt 2912 sym := v.Aux 2913 ptr := v.Args[0] 2914 v_1 := v.Args[1] 2915 if v_1.Op != Op386MOVBstore { 2916 break 2917 } 2918 off2 := v_1.AuxInt 2919 sym2 := v_1.Aux 2920 ptr2 := v_1.Args[0] 2921 x := v_1.Args[1] 2922 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 2923 break 2924 } 2925 v.reset(OpCopy) 2926 v.Type = x.Type 2927 v.AddArg(x) 2928 return true 2929 } 2930 // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) 2931 // cond: is32Bit(off1+off2) 2932 // result: (MOVBload [off1+off2] {sym} ptr mem) 2933 for { 2934 off1 := v.AuxInt 2935 sym := v.Aux 2936 v_0 := v.Args[0] 2937 if v_0.Op != Op386ADDLconst { 2938 break 2939 } 2940 off2 := v_0.AuxInt 2941 ptr := v_0.Args[0] 2942 mem := v.Args[1] 2943 if !(is32Bit(off1 + off2)) { 2944 break 2945 } 2946 v.reset(Op386MOVBload) 2947 v.AuxInt = off1 + off2 2948 v.Aux = sym 2949 v.AddArg(ptr) 2950 v.AddArg(mem) 2951 return true 2952 } 2953 // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2954 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2955 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2956 for { 2957 off1 := v.AuxInt 2958 sym1 := v.Aux 2959 v_0 := v.Args[0] 2960 if v_0.Op != Op386LEAL { 2961 break 2962 } 2963 off2 := v_0.AuxInt 2964 sym2 := v_0.Aux 2965 base := v_0.Args[0] 2966 mem := v.Args[1] 2967 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2968 break 2969 } 2970 v.reset(Op386MOVBload) 2971 v.AuxInt = off1 + off2 2972 v.Aux = mergeSym(sym1, sym2) 2973 v.AddArg(base) 2974 v.AddArg(mem) 2975 return true 2976 } 2977 // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 2978 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2979 // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 2980 for { 2981 off1 := v.AuxInt 2982 sym1 := v.Aux 2983 v_0 := v.Args[0] 2984 if v_0.Op != Op386LEAL1 { 2985 break 2986 } 2987 off2 := v_0.AuxInt 2988 sym2 := v_0.Aux 2989 ptr := v_0.Args[0] 2990 idx := v_0.Args[1] 2991 mem := v.Args[1] 2992 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2993 break 2994 } 2995 v.reset(Op386MOVBloadidx1) 2996 v.AuxInt = off1 + off2 2997 v.Aux = mergeSym(sym1, sym2) 2998 v.AddArg(ptr) 2999 v.AddArg(idx) 3000 v.AddArg(mem) 3001 return true 3002 } 3003 // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) 3004 // cond: ptr.Op != OpSB 3005 // result: (MOVBloadidx1 [off] {sym} ptr idx mem) 3006 for { 3007 off := v.AuxInt 3008 sym := v.Aux 3009 v_0 := v.Args[0] 3010 if v_0.Op != Op386ADDL { 3011 break 3012 } 3013 ptr := v_0.Args[0] 3014 idx := v_0.Args[1] 3015 mem := v.Args[1] 3016 if !(ptr.Op != OpSB) { 3017 break 3018 } 3019 v.reset(Op386MOVBloadidx1) 3020 v.AuxInt = off 3021 v.Aux = sym 3022 v.AddArg(ptr) 3023 v.AddArg(idx) 3024 v.AddArg(mem) 3025 return true 3026 } 3027 return false 3028 } 3029 func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { 3030 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 3031 // cond: 3032 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3033 for { 3034 c := v.AuxInt 3035 sym := v.Aux 3036 v_0 := v.Args[0] 3037 if v_0.Op != Op386ADDLconst { 3038 break 3039 } 3040 d := v_0.AuxInt 3041 ptr := v_0.Args[0] 3042 idx := v.Args[1] 3043 mem := v.Args[2] 3044 v.reset(Op386MOVBloadidx1) 3045 v.AuxInt = c + d 3046 v.Aux = sym 3047 v.AddArg(ptr) 3048 v.AddArg(idx) 3049 v.AddArg(mem) 3050 return true 3051 } 3052 // match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 3053 // cond: 3054 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3055 for { 3056 c := v.AuxInt 3057 sym := v.Aux 3058 idx := v.Args[0] 3059 v_1 := v.Args[1] 3060 if v_1.Op != Op386ADDLconst { 3061 break 3062 } 3063 d := v_1.AuxInt 3064 ptr := v_1.Args[0] 3065 mem := v.Args[2] 3066 v.reset(Op386MOVBloadidx1) 3067 v.AuxInt = c + d 3068 v.Aux = sym 3069 v.AddArg(ptr) 3070 v.AddArg(idx) 3071 v.AddArg(mem) 3072 return true 3073 } 3074 // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 3075 // cond: 3076 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3077 for { 3078 c := v.AuxInt 3079 sym := v.Aux 3080 ptr := v.Args[0] 3081 v_1 := v.Args[1] 3082 if v_1.Op != Op386ADDLconst { 3083 break 3084 } 3085 d := v_1.AuxInt 3086 idx := v_1.Args[0] 3087 mem := v.Args[2] 3088 v.reset(Op386MOVBloadidx1) 3089 v.AuxInt = c + d 3090 v.Aux = sym 3091 v.AddArg(ptr) 3092 v.AddArg(idx) 3093 v.AddArg(mem) 3094 return true 3095 } 3096 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 3097 // cond: 3098 // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) 3099 for { 3100 c := v.AuxInt 3101 sym := v.Aux 3102 v_0 := v.Args[0] 3103 if v_0.Op != Op386ADDLconst { 3104 break 3105 } 3106 d := v_0.AuxInt 3107 idx := v_0.Args[0] 3108 ptr := v.Args[1] 3109 mem := v.Args[2] 3110 v.reset(Op386MOVBloadidx1) 3111 v.AuxInt = c + d 3112 v.Aux = sym 3113 v.AddArg(ptr) 3114 v.AddArg(idx) 3115 v.AddArg(mem) 3116 return true 3117 } 3118 return false 3119 } 3120 func rewriteValue386_Op386MOVBstore_0(v *Value) bool { 3121 b := v.Block 3122 _ = b 3123 config := b.Func.Config 3124 _ = config 3125 // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) 3126 // cond: 3127 // result: (MOVBstore [off] {sym} ptr x mem) 3128 for { 3129 off := v.AuxInt 3130 sym := v.Aux 3131 ptr := v.Args[0] 3132 v_1 := v.Args[1] 3133 if v_1.Op != Op386MOVBLSX { 3134 break 3135 } 3136 x := v_1.Args[0] 3137 mem := v.Args[2] 3138 v.reset(Op386MOVBstore) 3139 v.AuxInt = off 3140 v.Aux = sym 3141 v.AddArg(ptr) 3142 v.AddArg(x) 3143 v.AddArg(mem) 3144 return true 3145 } 3146 // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) 3147 // cond: 3148 // result: (MOVBstore [off] {sym} ptr x mem) 3149 for { 3150 off := v.AuxInt 3151 sym := v.Aux 3152 ptr := v.Args[0] 3153 v_1 := v.Args[1] 3154 if v_1.Op != Op386MOVBLZX { 3155 break 3156 } 3157 x := v_1.Args[0] 3158 mem := v.Args[2] 3159 v.reset(Op386MOVBstore) 3160 v.AuxInt = off 3161 v.Aux = sym 3162 v.AddArg(ptr) 3163 v.AddArg(x) 3164 v.AddArg(mem) 3165 return true 3166 } 3167 // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 3168 // cond: is32Bit(off1+off2) 3169 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3170 for { 3171 off1 := v.AuxInt 3172 sym := v.Aux 3173 v_0 := v.Args[0] 3174 if v_0.Op != Op386ADDLconst { 3175 break 3176 } 3177 off2 := v_0.AuxInt 3178 ptr := v_0.Args[0] 3179 val := v.Args[1] 3180 mem := v.Args[2] 3181 if !(is32Bit(off1 + off2)) { 3182 break 3183 } 3184 v.reset(Op386MOVBstore) 3185 v.AuxInt = off1 + off2 3186 v.Aux = sym 3187 v.AddArg(ptr) 3188 v.AddArg(val) 3189 v.AddArg(mem) 3190 return true 3191 } 3192 // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) 3193 // cond: validOff(off) 3194 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 3195 for { 3196 off := v.AuxInt 3197 sym := v.Aux 3198 ptr := v.Args[0] 3199 v_1 := v.Args[1] 3200 if v_1.Op != Op386MOVLconst { 3201 break 3202 } 3203 c := v_1.AuxInt 3204 mem := v.Args[2] 3205 if !(validOff(off)) { 3206 break 3207 } 3208 v.reset(Op386MOVBstoreconst) 3209 v.AuxInt = makeValAndOff(int64(int8(c)), off) 3210 v.Aux = sym 3211 v.AddArg(ptr) 3212 v.AddArg(mem) 3213 return true 3214 } 3215 // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 3216 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3217 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 3218 for { 3219 off1 := v.AuxInt 3220 sym1 := v.Aux 3221 v_0 := v.Args[0] 3222 if v_0.Op != Op386LEAL { 3223 break 3224 } 3225 off2 := v_0.AuxInt 3226 sym2 := v_0.Aux 3227 base := v_0.Args[0] 3228 val := v.Args[1] 3229 mem := v.Args[2] 3230 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3231 break 3232 } 3233 v.reset(Op386MOVBstore) 3234 v.AuxInt = off1 + off2 3235 v.Aux = mergeSym(sym1, sym2) 3236 v.AddArg(base) 3237 v.AddArg(val) 3238 v.AddArg(mem) 3239 return true 3240 } 3241 // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 3242 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3243 // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3244 for { 3245 off1 := v.AuxInt 3246 sym1 := v.Aux 3247 v_0 := v.Args[0] 3248 if v_0.Op != Op386LEAL1 { 3249 break 3250 } 3251 off2 := v_0.AuxInt 3252 sym2 := v_0.Aux 3253 ptr := v_0.Args[0] 3254 idx := v_0.Args[1] 3255 val := v.Args[1] 3256 mem := v.Args[2] 3257 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3258 break 3259 } 3260 v.reset(Op386MOVBstoreidx1) 3261 v.AuxInt = off1 + off2 3262 v.Aux = mergeSym(sym1, sym2) 3263 v.AddArg(ptr) 3264 v.AddArg(idx) 3265 v.AddArg(val) 3266 v.AddArg(mem) 3267 return true 3268 } 3269 // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) 3270 // cond: ptr.Op != OpSB 3271 // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) 3272 for { 3273 off := v.AuxInt 3274 sym := v.Aux 3275 v_0 := v.Args[0] 3276 if v_0.Op != Op386ADDL { 3277 break 3278 } 3279 ptr := v_0.Args[0] 3280 idx := v_0.Args[1] 3281 val := v.Args[1] 3282 mem := v.Args[2] 3283 if !(ptr.Op != OpSB) { 3284 break 3285 } 3286 v.reset(Op386MOVBstoreidx1) 3287 v.AuxInt = off 3288 v.Aux = sym 3289 v.AddArg(ptr) 3290 v.AddArg(idx) 3291 v.AddArg(val) 3292 v.AddArg(mem) 3293 return true 3294 } 3295 // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 3296 // cond: x.Uses == 1 && clobber(x) 3297 // result: (MOVWstore [i-1] {s} p w mem) 3298 for { 3299 i := v.AuxInt 3300 s := v.Aux 3301 p := v.Args[0] 3302 v_1 := v.Args[1] 3303 if v_1.Op != Op386SHRLconst { 3304 break 3305 } 3306 if v_1.AuxInt != 8 { 3307 break 3308 } 3309 w := v_1.Args[0] 3310 x := v.Args[2] 3311 if x.Op != Op386MOVBstore { 3312 break 3313 } 3314 if x.AuxInt != i-1 { 3315 break 3316 } 3317 if x.Aux != s { 3318 break 3319 } 3320 if p != x.Args[0] { 3321 break 3322 } 3323 if w != x.Args[1] { 3324 break 3325 } 3326 mem := x.Args[2] 3327 if !(x.Uses == 1 && clobber(x)) { 3328 break 3329 } 3330 v.reset(Op386MOVWstore) 3331 v.AuxInt = i - 1 3332 v.Aux = s 3333 v.AddArg(p) 3334 v.AddArg(w) 3335 v.AddArg(mem) 3336 return true 3337 } 3338 // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) 3339 // cond: x.Uses == 1 && clobber(x) 3340 // result: (MOVWstore [i-1] {s} p w0 mem) 3341 for { 3342 i := v.AuxInt 3343 s := v.Aux 3344 p := v.Args[0] 3345 v_1 := v.Args[1] 3346 if v_1.Op != Op386SHRLconst { 3347 break 3348 } 3349 j := v_1.AuxInt 3350 w := v_1.Args[0] 3351 x := v.Args[2] 3352 if x.Op != Op386MOVBstore { 3353 break 3354 } 3355 if x.AuxInt != i-1 { 3356 break 3357 } 3358 if x.Aux != s { 3359 break 3360 } 3361 if p != x.Args[0] { 3362 break 3363 } 3364 w0 := x.Args[1] 3365 if w0.Op != Op386SHRLconst { 3366 break 3367 } 3368 if w0.AuxInt != j-8 { 3369 break 3370 } 3371 if w != w0.Args[0] { 3372 break 3373 } 3374 mem := x.Args[2] 3375 if !(x.Uses == 1 && clobber(x)) { 3376 break 3377 } 3378 v.reset(Op386MOVWstore) 3379 v.AuxInt = i - 1 3380 v.Aux = s 3381 v.AddArg(p) 3382 v.AddArg(w0) 3383 v.AddArg(mem) 3384 return true 3385 } 3386 return false 3387 } 3388 func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { 3389 b := v.Block 3390 _ = b 3391 config := b.Func.Config 3392 _ = config 3393 // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 3394 // cond: ValAndOff(sc).canAdd(off) 3395 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 3396 for { 3397 sc := v.AuxInt 3398 s := v.Aux 3399 v_0 := v.Args[0] 3400 if v_0.Op != Op386ADDLconst { 3401 break 3402 } 3403 off := v_0.AuxInt 3404 ptr := v_0.Args[0] 3405 mem := v.Args[1] 3406 if !(ValAndOff(sc).canAdd(off)) { 3407 break 3408 } 3409 v.reset(Op386MOVBstoreconst) 3410 v.AuxInt = ValAndOff(sc).add(off) 3411 v.Aux = s 3412 v.AddArg(ptr) 3413 v.AddArg(mem) 3414 return true 3415 } 3416 // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 3417 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 3418 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 3419 for { 3420 sc := v.AuxInt 3421 sym1 := v.Aux 3422 v_0 := v.Args[0] 3423 if v_0.Op != Op386LEAL { 3424 break 3425 } 3426 off := v_0.AuxInt 3427 sym2 := v_0.Aux 3428 ptr := v_0.Args[0] 3429 mem := v.Args[1] 3430 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 3431 break 3432 } 3433 v.reset(Op386MOVBstoreconst) 3434 v.AuxInt = ValAndOff(sc).add(off) 3435 v.Aux = mergeSym(sym1, sym2) 3436 v.AddArg(ptr) 3437 v.AddArg(mem) 3438 return true 3439 } 3440 // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 3441 // cond: canMergeSym(sym1, sym2) 3442 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 3443 for { 3444 x := v.AuxInt 3445 sym1 := v.Aux 3446 v_0 := v.Args[0] 3447 if v_0.Op != Op386LEAL1 { 3448 break 3449 } 3450 off := v_0.AuxInt 3451 sym2 := v_0.Aux 3452 ptr := v_0.Args[0] 3453 idx := v_0.Args[1] 3454 mem := v.Args[1] 3455 if !(canMergeSym(sym1, sym2)) { 3456 break 3457 } 3458 v.reset(Op386MOVBstoreconstidx1) 3459 v.AuxInt = ValAndOff(x).add(off) 3460 v.Aux = mergeSym(sym1, sym2) 3461 v.AddArg(ptr) 3462 v.AddArg(idx) 3463 v.AddArg(mem) 3464 return true 3465 } 3466 // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) 3467 // cond: 3468 // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) 3469 for { 3470 x := v.AuxInt 3471 sym := v.Aux 3472 v_0 := v.Args[0] 3473 if v_0.Op != Op386ADDL { 3474 break 3475 } 3476 ptr := v_0.Args[0] 3477 idx := v_0.Args[1] 3478 mem := v.Args[1] 3479 v.reset(Op386MOVBstoreconstidx1) 3480 v.AuxInt = x 3481 v.Aux = sym 3482 v.AddArg(ptr) 3483 v.AddArg(idx) 3484 v.AddArg(mem) 3485 return true 3486 } 3487 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 3488 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3489 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 3490 for { 3491 c := v.AuxInt 3492 s := v.Aux 3493 p := v.Args[0] 3494 x := v.Args[1] 3495 if x.Op != Op386MOVBstoreconst { 3496 break 3497 } 3498 a := x.AuxInt 3499 if x.Aux != s { 3500 break 3501 } 3502 if p != x.Args[0] { 3503 break 3504 } 3505 mem := x.Args[1] 3506 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3507 break 3508 } 3509 v.reset(Op386MOVWstoreconst) 3510 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3511 v.Aux = s 3512 v.AddArg(p) 3513 v.AddArg(mem) 3514 return true 3515 } 3516 return false 3517 } 3518 func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { 3519 // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 3520 // cond: 3521 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3522 for { 3523 x := v.AuxInt 3524 sym := v.Aux 3525 v_0 := v.Args[0] 3526 if v_0.Op != Op386ADDLconst { 3527 break 3528 } 3529 c := v_0.AuxInt 3530 ptr := v_0.Args[0] 3531 idx := v.Args[1] 3532 mem := v.Args[2] 3533 v.reset(Op386MOVBstoreconstidx1) 3534 v.AuxInt = ValAndOff(x).add(c) 3535 v.Aux = sym 3536 v.AddArg(ptr) 3537 v.AddArg(idx) 3538 v.AddArg(mem) 3539 return true 3540 } 3541 // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 3542 // cond: 3543 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3544 for { 3545 x := v.AuxInt 3546 sym := v.Aux 3547 ptr := v.Args[0] 3548 v_1 := v.Args[1] 3549 if v_1.Op != Op386ADDLconst { 3550 break 3551 } 3552 c := v_1.AuxInt 3553 idx := v_1.Args[0] 3554 mem := v.Args[2] 3555 v.reset(Op386MOVBstoreconstidx1) 3556 v.AuxInt = ValAndOff(x).add(c) 3557 v.Aux = sym 3558 v.AddArg(ptr) 3559 v.AddArg(idx) 3560 v.AddArg(mem) 3561 return true 3562 } 3563 // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) 3564 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3565 // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) 3566 for { 3567 c := v.AuxInt 3568 s := v.Aux 3569 p := v.Args[0] 3570 i := v.Args[1] 3571 x := v.Args[2] 3572 if x.Op != Op386MOVBstoreconstidx1 { 3573 break 3574 } 3575 a := x.AuxInt 3576 if x.Aux != s { 3577 break 3578 } 3579 if p != x.Args[0] { 3580 break 3581 } 3582 if i != x.Args[1] { 3583 break 3584 } 3585 mem := x.Args[2] 3586 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3587 break 3588 } 3589 v.reset(Op386MOVWstoreconstidx1) 3590 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3591 v.Aux = s 3592 v.AddArg(p) 3593 v.AddArg(i) 3594 v.AddArg(mem) 3595 return true 3596 } 3597 return false 3598 } 3599 func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { 3600 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 3601 // cond: 3602 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3603 for { 3604 c := v.AuxInt 3605 sym := v.Aux 3606 v_0 := v.Args[0] 3607 if v_0.Op != Op386ADDLconst { 3608 break 3609 } 3610 d := v_0.AuxInt 3611 ptr := v_0.Args[0] 3612 idx := v.Args[1] 3613 val := v.Args[2] 3614 mem := v.Args[3] 3615 v.reset(Op386MOVBstoreidx1) 3616 v.AuxInt = c + d 3617 v.Aux = sym 3618 v.AddArg(ptr) 3619 v.AddArg(idx) 3620 v.AddArg(val) 3621 v.AddArg(mem) 3622 return true 3623 } 3624 // match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 3625 // cond: 3626 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3627 for { 3628 c := v.AuxInt 3629 sym := v.Aux 3630 idx := v.Args[0] 3631 v_1 := v.Args[1] 3632 if v_1.Op != Op386ADDLconst { 3633 break 3634 } 3635 d := v_1.AuxInt 3636 ptr := v_1.Args[0] 3637 val := v.Args[2] 3638 mem := v.Args[3] 3639 v.reset(Op386MOVBstoreidx1) 3640 v.AuxInt = c + d 3641 v.Aux = sym 3642 v.AddArg(ptr) 3643 v.AddArg(idx) 3644 v.AddArg(val) 3645 v.AddArg(mem) 3646 return true 3647 } 3648 // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 3649 // cond: 3650 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3651 for { 3652 c := v.AuxInt 3653 sym := v.Aux 3654 ptr := v.Args[0] 3655 v_1 := v.Args[1] 3656 if v_1.Op != Op386ADDLconst { 3657 break 3658 } 3659 d := v_1.AuxInt 3660 idx := v_1.Args[0] 3661 val := v.Args[2] 3662 mem := v.Args[3] 3663 v.reset(Op386MOVBstoreidx1) 3664 v.AuxInt = c + d 3665 v.Aux = sym 3666 v.AddArg(ptr) 3667 v.AddArg(idx) 3668 v.AddArg(val) 3669 v.AddArg(mem) 3670 return true 3671 } 3672 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 3673 // cond: 3674 // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) 3675 for { 3676 c := v.AuxInt 3677 sym := v.Aux 3678 v_0 := v.Args[0] 3679 if v_0.Op != Op386ADDLconst { 3680 break 3681 } 3682 d := v_0.AuxInt 3683 idx := v_0.Args[0] 3684 ptr := v.Args[1] 3685 val := v.Args[2] 3686 mem := v.Args[3] 3687 v.reset(Op386MOVBstoreidx1) 3688 v.AuxInt = c + d 3689 v.Aux = sym 3690 v.AddArg(ptr) 3691 v.AddArg(idx) 3692 v.AddArg(val) 3693 v.AddArg(mem) 3694 return true 3695 } 3696 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3697 // cond: x.Uses == 1 && clobber(x) 3698 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3699 for { 3700 i := v.AuxInt 3701 s := v.Aux 3702 p := v.Args[0] 3703 idx := v.Args[1] 3704 v_2 := v.Args[2] 3705 if v_2.Op != Op386SHRLconst { 3706 break 3707 } 3708 if v_2.AuxInt != 8 { 3709 break 3710 } 3711 w := v_2.Args[0] 3712 x := v.Args[3] 3713 if x.Op != Op386MOVBstoreidx1 { 3714 break 3715 } 3716 if x.AuxInt != i-1 { 3717 break 3718 } 3719 if x.Aux != s { 3720 break 3721 } 3722 if p != x.Args[0] { 3723 break 3724 } 3725 if idx != x.Args[1] { 3726 break 3727 } 3728 if w != x.Args[2] { 3729 break 3730 } 3731 mem := x.Args[3] 3732 if !(x.Uses == 1 && clobber(x)) { 3733 break 3734 } 3735 v.reset(Op386MOVWstoreidx1) 3736 v.AuxInt = i - 1 3737 v.Aux = s 3738 v.AddArg(p) 3739 v.AddArg(idx) 3740 v.AddArg(w) 3741 v.AddArg(mem) 3742 return true 3743 } 3744 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3745 // cond: x.Uses == 1 && clobber(x) 3746 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3747 for { 3748 i := v.AuxInt 3749 s := v.Aux 3750 p := v.Args[0] 3751 idx := v.Args[1] 3752 v_2 := v.Args[2] 3753 if v_2.Op != Op386SHRLconst { 3754 break 3755 } 3756 if v_2.AuxInt != 8 { 3757 break 3758 } 3759 w := v_2.Args[0] 3760 x := v.Args[3] 3761 if x.Op != Op386MOVBstoreidx1 { 3762 break 3763 } 3764 if x.AuxInt != i-1 { 3765 break 3766 } 3767 if x.Aux != s { 3768 break 3769 } 3770 if idx != x.Args[0] { 3771 break 3772 } 3773 if p != x.Args[1] { 3774 break 3775 } 3776 if w != x.Args[2] { 3777 break 3778 } 3779 mem := x.Args[3] 3780 if !(x.Uses == 1 && clobber(x)) { 3781 break 3782 } 3783 v.reset(Op386MOVWstoreidx1) 3784 v.AuxInt = i - 1 3785 v.Aux = s 3786 v.AddArg(p) 3787 v.AddArg(idx) 3788 v.AddArg(w) 3789 v.AddArg(mem) 3790 return true 3791 } 3792 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3793 // cond: x.Uses == 1 && clobber(x) 3794 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3795 for { 3796 i := v.AuxInt 3797 s := v.Aux 3798 idx := v.Args[0] 3799 p := v.Args[1] 3800 v_2 := v.Args[2] 3801 if v_2.Op != Op386SHRLconst { 3802 break 3803 } 3804 if v_2.AuxInt != 8 { 3805 break 3806 } 3807 w := v_2.Args[0] 3808 x := v.Args[3] 3809 if x.Op != Op386MOVBstoreidx1 { 3810 break 3811 } 3812 if x.AuxInt != i-1 { 3813 break 3814 } 3815 if x.Aux != s { 3816 break 3817 } 3818 if p != x.Args[0] { 3819 break 3820 } 3821 if idx != x.Args[1] { 3822 break 3823 } 3824 if w != x.Args[2] { 3825 break 3826 } 3827 mem := x.Args[3] 3828 if !(x.Uses == 1 && clobber(x)) { 3829 break 3830 } 3831 v.reset(Op386MOVWstoreidx1) 3832 v.AuxInt = i - 1 3833 v.Aux = s 3834 v.AddArg(p) 3835 v.AddArg(idx) 3836 v.AddArg(w) 3837 v.AddArg(mem) 3838 return true 3839 } 3840 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3841 // cond: x.Uses == 1 && clobber(x) 3842 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3843 for { 3844 i := v.AuxInt 3845 s := v.Aux 3846 idx := v.Args[0] 3847 p := v.Args[1] 3848 v_2 := v.Args[2] 3849 if v_2.Op != Op386SHRLconst { 3850 break 3851 } 3852 if v_2.AuxInt != 8 { 3853 break 3854 } 3855 w := v_2.Args[0] 3856 x := v.Args[3] 3857 if x.Op != Op386MOVBstoreidx1 { 3858 break 3859 } 3860 if x.AuxInt != i-1 { 3861 break 3862 } 3863 if x.Aux != s { 3864 break 3865 } 3866 if idx != x.Args[0] { 3867 break 3868 } 3869 if p != x.Args[1] { 3870 break 3871 } 3872 if w != x.Args[2] { 3873 break 3874 } 3875 mem := x.Args[3] 3876 if !(x.Uses == 1 && clobber(x)) { 3877 break 3878 } 3879 v.reset(Op386MOVWstoreidx1) 3880 v.AuxInt = i - 1 3881 v.Aux = s 3882 v.AddArg(p) 3883 v.AddArg(idx) 3884 v.AddArg(w) 3885 v.AddArg(mem) 3886 return true 3887 } 3888 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 3889 // cond: x.Uses == 1 && clobber(x) 3890 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 3891 for { 3892 i := v.AuxInt 3893 s := v.Aux 3894 p := v.Args[0] 3895 idx := v.Args[1] 3896 v_2 := v.Args[2] 3897 if v_2.Op != Op386SHRLconst { 3898 break 3899 } 3900 j := v_2.AuxInt 3901 w := v_2.Args[0] 3902 x := v.Args[3] 3903 if x.Op != Op386MOVBstoreidx1 { 3904 break 3905 } 3906 if x.AuxInt != i-1 { 3907 break 3908 } 3909 if x.Aux != s { 3910 break 3911 } 3912 if p != x.Args[0] { 3913 break 3914 } 3915 if idx != x.Args[1] { 3916 break 3917 } 3918 w0 := x.Args[2] 3919 if w0.Op != Op386SHRLconst { 3920 break 3921 } 3922 if w0.AuxInt != j-8 { 3923 break 3924 } 3925 if w != w0.Args[0] { 3926 break 3927 } 3928 mem := x.Args[3] 3929 if !(x.Uses == 1 && clobber(x)) { 3930 break 3931 } 3932 v.reset(Op386MOVWstoreidx1) 3933 v.AuxInt = i - 1 3934 v.Aux = s 3935 v.AddArg(p) 3936 v.AddArg(idx) 3937 v.AddArg(w0) 3938 v.AddArg(mem) 3939 return true 3940 } 3941 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 3942 // cond: x.Uses == 1 && clobber(x) 3943 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 3944 for { 3945 i := v.AuxInt 3946 s := v.Aux 3947 p := v.Args[0] 3948 idx := v.Args[1] 3949 v_2 := v.Args[2] 3950 if v_2.Op != Op386SHRLconst { 3951 break 3952 } 3953 j := v_2.AuxInt 3954 w := v_2.Args[0] 3955 x := v.Args[3] 3956 if x.Op != Op386MOVBstoreidx1 { 3957 break 3958 } 3959 if x.AuxInt != i-1 { 3960 break 3961 } 3962 if x.Aux != s { 3963 break 3964 } 3965 if idx != x.Args[0] { 3966 break 3967 } 3968 if p != x.Args[1] { 3969 break 3970 } 3971 w0 := x.Args[2] 3972 if w0.Op != Op386SHRLconst { 3973 break 3974 } 3975 if w0.AuxInt != j-8 { 3976 break 3977 } 3978 if w != w0.Args[0] { 3979 break 3980 } 3981 mem := x.Args[3] 3982 if !(x.Uses == 1 && clobber(x)) { 3983 break 3984 } 3985 v.reset(Op386MOVWstoreidx1) 3986 v.AuxInt = i - 1 3987 v.Aux = s 3988 v.AddArg(p) 3989 v.AddArg(idx) 3990 v.AddArg(w0) 3991 v.AddArg(mem) 3992 return true 3993 } 3994 return false 3995 } 3996 func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { 3997 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 3998 // cond: x.Uses == 1 && clobber(x) 3999 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4000 for { 4001 i := v.AuxInt 4002 s := v.Aux 4003 idx := v.Args[0] 4004 p := v.Args[1] 4005 v_2 := v.Args[2] 4006 if v_2.Op != Op386SHRLconst { 4007 break 4008 } 4009 j := v_2.AuxInt 4010 w := v_2.Args[0] 4011 x := v.Args[3] 4012 if x.Op != Op386MOVBstoreidx1 { 4013 break 4014 } 4015 if x.AuxInt != i-1 { 4016 break 4017 } 4018 if x.Aux != s { 4019 break 4020 } 4021 if p != x.Args[0] { 4022 break 4023 } 4024 if idx != x.Args[1] { 4025 break 4026 } 4027 w0 := x.Args[2] 4028 if w0.Op != Op386SHRLconst { 4029 break 4030 } 4031 if w0.AuxInt != j-8 { 4032 break 4033 } 4034 if w != w0.Args[0] { 4035 break 4036 } 4037 mem := x.Args[3] 4038 if !(x.Uses == 1 && clobber(x)) { 4039 break 4040 } 4041 v.reset(Op386MOVWstoreidx1) 4042 v.AuxInt = i - 1 4043 v.Aux = s 4044 v.AddArg(p) 4045 v.AddArg(idx) 4046 v.AddArg(w0) 4047 v.AddArg(mem) 4048 return true 4049 } 4050 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 4051 // cond: x.Uses == 1 && clobber(x) 4052 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4053 for { 4054 i := v.AuxInt 4055 s := v.Aux 4056 idx := v.Args[0] 4057 p := v.Args[1] 4058 v_2 := v.Args[2] 4059 if v_2.Op != Op386SHRLconst { 4060 break 4061 } 4062 j := v_2.AuxInt 4063 w := v_2.Args[0] 4064 x := v.Args[3] 4065 if x.Op != Op386MOVBstoreidx1 { 4066 break 4067 } 4068 if x.AuxInt != i-1 { 4069 break 4070 } 4071 if x.Aux != s { 4072 break 4073 } 4074 if idx != x.Args[0] { 4075 break 4076 } 4077 if p != x.Args[1] { 4078 break 4079 } 4080 w0 := x.Args[2] 4081 if w0.Op != Op386SHRLconst { 4082 break 4083 } 4084 if w0.AuxInt != j-8 { 4085 break 4086 } 4087 if w != w0.Args[0] { 4088 break 4089 } 4090 mem := x.Args[3] 4091 if !(x.Uses == 1 && clobber(x)) { 4092 break 4093 } 4094 v.reset(Op386MOVWstoreidx1) 4095 v.AuxInt = i - 1 4096 v.Aux = s 4097 v.AddArg(p) 4098 v.AddArg(idx) 4099 v.AddArg(w0) 4100 v.AddArg(mem) 4101 return true 4102 } 4103 return false 4104 } 4105 func rewriteValue386_Op386MOVLload_0(v *Value) bool { 4106 b := v.Block 4107 _ = b 4108 config := b.Func.Config 4109 _ = config 4110 // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) 4111 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4112 // result: x 4113 for { 4114 off := v.AuxInt 4115 sym := v.Aux 4116 ptr := v.Args[0] 4117 v_1 := v.Args[1] 4118 if v_1.Op != Op386MOVLstore { 4119 break 4120 } 4121 off2 := v_1.AuxInt 4122 sym2 := v_1.Aux 4123 ptr2 := v_1.Args[0] 4124 x := v_1.Args[1] 4125 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4126 break 4127 } 4128 v.reset(OpCopy) 4129 v.Type = x.Type 4130 v.AddArg(x) 4131 return true 4132 } 4133 // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) 4134 // cond: is32Bit(off1+off2) 4135 // result: (MOVLload [off1+off2] {sym} ptr mem) 4136 for { 4137 off1 := v.AuxInt 4138 sym := v.Aux 4139 v_0 := v.Args[0] 4140 if v_0.Op != Op386ADDLconst { 4141 break 4142 } 4143 off2 := v_0.AuxInt 4144 ptr := v_0.Args[0] 4145 mem := v.Args[1] 4146 if !(is32Bit(off1 + off2)) { 4147 break 4148 } 4149 v.reset(Op386MOVLload) 4150 v.AuxInt = off1 + off2 4151 v.Aux = sym 4152 v.AddArg(ptr) 4153 v.AddArg(mem) 4154 return true 4155 } 4156 // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 4157 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4158 // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) 4159 for { 4160 off1 := v.AuxInt 4161 sym1 := v.Aux 4162 v_0 := v.Args[0] 4163 if v_0.Op != Op386LEAL { 4164 break 4165 } 4166 off2 := v_0.AuxInt 4167 sym2 := v_0.Aux 4168 base := v_0.Args[0] 4169 mem := v.Args[1] 4170 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4171 break 4172 } 4173 v.reset(Op386MOVLload) 4174 v.AuxInt = off1 + off2 4175 v.Aux = mergeSym(sym1, sym2) 4176 v.AddArg(base) 4177 v.AddArg(mem) 4178 return true 4179 } 4180 // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 4181 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4182 // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4183 for { 4184 off1 := v.AuxInt 4185 sym1 := v.Aux 4186 v_0 := v.Args[0] 4187 if v_0.Op != Op386LEAL1 { 4188 break 4189 } 4190 off2 := v_0.AuxInt 4191 sym2 := v_0.Aux 4192 ptr := v_0.Args[0] 4193 idx := v_0.Args[1] 4194 mem := v.Args[1] 4195 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4196 break 4197 } 4198 v.reset(Op386MOVLloadidx1) 4199 v.AuxInt = off1 + off2 4200 v.Aux = mergeSym(sym1, sym2) 4201 v.AddArg(ptr) 4202 v.AddArg(idx) 4203 v.AddArg(mem) 4204 return true 4205 } 4206 // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 4207 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4208 // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4209 for { 4210 off1 := v.AuxInt 4211 sym1 := v.Aux 4212 v_0 := v.Args[0] 4213 if v_0.Op != Op386LEAL4 { 4214 break 4215 } 4216 off2 := v_0.AuxInt 4217 sym2 := v_0.Aux 4218 ptr := v_0.Args[0] 4219 idx := v_0.Args[1] 4220 mem := v.Args[1] 4221 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4222 break 4223 } 4224 v.reset(Op386MOVLloadidx4) 4225 v.AuxInt = off1 + off2 4226 v.Aux = mergeSym(sym1, sym2) 4227 v.AddArg(ptr) 4228 v.AddArg(idx) 4229 v.AddArg(mem) 4230 return true 4231 } 4232 // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) 4233 // cond: ptr.Op != OpSB 4234 // result: (MOVLloadidx1 [off] {sym} ptr idx mem) 4235 for { 4236 off := v.AuxInt 4237 sym := v.Aux 4238 v_0 := v.Args[0] 4239 if v_0.Op != Op386ADDL { 4240 break 4241 } 4242 ptr := v_0.Args[0] 4243 idx := v_0.Args[1] 4244 mem := v.Args[1] 4245 if !(ptr.Op != OpSB) { 4246 break 4247 } 4248 v.reset(Op386MOVLloadidx1) 4249 v.AuxInt = off 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_Op386MOVLloadidx1_0(v *Value) bool { 4259 // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4260 // cond: 4261 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4262 for { 4263 c := v.AuxInt 4264 sym := v.Aux 4265 ptr := v.Args[0] 4266 v_1 := v.Args[1] 4267 if v_1.Op != Op386SHLLconst { 4268 break 4269 } 4270 if v_1.AuxInt != 2 { 4271 break 4272 } 4273 idx := v_1.Args[0] 4274 mem := v.Args[2] 4275 v.reset(Op386MOVLloadidx4) 4276 v.AuxInt = c 4277 v.Aux = sym 4278 v.AddArg(ptr) 4279 v.AddArg(idx) 4280 v.AddArg(mem) 4281 return true 4282 } 4283 // match: (MOVLloadidx1 [c] {sym} (SHLLconst [2] idx) ptr mem) 4284 // cond: 4285 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4286 for { 4287 c := v.AuxInt 4288 sym := v.Aux 4289 v_0 := v.Args[0] 4290 if v_0.Op != Op386SHLLconst { 4291 break 4292 } 4293 if v_0.AuxInt != 2 { 4294 break 4295 } 4296 idx := v_0.Args[0] 4297 ptr := v.Args[1] 4298 mem := v.Args[2] 4299 v.reset(Op386MOVLloadidx4) 4300 v.AuxInt = c 4301 v.Aux = sym 4302 v.AddArg(ptr) 4303 v.AddArg(idx) 4304 v.AddArg(mem) 4305 return true 4306 } 4307 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 4308 // cond: 4309 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4310 for { 4311 c := v.AuxInt 4312 sym := v.Aux 4313 v_0 := v.Args[0] 4314 if v_0.Op != Op386ADDLconst { 4315 break 4316 } 4317 d := v_0.AuxInt 4318 ptr := v_0.Args[0] 4319 idx := v.Args[1] 4320 mem := v.Args[2] 4321 v.reset(Op386MOVLloadidx1) 4322 v.AuxInt = c + d 4323 v.Aux = sym 4324 v.AddArg(ptr) 4325 v.AddArg(idx) 4326 v.AddArg(mem) 4327 return true 4328 } 4329 // match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 4330 // cond: 4331 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4332 for { 4333 c := v.AuxInt 4334 sym := v.Aux 4335 idx := v.Args[0] 4336 v_1 := v.Args[1] 4337 if v_1.Op != Op386ADDLconst { 4338 break 4339 } 4340 d := v_1.AuxInt 4341 ptr := v_1.Args[0] 4342 mem := v.Args[2] 4343 v.reset(Op386MOVLloadidx1) 4344 v.AuxInt = c + d 4345 v.Aux = sym 4346 v.AddArg(ptr) 4347 v.AddArg(idx) 4348 v.AddArg(mem) 4349 return true 4350 } 4351 // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 4352 // cond: 4353 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4354 for { 4355 c := v.AuxInt 4356 sym := v.Aux 4357 ptr := v.Args[0] 4358 v_1 := v.Args[1] 4359 if v_1.Op != Op386ADDLconst { 4360 break 4361 } 4362 d := v_1.AuxInt 4363 idx := v_1.Args[0] 4364 mem := v.Args[2] 4365 v.reset(Op386MOVLloadidx1) 4366 v.AuxInt = c + d 4367 v.Aux = sym 4368 v.AddArg(ptr) 4369 v.AddArg(idx) 4370 v.AddArg(mem) 4371 return true 4372 } 4373 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 4374 // cond: 4375 // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) 4376 for { 4377 c := v.AuxInt 4378 sym := v.Aux 4379 v_0 := v.Args[0] 4380 if v_0.Op != Op386ADDLconst { 4381 break 4382 } 4383 d := v_0.AuxInt 4384 idx := v_0.Args[0] 4385 ptr := v.Args[1] 4386 mem := v.Args[2] 4387 v.reset(Op386MOVLloadidx1) 4388 v.AuxInt = c + d 4389 v.Aux = sym 4390 v.AddArg(ptr) 4391 v.AddArg(idx) 4392 v.AddArg(mem) 4393 return true 4394 } 4395 return false 4396 } 4397 func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { 4398 // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 4399 // cond: 4400 // result: (MOVLloadidx4 [c+d] {sym} ptr idx mem) 4401 for { 4402 c := v.AuxInt 4403 sym := v.Aux 4404 v_0 := v.Args[0] 4405 if v_0.Op != Op386ADDLconst { 4406 break 4407 } 4408 d := v_0.AuxInt 4409 ptr := v_0.Args[0] 4410 idx := v.Args[1] 4411 mem := v.Args[2] 4412 v.reset(Op386MOVLloadidx4) 4413 v.AuxInt = c + d 4414 v.Aux = sym 4415 v.AddArg(ptr) 4416 v.AddArg(idx) 4417 v.AddArg(mem) 4418 return true 4419 } 4420 // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 4421 // cond: 4422 // result: (MOVLloadidx4 [c+4*d] {sym} ptr idx mem) 4423 for { 4424 c := v.AuxInt 4425 sym := v.Aux 4426 ptr := v.Args[0] 4427 v_1 := v.Args[1] 4428 if v_1.Op != Op386ADDLconst { 4429 break 4430 } 4431 d := v_1.AuxInt 4432 idx := v_1.Args[0] 4433 mem := v.Args[2] 4434 v.reset(Op386MOVLloadidx4) 4435 v.AuxInt = c + 4*d 4436 v.Aux = sym 4437 v.AddArg(ptr) 4438 v.AddArg(idx) 4439 v.AddArg(mem) 4440 return true 4441 } 4442 return false 4443 } 4444 func rewriteValue386_Op386MOVLstore_0(v *Value) bool { 4445 b := v.Block 4446 _ = b 4447 config := b.Func.Config 4448 _ = config 4449 // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 4450 // cond: is32Bit(off1+off2) 4451 // result: (MOVLstore [off1+off2] {sym} ptr val mem) 4452 for { 4453 off1 := v.AuxInt 4454 sym := v.Aux 4455 v_0 := v.Args[0] 4456 if v_0.Op != Op386ADDLconst { 4457 break 4458 } 4459 off2 := v_0.AuxInt 4460 ptr := v_0.Args[0] 4461 val := v.Args[1] 4462 mem := v.Args[2] 4463 if !(is32Bit(off1 + off2)) { 4464 break 4465 } 4466 v.reset(Op386MOVLstore) 4467 v.AuxInt = off1 + off2 4468 v.Aux = sym 4469 v.AddArg(ptr) 4470 v.AddArg(val) 4471 v.AddArg(mem) 4472 return true 4473 } 4474 // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) 4475 // cond: validOff(off) 4476 // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 4477 for { 4478 off := v.AuxInt 4479 sym := v.Aux 4480 ptr := v.Args[0] 4481 v_1 := v.Args[1] 4482 if v_1.Op != Op386MOVLconst { 4483 break 4484 } 4485 c := v_1.AuxInt 4486 mem := v.Args[2] 4487 if !(validOff(off)) { 4488 break 4489 } 4490 v.reset(Op386MOVLstoreconst) 4491 v.AuxInt = makeValAndOff(int64(int32(c)), off) 4492 v.Aux = sym 4493 v.AddArg(ptr) 4494 v.AddArg(mem) 4495 return true 4496 } 4497 // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 4498 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4499 // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 4500 for { 4501 off1 := v.AuxInt 4502 sym1 := v.Aux 4503 v_0 := v.Args[0] 4504 if v_0.Op != Op386LEAL { 4505 break 4506 } 4507 off2 := v_0.AuxInt 4508 sym2 := v_0.Aux 4509 base := v_0.Args[0] 4510 val := v.Args[1] 4511 mem := v.Args[2] 4512 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4513 break 4514 } 4515 v.reset(Op386MOVLstore) 4516 v.AuxInt = off1 + off2 4517 v.Aux = mergeSym(sym1, sym2) 4518 v.AddArg(base) 4519 v.AddArg(val) 4520 v.AddArg(mem) 4521 return true 4522 } 4523 // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 4524 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4525 // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4526 for { 4527 off1 := v.AuxInt 4528 sym1 := v.Aux 4529 v_0 := v.Args[0] 4530 if v_0.Op != Op386LEAL1 { 4531 break 4532 } 4533 off2 := v_0.AuxInt 4534 sym2 := v_0.Aux 4535 ptr := v_0.Args[0] 4536 idx := v_0.Args[1] 4537 val := v.Args[1] 4538 mem := v.Args[2] 4539 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4540 break 4541 } 4542 v.reset(Op386MOVLstoreidx1) 4543 v.AuxInt = off1 + off2 4544 v.Aux = mergeSym(sym1, sym2) 4545 v.AddArg(ptr) 4546 v.AddArg(idx) 4547 v.AddArg(val) 4548 v.AddArg(mem) 4549 return true 4550 } 4551 // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 4552 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4553 // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4554 for { 4555 off1 := v.AuxInt 4556 sym1 := v.Aux 4557 v_0 := v.Args[0] 4558 if v_0.Op != Op386LEAL4 { 4559 break 4560 } 4561 off2 := v_0.AuxInt 4562 sym2 := v_0.Aux 4563 ptr := v_0.Args[0] 4564 idx := v_0.Args[1] 4565 val := v.Args[1] 4566 mem := v.Args[2] 4567 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4568 break 4569 } 4570 v.reset(Op386MOVLstoreidx4) 4571 v.AuxInt = off1 + off2 4572 v.Aux = mergeSym(sym1, sym2) 4573 v.AddArg(ptr) 4574 v.AddArg(idx) 4575 v.AddArg(val) 4576 v.AddArg(mem) 4577 return true 4578 } 4579 // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) 4580 // cond: ptr.Op != OpSB 4581 // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) 4582 for { 4583 off := v.AuxInt 4584 sym := v.Aux 4585 v_0 := v.Args[0] 4586 if v_0.Op != Op386ADDL { 4587 break 4588 } 4589 ptr := v_0.Args[0] 4590 idx := v_0.Args[1] 4591 val := v.Args[1] 4592 mem := v.Args[2] 4593 if !(ptr.Op != OpSB) { 4594 break 4595 } 4596 v.reset(Op386MOVLstoreidx1) 4597 v.AuxInt = off 4598 v.Aux = sym 4599 v.AddArg(ptr) 4600 v.AddArg(idx) 4601 v.AddArg(val) 4602 v.AddArg(mem) 4603 return true 4604 } 4605 return false 4606 } 4607 func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { 4608 b := v.Block 4609 _ = b 4610 config := b.Func.Config 4611 _ = config 4612 // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 4613 // cond: ValAndOff(sc).canAdd(off) 4614 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 4615 for { 4616 sc := v.AuxInt 4617 s := v.Aux 4618 v_0 := v.Args[0] 4619 if v_0.Op != Op386ADDLconst { 4620 break 4621 } 4622 off := v_0.AuxInt 4623 ptr := v_0.Args[0] 4624 mem := v.Args[1] 4625 if !(ValAndOff(sc).canAdd(off)) { 4626 break 4627 } 4628 v.reset(Op386MOVLstoreconst) 4629 v.AuxInt = ValAndOff(sc).add(off) 4630 v.Aux = s 4631 v.AddArg(ptr) 4632 v.AddArg(mem) 4633 return true 4634 } 4635 // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 4636 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 4637 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 4638 for { 4639 sc := v.AuxInt 4640 sym1 := v.Aux 4641 v_0 := v.Args[0] 4642 if v_0.Op != Op386LEAL { 4643 break 4644 } 4645 off := v_0.AuxInt 4646 sym2 := v_0.Aux 4647 ptr := v_0.Args[0] 4648 mem := v.Args[1] 4649 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 4650 break 4651 } 4652 v.reset(Op386MOVLstoreconst) 4653 v.AuxInt = ValAndOff(sc).add(off) 4654 v.Aux = mergeSym(sym1, sym2) 4655 v.AddArg(ptr) 4656 v.AddArg(mem) 4657 return true 4658 } 4659 // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 4660 // cond: canMergeSym(sym1, sym2) 4661 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4662 for { 4663 x := v.AuxInt 4664 sym1 := v.Aux 4665 v_0 := v.Args[0] 4666 if v_0.Op != Op386LEAL1 { 4667 break 4668 } 4669 off := v_0.AuxInt 4670 sym2 := v_0.Aux 4671 ptr := v_0.Args[0] 4672 idx := v_0.Args[1] 4673 mem := v.Args[1] 4674 if !(canMergeSym(sym1, sym2)) { 4675 break 4676 } 4677 v.reset(Op386MOVLstoreconstidx1) 4678 v.AuxInt = ValAndOff(x).add(off) 4679 v.Aux = mergeSym(sym1, sym2) 4680 v.AddArg(ptr) 4681 v.AddArg(idx) 4682 v.AddArg(mem) 4683 return true 4684 } 4685 // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) 4686 // cond: canMergeSym(sym1, sym2) 4687 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4688 for { 4689 x := v.AuxInt 4690 sym1 := v.Aux 4691 v_0 := v.Args[0] 4692 if v_0.Op != Op386LEAL4 { 4693 break 4694 } 4695 off := v_0.AuxInt 4696 sym2 := v_0.Aux 4697 ptr := v_0.Args[0] 4698 idx := v_0.Args[1] 4699 mem := v.Args[1] 4700 if !(canMergeSym(sym1, sym2)) { 4701 break 4702 } 4703 v.reset(Op386MOVLstoreconstidx4) 4704 v.AuxInt = ValAndOff(x).add(off) 4705 v.Aux = mergeSym(sym1, sym2) 4706 v.AddArg(ptr) 4707 v.AddArg(idx) 4708 v.AddArg(mem) 4709 return true 4710 } 4711 // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) 4712 // cond: 4713 // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) 4714 for { 4715 x := v.AuxInt 4716 sym := v.Aux 4717 v_0 := v.Args[0] 4718 if v_0.Op != Op386ADDL { 4719 break 4720 } 4721 ptr := v_0.Args[0] 4722 idx := v_0.Args[1] 4723 mem := v.Args[1] 4724 v.reset(Op386MOVLstoreconstidx1) 4725 v.AuxInt = x 4726 v.Aux = sym 4727 v.AddArg(ptr) 4728 v.AddArg(idx) 4729 v.AddArg(mem) 4730 return true 4731 } 4732 return false 4733 } 4734 func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { 4735 // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4736 // cond: 4737 // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) 4738 for { 4739 c := v.AuxInt 4740 sym := v.Aux 4741 ptr := v.Args[0] 4742 v_1 := v.Args[1] 4743 if v_1.Op != Op386SHLLconst { 4744 break 4745 } 4746 if v_1.AuxInt != 2 { 4747 break 4748 } 4749 idx := v_1.Args[0] 4750 mem := v.Args[2] 4751 v.reset(Op386MOVLstoreconstidx4) 4752 v.AuxInt = c 4753 v.Aux = sym 4754 v.AddArg(ptr) 4755 v.AddArg(idx) 4756 v.AddArg(mem) 4757 return true 4758 } 4759 // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 4760 // cond: 4761 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4762 for { 4763 x := v.AuxInt 4764 sym := v.Aux 4765 v_0 := v.Args[0] 4766 if v_0.Op != Op386ADDLconst { 4767 break 4768 } 4769 c := v_0.AuxInt 4770 ptr := v_0.Args[0] 4771 idx := v.Args[1] 4772 mem := v.Args[2] 4773 v.reset(Op386MOVLstoreconstidx1) 4774 v.AuxInt = ValAndOff(x).add(c) 4775 v.Aux = sym 4776 v.AddArg(ptr) 4777 v.AddArg(idx) 4778 v.AddArg(mem) 4779 return true 4780 } 4781 // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 4782 // cond: 4783 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4784 for { 4785 x := v.AuxInt 4786 sym := v.Aux 4787 ptr := v.Args[0] 4788 v_1 := v.Args[1] 4789 if v_1.Op != Op386ADDLconst { 4790 break 4791 } 4792 c := v_1.AuxInt 4793 idx := v_1.Args[0] 4794 mem := v.Args[2] 4795 v.reset(Op386MOVLstoreconstidx1) 4796 v.AuxInt = ValAndOff(x).add(c) 4797 v.Aux = sym 4798 v.AddArg(ptr) 4799 v.AddArg(idx) 4800 v.AddArg(mem) 4801 return true 4802 } 4803 return false 4804 } 4805 func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { 4806 // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) 4807 // cond: 4808 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4809 for { 4810 x := v.AuxInt 4811 sym := v.Aux 4812 v_0 := v.Args[0] 4813 if v_0.Op != Op386ADDLconst { 4814 break 4815 } 4816 c := v_0.AuxInt 4817 ptr := v_0.Args[0] 4818 idx := v.Args[1] 4819 mem := v.Args[2] 4820 v.reset(Op386MOVLstoreconstidx4) 4821 v.AuxInt = ValAndOff(x).add(c) 4822 v.Aux = sym 4823 v.AddArg(ptr) 4824 v.AddArg(idx) 4825 v.AddArg(mem) 4826 return true 4827 } 4828 // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) 4829 // cond: 4830 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) 4831 for { 4832 x := v.AuxInt 4833 sym := v.Aux 4834 ptr := v.Args[0] 4835 v_1 := v.Args[1] 4836 if v_1.Op != Op386ADDLconst { 4837 break 4838 } 4839 c := v_1.AuxInt 4840 idx := v_1.Args[0] 4841 mem := v.Args[2] 4842 v.reset(Op386MOVLstoreconstidx4) 4843 v.AuxInt = ValAndOff(x).add(4 * c) 4844 v.Aux = sym 4845 v.AddArg(ptr) 4846 v.AddArg(idx) 4847 v.AddArg(mem) 4848 return true 4849 } 4850 return false 4851 } 4852 func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { 4853 // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) 4854 // cond: 4855 // result: (MOVLstoreidx4 [c] {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 != Op386SHLLconst { 4862 break 4863 } 4864 if v_1.AuxInt != 2 { 4865 break 4866 } 4867 idx := v_1.Args[0] 4868 val := v.Args[2] 4869 mem := v.Args[3] 4870 v.reset(Op386MOVLstoreidx4) 4871 v.AuxInt = c 4872 v.Aux = sym 4873 v.AddArg(ptr) 4874 v.AddArg(idx) 4875 v.AddArg(val) 4876 v.AddArg(mem) 4877 return true 4878 } 4879 // match: (MOVLstoreidx1 [c] {sym} (SHLLconst [2] idx) ptr val mem) 4880 // cond: 4881 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 4882 for { 4883 c := v.AuxInt 4884 sym := v.Aux 4885 v_0 := v.Args[0] 4886 if v_0.Op != Op386SHLLconst { 4887 break 4888 } 4889 if v_0.AuxInt != 2 { 4890 break 4891 } 4892 idx := v_0.Args[0] 4893 ptr := v.Args[1] 4894 val := v.Args[2] 4895 mem := v.Args[3] 4896 v.reset(Op386MOVLstoreidx4) 4897 v.AuxInt = c 4898 v.Aux = sym 4899 v.AddArg(ptr) 4900 v.AddArg(idx) 4901 v.AddArg(val) 4902 v.AddArg(mem) 4903 return true 4904 } 4905 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 4906 // cond: 4907 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4908 for { 4909 c := v.AuxInt 4910 sym := v.Aux 4911 v_0 := v.Args[0] 4912 if v_0.Op != Op386ADDLconst { 4913 break 4914 } 4915 d := v_0.AuxInt 4916 ptr := v_0.Args[0] 4917 idx := v.Args[1] 4918 val := v.Args[2] 4919 mem := v.Args[3] 4920 v.reset(Op386MOVLstoreidx1) 4921 v.AuxInt = c + d 4922 v.Aux = sym 4923 v.AddArg(ptr) 4924 v.AddArg(idx) 4925 v.AddArg(val) 4926 v.AddArg(mem) 4927 return true 4928 } 4929 // match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 4930 // cond: 4931 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4932 for { 4933 c := v.AuxInt 4934 sym := v.Aux 4935 idx := v.Args[0] 4936 v_1 := v.Args[1] 4937 if v_1.Op != Op386ADDLconst { 4938 break 4939 } 4940 d := v_1.AuxInt 4941 ptr := v_1.Args[0] 4942 val := v.Args[2] 4943 mem := v.Args[3] 4944 v.reset(Op386MOVLstoreidx1) 4945 v.AuxInt = c + d 4946 v.Aux = sym 4947 v.AddArg(ptr) 4948 v.AddArg(idx) 4949 v.AddArg(val) 4950 v.AddArg(mem) 4951 return true 4952 } 4953 // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 4954 // cond: 4955 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4956 for { 4957 c := v.AuxInt 4958 sym := v.Aux 4959 ptr := v.Args[0] 4960 v_1 := v.Args[1] 4961 if v_1.Op != Op386ADDLconst { 4962 break 4963 } 4964 d := v_1.AuxInt 4965 idx := v_1.Args[0] 4966 val := v.Args[2] 4967 mem := v.Args[3] 4968 v.reset(Op386MOVLstoreidx1) 4969 v.AuxInt = c + d 4970 v.Aux = sym 4971 v.AddArg(ptr) 4972 v.AddArg(idx) 4973 v.AddArg(val) 4974 v.AddArg(mem) 4975 return true 4976 } 4977 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 4978 // cond: 4979 // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem) 4980 for { 4981 c := v.AuxInt 4982 sym := v.Aux 4983 v_0 := v.Args[0] 4984 if v_0.Op != Op386ADDLconst { 4985 break 4986 } 4987 d := v_0.AuxInt 4988 idx := v_0.Args[0] 4989 ptr := v.Args[1] 4990 val := v.Args[2] 4991 mem := v.Args[3] 4992 v.reset(Op386MOVLstoreidx1) 4993 v.AuxInt = c + d 4994 v.Aux = sym 4995 v.AddArg(ptr) 4996 v.AddArg(idx) 4997 v.AddArg(val) 4998 v.AddArg(mem) 4999 return true 5000 } 5001 return false 5002 } 5003 func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { 5004 // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5005 // cond: 5006 // result: (MOVLstoreidx4 [c+d] {sym} ptr idx val mem) 5007 for { 5008 c := v.AuxInt 5009 sym := v.Aux 5010 v_0 := v.Args[0] 5011 if v_0.Op != Op386ADDLconst { 5012 break 5013 } 5014 d := v_0.AuxInt 5015 ptr := v_0.Args[0] 5016 idx := v.Args[1] 5017 val := v.Args[2] 5018 mem := v.Args[3] 5019 v.reset(Op386MOVLstoreidx4) 5020 v.AuxInt = c + d 5021 v.Aux = sym 5022 v.AddArg(ptr) 5023 v.AddArg(idx) 5024 v.AddArg(val) 5025 v.AddArg(mem) 5026 return true 5027 } 5028 // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5029 // cond: 5030 // result: (MOVLstoreidx4 [c+4*d] {sym} ptr idx val mem) 5031 for { 5032 c := v.AuxInt 5033 sym := v.Aux 5034 ptr := v.Args[0] 5035 v_1 := v.Args[1] 5036 if v_1.Op != Op386ADDLconst { 5037 break 5038 } 5039 d := v_1.AuxInt 5040 idx := v_1.Args[0] 5041 val := v.Args[2] 5042 mem := v.Args[3] 5043 v.reset(Op386MOVLstoreidx4) 5044 v.AuxInt = c + 4*d 5045 v.Aux = sym 5046 v.AddArg(ptr) 5047 v.AddArg(idx) 5048 v.AddArg(val) 5049 v.AddArg(mem) 5050 return true 5051 } 5052 return false 5053 } 5054 func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { 5055 b := v.Block 5056 _ = b 5057 config := b.Func.Config 5058 _ = config 5059 types := &b.Func.Config.Types 5060 _ = types 5061 // match: (MOVSDconst [c]) 5062 // cond: config.ctxt.Flag_shared 5063 // result: (MOVSDconst2 (MOVSDconst1 [c])) 5064 for { 5065 c := v.AuxInt 5066 if !(config.ctxt.Flag_shared) { 5067 break 5068 } 5069 v.reset(Op386MOVSDconst2) 5070 v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, types.UInt32) 5071 v0.AuxInt = c 5072 v.AddArg(v0) 5073 return true 5074 } 5075 return false 5076 } 5077 func rewriteValue386_Op386MOVSDload_0(v *Value) bool { 5078 b := v.Block 5079 _ = b 5080 config := b.Func.Config 5081 _ = config 5082 // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) 5083 // cond: is32Bit(off1+off2) 5084 // result: (MOVSDload [off1+off2] {sym} ptr mem) 5085 for { 5086 off1 := v.AuxInt 5087 sym := v.Aux 5088 v_0 := v.Args[0] 5089 if v_0.Op != Op386ADDLconst { 5090 break 5091 } 5092 off2 := v_0.AuxInt 5093 ptr := v_0.Args[0] 5094 mem := v.Args[1] 5095 if !(is32Bit(off1 + off2)) { 5096 break 5097 } 5098 v.reset(Op386MOVSDload) 5099 v.AuxInt = off1 + off2 5100 v.Aux = sym 5101 v.AddArg(ptr) 5102 v.AddArg(mem) 5103 return true 5104 } 5105 // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5106 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5107 // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5108 for { 5109 off1 := v.AuxInt 5110 sym1 := v.Aux 5111 v_0 := v.Args[0] 5112 if v_0.Op != Op386LEAL { 5113 break 5114 } 5115 off2 := v_0.AuxInt 5116 sym2 := v_0.Aux 5117 base := v_0.Args[0] 5118 mem := v.Args[1] 5119 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5120 break 5121 } 5122 v.reset(Op386MOVSDload) 5123 v.AuxInt = off1 + off2 5124 v.Aux = mergeSym(sym1, sym2) 5125 v.AddArg(base) 5126 v.AddArg(mem) 5127 return true 5128 } 5129 // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5130 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5131 // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5132 for { 5133 off1 := v.AuxInt 5134 sym1 := v.Aux 5135 v_0 := v.Args[0] 5136 if v_0.Op != Op386LEAL1 { 5137 break 5138 } 5139 off2 := v_0.AuxInt 5140 sym2 := v_0.Aux 5141 ptr := v_0.Args[0] 5142 idx := v_0.Args[1] 5143 mem := v.Args[1] 5144 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5145 break 5146 } 5147 v.reset(Op386MOVSDloadidx1) 5148 v.AuxInt = off1 + off2 5149 v.Aux = mergeSym(sym1, sym2) 5150 v.AddArg(ptr) 5151 v.AddArg(idx) 5152 v.AddArg(mem) 5153 return true 5154 } 5155 // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) 5156 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5157 // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5158 for { 5159 off1 := v.AuxInt 5160 sym1 := v.Aux 5161 v_0 := v.Args[0] 5162 if v_0.Op != Op386LEAL8 { 5163 break 5164 } 5165 off2 := v_0.AuxInt 5166 sym2 := v_0.Aux 5167 ptr := v_0.Args[0] 5168 idx := v_0.Args[1] 5169 mem := v.Args[1] 5170 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5171 break 5172 } 5173 v.reset(Op386MOVSDloadidx8) 5174 v.AuxInt = off1 + off2 5175 v.Aux = mergeSym(sym1, sym2) 5176 v.AddArg(ptr) 5177 v.AddArg(idx) 5178 v.AddArg(mem) 5179 return true 5180 } 5181 // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) 5182 // cond: ptr.Op != OpSB 5183 // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) 5184 for { 5185 off := v.AuxInt 5186 sym := v.Aux 5187 v_0 := v.Args[0] 5188 if v_0.Op != Op386ADDL { 5189 break 5190 } 5191 ptr := v_0.Args[0] 5192 idx := v_0.Args[1] 5193 mem := v.Args[1] 5194 if !(ptr.Op != OpSB) { 5195 break 5196 } 5197 v.reset(Op386MOVSDloadidx1) 5198 v.AuxInt = off 5199 v.Aux = sym 5200 v.AddArg(ptr) 5201 v.AddArg(idx) 5202 v.AddArg(mem) 5203 return true 5204 } 5205 return false 5206 } 5207 func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { 5208 // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5209 // cond: 5210 // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem) 5211 for { 5212 c := v.AuxInt 5213 sym := v.Aux 5214 v_0 := v.Args[0] 5215 if v_0.Op != Op386ADDLconst { 5216 break 5217 } 5218 d := v_0.AuxInt 5219 ptr := v_0.Args[0] 5220 idx := v.Args[1] 5221 mem := v.Args[2] 5222 v.reset(Op386MOVSDloadidx1) 5223 v.AuxInt = c + d 5224 v.Aux = sym 5225 v.AddArg(ptr) 5226 v.AddArg(idx) 5227 v.AddArg(mem) 5228 return true 5229 } 5230 // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5231 // cond: 5232 // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem) 5233 for { 5234 c := v.AuxInt 5235 sym := v.Aux 5236 ptr := v.Args[0] 5237 v_1 := v.Args[1] 5238 if v_1.Op != Op386ADDLconst { 5239 break 5240 } 5241 d := v_1.AuxInt 5242 idx := v_1.Args[0] 5243 mem := v.Args[2] 5244 v.reset(Op386MOVSDloadidx1) 5245 v.AuxInt = c + d 5246 v.Aux = sym 5247 v.AddArg(ptr) 5248 v.AddArg(idx) 5249 v.AddArg(mem) 5250 return true 5251 } 5252 return false 5253 } 5254 func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { 5255 // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) 5256 // cond: 5257 // result: (MOVSDloadidx8 [c+d] {sym} ptr idx mem) 5258 for { 5259 c := v.AuxInt 5260 sym := v.Aux 5261 v_0 := v.Args[0] 5262 if v_0.Op != Op386ADDLconst { 5263 break 5264 } 5265 d := v_0.AuxInt 5266 ptr := v_0.Args[0] 5267 idx := v.Args[1] 5268 mem := v.Args[2] 5269 v.reset(Op386MOVSDloadidx8) 5270 v.AuxInt = c + d 5271 v.Aux = sym 5272 v.AddArg(ptr) 5273 v.AddArg(idx) 5274 v.AddArg(mem) 5275 return true 5276 } 5277 // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) 5278 // cond: 5279 // result: (MOVSDloadidx8 [c+8*d] {sym} ptr idx mem) 5280 for { 5281 c := v.AuxInt 5282 sym := v.Aux 5283 ptr := v.Args[0] 5284 v_1 := v.Args[1] 5285 if v_1.Op != Op386ADDLconst { 5286 break 5287 } 5288 d := v_1.AuxInt 5289 idx := v_1.Args[0] 5290 mem := v.Args[2] 5291 v.reset(Op386MOVSDloadidx8) 5292 v.AuxInt = c + 8*d 5293 v.Aux = sym 5294 v.AddArg(ptr) 5295 v.AddArg(idx) 5296 v.AddArg(mem) 5297 return true 5298 } 5299 return false 5300 } 5301 func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { 5302 b := v.Block 5303 _ = b 5304 config := b.Func.Config 5305 _ = config 5306 // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5307 // cond: is32Bit(off1+off2) 5308 // result: (MOVSDstore [off1+off2] {sym} ptr val mem) 5309 for { 5310 off1 := v.AuxInt 5311 sym := v.Aux 5312 v_0 := v.Args[0] 5313 if v_0.Op != Op386ADDLconst { 5314 break 5315 } 5316 off2 := v_0.AuxInt 5317 ptr := v_0.Args[0] 5318 val := v.Args[1] 5319 mem := v.Args[2] 5320 if !(is32Bit(off1 + off2)) { 5321 break 5322 } 5323 v.reset(Op386MOVSDstore) 5324 v.AuxInt = off1 + off2 5325 v.Aux = sym 5326 v.AddArg(ptr) 5327 v.AddArg(val) 5328 v.AddArg(mem) 5329 return true 5330 } 5331 // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5332 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5333 // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5334 for { 5335 off1 := v.AuxInt 5336 sym1 := v.Aux 5337 v_0 := v.Args[0] 5338 if v_0.Op != Op386LEAL { 5339 break 5340 } 5341 off2 := v_0.AuxInt 5342 sym2 := v_0.Aux 5343 base := v_0.Args[0] 5344 val := v.Args[1] 5345 mem := v.Args[2] 5346 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5347 break 5348 } 5349 v.reset(Op386MOVSDstore) 5350 v.AuxInt = off1 + off2 5351 v.Aux = mergeSym(sym1, sym2) 5352 v.AddArg(base) 5353 v.AddArg(val) 5354 v.AddArg(mem) 5355 return true 5356 } 5357 // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5358 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5359 // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5360 for { 5361 off1 := v.AuxInt 5362 sym1 := v.Aux 5363 v_0 := v.Args[0] 5364 if v_0.Op != Op386LEAL1 { 5365 break 5366 } 5367 off2 := v_0.AuxInt 5368 sym2 := v_0.Aux 5369 ptr := v_0.Args[0] 5370 idx := v_0.Args[1] 5371 val := v.Args[1] 5372 mem := v.Args[2] 5373 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5374 break 5375 } 5376 v.reset(Op386MOVSDstoreidx1) 5377 v.AuxInt = off1 + off2 5378 v.Aux = mergeSym(sym1, sym2) 5379 v.AddArg(ptr) 5380 v.AddArg(idx) 5381 v.AddArg(val) 5382 v.AddArg(mem) 5383 return true 5384 } 5385 // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) 5386 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5387 // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5388 for { 5389 off1 := v.AuxInt 5390 sym1 := v.Aux 5391 v_0 := v.Args[0] 5392 if v_0.Op != Op386LEAL8 { 5393 break 5394 } 5395 off2 := v_0.AuxInt 5396 sym2 := v_0.Aux 5397 ptr := v_0.Args[0] 5398 idx := v_0.Args[1] 5399 val := v.Args[1] 5400 mem := v.Args[2] 5401 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5402 break 5403 } 5404 v.reset(Op386MOVSDstoreidx8) 5405 v.AuxInt = off1 + off2 5406 v.Aux = mergeSym(sym1, sym2) 5407 v.AddArg(ptr) 5408 v.AddArg(idx) 5409 v.AddArg(val) 5410 v.AddArg(mem) 5411 return true 5412 } 5413 // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) 5414 // cond: ptr.Op != OpSB 5415 // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) 5416 for { 5417 off := v.AuxInt 5418 sym := v.Aux 5419 v_0 := v.Args[0] 5420 if v_0.Op != Op386ADDL { 5421 break 5422 } 5423 ptr := v_0.Args[0] 5424 idx := v_0.Args[1] 5425 val := v.Args[1] 5426 mem := v.Args[2] 5427 if !(ptr.Op != OpSB) { 5428 break 5429 } 5430 v.reset(Op386MOVSDstoreidx1) 5431 v.AuxInt = off 5432 v.Aux = sym 5433 v.AddArg(ptr) 5434 v.AddArg(idx) 5435 v.AddArg(val) 5436 v.AddArg(mem) 5437 return true 5438 } 5439 return false 5440 } 5441 func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { 5442 // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5443 // cond: 5444 // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem) 5445 for { 5446 c := v.AuxInt 5447 sym := v.Aux 5448 v_0 := v.Args[0] 5449 if v_0.Op != Op386ADDLconst { 5450 break 5451 } 5452 d := v_0.AuxInt 5453 ptr := v_0.Args[0] 5454 idx := v.Args[1] 5455 val := v.Args[2] 5456 mem := v.Args[3] 5457 v.reset(Op386MOVSDstoreidx1) 5458 v.AuxInt = c + d 5459 v.Aux = sym 5460 v.AddArg(ptr) 5461 v.AddArg(idx) 5462 v.AddArg(val) 5463 v.AddArg(mem) 5464 return true 5465 } 5466 // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5467 // cond: 5468 // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem) 5469 for { 5470 c := v.AuxInt 5471 sym := v.Aux 5472 ptr := v.Args[0] 5473 v_1 := v.Args[1] 5474 if v_1.Op != Op386ADDLconst { 5475 break 5476 } 5477 d := v_1.AuxInt 5478 idx := v_1.Args[0] 5479 val := v.Args[2] 5480 mem := v.Args[3] 5481 v.reset(Op386MOVSDstoreidx1) 5482 v.AuxInt = c + d 5483 v.Aux = sym 5484 v.AddArg(ptr) 5485 v.AddArg(idx) 5486 v.AddArg(val) 5487 v.AddArg(mem) 5488 return true 5489 } 5490 return false 5491 } 5492 func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { 5493 // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5494 // cond: 5495 // result: (MOVSDstoreidx8 [c+d] {sym} ptr idx val mem) 5496 for { 5497 c := v.AuxInt 5498 sym := v.Aux 5499 v_0 := v.Args[0] 5500 if v_0.Op != Op386ADDLconst { 5501 break 5502 } 5503 d := v_0.AuxInt 5504 ptr := v_0.Args[0] 5505 idx := v.Args[1] 5506 val := v.Args[2] 5507 mem := v.Args[3] 5508 v.reset(Op386MOVSDstoreidx8) 5509 v.AuxInt = c + d 5510 v.Aux = sym 5511 v.AddArg(ptr) 5512 v.AddArg(idx) 5513 v.AddArg(val) 5514 v.AddArg(mem) 5515 return true 5516 } 5517 // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5518 // cond: 5519 // result: (MOVSDstoreidx8 [c+8*d] {sym} ptr idx val mem) 5520 for { 5521 c := v.AuxInt 5522 sym := v.Aux 5523 ptr := v.Args[0] 5524 v_1 := v.Args[1] 5525 if v_1.Op != Op386ADDLconst { 5526 break 5527 } 5528 d := v_1.AuxInt 5529 idx := v_1.Args[0] 5530 val := v.Args[2] 5531 mem := v.Args[3] 5532 v.reset(Op386MOVSDstoreidx8) 5533 v.AuxInt = c + 8*d 5534 v.Aux = sym 5535 v.AddArg(ptr) 5536 v.AddArg(idx) 5537 v.AddArg(val) 5538 v.AddArg(mem) 5539 return true 5540 } 5541 return false 5542 } 5543 func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { 5544 b := v.Block 5545 _ = b 5546 config := b.Func.Config 5547 _ = config 5548 types := &b.Func.Config.Types 5549 _ = types 5550 // match: (MOVSSconst [c]) 5551 // cond: config.ctxt.Flag_shared 5552 // result: (MOVSSconst2 (MOVSSconst1 [c])) 5553 for { 5554 c := v.AuxInt 5555 if !(config.ctxt.Flag_shared) { 5556 break 5557 } 5558 v.reset(Op386MOVSSconst2) 5559 v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, types.UInt32) 5560 v0.AuxInt = c 5561 v.AddArg(v0) 5562 return true 5563 } 5564 return false 5565 } 5566 func rewriteValue386_Op386MOVSSload_0(v *Value) bool { 5567 b := v.Block 5568 _ = b 5569 config := b.Func.Config 5570 _ = config 5571 // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) 5572 // cond: is32Bit(off1+off2) 5573 // result: (MOVSSload [off1+off2] {sym} ptr mem) 5574 for { 5575 off1 := v.AuxInt 5576 sym := v.Aux 5577 v_0 := v.Args[0] 5578 if v_0.Op != Op386ADDLconst { 5579 break 5580 } 5581 off2 := v_0.AuxInt 5582 ptr := v_0.Args[0] 5583 mem := v.Args[1] 5584 if !(is32Bit(off1 + off2)) { 5585 break 5586 } 5587 v.reset(Op386MOVSSload) 5588 v.AuxInt = off1 + off2 5589 v.Aux = sym 5590 v.AddArg(ptr) 5591 v.AddArg(mem) 5592 return true 5593 } 5594 // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5595 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5596 // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5597 for { 5598 off1 := v.AuxInt 5599 sym1 := v.Aux 5600 v_0 := v.Args[0] 5601 if v_0.Op != Op386LEAL { 5602 break 5603 } 5604 off2 := v_0.AuxInt 5605 sym2 := v_0.Aux 5606 base := v_0.Args[0] 5607 mem := v.Args[1] 5608 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5609 break 5610 } 5611 v.reset(Op386MOVSSload) 5612 v.AuxInt = off1 + off2 5613 v.Aux = mergeSym(sym1, sym2) 5614 v.AddArg(base) 5615 v.AddArg(mem) 5616 return true 5617 } 5618 // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5619 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5620 // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5621 for { 5622 off1 := v.AuxInt 5623 sym1 := v.Aux 5624 v_0 := v.Args[0] 5625 if v_0.Op != Op386LEAL1 { 5626 break 5627 } 5628 off2 := v_0.AuxInt 5629 sym2 := v_0.Aux 5630 ptr := v_0.Args[0] 5631 idx := v_0.Args[1] 5632 mem := v.Args[1] 5633 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5634 break 5635 } 5636 v.reset(Op386MOVSSloadidx1) 5637 v.AuxInt = off1 + off2 5638 v.Aux = mergeSym(sym1, sym2) 5639 v.AddArg(ptr) 5640 v.AddArg(idx) 5641 v.AddArg(mem) 5642 return true 5643 } 5644 // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 5645 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5646 // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5647 for { 5648 off1 := v.AuxInt 5649 sym1 := v.Aux 5650 v_0 := v.Args[0] 5651 if v_0.Op != Op386LEAL4 { 5652 break 5653 } 5654 off2 := v_0.AuxInt 5655 sym2 := v_0.Aux 5656 ptr := v_0.Args[0] 5657 idx := v_0.Args[1] 5658 mem := v.Args[1] 5659 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5660 break 5661 } 5662 v.reset(Op386MOVSSloadidx4) 5663 v.AuxInt = off1 + off2 5664 v.Aux = mergeSym(sym1, sym2) 5665 v.AddArg(ptr) 5666 v.AddArg(idx) 5667 v.AddArg(mem) 5668 return true 5669 } 5670 // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) 5671 // cond: ptr.Op != OpSB 5672 // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) 5673 for { 5674 off := v.AuxInt 5675 sym := v.Aux 5676 v_0 := v.Args[0] 5677 if v_0.Op != Op386ADDL { 5678 break 5679 } 5680 ptr := v_0.Args[0] 5681 idx := v_0.Args[1] 5682 mem := v.Args[1] 5683 if !(ptr.Op != OpSB) { 5684 break 5685 } 5686 v.reset(Op386MOVSSloadidx1) 5687 v.AuxInt = off 5688 v.Aux = sym 5689 v.AddArg(ptr) 5690 v.AddArg(idx) 5691 v.AddArg(mem) 5692 return true 5693 } 5694 return false 5695 } 5696 func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { 5697 // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5698 // cond: 5699 // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem) 5700 for { 5701 c := v.AuxInt 5702 sym := v.Aux 5703 v_0 := v.Args[0] 5704 if v_0.Op != Op386ADDLconst { 5705 break 5706 } 5707 d := v_0.AuxInt 5708 ptr := v_0.Args[0] 5709 idx := v.Args[1] 5710 mem := v.Args[2] 5711 v.reset(Op386MOVSSloadidx1) 5712 v.AuxInt = c + d 5713 v.Aux = sym 5714 v.AddArg(ptr) 5715 v.AddArg(idx) 5716 v.AddArg(mem) 5717 return true 5718 } 5719 // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5720 // cond: 5721 // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem) 5722 for { 5723 c := v.AuxInt 5724 sym := v.Aux 5725 ptr := v.Args[0] 5726 v_1 := v.Args[1] 5727 if v_1.Op != Op386ADDLconst { 5728 break 5729 } 5730 d := v_1.AuxInt 5731 idx := v_1.Args[0] 5732 mem := v.Args[2] 5733 v.reset(Op386MOVSSloadidx1) 5734 v.AuxInt = c + d 5735 v.Aux = sym 5736 v.AddArg(ptr) 5737 v.AddArg(idx) 5738 v.AddArg(mem) 5739 return true 5740 } 5741 return false 5742 } 5743 func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { 5744 // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 5745 // cond: 5746 // result: (MOVSSloadidx4 [c+d] {sym} ptr idx mem) 5747 for { 5748 c := v.AuxInt 5749 sym := v.Aux 5750 v_0 := v.Args[0] 5751 if v_0.Op != Op386ADDLconst { 5752 break 5753 } 5754 d := v_0.AuxInt 5755 ptr := v_0.Args[0] 5756 idx := v.Args[1] 5757 mem := v.Args[2] 5758 v.reset(Op386MOVSSloadidx4) 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 // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 5767 // cond: 5768 // result: (MOVSSloadidx4 [c+4*d] {sym} ptr idx mem) 5769 for { 5770 c := v.AuxInt 5771 sym := v.Aux 5772 ptr := v.Args[0] 5773 v_1 := v.Args[1] 5774 if v_1.Op != Op386ADDLconst { 5775 break 5776 } 5777 d := v_1.AuxInt 5778 idx := v_1.Args[0] 5779 mem := v.Args[2] 5780 v.reset(Op386MOVSSloadidx4) 5781 v.AuxInt = c + 4*d 5782 v.Aux = sym 5783 v.AddArg(ptr) 5784 v.AddArg(idx) 5785 v.AddArg(mem) 5786 return true 5787 } 5788 return false 5789 } 5790 func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { 5791 b := v.Block 5792 _ = b 5793 config := b.Func.Config 5794 _ = config 5795 // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5796 // cond: is32Bit(off1+off2) 5797 // result: (MOVSSstore [off1+off2] {sym} ptr val mem) 5798 for { 5799 off1 := v.AuxInt 5800 sym := v.Aux 5801 v_0 := v.Args[0] 5802 if v_0.Op != Op386ADDLconst { 5803 break 5804 } 5805 off2 := v_0.AuxInt 5806 ptr := v_0.Args[0] 5807 val := v.Args[1] 5808 mem := v.Args[2] 5809 if !(is32Bit(off1 + off2)) { 5810 break 5811 } 5812 v.reset(Op386MOVSSstore) 5813 v.AuxInt = off1 + off2 5814 v.Aux = sym 5815 v.AddArg(ptr) 5816 v.AddArg(val) 5817 v.AddArg(mem) 5818 return true 5819 } 5820 // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5821 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5822 // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5823 for { 5824 off1 := v.AuxInt 5825 sym1 := v.Aux 5826 v_0 := v.Args[0] 5827 if v_0.Op != Op386LEAL { 5828 break 5829 } 5830 off2 := v_0.AuxInt 5831 sym2 := v_0.Aux 5832 base := v_0.Args[0] 5833 val := v.Args[1] 5834 mem := v.Args[2] 5835 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5836 break 5837 } 5838 v.reset(Op386MOVSSstore) 5839 v.AuxInt = off1 + off2 5840 v.Aux = mergeSym(sym1, sym2) 5841 v.AddArg(base) 5842 v.AddArg(val) 5843 v.AddArg(mem) 5844 return true 5845 } 5846 // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5847 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5848 // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5849 for { 5850 off1 := v.AuxInt 5851 sym1 := v.Aux 5852 v_0 := v.Args[0] 5853 if v_0.Op != Op386LEAL1 { 5854 break 5855 } 5856 off2 := v_0.AuxInt 5857 sym2 := v_0.Aux 5858 ptr := v_0.Args[0] 5859 idx := v_0.Args[1] 5860 val := v.Args[1] 5861 mem := v.Args[2] 5862 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5863 break 5864 } 5865 v.reset(Op386MOVSSstoreidx1) 5866 v.AuxInt = off1 + off2 5867 v.Aux = mergeSym(sym1, sym2) 5868 v.AddArg(ptr) 5869 v.AddArg(idx) 5870 v.AddArg(val) 5871 v.AddArg(mem) 5872 return true 5873 } 5874 // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 5875 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5876 // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5877 for { 5878 off1 := v.AuxInt 5879 sym1 := v.Aux 5880 v_0 := v.Args[0] 5881 if v_0.Op != Op386LEAL4 { 5882 break 5883 } 5884 off2 := v_0.AuxInt 5885 sym2 := v_0.Aux 5886 ptr := v_0.Args[0] 5887 idx := v_0.Args[1] 5888 val := v.Args[1] 5889 mem := v.Args[2] 5890 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5891 break 5892 } 5893 v.reset(Op386MOVSSstoreidx4) 5894 v.AuxInt = off1 + off2 5895 v.Aux = mergeSym(sym1, sym2) 5896 v.AddArg(ptr) 5897 v.AddArg(idx) 5898 v.AddArg(val) 5899 v.AddArg(mem) 5900 return true 5901 } 5902 // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) 5903 // cond: ptr.Op != OpSB 5904 // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) 5905 for { 5906 off := v.AuxInt 5907 sym := v.Aux 5908 v_0 := v.Args[0] 5909 if v_0.Op != Op386ADDL { 5910 break 5911 } 5912 ptr := v_0.Args[0] 5913 idx := v_0.Args[1] 5914 val := v.Args[1] 5915 mem := v.Args[2] 5916 if !(ptr.Op != OpSB) { 5917 break 5918 } 5919 v.reset(Op386MOVSSstoreidx1) 5920 v.AuxInt = off 5921 v.Aux = sym 5922 v.AddArg(ptr) 5923 v.AddArg(idx) 5924 v.AddArg(val) 5925 v.AddArg(mem) 5926 return true 5927 } 5928 return false 5929 } 5930 func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { 5931 // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5932 // cond: 5933 // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem) 5934 for { 5935 c := v.AuxInt 5936 sym := v.Aux 5937 v_0 := v.Args[0] 5938 if v_0.Op != Op386ADDLconst { 5939 break 5940 } 5941 d := v_0.AuxInt 5942 ptr := v_0.Args[0] 5943 idx := v.Args[1] 5944 val := v.Args[2] 5945 mem := v.Args[3] 5946 v.reset(Op386MOVSSstoreidx1) 5947 v.AuxInt = c + d 5948 v.Aux = sym 5949 v.AddArg(ptr) 5950 v.AddArg(idx) 5951 v.AddArg(val) 5952 v.AddArg(mem) 5953 return true 5954 } 5955 // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5956 // cond: 5957 // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem) 5958 for { 5959 c := v.AuxInt 5960 sym := v.Aux 5961 ptr := v.Args[0] 5962 v_1 := v.Args[1] 5963 if v_1.Op != Op386ADDLconst { 5964 break 5965 } 5966 d := v_1.AuxInt 5967 idx := v_1.Args[0] 5968 val := v.Args[2] 5969 mem := v.Args[3] 5970 v.reset(Op386MOVSSstoreidx1) 5971 v.AuxInt = c + d 5972 v.Aux = sym 5973 v.AddArg(ptr) 5974 v.AddArg(idx) 5975 v.AddArg(val) 5976 v.AddArg(mem) 5977 return true 5978 } 5979 return false 5980 } 5981 func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { 5982 // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5983 // cond: 5984 // result: (MOVSSstoreidx4 [c+d] {sym} ptr idx val mem) 5985 for { 5986 c := v.AuxInt 5987 sym := v.Aux 5988 v_0 := v.Args[0] 5989 if v_0.Op != Op386ADDLconst { 5990 break 5991 } 5992 d := v_0.AuxInt 5993 ptr := v_0.Args[0] 5994 idx := v.Args[1] 5995 val := v.Args[2] 5996 mem := v.Args[3] 5997 v.reset(Op386MOVSSstoreidx4) 5998 v.AuxInt = c + d 5999 v.Aux = sym 6000 v.AddArg(ptr) 6001 v.AddArg(idx) 6002 v.AddArg(val) 6003 v.AddArg(mem) 6004 return true 6005 } 6006 // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6007 // cond: 6008 // result: (MOVSSstoreidx4 [c+4*d] {sym} ptr idx val mem) 6009 for { 6010 c := v.AuxInt 6011 sym := v.Aux 6012 ptr := v.Args[0] 6013 v_1 := v.Args[1] 6014 if v_1.Op != Op386ADDLconst { 6015 break 6016 } 6017 d := v_1.AuxInt 6018 idx := v_1.Args[0] 6019 val := v.Args[2] 6020 mem := v.Args[3] 6021 v.reset(Op386MOVSSstoreidx4) 6022 v.AuxInt = c + 4*d 6023 v.Aux = sym 6024 v.AddArg(ptr) 6025 v.AddArg(idx) 6026 v.AddArg(val) 6027 v.AddArg(mem) 6028 return true 6029 } 6030 return false 6031 } 6032 func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { 6033 b := v.Block 6034 _ = b 6035 // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) 6036 // cond: x.Uses == 1 && clobber(x) 6037 // result: @x.Block (MOVWLSXload <v.Type> [off] {sym} ptr mem) 6038 for { 6039 x := v.Args[0] 6040 if x.Op != Op386MOVWload { 6041 break 6042 } 6043 off := x.AuxInt 6044 sym := x.Aux 6045 ptr := x.Args[0] 6046 mem := x.Args[1] 6047 if !(x.Uses == 1 && clobber(x)) { 6048 break 6049 } 6050 b = x.Block 6051 v0 := b.NewValue0(v.Pos, Op386MOVWLSXload, v.Type) 6052 v.reset(OpCopy) 6053 v.AddArg(v0) 6054 v0.AuxInt = off 6055 v0.Aux = sym 6056 v0.AddArg(ptr) 6057 v0.AddArg(mem) 6058 return true 6059 } 6060 // match: (MOVWLSX (ANDLconst [c] x)) 6061 // cond: c & 0x8000 == 0 6062 // result: (ANDLconst [c & 0x7fff] x) 6063 for { 6064 v_0 := v.Args[0] 6065 if v_0.Op != Op386ANDLconst { 6066 break 6067 } 6068 c := v_0.AuxInt 6069 x := v_0.Args[0] 6070 if !(c&0x8000 == 0) { 6071 break 6072 } 6073 v.reset(Op386ANDLconst) 6074 v.AuxInt = c & 0x7fff 6075 v.AddArg(x) 6076 return true 6077 } 6078 return false 6079 } 6080 func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { 6081 b := v.Block 6082 _ = b 6083 config := b.Func.Config 6084 _ = config 6085 // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6086 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6087 // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6088 for { 6089 off1 := v.AuxInt 6090 sym1 := v.Aux 6091 v_0 := v.Args[0] 6092 if v_0.Op != Op386LEAL { 6093 break 6094 } 6095 off2 := v_0.AuxInt 6096 sym2 := v_0.Aux 6097 base := v_0.Args[0] 6098 mem := v.Args[1] 6099 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6100 break 6101 } 6102 v.reset(Op386MOVWLSXload) 6103 v.AuxInt = off1 + off2 6104 v.Aux = mergeSym(sym1, sym2) 6105 v.AddArg(base) 6106 v.AddArg(mem) 6107 return true 6108 } 6109 return false 6110 } 6111 func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { 6112 b := v.Block 6113 _ = b 6114 // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) 6115 // cond: x.Uses == 1 && clobber(x) 6116 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 6117 for { 6118 x := v.Args[0] 6119 if x.Op != Op386MOVWload { 6120 break 6121 } 6122 off := x.AuxInt 6123 sym := x.Aux 6124 ptr := x.Args[0] 6125 mem := x.Args[1] 6126 if !(x.Uses == 1 && clobber(x)) { 6127 break 6128 } 6129 b = x.Block 6130 v0 := b.NewValue0(v.Pos, Op386MOVWload, v.Type) 6131 v.reset(OpCopy) 6132 v.AddArg(v0) 6133 v0.AuxInt = off 6134 v0.Aux = sym 6135 v0.AddArg(ptr) 6136 v0.AddArg(mem) 6137 return true 6138 } 6139 // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) 6140 // cond: x.Uses == 1 && clobber(x) 6141 // result: @x.Block (MOVWloadidx1 <v.Type> [off] {sym} ptr idx mem) 6142 for { 6143 x := v.Args[0] 6144 if x.Op != Op386MOVWloadidx1 { 6145 break 6146 } 6147 off := x.AuxInt 6148 sym := x.Aux 6149 ptr := x.Args[0] 6150 idx := x.Args[1] 6151 mem := x.Args[2] 6152 if !(x.Uses == 1 && clobber(x)) { 6153 break 6154 } 6155 b = x.Block 6156 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 6157 v.reset(OpCopy) 6158 v.AddArg(v0) 6159 v0.AuxInt = off 6160 v0.Aux = sym 6161 v0.AddArg(ptr) 6162 v0.AddArg(idx) 6163 v0.AddArg(mem) 6164 return true 6165 } 6166 // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) 6167 // cond: x.Uses == 1 && clobber(x) 6168 // result: @x.Block (MOVWloadidx2 <v.Type> [off] {sym} ptr idx mem) 6169 for { 6170 x := v.Args[0] 6171 if x.Op != Op386MOVWloadidx2 { 6172 break 6173 } 6174 off := x.AuxInt 6175 sym := x.Aux 6176 ptr := x.Args[0] 6177 idx := x.Args[1] 6178 mem := x.Args[2] 6179 if !(x.Uses == 1 && clobber(x)) { 6180 break 6181 } 6182 b = x.Block 6183 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) 6184 v.reset(OpCopy) 6185 v.AddArg(v0) 6186 v0.AuxInt = off 6187 v0.Aux = sym 6188 v0.AddArg(ptr) 6189 v0.AddArg(idx) 6190 v0.AddArg(mem) 6191 return true 6192 } 6193 // match: (MOVWLZX (ANDLconst [c] x)) 6194 // cond: 6195 // result: (ANDLconst [c & 0xffff] x) 6196 for { 6197 v_0 := v.Args[0] 6198 if v_0.Op != Op386ANDLconst { 6199 break 6200 } 6201 c := v_0.AuxInt 6202 x := v_0.Args[0] 6203 v.reset(Op386ANDLconst) 6204 v.AuxInt = c & 0xffff 6205 v.AddArg(x) 6206 return true 6207 } 6208 return false 6209 } 6210 func rewriteValue386_Op386MOVWload_0(v *Value) bool { 6211 b := v.Block 6212 _ = b 6213 config := b.Func.Config 6214 _ = config 6215 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6216 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6217 // result: x 6218 for { 6219 off := v.AuxInt 6220 sym := v.Aux 6221 ptr := v.Args[0] 6222 v_1 := v.Args[1] 6223 if v_1.Op != Op386MOVWstore { 6224 break 6225 } 6226 off2 := v_1.AuxInt 6227 sym2 := v_1.Aux 6228 ptr2 := v_1.Args[0] 6229 x := v_1.Args[1] 6230 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6231 break 6232 } 6233 v.reset(OpCopy) 6234 v.Type = x.Type 6235 v.AddArg(x) 6236 return true 6237 } 6238 // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) 6239 // cond: is32Bit(off1+off2) 6240 // result: (MOVWload [off1+off2] {sym} ptr mem) 6241 for { 6242 off1 := v.AuxInt 6243 sym := v.Aux 6244 v_0 := v.Args[0] 6245 if v_0.Op != Op386ADDLconst { 6246 break 6247 } 6248 off2 := v_0.AuxInt 6249 ptr := v_0.Args[0] 6250 mem := v.Args[1] 6251 if !(is32Bit(off1 + off2)) { 6252 break 6253 } 6254 v.reset(Op386MOVWload) 6255 v.AuxInt = off1 + off2 6256 v.Aux = sym 6257 v.AddArg(ptr) 6258 v.AddArg(mem) 6259 return true 6260 } 6261 // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6262 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6263 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6264 for { 6265 off1 := v.AuxInt 6266 sym1 := v.Aux 6267 v_0 := v.Args[0] 6268 if v_0.Op != Op386LEAL { 6269 break 6270 } 6271 off2 := v_0.AuxInt 6272 sym2 := v_0.Aux 6273 base := v_0.Args[0] 6274 mem := v.Args[1] 6275 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6276 break 6277 } 6278 v.reset(Op386MOVWload) 6279 v.AuxInt = off1 + off2 6280 v.Aux = mergeSym(sym1, sym2) 6281 v.AddArg(base) 6282 v.AddArg(mem) 6283 return true 6284 } 6285 // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 6286 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6287 // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6288 for { 6289 off1 := v.AuxInt 6290 sym1 := v.Aux 6291 v_0 := v.Args[0] 6292 if v_0.Op != Op386LEAL1 { 6293 break 6294 } 6295 off2 := v_0.AuxInt 6296 sym2 := v_0.Aux 6297 ptr := v_0.Args[0] 6298 idx := v_0.Args[1] 6299 mem := v.Args[1] 6300 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6301 break 6302 } 6303 v.reset(Op386MOVWloadidx1) 6304 v.AuxInt = off1 + off2 6305 v.Aux = mergeSym(sym1, sym2) 6306 v.AddArg(ptr) 6307 v.AddArg(idx) 6308 v.AddArg(mem) 6309 return true 6310 } 6311 // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) 6312 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6313 // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6314 for { 6315 off1 := v.AuxInt 6316 sym1 := v.Aux 6317 v_0 := v.Args[0] 6318 if v_0.Op != Op386LEAL2 { 6319 break 6320 } 6321 off2 := v_0.AuxInt 6322 sym2 := v_0.Aux 6323 ptr := v_0.Args[0] 6324 idx := v_0.Args[1] 6325 mem := v.Args[1] 6326 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6327 break 6328 } 6329 v.reset(Op386MOVWloadidx2) 6330 v.AuxInt = off1 + off2 6331 v.Aux = mergeSym(sym1, sym2) 6332 v.AddArg(ptr) 6333 v.AddArg(idx) 6334 v.AddArg(mem) 6335 return true 6336 } 6337 // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) 6338 // cond: ptr.Op != OpSB 6339 // result: (MOVWloadidx1 [off] {sym} ptr idx mem) 6340 for { 6341 off := v.AuxInt 6342 sym := v.Aux 6343 v_0 := v.Args[0] 6344 if v_0.Op != Op386ADDL { 6345 break 6346 } 6347 ptr := v_0.Args[0] 6348 idx := v_0.Args[1] 6349 mem := v.Args[1] 6350 if !(ptr.Op != OpSB) { 6351 break 6352 } 6353 v.reset(Op386MOVWloadidx1) 6354 v.AuxInt = off 6355 v.Aux = sym 6356 v.AddArg(ptr) 6357 v.AddArg(idx) 6358 v.AddArg(mem) 6359 return true 6360 } 6361 return false 6362 } 6363 func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { 6364 // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 6365 // cond: 6366 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6367 for { 6368 c := v.AuxInt 6369 sym := v.Aux 6370 ptr := v.Args[0] 6371 v_1 := v.Args[1] 6372 if v_1.Op != Op386SHLLconst { 6373 break 6374 } 6375 if v_1.AuxInt != 1 { 6376 break 6377 } 6378 idx := v_1.Args[0] 6379 mem := v.Args[2] 6380 v.reset(Op386MOVWloadidx2) 6381 v.AuxInt = c 6382 v.Aux = sym 6383 v.AddArg(ptr) 6384 v.AddArg(idx) 6385 v.AddArg(mem) 6386 return true 6387 } 6388 // match: (MOVWloadidx1 [c] {sym} (SHLLconst [1] idx) ptr mem) 6389 // cond: 6390 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6391 for { 6392 c := v.AuxInt 6393 sym := v.Aux 6394 v_0 := v.Args[0] 6395 if v_0.Op != Op386SHLLconst { 6396 break 6397 } 6398 if v_0.AuxInt != 1 { 6399 break 6400 } 6401 idx := v_0.Args[0] 6402 ptr := v.Args[1] 6403 mem := v.Args[2] 6404 v.reset(Op386MOVWloadidx2) 6405 v.AuxInt = c 6406 v.Aux = sym 6407 v.AddArg(ptr) 6408 v.AddArg(idx) 6409 v.AddArg(mem) 6410 return true 6411 } 6412 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 6413 // cond: 6414 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6415 for { 6416 c := v.AuxInt 6417 sym := v.Aux 6418 v_0 := v.Args[0] 6419 if v_0.Op != Op386ADDLconst { 6420 break 6421 } 6422 d := v_0.AuxInt 6423 ptr := v_0.Args[0] 6424 idx := v.Args[1] 6425 mem := v.Args[2] 6426 v.reset(Op386MOVWloadidx1) 6427 v.AuxInt = c + d 6428 v.Aux = sym 6429 v.AddArg(ptr) 6430 v.AddArg(idx) 6431 v.AddArg(mem) 6432 return true 6433 } 6434 // match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 6435 // cond: 6436 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6437 for { 6438 c := v.AuxInt 6439 sym := v.Aux 6440 idx := v.Args[0] 6441 v_1 := v.Args[1] 6442 if v_1.Op != Op386ADDLconst { 6443 break 6444 } 6445 d := v_1.AuxInt 6446 ptr := v_1.Args[0] 6447 mem := v.Args[2] 6448 v.reset(Op386MOVWloadidx1) 6449 v.AuxInt = c + d 6450 v.Aux = sym 6451 v.AddArg(ptr) 6452 v.AddArg(idx) 6453 v.AddArg(mem) 6454 return true 6455 } 6456 // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 6457 // cond: 6458 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6459 for { 6460 c := v.AuxInt 6461 sym := v.Aux 6462 ptr := v.Args[0] 6463 v_1 := v.Args[1] 6464 if v_1.Op != Op386ADDLconst { 6465 break 6466 } 6467 d := v_1.AuxInt 6468 idx := v_1.Args[0] 6469 mem := v.Args[2] 6470 v.reset(Op386MOVWloadidx1) 6471 v.AuxInt = c + d 6472 v.Aux = sym 6473 v.AddArg(ptr) 6474 v.AddArg(idx) 6475 v.AddArg(mem) 6476 return true 6477 } 6478 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 6479 // cond: 6480 // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) 6481 for { 6482 c := v.AuxInt 6483 sym := v.Aux 6484 v_0 := v.Args[0] 6485 if v_0.Op != Op386ADDLconst { 6486 break 6487 } 6488 d := v_0.AuxInt 6489 idx := v_0.Args[0] 6490 ptr := v.Args[1] 6491 mem := v.Args[2] 6492 v.reset(Op386MOVWloadidx1) 6493 v.AuxInt = c + d 6494 v.Aux = sym 6495 v.AddArg(ptr) 6496 v.AddArg(idx) 6497 v.AddArg(mem) 6498 return true 6499 } 6500 return false 6501 } 6502 func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { 6503 // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) 6504 // cond: 6505 // result: (MOVWloadidx2 [c+d] {sym} ptr idx mem) 6506 for { 6507 c := v.AuxInt 6508 sym := v.Aux 6509 v_0 := v.Args[0] 6510 if v_0.Op != Op386ADDLconst { 6511 break 6512 } 6513 d := v_0.AuxInt 6514 ptr := v_0.Args[0] 6515 idx := v.Args[1] 6516 mem := v.Args[2] 6517 v.reset(Op386MOVWloadidx2) 6518 v.AuxInt = c + d 6519 v.Aux = sym 6520 v.AddArg(ptr) 6521 v.AddArg(idx) 6522 v.AddArg(mem) 6523 return true 6524 } 6525 // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) 6526 // cond: 6527 // result: (MOVWloadidx2 [c+2*d] {sym} ptr idx mem) 6528 for { 6529 c := v.AuxInt 6530 sym := v.Aux 6531 ptr := v.Args[0] 6532 v_1 := v.Args[1] 6533 if v_1.Op != Op386ADDLconst { 6534 break 6535 } 6536 d := v_1.AuxInt 6537 idx := v_1.Args[0] 6538 mem := v.Args[2] 6539 v.reset(Op386MOVWloadidx2) 6540 v.AuxInt = c + 2*d 6541 v.Aux = sym 6542 v.AddArg(ptr) 6543 v.AddArg(idx) 6544 v.AddArg(mem) 6545 return true 6546 } 6547 return false 6548 } 6549 func rewriteValue386_Op386MOVWstore_0(v *Value) bool { 6550 b := v.Block 6551 _ = b 6552 config := b.Func.Config 6553 _ = config 6554 // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) 6555 // cond: 6556 // result: (MOVWstore [off] {sym} ptr x mem) 6557 for { 6558 off := v.AuxInt 6559 sym := v.Aux 6560 ptr := v.Args[0] 6561 v_1 := v.Args[1] 6562 if v_1.Op != Op386MOVWLSX { 6563 break 6564 } 6565 x := v_1.Args[0] 6566 mem := v.Args[2] 6567 v.reset(Op386MOVWstore) 6568 v.AuxInt = off 6569 v.Aux = sym 6570 v.AddArg(ptr) 6571 v.AddArg(x) 6572 v.AddArg(mem) 6573 return true 6574 } 6575 // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) 6576 // cond: 6577 // result: (MOVWstore [off] {sym} ptr x mem) 6578 for { 6579 off := v.AuxInt 6580 sym := v.Aux 6581 ptr := v.Args[0] 6582 v_1 := v.Args[1] 6583 if v_1.Op != Op386MOVWLZX { 6584 break 6585 } 6586 x := v_1.Args[0] 6587 mem := v.Args[2] 6588 v.reset(Op386MOVWstore) 6589 v.AuxInt = off 6590 v.Aux = sym 6591 v.AddArg(ptr) 6592 v.AddArg(x) 6593 v.AddArg(mem) 6594 return true 6595 } 6596 // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 6597 // cond: is32Bit(off1+off2) 6598 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6599 for { 6600 off1 := v.AuxInt 6601 sym := v.Aux 6602 v_0 := v.Args[0] 6603 if v_0.Op != Op386ADDLconst { 6604 break 6605 } 6606 off2 := v_0.AuxInt 6607 ptr := v_0.Args[0] 6608 val := v.Args[1] 6609 mem := v.Args[2] 6610 if !(is32Bit(off1 + off2)) { 6611 break 6612 } 6613 v.reset(Op386MOVWstore) 6614 v.AuxInt = off1 + off2 6615 v.Aux = sym 6616 v.AddArg(ptr) 6617 v.AddArg(val) 6618 v.AddArg(mem) 6619 return true 6620 } 6621 // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) 6622 // cond: validOff(off) 6623 // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 6624 for { 6625 off := v.AuxInt 6626 sym := v.Aux 6627 ptr := v.Args[0] 6628 v_1 := v.Args[1] 6629 if v_1.Op != Op386MOVLconst { 6630 break 6631 } 6632 c := v_1.AuxInt 6633 mem := v.Args[2] 6634 if !(validOff(off)) { 6635 break 6636 } 6637 v.reset(Op386MOVWstoreconst) 6638 v.AuxInt = makeValAndOff(int64(int16(c)), off) 6639 v.Aux = sym 6640 v.AddArg(ptr) 6641 v.AddArg(mem) 6642 return true 6643 } 6644 // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 6645 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6646 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 6647 for { 6648 off1 := v.AuxInt 6649 sym1 := v.Aux 6650 v_0 := v.Args[0] 6651 if v_0.Op != Op386LEAL { 6652 break 6653 } 6654 off2 := v_0.AuxInt 6655 sym2 := v_0.Aux 6656 base := v_0.Args[0] 6657 val := v.Args[1] 6658 mem := v.Args[2] 6659 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6660 break 6661 } 6662 v.reset(Op386MOVWstore) 6663 v.AuxInt = off1 + off2 6664 v.Aux = mergeSym(sym1, sym2) 6665 v.AddArg(base) 6666 v.AddArg(val) 6667 v.AddArg(mem) 6668 return true 6669 } 6670 // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 6671 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6672 // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6673 for { 6674 off1 := v.AuxInt 6675 sym1 := v.Aux 6676 v_0 := v.Args[0] 6677 if v_0.Op != Op386LEAL1 { 6678 break 6679 } 6680 off2 := v_0.AuxInt 6681 sym2 := v_0.Aux 6682 ptr := v_0.Args[0] 6683 idx := v_0.Args[1] 6684 val := v.Args[1] 6685 mem := v.Args[2] 6686 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6687 break 6688 } 6689 v.reset(Op386MOVWstoreidx1) 6690 v.AuxInt = off1 + off2 6691 v.Aux = mergeSym(sym1, sym2) 6692 v.AddArg(ptr) 6693 v.AddArg(idx) 6694 v.AddArg(val) 6695 v.AddArg(mem) 6696 return true 6697 } 6698 // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) 6699 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6700 // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6701 for { 6702 off1 := v.AuxInt 6703 sym1 := v.Aux 6704 v_0 := v.Args[0] 6705 if v_0.Op != Op386LEAL2 { 6706 break 6707 } 6708 off2 := v_0.AuxInt 6709 sym2 := v_0.Aux 6710 ptr := v_0.Args[0] 6711 idx := v_0.Args[1] 6712 val := v.Args[1] 6713 mem := v.Args[2] 6714 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6715 break 6716 } 6717 v.reset(Op386MOVWstoreidx2) 6718 v.AuxInt = off1 + off2 6719 v.Aux = mergeSym(sym1, sym2) 6720 v.AddArg(ptr) 6721 v.AddArg(idx) 6722 v.AddArg(val) 6723 v.AddArg(mem) 6724 return true 6725 } 6726 // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) 6727 // cond: ptr.Op != OpSB 6728 // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) 6729 for { 6730 off := v.AuxInt 6731 sym := v.Aux 6732 v_0 := v.Args[0] 6733 if v_0.Op != Op386ADDL { 6734 break 6735 } 6736 ptr := v_0.Args[0] 6737 idx := v_0.Args[1] 6738 val := v.Args[1] 6739 mem := v.Args[2] 6740 if !(ptr.Op != OpSB) { 6741 break 6742 } 6743 v.reset(Op386MOVWstoreidx1) 6744 v.AuxInt = off 6745 v.Aux = sym 6746 v.AddArg(ptr) 6747 v.AddArg(idx) 6748 v.AddArg(val) 6749 v.AddArg(mem) 6750 return true 6751 } 6752 // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) 6753 // cond: x.Uses == 1 && clobber(x) 6754 // result: (MOVLstore [i-2] {s} p w mem) 6755 for { 6756 i := v.AuxInt 6757 s := v.Aux 6758 p := v.Args[0] 6759 v_1 := v.Args[1] 6760 if v_1.Op != Op386SHRLconst { 6761 break 6762 } 6763 if v_1.AuxInt != 16 { 6764 break 6765 } 6766 w := v_1.Args[0] 6767 x := v.Args[2] 6768 if x.Op != Op386MOVWstore { 6769 break 6770 } 6771 if x.AuxInt != i-2 { 6772 break 6773 } 6774 if x.Aux != s { 6775 break 6776 } 6777 if p != x.Args[0] { 6778 break 6779 } 6780 if w != x.Args[1] { 6781 break 6782 } 6783 mem := x.Args[2] 6784 if !(x.Uses == 1 && clobber(x)) { 6785 break 6786 } 6787 v.reset(Op386MOVLstore) 6788 v.AuxInt = i - 2 6789 v.Aux = s 6790 v.AddArg(p) 6791 v.AddArg(w) 6792 v.AddArg(mem) 6793 return true 6794 } 6795 // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) 6796 // cond: x.Uses == 1 && clobber(x) 6797 // result: (MOVLstore [i-2] {s} p w0 mem) 6798 for { 6799 i := v.AuxInt 6800 s := v.Aux 6801 p := v.Args[0] 6802 v_1 := v.Args[1] 6803 if v_1.Op != Op386SHRLconst { 6804 break 6805 } 6806 j := v_1.AuxInt 6807 w := v_1.Args[0] 6808 x := v.Args[2] 6809 if x.Op != Op386MOVWstore { 6810 break 6811 } 6812 if x.AuxInt != i-2 { 6813 break 6814 } 6815 if x.Aux != s { 6816 break 6817 } 6818 if p != x.Args[0] { 6819 break 6820 } 6821 w0 := x.Args[1] 6822 if w0.Op != Op386SHRLconst { 6823 break 6824 } 6825 if w0.AuxInt != j-16 { 6826 break 6827 } 6828 if w != w0.Args[0] { 6829 break 6830 } 6831 mem := x.Args[2] 6832 if !(x.Uses == 1 && clobber(x)) { 6833 break 6834 } 6835 v.reset(Op386MOVLstore) 6836 v.AuxInt = i - 2 6837 v.Aux = s 6838 v.AddArg(p) 6839 v.AddArg(w0) 6840 v.AddArg(mem) 6841 return true 6842 } 6843 return false 6844 } 6845 func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { 6846 b := v.Block 6847 _ = b 6848 config := b.Func.Config 6849 _ = config 6850 // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 6851 // cond: ValAndOff(sc).canAdd(off) 6852 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 6853 for { 6854 sc := v.AuxInt 6855 s := v.Aux 6856 v_0 := v.Args[0] 6857 if v_0.Op != Op386ADDLconst { 6858 break 6859 } 6860 off := v_0.AuxInt 6861 ptr := v_0.Args[0] 6862 mem := v.Args[1] 6863 if !(ValAndOff(sc).canAdd(off)) { 6864 break 6865 } 6866 v.reset(Op386MOVWstoreconst) 6867 v.AuxInt = ValAndOff(sc).add(off) 6868 v.Aux = s 6869 v.AddArg(ptr) 6870 v.AddArg(mem) 6871 return true 6872 } 6873 // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 6874 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 6875 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 6876 for { 6877 sc := v.AuxInt 6878 sym1 := v.Aux 6879 v_0 := v.Args[0] 6880 if v_0.Op != Op386LEAL { 6881 break 6882 } 6883 off := v_0.AuxInt 6884 sym2 := v_0.Aux 6885 ptr := v_0.Args[0] 6886 mem := v.Args[1] 6887 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 6888 break 6889 } 6890 v.reset(Op386MOVWstoreconst) 6891 v.AuxInt = ValAndOff(sc).add(off) 6892 v.Aux = mergeSym(sym1, sym2) 6893 v.AddArg(ptr) 6894 v.AddArg(mem) 6895 return true 6896 } 6897 // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 6898 // cond: canMergeSym(sym1, sym2) 6899 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 6900 for { 6901 x := v.AuxInt 6902 sym1 := v.Aux 6903 v_0 := v.Args[0] 6904 if v_0.Op != Op386LEAL1 { 6905 break 6906 } 6907 off := v_0.AuxInt 6908 sym2 := v_0.Aux 6909 ptr := v_0.Args[0] 6910 idx := v_0.Args[1] 6911 mem := v.Args[1] 6912 if !(canMergeSym(sym1, sym2)) { 6913 break 6914 } 6915 v.reset(Op386MOVWstoreconstidx1) 6916 v.AuxInt = ValAndOff(x).add(off) 6917 v.Aux = mergeSym(sym1, sym2) 6918 v.AddArg(ptr) 6919 v.AddArg(idx) 6920 v.AddArg(mem) 6921 return true 6922 } 6923 // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) 6924 // cond: canMergeSym(sym1, sym2) 6925 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 6926 for { 6927 x := v.AuxInt 6928 sym1 := v.Aux 6929 v_0 := v.Args[0] 6930 if v_0.Op != Op386LEAL2 { 6931 break 6932 } 6933 off := v_0.AuxInt 6934 sym2 := v_0.Aux 6935 ptr := v_0.Args[0] 6936 idx := v_0.Args[1] 6937 mem := v.Args[1] 6938 if !(canMergeSym(sym1, sym2)) { 6939 break 6940 } 6941 v.reset(Op386MOVWstoreconstidx2) 6942 v.AuxInt = ValAndOff(x).add(off) 6943 v.Aux = mergeSym(sym1, sym2) 6944 v.AddArg(ptr) 6945 v.AddArg(idx) 6946 v.AddArg(mem) 6947 return true 6948 } 6949 // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) 6950 // cond: 6951 // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) 6952 for { 6953 x := v.AuxInt 6954 sym := v.Aux 6955 v_0 := v.Args[0] 6956 if v_0.Op != Op386ADDL { 6957 break 6958 } 6959 ptr := v_0.Args[0] 6960 idx := v_0.Args[1] 6961 mem := v.Args[1] 6962 v.reset(Op386MOVWstoreconstidx1) 6963 v.AuxInt = x 6964 v.Aux = sym 6965 v.AddArg(ptr) 6966 v.AddArg(idx) 6967 v.AddArg(mem) 6968 return true 6969 } 6970 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 6971 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 6972 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 6973 for { 6974 c := v.AuxInt 6975 s := v.Aux 6976 p := v.Args[0] 6977 x := v.Args[1] 6978 if x.Op != Op386MOVWstoreconst { 6979 break 6980 } 6981 a := x.AuxInt 6982 if x.Aux != s { 6983 break 6984 } 6985 if p != x.Args[0] { 6986 break 6987 } 6988 mem := x.Args[1] 6989 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 6990 break 6991 } 6992 v.reset(Op386MOVLstoreconst) 6993 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 6994 v.Aux = s 6995 v.AddArg(p) 6996 v.AddArg(mem) 6997 return true 6998 } 6999 return false 7000 } 7001 func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { 7002 // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 7003 // cond: 7004 // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) 7005 for { 7006 c := v.AuxInt 7007 sym := v.Aux 7008 ptr := v.Args[0] 7009 v_1 := v.Args[1] 7010 if v_1.Op != Op386SHLLconst { 7011 break 7012 } 7013 if v_1.AuxInt != 1 { 7014 break 7015 } 7016 idx := v_1.Args[0] 7017 mem := v.Args[2] 7018 v.reset(Op386MOVWstoreconstidx2) 7019 v.AuxInt = c 7020 v.Aux = sym 7021 v.AddArg(ptr) 7022 v.AddArg(idx) 7023 v.AddArg(mem) 7024 return true 7025 } 7026 // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 7027 // cond: 7028 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7029 for { 7030 x := v.AuxInt 7031 sym := v.Aux 7032 v_0 := v.Args[0] 7033 if v_0.Op != Op386ADDLconst { 7034 break 7035 } 7036 c := v_0.AuxInt 7037 ptr := v_0.Args[0] 7038 idx := v.Args[1] 7039 mem := v.Args[2] 7040 v.reset(Op386MOVWstoreconstidx1) 7041 v.AuxInt = ValAndOff(x).add(c) 7042 v.Aux = sym 7043 v.AddArg(ptr) 7044 v.AddArg(idx) 7045 v.AddArg(mem) 7046 return true 7047 } 7048 // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 7049 // cond: 7050 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7051 for { 7052 x := v.AuxInt 7053 sym := v.Aux 7054 ptr := v.Args[0] 7055 v_1 := v.Args[1] 7056 if v_1.Op != Op386ADDLconst { 7057 break 7058 } 7059 c := v_1.AuxInt 7060 idx := v_1.Args[0] 7061 mem := v.Args[2] 7062 v.reset(Op386MOVWstoreconstidx1) 7063 v.AuxInt = ValAndOff(x).add(c) 7064 v.Aux = sym 7065 v.AddArg(ptr) 7066 v.AddArg(idx) 7067 v.AddArg(mem) 7068 return true 7069 } 7070 // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) 7071 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7072 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) 7073 for { 7074 c := v.AuxInt 7075 s := v.Aux 7076 p := v.Args[0] 7077 i := v.Args[1] 7078 x := v.Args[2] 7079 if x.Op != Op386MOVWstoreconstidx1 { 7080 break 7081 } 7082 a := x.AuxInt 7083 if x.Aux != s { 7084 break 7085 } 7086 if p != x.Args[0] { 7087 break 7088 } 7089 if i != x.Args[1] { 7090 break 7091 } 7092 mem := x.Args[2] 7093 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7094 break 7095 } 7096 v.reset(Op386MOVLstoreconstidx1) 7097 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7098 v.Aux = s 7099 v.AddArg(p) 7100 v.AddArg(i) 7101 v.AddArg(mem) 7102 return true 7103 } 7104 return false 7105 } 7106 func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { 7107 b := v.Block 7108 _ = b 7109 // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) 7110 // cond: 7111 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7112 for { 7113 x := v.AuxInt 7114 sym := v.Aux 7115 v_0 := v.Args[0] 7116 if v_0.Op != Op386ADDLconst { 7117 break 7118 } 7119 c := v_0.AuxInt 7120 ptr := v_0.Args[0] 7121 idx := v.Args[1] 7122 mem := v.Args[2] 7123 v.reset(Op386MOVWstoreconstidx2) 7124 v.AuxInt = ValAndOff(x).add(c) 7125 v.Aux = sym 7126 v.AddArg(ptr) 7127 v.AddArg(idx) 7128 v.AddArg(mem) 7129 return true 7130 } 7131 // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) 7132 // cond: 7133 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) 7134 for { 7135 x := v.AuxInt 7136 sym := v.Aux 7137 ptr := v.Args[0] 7138 v_1 := v.Args[1] 7139 if v_1.Op != Op386ADDLconst { 7140 break 7141 } 7142 c := v_1.AuxInt 7143 idx := v_1.Args[0] 7144 mem := v.Args[2] 7145 v.reset(Op386MOVWstoreconstidx2) 7146 v.AuxInt = ValAndOff(x).add(2 * c) 7147 v.Aux = sym 7148 v.AddArg(ptr) 7149 v.AddArg(idx) 7150 v.AddArg(mem) 7151 return true 7152 } 7153 // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) 7154 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7155 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst <i.Type> [1] i) mem) 7156 for { 7157 c := v.AuxInt 7158 s := v.Aux 7159 p := v.Args[0] 7160 i := v.Args[1] 7161 x := v.Args[2] 7162 if x.Op != Op386MOVWstoreconstidx2 { 7163 break 7164 } 7165 a := x.AuxInt 7166 if x.Aux != s { 7167 break 7168 } 7169 if p != x.Args[0] { 7170 break 7171 } 7172 if i != x.Args[1] { 7173 break 7174 } 7175 mem := x.Args[2] 7176 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7177 break 7178 } 7179 v.reset(Op386MOVLstoreconstidx1) 7180 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7181 v.Aux = s 7182 v.AddArg(p) 7183 v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) 7184 v0.AuxInt = 1 7185 v0.AddArg(i) 7186 v.AddArg(v0) 7187 v.AddArg(mem) 7188 return true 7189 } 7190 return false 7191 } 7192 func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { 7193 // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) 7194 // cond: 7195 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7196 for { 7197 c := v.AuxInt 7198 sym := v.Aux 7199 ptr := v.Args[0] 7200 v_1 := v.Args[1] 7201 if v_1.Op != Op386SHLLconst { 7202 break 7203 } 7204 if v_1.AuxInt != 1 { 7205 break 7206 } 7207 idx := v_1.Args[0] 7208 val := v.Args[2] 7209 mem := v.Args[3] 7210 v.reset(Op386MOVWstoreidx2) 7211 v.AuxInt = c 7212 v.Aux = sym 7213 v.AddArg(ptr) 7214 v.AddArg(idx) 7215 v.AddArg(val) 7216 v.AddArg(mem) 7217 return true 7218 } 7219 // match: (MOVWstoreidx1 [c] {sym} (SHLLconst [1] idx) ptr val mem) 7220 // cond: 7221 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7222 for { 7223 c := v.AuxInt 7224 sym := v.Aux 7225 v_0 := v.Args[0] 7226 if v_0.Op != Op386SHLLconst { 7227 break 7228 } 7229 if v_0.AuxInt != 1 { 7230 break 7231 } 7232 idx := v_0.Args[0] 7233 ptr := v.Args[1] 7234 val := v.Args[2] 7235 mem := v.Args[3] 7236 v.reset(Op386MOVWstoreidx2) 7237 v.AuxInt = c 7238 v.Aux = sym 7239 v.AddArg(ptr) 7240 v.AddArg(idx) 7241 v.AddArg(val) 7242 v.AddArg(mem) 7243 return true 7244 } 7245 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 7246 // cond: 7247 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7248 for { 7249 c := v.AuxInt 7250 sym := v.Aux 7251 v_0 := v.Args[0] 7252 if v_0.Op != Op386ADDLconst { 7253 break 7254 } 7255 d := v_0.AuxInt 7256 ptr := v_0.Args[0] 7257 idx := v.Args[1] 7258 val := v.Args[2] 7259 mem := v.Args[3] 7260 v.reset(Op386MOVWstoreidx1) 7261 v.AuxInt = c + d 7262 v.Aux = sym 7263 v.AddArg(ptr) 7264 v.AddArg(idx) 7265 v.AddArg(val) 7266 v.AddArg(mem) 7267 return true 7268 } 7269 // match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 7270 // cond: 7271 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7272 for { 7273 c := v.AuxInt 7274 sym := v.Aux 7275 idx := v.Args[0] 7276 v_1 := v.Args[1] 7277 if v_1.Op != Op386ADDLconst { 7278 break 7279 } 7280 d := v_1.AuxInt 7281 ptr := v_1.Args[0] 7282 val := v.Args[2] 7283 mem := v.Args[3] 7284 v.reset(Op386MOVWstoreidx1) 7285 v.AuxInt = c + d 7286 v.Aux = sym 7287 v.AddArg(ptr) 7288 v.AddArg(idx) 7289 v.AddArg(val) 7290 v.AddArg(mem) 7291 return true 7292 } 7293 // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 7294 // cond: 7295 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7296 for { 7297 c := v.AuxInt 7298 sym := v.Aux 7299 ptr := v.Args[0] 7300 v_1 := v.Args[1] 7301 if v_1.Op != Op386ADDLconst { 7302 break 7303 } 7304 d := v_1.AuxInt 7305 idx := v_1.Args[0] 7306 val := v.Args[2] 7307 mem := v.Args[3] 7308 v.reset(Op386MOVWstoreidx1) 7309 v.AuxInt = c + d 7310 v.Aux = sym 7311 v.AddArg(ptr) 7312 v.AddArg(idx) 7313 v.AddArg(val) 7314 v.AddArg(mem) 7315 return true 7316 } 7317 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 7318 // cond: 7319 // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem) 7320 for { 7321 c := v.AuxInt 7322 sym := v.Aux 7323 v_0 := v.Args[0] 7324 if v_0.Op != Op386ADDLconst { 7325 break 7326 } 7327 d := v_0.AuxInt 7328 idx := v_0.Args[0] 7329 ptr := v.Args[1] 7330 val := v.Args[2] 7331 mem := v.Args[3] 7332 v.reset(Op386MOVWstoreidx1) 7333 v.AuxInt = c + d 7334 v.Aux = sym 7335 v.AddArg(ptr) 7336 v.AddArg(idx) 7337 v.AddArg(val) 7338 v.AddArg(mem) 7339 return true 7340 } 7341 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7342 // cond: x.Uses == 1 && clobber(x) 7343 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7344 for { 7345 i := v.AuxInt 7346 s := v.Aux 7347 p := v.Args[0] 7348 idx := v.Args[1] 7349 v_2 := v.Args[2] 7350 if v_2.Op != Op386SHRLconst { 7351 break 7352 } 7353 if v_2.AuxInt != 16 { 7354 break 7355 } 7356 w := v_2.Args[0] 7357 x := v.Args[3] 7358 if x.Op != Op386MOVWstoreidx1 { 7359 break 7360 } 7361 if x.AuxInt != i-2 { 7362 break 7363 } 7364 if x.Aux != s { 7365 break 7366 } 7367 if p != x.Args[0] { 7368 break 7369 } 7370 if idx != x.Args[1] { 7371 break 7372 } 7373 if w != x.Args[2] { 7374 break 7375 } 7376 mem := x.Args[3] 7377 if !(x.Uses == 1 && clobber(x)) { 7378 break 7379 } 7380 v.reset(Op386MOVLstoreidx1) 7381 v.AuxInt = i - 2 7382 v.Aux = s 7383 v.AddArg(p) 7384 v.AddArg(idx) 7385 v.AddArg(w) 7386 v.AddArg(mem) 7387 return true 7388 } 7389 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7390 // cond: x.Uses == 1 && clobber(x) 7391 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7392 for { 7393 i := v.AuxInt 7394 s := v.Aux 7395 p := v.Args[0] 7396 idx := v.Args[1] 7397 v_2 := v.Args[2] 7398 if v_2.Op != Op386SHRLconst { 7399 break 7400 } 7401 if v_2.AuxInt != 16 { 7402 break 7403 } 7404 w := v_2.Args[0] 7405 x := v.Args[3] 7406 if x.Op != Op386MOVWstoreidx1 { 7407 break 7408 } 7409 if x.AuxInt != i-2 { 7410 break 7411 } 7412 if x.Aux != s { 7413 break 7414 } 7415 if idx != x.Args[0] { 7416 break 7417 } 7418 if p != x.Args[1] { 7419 break 7420 } 7421 if w != x.Args[2] { 7422 break 7423 } 7424 mem := x.Args[3] 7425 if !(x.Uses == 1 && clobber(x)) { 7426 break 7427 } 7428 v.reset(Op386MOVLstoreidx1) 7429 v.AuxInt = i - 2 7430 v.Aux = s 7431 v.AddArg(p) 7432 v.AddArg(idx) 7433 v.AddArg(w) 7434 v.AddArg(mem) 7435 return true 7436 } 7437 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7438 // cond: x.Uses == 1 && clobber(x) 7439 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7440 for { 7441 i := v.AuxInt 7442 s := v.Aux 7443 idx := v.Args[0] 7444 p := v.Args[1] 7445 v_2 := v.Args[2] 7446 if v_2.Op != Op386SHRLconst { 7447 break 7448 } 7449 if v_2.AuxInt != 16 { 7450 break 7451 } 7452 w := v_2.Args[0] 7453 x := v.Args[3] 7454 if x.Op != Op386MOVWstoreidx1 { 7455 break 7456 } 7457 if x.AuxInt != i-2 { 7458 break 7459 } 7460 if x.Aux != s { 7461 break 7462 } 7463 if p != x.Args[0] { 7464 break 7465 } 7466 if idx != x.Args[1] { 7467 break 7468 } 7469 if w != x.Args[2] { 7470 break 7471 } 7472 mem := x.Args[3] 7473 if !(x.Uses == 1 && clobber(x)) { 7474 break 7475 } 7476 v.reset(Op386MOVLstoreidx1) 7477 v.AuxInt = i - 2 7478 v.Aux = s 7479 v.AddArg(p) 7480 v.AddArg(idx) 7481 v.AddArg(w) 7482 v.AddArg(mem) 7483 return true 7484 } 7485 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7486 // cond: x.Uses == 1 && clobber(x) 7487 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7488 for { 7489 i := v.AuxInt 7490 s := v.Aux 7491 idx := v.Args[0] 7492 p := v.Args[1] 7493 v_2 := v.Args[2] 7494 if v_2.Op != Op386SHRLconst { 7495 break 7496 } 7497 if v_2.AuxInt != 16 { 7498 break 7499 } 7500 w := v_2.Args[0] 7501 x := v.Args[3] 7502 if x.Op != Op386MOVWstoreidx1 { 7503 break 7504 } 7505 if x.AuxInt != i-2 { 7506 break 7507 } 7508 if x.Aux != s { 7509 break 7510 } 7511 if idx != x.Args[0] { 7512 break 7513 } 7514 if p != x.Args[1] { 7515 break 7516 } 7517 if w != x.Args[2] { 7518 break 7519 } 7520 mem := x.Args[3] 7521 if !(x.Uses == 1 && clobber(x)) { 7522 break 7523 } 7524 v.reset(Op386MOVLstoreidx1) 7525 v.AuxInt = i - 2 7526 v.Aux = s 7527 v.AddArg(p) 7528 v.AddArg(idx) 7529 v.AddArg(w) 7530 v.AddArg(mem) 7531 return true 7532 } 7533 return false 7534 } 7535 func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { 7536 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7537 // cond: x.Uses == 1 && clobber(x) 7538 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7539 for { 7540 i := v.AuxInt 7541 s := v.Aux 7542 p := v.Args[0] 7543 idx := v.Args[1] 7544 v_2 := v.Args[2] 7545 if v_2.Op != Op386SHRLconst { 7546 break 7547 } 7548 j := v_2.AuxInt 7549 w := v_2.Args[0] 7550 x := v.Args[3] 7551 if x.Op != Op386MOVWstoreidx1 { 7552 break 7553 } 7554 if x.AuxInt != i-2 { 7555 break 7556 } 7557 if x.Aux != s { 7558 break 7559 } 7560 if p != x.Args[0] { 7561 break 7562 } 7563 if idx != x.Args[1] { 7564 break 7565 } 7566 w0 := x.Args[2] 7567 if w0.Op != Op386SHRLconst { 7568 break 7569 } 7570 if w0.AuxInt != j-16 { 7571 break 7572 } 7573 if w != w0.Args[0] { 7574 break 7575 } 7576 mem := x.Args[3] 7577 if !(x.Uses == 1 && clobber(x)) { 7578 break 7579 } 7580 v.reset(Op386MOVLstoreidx1) 7581 v.AuxInt = i - 2 7582 v.Aux = s 7583 v.AddArg(p) 7584 v.AddArg(idx) 7585 v.AddArg(w0) 7586 v.AddArg(mem) 7587 return true 7588 } 7589 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 7590 // cond: x.Uses == 1 && clobber(x) 7591 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7592 for { 7593 i := v.AuxInt 7594 s := v.Aux 7595 p := v.Args[0] 7596 idx := v.Args[1] 7597 v_2 := v.Args[2] 7598 if v_2.Op != Op386SHRLconst { 7599 break 7600 } 7601 j := v_2.AuxInt 7602 w := v_2.Args[0] 7603 x := v.Args[3] 7604 if x.Op != Op386MOVWstoreidx1 { 7605 break 7606 } 7607 if x.AuxInt != i-2 { 7608 break 7609 } 7610 if x.Aux != s { 7611 break 7612 } 7613 if idx != x.Args[0] { 7614 break 7615 } 7616 if p != x.Args[1] { 7617 break 7618 } 7619 w0 := x.Args[2] 7620 if w0.Op != Op386SHRLconst { 7621 break 7622 } 7623 if w0.AuxInt != j-16 { 7624 break 7625 } 7626 if w != w0.Args[0] { 7627 break 7628 } 7629 mem := x.Args[3] 7630 if !(x.Uses == 1 && clobber(x)) { 7631 break 7632 } 7633 v.reset(Op386MOVLstoreidx1) 7634 v.AuxInt = i - 2 7635 v.Aux = s 7636 v.AddArg(p) 7637 v.AddArg(idx) 7638 v.AddArg(w0) 7639 v.AddArg(mem) 7640 return true 7641 } 7642 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7643 // cond: x.Uses == 1 && clobber(x) 7644 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7645 for { 7646 i := v.AuxInt 7647 s := v.Aux 7648 idx := v.Args[0] 7649 p := v.Args[1] 7650 v_2 := v.Args[2] 7651 if v_2.Op != Op386SHRLconst { 7652 break 7653 } 7654 j := v_2.AuxInt 7655 w := v_2.Args[0] 7656 x := v.Args[3] 7657 if x.Op != Op386MOVWstoreidx1 { 7658 break 7659 } 7660 if x.AuxInt != i-2 { 7661 break 7662 } 7663 if x.Aux != s { 7664 break 7665 } 7666 if p != x.Args[0] { 7667 break 7668 } 7669 if idx != x.Args[1] { 7670 break 7671 } 7672 w0 := x.Args[2] 7673 if w0.Op != Op386SHRLconst { 7674 break 7675 } 7676 if w0.AuxInt != j-16 { 7677 break 7678 } 7679 if w != w0.Args[0] { 7680 break 7681 } 7682 mem := x.Args[3] 7683 if !(x.Uses == 1 && clobber(x)) { 7684 break 7685 } 7686 v.reset(Op386MOVLstoreidx1) 7687 v.AuxInt = i - 2 7688 v.Aux = s 7689 v.AddArg(p) 7690 v.AddArg(idx) 7691 v.AddArg(w0) 7692 v.AddArg(mem) 7693 return true 7694 } 7695 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 7696 // cond: x.Uses == 1 && clobber(x) 7697 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7698 for { 7699 i := v.AuxInt 7700 s := v.Aux 7701 idx := v.Args[0] 7702 p := v.Args[1] 7703 v_2 := v.Args[2] 7704 if v_2.Op != Op386SHRLconst { 7705 break 7706 } 7707 j := v_2.AuxInt 7708 w := v_2.Args[0] 7709 x := v.Args[3] 7710 if x.Op != Op386MOVWstoreidx1 { 7711 break 7712 } 7713 if x.AuxInt != i-2 { 7714 break 7715 } 7716 if x.Aux != s { 7717 break 7718 } 7719 if idx != x.Args[0] { 7720 break 7721 } 7722 if p != x.Args[1] { 7723 break 7724 } 7725 w0 := x.Args[2] 7726 if w0.Op != Op386SHRLconst { 7727 break 7728 } 7729 if w0.AuxInt != j-16 { 7730 break 7731 } 7732 if w != w0.Args[0] { 7733 break 7734 } 7735 mem := x.Args[3] 7736 if !(x.Uses == 1 && clobber(x)) { 7737 break 7738 } 7739 v.reset(Op386MOVLstoreidx1) 7740 v.AuxInt = i - 2 7741 v.Aux = s 7742 v.AddArg(p) 7743 v.AddArg(idx) 7744 v.AddArg(w0) 7745 v.AddArg(mem) 7746 return true 7747 } 7748 return false 7749 } 7750 func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { 7751 b := v.Block 7752 _ = b 7753 // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) 7754 // cond: 7755 // result: (MOVWstoreidx2 [c+d] {sym} ptr idx val mem) 7756 for { 7757 c := v.AuxInt 7758 sym := v.Aux 7759 v_0 := v.Args[0] 7760 if v_0.Op != Op386ADDLconst { 7761 break 7762 } 7763 d := v_0.AuxInt 7764 ptr := v_0.Args[0] 7765 idx := v.Args[1] 7766 val := v.Args[2] 7767 mem := v.Args[3] 7768 v.reset(Op386MOVWstoreidx2) 7769 v.AuxInt = c + d 7770 v.Aux = sym 7771 v.AddArg(ptr) 7772 v.AddArg(idx) 7773 v.AddArg(val) 7774 v.AddArg(mem) 7775 return true 7776 } 7777 // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) 7778 // cond: 7779 // result: (MOVWstoreidx2 [c+2*d] {sym} ptr idx val mem) 7780 for { 7781 c := v.AuxInt 7782 sym := v.Aux 7783 ptr := v.Args[0] 7784 v_1 := v.Args[1] 7785 if v_1.Op != Op386ADDLconst { 7786 break 7787 } 7788 d := v_1.AuxInt 7789 idx := v_1.Args[0] 7790 val := v.Args[2] 7791 mem := v.Args[3] 7792 v.reset(Op386MOVWstoreidx2) 7793 v.AuxInt = c + 2*d 7794 v.Aux = sym 7795 v.AddArg(ptr) 7796 v.AddArg(idx) 7797 v.AddArg(val) 7798 v.AddArg(mem) 7799 return true 7800 } 7801 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) 7802 // cond: x.Uses == 1 && clobber(x) 7803 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w mem) 7804 for { 7805 i := v.AuxInt 7806 s := v.Aux 7807 p := v.Args[0] 7808 idx := v.Args[1] 7809 v_2 := v.Args[2] 7810 if v_2.Op != Op386SHRLconst { 7811 break 7812 } 7813 if v_2.AuxInt != 16 { 7814 break 7815 } 7816 w := v_2.Args[0] 7817 x := v.Args[3] 7818 if x.Op != Op386MOVWstoreidx2 { 7819 break 7820 } 7821 if x.AuxInt != i-2 { 7822 break 7823 } 7824 if x.Aux != s { 7825 break 7826 } 7827 if p != x.Args[0] { 7828 break 7829 } 7830 if idx != x.Args[1] { 7831 break 7832 } 7833 if w != x.Args[2] { 7834 break 7835 } 7836 mem := x.Args[3] 7837 if !(x.Uses == 1 && clobber(x)) { 7838 break 7839 } 7840 v.reset(Op386MOVLstoreidx1) 7841 v.AuxInt = i - 2 7842 v.Aux = s 7843 v.AddArg(p) 7844 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 7845 v0.AuxInt = 1 7846 v0.AddArg(idx) 7847 v.AddArg(v0) 7848 v.AddArg(w) 7849 v.AddArg(mem) 7850 return true 7851 } 7852 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7853 // cond: x.Uses == 1 && clobber(x) 7854 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w0 mem) 7855 for { 7856 i := v.AuxInt 7857 s := v.Aux 7858 p := v.Args[0] 7859 idx := v.Args[1] 7860 v_2 := v.Args[2] 7861 if v_2.Op != Op386SHRLconst { 7862 break 7863 } 7864 j := v_2.AuxInt 7865 w := v_2.Args[0] 7866 x := v.Args[3] 7867 if x.Op != Op386MOVWstoreidx2 { 7868 break 7869 } 7870 if x.AuxInt != i-2 { 7871 break 7872 } 7873 if x.Aux != s { 7874 break 7875 } 7876 if p != x.Args[0] { 7877 break 7878 } 7879 if idx != x.Args[1] { 7880 break 7881 } 7882 w0 := x.Args[2] 7883 if w0.Op != Op386SHRLconst { 7884 break 7885 } 7886 if w0.AuxInt != j-16 { 7887 break 7888 } 7889 if w != w0.Args[0] { 7890 break 7891 } 7892 mem := x.Args[3] 7893 if !(x.Uses == 1 && clobber(x)) { 7894 break 7895 } 7896 v.reset(Op386MOVLstoreidx1) 7897 v.AuxInt = i - 2 7898 v.Aux = s 7899 v.AddArg(p) 7900 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 7901 v0.AuxInt = 1 7902 v0.AddArg(idx) 7903 v.AddArg(v0) 7904 v.AddArg(w0) 7905 v.AddArg(mem) 7906 return true 7907 } 7908 return false 7909 } 7910 func rewriteValue386_Op386MULL_0(v *Value) bool { 7911 // match: (MULL x (MOVLconst [c])) 7912 // cond: 7913 // result: (MULLconst [c] x) 7914 for { 7915 x := v.Args[0] 7916 v_1 := v.Args[1] 7917 if v_1.Op != Op386MOVLconst { 7918 break 7919 } 7920 c := v_1.AuxInt 7921 v.reset(Op386MULLconst) 7922 v.AuxInt = c 7923 v.AddArg(x) 7924 return true 7925 } 7926 // match: (MULL (MOVLconst [c]) x) 7927 // cond: 7928 // result: (MULLconst [c] x) 7929 for { 7930 v_0 := v.Args[0] 7931 if v_0.Op != Op386MOVLconst { 7932 break 7933 } 7934 c := v_0.AuxInt 7935 x := v.Args[1] 7936 v.reset(Op386MULLconst) 7937 v.AuxInt = c 7938 v.AddArg(x) 7939 return true 7940 } 7941 return false 7942 } 7943 func rewriteValue386_Op386MULLconst_0(v *Value) bool { 7944 b := v.Block 7945 _ = b 7946 // match: (MULLconst [c] (MULLconst [d] x)) 7947 // cond: 7948 // result: (MULLconst [int64(int32(c * d))] x) 7949 for { 7950 c := v.AuxInt 7951 v_0 := v.Args[0] 7952 if v_0.Op != Op386MULLconst { 7953 break 7954 } 7955 d := v_0.AuxInt 7956 x := v_0.Args[0] 7957 v.reset(Op386MULLconst) 7958 v.AuxInt = int64(int32(c * d)) 7959 v.AddArg(x) 7960 return true 7961 } 7962 // match: (MULLconst [-1] x) 7963 // cond: 7964 // result: (NEGL x) 7965 for { 7966 if v.AuxInt != -1 { 7967 break 7968 } 7969 x := v.Args[0] 7970 v.reset(Op386NEGL) 7971 v.AddArg(x) 7972 return true 7973 } 7974 // match: (MULLconst [0] _) 7975 // cond: 7976 // result: (MOVLconst [0]) 7977 for { 7978 if v.AuxInt != 0 { 7979 break 7980 } 7981 v.reset(Op386MOVLconst) 7982 v.AuxInt = 0 7983 return true 7984 } 7985 // match: (MULLconst [1] x) 7986 // cond: 7987 // result: x 7988 for { 7989 if v.AuxInt != 1 { 7990 break 7991 } 7992 x := v.Args[0] 7993 v.reset(OpCopy) 7994 v.Type = x.Type 7995 v.AddArg(x) 7996 return true 7997 } 7998 // match: (MULLconst [3] x) 7999 // cond: 8000 // result: (LEAL2 x x) 8001 for { 8002 if v.AuxInt != 3 { 8003 break 8004 } 8005 x := v.Args[0] 8006 v.reset(Op386LEAL2) 8007 v.AddArg(x) 8008 v.AddArg(x) 8009 return true 8010 } 8011 // match: (MULLconst [5] x) 8012 // cond: 8013 // result: (LEAL4 x x) 8014 for { 8015 if v.AuxInt != 5 { 8016 break 8017 } 8018 x := v.Args[0] 8019 v.reset(Op386LEAL4) 8020 v.AddArg(x) 8021 v.AddArg(x) 8022 return true 8023 } 8024 // match: (MULLconst [7] x) 8025 // cond: 8026 // result: (LEAL8 (NEGL <v.Type> x) x) 8027 for { 8028 if v.AuxInt != 7 { 8029 break 8030 } 8031 x := v.Args[0] 8032 v.reset(Op386LEAL8) 8033 v0 := b.NewValue0(v.Pos, Op386NEGL, v.Type) 8034 v0.AddArg(x) 8035 v.AddArg(v0) 8036 v.AddArg(x) 8037 return true 8038 } 8039 // match: (MULLconst [9] x) 8040 // cond: 8041 // result: (LEAL8 x x) 8042 for { 8043 if v.AuxInt != 9 { 8044 break 8045 } 8046 x := v.Args[0] 8047 v.reset(Op386LEAL8) 8048 v.AddArg(x) 8049 v.AddArg(x) 8050 return true 8051 } 8052 // match: (MULLconst [11] x) 8053 // cond: 8054 // result: (LEAL2 x (LEAL4 <v.Type> x x)) 8055 for { 8056 if v.AuxInt != 11 { 8057 break 8058 } 8059 x := v.Args[0] 8060 v.reset(Op386LEAL2) 8061 v.AddArg(x) 8062 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8063 v0.AddArg(x) 8064 v0.AddArg(x) 8065 v.AddArg(v0) 8066 return true 8067 } 8068 // match: (MULLconst [13] x) 8069 // cond: 8070 // result: (LEAL4 x (LEAL2 <v.Type> x x)) 8071 for { 8072 if v.AuxInt != 13 { 8073 break 8074 } 8075 x := v.Args[0] 8076 v.reset(Op386LEAL4) 8077 v.AddArg(x) 8078 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8079 v0.AddArg(x) 8080 v0.AddArg(x) 8081 v.AddArg(v0) 8082 return true 8083 } 8084 return false 8085 } 8086 func rewriteValue386_Op386MULLconst_10(v *Value) bool { 8087 b := v.Block 8088 _ = b 8089 // match: (MULLconst [21] x) 8090 // cond: 8091 // result: (LEAL4 x (LEAL4 <v.Type> x x)) 8092 for { 8093 if v.AuxInt != 21 { 8094 break 8095 } 8096 x := v.Args[0] 8097 v.reset(Op386LEAL4) 8098 v.AddArg(x) 8099 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8100 v0.AddArg(x) 8101 v0.AddArg(x) 8102 v.AddArg(v0) 8103 return true 8104 } 8105 // match: (MULLconst [25] x) 8106 // cond: 8107 // result: (LEAL8 x (LEAL2 <v.Type> x x)) 8108 for { 8109 if v.AuxInt != 25 { 8110 break 8111 } 8112 x := v.Args[0] 8113 v.reset(Op386LEAL8) 8114 v.AddArg(x) 8115 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8116 v0.AddArg(x) 8117 v0.AddArg(x) 8118 v.AddArg(v0) 8119 return true 8120 } 8121 // match: (MULLconst [37] x) 8122 // cond: 8123 // result: (LEAL4 x (LEAL8 <v.Type> x x)) 8124 for { 8125 if v.AuxInt != 37 { 8126 break 8127 } 8128 x := v.Args[0] 8129 v.reset(Op386LEAL4) 8130 v.AddArg(x) 8131 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8132 v0.AddArg(x) 8133 v0.AddArg(x) 8134 v.AddArg(v0) 8135 return true 8136 } 8137 // match: (MULLconst [41] x) 8138 // cond: 8139 // result: (LEAL8 x (LEAL4 <v.Type> x x)) 8140 for { 8141 if v.AuxInt != 41 { 8142 break 8143 } 8144 x := v.Args[0] 8145 v.reset(Op386LEAL8) 8146 v.AddArg(x) 8147 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8148 v0.AddArg(x) 8149 v0.AddArg(x) 8150 v.AddArg(v0) 8151 return true 8152 } 8153 // match: (MULLconst [73] x) 8154 // cond: 8155 // result: (LEAL8 x (LEAL8 <v.Type> x x)) 8156 for { 8157 if v.AuxInt != 73 { 8158 break 8159 } 8160 x := v.Args[0] 8161 v.reset(Op386LEAL8) 8162 v.AddArg(x) 8163 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8164 v0.AddArg(x) 8165 v0.AddArg(x) 8166 v.AddArg(v0) 8167 return true 8168 } 8169 // match: (MULLconst [c] x) 8170 // cond: isPowerOfTwo(c) 8171 // result: (SHLLconst [log2(c)] x) 8172 for { 8173 c := v.AuxInt 8174 x := v.Args[0] 8175 if !(isPowerOfTwo(c)) { 8176 break 8177 } 8178 v.reset(Op386SHLLconst) 8179 v.AuxInt = log2(c) 8180 v.AddArg(x) 8181 return true 8182 } 8183 // match: (MULLconst [c] x) 8184 // cond: isPowerOfTwo(c+1) && c >= 15 8185 // result: (SUBL (SHLLconst <v.Type> [log2(c+1)] x) x) 8186 for { 8187 c := v.AuxInt 8188 x := v.Args[0] 8189 if !(isPowerOfTwo(c+1) && c >= 15) { 8190 break 8191 } 8192 v.reset(Op386SUBL) 8193 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8194 v0.AuxInt = log2(c + 1) 8195 v0.AddArg(x) 8196 v.AddArg(v0) 8197 v.AddArg(x) 8198 return true 8199 } 8200 // match: (MULLconst [c] x) 8201 // cond: isPowerOfTwo(c-1) && c >= 17 8202 // result: (LEAL1 (SHLLconst <v.Type> [log2(c-1)] x) x) 8203 for { 8204 c := v.AuxInt 8205 x := v.Args[0] 8206 if !(isPowerOfTwo(c-1) && c >= 17) { 8207 break 8208 } 8209 v.reset(Op386LEAL1) 8210 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8211 v0.AuxInt = log2(c - 1) 8212 v0.AddArg(x) 8213 v.AddArg(v0) 8214 v.AddArg(x) 8215 return true 8216 } 8217 // match: (MULLconst [c] x) 8218 // cond: isPowerOfTwo(c-2) && c >= 34 8219 // result: (LEAL2 (SHLLconst <v.Type> [log2(c-2)] x) x) 8220 for { 8221 c := v.AuxInt 8222 x := v.Args[0] 8223 if !(isPowerOfTwo(c-2) && c >= 34) { 8224 break 8225 } 8226 v.reset(Op386LEAL2) 8227 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8228 v0.AuxInt = log2(c - 2) 8229 v0.AddArg(x) 8230 v.AddArg(v0) 8231 v.AddArg(x) 8232 return true 8233 } 8234 // match: (MULLconst [c] x) 8235 // cond: isPowerOfTwo(c-4) && c >= 68 8236 // result: (LEAL4 (SHLLconst <v.Type> [log2(c-4)] x) x) 8237 for { 8238 c := v.AuxInt 8239 x := v.Args[0] 8240 if !(isPowerOfTwo(c-4) && c >= 68) { 8241 break 8242 } 8243 v.reset(Op386LEAL4) 8244 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8245 v0.AuxInt = log2(c - 4) 8246 v0.AddArg(x) 8247 v.AddArg(v0) 8248 v.AddArg(x) 8249 return true 8250 } 8251 return false 8252 } 8253 func rewriteValue386_Op386MULLconst_20(v *Value) bool { 8254 b := v.Block 8255 _ = b 8256 // match: (MULLconst [c] x) 8257 // cond: isPowerOfTwo(c-8) && c >= 136 8258 // result: (LEAL8 (SHLLconst <v.Type> [log2(c-8)] x) x) 8259 for { 8260 c := v.AuxInt 8261 x := v.Args[0] 8262 if !(isPowerOfTwo(c-8) && c >= 136) { 8263 break 8264 } 8265 v.reset(Op386LEAL8) 8266 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8267 v0.AuxInt = log2(c - 8) 8268 v0.AddArg(x) 8269 v.AddArg(v0) 8270 v.AddArg(x) 8271 return true 8272 } 8273 // match: (MULLconst [c] x) 8274 // cond: c%3 == 0 && isPowerOfTwo(c/3) 8275 // result: (SHLLconst [log2(c/3)] (LEAL2 <v.Type> x x)) 8276 for { 8277 c := v.AuxInt 8278 x := v.Args[0] 8279 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 8280 break 8281 } 8282 v.reset(Op386SHLLconst) 8283 v.AuxInt = log2(c / 3) 8284 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8285 v0.AddArg(x) 8286 v0.AddArg(x) 8287 v.AddArg(v0) 8288 return true 8289 } 8290 // match: (MULLconst [c] x) 8291 // cond: c%5 == 0 && isPowerOfTwo(c/5) 8292 // result: (SHLLconst [log2(c/5)] (LEAL4 <v.Type> x x)) 8293 for { 8294 c := v.AuxInt 8295 x := v.Args[0] 8296 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 8297 break 8298 } 8299 v.reset(Op386SHLLconst) 8300 v.AuxInt = log2(c / 5) 8301 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8302 v0.AddArg(x) 8303 v0.AddArg(x) 8304 v.AddArg(v0) 8305 return true 8306 } 8307 // match: (MULLconst [c] x) 8308 // cond: c%9 == 0 && isPowerOfTwo(c/9) 8309 // result: (SHLLconst [log2(c/9)] (LEAL8 <v.Type> x x)) 8310 for { 8311 c := v.AuxInt 8312 x := v.Args[0] 8313 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 8314 break 8315 } 8316 v.reset(Op386SHLLconst) 8317 v.AuxInt = log2(c / 9) 8318 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8319 v0.AddArg(x) 8320 v0.AddArg(x) 8321 v.AddArg(v0) 8322 return true 8323 } 8324 // match: (MULLconst [c] (MOVLconst [d])) 8325 // cond: 8326 // result: (MOVLconst [int64(int32(c*d))]) 8327 for { 8328 c := v.AuxInt 8329 v_0 := v.Args[0] 8330 if v_0.Op != Op386MOVLconst { 8331 break 8332 } 8333 d := v_0.AuxInt 8334 v.reset(Op386MOVLconst) 8335 v.AuxInt = int64(int32(c * d)) 8336 return true 8337 } 8338 return false 8339 } 8340 func rewriteValue386_Op386NEGL_0(v *Value) bool { 8341 // match: (NEGL (MOVLconst [c])) 8342 // cond: 8343 // result: (MOVLconst [int64(int32(-c))]) 8344 for { 8345 v_0 := v.Args[0] 8346 if v_0.Op != Op386MOVLconst { 8347 break 8348 } 8349 c := v_0.AuxInt 8350 v.reset(Op386MOVLconst) 8351 v.AuxInt = int64(int32(-c)) 8352 return true 8353 } 8354 return false 8355 } 8356 func rewriteValue386_Op386NOTL_0(v *Value) bool { 8357 // match: (NOTL (MOVLconst [c])) 8358 // cond: 8359 // result: (MOVLconst [^c]) 8360 for { 8361 v_0 := v.Args[0] 8362 if v_0.Op != Op386MOVLconst { 8363 break 8364 } 8365 c := v_0.AuxInt 8366 v.reset(Op386MOVLconst) 8367 v.AuxInt = ^c 8368 return true 8369 } 8370 return false 8371 } 8372 func rewriteValue386_Op386ORL_0(v *Value) bool { 8373 b := v.Block 8374 _ = b 8375 types := &b.Func.Config.Types 8376 _ = types 8377 // match: (ORL x (MOVLconst [c])) 8378 // cond: 8379 // result: (ORLconst [c] x) 8380 for { 8381 x := v.Args[0] 8382 v_1 := v.Args[1] 8383 if v_1.Op != Op386MOVLconst { 8384 break 8385 } 8386 c := v_1.AuxInt 8387 v.reset(Op386ORLconst) 8388 v.AuxInt = c 8389 v.AddArg(x) 8390 return true 8391 } 8392 // match: (ORL (MOVLconst [c]) x) 8393 // cond: 8394 // result: (ORLconst [c] x) 8395 for { 8396 v_0 := v.Args[0] 8397 if v_0.Op != Op386MOVLconst { 8398 break 8399 } 8400 c := v_0.AuxInt 8401 x := v.Args[1] 8402 v.reset(Op386ORLconst) 8403 v.AuxInt = c 8404 v.AddArg(x) 8405 return true 8406 } 8407 // match: (ORL (SHLLconst [c] x) (SHRLconst [d] x)) 8408 // cond: d == 32-c 8409 // result: (ROLLconst [c] x) 8410 for { 8411 v_0 := v.Args[0] 8412 if v_0.Op != Op386SHLLconst { 8413 break 8414 } 8415 c := v_0.AuxInt 8416 x := v_0.Args[0] 8417 v_1 := v.Args[1] 8418 if v_1.Op != Op386SHRLconst { 8419 break 8420 } 8421 d := v_1.AuxInt 8422 if x != v_1.Args[0] { 8423 break 8424 } 8425 if !(d == 32-c) { 8426 break 8427 } 8428 v.reset(Op386ROLLconst) 8429 v.AuxInt = c 8430 v.AddArg(x) 8431 return true 8432 } 8433 // match: (ORL (SHRLconst [d] x) (SHLLconst [c] x)) 8434 // cond: d == 32-c 8435 // result: (ROLLconst [c] x) 8436 for { 8437 v_0 := v.Args[0] 8438 if v_0.Op != Op386SHRLconst { 8439 break 8440 } 8441 d := v_0.AuxInt 8442 x := v_0.Args[0] 8443 v_1 := v.Args[1] 8444 if v_1.Op != Op386SHLLconst { 8445 break 8446 } 8447 c := v_1.AuxInt 8448 if x != v_1.Args[0] { 8449 break 8450 } 8451 if !(d == 32-c) { 8452 break 8453 } 8454 v.reset(Op386ROLLconst) 8455 v.AuxInt = c 8456 v.AddArg(x) 8457 return true 8458 } 8459 // match: (ORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 8460 // cond: c < 16 && d == 16-c && t.Size() == 2 8461 // result: (ROLWconst x [c]) 8462 for { 8463 t := v.Type 8464 v_0 := v.Args[0] 8465 if v_0.Op != Op386SHLLconst { 8466 break 8467 } 8468 c := v_0.AuxInt 8469 x := v_0.Args[0] 8470 v_1 := v.Args[1] 8471 if v_1.Op != Op386SHRWconst { 8472 break 8473 } 8474 d := v_1.AuxInt 8475 if x != v_1.Args[0] { 8476 break 8477 } 8478 if !(c < 16 && d == 16-c && t.Size() == 2) { 8479 break 8480 } 8481 v.reset(Op386ROLWconst) 8482 v.AuxInt = c 8483 v.AddArg(x) 8484 return true 8485 } 8486 // match: (ORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 8487 // cond: c < 16 && d == 16-c && t.Size() == 2 8488 // result: (ROLWconst x [c]) 8489 for { 8490 t := v.Type 8491 v_0 := v.Args[0] 8492 if v_0.Op != Op386SHRWconst { 8493 break 8494 } 8495 d := v_0.AuxInt 8496 x := v_0.Args[0] 8497 v_1 := v.Args[1] 8498 if v_1.Op != Op386SHLLconst { 8499 break 8500 } 8501 c := v_1.AuxInt 8502 if x != v_1.Args[0] { 8503 break 8504 } 8505 if !(c < 16 && d == 16-c && t.Size() == 2) { 8506 break 8507 } 8508 v.reset(Op386ROLWconst) 8509 v.AuxInt = c 8510 v.AddArg(x) 8511 return true 8512 } 8513 // match: (ORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 8514 // cond: c < 8 && d == 8-c && t.Size() == 1 8515 // result: (ROLBconst x [c]) 8516 for { 8517 t := v.Type 8518 v_0 := v.Args[0] 8519 if v_0.Op != Op386SHLLconst { 8520 break 8521 } 8522 c := v_0.AuxInt 8523 x := v_0.Args[0] 8524 v_1 := v.Args[1] 8525 if v_1.Op != Op386SHRBconst { 8526 break 8527 } 8528 d := v_1.AuxInt 8529 if x != v_1.Args[0] { 8530 break 8531 } 8532 if !(c < 8 && d == 8-c && t.Size() == 1) { 8533 break 8534 } 8535 v.reset(Op386ROLBconst) 8536 v.AuxInt = c 8537 v.AddArg(x) 8538 return true 8539 } 8540 // match: (ORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 8541 // cond: c < 8 && d == 8-c && t.Size() == 1 8542 // result: (ROLBconst x [c]) 8543 for { 8544 t := v.Type 8545 v_0 := v.Args[0] 8546 if v_0.Op != Op386SHRBconst { 8547 break 8548 } 8549 d := v_0.AuxInt 8550 x := v_0.Args[0] 8551 v_1 := v.Args[1] 8552 if v_1.Op != Op386SHLLconst { 8553 break 8554 } 8555 c := v_1.AuxInt 8556 if x != v_1.Args[0] { 8557 break 8558 } 8559 if !(c < 8 && d == 8-c && t.Size() == 1) { 8560 break 8561 } 8562 v.reset(Op386ROLBconst) 8563 v.AuxInt = c 8564 v.AddArg(x) 8565 return true 8566 } 8567 // match: (ORL x x) 8568 // cond: 8569 // result: x 8570 for { 8571 x := v.Args[0] 8572 if x != v.Args[1] { 8573 break 8574 } 8575 v.reset(OpCopy) 8576 v.Type = x.Type 8577 v.AddArg(x) 8578 return true 8579 } 8580 // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) 8581 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8582 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 8583 for { 8584 x0 := v.Args[0] 8585 if x0.Op != Op386MOVBload { 8586 break 8587 } 8588 i0 := x0.AuxInt 8589 s := x0.Aux 8590 p := x0.Args[0] 8591 mem := x0.Args[1] 8592 s0 := v.Args[1] 8593 if s0.Op != Op386SHLLconst { 8594 break 8595 } 8596 if s0.AuxInt != 8 { 8597 break 8598 } 8599 x1 := s0.Args[0] 8600 if x1.Op != Op386MOVBload { 8601 break 8602 } 8603 i1 := x1.AuxInt 8604 if x1.Aux != s { 8605 break 8606 } 8607 if p != x1.Args[0] { 8608 break 8609 } 8610 if mem != x1.Args[1] { 8611 break 8612 } 8613 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 8614 break 8615 } 8616 b = mergePoint(b, x0, x1) 8617 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 8618 v.reset(OpCopy) 8619 v.AddArg(v0) 8620 v0.AuxInt = i0 8621 v0.Aux = s 8622 v0.AddArg(p) 8623 v0.AddArg(mem) 8624 return true 8625 } 8626 return false 8627 } 8628 func rewriteValue386_Op386ORL_10(v *Value) bool { 8629 b := v.Block 8630 _ = b 8631 types := &b.Func.Config.Types 8632 _ = types 8633 // match: (ORL s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) 8634 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8635 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 8636 for { 8637 s0 := v.Args[0] 8638 if s0.Op != Op386SHLLconst { 8639 break 8640 } 8641 if s0.AuxInt != 8 { 8642 break 8643 } 8644 x1 := s0.Args[0] 8645 if x1.Op != Op386MOVBload { 8646 break 8647 } 8648 i1 := x1.AuxInt 8649 s := x1.Aux 8650 p := x1.Args[0] 8651 mem := x1.Args[1] 8652 x0 := v.Args[1] 8653 if x0.Op != Op386MOVBload { 8654 break 8655 } 8656 i0 := x0.AuxInt 8657 if x0.Aux != s { 8658 break 8659 } 8660 if p != x0.Args[0] { 8661 break 8662 } 8663 if mem != x0.Args[1] { 8664 break 8665 } 8666 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 8667 break 8668 } 8669 b = mergePoint(b, x0, x1) 8670 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 8671 v.reset(OpCopy) 8672 v.AddArg(v0) 8673 v0.AuxInt = i0 8674 v0.Aux = s 8675 v0.AddArg(p) 8676 v0.AddArg(mem) 8677 return true 8678 } 8679 // match: (ORL o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem))) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) 8680 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8681 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8682 for { 8683 o0 := v.Args[0] 8684 if o0.Op != Op386ORL { 8685 break 8686 } 8687 x0 := o0.Args[0] 8688 if x0.Op != Op386MOVWload { 8689 break 8690 } 8691 i0 := x0.AuxInt 8692 s := x0.Aux 8693 p := x0.Args[0] 8694 mem := x0.Args[1] 8695 s0 := o0.Args[1] 8696 if s0.Op != Op386SHLLconst { 8697 break 8698 } 8699 if s0.AuxInt != 16 { 8700 break 8701 } 8702 x1 := s0.Args[0] 8703 if x1.Op != Op386MOVBload { 8704 break 8705 } 8706 i2 := x1.AuxInt 8707 if x1.Aux != s { 8708 break 8709 } 8710 if p != x1.Args[0] { 8711 break 8712 } 8713 if mem != x1.Args[1] { 8714 break 8715 } 8716 s1 := v.Args[1] 8717 if s1.Op != Op386SHLLconst { 8718 break 8719 } 8720 if s1.AuxInt != 24 { 8721 break 8722 } 8723 x2 := s1.Args[0] 8724 if x2.Op != Op386MOVBload { 8725 break 8726 } 8727 i3 := x2.AuxInt 8728 if x2.Aux != s { 8729 break 8730 } 8731 if p != x2.Args[0] { 8732 break 8733 } 8734 if mem != x2.Args[1] { 8735 break 8736 } 8737 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8738 break 8739 } 8740 b = mergePoint(b, x0, x1, x2) 8741 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8742 v.reset(OpCopy) 8743 v.AddArg(v0) 8744 v0.AuxInt = i0 8745 v0.Aux = s 8746 v0.AddArg(p) 8747 v0.AddArg(mem) 8748 return true 8749 } 8750 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)) x0:(MOVWload [i0] {s} p mem)) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) 8751 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8752 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8753 for { 8754 o0 := v.Args[0] 8755 if o0.Op != Op386ORL { 8756 break 8757 } 8758 s0 := o0.Args[0] 8759 if s0.Op != Op386SHLLconst { 8760 break 8761 } 8762 if s0.AuxInt != 16 { 8763 break 8764 } 8765 x1 := s0.Args[0] 8766 if x1.Op != Op386MOVBload { 8767 break 8768 } 8769 i2 := x1.AuxInt 8770 s := x1.Aux 8771 p := x1.Args[0] 8772 mem := x1.Args[1] 8773 x0 := o0.Args[1] 8774 if x0.Op != Op386MOVWload { 8775 break 8776 } 8777 i0 := x0.AuxInt 8778 if x0.Aux != s { 8779 break 8780 } 8781 if p != x0.Args[0] { 8782 break 8783 } 8784 if mem != x0.Args[1] { 8785 break 8786 } 8787 s1 := v.Args[1] 8788 if s1.Op != Op386SHLLconst { 8789 break 8790 } 8791 if s1.AuxInt != 24 { 8792 break 8793 } 8794 x2 := s1.Args[0] 8795 if x2.Op != Op386MOVBload { 8796 break 8797 } 8798 i3 := x2.AuxInt 8799 if x2.Aux != s { 8800 break 8801 } 8802 if p != x2.Args[0] { 8803 break 8804 } 8805 if mem != x2.Args[1] { 8806 break 8807 } 8808 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8809 break 8810 } 8811 b = mergePoint(b, x0, x1, x2) 8812 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8813 v.reset(OpCopy) 8814 v.AddArg(v0) 8815 v0.AuxInt = i0 8816 v0.Aux = s 8817 v0.AddArg(p) 8818 v0.AddArg(mem) 8819 return true 8820 } 8821 // match: (ORL s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)) o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)))) 8822 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8823 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8824 for { 8825 s1 := v.Args[0] 8826 if s1.Op != Op386SHLLconst { 8827 break 8828 } 8829 if s1.AuxInt != 24 { 8830 break 8831 } 8832 x2 := s1.Args[0] 8833 if x2.Op != Op386MOVBload { 8834 break 8835 } 8836 i3 := x2.AuxInt 8837 s := x2.Aux 8838 p := x2.Args[0] 8839 mem := x2.Args[1] 8840 o0 := v.Args[1] 8841 if o0.Op != Op386ORL { 8842 break 8843 } 8844 x0 := o0.Args[0] 8845 if x0.Op != Op386MOVWload { 8846 break 8847 } 8848 i0 := x0.AuxInt 8849 if x0.Aux != s { 8850 break 8851 } 8852 if p != x0.Args[0] { 8853 break 8854 } 8855 if mem != x0.Args[1] { 8856 break 8857 } 8858 s0 := o0.Args[1] 8859 if s0.Op != Op386SHLLconst { 8860 break 8861 } 8862 if s0.AuxInt != 16 { 8863 break 8864 } 8865 x1 := s0.Args[0] 8866 if x1.Op != Op386MOVBload { 8867 break 8868 } 8869 i2 := x1.AuxInt 8870 if x1.Aux != s { 8871 break 8872 } 8873 if p != x1.Args[0] { 8874 break 8875 } 8876 if mem != x1.Args[1] { 8877 break 8878 } 8879 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8880 break 8881 } 8882 b = mergePoint(b, x0, x1, x2) 8883 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8884 v.reset(OpCopy) 8885 v.AddArg(v0) 8886 v0.AuxInt = i0 8887 v0.Aux = s 8888 v0.AddArg(p) 8889 v0.AddArg(mem) 8890 return true 8891 } 8892 // match: (ORL s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)) x0:(MOVWload [i0] {s} p mem))) 8893 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 8894 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 8895 for { 8896 s1 := v.Args[0] 8897 if s1.Op != Op386SHLLconst { 8898 break 8899 } 8900 if s1.AuxInt != 24 { 8901 break 8902 } 8903 x2 := s1.Args[0] 8904 if x2.Op != Op386MOVBload { 8905 break 8906 } 8907 i3 := x2.AuxInt 8908 s := x2.Aux 8909 p := x2.Args[0] 8910 mem := x2.Args[1] 8911 o0 := v.Args[1] 8912 if o0.Op != Op386ORL { 8913 break 8914 } 8915 s0 := o0.Args[0] 8916 if s0.Op != Op386SHLLconst { 8917 break 8918 } 8919 if s0.AuxInt != 16 { 8920 break 8921 } 8922 x1 := s0.Args[0] 8923 if x1.Op != Op386MOVBload { 8924 break 8925 } 8926 i2 := x1.AuxInt 8927 if x1.Aux != s { 8928 break 8929 } 8930 if p != x1.Args[0] { 8931 break 8932 } 8933 if mem != x1.Args[1] { 8934 break 8935 } 8936 x0 := o0.Args[1] 8937 if x0.Op != Op386MOVWload { 8938 break 8939 } 8940 i0 := x0.AuxInt 8941 if x0.Aux != s { 8942 break 8943 } 8944 if p != x0.Args[0] { 8945 break 8946 } 8947 if mem != x0.Args[1] { 8948 break 8949 } 8950 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 8951 break 8952 } 8953 b = mergePoint(b, x0, x1, x2) 8954 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 8955 v.reset(OpCopy) 8956 v.AddArg(v0) 8957 v0.AuxInt = i0 8958 v0.Aux = s 8959 v0.AddArg(p) 8960 v0.AddArg(mem) 8961 return true 8962 } 8963 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 8964 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8965 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 8966 for { 8967 x0 := v.Args[0] 8968 if x0.Op != Op386MOVBloadidx1 { 8969 break 8970 } 8971 i0 := x0.AuxInt 8972 s := x0.Aux 8973 p := x0.Args[0] 8974 idx := x0.Args[1] 8975 mem := x0.Args[2] 8976 s0 := v.Args[1] 8977 if s0.Op != Op386SHLLconst { 8978 break 8979 } 8980 if s0.AuxInt != 8 { 8981 break 8982 } 8983 x1 := s0.Args[0] 8984 if x1.Op != Op386MOVBloadidx1 { 8985 break 8986 } 8987 i1 := x1.AuxInt 8988 if x1.Aux != s { 8989 break 8990 } 8991 if p != x1.Args[0] { 8992 break 8993 } 8994 if idx != x1.Args[1] { 8995 break 8996 } 8997 if mem != x1.Args[2] { 8998 break 8999 } 9000 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9001 break 9002 } 9003 b = mergePoint(b, x0, x1) 9004 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9005 v.reset(OpCopy) 9006 v.AddArg(v0) 9007 v0.AuxInt = i0 9008 v0.Aux = s 9009 v0.AddArg(p) 9010 v0.AddArg(idx) 9011 v0.AddArg(mem) 9012 return true 9013 } 9014 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 9015 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9016 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9017 for { 9018 x0 := v.Args[0] 9019 if x0.Op != Op386MOVBloadidx1 { 9020 break 9021 } 9022 i0 := x0.AuxInt 9023 s := x0.Aux 9024 idx := x0.Args[0] 9025 p := x0.Args[1] 9026 mem := x0.Args[2] 9027 s0 := v.Args[1] 9028 if s0.Op != Op386SHLLconst { 9029 break 9030 } 9031 if s0.AuxInt != 8 { 9032 break 9033 } 9034 x1 := s0.Args[0] 9035 if x1.Op != Op386MOVBloadidx1 { 9036 break 9037 } 9038 i1 := x1.AuxInt 9039 if x1.Aux != s { 9040 break 9041 } 9042 if p != x1.Args[0] { 9043 break 9044 } 9045 if idx != x1.Args[1] { 9046 break 9047 } 9048 if mem != x1.Args[2] { 9049 break 9050 } 9051 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9052 break 9053 } 9054 b = mergePoint(b, x0, x1) 9055 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9056 v.reset(OpCopy) 9057 v.AddArg(v0) 9058 v0.AuxInt = i0 9059 v0.Aux = s 9060 v0.AddArg(p) 9061 v0.AddArg(idx) 9062 v0.AddArg(mem) 9063 return true 9064 } 9065 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9066 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9067 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9068 for { 9069 x0 := v.Args[0] 9070 if x0.Op != Op386MOVBloadidx1 { 9071 break 9072 } 9073 i0 := x0.AuxInt 9074 s := x0.Aux 9075 p := x0.Args[0] 9076 idx := x0.Args[1] 9077 mem := x0.Args[2] 9078 s0 := v.Args[1] 9079 if s0.Op != Op386SHLLconst { 9080 break 9081 } 9082 if s0.AuxInt != 8 { 9083 break 9084 } 9085 x1 := s0.Args[0] 9086 if x1.Op != Op386MOVBloadidx1 { 9087 break 9088 } 9089 i1 := x1.AuxInt 9090 if x1.Aux != s { 9091 break 9092 } 9093 if idx != x1.Args[0] { 9094 break 9095 } 9096 if p != x1.Args[1] { 9097 break 9098 } 9099 if mem != x1.Args[2] { 9100 break 9101 } 9102 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9103 break 9104 } 9105 b = mergePoint(b, x0, x1) 9106 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9107 v.reset(OpCopy) 9108 v.AddArg(v0) 9109 v0.AuxInt = i0 9110 v0.Aux = s 9111 v0.AddArg(p) 9112 v0.AddArg(idx) 9113 v0.AddArg(mem) 9114 return true 9115 } 9116 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9117 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9118 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9119 for { 9120 x0 := v.Args[0] 9121 if x0.Op != Op386MOVBloadidx1 { 9122 break 9123 } 9124 i0 := x0.AuxInt 9125 s := x0.Aux 9126 idx := x0.Args[0] 9127 p := x0.Args[1] 9128 mem := x0.Args[2] 9129 s0 := v.Args[1] 9130 if s0.Op != Op386SHLLconst { 9131 break 9132 } 9133 if s0.AuxInt != 8 { 9134 break 9135 } 9136 x1 := s0.Args[0] 9137 if x1.Op != Op386MOVBloadidx1 { 9138 break 9139 } 9140 i1 := x1.AuxInt 9141 if x1.Aux != s { 9142 break 9143 } 9144 if idx != x1.Args[0] { 9145 break 9146 } 9147 if p != x1.Args[1] { 9148 break 9149 } 9150 if mem != x1.Args[2] { 9151 break 9152 } 9153 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9154 break 9155 } 9156 b = mergePoint(b, x0, x1) 9157 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9158 v.reset(OpCopy) 9159 v.AddArg(v0) 9160 v0.AuxInt = i0 9161 v0.Aux = s 9162 v0.AddArg(p) 9163 v0.AddArg(idx) 9164 v0.AddArg(mem) 9165 return true 9166 } 9167 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9168 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9169 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9170 for { 9171 s0 := v.Args[0] 9172 if s0.Op != Op386SHLLconst { 9173 break 9174 } 9175 if s0.AuxInt != 8 { 9176 break 9177 } 9178 x1 := s0.Args[0] 9179 if x1.Op != Op386MOVBloadidx1 { 9180 break 9181 } 9182 i1 := x1.AuxInt 9183 s := x1.Aux 9184 p := x1.Args[0] 9185 idx := x1.Args[1] 9186 mem := x1.Args[2] 9187 x0 := v.Args[1] 9188 if x0.Op != Op386MOVBloadidx1 { 9189 break 9190 } 9191 i0 := x0.AuxInt 9192 if x0.Aux != s { 9193 break 9194 } 9195 if p != x0.Args[0] { 9196 break 9197 } 9198 if idx != x0.Args[1] { 9199 break 9200 } 9201 if mem != x0.Args[2] { 9202 break 9203 } 9204 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9205 break 9206 } 9207 b = mergePoint(b, x0, x1) 9208 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9209 v.reset(OpCopy) 9210 v.AddArg(v0) 9211 v0.AuxInt = i0 9212 v0.Aux = s 9213 v0.AddArg(p) 9214 v0.AddArg(idx) 9215 v0.AddArg(mem) 9216 return true 9217 } 9218 return false 9219 } 9220 func rewriteValue386_Op386ORL_20(v *Value) bool { 9221 b := v.Block 9222 _ = b 9223 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9224 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9225 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9226 for { 9227 s0 := v.Args[0] 9228 if s0.Op != Op386SHLLconst { 9229 break 9230 } 9231 if s0.AuxInt != 8 { 9232 break 9233 } 9234 x1 := s0.Args[0] 9235 if x1.Op != Op386MOVBloadidx1 { 9236 break 9237 } 9238 i1 := x1.AuxInt 9239 s := x1.Aux 9240 idx := x1.Args[0] 9241 p := x1.Args[1] 9242 mem := x1.Args[2] 9243 x0 := v.Args[1] 9244 if x0.Op != Op386MOVBloadidx1 { 9245 break 9246 } 9247 i0 := x0.AuxInt 9248 if x0.Aux != s { 9249 break 9250 } 9251 if p != x0.Args[0] { 9252 break 9253 } 9254 if idx != x0.Args[1] { 9255 break 9256 } 9257 if mem != x0.Args[2] { 9258 break 9259 } 9260 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9261 break 9262 } 9263 b = mergePoint(b, x0, x1) 9264 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9265 v.reset(OpCopy) 9266 v.AddArg(v0) 9267 v0.AuxInt = i0 9268 v0.Aux = s 9269 v0.AddArg(p) 9270 v0.AddArg(idx) 9271 v0.AddArg(mem) 9272 return true 9273 } 9274 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9275 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9276 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9277 for { 9278 s0 := v.Args[0] 9279 if s0.Op != Op386SHLLconst { 9280 break 9281 } 9282 if s0.AuxInt != 8 { 9283 break 9284 } 9285 x1 := s0.Args[0] 9286 if x1.Op != Op386MOVBloadidx1 { 9287 break 9288 } 9289 i1 := x1.AuxInt 9290 s := x1.Aux 9291 p := x1.Args[0] 9292 idx := x1.Args[1] 9293 mem := x1.Args[2] 9294 x0 := v.Args[1] 9295 if x0.Op != Op386MOVBloadidx1 { 9296 break 9297 } 9298 i0 := x0.AuxInt 9299 if x0.Aux != s { 9300 break 9301 } 9302 if idx != x0.Args[0] { 9303 break 9304 } 9305 if p != x0.Args[1] { 9306 break 9307 } 9308 if mem != x0.Args[2] { 9309 break 9310 } 9311 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9312 break 9313 } 9314 b = mergePoint(b, x0, x1) 9315 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9316 v.reset(OpCopy) 9317 v.AddArg(v0) 9318 v0.AuxInt = i0 9319 v0.Aux = s 9320 v0.AddArg(p) 9321 v0.AddArg(idx) 9322 v0.AddArg(mem) 9323 return true 9324 } 9325 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9326 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9327 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9328 for { 9329 s0 := v.Args[0] 9330 if s0.Op != Op386SHLLconst { 9331 break 9332 } 9333 if s0.AuxInt != 8 { 9334 break 9335 } 9336 x1 := s0.Args[0] 9337 if x1.Op != Op386MOVBloadidx1 { 9338 break 9339 } 9340 i1 := x1.AuxInt 9341 s := x1.Aux 9342 idx := x1.Args[0] 9343 p := x1.Args[1] 9344 mem := x1.Args[2] 9345 x0 := v.Args[1] 9346 if x0.Op != Op386MOVBloadidx1 { 9347 break 9348 } 9349 i0 := x0.AuxInt 9350 if x0.Aux != s { 9351 break 9352 } 9353 if idx != x0.Args[0] { 9354 break 9355 } 9356 if p != x0.Args[1] { 9357 break 9358 } 9359 if mem != x0.Args[2] { 9360 break 9361 } 9362 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9363 break 9364 } 9365 b = mergePoint(b, x0, x1) 9366 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9367 v.reset(OpCopy) 9368 v.AddArg(v0) 9369 v0.AuxInt = i0 9370 v0.Aux = s 9371 v0.AddArg(p) 9372 v0.AddArg(idx) 9373 v0.AddArg(mem) 9374 return true 9375 } 9376 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9377 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9378 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9379 for { 9380 o0 := v.Args[0] 9381 if o0.Op != Op386ORL { 9382 break 9383 } 9384 x0 := o0.Args[0] 9385 if x0.Op != Op386MOVWloadidx1 { 9386 break 9387 } 9388 i0 := x0.AuxInt 9389 s := x0.Aux 9390 p := x0.Args[0] 9391 idx := x0.Args[1] 9392 mem := x0.Args[2] 9393 s0 := o0.Args[1] 9394 if s0.Op != Op386SHLLconst { 9395 break 9396 } 9397 if s0.AuxInt != 16 { 9398 break 9399 } 9400 x1 := s0.Args[0] 9401 if x1.Op != Op386MOVBloadidx1 { 9402 break 9403 } 9404 i2 := x1.AuxInt 9405 if x1.Aux != s { 9406 break 9407 } 9408 if p != x1.Args[0] { 9409 break 9410 } 9411 if idx != x1.Args[1] { 9412 break 9413 } 9414 if mem != x1.Args[2] { 9415 break 9416 } 9417 s1 := v.Args[1] 9418 if s1.Op != Op386SHLLconst { 9419 break 9420 } 9421 if s1.AuxInt != 24 { 9422 break 9423 } 9424 x2 := s1.Args[0] 9425 if x2.Op != Op386MOVBloadidx1 { 9426 break 9427 } 9428 i3 := x2.AuxInt 9429 if x2.Aux != s { 9430 break 9431 } 9432 if p != x2.Args[0] { 9433 break 9434 } 9435 if idx != x2.Args[1] { 9436 break 9437 } 9438 if mem != x2.Args[2] { 9439 break 9440 } 9441 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9442 break 9443 } 9444 b = mergePoint(b, x0, x1, x2) 9445 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9446 v.reset(OpCopy) 9447 v.AddArg(v0) 9448 v0.AuxInt = i0 9449 v0.Aux = s 9450 v0.AddArg(p) 9451 v0.AddArg(idx) 9452 v0.AddArg(mem) 9453 return true 9454 } 9455 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9456 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9457 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9458 for { 9459 o0 := v.Args[0] 9460 if o0.Op != Op386ORL { 9461 break 9462 } 9463 x0 := o0.Args[0] 9464 if x0.Op != Op386MOVWloadidx1 { 9465 break 9466 } 9467 i0 := x0.AuxInt 9468 s := x0.Aux 9469 idx := x0.Args[0] 9470 p := x0.Args[1] 9471 mem := x0.Args[2] 9472 s0 := o0.Args[1] 9473 if s0.Op != Op386SHLLconst { 9474 break 9475 } 9476 if s0.AuxInt != 16 { 9477 break 9478 } 9479 x1 := s0.Args[0] 9480 if x1.Op != Op386MOVBloadidx1 { 9481 break 9482 } 9483 i2 := x1.AuxInt 9484 if x1.Aux != s { 9485 break 9486 } 9487 if p != x1.Args[0] { 9488 break 9489 } 9490 if idx != x1.Args[1] { 9491 break 9492 } 9493 if mem != x1.Args[2] { 9494 break 9495 } 9496 s1 := v.Args[1] 9497 if s1.Op != Op386SHLLconst { 9498 break 9499 } 9500 if s1.AuxInt != 24 { 9501 break 9502 } 9503 x2 := s1.Args[0] 9504 if x2.Op != Op386MOVBloadidx1 { 9505 break 9506 } 9507 i3 := x2.AuxInt 9508 if x2.Aux != s { 9509 break 9510 } 9511 if p != x2.Args[0] { 9512 break 9513 } 9514 if idx != x2.Args[1] { 9515 break 9516 } 9517 if mem != x2.Args[2] { 9518 break 9519 } 9520 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9521 break 9522 } 9523 b = mergePoint(b, x0, x1, x2) 9524 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9525 v.reset(OpCopy) 9526 v.AddArg(v0) 9527 v0.AuxInt = i0 9528 v0.Aux = s 9529 v0.AddArg(p) 9530 v0.AddArg(idx) 9531 v0.AddArg(mem) 9532 return true 9533 } 9534 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9535 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9536 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9537 for { 9538 o0 := v.Args[0] 9539 if o0.Op != Op386ORL { 9540 break 9541 } 9542 x0 := o0.Args[0] 9543 if x0.Op != Op386MOVWloadidx1 { 9544 break 9545 } 9546 i0 := x0.AuxInt 9547 s := x0.Aux 9548 p := x0.Args[0] 9549 idx := x0.Args[1] 9550 mem := x0.Args[2] 9551 s0 := o0.Args[1] 9552 if s0.Op != Op386SHLLconst { 9553 break 9554 } 9555 if s0.AuxInt != 16 { 9556 break 9557 } 9558 x1 := s0.Args[0] 9559 if x1.Op != Op386MOVBloadidx1 { 9560 break 9561 } 9562 i2 := x1.AuxInt 9563 if x1.Aux != s { 9564 break 9565 } 9566 if idx != x1.Args[0] { 9567 break 9568 } 9569 if p != x1.Args[1] { 9570 break 9571 } 9572 if mem != x1.Args[2] { 9573 break 9574 } 9575 s1 := v.Args[1] 9576 if s1.Op != Op386SHLLconst { 9577 break 9578 } 9579 if s1.AuxInt != 24 { 9580 break 9581 } 9582 x2 := s1.Args[0] 9583 if x2.Op != Op386MOVBloadidx1 { 9584 break 9585 } 9586 i3 := x2.AuxInt 9587 if x2.Aux != s { 9588 break 9589 } 9590 if p != x2.Args[0] { 9591 break 9592 } 9593 if idx != x2.Args[1] { 9594 break 9595 } 9596 if mem != x2.Args[2] { 9597 break 9598 } 9599 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9600 break 9601 } 9602 b = mergePoint(b, x0, x1, x2) 9603 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9604 v.reset(OpCopy) 9605 v.AddArg(v0) 9606 v0.AuxInt = i0 9607 v0.Aux = s 9608 v0.AddArg(p) 9609 v0.AddArg(idx) 9610 v0.AddArg(mem) 9611 return true 9612 } 9613 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9614 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9615 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9616 for { 9617 o0 := v.Args[0] 9618 if o0.Op != Op386ORL { 9619 break 9620 } 9621 x0 := o0.Args[0] 9622 if x0.Op != Op386MOVWloadidx1 { 9623 break 9624 } 9625 i0 := x0.AuxInt 9626 s := x0.Aux 9627 idx := x0.Args[0] 9628 p := x0.Args[1] 9629 mem := x0.Args[2] 9630 s0 := o0.Args[1] 9631 if s0.Op != Op386SHLLconst { 9632 break 9633 } 9634 if s0.AuxInt != 16 { 9635 break 9636 } 9637 x1 := s0.Args[0] 9638 if x1.Op != Op386MOVBloadidx1 { 9639 break 9640 } 9641 i2 := x1.AuxInt 9642 if x1.Aux != s { 9643 break 9644 } 9645 if idx != x1.Args[0] { 9646 break 9647 } 9648 if p != x1.Args[1] { 9649 break 9650 } 9651 if mem != x1.Args[2] { 9652 break 9653 } 9654 s1 := v.Args[1] 9655 if s1.Op != Op386SHLLconst { 9656 break 9657 } 9658 if s1.AuxInt != 24 { 9659 break 9660 } 9661 x2 := s1.Args[0] 9662 if x2.Op != Op386MOVBloadidx1 { 9663 break 9664 } 9665 i3 := x2.AuxInt 9666 if x2.Aux != s { 9667 break 9668 } 9669 if p != x2.Args[0] { 9670 break 9671 } 9672 if idx != x2.Args[1] { 9673 break 9674 } 9675 if mem != x2.Args[2] { 9676 break 9677 } 9678 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9679 break 9680 } 9681 b = mergePoint(b, x0, x1, x2) 9682 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9683 v.reset(OpCopy) 9684 v.AddArg(v0) 9685 v0.AuxInt = i0 9686 v0.Aux = s 9687 v0.AddArg(p) 9688 v0.AddArg(idx) 9689 v0.AddArg(mem) 9690 return true 9691 } 9692 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9693 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9694 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9695 for { 9696 o0 := v.Args[0] 9697 if o0.Op != Op386ORL { 9698 break 9699 } 9700 s0 := o0.Args[0] 9701 if s0.Op != Op386SHLLconst { 9702 break 9703 } 9704 if s0.AuxInt != 16 { 9705 break 9706 } 9707 x1 := s0.Args[0] 9708 if x1.Op != Op386MOVBloadidx1 { 9709 break 9710 } 9711 i2 := x1.AuxInt 9712 s := x1.Aux 9713 p := x1.Args[0] 9714 idx := x1.Args[1] 9715 mem := x1.Args[2] 9716 x0 := o0.Args[1] 9717 if x0.Op != Op386MOVWloadidx1 { 9718 break 9719 } 9720 i0 := x0.AuxInt 9721 if x0.Aux != s { 9722 break 9723 } 9724 if p != x0.Args[0] { 9725 break 9726 } 9727 if idx != x0.Args[1] { 9728 break 9729 } 9730 if mem != x0.Args[2] { 9731 break 9732 } 9733 s1 := v.Args[1] 9734 if s1.Op != Op386SHLLconst { 9735 break 9736 } 9737 if s1.AuxInt != 24 { 9738 break 9739 } 9740 x2 := s1.Args[0] 9741 if x2.Op != Op386MOVBloadidx1 { 9742 break 9743 } 9744 i3 := x2.AuxInt 9745 if x2.Aux != s { 9746 break 9747 } 9748 if p != x2.Args[0] { 9749 break 9750 } 9751 if idx != x2.Args[1] { 9752 break 9753 } 9754 if mem != x2.Args[2] { 9755 break 9756 } 9757 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9758 break 9759 } 9760 b = mergePoint(b, x0, x1, x2) 9761 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9762 v.reset(OpCopy) 9763 v.AddArg(v0) 9764 v0.AuxInt = i0 9765 v0.Aux = s 9766 v0.AddArg(p) 9767 v0.AddArg(idx) 9768 v0.AddArg(mem) 9769 return true 9770 } 9771 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9772 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9773 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9774 for { 9775 o0 := v.Args[0] 9776 if o0.Op != Op386ORL { 9777 break 9778 } 9779 s0 := o0.Args[0] 9780 if s0.Op != Op386SHLLconst { 9781 break 9782 } 9783 if s0.AuxInt != 16 { 9784 break 9785 } 9786 x1 := s0.Args[0] 9787 if x1.Op != Op386MOVBloadidx1 { 9788 break 9789 } 9790 i2 := x1.AuxInt 9791 s := x1.Aux 9792 idx := x1.Args[0] 9793 p := x1.Args[1] 9794 mem := x1.Args[2] 9795 x0 := o0.Args[1] 9796 if x0.Op != Op386MOVWloadidx1 { 9797 break 9798 } 9799 i0 := x0.AuxInt 9800 if x0.Aux != s { 9801 break 9802 } 9803 if p != x0.Args[0] { 9804 break 9805 } 9806 if idx != x0.Args[1] { 9807 break 9808 } 9809 if mem != x0.Args[2] { 9810 break 9811 } 9812 s1 := v.Args[1] 9813 if s1.Op != Op386SHLLconst { 9814 break 9815 } 9816 if s1.AuxInt != 24 { 9817 break 9818 } 9819 x2 := s1.Args[0] 9820 if x2.Op != Op386MOVBloadidx1 { 9821 break 9822 } 9823 i3 := x2.AuxInt 9824 if x2.Aux != s { 9825 break 9826 } 9827 if p != x2.Args[0] { 9828 break 9829 } 9830 if idx != x2.Args[1] { 9831 break 9832 } 9833 if mem != x2.Args[2] { 9834 break 9835 } 9836 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9837 break 9838 } 9839 b = mergePoint(b, x0, x1, x2) 9840 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9841 v.reset(OpCopy) 9842 v.AddArg(v0) 9843 v0.AuxInt = i0 9844 v0.Aux = s 9845 v0.AddArg(p) 9846 v0.AddArg(idx) 9847 v0.AddArg(mem) 9848 return true 9849 } 9850 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9851 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9852 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9853 for { 9854 o0 := v.Args[0] 9855 if o0.Op != Op386ORL { 9856 break 9857 } 9858 s0 := o0.Args[0] 9859 if s0.Op != Op386SHLLconst { 9860 break 9861 } 9862 if s0.AuxInt != 16 { 9863 break 9864 } 9865 x1 := s0.Args[0] 9866 if x1.Op != Op386MOVBloadidx1 { 9867 break 9868 } 9869 i2 := x1.AuxInt 9870 s := x1.Aux 9871 p := x1.Args[0] 9872 idx := x1.Args[1] 9873 mem := x1.Args[2] 9874 x0 := o0.Args[1] 9875 if x0.Op != Op386MOVWloadidx1 { 9876 break 9877 } 9878 i0 := x0.AuxInt 9879 if x0.Aux != s { 9880 break 9881 } 9882 if idx != x0.Args[0] { 9883 break 9884 } 9885 if p != x0.Args[1] { 9886 break 9887 } 9888 if mem != x0.Args[2] { 9889 break 9890 } 9891 s1 := v.Args[1] 9892 if s1.Op != Op386SHLLconst { 9893 break 9894 } 9895 if s1.AuxInt != 24 { 9896 break 9897 } 9898 x2 := s1.Args[0] 9899 if x2.Op != Op386MOVBloadidx1 { 9900 break 9901 } 9902 i3 := x2.AuxInt 9903 if x2.Aux != s { 9904 break 9905 } 9906 if p != x2.Args[0] { 9907 break 9908 } 9909 if idx != x2.Args[1] { 9910 break 9911 } 9912 if mem != x2.Args[2] { 9913 break 9914 } 9915 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 9916 break 9917 } 9918 b = mergePoint(b, x0, x1, x2) 9919 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9920 v.reset(OpCopy) 9921 v.AddArg(v0) 9922 v0.AuxInt = i0 9923 v0.Aux = s 9924 v0.AddArg(p) 9925 v0.AddArg(idx) 9926 v0.AddArg(mem) 9927 return true 9928 } 9929 return false 9930 } 9931 func rewriteValue386_Op386ORL_30(v *Value) bool { 9932 b := v.Block 9933 _ = b 9934 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) 9935 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 9936 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9937 for { 9938 o0 := v.Args[0] 9939 if o0.Op != Op386ORL { 9940 break 9941 } 9942 s0 := o0.Args[0] 9943 if s0.Op != Op386SHLLconst { 9944 break 9945 } 9946 if s0.AuxInt != 16 { 9947 break 9948 } 9949 x1 := s0.Args[0] 9950 if x1.Op != Op386MOVBloadidx1 { 9951 break 9952 } 9953 i2 := x1.AuxInt 9954 s := x1.Aux 9955 idx := x1.Args[0] 9956 p := x1.Args[1] 9957 mem := x1.Args[2] 9958 x0 := o0.Args[1] 9959 if x0.Op != Op386MOVWloadidx1 { 9960 break 9961 } 9962 i0 := x0.AuxInt 9963 if x0.Aux != s { 9964 break 9965 } 9966 if idx != x0.Args[0] { 9967 break 9968 } 9969 if p != x0.Args[1] { 9970 break 9971 } 9972 if mem != x0.Args[2] { 9973 break 9974 } 9975 s1 := v.Args[1] 9976 if s1.Op != Op386SHLLconst { 9977 break 9978 } 9979 if s1.AuxInt != 24 { 9980 break 9981 } 9982 x2 := s1.Args[0] 9983 if x2.Op != Op386MOVBloadidx1 { 9984 break 9985 } 9986 i3 := x2.AuxInt 9987 if x2.Aux != s { 9988 break 9989 } 9990 if p != x2.Args[0] { 9991 break 9992 } 9993 if idx != x2.Args[1] { 9994 break 9995 } 9996 if mem != x2.Args[2] { 9997 break 9998 } 9999 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10000 break 10001 } 10002 b = mergePoint(b, x0, x1, x2) 10003 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10004 v.reset(OpCopy) 10005 v.AddArg(v0) 10006 v0.AuxInt = i0 10007 v0.Aux = s 10008 v0.AddArg(p) 10009 v0.AddArg(idx) 10010 v0.AddArg(mem) 10011 return true 10012 } 10013 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10014 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10015 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10016 for { 10017 o0 := v.Args[0] 10018 if o0.Op != Op386ORL { 10019 break 10020 } 10021 x0 := o0.Args[0] 10022 if x0.Op != Op386MOVWloadidx1 { 10023 break 10024 } 10025 i0 := x0.AuxInt 10026 s := x0.Aux 10027 p := x0.Args[0] 10028 idx := x0.Args[1] 10029 mem := x0.Args[2] 10030 s0 := o0.Args[1] 10031 if s0.Op != Op386SHLLconst { 10032 break 10033 } 10034 if s0.AuxInt != 16 { 10035 break 10036 } 10037 x1 := s0.Args[0] 10038 if x1.Op != Op386MOVBloadidx1 { 10039 break 10040 } 10041 i2 := x1.AuxInt 10042 if x1.Aux != s { 10043 break 10044 } 10045 if p != x1.Args[0] { 10046 break 10047 } 10048 if idx != x1.Args[1] { 10049 break 10050 } 10051 if mem != x1.Args[2] { 10052 break 10053 } 10054 s1 := v.Args[1] 10055 if s1.Op != Op386SHLLconst { 10056 break 10057 } 10058 if s1.AuxInt != 24 { 10059 break 10060 } 10061 x2 := s1.Args[0] 10062 if x2.Op != Op386MOVBloadidx1 { 10063 break 10064 } 10065 i3 := x2.AuxInt 10066 if x2.Aux != s { 10067 break 10068 } 10069 if idx != x2.Args[0] { 10070 break 10071 } 10072 if p != x2.Args[1] { 10073 break 10074 } 10075 if mem != x2.Args[2] { 10076 break 10077 } 10078 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10079 break 10080 } 10081 b = mergePoint(b, x0, x1, x2) 10082 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10083 v.reset(OpCopy) 10084 v.AddArg(v0) 10085 v0.AuxInt = i0 10086 v0.Aux = s 10087 v0.AddArg(p) 10088 v0.AddArg(idx) 10089 v0.AddArg(mem) 10090 return true 10091 } 10092 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10093 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10094 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10095 for { 10096 o0 := v.Args[0] 10097 if o0.Op != Op386ORL { 10098 break 10099 } 10100 x0 := o0.Args[0] 10101 if x0.Op != Op386MOVWloadidx1 { 10102 break 10103 } 10104 i0 := x0.AuxInt 10105 s := x0.Aux 10106 idx := x0.Args[0] 10107 p := x0.Args[1] 10108 mem := x0.Args[2] 10109 s0 := o0.Args[1] 10110 if s0.Op != Op386SHLLconst { 10111 break 10112 } 10113 if s0.AuxInt != 16 { 10114 break 10115 } 10116 x1 := s0.Args[0] 10117 if x1.Op != Op386MOVBloadidx1 { 10118 break 10119 } 10120 i2 := x1.AuxInt 10121 if x1.Aux != s { 10122 break 10123 } 10124 if p != x1.Args[0] { 10125 break 10126 } 10127 if idx != x1.Args[1] { 10128 break 10129 } 10130 if mem != x1.Args[2] { 10131 break 10132 } 10133 s1 := v.Args[1] 10134 if s1.Op != Op386SHLLconst { 10135 break 10136 } 10137 if s1.AuxInt != 24 { 10138 break 10139 } 10140 x2 := s1.Args[0] 10141 if x2.Op != Op386MOVBloadidx1 { 10142 break 10143 } 10144 i3 := x2.AuxInt 10145 if x2.Aux != s { 10146 break 10147 } 10148 if idx != x2.Args[0] { 10149 break 10150 } 10151 if p != x2.Args[1] { 10152 break 10153 } 10154 if mem != x2.Args[2] { 10155 break 10156 } 10157 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10158 break 10159 } 10160 b = mergePoint(b, x0, x1, x2) 10161 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10162 v.reset(OpCopy) 10163 v.AddArg(v0) 10164 v0.AuxInt = i0 10165 v0.Aux = s 10166 v0.AddArg(p) 10167 v0.AddArg(idx) 10168 v0.AddArg(mem) 10169 return true 10170 } 10171 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10172 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10173 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10174 for { 10175 o0 := v.Args[0] 10176 if o0.Op != Op386ORL { 10177 break 10178 } 10179 x0 := o0.Args[0] 10180 if x0.Op != Op386MOVWloadidx1 { 10181 break 10182 } 10183 i0 := x0.AuxInt 10184 s := x0.Aux 10185 p := x0.Args[0] 10186 idx := x0.Args[1] 10187 mem := x0.Args[2] 10188 s0 := o0.Args[1] 10189 if s0.Op != Op386SHLLconst { 10190 break 10191 } 10192 if s0.AuxInt != 16 { 10193 break 10194 } 10195 x1 := s0.Args[0] 10196 if x1.Op != Op386MOVBloadidx1 { 10197 break 10198 } 10199 i2 := x1.AuxInt 10200 if x1.Aux != s { 10201 break 10202 } 10203 if idx != x1.Args[0] { 10204 break 10205 } 10206 if p != x1.Args[1] { 10207 break 10208 } 10209 if mem != x1.Args[2] { 10210 break 10211 } 10212 s1 := v.Args[1] 10213 if s1.Op != Op386SHLLconst { 10214 break 10215 } 10216 if s1.AuxInt != 24 { 10217 break 10218 } 10219 x2 := s1.Args[0] 10220 if x2.Op != Op386MOVBloadidx1 { 10221 break 10222 } 10223 i3 := x2.AuxInt 10224 if x2.Aux != s { 10225 break 10226 } 10227 if idx != x2.Args[0] { 10228 break 10229 } 10230 if p != x2.Args[1] { 10231 break 10232 } 10233 if mem != x2.Args[2] { 10234 break 10235 } 10236 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10237 break 10238 } 10239 b = mergePoint(b, x0, x1, x2) 10240 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10241 v.reset(OpCopy) 10242 v.AddArg(v0) 10243 v0.AuxInt = i0 10244 v0.Aux = s 10245 v0.AddArg(p) 10246 v0.AddArg(idx) 10247 v0.AddArg(mem) 10248 return true 10249 } 10250 // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10251 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10252 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10253 for { 10254 o0 := v.Args[0] 10255 if o0.Op != Op386ORL { 10256 break 10257 } 10258 x0 := o0.Args[0] 10259 if x0.Op != Op386MOVWloadidx1 { 10260 break 10261 } 10262 i0 := x0.AuxInt 10263 s := x0.Aux 10264 idx := x0.Args[0] 10265 p := x0.Args[1] 10266 mem := x0.Args[2] 10267 s0 := o0.Args[1] 10268 if s0.Op != Op386SHLLconst { 10269 break 10270 } 10271 if s0.AuxInt != 16 { 10272 break 10273 } 10274 x1 := s0.Args[0] 10275 if x1.Op != Op386MOVBloadidx1 { 10276 break 10277 } 10278 i2 := x1.AuxInt 10279 if x1.Aux != s { 10280 break 10281 } 10282 if idx != x1.Args[0] { 10283 break 10284 } 10285 if p != x1.Args[1] { 10286 break 10287 } 10288 if mem != x1.Args[2] { 10289 break 10290 } 10291 s1 := v.Args[1] 10292 if s1.Op != Op386SHLLconst { 10293 break 10294 } 10295 if s1.AuxInt != 24 { 10296 break 10297 } 10298 x2 := s1.Args[0] 10299 if x2.Op != Op386MOVBloadidx1 { 10300 break 10301 } 10302 i3 := x2.AuxInt 10303 if x2.Aux != s { 10304 break 10305 } 10306 if idx != x2.Args[0] { 10307 break 10308 } 10309 if p != x2.Args[1] { 10310 break 10311 } 10312 if mem != x2.Args[2] { 10313 break 10314 } 10315 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10316 break 10317 } 10318 b = mergePoint(b, x0, x1, x2) 10319 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10320 v.reset(OpCopy) 10321 v.AddArg(v0) 10322 v0.AuxInt = i0 10323 v0.Aux = s 10324 v0.AddArg(p) 10325 v0.AddArg(idx) 10326 v0.AddArg(mem) 10327 return true 10328 } 10329 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10330 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10331 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10332 for { 10333 o0 := v.Args[0] 10334 if o0.Op != Op386ORL { 10335 break 10336 } 10337 s0 := o0.Args[0] 10338 if s0.Op != Op386SHLLconst { 10339 break 10340 } 10341 if s0.AuxInt != 16 { 10342 break 10343 } 10344 x1 := s0.Args[0] 10345 if x1.Op != Op386MOVBloadidx1 { 10346 break 10347 } 10348 i2 := x1.AuxInt 10349 s := x1.Aux 10350 p := x1.Args[0] 10351 idx := x1.Args[1] 10352 mem := x1.Args[2] 10353 x0 := o0.Args[1] 10354 if x0.Op != Op386MOVWloadidx1 { 10355 break 10356 } 10357 i0 := x0.AuxInt 10358 if x0.Aux != s { 10359 break 10360 } 10361 if p != x0.Args[0] { 10362 break 10363 } 10364 if idx != x0.Args[1] { 10365 break 10366 } 10367 if mem != x0.Args[2] { 10368 break 10369 } 10370 s1 := v.Args[1] 10371 if s1.Op != Op386SHLLconst { 10372 break 10373 } 10374 if s1.AuxInt != 24 { 10375 break 10376 } 10377 x2 := s1.Args[0] 10378 if x2.Op != Op386MOVBloadidx1 { 10379 break 10380 } 10381 i3 := x2.AuxInt 10382 if x2.Aux != s { 10383 break 10384 } 10385 if idx != x2.Args[0] { 10386 break 10387 } 10388 if p != x2.Args[1] { 10389 break 10390 } 10391 if mem != x2.Args[2] { 10392 break 10393 } 10394 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10395 break 10396 } 10397 b = mergePoint(b, x0, x1, x2) 10398 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10399 v.reset(OpCopy) 10400 v.AddArg(v0) 10401 v0.AuxInt = i0 10402 v0.Aux = s 10403 v0.AddArg(p) 10404 v0.AddArg(idx) 10405 v0.AddArg(mem) 10406 return true 10407 } 10408 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10409 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10410 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10411 for { 10412 o0 := v.Args[0] 10413 if o0.Op != Op386ORL { 10414 break 10415 } 10416 s0 := o0.Args[0] 10417 if s0.Op != Op386SHLLconst { 10418 break 10419 } 10420 if s0.AuxInt != 16 { 10421 break 10422 } 10423 x1 := s0.Args[0] 10424 if x1.Op != Op386MOVBloadidx1 { 10425 break 10426 } 10427 i2 := x1.AuxInt 10428 s := x1.Aux 10429 idx := x1.Args[0] 10430 p := x1.Args[1] 10431 mem := x1.Args[2] 10432 x0 := o0.Args[1] 10433 if x0.Op != Op386MOVWloadidx1 { 10434 break 10435 } 10436 i0 := x0.AuxInt 10437 if x0.Aux != s { 10438 break 10439 } 10440 if p != x0.Args[0] { 10441 break 10442 } 10443 if idx != x0.Args[1] { 10444 break 10445 } 10446 if mem != x0.Args[2] { 10447 break 10448 } 10449 s1 := v.Args[1] 10450 if s1.Op != Op386SHLLconst { 10451 break 10452 } 10453 if s1.AuxInt != 24 { 10454 break 10455 } 10456 x2 := s1.Args[0] 10457 if x2.Op != Op386MOVBloadidx1 { 10458 break 10459 } 10460 i3 := x2.AuxInt 10461 if x2.Aux != s { 10462 break 10463 } 10464 if idx != x2.Args[0] { 10465 break 10466 } 10467 if p != x2.Args[1] { 10468 break 10469 } 10470 if mem != x2.Args[2] { 10471 break 10472 } 10473 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10474 break 10475 } 10476 b = mergePoint(b, x0, x1, x2) 10477 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10478 v.reset(OpCopy) 10479 v.AddArg(v0) 10480 v0.AuxInt = i0 10481 v0.Aux = s 10482 v0.AddArg(p) 10483 v0.AddArg(idx) 10484 v0.AddArg(mem) 10485 return true 10486 } 10487 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10488 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10489 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10490 for { 10491 o0 := v.Args[0] 10492 if o0.Op != Op386ORL { 10493 break 10494 } 10495 s0 := o0.Args[0] 10496 if s0.Op != Op386SHLLconst { 10497 break 10498 } 10499 if s0.AuxInt != 16 { 10500 break 10501 } 10502 x1 := s0.Args[0] 10503 if x1.Op != Op386MOVBloadidx1 { 10504 break 10505 } 10506 i2 := x1.AuxInt 10507 s := x1.Aux 10508 p := x1.Args[0] 10509 idx := x1.Args[1] 10510 mem := x1.Args[2] 10511 x0 := o0.Args[1] 10512 if x0.Op != Op386MOVWloadidx1 { 10513 break 10514 } 10515 i0 := x0.AuxInt 10516 if x0.Aux != s { 10517 break 10518 } 10519 if idx != x0.Args[0] { 10520 break 10521 } 10522 if p != x0.Args[1] { 10523 break 10524 } 10525 if mem != x0.Args[2] { 10526 break 10527 } 10528 s1 := v.Args[1] 10529 if s1.Op != Op386SHLLconst { 10530 break 10531 } 10532 if s1.AuxInt != 24 { 10533 break 10534 } 10535 x2 := s1.Args[0] 10536 if x2.Op != Op386MOVBloadidx1 { 10537 break 10538 } 10539 i3 := x2.AuxInt 10540 if x2.Aux != s { 10541 break 10542 } 10543 if idx != x2.Args[0] { 10544 break 10545 } 10546 if p != x2.Args[1] { 10547 break 10548 } 10549 if mem != x2.Args[2] { 10550 break 10551 } 10552 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10553 break 10554 } 10555 b = mergePoint(b, x0, x1, x2) 10556 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10557 v.reset(OpCopy) 10558 v.AddArg(v0) 10559 v0.AuxInt = i0 10560 v0.Aux = s 10561 v0.AddArg(p) 10562 v0.AddArg(idx) 10563 v0.AddArg(mem) 10564 return true 10565 } 10566 // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) 10567 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10568 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10569 for { 10570 o0 := v.Args[0] 10571 if o0.Op != Op386ORL { 10572 break 10573 } 10574 s0 := o0.Args[0] 10575 if s0.Op != Op386SHLLconst { 10576 break 10577 } 10578 if s0.AuxInt != 16 { 10579 break 10580 } 10581 x1 := s0.Args[0] 10582 if x1.Op != Op386MOVBloadidx1 { 10583 break 10584 } 10585 i2 := x1.AuxInt 10586 s := x1.Aux 10587 idx := x1.Args[0] 10588 p := x1.Args[1] 10589 mem := x1.Args[2] 10590 x0 := o0.Args[1] 10591 if x0.Op != Op386MOVWloadidx1 { 10592 break 10593 } 10594 i0 := x0.AuxInt 10595 if x0.Aux != s { 10596 break 10597 } 10598 if idx != x0.Args[0] { 10599 break 10600 } 10601 if p != x0.Args[1] { 10602 break 10603 } 10604 if mem != x0.Args[2] { 10605 break 10606 } 10607 s1 := v.Args[1] 10608 if s1.Op != Op386SHLLconst { 10609 break 10610 } 10611 if s1.AuxInt != 24 { 10612 break 10613 } 10614 x2 := s1.Args[0] 10615 if x2.Op != Op386MOVBloadidx1 { 10616 break 10617 } 10618 i3 := x2.AuxInt 10619 if x2.Aux != s { 10620 break 10621 } 10622 if idx != x2.Args[0] { 10623 break 10624 } 10625 if p != x2.Args[1] { 10626 break 10627 } 10628 if mem != x2.Args[2] { 10629 break 10630 } 10631 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10632 break 10633 } 10634 b = mergePoint(b, x0, x1, x2) 10635 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10636 v.reset(OpCopy) 10637 v.AddArg(v0) 10638 v0.AuxInt = i0 10639 v0.Aux = s 10640 v0.AddArg(p) 10641 v0.AddArg(idx) 10642 v0.AddArg(mem) 10643 return true 10644 } 10645 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10646 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10647 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10648 for { 10649 s1 := v.Args[0] 10650 if s1.Op != Op386SHLLconst { 10651 break 10652 } 10653 if s1.AuxInt != 24 { 10654 break 10655 } 10656 x2 := s1.Args[0] 10657 if x2.Op != Op386MOVBloadidx1 { 10658 break 10659 } 10660 i3 := x2.AuxInt 10661 s := x2.Aux 10662 p := x2.Args[0] 10663 idx := x2.Args[1] 10664 mem := x2.Args[2] 10665 o0 := v.Args[1] 10666 if o0.Op != Op386ORL { 10667 break 10668 } 10669 x0 := o0.Args[0] 10670 if x0.Op != Op386MOVWloadidx1 { 10671 break 10672 } 10673 i0 := x0.AuxInt 10674 if x0.Aux != s { 10675 break 10676 } 10677 if p != x0.Args[0] { 10678 break 10679 } 10680 if idx != x0.Args[1] { 10681 break 10682 } 10683 if mem != x0.Args[2] { 10684 break 10685 } 10686 s0 := o0.Args[1] 10687 if s0.Op != Op386SHLLconst { 10688 break 10689 } 10690 if s0.AuxInt != 16 { 10691 break 10692 } 10693 x1 := s0.Args[0] 10694 if x1.Op != Op386MOVBloadidx1 { 10695 break 10696 } 10697 i2 := x1.AuxInt 10698 if x1.Aux != s { 10699 break 10700 } 10701 if p != x1.Args[0] { 10702 break 10703 } 10704 if idx != x1.Args[1] { 10705 break 10706 } 10707 if mem != x1.Args[2] { 10708 break 10709 } 10710 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10711 break 10712 } 10713 b = mergePoint(b, x0, x1, x2) 10714 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10715 v.reset(OpCopy) 10716 v.AddArg(v0) 10717 v0.AuxInt = i0 10718 v0.Aux = s 10719 v0.AddArg(p) 10720 v0.AddArg(idx) 10721 v0.AddArg(mem) 10722 return true 10723 } 10724 return false 10725 } 10726 func rewriteValue386_Op386ORL_40(v *Value) bool { 10727 b := v.Block 10728 _ = b 10729 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10730 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10731 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10732 for { 10733 s1 := v.Args[0] 10734 if s1.Op != Op386SHLLconst { 10735 break 10736 } 10737 if s1.AuxInt != 24 { 10738 break 10739 } 10740 x2 := s1.Args[0] 10741 if x2.Op != Op386MOVBloadidx1 { 10742 break 10743 } 10744 i3 := x2.AuxInt 10745 s := x2.Aux 10746 idx := x2.Args[0] 10747 p := x2.Args[1] 10748 mem := x2.Args[2] 10749 o0 := v.Args[1] 10750 if o0.Op != Op386ORL { 10751 break 10752 } 10753 x0 := o0.Args[0] 10754 if x0.Op != Op386MOVWloadidx1 { 10755 break 10756 } 10757 i0 := x0.AuxInt 10758 if x0.Aux != s { 10759 break 10760 } 10761 if p != x0.Args[0] { 10762 break 10763 } 10764 if idx != x0.Args[1] { 10765 break 10766 } 10767 if mem != x0.Args[2] { 10768 break 10769 } 10770 s0 := o0.Args[1] 10771 if s0.Op != Op386SHLLconst { 10772 break 10773 } 10774 if s0.AuxInt != 16 { 10775 break 10776 } 10777 x1 := s0.Args[0] 10778 if x1.Op != Op386MOVBloadidx1 { 10779 break 10780 } 10781 i2 := x1.AuxInt 10782 if x1.Aux != s { 10783 break 10784 } 10785 if p != x1.Args[0] { 10786 break 10787 } 10788 if idx != x1.Args[1] { 10789 break 10790 } 10791 if mem != x1.Args[2] { 10792 break 10793 } 10794 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10795 break 10796 } 10797 b = mergePoint(b, x0, x1, x2) 10798 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10799 v.reset(OpCopy) 10800 v.AddArg(v0) 10801 v0.AuxInt = i0 10802 v0.Aux = s 10803 v0.AddArg(p) 10804 v0.AddArg(idx) 10805 v0.AddArg(mem) 10806 return true 10807 } 10808 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10809 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10810 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10811 for { 10812 s1 := v.Args[0] 10813 if s1.Op != Op386SHLLconst { 10814 break 10815 } 10816 if s1.AuxInt != 24 { 10817 break 10818 } 10819 x2 := s1.Args[0] 10820 if x2.Op != Op386MOVBloadidx1 { 10821 break 10822 } 10823 i3 := x2.AuxInt 10824 s := x2.Aux 10825 p := x2.Args[0] 10826 idx := x2.Args[1] 10827 mem := x2.Args[2] 10828 o0 := v.Args[1] 10829 if o0.Op != Op386ORL { 10830 break 10831 } 10832 x0 := o0.Args[0] 10833 if x0.Op != Op386MOVWloadidx1 { 10834 break 10835 } 10836 i0 := x0.AuxInt 10837 if x0.Aux != s { 10838 break 10839 } 10840 if idx != x0.Args[0] { 10841 break 10842 } 10843 if p != x0.Args[1] { 10844 break 10845 } 10846 if mem != x0.Args[2] { 10847 break 10848 } 10849 s0 := o0.Args[1] 10850 if s0.Op != Op386SHLLconst { 10851 break 10852 } 10853 if s0.AuxInt != 16 { 10854 break 10855 } 10856 x1 := s0.Args[0] 10857 if x1.Op != Op386MOVBloadidx1 { 10858 break 10859 } 10860 i2 := x1.AuxInt 10861 if x1.Aux != s { 10862 break 10863 } 10864 if p != x1.Args[0] { 10865 break 10866 } 10867 if idx != x1.Args[1] { 10868 break 10869 } 10870 if mem != x1.Args[2] { 10871 break 10872 } 10873 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10874 break 10875 } 10876 b = mergePoint(b, x0, x1, x2) 10877 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10878 v.reset(OpCopy) 10879 v.AddArg(v0) 10880 v0.AuxInt = i0 10881 v0.Aux = s 10882 v0.AddArg(p) 10883 v0.AddArg(idx) 10884 v0.AddArg(mem) 10885 return true 10886 } 10887 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) 10888 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10889 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10890 for { 10891 s1 := v.Args[0] 10892 if s1.Op != Op386SHLLconst { 10893 break 10894 } 10895 if s1.AuxInt != 24 { 10896 break 10897 } 10898 x2 := s1.Args[0] 10899 if x2.Op != Op386MOVBloadidx1 { 10900 break 10901 } 10902 i3 := x2.AuxInt 10903 s := x2.Aux 10904 idx := x2.Args[0] 10905 p := x2.Args[1] 10906 mem := x2.Args[2] 10907 o0 := v.Args[1] 10908 if o0.Op != Op386ORL { 10909 break 10910 } 10911 x0 := o0.Args[0] 10912 if x0.Op != Op386MOVWloadidx1 { 10913 break 10914 } 10915 i0 := x0.AuxInt 10916 if x0.Aux != s { 10917 break 10918 } 10919 if idx != x0.Args[0] { 10920 break 10921 } 10922 if p != x0.Args[1] { 10923 break 10924 } 10925 if mem != x0.Args[2] { 10926 break 10927 } 10928 s0 := o0.Args[1] 10929 if s0.Op != Op386SHLLconst { 10930 break 10931 } 10932 if s0.AuxInt != 16 { 10933 break 10934 } 10935 x1 := s0.Args[0] 10936 if x1.Op != Op386MOVBloadidx1 { 10937 break 10938 } 10939 i2 := x1.AuxInt 10940 if x1.Aux != s { 10941 break 10942 } 10943 if p != x1.Args[0] { 10944 break 10945 } 10946 if idx != x1.Args[1] { 10947 break 10948 } 10949 if mem != x1.Args[2] { 10950 break 10951 } 10952 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 10953 break 10954 } 10955 b = mergePoint(b, x0, x1, x2) 10956 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10957 v.reset(OpCopy) 10958 v.AddArg(v0) 10959 v0.AuxInt = i0 10960 v0.Aux = s 10961 v0.AddArg(p) 10962 v0.AddArg(idx) 10963 v0.AddArg(mem) 10964 return true 10965 } 10966 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 10967 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 10968 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10969 for { 10970 s1 := v.Args[0] 10971 if s1.Op != Op386SHLLconst { 10972 break 10973 } 10974 if s1.AuxInt != 24 { 10975 break 10976 } 10977 x2 := s1.Args[0] 10978 if x2.Op != Op386MOVBloadidx1 { 10979 break 10980 } 10981 i3 := x2.AuxInt 10982 s := x2.Aux 10983 p := x2.Args[0] 10984 idx := x2.Args[1] 10985 mem := x2.Args[2] 10986 o0 := v.Args[1] 10987 if o0.Op != Op386ORL { 10988 break 10989 } 10990 x0 := o0.Args[0] 10991 if x0.Op != Op386MOVWloadidx1 { 10992 break 10993 } 10994 i0 := x0.AuxInt 10995 if x0.Aux != s { 10996 break 10997 } 10998 if p != x0.Args[0] { 10999 break 11000 } 11001 if idx != x0.Args[1] { 11002 break 11003 } 11004 if mem != x0.Args[2] { 11005 break 11006 } 11007 s0 := o0.Args[1] 11008 if s0.Op != Op386SHLLconst { 11009 break 11010 } 11011 if s0.AuxInt != 16 { 11012 break 11013 } 11014 x1 := s0.Args[0] 11015 if x1.Op != Op386MOVBloadidx1 { 11016 break 11017 } 11018 i2 := x1.AuxInt 11019 if x1.Aux != s { 11020 break 11021 } 11022 if idx != x1.Args[0] { 11023 break 11024 } 11025 if p != x1.Args[1] { 11026 break 11027 } 11028 if mem != x1.Args[2] { 11029 break 11030 } 11031 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11032 break 11033 } 11034 b = mergePoint(b, x0, x1, x2) 11035 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11036 v.reset(OpCopy) 11037 v.AddArg(v0) 11038 v0.AuxInt = i0 11039 v0.Aux = s 11040 v0.AddArg(p) 11041 v0.AddArg(idx) 11042 v0.AddArg(mem) 11043 return true 11044 } 11045 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 11046 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11047 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11048 for { 11049 s1 := v.Args[0] 11050 if s1.Op != Op386SHLLconst { 11051 break 11052 } 11053 if s1.AuxInt != 24 { 11054 break 11055 } 11056 x2 := s1.Args[0] 11057 if x2.Op != Op386MOVBloadidx1 { 11058 break 11059 } 11060 i3 := x2.AuxInt 11061 s := x2.Aux 11062 idx := x2.Args[0] 11063 p := x2.Args[1] 11064 mem := x2.Args[2] 11065 o0 := v.Args[1] 11066 if o0.Op != Op386ORL { 11067 break 11068 } 11069 x0 := o0.Args[0] 11070 if x0.Op != Op386MOVWloadidx1 { 11071 break 11072 } 11073 i0 := x0.AuxInt 11074 if x0.Aux != s { 11075 break 11076 } 11077 if p != x0.Args[0] { 11078 break 11079 } 11080 if idx != x0.Args[1] { 11081 break 11082 } 11083 if mem != x0.Args[2] { 11084 break 11085 } 11086 s0 := o0.Args[1] 11087 if s0.Op != Op386SHLLconst { 11088 break 11089 } 11090 if s0.AuxInt != 16 { 11091 break 11092 } 11093 x1 := s0.Args[0] 11094 if x1.Op != Op386MOVBloadidx1 { 11095 break 11096 } 11097 i2 := x1.AuxInt 11098 if x1.Aux != s { 11099 break 11100 } 11101 if idx != x1.Args[0] { 11102 break 11103 } 11104 if p != x1.Args[1] { 11105 break 11106 } 11107 if mem != x1.Args[2] { 11108 break 11109 } 11110 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11111 break 11112 } 11113 b = mergePoint(b, x0, x1, x2) 11114 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11115 v.reset(OpCopy) 11116 v.AddArg(v0) 11117 v0.AuxInt = i0 11118 v0.Aux = s 11119 v0.AddArg(p) 11120 v0.AddArg(idx) 11121 v0.AddArg(mem) 11122 return true 11123 } 11124 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 11125 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11126 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11127 for { 11128 s1 := v.Args[0] 11129 if s1.Op != Op386SHLLconst { 11130 break 11131 } 11132 if s1.AuxInt != 24 { 11133 break 11134 } 11135 x2 := s1.Args[0] 11136 if x2.Op != Op386MOVBloadidx1 { 11137 break 11138 } 11139 i3 := x2.AuxInt 11140 s := x2.Aux 11141 p := x2.Args[0] 11142 idx := x2.Args[1] 11143 mem := x2.Args[2] 11144 o0 := v.Args[1] 11145 if o0.Op != Op386ORL { 11146 break 11147 } 11148 x0 := o0.Args[0] 11149 if x0.Op != Op386MOVWloadidx1 { 11150 break 11151 } 11152 i0 := x0.AuxInt 11153 if x0.Aux != s { 11154 break 11155 } 11156 if idx != x0.Args[0] { 11157 break 11158 } 11159 if p != x0.Args[1] { 11160 break 11161 } 11162 if mem != x0.Args[2] { 11163 break 11164 } 11165 s0 := o0.Args[1] 11166 if s0.Op != Op386SHLLconst { 11167 break 11168 } 11169 if s0.AuxInt != 16 { 11170 break 11171 } 11172 x1 := s0.Args[0] 11173 if x1.Op != Op386MOVBloadidx1 { 11174 break 11175 } 11176 i2 := x1.AuxInt 11177 if x1.Aux != s { 11178 break 11179 } 11180 if idx != x1.Args[0] { 11181 break 11182 } 11183 if p != x1.Args[1] { 11184 break 11185 } 11186 if mem != x1.Args[2] { 11187 break 11188 } 11189 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11190 break 11191 } 11192 b = mergePoint(b, x0, x1, x2) 11193 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11194 v.reset(OpCopy) 11195 v.AddArg(v0) 11196 v0.AuxInt = i0 11197 v0.Aux = s 11198 v0.AddArg(p) 11199 v0.AddArg(idx) 11200 v0.AddArg(mem) 11201 return true 11202 } 11203 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) 11204 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11205 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11206 for { 11207 s1 := v.Args[0] 11208 if s1.Op != Op386SHLLconst { 11209 break 11210 } 11211 if s1.AuxInt != 24 { 11212 break 11213 } 11214 x2 := s1.Args[0] 11215 if x2.Op != Op386MOVBloadidx1 { 11216 break 11217 } 11218 i3 := x2.AuxInt 11219 s := x2.Aux 11220 idx := x2.Args[0] 11221 p := x2.Args[1] 11222 mem := x2.Args[2] 11223 o0 := v.Args[1] 11224 if o0.Op != Op386ORL { 11225 break 11226 } 11227 x0 := o0.Args[0] 11228 if x0.Op != Op386MOVWloadidx1 { 11229 break 11230 } 11231 i0 := x0.AuxInt 11232 if x0.Aux != s { 11233 break 11234 } 11235 if idx != x0.Args[0] { 11236 break 11237 } 11238 if p != x0.Args[1] { 11239 break 11240 } 11241 if mem != x0.Args[2] { 11242 break 11243 } 11244 s0 := o0.Args[1] 11245 if s0.Op != Op386SHLLconst { 11246 break 11247 } 11248 if s0.AuxInt != 16 { 11249 break 11250 } 11251 x1 := s0.Args[0] 11252 if x1.Op != Op386MOVBloadidx1 { 11253 break 11254 } 11255 i2 := x1.AuxInt 11256 if x1.Aux != s { 11257 break 11258 } 11259 if idx != x1.Args[0] { 11260 break 11261 } 11262 if p != x1.Args[1] { 11263 break 11264 } 11265 if mem != x1.Args[2] { 11266 break 11267 } 11268 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11269 break 11270 } 11271 b = mergePoint(b, x0, x1, x2) 11272 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11273 v.reset(OpCopy) 11274 v.AddArg(v0) 11275 v0.AuxInt = i0 11276 v0.Aux = s 11277 v0.AddArg(p) 11278 v0.AddArg(idx) 11279 v0.AddArg(mem) 11280 return true 11281 } 11282 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11283 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11284 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11285 for { 11286 s1 := v.Args[0] 11287 if s1.Op != Op386SHLLconst { 11288 break 11289 } 11290 if s1.AuxInt != 24 { 11291 break 11292 } 11293 x2 := s1.Args[0] 11294 if x2.Op != Op386MOVBloadidx1 { 11295 break 11296 } 11297 i3 := x2.AuxInt 11298 s := x2.Aux 11299 p := x2.Args[0] 11300 idx := x2.Args[1] 11301 mem := x2.Args[2] 11302 o0 := v.Args[1] 11303 if o0.Op != Op386ORL { 11304 break 11305 } 11306 s0 := o0.Args[0] 11307 if s0.Op != Op386SHLLconst { 11308 break 11309 } 11310 if s0.AuxInt != 16 { 11311 break 11312 } 11313 x1 := s0.Args[0] 11314 if x1.Op != Op386MOVBloadidx1 { 11315 break 11316 } 11317 i2 := x1.AuxInt 11318 if x1.Aux != s { 11319 break 11320 } 11321 if p != x1.Args[0] { 11322 break 11323 } 11324 if idx != x1.Args[1] { 11325 break 11326 } 11327 if mem != x1.Args[2] { 11328 break 11329 } 11330 x0 := o0.Args[1] 11331 if x0.Op != Op386MOVWloadidx1 { 11332 break 11333 } 11334 i0 := x0.AuxInt 11335 if x0.Aux != s { 11336 break 11337 } 11338 if p != x0.Args[0] { 11339 break 11340 } 11341 if idx != x0.Args[1] { 11342 break 11343 } 11344 if mem != x0.Args[2] { 11345 break 11346 } 11347 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11348 break 11349 } 11350 b = mergePoint(b, x0, x1, x2) 11351 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11352 v.reset(OpCopy) 11353 v.AddArg(v0) 11354 v0.AuxInt = i0 11355 v0.Aux = s 11356 v0.AddArg(p) 11357 v0.AddArg(idx) 11358 v0.AddArg(mem) 11359 return true 11360 } 11361 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11362 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11363 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11364 for { 11365 s1 := v.Args[0] 11366 if s1.Op != Op386SHLLconst { 11367 break 11368 } 11369 if s1.AuxInt != 24 { 11370 break 11371 } 11372 x2 := s1.Args[0] 11373 if x2.Op != Op386MOVBloadidx1 { 11374 break 11375 } 11376 i3 := x2.AuxInt 11377 s := x2.Aux 11378 idx := x2.Args[0] 11379 p := x2.Args[1] 11380 mem := x2.Args[2] 11381 o0 := v.Args[1] 11382 if o0.Op != Op386ORL { 11383 break 11384 } 11385 s0 := o0.Args[0] 11386 if s0.Op != Op386SHLLconst { 11387 break 11388 } 11389 if s0.AuxInt != 16 { 11390 break 11391 } 11392 x1 := s0.Args[0] 11393 if x1.Op != Op386MOVBloadidx1 { 11394 break 11395 } 11396 i2 := x1.AuxInt 11397 if x1.Aux != s { 11398 break 11399 } 11400 if p != x1.Args[0] { 11401 break 11402 } 11403 if idx != x1.Args[1] { 11404 break 11405 } 11406 if mem != x1.Args[2] { 11407 break 11408 } 11409 x0 := o0.Args[1] 11410 if x0.Op != Op386MOVWloadidx1 { 11411 break 11412 } 11413 i0 := x0.AuxInt 11414 if x0.Aux != s { 11415 break 11416 } 11417 if p != x0.Args[0] { 11418 break 11419 } 11420 if idx != x0.Args[1] { 11421 break 11422 } 11423 if mem != x0.Args[2] { 11424 break 11425 } 11426 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11427 break 11428 } 11429 b = mergePoint(b, x0, x1, x2) 11430 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11431 v.reset(OpCopy) 11432 v.AddArg(v0) 11433 v0.AuxInt = i0 11434 v0.Aux = s 11435 v0.AddArg(p) 11436 v0.AddArg(idx) 11437 v0.AddArg(mem) 11438 return true 11439 } 11440 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11441 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11442 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11443 for { 11444 s1 := v.Args[0] 11445 if s1.Op != Op386SHLLconst { 11446 break 11447 } 11448 if s1.AuxInt != 24 { 11449 break 11450 } 11451 x2 := s1.Args[0] 11452 if x2.Op != Op386MOVBloadidx1 { 11453 break 11454 } 11455 i3 := x2.AuxInt 11456 s := x2.Aux 11457 p := x2.Args[0] 11458 idx := x2.Args[1] 11459 mem := x2.Args[2] 11460 o0 := v.Args[1] 11461 if o0.Op != Op386ORL { 11462 break 11463 } 11464 s0 := o0.Args[0] 11465 if s0.Op != Op386SHLLconst { 11466 break 11467 } 11468 if s0.AuxInt != 16 { 11469 break 11470 } 11471 x1 := s0.Args[0] 11472 if x1.Op != Op386MOVBloadidx1 { 11473 break 11474 } 11475 i2 := x1.AuxInt 11476 if x1.Aux != s { 11477 break 11478 } 11479 if idx != x1.Args[0] { 11480 break 11481 } 11482 if p != x1.Args[1] { 11483 break 11484 } 11485 if mem != x1.Args[2] { 11486 break 11487 } 11488 x0 := o0.Args[1] 11489 if x0.Op != Op386MOVWloadidx1 { 11490 break 11491 } 11492 i0 := x0.AuxInt 11493 if x0.Aux != s { 11494 break 11495 } 11496 if p != x0.Args[0] { 11497 break 11498 } 11499 if idx != x0.Args[1] { 11500 break 11501 } 11502 if mem != x0.Args[2] { 11503 break 11504 } 11505 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11506 break 11507 } 11508 b = mergePoint(b, x0, x1, x2) 11509 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11510 v.reset(OpCopy) 11511 v.AddArg(v0) 11512 v0.AuxInt = i0 11513 v0.Aux = s 11514 v0.AddArg(p) 11515 v0.AddArg(idx) 11516 v0.AddArg(mem) 11517 return true 11518 } 11519 return false 11520 } 11521 func rewriteValue386_Op386ORL_50(v *Value) bool { 11522 b := v.Block 11523 _ = b 11524 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) 11525 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11526 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11527 for { 11528 s1 := v.Args[0] 11529 if s1.Op != Op386SHLLconst { 11530 break 11531 } 11532 if s1.AuxInt != 24 { 11533 break 11534 } 11535 x2 := s1.Args[0] 11536 if x2.Op != Op386MOVBloadidx1 { 11537 break 11538 } 11539 i3 := x2.AuxInt 11540 s := x2.Aux 11541 idx := x2.Args[0] 11542 p := x2.Args[1] 11543 mem := x2.Args[2] 11544 o0 := v.Args[1] 11545 if o0.Op != Op386ORL { 11546 break 11547 } 11548 s0 := o0.Args[0] 11549 if s0.Op != Op386SHLLconst { 11550 break 11551 } 11552 if s0.AuxInt != 16 { 11553 break 11554 } 11555 x1 := s0.Args[0] 11556 if x1.Op != Op386MOVBloadidx1 { 11557 break 11558 } 11559 i2 := x1.AuxInt 11560 if x1.Aux != s { 11561 break 11562 } 11563 if idx != x1.Args[0] { 11564 break 11565 } 11566 if p != x1.Args[1] { 11567 break 11568 } 11569 if mem != x1.Args[2] { 11570 break 11571 } 11572 x0 := o0.Args[1] 11573 if x0.Op != Op386MOVWloadidx1 { 11574 break 11575 } 11576 i0 := x0.AuxInt 11577 if x0.Aux != s { 11578 break 11579 } 11580 if p != x0.Args[0] { 11581 break 11582 } 11583 if idx != x0.Args[1] { 11584 break 11585 } 11586 if mem != x0.Args[2] { 11587 break 11588 } 11589 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11590 break 11591 } 11592 b = mergePoint(b, x0, x1, x2) 11593 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11594 v.reset(OpCopy) 11595 v.AddArg(v0) 11596 v0.AuxInt = i0 11597 v0.Aux = s 11598 v0.AddArg(p) 11599 v0.AddArg(idx) 11600 v0.AddArg(mem) 11601 return true 11602 } 11603 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11604 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11605 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11606 for { 11607 s1 := v.Args[0] 11608 if s1.Op != Op386SHLLconst { 11609 break 11610 } 11611 if s1.AuxInt != 24 { 11612 break 11613 } 11614 x2 := s1.Args[0] 11615 if x2.Op != Op386MOVBloadidx1 { 11616 break 11617 } 11618 i3 := x2.AuxInt 11619 s := x2.Aux 11620 p := x2.Args[0] 11621 idx := x2.Args[1] 11622 mem := x2.Args[2] 11623 o0 := v.Args[1] 11624 if o0.Op != Op386ORL { 11625 break 11626 } 11627 s0 := o0.Args[0] 11628 if s0.Op != Op386SHLLconst { 11629 break 11630 } 11631 if s0.AuxInt != 16 { 11632 break 11633 } 11634 x1 := s0.Args[0] 11635 if x1.Op != Op386MOVBloadidx1 { 11636 break 11637 } 11638 i2 := x1.AuxInt 11639 if x1.Aux != s { 11640 break 11641 } 11642 if p != x1.Args[0] { 11643 break 11644 } 11645 if idx != x1.Args[1] { 11646 break 11647 } 11648 if mem != x1.Args[2] { 11649 break 11650 } 11651 x0 := o0.Args[1] 11652 if x0.Op != Op386MOVWloadidx1 { 11653 break 11654 } 11655 i0 := x0.AuxInt 11656 if x0.Aux != s { 11657 break 11658 } 11659 if idx != x0.Args[0] { 11660 break 11661 } 11662 if p != x0.Args[1] { 11663 break 11664 } 11665 if mem != x0.Args[2] { 11666 break 11667 } 11668 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11669 break 11670 } 11671 b = mergePoint(b, x0, x1, x2) 11672 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11673 v.reset(OpCopy) 11674 v.AddArg(v0) 11675 v0.AuxInt = i0 11676 v0.Aux = s 11677 v0.AddArg(p) 11678 v0.AddArg(idx) 11679 v0.AddArg(mem) 11680 return true 11681 } 11682 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11683 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11684 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11685 for { 11686 s1 := v.Args[0] 11687 if s1.Op != Op386SHLLconst { 11688 break 11689 } 11690 if s1.AuxInt != 24 { 11691 break 11692 } 11693 x2 := s1.Args[0] 11694 if x2.Op != Op386MOVBloadidx1 { 11695 break 11696 } 11697 i3 := x2.AuxInt 11698 s := x2.Aux 11699 idx := x2.Args[0] 11700 p := x2.Args[1] 11701 mem := x2.Args[2] 11702 o0 := v.Args[1] 11703 if o0.Op != Op386ORL { 11704 break 11705 } 11706 s0 := o0.Args[0] 11707 if s0.Op != Op386SHLLconst { 11708 break 11709 } 11710 if s0.AuxInt != 16 { 11711 break 11712 } 11713 x1 := s0.Args[0] 11714 if x1.Op != Op386MOVBloadidx1 { 11715 break 11716 } 11717 i2 := x1.AuxInt 11718 if x1.Aux != s { 11719 break 11720 } 11721 if p != x1.Args[0] { 11722 break 11723 } 11724 if idx != x1.Args[1] { 11725 break 11726 } 11727 if mem != x1.Args[2] { 11728 break 11729 } 11730 x0 := o0.Args[1] 11731 if x0.Op != Op386MOVWloadidx1 { 11732 break 11733 } 11734 i0 := x0.AuxInt 11735 if x0.Aux != s { 11736 break 11737 } 11738 if idx != x0.Args[0] { 11739 break 11740 } 11741 if p != x0.Args[1] { 11742 break 11743 } 11744 if mem != x0.Args[2] { 11745 break 11746 } 11747 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11748 break 11749 } 11750 b = mergePoint(b, x0, x1, x2) 11751 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11752 v.reset(OpCopy) 11753 v.AddArg(v0) 11754 v0.AuxInt = i0 11755 v0.Aux = s 11756 v0.AddArg(p) 11757 v0.AddArg(idx) 11758 v0.AddArg(mem) 11759 return true 11760 } 11761 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11762 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11763 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11764 for { 11765 s1 := v.Args[0] 11766 if s1.Op != Op386SHLLconst { 11767 break 11768 } 11769 if s1.AuxInt != 24 { 11770 break 11771 } 11772 x2 := s1.Args[0] 11773 if x2.Op != Op386MOVBloadidx1 { 11774 break 11775 } 11776 i3 := x2.AuxInt 11777 s := x2.Aux 11778 p := x2.Args[0] 11779 idx := x2.Args[1] 11780 mem := x2.Args[2] 11781 o0 := v.Args[1] 11782 if o0.Op != Op386ORL { 11783 break 11784 } 11785 s0 := o0.Args[0] 11786 if s0.Op != Op386SHLLconst { 11787 break 11788 } 11789 if s0.AuxInt != 16 { 11790 break 11791 } 11792 x1 := s0.Args[0] 11793 if x1.Op != Op386MOVBloadidx1 { 11794 break 11795 } 11796 i2 := x1.AuxInt 11797 if x1.Aux != s { 11798 break 11799 } 11800 if idx != x1.Args[0] { 11801 break 11802 } 11803 if p != x1.Args[1] { 11804 break 11805 } 11806 if mem != x1.Args[2] { 11807 break 11808 } 11809 x0 := o0.Args[1] 11810 if x0.Op != Op386MOVWloadidx1 { 11811 break 11812 } 11813 i0 := x0.AuxInt 11814 if x0.Aux != s { 11815 break 11816 } 11817 if idx != x0.Args[0] { 11818 break 11819 } 11820 if p != x0.Args[1] { 11821 break 11822 } 11823 if mem != x0.Args[2] { 11824 break 11825 } 11826 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11827 break 11828 } 11829 b = mergePoint(b, x0, x1, x2) 11830 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11831 v.reset(OpCopy) 11832 v.AddArg(v0) 11833 v0.AuxInt = i0 11834 v0.Aux = s 11835 v0.AddArg(p) 11836 v0.AddArg(idx) 11837 v0.AddArg(mem) 11838 return true 11839 } 11840 // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) 11841 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 11842 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11843 for { 11844 s1 := v.Args[0] 11845 if s1.Op != Op386SHLLconst { 11846 break 11847 } 11848 if s1.AuxInt != 24 { 11849 break 11850 } 11851 x2 := s1.Args[0] 11852 if x2.Op != Op386MOVBloadidx1 { 11853 break 11854 } 11855 i3 := x2.AuxInt 11856 s := x2.Aux 11857 idx := x2.Args[0] 11858 p := x2.Args[1] 11859 mem := x2.Args[2] 11860 o0 := v.Args[1] 11861 if o0.Op != Op386ORL { 11862 break 11863 } 11864 s0 := o0.Args[0] 11865 if s0.Op != Op386SHLLconst { 11866 break 11867 } 11868 if s0.AuxInt != 16 { 11869 break 11870 } 11871 x1 := s0.Args[0] 11872 if x1.Op != Op386MOVBloadidx1 { 11873 break 11874 } 11875 i2 := x1.AuxInt 11876 if x1.Aux != s { 11877 break 11878 } 11879 if idx != x1.Args[0] { 11880 break 11881 } 11882 if p != x1.Args[1] { 11883 break 11884 } 11885 if mem != x1.Args[2] { 11886 break 11887 } 11888 x0 := o0.Args[1] 11889 if x0.Op != Op386MOVWloadidx1 { 11890 break 11891 } 11892 i0 := x0.AuxInt 11893 if x0.Aux != s { 11894 break 11895 } 11896 if idx != x0.Args[0] { 11897 break 11898 } 11899 if p != x0.Args[1] { 11900 break 11901 } 11902 if mem != x0.Args[2] { 11903 break 11904 } 11905 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 11906 break 11907 } 11908 b = mergePoint(b, x0, x1, x2) 11909 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11910 v.reset(OpCopy) 11911 v.AddArg(v0) 11912 v0.AuxInt = i0 11913 v0.Aux = s 11914 v0.AddArg(p) 11915 v0.AddArg(idx) 11916 v0.AddArg(mem) 11917 return true 11918 } 11919 return false 11920 } 11921 func rewriteValue386_Op386ORLconst_0(v *Value) bool { 11922 // match: (ORLconst [c] x) 11923 // cond: int32(c)==0 11924 // result: x 11925 for { 11926 c := v.AuxInt 11927 x := v.Args[0] 11928 if !(int32(c) == 0) { 11929 break 11930 } 11931 v.reset(OpCopy) 11932 v.Type = x.Type 11933 v.AddArg(x) 11934 return true 11935 } 11936 // match: (ORLconst [c] _) 11937 // cond: int32(c)==-1 11938 // result: (MOVLconst [-1]) 11939 for { 11940 c := v.AuxInt 11941 if !(int32(c) == -1) { 11942 break 11943 } 11944 v.reset(Op386MOVLconst) 11945 v.AuxInt = -1 11946 return true 11947 } 11948 // match: (ORLconst [c] (MOVLconst [d])) 11949 // cond: 11950 // result: (MOVLconst [c|d]) 11951 for { 11952 c := v.AuxInt 11953 v_0 := v.Args[0] 11954 if v_0.Op != Op386MOVLconst { 11955 break 11956 } 11957 d := v_0.AuxInt 11958 v.reset(Op386MOVLconst) 11959 v.AuxInt = c | d 11960 return true 11961 } 11962 return false 11963 } 11964 func rewriteValue386_Op386ROLBconst_0(v *Value) bool { 11965 // match: (ROLBconst [c] (ROLBconst [d] x)) 11966 // cond: 11967 // result: (ROLBconst [(c+d)& 7] x) 11968 for { 11969 c := v.AuxInt 11970 v_0 := v.Args[0] 11971 if v_0.Op != Op386ROLBconst { 11972 break 11973 } 11974 d := v_0.AuxInt 11975 x := v_0.Args[0] 11976 v.reset(Op386ROLBconst) 11977 v.AuxInt = (c + d) & 7 11978 v.AddArg(x) 11979 return true 11980 } 11981 // match: (ROLBconst [0] x) 11982 // cond: 11983 // result: x 11984 for { 11985 if v.AuxInt != 0 { 11986 break 11987 } 11988 x := v.Args[0] 11989 v.reset(OpCopy) 11990 v.Type = x.Type 11991 v.AddArg(x) 11992 return true 11993 } 11994 return false 11995 } 11996 func rewriteValue386_Op386ROLLconst_0(v *Value) bool { 11997 // match: (ROLLconst [c] (ROLLconst [d] x)) 11998 // cond: 11999 // result: (ROLLconst [(c+d)&31] x) 12000 for { 12001 c := v.AuxInt 12002 v_0 := v.Args[0] 12003 if v_0.Op != Op386ROLLconst { 12004 break 12005 } 12006 d := v_0.AuxInt 12007 x := v_0.Args[0] 12008 v.reset(Op386ROLLconst) 12009 v.AuxInt = (c + d) & 31 12010 v.AddArg(x) 12011 return true 12012 } 12013 // match: (ROLLconst [0] x) 12014 // cond: 12015 // result: x 12016 for { 12017 if v.AuxInt != 0 { 12018 break 12019 } 12020 x := v.Args[0] 12021 v.reset(OpCopy) 12022 v.Type = x.Type 12023 v.AddArg(x) 12024 return true 12025 } 12026 return false 12027 } 12028 func rewriteValue386_Op386ROLWconst_0(v *Value) bool { 12029 // match: (ROLWconst [c] (ROLWconst [d] x)) 12030 // cond: 12031 // result: (ROLWconst [(c+d)&15] x) 12032 for { 12033 c := v.AuxInt 12034 v_0 := v.Args[0] 12035 if v_0.Op != Op386ROLWconst { 12036 break 12037 } 12038 d := v_0.AuxInt 12039 x := v_0.Args[0] 12040 v.reset(Op386ROLWconst) 12041 v.AuxInt = (c + d) & 15 12042 v.AddArg(x) 12043 return true 12044 } 12045 // match: (ROLWconst [0] x) 12046 // cond: 12047 // result: x 12048 for { 12049 if v.AuxInt != 0 { 12050 break 12051 } 12052 x := v.Args[0] 12053 v.reset(OpCopy) 12054 v.Type = x.Type 12055 v.AddArg(x) 12056 return true 12057 } 12058 return false 12059 } 12060 func rewriteValue386_Op386SARB_0(v *Value) bool { 12061 // match: (SARB x (MOVLconst [c])) 12062 // cond: 12063 // result: (SARBconst [min(c&31,7)] x) 12064 for { 12065 x := v.Args[0] 12066 v_1 := v.Args[1] 12067 if v_1.Op != Op386MOVLconst { 12068 break 12069 } 12070 c := v_1.AuxInt 12071 v.reset(Op386SARBconst) 12072 v.AuxInt = min(c&31, 7) 12073 v.AddArg(x) 12074 return true 12075 } 12076 return false 12077 } 12078 func rewriteValue386_Op386SARBconst_0(v *Value) bool { 12079 // match: (SARBconst x [0]) 12080 // cond: 12081 // result: x 12082 for { 12083 if v.AuxInt != 0 { 12084 break 12085 } 12086 x := v.Args[0] 12087 v.reset(OpCopy) 12088 v.Type = x.Type 12089 v.AddArg(x) 12090 return true 12091 } 12092 // match: (SARBconst [c] (MOVLconst [d])) 12093 // cond: 12094 // result: (MOVLconst [d>>uint64(c)]) 12095 for { 12096 c := v.AuxInt 12097 v_0 := v.Args[0] 12098 if v_0.Op != Op386MOVLconst { 12099 break 12100 } 12101 d := v_0.AuxInt 12102 v.reset(Op386MOVLconst) 12103 v.AuxInt = d >> uint64(c) 12104 return true 12105 } 12106 return false 12107 } 12108 func rewriteValue386_Op386SARL_0(v *Value) bool { 12109 // match: (SARL x (MOVLconst [c])) 12110 // cond: 12111 // result: (SARLconst [c&31] x) 12112 for { 12113 x := v.Args[0] 12114 v_1 := v.Args[1] 12115 if v_1.Op != Op386MOVLconst { 12116 break 12117 } 12118 c := v_1.AuxInt 12119 v.reset(Op386SARLconst) 12120 v.AuxInt = c & 31 12121 v.AddArg(x) 12122 return true 12123 } 12124 // match: (SARL x (ANDLconst [31] y)) 12125 // cond: 12126 // result: (SARL x y) 12127 for { 12128 x := v.Args[0] 12129 v_1 := v.Args[1] 12130 if v_1.Op != Op386ANDLconst { 12131 break 12132 } 12133 if v_1.AuxInt != 31 { 12134 break 12135 } 12136 y := v_1.Args[0] 12137 v.reset(Op386SARL) 12138 v.AddArg(x) 12139 v.AddArg(y) 12140 return true 12141 } 12142 return false 12143 } 12144 func rewriteValue386_Op386SARLconst_0(v *Value) bool { 12145 // match: (SARLconst x [0]) 12146 // cond: 12147 // result: x 12148 for { 12149 if v.AuxInt != 0 { 12150 break 12151 } 12152 x := v.Args[0] 12153 v.reset(OpCopy) 12154 v.Type = x.Type 12155 v.AddArg(x) 12156 return true 12157 } 12158 // match: (SARLconst [c] (MOVLconst [d])) 12159 // cond: 12160 // result: (MOVLconst [d>>uint64(c)]) 12161 for { 12162 c := v.AuxInt 12163 v_0 := v.Args[0] 12164 if v_0.Op != Op386MOVLconst { 12165 break 12166 } 12167 d := v_0.AuxInt 12168 v.reset(Op386MOVLconst) 12169 v.AuxInt = d >> uint64(c) 12170 return true 12171 } 12172 return false 12173 } 12174 func rewriteValue386_Op386SARW_0(v *Value) bool { 12175 // match: (SARW x (MOVLconst [c])) 12176 // cond: 12177 // result: (SARWconst [min(c&31,15)] x) 12178 for { 12179 x := v.Args[0] 12180 v_1 := v.Args[1] 12181 if v_1.Op != Op386MOVLconst { 12182 break 12183 } 12184 c := v_1.AuxInt 12185 v.reset(Op386SARWconst) 12186 v.AuxInt = min(c&31, 15) 12187 v.AddArg(x) 12188 return true 12189 } 12190 return false 12191 } 12192 func rewriteValue386_Op386SARWconst_0(v *Value) bool { 12193 // match: (SARWconst x [0]) 12194 // cond: 12195 // result: x 12196 for { 12197 if v.AuxInt != 0 { 12198 break 12199 } 12200 x := v.Args[0] 12201 v.reset(OpCopy) 12202 v.Type = x.Type 12203 v.AddArg(x) 12204 return true 12205 } 12206 // match: (SARWconst [c] (MOVLconst [d])) 12207 // cond: 12208 // result: (MOVLconst [d>>uint64(c)]) 12209 for { 12210 c := v.AuxInt 12211 v_0 := v.Args[0] 12212 if v_0.Op != Op386MOVLconst { 12213 break 12214 } 12215 d := v_0.AuxInt 12216 v.reset(Op386MOVLconst) 12217 v.AuxInt = d >> uint64(c) 12218 return true 12219 } 12220 return false 12221 } 12222 func rewriteValue386_Op386SBBL_0(v *Value) bool { 12223 // match: (SBBL x (MOVLconst [c]) f) 12224 // cond: 12225 // result: (SBBLconst [c] x f) 12226 for { 12227 x := v.Args[0] 12228 v_1 := v.Args[1] 12229 if v_1.Op != Op386MOVLconst { 12230 break 12231 } 12232 c := v_1.AuxInt 12233 f := v.Args[2] 12234 v.reset(Op386SBBLconst) 12235 v.AuxInt = c 12236 v.AddArg(x) 12237 v.AddArg(f) 12238 return true 12239 } 12240 return false 12241 } 12242 func rewriteValue386_Op386SBBLcarrymask_0(v *Value) bool { 12243 // match: (SBBLcarrymask (FlagEQ)) 12244 // cond: 12245 // result: (MOVLconst [0]) 12246 for { 12247 v_0 := v.Args[0] 12248 if v_0.Op != Op386FlagEQ { 12249 break 12250 } 12251 v.reset(Op386MOVLconst) 12252 v.AuxInt = 0 12253 return true 12254 } 12255 // match: (SBBLcarrymask (FlagLT_ULT)) 12256 // cond: 12257 // result: (MOVLconst [-1]) 12258 for { 12259 v_0 := v.Args[0] 12260 if v_0.Op != Op386FlagLT_ULT { 12261 break 12262 } 12263 v.reset(Op386MOVLconst) 12264 v.AuxInt = -1 12265 return true 12266 } 12267 // match: (SBBLcarrymask (FlagLT_UGT)) 12268 // cond: 12269 // result: (MOVLconst [0]) 12270 for { 12271 v_0 := v.Args[0] 12272 if v_0.Op != Op386FlagLT_UGT { 12273 break 12274 } 12275 v.reset(Op386MOVLconst) 12276 v.AuxInt = 0 12277 return true 12278 } 12279 // match: (SBBLcarrymask (FlagGT_ULT)) 12280 // cond: 12281 // result: (MOVLconst [-1]) 12282 for { 12283 v_0 := v.Args[0] 12284 if v_0.Op != Op386FlagGT_ULT { 12285 break 12286 } 12287 v.reset(Op386MOVLconst) 12288 v.AuxInt = -1 12289 return true 12290 } 12291 // match: (SBBLcarrymask (FlagGT_UGT)) 12292 // cond: 12293 // result: (MOVLconst [0]) 12294 for { 12295 v_0 := v.Args[0] 12296 if v_0.Op != Op386FlagGT_UGT { 12297 break 12298 } 12299 v.reset(Op386MOVLconst) 12300 v.AuxInt = 0 12301 return true 12302 } 12303 return false 12304 } 12305 func rewriteValue386_Op386SETA_0(v *Value) bool { 12306 // match: (SETA (InvertFlags x)) 12307 // cond: 12308 // result: (SETB x) 12309 for { 12310 v_0 := v.Args[0] 12311 if v_0.Op != Op386InvertFlags { 12312 break 12313 } 12314 x := v_0.Args[0] 12315 v.reset(Op386SETB) 12316 v.AddArg(x) 12317 return true 12318 } 12319 // match: (SETA (FlagEQ)) 12320 // cond: 12321 // result: (MOVLconst [0]) 12322 for { 12323 v_0 := v.Args[0] 12324 if v_0.Op != Op386FlagEQ { 12325 break 12326 } 12327 v.reset(Op386MOVLconst) 12328 v.AuxInt = 0 12329 return true 12330 } 12331 // match: (SETA (FlagLT_ULT)) 12332 // cond: 12333 // result: (MOVLconst [0]) 12334 for { 12335 v_0 := v.Args[0] 12336 if v_0.Op != Op386FlagLT_ULT { 12337 break 12338 } 12339 v.reset(Op386MOVLconst) 12340 v.AuxInt = 0 12341 return true 12342 } 12343 // match: (SETA (FlagLT_UGT)) 12344 // cond: 12345 // result: (MOVLconst [1]) 12346 for { 12347 v_0 := v.Args[0] 12348 if v_0.Op != Op386FlagLT_UGT { 12349 break 12350 } 12351 v.reset(Op386MOVLconst) 12352 v.AuxInt = 1 12353 return true 12354 } 12355 // match: (SETA (FlagGT_ULT)) 12356 // cond: 12357 // result: (MOVLconst [0]) 12358 for { 12359 v_0 := v.Args[0] 12360 if v_0.Op != Op386FlagGT_ULT { 12361 break 12362 } 12363 v.reset(Op386MOVLconst) 12364 v.AuxInt = 0 12365 return true 12366 } 12367 // match: (SETA (FlagGT_UGT)) 12368 // cond: 12369 // result: (MOVLconst [1]) 12370 for { 12371 v_0 := v.Args[0] 12372 if v_0.Op != Op386FlagGT_UGT { 12373 break 12374 } 12375 v.reset(Op386MOVLconst) 12376 v.AuxInt = 1 12377 return true 12378 } 12379 return false 12380 } 12381 func rewriteValue386_Op386SETAE_0(v *Value) bool { 12382 // match: (SETAE (InvertFlags x)) 12383 // cond: 12384 // result: (SETBE x) 12385 for { 12386 v_0 := v.Args[0] 12387 if v_0.Op != Op386InvertFlags { 12388 break 12389 } 12390 x := v_0.Args[0] 12391 v.reset(Op386SETBE) 12392 v.AddArg(x) 12393 return true 12394 } 12395 // match: (SETAE (FlagEQ)) 12396 // cond: 12397 // result: (MOVLconst [1]) 12398 for { 12399 v_0 := v.Args[0] 12400 if v_0.Op != Op386FlagEQ { 12401 break 12402 } 12403 v.reset(Op386MOVLconst) 12404 v.AuxInt = 1 12405 return true 12406 } 12407 // match: (SETAE (FlagLT_ULT)) 12408 // cond: 12409 // result: (MOVLconst [0]) 12410 for { 12411 v_0 := v.Args[0] 12412 if v_0.Op != Op386FlagLT_ULT { 12413 break 12414 } 12415 v.reset(Op386MOVLconst) 12416 v.AuxInt = 0 12417 return true 12418 } 12419 // match: (SETAE (FlagLT_UGT)) 12420 // cond: 12421 // result: (MOVLconst [1]) 12422 for { 12423 v_0 := v.Args[0] 12424 if v_0.Op != Op386FlagLT_UGT { 12425 break 12426 } 12427 v.reset(Op386MOVLconst) 12428 v.AuxInt = 1 12429 return true 12430 } 12431 // match: (SETAE (FlagGT_ULT)) 12432 // cond: 12433 // result: (MOVLconst [0]) 12434 for { 12435 v_0 := v.Args[0] 12436 if v_0.Op != Op386FlagGT_ULT { 12437 break 12438 } 12439 v.reset(Op386MOVLconst) 12440 v.AuxInt = 0 12441 return true 12442 } 12443 // match: (SETAE (FlagGT_UGT)) 12444 // cond: 12445 // result: (MOVLconst [1]) 12446 for { 12447 v_0 := v.Args[0] 12448 if v_0.Op != Op386FlagGT_UGT { 12449 break 12450 } 12451 v.reset(Op386MOVLconst) 12452 v.AuxInt = 1 12453 return true 12454 } 12455 return false 12456 } 12457 func rewriteValue386_Op386SETB_0(v *Value) bool { 12458 // match: (SETB (InvertFlags x)) 12459 // cond: 12460 // result: (SETA x) 12461 for { 12462 v_0 := v.Args[0] 12463 if v_0.Op != Op386InvertFlags { 12464 break 12465 } 12466 x := v_0.Args[0] 12467 v.reset(Op386SETA) 12468 v.AddArg(x) 12469 return true 12470 } 12471 // match: (SETB (FlagEQ)) 12472 // cond: 12473 // result: (MOVLconst [0]) 12474 for { 12475 v_0 := v.Args[0] 12476 if v_0.Op != Op386FlagEQ { 12477 break 12478 } 12479 v.reset(Op386MOVLconst) 12480 v.AuxInt = 0 12481 return true 12482 } 12483 // match: (SETB (FlagLT_ULT)) 12484 // cond: 12485 // result: (MOVLconst [1]) 12486 for { 12487 v_0 := v.Args[0] 12488 if v_0.Op != Op386FlagLT_ULT { 12489 break 12490 } 12491 v.reset(Op386MOVLconst) 12492 v.AuxInt = 1 12493 return true 12494 } 12495 // match: (SETB (FlagLT_UGT)) 12496 // cond: 12497 // result: (MOVLconst [0]) 12498 for { 12499 v_0 := v.Args[0] 12500 if v_0.Op != Op386FlagLT_UGT { 12501 break 12502 } 12503 v.reset(Op386MOVLconst) 12504 v.AuxInt = 0 12505 return true 12506 } 12507 // match: (SETB (FlagGT_ULT)) 12508 // cond: 12509 // result: (MOVLconst [1]) 12510 for { 12511 v_0 := v.Args[0] 12512 if v_0.Op != Op386FlagGT_ULT { 12513 break 12514 } 12515 v.reset(Op386MOVLconst) 12516 v.AuxInt = 1 12517 return true 12518 } 12519 // match: (SETB (FlagGT_UGT)) 12520 // cond: 12521 // result: (MOVLconst [0]) 12522 for { 12523 v_0 := v.Args[0] 12524 if v_0.Op != Op386FlagGT_UGT { 12525 break 12526 } 12527 v.reset(Op386MOVLconst) 12528 v.AuxInt = 0 12529 return true 12530 } 12531 return false 12532 } 12533 func rewriteValue386_Op386SETBE_0(v *Value) bool { 12534 // match: (SETBE (InvertFlags x)) 12535 // cond: 12536 // result: (SETAE x) 12537 for { 12538 v_0 := v.Args[0] 12539 if v_0.Op != Op386InvertFlags { 12540 break 12541 } 12542 x := v_0.Args[0] 12543 v.reset(Op386SETAE) 12544 v.AddArg(x) 12545 return true 12546 } 12547 // match: (SETBE (FlagEQ)) 12548 // cond: 12549 // result: (MOVLconst [1]) 12550 for { 12551 v_0 := v.Args[0] 12552 if v_0.Op != Op386FlagEQ { 12553 break 12554 } 12555 v.reset(Op386MOVLconst) 12556 v.AuxInt = 1 12557 return true 12558 } 12559 // match: (SETBE (FlagLT_ULT)) 12560 // cond: 12561 // result: (MOVLconst [1]) 12562 for { 12563 v_0 := v.Args[0] 12564 if v_0.Op != Op386FlagLT_ULT { 12565 break 12566 } 12567 v.reset(Op386MOVLconst) 12568 v.AuxInt = 1 12569 return true 12570 } 12571 // match: (SETBE (FlagLT_UGT)) 12572 // cond: 12573 // result: (MOVLconst [0]) 12574 for { 12575 v_0 := v.Args[0] 12576 if v_0.Op != Op386FlagLT_UGT { 12577 break 12578 } 12579 v.reset(Op386MOVLconst) 12580 v.AuxInt = 0 12581 return true 12582 } 12583 // match: (SETBE (FlagGT_ULT)) 12584 // cond: 12585 // result: (MOVLconst [1]) 12586 for { 12587 v_0 := v.Args[0] 12588 if v_0.Op != Op386FlagGT_ULT { 12589 break 12590 } 12591 v.reset(Op386MOVLconst) 12592 v.AuxInt = 1 12593 return true 12594 } 12595 // match: (SETBE (FlagGT_UGT)) 12596 // cond: 12597 // result: (MOVLconst [0]) 12598 for { 12599 v_0 := v.Args[0] 12600 if v_0.Op != Op386FlagGT_UGT { 12601 break 12602 } 12603 v.reset(Op386MOVLconst) 12604 v.AuxInt = 0 12605 return true 12606 } 12607 return false 12608 } 12609 func rewriteValue386_Op386SETEQ_0(v *Value) bool { 12610 // match: (SETEQ (InvertFlags x)) 12611 // cond: 12612 // result: (SETEQ x) 12613 for { 12614 v_0 := v.Args[0] 12615 if v_0.Op != Op386InvertFlags { 12616 break 12617 } 12618 x := v_0.Args[0] 12619 v.reset(Op386SETEQ) 12620 v.AddArg(x) 12621 return true 12622 } 12623 // match: (SETEQ (FlagEQ)) 12624 // cond: 12625 // result: (MOVLconst [1]) 12626 for { 12627 v_0 := v.Args[0] 12628 if v_0.Op != Op386FlagEQ { 12629 break 12630 } 12631 v.reset(Op386MOVLconst) 12632 v.AuxInt = 1 12633 return true 12634 } 12635 // match: (SETEQ (FlagLT_ULT)) 12636 // cond: 12637 // result: (MOVLconst [0]) 12638 for { 12639 v_0 := v.Args[0] 12640 if v_0.Op != Op386FlagLT_ULT { 12641 break 12642 } 12643 v.reset(Op386MOVLconst) 12644 v.AuxInt = 0 12645 return true 12646 } 12647 // match: (SETEQ (FlagLT_UGT)) 12648 // cond: 12649 // result: (MOVLconst [0]) 12650 for { 12651 v_0 := v.Args[0] 12652 if v_0.Op != Op386FlagLT_UGT { 12653 break 12654 } 12655 v.reset(Op386MOVLconst) 12656 v.AuxInt = 0 12657 return true 12658 } 12659 // match: (SETEQ (FlagGT_ULT)) 12660 // cond: 12661 // result: (MOVLconst [0]) 12662 for { 12663 v_0 := v.Args[0] 12664 if v_0.Op != Op386FlagGT_ULT { 12665 break 12666 } 12667 v.reset(Op386MOVLconst) 12668 v.AuxInt = 0 12669 return true 12670 } 12671 // match: (SETEQ (FlagGT_UGT)) 12672 // cond: 12673 // result: (MOVLconst [0]) 12674 for { 12675 v_0 := v.Args[0] 12676 if v_0.Op != Op386FlagGT_UGT { 12677 break 12678 } 12679 v.reset(Op386MOVLconst) 12680 v.AuxInt = 0 12681 return true 12682 } 12683 return false 12684 } 12685 func rewriteValue386_Op386SETG_0(v *Value) bool { 12686 // match: (SETG (InvertFlags x)) 12687 // cond: 12688 // result: (SETL x) 12689 for { 12690 v_0 := v.Args[0] 12691 if v_0.Op != Op386InvertFlags { 12692 break 12693 } 12694 x := v_0.Args[0] 12695 v.reset(Op386SETL) 12696 v.AddArg(x) 12697 return true 12698 } 12699 // match: (SETG (FlagEQ)) 12700 // cond: 12701 // result: (MOVLconst [0]) 12702 for { 12703 v_0 := v.Args[0] 12704 if v_0.Op != Op386FlagEQ { 12705 break 12706 } 12707 v.reset(Op386MOVLconst) 12708 v.AuxInt = 0 12709 return true 12710 } 12711 // match: (SETG (FlagLT_ULT)) 12712 // cond: 12713 // result: (MOVLconst [0]) 12714 for { 12715 v_0 := v.Args[0] 12716 if v_0.Op != Op386FlagLT_ULT { 12717 break 12718 } 12719 v.reset(Op386MOVLconst) 12720 v.AuxInt = 0 12721 return true 12722 } 12723 // match: (SETG (FlagLT_UGT)) 12724 // cond: 12725 // result: (MOVLconst [0]) 12726 for { 12727 v_0 := v.Args[0] 12728 if v_0.Op != Op386FlagLT_UGT { 12729 break 12730 } 12731 v.reset(Op386MOVLconst) 12732 v.AuxInt = 0 12733 return true 12734 } 12735 // match: (SETG (FlagGT_ULT)) 12736 // cond: 12737 // result: (MOVLconst [1]) 12738 for { 12739 v_0 := v.Args[0] 12740 if v_0.Op != Op386FlagGT_ULT { 12741 break 12742 } 12743 v.reset(Op386MOVLconst) 12744 v.AuxInt = 1 12745 return true 12746 } 12747 // match: (SETG (FlagGT_UGT)) 12748 // cond: 12749 // result: (MOVLconst [1]) 12750 for { 12751 v_0 := v.Args[0] 12752 if v_0.Op != Op386FlagGT_UGT { 12753 break 12754 } 12755 v.reset(Op386MOVLconst) 12756 v.AuxInt = 1 12757 return true 12758 } 12759 return false 12760 } 12761 func rewriteValue386_Op386SETGE_0(v *Value) bool { 12762 // match: (SETGE (InvertFlags x)) 12763 // cond: 12764 // result: (SETLE x) 12765 for { 12766 v_0 := v.Args[0] 12767 if v_0.Op != Op386InvertFlags { 12768 break 12769 } 12770 x := v_0.Args[0] 12771 v.reset(Op386SETLE) 12772 v.AddArg(x) 12773 return true 12774 } 12775 // match: (SETGE (FlagEQ)) 12776 // cond: 12777 // result: (MOVLconst [1]) 12778 for { 12779 v_0 := v.Args[0] 12780 if v_0.Op != Op386FlagEQ { 12781 break 12782 } 12783 v.reset(Op386MOVLconst) 12784 v.AuxInt = 1 12785 return true 12786 } 12787 // match: (SETGE (FlagLT_ULT)) 12788 // cond: 12789 // result: (MOVLconst [0]) 12790 for { 12791 v_0 := v.Args[0] 12792 if v_0.Op != Op386FlagLT_ULT { 12793 break 12794 } 12795 v.reset(Op386MOVLconst) 12796 v.AuxInt = 0 12797 return true 12798 } 12799 // match: (SETGE (FlagLT_UGT)) 12800 // cond: 12801 // result: (MOVLconst [0]) 12802 for { 12803 v_0 := v.Args[0] 12804 if v_0.Op != Op386FlagLT_UGT { 12805 break 12806 } 12807 v.reset(Op386MOVLconst) 12808 v.AuxInt = 0 12809 return true 12810 } 12811 // match: (SETGE (FlagGT_ULT)) 12812 // cond: 12813 // result: (MOVLconst [1]) 12814 for { 12815 v_0 := v.Args[0] 12816 if v_0.Op != Op386FlagGT_ULT { 12817 break 12818 } 12819 v.reset(Op386MOVLconst) 12820 v.AuxInt = 1 12821 return true 12822 } 12823 // match: (SETGE (FlagGT_UGT)) 12824 // cond: 12825 // result: (MOVLconst [1]) 12826 for { 12827 v_0 := v.Args[0] 12828 if v_0.Op != Op386FlagGT_UGT { 12829 break 12830 } 12831 v.reset(Op386MOVLconst) 12832 v.AuxInt = 1 12833 return true 12834 } 12835 return false 12836 } 12837 func rewriteValue386_Op386SETL_0(v *Value) bool { 12838 // match: (SETL (InvertFlags x)) 12839 // cond: 12840 // result: (SETG x) 12841 for { 12842 v_0 := v.Args[0] 12843 if v_0.Op != Op386InvertFlags { 12844 break 12845 } 12846 x := v_0.Args[0] 12847 v.reset(Op386SETG) 12848 v.AddArg(x) 12849 return true 12850 } 12851 // match: (SETL (FlagEQ)) 12852 // cond: 12853 // result: (MOVLconst [0]) 12854 for { 12855 v_0 := v.Args[0] 12856 if v_0.Op != Op386FlagEQ { 12857 break 12858 } 12859 v.reset(Op386MOVLconst) 12860 v.AuxInt = 0 12861 return true 12862 } 12863 // match: (SETL (FlagLT_ULT)) 12864 // cond: 12865 // result: (MOVLconst [1]) 12866 for { 12867 v_0 := v.Args[0] 12868 if v_0.Op != Op386FlagLT_ULT { 12869 break 12870 } 12871 v.reset(Op386MOVLconst) 12872 v.AuxInt = 1 12873 return true 12874 } 12875 // match: (SETL (FlagLT_UGT)) 12876 // cond: 12877 // result: (MOVLconst [1]) 12878 for { 12879 v_0 := v.Args[0] 12880 if v_0.Op != Op386FlagLT_UGT { 12881 break 12882 } 12883 v.reset(Op386MOVLconst) 12884 v.AuxInt = 1 12885 return true 12886 } 12887 // match: (SETL (FlagGT_ULT)) 12888 // cond: 12889 // result: (MOVLconst [0]) 12890 for { 12891 v_0 := v.Args[0] 12892 if v_0.Op != Op386FlagGT_ULT { 12893 break 12894 } 12895 v.reset(Op386MOVLconst) 12896 v.AuxInt = 0 12897 return true 12898 } 12899 // match: (SETL (FlagGT_UGT)) 12900 // cond: 12901 // result: (MOVLconst [0]) 12902 for { 12903 v_0 := v.Args[0] 12904 if v_0.Op != Op386FlagGT_UGT { 12905 break 12906 } 12907 v.reset(Op386MOVLconst) 12908 v.AuxInt = 0 12909 return true 12910 } 12911 return false 12912 } 12913 func rewriteValue386_Op386SETLE_0(v *Value) bool { 12914 // match: (SETLE (InvertFlags x)) 12915 // cond: 12916 // result: (SETGE x) 12917 for { 12918 v_0 := v.Args[0] 12919 if v_0.Op != Op386InvertFlags { 12920 break 12921 } 12922 x := v_0.Args[0] 12923 v.reset(Op386SETGE) 12924 v.AddArg(x) 12925 return true 12926 } 12927 // match: (SETLE (FlagEQ)) 12928 // cond: 12929 // result: (MOVLconst [1]) 12930 for { 12931 v_0 := v.Args[0] 12932 if v_0.Op != Op386FlagEQ { 12933 break 12934 } 12935 v.reset(Op386MOVLconst) 12936 v.AuxInt = 1 12937 return true 12938 } 12939 // match: (SETLE (FlagLT_ULT)) 12940 // cond: 12941 // result: (MOVLconst [1]) 12942 for { 12943 v_0 := v.Args[0] 12944 if v_0.Op != Op386FlagLT_ULT { 12945 break 12946 } 12947 v.reset(Op386MOVLconst) 12948 v.AuxInt = 1 12949 return true 12950 } 12951 // match: (SETLE (FlagLT_UGT)) 12952 // cond: 12953 // result: (MOVLconst [1]) 12954 for { 12955 v_0 := v.Args[0] 12956 if v_0.Op != Op386FlagLT_UGT { 12957 break 12958 } 12959 v.reset(Op386MOVLconst) 12960 v.AuxInt = 1 12961 return true 12962 } 12963 // match: (SETLE (FlagGT_ULT)) 12964 // cond: 12965 // result: (MOVLconst [0]) 12966 for { 12967 v_0 := v.Args[0] 12968 if v_0.Op != Op386FlagGT_ULT { 12969 break 12970 } 12971 v.reset(Op386MOVLconst) 12972 v.AuxInt = 0 12973 return true 12974 } 12975 // match: (SETLE (FlagGT_UGT)) 12976 // cond: 12977 // result: (MOVLconst [0]) 12978 for { 12979 v_0 := v.Args[0] 12980 if v_0.Op != Op386FlagGT_UGT { 12981 break 12982 } 12983 v.reset(Op386MOVLconst) 12984 v.AuxInt = 0 12985 return true 12986 } 12987 return false 12988 } 12989 func rewriteValue386_Op386SETNE_0(v *Value) bool { 12990 // match: (SETNE (InvertFlags x)) 12991 // cond: 12992 // result: (SETNE x) 12993 for { 12994 v_0 := v.Args[0] 12995 if v_0.Op != Op386InvertFlags { 12996 break 12997 } 12998 x := v_0.Args[0] 12999 v.reset(Op386SETNE) 13000 v.AddArg(x) 13001 return true 13002 } 13003 // match: (SETNE (FlagEQ)) 13004 // cond: 13005 // result: (MOVLconst [0]) 13006 for { 13007 v_0 := v.Args[0] 13008 if v_0.Op != Op386FlagEQ { 13009 break 13010 } 13011 v.reset(Op386MOVLconst) 13012 v.AuxInt = 0 13013 return true 13014 } 13015 // match: (SETNE (FlagLT_ULT)) 13016 // cond: 13017 // result: (MOVLconst [1]) 13018 for { 13019 v_0 := v.Args[0] 13020 if v_0.Op != Op386FlagLT_ULT { 13021 break 13022 } 13023 v.reset(Op386MOVLconst) 13024 v.AuxInt = 1 13025 return true 13026 } 13027 // match: (SETNE (FlagLT_UGT)) 13028 // cond: 13029 // result: (MOVLconst [1]) 13030 for { 13031 v_0 := v.Args[0] 13032 if v_0.Op != Op386FlagLT_UGT { 13033 break 13034 } 13035 v.reset(Op386MOVLconst) 13036 v.AuxInt = 1 13037 return true 13038 } 13039 // match: (SETNE (FlagGT_ULT)) 13040 // cond: 13041 // result: (MOVLconst [1]) 13042 for { 13043 v_0 := v.Args[0] 13044 if v_0.Op != Op386FlagGT_ULT { 13045 break 13046 } 13047 v.reset(Op386MOVLconst) 13048 v.AuxInt = 1 13049 return true 13050 } 13051 // match: (SETNE (FlagGT_UGT)) 13052 // cond: 13053 // result: (MOVLconst [1]) 13054 for { 13055 v_0 := v.Args[0] 13056 if v_0.Op != Op386FlagGT_UGT { 13057 break 13058 } 13059 v.reset(Op386MOVLconst) 13060 v.AuxInt = 1 13061 return true 13062 } 13063 return false 13064 } 13065 func rewriteValue386_Op386SHLL_0(v *Value) bool { 13066 // match: (SHLL x (MOVLconst [c])) 13067 // cond: 13068 // result: (SHLLconst [c&31] x) 13069 for { 13070 x := v.Args[0] 13071 v_1 := v.Args[1] 13072 if v_1.Op != Op386MOVLconst { 13073 break 13074 } 13075 c := v_1.AuxInt 13076 v.reset(Op386SHLLconst) 13077 v.AuxInt = c & 31 13078 v.AddArg(x) 13079 return true 13080 } 13081 // match: (SHLL x (ANDLconst [31] y)) 13082 // cond: 13083 // result: (SHLL x y) 13084 for { 13085 x := v.Args[0] 13086 v_1 := v.Args[1] 13087 if v_1.Op != Op386ANDLconst { 13088 break 13089 } 13090 if v_1.AuxInt != 31 { 13091 break 13092 } 13093 y := v_1.Args[0] 13094 v.reset(Op386SHLL) 13095 v.AddArg(x) 13096 v.AddArg(y) 13097 return true 13098 } 13099 return false 13100 } 13101 func rewriteValue386_Op386SHLLconst_0(v *Value) bool { 13102 // match: (SHLLconst x [0]) 13103 // cond: 13104 // result: x 13105 for { 13106 if v.AuxInt != 0 { 13107 break 13108 } 13109 x := v.Args[0] 13110 v.reset(OpCopy) 13111 v.Type = x.Type 13112 v.AddArg(x) 13113 return true 13114 } 13115 return false 13116 } 13117 func rewriteValue386_Op386SHRB_0(v *Value) bool { 13118 // match: (SHRB x (MOVLconst [c])) 13119 // cond: c&31 < 8 13120 // result: (SHRBconst [c&31] x) 13121 for { 13122 x := v.Args[0] 13123 v_1 := v.Args[1] 13124 if v_1.Op != Op386MOVLconst { 13125 break 13126 } 13127 c := v_1.AuxInt 13128 if !(c&31 < 8) { 13129 break 13130 } 13131 v.reset(Op386SHRBconst) 13132 v.AuxInt = c & 31 13133 v.AddArg(x) 13134 return true 13135 } 13136 // match: (SHRB _ (MOVLconst [c])) 13137 // cond: c&31 >= 8 13138 // result: (MOVLconst [0]) 13139 for { 13140 v_1 := v.Args[1] 13141 if v_1.Op != Op386MOVLconst { 13142 break 13143 } 13144 c := v_1.AuxInt 13145 if !(c&31 >= 8) { 13146 break 13147 } 13148 v.reset(Op386MOVLconst) 13149 v.AuxInt = 0 13150 return true 13151 } 13152 return false 13153 } 13154 func rewriteValue386_Op386SHRBconst_0(v *Value) bool { 13155 // match: (SHRBconst x [0]) 13156 // cond: 13157 // result: x 13158 for { 13159 if v.AuxInt != 0 { 13160 break 13161 } 13162 x := v.Args[0] 13163 v.reset(OpCopy) 13164 v.Type = x.Type 13165 v.AddArg(x) 13166 return true 13167 } 13168 return false 13169 } 13170 func rewriteValue386_Op386SHRL_0(v *Value) bool { 13171 // match: (SHRL x (MOVLconst [c])) 13172 // cond: 13173 // result: (SHRLconst [c&31] x) 13174 for { 13175 x := v.Args[0] 13176 v_1 := v.Args[1] 13177 if v_1.Op != Op386MOVLconst { 13178 break 13179 } 13180 c := v_1.AuxInt 13181 v.reset(Op386SHRLconst) 13182 v.AuxInt = c & 31 13183 v.AddArg(x) 13184 return true 13185 } 13186 // match: (SHRL x (ANDLconst [31] y)) 13187 // cond: 13188 // result: (SHRL x y) 13189 for { 13190 x := v.Args[0] 13191 v_1 := v.Args[1] 13192 if v_1.Op != Op386ANDLconst { 13193 break 13194 } 13195 if v_1.AuxInt != 31 { 13196 break 13197 } 13198 y := v_1.Args[0] 13199 v.reset(Op386SHRL) 13200 v.AddArg(x) 13201 v.AddArg(y) 13202 return true 13203 } 13204 return false 13205 } 13206 func rewriteValue386_Op386SHRLconst_0(v *Value) bool { 13207 // match: (SHRLconst x [0]) 13208 // cond: 13209 // result: x 13210 for { 13211 if v.AuxInt != 0 { 13212 break 13213 } 13214 x := v.Args[0] 13215 v.reset(OpCopy) 13216 v.Type = x.Type 13217 v.AddArg(x) 13218 return true 13219 } 13220 return false 13221 } 13222 func rewriteValue386_Op386SHRW_0(v *Value) bool { 13223 // match: (SHRW x (MOVLconst [c])) 13224 // cond: c&31 < 16 13225 // result: (SHRWconst [c&31] x) 13226 for { 13227 x := v.Args[0] 13228 v_1 := v.Args[1] 13229 if v_1.Op != Op386MOVLconst { 13230 break 13231 } 13232 c := v_1.AuxInt 13233 if !(c&31 < 16) { 13234 break 13235 } 13236 v.reset(Op386SHRWconst) 13237 v.AuxInt = c & 31 13238 v.AddArg(x) 13239 return true 13240 } 13241 // match: (SHRW _ (MOVLconst [c])) 13242 // cond: c&31 >= 16 13243 // result: (MOVLconst [0]) 13244 for { 13245 v_1 := v.Args[1] 13246 if v_1.Op != Op386MOVLconst { 13247 break 13248 } 13249 c := v_1.AuxInt 13250 if !(c&31 >= 16) { 13251 break 13252 } 13253 v.reset(Op386MOVLconst) 13254 v.AuxInt = 0 13255 return true 13256 } 13257 return false 13258 } 13259 func rewriteValue386_Op386SHRWconst_0(v *Value) bool { 13260 // match: (SHRWconst x [0]) 13261 // cond: 13262 // result: x 13263 for { 13264 if v.AuxInt != 0 { 13265 break 13266 } 13267 x := v.Args[0] 13268 v.reset(OpCopy) 13269 v.Type = x.Type 13270 v.AddArg(x) 13271 return true 13272 } 13273 return false 13274 } 13275 func rewriteValue386_Op386SUBL_0(v *Value) bool { 13276 b := v.Block 13277 _ = b 13278 // match: (SUBL x (MOVLconst [c])) 13279 // cond: 13280 // result: (SUBLconst x [c]) 13281 for { 13282 x := v.Args[0] 13283 v_1 := v.Args[1] 13284 if v_1.Op != Op386MOVLconst { 13285 break 13286 } 13287 c := v_1.AuxInt 13288 v.reset(Op386SUBLconst) 13289 v.AuxInt = c 13290 v.AddArg(x) 13291 return true 13292 } 13293 // match: (SUBL (MOVLconst [c]) x) 13294 // cond: 13295 // result: (NEGL (SUBLconst <v.Type> x [c])) 13296 for { 13297 v_0 := v.Args[0] 13298 if v_0.Op != Op386MOVLconst { 13299 break 13300 } 13301 c := v_0.AuxInt 13302 x := v.Args[1] 13303 v.reset(Op386NEGL) 13304 v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) 13305 v0.AuxInt = c 13306 v0.AddArg(x) 13307 v.AddArg(v0) 13308 return true 13309 } 13310 // match: (SUBL x x) 13311 // cond: 13312 // result: (MOVLconst [0]) 13313 for { 13314 x := v.Args[0] 13315 if x != v.Args[1] { 13316 break 13317 } 13318 v.reset(Op386MOVLconst) 13319 v.AuxInt = 0 13320 return true 13321 } 13322 return false 13323 } 13324 func rewriteValue386_Op386SUBLcarry_0(v *Value) bool { 13325 // match: (SUBLcarry x (MOVLconst [c])) 13326 // cond: 13327 // result: (SUBLconstcarry [c] x) 13328 for { 13329 x := v.Args[0] 13330 v_1 := v.Args[1] 13331 if v_1.Op != Op386MOVLconst { 13332 break 13333 } 13334 c := v_1.AuxInt 13335 v.reset(Op386SUBLconstcarry) 13336 v.AuxInt = c 13337 v.AddArg(x) 13338 return true 13339 } 13340 return false 13341 } 13342 func rewriteValue386_Op386SUBLconst_0(v *Value) bool { 13343 // match: (SUBLconst [c] x) 13344 // cond: int32(c) == 0 13345 // result: x 13346 for { 13347 c := v.AuxInt 13348 x := v.Args[0] 13349 if !(int32(c) == 0) { 13350 break 13351 } 13352 v.reset(OpCopy) 13353 v.Type = x.Type 13354 v.AddArg(x) 13355 return true 13356 } 13357 // match: (SUBLconst [c] x) 13358 // cond: 13359 // result: (ADDLconst [int64(int32(-c))] x) 13360 for { 13361 c := v.AuxInt 13362 x := v.Args[0] 13363 v.reset(Op386ADDLconst) 13364 v.AuxInt = int64(int32(-c)) 13365 v.AddArg(x) 13366 return true 13367 } 13368 } 13369 func rewriteValue386_Op386XORL_0(v *Value) bool { 13370 // match: (XORL x (MOVLconst [c])) 13371 // cond: 13372 // result: (XORLconst [c] x) 13373 for { 13374 x := v.Args[0] 13375 v_1 := v.Args[1] 13376 if v_1.Op != Op386MOVLconst { 13377 break 13378 } 13379 c := v_1.AuxInt 13380 v.reset(Op386XORLconst) 13381 v.AuxInt = c 13382 v.AddArg(x) 13383 return true 13384 } 13385 // match: (XORL (MOVLconst [c]) x) 13386 // cond: 13387 // result: (XORLconst [c] x) 13388 for { 13389 v_0 := v.Args[0] 13390 if v_0.Op != Op386MOVLconst { 13391 break 13392 } 13393 c := v_0.AuxInt 13394 x := v.Args[1] 13395 v.reset(Op386XORLconst) 13396 v.AuxInt = c 13397 v.AddArg(x) 13398 return true 13399 } 13400 // match: (XORL (SHLLconst [c] x) (SHRLconst [d] x)) 13401 // cond: d == 32-c 13402 // result: (ROLLconst [c] x) 13403 for { 13404 v_0 := v.Args[0] 13405 if v_0.Op != Op386SHLLconst { 13406 break 13407 } 13408 c := v_0.AuxInt 13409 x := v_0.Args[0] 13410 v_1 := v.Args[1] 13411 if v_1.Op != Op386SHRLconst { 13412 break 13413 } 13414 d := v_1.AuxInt 13415 if x != v_1.Args[0] { 13416 break 13417 } 13418 if !(d == 32-c) { 13419 break 13420 } 13421 v.reset(Op386ROLLconst) 13422 v.AuxInt = c 13423 v.AddArg(x) 13424 return true 13425 } 13426 // match: (XORL (SHRLconst [d] x) (SHLLconst [c] x)) 13427 // cond: d == 32-c 13428 // result: (ROLLconst [c] x) 13429 for { 13430 v_0 := v.Args[0] 13431 if v_0.Op != Op386SHRLconst { 13432 break 13433 } 13434 d := v_0.AuxInt 13435 x := v_0.Args[0] 13436 v_1 := v.Args[1] 13437 if v_1.Op != Op386SHLLconst { 13438 break 13439 } 13440 c := v_1.AuxInt 13441 if x != v_1.Args[0] { 13442 break 13443 } 13444 if !(d == 32-c) { 13445 break 13446 } 13447 v.reset(Op386ROLLconst) 13448 v.AuxInt = c 13449 v.AddArg(x) 13450 return true 13451 } 13452 // match: (XORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 13453 // cond: c < 16 && d == 16-c && t.Size() == 2 13454 // result: (ROLWconst x [c]) 13455 for { 13456 t := v.Type 13457 v_0 := v.Args[0] 13458 if v_0.Op != Op386SHLLconst { 13459 break 13460 } 13461 c := v_0.AuxInt 13462 x := v_0.Args[0] 13463 v_1 := v.Args[1] 13464 if v_1.Op != Op386SHRWconst { 13465 break 13466 } 13467 d := v_1.AuxInt 13468 if x != v_1.Args[0] { 13469 break 13470 } 13471 if !(c < 16 && d == 16-c && t.Size() == 2) { 13472 break 13473 } 13474 v.reset(Op386ROLWconst) 13475 v.AuxInt = c 13476 v.AddArg(x) 13477 return true 13478 } 13479 // match: (XORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 13480 // cond: c < 16 && d == 16-c && t.Size() == 2 13481 // result: (ROLWconst x [c]) 13482 for { 13483 t := v.Type 13484 v_0 := v.Args[0] 13485 if v_0.Op != Op386SHRWconst { 13486 break 13487 } 13488 d := v_0.AuxInt 13489 x := v_0.Args[0] 13490 v_1 := v.Args[1] 13491 if v_1.Op != Op386SHLLconst { 13492 break 13493 } 13494 c := v_1.AuxInt 13495 if x != v_1.Args[0] { 13496 break 13497 } 13498 if !(c < 16 && d == 16-c && t.Size() == 2) { 13499 break 13500 } 13501 v.reset(Op386ROLWconst) 13502 v.AuxInt = c 13503 v.AddArg(x) 13504 return true 13505 } 13506 // match: (XORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 13507 // cond: c < 8 && d == 8-c && t.Size() == 1 13508 // result: (ROLBconst x [c]) 13509 for { 13510 t := v.Type 13511 v_0 := v.Args[0] 13512 if v_0.Op != Op386SHLLconst { 13513 break 13514 } 13515 c := v_0.AuxInt 13516 x := v_0.Args[0] 13517 v_1 := v.Args[1] 13518 if v_1.Op != Op386SHRBconst { 13519 break 13520 } 13521 d := v_1.AuxInt 13522 if x != v_1.Args[0] { 13523 break 13524 } 13525 if !(c < 8 && d == 8-c && t.Size() == 1) { 13526 break 13527 } 13528 v.reset(Op386ROLBconst) 13529 v.AuxInt = c 13530 v.AddArg(x) 13531 return true 13532 } 13533 // match: (XORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 13534 // cond: c < 8 && d == 8-c && t.Size() == 1 13535 // result: (ROLBconst x [c]) 13536 for { 13537 t := v.Type 13538 v_0 := v.Args[0] 13539 if v_0.Op != Op386SHRBconst { 13540 break 13541 } 13542 d := v_0.AuxInt 13543 x := v_0.Args[0] 13544 v_1 := v.Args[1] 13545 if v_1.Op != Op386SHLLconst { 13546 break 13547 } 13548 c := v_1.AuxInt 13549 if x != v_1.Args[0] { 13550 break 13551 } 13552 if !(c < 8 && d == 8-c && t.Size() == 1) { 13553 break 13554 } 13555 v.reset(Op386ROLBconst) 13556 v.AuxInt = c 13557 v.AddArg(x) 13558 return true 13559 } 13560 // match: (XORL x x) 13561 // cond: 13562 // result: (MOVLconst [0]) 13563 for { 13564 x := v.Args[0] 13565 if x != v.Args[1] { 13566 break 13567 } 13568 v.reset(Op386MOVLconst) 13569 v.AuxInt = 0 13570 return true 13571 } 13572 return false 13573 } 13574 func rewriteValue386_Op386XORLconst_0(v *Value) bool { 13575 // match: (XORLconst [c] (XORLconst [d] x)) 13576 // cond: 13577 // result: (XORLconst [c ^ d] x) 13578 for { 13579 c := v.AuxInt 13580 v_0 := v.Args[0] 13581 if v_0.Op != Op386XORLconst { 13582 break 13583 } 13584 d := v_0.AuxInt 13585 x := v_0.Args[0] 13586 v.reset(Op386XORLconst) 13587 v.AuxInt = c ^ d 13588 v.AddArg(x) 13589 return true 13590 } 13591 // match: (XORLconst [c] x) 13592 // cond: int32(c)==0 13593 // result: x 13594 for { 13595 c := v.AuxInt 13596 x := v.Args[0] 13597 if !(int32(c) == 0) { 13598 break 13599 } 13600 v.reset(OpCopy) 13601 v.Type = x.Type 13602 v.AddArg(x) 13603 return true 13604 } 13605 // match: (XORLconst [c] (MOVLconst [d])) 13606 // cond: 13607 // result: (MOVLconst [c^d]) 13608 for { 13609 c := v.AuxInt 13610 v_0 := v.Args[0] 13611 if v_0.Op != Op386MOVLconst { 13612 break 13613 } 13614 d := v_0.AuxInt 13615 v.reset(Op386MOVLconst) 13616 v.AuxInt = c ^ d 13617 return true 13618 } 13619 return false 13620 } 13621 func rewriteValue386_OpAdd16_0(v *Value) bool { 13622 // match: (Add16 x y) 13623 // cond: 13624 // result: (ADDL x y) 13625 for { 13626 x := v.Args[0] 13627 y := v.Args[1] 13628 v.reset(Op386ADDL) 13629 v.AddArg(x) 13630 v.AddArg(y) 13631 return true 13632 } 13633 } 13634 func rewriteValue386_OpAdd32_0(v *Value) bool { 13635 // match: (Add32 x y) 13636 // cond: 13637 // result: (ADDL x y) 13638 for { 13639 x := v.Args[0] 13640 y := v.Args[1] 13641 v.reset(Op386ADDL) 13642 v.AddArg(x) 13643 v.AddArg(y) 13644 return true 13645 } 13646 } 13647 func rewriteValue386_OpAdd32F_0(v *Value) bool { 13648 // match: (Add32F x y) 13649 // cond: 13650 // result: (ADDSS x y) 13651 for { 13652 x := v.Args[0] 13653 y := v.Args[1] 13654 v.reset(Op386ADDSS) 13655 v.AddArg(x) 13656 v.AddArg(y) 13657 return true 13658 } 13659 } 13660 func rewriteValue386_OpAdd32carry_0(v *Value) bool { 13661 // match: (Add32carry x y) 13662 // cond: 13663 // result: (ADDLcarry x y) 13664 for { 13665 x := v.Args[0] 13666 y := v.Args[1] 13667 v.reset(Op386ADDLcarry) 13668 v.AddArg(x) 13669 v.AddArg(y) 13670 return true 13671 } 13672 } 13673 func rewriteValue386_OpAdd32withcarry_0(v *Value) bool { 13674 // match: (Add32withcarry x y c) 13675 // cond: 13676 // result: (ADCL x y c) 13677 for { 13678 x := v.Args[0] 13679 y := v.Args[1] 13680 c := v.Args[2] 13681 v.reset(Op386ADCL) 13682 v.AddArg(x) 13683 v.AddArg(y) 13684 v.AddArg(c) 13685 return true 13686 } 13687 } 13688 func rewriteValue386_OpAdd64F_0(v *Value) bool { 13689 // match: (Add64F x y) 13690 // cond: 13691 // result: (ADDSD x y) 13692 for { 13693 x := v.Args[0] 13694 y := v.Args[1] 13695 v.reset(Op386ADDSD) 13696 v.AddArg(x) 13697 v.AddArg(y) 13698 return true 13699 } 13700 } 13701 func rewriteValue386_OpAdd8_0(v *Value) bool { 13702 // match: (Add8 x y) 13703 // cond: 13704 // result: (ADDL x y) 13705 for { 13706 x := v.Args[0] 13707 y := v.Args[1] 13708 v.reset(Op386ADDL) 13709 v.AddArg(x) 13710 v.AddArg(y) 13711 return true 13712 } 13713 } 13714 func rewriteValue386_OpAddPtr_0(v *Value) bool { 13715 // match: (AddPtr x y) 13716 // cond: 13717 // result: (ADDL x y) 13718 for { 13719 x := v.Args[0] 13720 y := v.Args[1] 13721 v.reset(Op386ADDL) 13722 v.AddArg(x) 13723 v.AddArg(y) 13724 return true 13725 } 13726 } 13727 func rewriteValue386_OpAddr_0(v *Value) bool { 13728 // match: (Addr {sym} base) 13729 // cond: 13730 // result: (LEAL {sym} base) 13731 for { 13732 sym := v.Aux 13733 base := v.Args[0] 13734 v.reset(Op386LEAL) 13735 v.Aux = sym 13736 v.AddArg(base) 13737 return true 13738 } 13739 } 13740 func rewriteValue386_OpAnd16_0(v *Value) bool { 13741 // match: (And16 x y) 13742 // cond: 13743 // result: (ANDL x y) 13744 for { 13745 x := v.Args[0] 13746 y := v.Args[1] 13747 v.reset(Op386ANDL) 13748 v.AddArg(x) 13749 v.AddArg(y) 13750 return true 13751 } 13752 } 13753 func rewriteValue386_OpAnd32_0(v *Value) bool { 13754 // match: (And32 x y) 13755 // cond: 13756 // result: (ANDL x y) 13757 for { 13758 x := v.Args[0] 13759 y := v.Args[1] 13760 v.reset(Op386ANDL) 13761 v.AddArg(x) 13762 v.AddArg(y) 13763 return true 13764 } 13765 } 13766 func rewriteValue386_OpAnd8_0(v *Value) bool { 13767 // match: (And8 x y) 13768 // cond: 13769 // result: (ANDL x y) 13770 for { 13771 x := v.Args[0] 13772 y := v.Args[1] 13773 v.reset(Op386ANDL) 13774 v.AddArg(x) 13775 v.AddArg(y) 13776 return true 13777 } 13778 } 13779 func rewriteValue386_OpAndB_0(v *Value) bool { 13780 // match: (AndB x y) 13781 // cond: 13782 // result: (ANDL x y) 13783 for { 13784 x := v.Args[0] 13785 y := v.Args[1] 13786 v.reset(Op386ANDL) 13787 v.AddArg(x) 13788 v.AddArg(y) 13789 return true 13790 } 13791 } 13792 func rewriteValue386_OpAvg32u_0(v *Value) bool { 13793 // match: (Avg32u x y) 13794 // cond: 13795 // result: (AVGLU x y) 13796 for { 13797 x := v.Args[0] 13798 y := v.Args[1] 13799 v.reset(Op386AVGLU) 13800 v.AddArg(x) 13801 v.AddArg(y) 13802 return true 13803 } 13804 } 13805 func rewriteValue386_OpBswap32_0(v *Value) bool { 13806 // match: (Bswap32 x) 13807 // cond: 13808 // result: (BSWAPL x) 13809 for { 13810 x := v.Args[0] 13811 v.reset(Op386BSWAPL) 13812 v.AddArg(x) 13813 return true 13814 } 13815 } 13816 func rewriteValue386_OpClosureCall_0(v *Value) bool { 13817 // match: (ClosureCall [argwid] entry closure mem) 13818 // cond: 13819 // result: (CALLclosure [argwid] entry closure mem) 13820 for { 13821 argwid := v.AuxInt 13822 entry := v.Args[0] 13823 closure := v.Args[1] 13824 mem := v.Args[2] 13825 v.reset(Op386CALLclosure) 13826 v.AuxInt = argwid 13827 v.AddArg(entry) 13828 v.AddArg(closure) 13829 v.AddArg(mem) 13830 return true 13831 } 13832 } 13833 func rewriteValue386_OpCom16_0(v *Value) bool { 13834 // match: (Com16 x) 13835 // cond: 13836 // result: (NOTL x) 13837 for { 13838 x := v.Args[0] 13839 v.reset(Op386NOTL) 13840 v.AddArg(x) 13841 return true 13842 } 13843 } 13844 func rewriteValue386_OpCom32_0(v *Value) bool { 13845 // match: (Com32 x) 13846 // cond: 13847 // result: (NOTL x) 13848 for { 13849 x := v.Args[0] 13850 v.reset(Op386NOTL) 13851 v.AddArg(x) 13852 return true 13853 } 13854 } 13855 func rewriteValue386_OpCom8_0(v *Value) bool { 13856 // match: (Com8 x) 13857 // cond: 13858 // result: (NOTL x) 13859 for { 13860 x := v.Args[0] 13861 v.reset(Op386NOTL) 13862 v.AddArg(x) 13863 return true 13864 } 13865 } 13866 func rewriteValue386_OpConst16_0(v *Value) bool { 13867 // match: (Const16 [val]) 13868 // cond: 13869 // result: (MOVLconst [val]) 13870 for { 13871 val := v.AuxInt 13872 v.reset(Op386MOVLconst) 13873 v.AuxInt = val 13874 return true 13875 } 13876 } 13877 func rewriteValue386_OpConst32_0(v *Value) bool { 13878 // match: (Const32 [val]) 13879 // cond: 13880 // result: (MOVLconst [val]) 13881 for { 13882 val := v.AuxInt 13883 v.reset(Op386MOVLconst) 13884 v.AuxInt = val 13885 return true 13886 } 13887 } 13888 func rewriteValue386_OpConst32F_0(v *Value) bool { 13889 // match: (Const32F [val]) 13890 // cond: 13891 // result: (MOVSSconst [val]) 13892 for { 13893 val := v.AuxInt 13894 v.reset(Op386MOVSSconst) 13895 v.AuxInt = val 13896 return true 13897 } 13898 } 13899 func rewriteValue386_OpConst64F_0(v *Value) bool { 13900 // match: (Const64F [val]) 13901 // cond: 13902 // result: (MOVSDconst [val]) 13903 for { 13904 val := v.AuxInt 13905 v.reset(Op386MOVSDconst) 13906 v.AuxInt = val 13907 return true 13908 } 13909 } 13910 func rewriteValue386_OpConst8_0(v *Value) bool { 13911 // match: (Const8 [val]) 13912 // cond: 13913 // result: (MOVLconst [val]) 13914 for { 13915 val := v.AuxInt 13916 v.reset(Op386MOVLconst) 13917 v.AuxInt = val 13918 return true 13919 } 13920 } 13921 func rewriteValue386_OpConstBool_0(v *Value) bool { 13922 // match: (ConstBool [b]) 13923 // cond: 13924 // result: (MOVLconst [b]) 13925 for { 13926 b := v.AuxInt 13927 v.reset(Op386MOVLconst) 13928 v.AuxInt = b 13929 return true 13930 } 13931 } 13932 func rewriteValue386_OpConstNil_0(v *Value) bool { 13933 // match: (ConstNil) 13934 // cond: 13935 // result: (MOVLconst [0]) 13936 for { 13937 v.reset(Op386MOVLconst) 13938 v.AuxInt = 0 13939 return true 13940 } 13941 } 13942 func rewriteValue386_OpConvert_0(v *Value) bool { 13943 // match: (Convert <t> x mem) 13944 // cond: 13945 // result: (MOVLconvert <t> x mem) 13946 for { 13947 t := v.Type 13948 x := v.Args[0] 13949 mem := v.Args[1] 13950 v.reset(Op386MOVLconvert) 13951 v.Type = t 13952 v.AddArg(x) 13953 v.AddArg(mem) 13954 return true 13955 } 13956 } 13957 func rewriteValue386_OpCvt32Fto32_0(v *Value) bool { 13958 // match: (Cvt32Fto32 x) 13959 // cond: 13960 // result: (CVTTSS2SL x) 13961 for { 13962 x := v.Args[0] 13963 v.reset(Op386CVTTSS2SL) 13964 v.AddArg(x) 13965 return true 13966 } 13967 } 13968 func rewriteValue386_OpCvt32Fto64F_0(v *Value) bool { 13969 // match: (Cvt32Fto64F x) 13970 // cond: 13971 // result: (CVTSS2SD x) 13972 for { 13973 x := v.Args[0] 13974 v.reset(Op386CVTSS2SD) 13975 v.AddArg(x) 13976 return true 13977 } 13978 } 13979 func rewriteValue386_OpCvt32to32F_0(v *Value) bool { 13980 // match: (Cvt32to32F x) 13981 // cond: 13982 // result: (CVTSL2SS x) 13983 for { 13984 x := v.Args[0] 13985 v.reset(Op386CVTSL2SS) 13986 v.AddArg(x) 13987 return true 13988 } 13989 } 13990 func rewriteValue386_OpCvt32to64F_0(v *Value) bool { 13991 // match: (Cvt32to64F x) 13992 // cond: 13993 // result: (CVTSL2SD x) 13994 for { 13995 x := v.Args[0] 13996 v.reset(Op386CVTSL2SD) 13997 v.AddArg(x) 13998 return true 13999 } 14000 } 14001 func rewriteValue386_OpCvt64Fto32_0(v *Value) bool { 14002 // match: (Cvt64Fto32 x) 14003 // cond: 14004 // result: (CVTTSD2SL x) 14005 for { 14006 x := v.Args[0] 14007 v.reset(Op386CVTTSD2SL) 14008 v.AddArg(x) 14009 return true 14010 } 14011 } 14012 func rewriteValue386_OpCvt64Fto32F_0(v *Value) bool { 14013 // match: (Cvt64Fto32F x) 14014 // cond: 14015 // result: (CVTSD2SS x) 14016 for { 14017 x := v.Args[0] 14018 v.reset(Op386CVTSD2SS) 14019 v.AddArg(x) 14020 return true 14021 } 14022 } 14023 func rewriteValue386_OpDiv16_0(v *Value) bool { 14024 // match: (Div16 x y) 14025 // cond: 14026 // result: (DIVW x y) 14027 for { 14028 x := v.Args[0] 14029 y := v.Args[1] 14030 v.reset(Op386DIVW) 14031 v.AddArg(x) 14032 v.AddArg(y) 14033 return true 14034 } 14035 } 14036 func rewriteValue386_OpDiv16u_0(v *Value) bool { 14037 // match: (Div16u x y) 14038 // cond: 14039 // result: (DIVWU x y) 14040 for { 14041 x := v.Args[0] 14042 y := v.Args[1] 14043 v.reset(Op386DIVWU) 14044 v.AddArg(x) 14045 v.AddArg(y) 14046 return true 14047 } 14048 } 14049 func rewriteValue386_OpDiv32_0(v *Value) bool { 14050 // match: (Div32 x y) 14051 // cond: 14052 // result: (DIVL x y) 14053 for { 14054 x := v.Args[0] 14055 y := v.Args[1] 14056 v.reset(Op386DIVL) 14057 v.AddArg(x) 14058 v.AddArg(y) 14059 return true 14060 } 14061 } 14062 func rewriteValue386_OpDiv32F_0(v *Value) bool { 14063 // match: (Div32F x y) 14064 // cond: 14065 // result: (DIVSS x y) 14066 for { 14067 x := v.Args[0] 14068 y := v.Args[1] 14069 v.reset(Op386DIVSS) 14070 v.AddArg(x) 14071 v.AddArg(y) 14072 return true 14073 } 14074 } 14075 func rewriteValue386_OpDiv32u_0(v *Value) bool { 14076 // match: (Div32u x y) 14077 // cond: 14078 // result: (DIVLU x y) 14079 for { 14080 x := v.Args[0] 14081 y := v.Args[1] 14082 v.reset(Op386DIVLU) 14083 v.AddArg(x) 14084 v.AddArg(y) 14085 return true 14086 } 14087 } 14088 func rewriteValue386_OpDiv64F_0(v *Value) bool { 14089 // match: (Div64F x y) 14090 // cond: 14091 // result: (DIVSD x y) 14092 for { 14093 x := v.Args[0] 14094 y := v.Args[1] 14095 v.reset(Op386DIVSD) 14096 v.AddArg(x) 14097 v.AddArg(y) 14098 return true 14099 } 14100 } 14101 func rewriteValue386_OpDiv8_0(v *Value) bool { 14102 b := v.Block 14103 _ = b 14104 types := &b.Func.Config.Types 14105 _ = types 14106 // match: (Div8 x y) 14107 // cond: 14108 // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) 14109 for { 14110 x := v.Args[0] 14111 y := v.Args[1] 14112 v.reset(Op386DIVW) 14113 v0 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 14114 v0.AddArg(x) 14115 v.AddArg(v0) 14116 v1 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 14117 v1.AddArg(y) 14118 v.AddArg(v1) 14119 return true 14120 } 14121 } 14122 func rewriteValue386_OpDiv8u_0(v *Value) bool { 14123 b := v.Block 14124 _ = b 14125 types := &b.Func.Config.Types 14126 _ = types 14127 // match: (Div8u x y) 14128 // cond: 14129 // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 14130 for { 14131 x := v.Args[0] 14132 y := v.Args[1] 14133 v.reset(Op386DIVWU) 14134 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 14135 v0.AddArg(x) 14136 v.AddArg(v0) 14137 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 14138 v1.AddArg(y) 14139 v.AddArg(v1) 14140 return true 14141 } 14142 } 14143 func rewriteValue386_OpEq16_0(v *Value) bool { 14144 b := v.Block 14145 _ = b 14146 // match: (Eq16 x y) 14147 // cond: 14148 // result: (SETEQ (CMPW x y)) 14149 for { 14150 x := v.Args[0] 14151 y := v.Args[1] 14152 v.reset(Op386SETEQ) 14153 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14154 v0.AddArg(x) 14155 v0.AddArg(y) 14156 v.AddArg(v0) 14157 return true 14158 } 14159 } 14160 func rewriteValue386_OpEq32_0(v *Value) bool { 14161 b := v.Block 14162 _ = b 14163 // match: (Eq32 x y) 14164 // cond: 14165 // result: (SETEQ (CMPL x y)) 14166 for { 14167 x := v.Args[0] 14168 y := v.Args[1] 14169 v.reset(Op386SETEQ) 14170 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14171 v0.AddArg(x) 14172 v0.AddArg(y) 14173 v.AddArg(v0) 14174 return true 14175 } 14176 } 14177 func rewriteValue386_OpEq32F_0(v *Value) bool { 14178 b := v.Block 14179 _ = b 14180 // match: (Eq32F x y) 14181 // cond: 14182 // result: (SETEQF (UCOMISS x y)) 14183 for { 14184 x := v.Args[0] 14185 y := v.Args[1] 14186 v.reset(Op386SETEQF) 14187 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14188 v0.AddArg(x) 14189 v0.AddArg(y) 14190 v.AddArg(v0) 14191 return true 14192 } 14193 } 14194 func rewriteValue386_OpEq64F_0(v *Value) bool { 14195 b := v.Block 14196 _ = b 14197 // match: (Eq64F x y) 14198 // cond: 14199 // result: (SETEQF (UCOMISD x y)) 14200 for { 14201 x := v.Args[0] 14202 y := v.Args[1] 14203 v.reset(Op386SETEQF) 14204 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14205 v0.AddArg(x) 14206 v0.AddArg(y) 14207 v.AddArg(v0) 14208 return true 14209 } 14210 } 14211 func rewriteValue386_OpEq8_0(v *Value) bool { 14212 b := v.Block 14213 _ = b 14214 // match: (Eq8 x y) 14215 // cond: 14216 // result: (SETEQ (CMPB x y)) 14217 for { 14218 x := v.Args[0] 14219 y := v.Args[1] 14220 v.reset(Op386SETEQ) 14221 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14222 v0.AddArg(x) 14223 v0.AddArg(y) 14224 v.AddArg(v0) 14225 return true 14226 } 14227 } 14228 func rewriteValue386_OpEqB_0(v *Value) bool { 14229 b := v.Block 14230 _ = b 14231 // match: (EqB x y) 14232 // cond: 14233 // result: (SETEQ (CMPB x y)) 14234 for { 14235 x := v.Args[0] 14236 y := v.Args[1] 14237 v.reset(Op386SETEQ) 14238 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14239 v0.AddArg(x) 14240 v0.AddArg(y) 14241 v.AddArg(v0) 14242 return true 14243 } 14244 } 14245 func rewriteValue386_OpEqPtr_0(v *Value) bool { 14246 b := v.Block 14247 _ = b 14248 // match: (EqPtr x y) 14249 // cond: 14250 // result: (SETEQ (CMPL x y)) 14251 for { 14252 x := v.Args[0] 14253 y := v.Args[1] 14254 v.reset(Op386SETEQ) 14255 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14256 v0.AddArg(x) 14257 v0.AddArg(y) 14258 v.AddArg(v0) 14259 return true 14260 } 14261 } 14262 func rewriteValue386_OpGeq16_0(v *Value) bool { 14263 b := v.Block 14264 _ = b 14265 // match: (Geq16 x y) 14266 // cond: 14267 // result: (SETGE (CMPW x y)) 14268 for { 14269 x := v.Args[0] 14270 y := v.Args[1] 14271 v.reset(Op386SETGE) 14272 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14273 v0.AddArg(x) 14274 v0.AddArg(y) 14275 v.AddArg(v0) 14276 return true 14277 } 14278 } 14279 func rewriteValue386_OpGeq16U_0(v *Value) bool { 14280 b := v.Block 14281 _ = b 14282 // match: (Geq16U x y) 14283 // cond: 14284 // result: (SETAE (CMPW x y)) 14285 for { 14286 x := v.Args[0] 14287 y := v.Args[1] 14288 v.reset(Op386SETAE) 14289 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14290 v0.AddArg(x) 14291 v0.AddArg(y) 14292 v.AddArg(v0) 14293 return true 14294 } 14295 } 14296 func rewriteValue386_OpGeq32_0(v *Value) bool { 14297 b := v.Block 14298 _ = b 14299 // match: (Geq32 x y) 14300 // cond: 14301 // result: (SETGE (CMPL x y)) 14302 for { 14303 x := v.Args[0] 14304 y := v.Args[1] 14305 v.reset(Op386SETGE) 14306 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14307 v0.AddArg(x) 14308 v0.AddArg(y) 14309 v.AddArg(v0) 14310 return true 14311 } 14312 } 14313 func rewriteValue386_OpGeq32F_0(v *Value) bool { 14314 b := v.Block 14315 _ = b 14316 // match: (Geq32F x y) 14317 // cond: 14318 // result: (SETGEF (UCOMISS x y)) 14319 for { 14320 x := v.Args[0] 14321 y := v.Args[1] 14322 v.reset(Op386SETGEF) 14323 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14324 v0.AddArg(x) 14325 v0.AddArg(y) 14326 v.AddArg(v0) 14327 return true 14328 } 14329 } 14330 func rewriteValue386_OpGeq32U_0(v *Value) bool { 14331 b := v.Block 14332 _ = b 14333 // match: (Geq32U x y) 14334 // cond: 14335 // result: (SETAE (CMPL x y)) 14336 for { 14337 x := v.Args[0] 14338 y := v.Args[1] 14339 v.reset(Op386SETAE) 14340 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14341 v0.AddArg(x) 14342 v0.AddArg(y) 14343 v.AddArg(v0) 14344 return true 14345 } 14346 } 14347 func rewriteValue386_OpGeq64F_0(v *Value) bool { 14348 b := v.Block 14349 _ = b 14350 // match: (Geq64F x y) 14351 // cond: 14352 // result: (SETGEF (UCOMISD x y)) 14353 for { 14354 x := v.Args[0] 14355 y := v.Args[1] 14356 v.reset(Op386SETGEF) 14357 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14358 v0.AddArg(x) 14359 v0.AddArg(y) 14360 v.AddArg(v0) 14361 return true 14362 } 14363 } 14364 func rewriteValue386_OpGeq8_0(v *Value) bool { 14365 b := v.Block 14366 _ = b 14367 // match: (Geq8 x y) 14368 // cond: 14369 // result: (SETGE (CMPB x y)) 14370 for { 14371 x := v.Args[0] 14372 y := v.Args[1] 14373 v.reset(Op386SETGE) 14374 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14375 v0.AddArg(x) 14376 v0.AddArg(y) 14377 v.AddArg(v0) 14378 return true 14379 } 14380 } 14381 func rewriteValue386_OpGeq8U_0(v *Value) bool { 14382 b := v.Block 14383 _ = b 14384 // match: (Geq8U x y) 14385 // cond: 14386 // result: (SETAE (CMPB x y)) 14387 for { 14388 x := v.Args[0] 14389 y := v.Args[1] 14390 v.reset(Op386SETAE) 14391 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14392 v0.AddArg(x) 14393 v0.AddArg(y) 14394 v.AddArg(v0) 14395 return true 14396 } 14397 } 14398 func rewriteValue386_OpGetClosurePtr_0(v *Value) bool { 14399 // match: (GetClosurePtr) 14400 // cond: 14401 // result: (LoweredGetClosurePtr) 14402 for { 14403 v.reset(Op386LoweredGetClosurePtr) 14404 return true 14405 } 14406 } 14407 func rewriteValue386_OpGetG_0(v *Value) bool { 14408 // match: (GetG mem) 14409 // cond: 14410 // result: (LoweredGetG mem) 14411 for { 14412 mem := v.Args[0] 14413 v.reset(Op386LoweredGetG) 14414 v.AddArg(mem) 14415 return true 14416 } 14417 } 14418 func rewriteValue386_OpGreater16_0(v *Value) bool { 14419 b := v.Block 14420 _ = b 14421 // match: (Greater16 x y) 14422 // cond: 14423 // result: (SETG (CMPW x y)) 14424 for { 14425 x := v.Args[0] 14426 y := v.Args[1] 14427 v.reset(Op386SETG) 14428 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14429 v0.AddArg(x) 14430 v0.AddArg(y) 14431 v.AddArg(v0) 14432 return true 14433 } 14434 } 14435 func rewriteValue386_OpGreater16U_0(v *Value) bool { 14436 b := v.Block 14437 _ = b 14438 // match: (Greater16U x y) 14439 // cond: 14440 // result: (SETA (CMPW x y)) 14441 for { 14442 x := v.Args[0] 14443 y := v.Args[1] 14444 v.reset(Op386SETA) 14445 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14446 v0.AddArg(x) 14447 v0.AddArg(y) 14448 v.AddArg(v0) 14449 return true 14450 } 14451 } 14452 func rewriteValue386_OpGreater32_0(v *Value) bool { 14453 b := v.Block 14454 _ = b 14455 // match: (Greater32 x y) 14456 // cond: 14457 // result: (SETG (CMPL x y)) 14458 for { 14459 x := v.Args[0] 14460 y := v.Args[1] 14461 v.reset(Op386SETG) 14462 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14463 v0.AddArg(x) 14464 v0.AddArg(y) 14465 v.AddArg(v0) 14466 return true 14467 } 14468 } 14469 func rewriteValue386_OpGreater32F_0(v *Value) bool { 14470 b := v.Block 14471 _ = b 14472 // match: (Greater32F x y) 14473 // cond: 14474 // result: (SETGF (UCOMISS x y)) 14475 for { 14476 x := v.Args[0] 14477 y := v.Args[1] 14478 v.reset(Op386SETGF) 14479 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14480 v0.AddArg(x) 14481 v0.AddArg(y) 14482 v.AddArg(v0) 14483 return true 14484 } 14485 } 14486 func rewriteValue386_OpGreater32U_0(v *Value) bool { 14487 b := v.Block 14488 _ = b 14489 // match: (Greater32U x y) 14490 // cond: 14491 // result: (SETA (CMPL x y)) 14492 for { 14493 x := v.Args[0] 14494 y := v.Args[1] 14495 v.reset(Op386SETA) 14496 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14497 v0.AddArg(x) 14498 v0.AddArg(y) 14499 v.AddArg(v0) 14500 return true 14501 } 14502 } 14503 func rewriteValue386_OpGreater64F_0(v *Value) bool { 14504 b := v.Block 14505 _ = b 14506 // match: (Greater64F x y) 14507 // cond: 14508 // result: (SETGF (UCOMISD x y)) 14509 for { 14510 x := v.Args[0] 14511 y := v.Args[1] 14512 v.reset(Op386SETGF) 14513 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14514 v0.AddArg(x) 14515 v0.AddArg(y) 14516 v.AddArg(v0) 14517 return true 14518 } 14519 } 14520 func rewriteValue386_OpGreater8_0(v *Value) bool { 14521 b := v.Block 14522 _ = b 14523 // match: (Greater8 x y) 14524 // cond: 14525 // result: (SETG (CMPB x y)) 14526 for { 14527 x := v.Args[0] 14528 y := v.Args[1] 14529 v.reset(Op386SETG) 14530 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14531 v0.AddArg(x) 14532 v0.AddArg(y) 14533 v.AddArg(v0) 14534 return true 14535 } 14536 } 14537 func rewriteValue386_OpGreater8U_0(v *Value) bool { 14538 b := v.Block 14539 _ = b 14540 // match: (Greater8U x y) 14541 // cond: 14542 // result: (SETA (CMPB x y)) 14543 for { 14544 x := v.Args[0] 14545 y := v.Args[1] 14546 v.reset(Op386SETA) 14547 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14548 v0.AddArg(x) 14549 v0.AddArg(y) 14550 v.AddArg(v0) 14551 return true 14552 } 14553 } 14554 func rewriteValue386_OpHmul32_0(v *Value) bool { 14555 // match: (Hmul32 x y) 14556 // cond: 14557 // result: (HMULL x y) 14558 for { 14559 x := v.Args[0] 14560 y := v.Args[1] 14561 v.reset(Op386HMULL) 14562 v.AddArg(x) 14563 v.AddArg(y) 14564 return true 14565 } 14566 } 14567 func rewriteValue386_OpHmul32u_0(v *Value) bool { 14568 // match: (Hmul32u x y) 14569 // cond: 14570 // result: (HMULLU x y) 14571 for { 14572 x := v.Args[0] 14573 y := v.Args[1] 14574 v.reset(Op386HMULLU) 14575 v.AddArg(x) 14576 v.AddArg(y) 14577 return true 14578 } 14579 } 14580 func rewriteValue386_OpInterCall_0(v *Value) bool { 14581 // match: (InterCall [argwid] entry mem) 14582 // cond: 14583 // result: (CALLinter [argwid] entry mem) 14584 for { 14585 argwid := v.AuxInt 14586 entry := v.Args[0] 14587 mem := v.Args[1] 14588 v.reset(Op386CALLinter) 14589 v.AuxInt = argwid 14590 v.AddArg(entry) 14591 v.AddArg(mem) 14592 return true 14593 } 14594 } 14595 func rewriteValue386_OpIsInBounds_0(v *Value) bool { 14596 b := v.Block 14597 _ = b 14598 // match: (IsInBounds idx len) 14599 // cond: 14600 // result: (SETB (CMPL idx len)) 14601 for { 14602 idx := v.Args[0] 14603 len := v.Args[1] 14604 v.reset(Op386SETB) 14605 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14606 v0.AddArg(idx) 14607 v0.AddArg(len) 14608 v.AddArg(v0) 14609 return true 14610 } 14611 } 14612 func rewriteValue386_OpIsNonNil_0(v *Value) bool { 14613 b := v.Block 14614 _ = b 14615 // match: (IsNonNil p) 14616 // cond: 14617 // result: (SETNE (TESTL p p)) 14618 for { 14619 p := v.Args[0] 14620 v.reset(Op386SETNE) 14621 v0 := b.NewValue0(v.Pos, Op386TESTL, TypeFlags) 14622 v0.AddArg(p) 14623 v0.AddArg(p) 14624 v.AddArg(v0) 14625 return true 14626 } 14627 } 14628 func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { 14629 b := v.Block 14630 _ = b 14631 // match: (IsSliceInBounds idx len) 14632 // cond: 14633 // result: (SETBE (CMPL idx len)) 14634 for { 14635 idx := v.Args[0] 14636 len := v.Args[1] 14637 v.reset(Op386SETBE) 14638 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14639 v0.AddArg(idx) 14640 v0.AddArg(len) 14641 v.AddArg(v0) 14642 return true 14643 } 14644 } 14645 func rewriteValue386_OpLeq16_0(v *Value) bool { 14646 b := v.Block 14647 _ = b 14648 // match: (Leq16 x y) 14649 // cond: 14650 // result: (SETLE (CMPW x y)) 14651 for { 14652 x := v.Args[0] 14653 y := v.Args[1] 14654 v.reset(Op386SETLE) 14655 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14656 v0.AddArg(x) 14657 v0.AddArg(y) 14658 v.AddArg(v0) 14659 return true 14660 } 14661 } 14662 func rewriteValue386_OpLeq16U_0(v *Value) bool { 14663 b := v.Block 14664 _ = b 14665 // match: (Leq16U x y) 14666 // cond: 14667 // result: (SETBE (CMPW x y)) 14668 for { 14669 x := v.Args[0] 14670 y := v.Args[1] 14671 v.reset(Op386SETBE) 14672 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14673 v0.AddArg(x) 14674 v0.AddArg(y) 14675 v.AddArg(v0) 14676 return true 14677 } 14678 } 14679 func rewriteValue386_OpLeq32_0(v *Value) bool { 14680 b := v.Block 14681 _ = b 14682 // match: (Leq32 x y) 14683 // cond: 14684 // result: (SETLE (CMPL x y)) 14685 for { 14686 x := v.Args[0] 14687 y := v.Args[1] 14688 v.reset(Op386SETLE) 14689 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14690 v0.AddArg(x) 14691 v0.AddArg(y) 14692 v.AddArg(v0) 14693 return true 14694 } 14695 } 14696 func rewriteValue386_OpLeq32F_0(v *Value) bool { 14697 b := v.Block 14698 _ = b 14699 // match: (Leq32F x y) 14700 // cond: 14701 // result: (SETGEF (UCOMISS y x)) 14702 for { 14703 x := v.Args[0] 14704 y := v.Args[1] 14705 v.reset(Op386SETGEF) 14706 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14707 v0.AddArg(y) 14708 v0.AddArg(x) 14709 v.AddArg(v0) 14710 return true 14711 } 14712 } 14713 func rewriteValue386_OpLeq32U_0(v *Value) bool { 14714 b := v.Block 14715 _ = b 14716 // match: (Leq32U x y) 14717 // cond: 14718 // result: (SETBE (CMPL x y)) 14719 for { 14720 x := v.Args[0] 14721 y := v.Args[1] 14722 v.reset(Op386SETBE) 14723 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14724 v0.AddArg(x) 14725 v0.AddArg(y) 14726 v.AddArg(v0) 14727 return true 14728 } 14729 } 14730 func rewriteValue386_OpLeq64F_0(v *Value) bool { 14731 b := v.Block 14732 _ = b 14733 // match: (Leq64F x y) 14734 // cond: 14735 // result: (SETGEF (UCOMISD y x)) 14736 for { 14737 x := v.Args[0] 14738 y := v.Args[1] 14739 v.reset(Op386SETGEF) 14740 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14741 v0.AddArg(y) 14742 v0.AddArg(x) 14743 v.AddArg(v0) 14744 return true 14745 } 14746 } 14747 func rewriteValue386_OpLeq8_0(v *Value) bool { 14748 b := v.Block 14749 _ = b 14750 // match: (Leq8 x y) 14751 // cond: 14752 // result: (SETLE (CMPB x y)) 14753 for { 14754 x := v.Args[0] 14755 y := v.Args[1] 14756 v.reset(Op386SETLE) 14757 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14758 v0.AddArg(x) 14759 v0.AddArg(y) 14760 v.AddArg(v0) 14761 return true 14762 } 14763 } 14764 func rewriteValue386_OpLeq8U_0(v *Value) bool { 14765 b := v.Block 14766 _ = b 14767 // match: (Leq8U x y) 14768 // cond: 14769 // result: (SETBE (CMPB x y)) 14770 for { 14771 x := v.Args[0] 14772 y := v.Args[1] 14773 v.reset(Op386SETBE) 14774 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14775 v0.AddArg(x) 14776 v0.AddArg(y) 14777 v.AddArg(v0) 14778 return true 14779 } 14780 } 14781 func rewriteValue386_OpLess16_0(v *Value) bool { 14782 b := v.Block 14783 _ = b 14784 // match: (Less16 x y) 14785 // cond: 14786 // result: (SETL (CMPW x y)) 14787 for { 14788 x := v.Args[0] 14789 y := v.Args[1] 14790 v.reset(Op386SETL) 14791 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14792 v0.AddArg(x) 14793 v0.AddArg(y) 14794 v.AddArg(v0) 14795 return true 14796 } 14797 } 14798 func rewriteValue386_OpLess16U_0(v *Value) bool { 14799 b := v.Block 14800 _ = b 14801 // match: (Less16U x y) 14802 // cond: 14803 // result: (SETB (CMPW x y)) 14804 for { 14805 x := v.Args[0] 14806 y := v.Args[1] 14807 v.reset(Op386SETB) 14808 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 14809 v0.AddArg(x) 14810 v0.AddArg(y) 14811 v.AddArg(v0) 14812 return true 14813 } 14814 } 14815 func rewriteValue386_OpLess32_0(v *Value) bool { 14816 b := v.Block 14817 _ = b 14818 // match: (Less32 x y) 14819 // cond: 14820 // result: (SETL (CMPL x y)) 14821 for { 14822 x := v.Args[0] 14823 y := v.Args[1] 14824 v.reset(Op386SETL) 14825 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14826 v0.AddArg(x) 14827 v0.AddArg(y) 14828 v.AddArg(v0) 14829 return true 14830 } 14831 } 14832 func rewriteValue386_OpLess32F_0(v *Value) bool { 14833 b := v.Block 14834 _ = b 14835 // match: (Less32F x y) 14836 // cond: 14837 // result: (SETGF (UCOMISS y x)) 14838 for { 14839 x := v.Args[0] 14840 y := v.Args[1] 14841 v.reset(Op386SETGF) 14842 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 14843 v0.AddArg(y) 14844 v0.AddArg(x) 14845 v.AddArg(v0) 14846 return true 14847 } 14848 } 14849 func rewriteValue386_OpLess32U_0(v *Value) bool { 14850 b := v.Block 14851 _ = b 14852 // match: (Less32U x y) 14853 // cond: 14854 // result: (SETB (CMPL x y)) 14855 for { 14856 x := v.Args[0] 14857 y := v.Args[1] 14858 v.reset(Op386SETB) 14859 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 14860 v0.AddArg(x) 14861 v0.AddArg(y) 14862 v.AddArg(v0) 14863 return true 14864 } 14865 } 14866 func rewriteValue386_OpLess64F_0(v *Value) bool { 14867 b := v.Block 14868 _ = b 14869 // match: (Less64F x y) 14870 // cond: 14871 // result: (SETGF (UCOMISD y x)) 14872 for { 14873 x := v.Args[0] 14874 y := v.Args[1] 14875 v.reset(Op386SETGF) 14876 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 14877 v0.AddArg(y) 14878 v0.AddArg(x) 14879 v.AddArg(v0) 14880 return true 14881 } 14882 } 14883 func rewriteValue386_OpLess8_0(v *Value) bool { 14884 b := v.Block 14885 _ = b 14886 // match: (Less8 x y) 14887 // cond: 14888 // result: (SETL (CMPB x y)) 14889 for { 14890 x := v.Args[0] 14891 y := v.Args[1] 14892 v.reset(Op386SETL) 14893 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14894 v0.AddArg(x) 14895 v0.AddArg(y) 14896 v.AddArg(v0) 14897 return true 14898 } 14899 } 14900 func rewriteValue386_OpLess8U_0(v *Value) bool { 14901 b := v.Block 14902 _ = b 14903 // match: (Less8U x y) 14904 // cond: 14905 // result: (SETB (CMPB x y)) 14906 for { 14907 x := v.Args[0] 14908 y := v.Args[1] 14909 v.reset(Op386SETB) 14910 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 14911 v0.AddArg(x) 14912 v0.AddArg(y) 14913 v.AddArg(v0) 14914 return true 14915 } 14916 } 14917 func rewriteValue386_OpLoad_0(v *Value) bool { 14918 // match: (Load <t> ptr mem) 14919 // cond: (is32BitInt(t) || isPtr(t)) 14920 // result: (MOVLload ptr mem) 14921 for { 14922 t := v.Type 14923 ptr := v.Args[0] 14924 mem := v.Args[1] 14925 if !(is32BitInt(t) || isPtr(t)) { 14926 break 14927 } 14928 v.reset(Op386MOVLload) 14929 v.AddArg(ptr) 14930 v.AddArg(mem) 14931 return true 14932 } 14933 // match: (Load <t> ptr mem) 14934 // cond: is16BitInt(t) 14935 // result: (MOVWload ptr mem) 14936 for { 14937 t := v.Type 14938 ptr := v.Args[0] 14939 mem := v.Args[1] 14940 if !(is16BitInt(t)) { 14941 break 14942 } 14943 v.reset(Op386MOVWload) 14944 v.AddArg(ptr) 14945 v.AddArg(mem) 14946 return true 14947 } 14948 // match: (Load <t> ptr mem) 14949 // cond: (t.IsBoolean() || is8BitInt(t)) 14950 // result: (MOVBload ptr mem) 14951 for { 14952 t := v.Type 14953 ptr := v.Args[0] 14954 mem := v.Args[1] 14955 if !(t.IsBoolean() || is8BitInt(t)) { 14956 break 14957 } 14958 v.reset(Op386MOVBload) 14959 v.AddArg(ptr) 14960 v.AddArg(mem) 14961 return true 14962 } 14963 // match: (Load <t> ptr mem) 14964 // cond: is32BitFloat(t) 14965 // result: (MOVSSload ptr mem) 14966 for { 14967 t := v.Type 14968 ptr := v.Args[0] 14969 mem := v.Args[1] 14970 if !(is32BitFloat(t)) { 14971 break 14972 } 14973 v.reset(Op386MOVSSload) 14974 v.AddArg(ptr) 14975 v.AddArg(mem) 14976 return true 14977 } 14978 // match: (Load <t> ptr mem) 14979 // cond: is64BitFloat(t) 14980 // result: (MOVSDload ptr mem) 14981 for { 14982 t := v.Type 14983 ptr := v.Args[0] 14984 mem := v.Args[1] 14985 if !(is64BitFloat(t)) { 14986 break 14987 } 14988 v.reset(Op386MOVSDload) 14989 v.AddArg(ptr) 14990 v.AddArg(mem) 14991 return true 14992 } 14993 return false 14994 } 14995 func rewriteValue386_OpLsh16x16_0(v *Value) bool { 14996 b := v.Block 14997 _ = b 14998 // match: (Lsh16x16 <t> x y) 14999 // cond: 15000 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15001 for { 15002 t := v.Type 15003 x := v.Args[0] 15004 y := v.Args[1] 15005 v.reset(Op386ANDL) 15006 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15007 v0.AddArg(x) 15008 v0.AddArg(y) 15009 v.AddArg(v0) 15010 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15011 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 15012 v2.AuxInt = 32 15013 v2.AddArg(y) 15014 v1.AddArg(v2) 15015 v.AddArg(v1) 15016 return true 15017 } 15018 } 15019 func rewriteValue386_OpLsh16x32_0(v *Value) bool { 15020 b := v.Block 15021 _ = b 15022 // match: (Lsh16x32 <t> x y) 15023 // cond: 15024 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15025 for { 15026 t := v.Type 15027 x := v.Args[0] 15028 y := v.Args[1] 15029 v.reset(Op386ANDL) 15030 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15031 v0.AddArg(x) 15032 v0.AddArg(y) 15033 v.AddArg(v0) 15034 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15035 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 15036 v2.AuxInt = 32 15037 v2.AddArg(y) 15038 v1.AddArg(v2) 15039 v.AddArg(v1) 15040 return true 15041 } 15042 } 15043 func rewriteValue386_OpLsh16x64_0(v *Value) bool { 15044 // match: (Lsh16x64 x (Const64 [c])) 15045 // cond: uint64(c) < 16 15046 // result: (SHLLconst x [c]) 15047 for { 15048 x := v.Args[0] 15049 v_1 := v.Args[1] 15050 if v_1.Op != OpConst64 { 15051 break 15052 } 15053 c := v_1.AuxInt 15054 if !(uint64(c) < 16) { 15055 break 15056 } 15057 v.reset(Op386SHLLconst) 15058 v.AuxInt = c 15059 v.AddArg(x) 15060 return true 15061 } 15062 // match: (Lsh16x64 _ (Const64 [c])) 15063 // cond: uint64(c) >= 16 15064 // result: (Const16 [0]) 15065 for { 15066 v_1 := v.Args[1] 15067 if v_1.Op != OpConst64 { 15068 break 15069 } 15070 c := v_1.AuxInt 15071 if !(uint64(c) >= 16) { 15072 break 15073 } 15074 v.reset(OpConst16) 15075 v.AuxInt = 0 15076 return true 15077 } 15078 return false 15079 } 15080 func rewriteValue386_OpLsh16x8_0(v *Value) bool { 15081 b := v.Block 15082 _ = b 15083 // match: (Lsh16x8 <t> x y) 15084 // cond: 15085 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15086 for { 15087 t := v.Type 15088 x := v.Args[0] 15089 y := v.Args[1] 15090 v.reset(Op386ANDL) 15091 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15092 v0.AddArg(x) 15093 v0.AddArg(y) 15094 v.AddArg(v0) 15095 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15096 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 15097 v2.AuxInt = 32 15098 v2.AddArg(y) 15099 v1.AddArg(v2) 15100 v.AddArg(v1) 15101 return true 15102 } 15103 } 15104 func rewriteValue386_OpLsh32x16_0(v *Value) bool { 15105 b := v.Block 15106 _ = b 15107 // match: (Lsh32x16 <t> x y) 15108 // cond: 15109 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15110 for { 15111 t := v.Type 15112 x := v.Args[0] 15113 y := v.Args[1] 15114 v.reset(Op386ANDL) 15115 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15116 v0.AddArg(x) 15117 v0.AddArg(y) 15118 v.AddArg(v0) 15119 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15120 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 15121 v2.AuxInt = 32 15122 v2.AddArg(y) 15123 v1.AddArg(v2) 15124 v.AddArg(v1) 15125 return true 15126 } 15127 } 15128 func rewriteValue386_OpLsh32x32_0(v *Value) bool { 15129 b := v.Block 15130 _ = b 15131 // match: (Lsh32x32 <t> x y) 15132 // cond: 15133 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15134 for { 15135 t := v.Type 15136 x := v.Args[0] 15137 y := v.Args[1] 15138 v.reset(Op386ANDL) 15139 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15140 v0.AddArg(x) 15141 v0.AddArg(y) 15142 v.AddArg(v0) 15143 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15144 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 15145 v2.AuxInt = 32 15146 v2.AddArg(y) 15147 v1.AddArg(v2) 15148 v.AddArg(v1) 15149 return true 15150 } 15151 } 15152 func rewriteValue386_OpLsh32x64_0(v *Value) bool { 15153 // match: (Lsh32x64 x (Const64 [c])) 15154 // cond: uint64(c) < 32 15155 // result: (SHLLconst x [c]) 15156 for { 15157 x := v.Args[0] 15158 v_1 := v.Args[1] 15159 if v_1.Op != OpConst64 { 15160 break 15161 } 15162 c := v_1.AuxInt 15163 if !(uint64(c) < 32) { 15164 break 15165 } 15166 v.reset(Op386SHLLconst) 15167 v.AuxInt = c 15168 v.AddArg(x) 15169 return true 15170 } 15171 // match: (Lsh32x64 _ (Const64 [c])) 15172 // cond: uint64(c) >= 32 15173 // result: (Const32 [0]) 15174 for { 15175 v_1 := v.Args[1] 15176 if v_1.Op != OpConst64 { 15177 break 15178 } 15179 c := v_1.AuxInt 15180 if !(uint64(c) >= 32) { 15181 break 15182 } 15183 v.reset(OpConst32) 15184 v.AuxInt = 0 15185 return true 15186 } 15187 return false 15188 } 15189 func rewriteValue386_OpLsh32x8_0(v *Value) bool { 15190 b := v.Block 15191 _ = b 15192 // match: (Lsh32x8 <t> x y) 15193 // cond: 15194 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15195 for { 15196 t := v.Type 15197 x := v.Args[0] 15198 y := v.Args[1] 15199 v.reset(Op386ANDL) 15200 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15201 v0.AddArg(x) 15202 v0.AddArg(y) 15203 v.AddArg(v0) 15204 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15205 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 15206 v2.AuxInt = 32 15207 v2.AddArg(y) 15208 v1.AddArg(v2) 15209 v.AddArg(v1) 15210 return true 15211 } 15212 } 15213 func rewriteValue386_OpLsh8x16_0(v *Value) bool { 15214 b := v.Block 15215 _ = b 15216 // match: (Lsh8x16 <t> x y) 15217 // cond: 15218 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15219 for { 15220 t := v.Type 15221 x := v.Args[0] 15222 y := v.Args[1] 15223 v.reset(Op386ANDL) 15224 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15225 v0.AddArg(x) 15226 v0.AddArg(y) 15227 v.AddArg(v0) 15228 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15229 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 15230 v2.AuxInt = 32 15231 v2.AddArg(y) 15232 v1.AddArg(v2) 15233 v.AddArg(v1) 15234 return true 15235 } 15236 } 15237 func rewriteValue386_OpLsh8x32_0(v *Value) bool { 15238 b := v.Block 15239 _ = b 15240 // match: (Lsh8x32 <t> x y) 15241 // cond: 15242 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15243 for { 15244 t := v.Type 15245 x := v.Args[0] 15246 y := v.Args[1] 15247 v.reset(Op386ANDL) 15248 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15249 v0.AddArg(x) 15250 v0.AddArg(y) 15251 v.AddArg(v0) 15252 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15253 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 15254 v2.AuxInt = 32 15255 v2.AddArg(y) 15256 v1.AddArg(v2) 15257 v.AddArg(v1) 15258 return true 15259 } 15260 } 15261 func rewriteValue386_OpLsh8x64_0(v *Value) bool { 15262 // match: (Lsh8x64 x (Const64 [c])) 15263 // cond: uint64(c) < 8 15264 // result: (SHLLconst x [c]) 15265 for { 15266 x := v.Args[0] 15267 v_1 := v.Args[1] 15268 if v_1.Op != OpConst64 { 15269 break 15270 } 15271 c := v_1.AuxInt 15272 if !(uint64(c) < 8) { 15273 break 15274 } 15275 v.reset(Op386SHLLconst) 15276 v.AuxInt = c 15277 v.AddArg(x) 15278 return true 15279 } 15280 // match: (Lsh8x64 _ (Const64 [c])) 15281 // cond: uint64(c) >= 8 15282 // result: (Const8 [0]) 15283 for { 15284 v_1 := v.Args[1] 15285 if v_1.Op != OpConst64 { 15286 break 15287 } 15288 c := v_1.AuxInt 15289 if !(uint64(c) >= 8) { 15290 break 15291 } 15292 v.reset(OpConst8) 15293 v.AuxInt = 0 15294 return true 15295 } 15296 return false 15297 } 15298 func rewriteValue386_OpLsh8x8_0(v *Value) bool { 15299 b := v.Block 15300 _ = b 15301 // match: (Lsh8x8 <t> x y) 15302 // cond: 15303 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15304 for { 15305 t := v.Type 15306 x := v.Args[0] 15307 y := v.Args[1] 15308 v.reset(Op386ANDL) 15309 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15310 v0.AddArg(x) 15311 v0.AddArg(y) 15312 v.AddArg(v0) 15313 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15314 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 15315 v2.AuxInt = 32 15316 v2.AddArg(y) 15317 v1.AddArg(v2) 15318 v.AddArg(v1) 15319 return true 15320 } 15321 } 15322 func rewriteValue386_OpMod16_0(v *Value) bool { 15323 // match: (Mod16 x y) 15324 // cond: 15325 // result: (MODW x y) 15326 for { 15327 x := v.Args[0] 15328 y := v.Args[1] 15329 v.reset(Op386MODW) 15330 v.AddArg(x) 15331 v.AddArg(y) 15332 return true 15333 } 15334 } 15335 func rewriteValue386_OpMod16u_0(v *Value) bool { 15336 // match: (Mod16u x y) 15337 // cond: 15338 // result: (MODWU x y) 15339 for { 15340 x := v.Args[0] 15341 y := v.Args[1] 15342 v.reset(Op386MODWU) 15343 v.AddArg(x) 15344 v.AddArg(y) 15345 return true 15346 } 15347 } 15348 func rewriteValue386_OpMod32_0(v *Value) bool { 15349 // match: (Mod32 x y) 15350 // cond: 15351 // result: (MODL x y) 15352 for { 15353 x := v.Args[0] 15354 y := v.Args[1] 15355 v.reset(Op386MODL) 15356 v.AddArg(x) 15357 v.AddArg(y) 15358 return true 15359 } 15360 } 15361 func rewriteValue386_OpMod32u_0(v *Value) bool { 15362 // match: (Mod32u x y) 15363 // cond: 15364 // result: (MODLU x y) 15365 for { 15366 x := v.Args[0] 15367 y := v.Args[1] 15368 v.reset(Op386MODLU) 15369 v.AddArg(x) 15370 v.AddArg(y) 15371 return true 15372 } 15373 } 15374 func rewriteValue386_OpMod8_0(v *Value) bool { 15375 b := v.Block 15376 _ = b 15377 types := &b.Func.Config.Types 15378 _ = types 15379 // match: (Mod8 x y) 15380 // cond: 15381 // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) 15382 for { 15383 x := v.Args[0] 15384 y := v.Args[1] 15385 v.reset(Op386MODW) 15386 v0 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 15387 v0.AddArg(x) 15388 v.AddArg(v0) 15389 v1 := b.NewValue0(v.Pos, OpSignExt8to16, types.Int16) 15390 v1.AddArg(y) 15391 v.AddArg(v1) 15392 return true 15393 } 15394 } 15395 func rewriteValue386_OpMod8u_0(v *Value) bool { 15396 b := v.Block 15397 _ = b 15398 types := &b.Func.Config.Types 15399 _ = types 15400 // match: (Mod8u x y) 15401 // cond: 15402 // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 15403 for { 15404 x := v.Args[0] 15405 y := v.Args[1] 15406 v.reset(Op386MODWU) 15407 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 15408 v0.AddArg(x) 15409 v.AddArg(v0) 15410 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, types.UInt16) 15411 v1.AddArg(y) 15412 v.AddArg(v1) 15413 return true 15414 } 15415 } 15416 func rewriteValue386_OpMove_0(v *Value) bool { 15417 b := v.Block 15418 _ = b 15419 types := &b.Func.Config.Types 15420 _ = types 15421 // match: (Move [0] _ _ mem) 15422 // cond: 15423 // result: mem 15424 for { 15425 if v.AuxInt != 0 { 15426 break 15427 } 15428 mem := v.Args[2] 15429 v.reset(OpCopy) 15430 v.Type = mem.Type 15431 v.AddArg(mem) 15432 return true 15433 } 15434 // match: (Move [1] dst src mem) 15435 // cond: 15436 // result: (MOVBstore dst (MOVBload src mem) mem) 15437 for { 15438 if v.AuxInt != 1 { 15439 break 15440 } 15441 dst := v.Args[0] 15442 src := v.Args[1] 15443 mem := v.Args[2] 15444 v.reset(Op386MOVBstore) 15445 v.AddArg(dst) 15446 v0 := b.NewValue0(v.Pos, Op386MOVBload, types.UInt8) 15447 v0.AddArg(src) 15448 v0.AddArg(mem) 15449 v.AddArg(v0) 15450 v.AddArg(mem) 15451 return true 15452 } 15453 // match: (Move [2] dst src mem) 15454 // cond: 15455 // result: (MOVWstore dst (MOVWload src mem) mem) 15456 for { 15457 if v.AuxInt != 2 { 15458 break 15459 } 15460 dst := v.Args[0] 15461 src := v.Args[1] 15462 mem := v.Args[2] 15463 v.reset(Op386MOVWstore) 15464 v.AddArg(dst) 15465 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 15466 v0.AddArg(src) 15467 v0.AddArg(mem) 15468 v.AddArg(v0) 15469 v.AddArg(mem) 15470 return true 15471 } 15472 // match: (Move [4] dst src mem) 15473 // cond: 15474 // result: (MOVLstore dst (MOVLload src mem) mem) 15475 for { 15476 if v.AuxInt != 4 { 15477 break 15478 } 15479 dst := v.Args[0] 15480 src := v.Args[1] 15481 mem := v.Args[2] 15482 v.reset(Op386MOVLstore) 15483 v.AddArg(dst) 15484 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15485 v0.AddArg(src) 15486 v0.AddArg(mem) 15487 v.AddArg(v0) 15488 v.AddArg(mem) 15489 return true 15490 } 15491 // match: (Move [3] dst src mem) 15492 // cond: 15493 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) 15494 for { 15495 if v.AuxInt != 3 { 15496 break 15497 } 15498 dst := v.Args[0] 15499 src := v.Args[1] 15500 mem := v.Args[2] 15501 v.reset(Op386MOVBstore) 15502 v.AuxInt = 2 15503 v.AddArg(dst) 15504 v0 := b.NewValue0(v.Pos, Op386MOVBload, types.UInt8) 15505 v0.AuxInt = 2 15506 v0.AddArg(src) 15507 v0.AddArg(mem) 15508 v.AddArg(v0) 15509 v1 := b.NewValue0(v.Pos, Op386MOVWstore, TypeMem) 15510 v1.AddArg(dst) 15511 v2 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 15512 v2.AddArg(src) 15513 v2.AddArg(mem) 15514 v1.AddArg(v2) 15515 v1.AddArg(mem) 15516 v.AddArg(v1) 15517 return true 15518 } 15519 // match: (Move [5] dst src mem) 15520 // cond: 15521 // result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15522 for { 15523 if v.AuxInt != 5 { 15524 break 15525 } 15526 dst := v.Args[0] 15527 src := v.Args[1] 15528 mem := v.Args[2] 15529 v.reset(Op386MOVBstore) 15530 v.AuxInt = 4 15531 v.AddArg(dst) 15532 v0 := b.NewValue0(v.Pos, Op386MOVBload, types.UInt8) 15533 v0.AuxInt = 4 15534 v0.AddArg(src) 15535 v0.AddArg(mem) 15536 v.AddArg(v0) 15537 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15538 v1.AddArg(dst) 15539 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15540 v2.AddArg(src) 15541 v2.AddArg(mem) 15542 v1.AddArg(v2) 15543 v1.AddArg(mem) 15544 v.AddArg(v1) 15545 return true 15546 } 15547 // match: (Move [6] dst src mem) 15548 // cond: 15549 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15550 for { 15551 if v.AuxInt != 6 { 15552 break 15553 } 15554 dst := v.Args[0] 15555 src := v.Args[1] 15556 mem := v.Args[2] 15557 v.reset(Op386MOVWstore) 15558 v.AuxInt = 4 15559 v.AddArg(dst) 15560 v0 := b.NewValue0(v.Pos, Op386MOVWload, types.UInt16) 15561 v0.AuxInt = 4 15562 v0.AddArg(src) 15563 v0.AddArg(mem) 15564 v.AddArg(v0) 15565 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15566 v1.AddArg(dst) 15567 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15568 v2.AddArg(src) 15569 v2.AddArg(mem) 15570 v1.AddArg(v2) 15571 v1.AddArg(mem) 15572 v.AddArg(v1) 15573 return true 15574 } 15575 // match: (Move [7] dst src mem) 15576 // cond: 15577 // result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15578 for { 15579 if v.AuxInt != 7 { 15580 break 15581 } 15582 dst := v.Args[0] 15583 src := v.Args[1] 15584 mem := v.Args[2] 15585 v.reset(Op386MOVLstore) 15586 v.AuxInt = 3 15587 v.AddArg(dst) 15588 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15589 v0.AuxInt = 3 15590 v0.AddArg(src) 15591 v0.AddArg(mem) 15592 v.AddArg(v0) 15593 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15594 v1.AddArg(dst) 15595 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15596 v2.AddArg(src) 15597 v2.AddArg(mem) 15598 v1.AddArg(v2) 15599 v1.AddArg(mem) 15600 v.AddArg(v1) 15601 return true 15602 } 15603 // match: (Move [8] dst src mem) 15604 // cond: 15605 // result: (MOVLstore [4] dst (MOVLload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 15606 for { 15607 if v.AuxInt != 8 { 15608 break 15609 } 15610 dst := v.Args[0] 15611 src := v.Args[1] 15612 mem := v.Args[2] 15613 v.reset(Op386MOVLstore) 15614 v.AuxInt = 4 15615 v.AddArg(dst) 15616 v0 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15617 v0.AuxInt = 4 15618 v0.AddArg(src) 15619 v0.AddArg(mem) 15620 v.AddArg(v0) 15621 v1 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15622 v1.AddArg(dst) 15623 v2 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15624 v2.AddArg(src) 15625 v2.AddArg(mem) 15626 v1.AddArg(v2) 15627 v1.AddArg(mem) 15628 v.AddArg(v1) 15629 return true 15630 } 15631 // match: (Move [s] dst src mem) 15632 // cond: s > 8 && s%4 != 0 15633 // result: (Move [s-s%4] (ADDLconst <dst.Type> dst [s%4]) (ADDLconst <src.Type> src [s%4]) (MOVLstore dst (MOVLload src mem) mem)) 15634 for { 15635 s := v.AuxInt 15636 dst := v.Args[0] 15637 src := v.Args[1] 15638 mem := v.Args[2] 15639 if !(s > 8 && s%4 != 0) { 15640 break 15641 } 15642 v.reset(OpMove) 15643 v.AuxInt = s - s%4 15644 v0 := b.NewValue0(v.Pos, Op386ADDLconst, dst.Type) 15645 v0.AuxInt = s % 4 15646 v0.AddArg(dst) 15647 v.AddArg(v0) 15648 v1 := b.NewValue0(v.Pos, Op386ADDLconst, src.Type) 15649 v1.AuxInt = s % 4 15650 v1.AddArg(src) 15651 v.AddArg(v1) 15652 v2 := b.NewValue0(v.Pos, Op386MOVLstore, TypeMem) 15653 v2.AddArg(dst) 15654 v3 := b.NewValue0(v.Pos, Op386MOVLload, types.UInt32) 15655 v3.AddArg(src) 15656 v3.AddArg(mem) 15657 v2.AddArg(v3) 15658 v2.AddArg(mem) 15659 v.AddArg(v2) 15660 return true 15661 } 15662 return false 15663 } 15664 func rewriteValue386_OpMove_10(v *Value) bool { 15665 b := v.Block 15666 _ = b 15667 config := b.Func.Config 15668 _ = config 15669 types := &b.Func.Config.Types 15670 _ = types 15671 // match: (Move [s] dst src mem) 15672 // cond: s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 15673 // result: (DUFFCOPY [10*(128-s/4)] dst src mem) 15674 for { 15675 s := v.AuxInt 15676 dst := v.Args[0] 15677 src := v.Args[1] 15678 mem := v.Args[2] 15679 if !(s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 15680 break 15681 } 15682 v.reset(Op386DUFFCOPY) 15683 v.AuxInt = 10 * (128 - s/4) 15684 v.AddArg(dst) 15685 v.AddArg(src) 15686 v.AddArg(mem) 15687 return true 15688 } 15689 // match: (Move [s] dst src mem) 15690 // cond: (s > 4*128 || config.noDuffDevice) && s%4 == 0 15691 // result: (REPMOVSL dst src (MOVLconst [s/4]) mem) 15692 for { 15693 s := v.AuxInt 15694 dst := v.Args[0] 15695 src := v.Args[1] 15696 mem := v.Args[2] 15697 if !((s > 4*128 || config.noDuffDevice) && s%4 == 0) { 15698 break 15699 } 15700 v.reset(Op386REPMOVSL) 15701 v.AddArg(dst) 15702 v.AddArg(src) 15703 v0 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 15704 v0.AuxInt = s / 4 15705 v.AddArg(v0) 15706 v.AddArg(mem) 15707 return true 15708 } 15709 return false 15710 } 15711 func rewriteValue386_OpMul16_0(v *Value) bool { 15712 // match: (Mul16 x y) 15713 // cond: 15714 // result: (MULL x y) 15715 for { 15716 x := v.Args[0] 15717 y := v.Args[1] 15718 v.reset(Op386MULL) 15719 v.AddArg(x) 15720 v.AddArg(y) 15721 return true 15722 } 15723 } 15724 func rewriteValue386_OpMul32_0(v *Value) bool { 15725 // match: (Mul32 x y) 15726 // cond: 15727 // result: (MULL x y) 15728 for { 15729 x := v.Args[0] 15730 y := v.Args[1] 15731 v.reset(Op386MULL) 15732 v.AddArg(x) 15733 v.AddArg(y) 15734 return true 15735 } 15736 } 15737 func rewriteValue386_OpMul32F_0(v *Value) bool { 15738 // match: (Mul32F x y) 15739 // cond: 15740 // result: (MULSS x y) 15741 for { 15742 x := v.Args[0] 15743 y := v.Args[1] 15744 v.reset(Op386MULSS) 15745 v.AddArg(x) 15746 v.AddArg(y) 15747 return true 15748 } 15749 } 15750 func rewriteValue386_OpMul32uhilo_0(v *Value) bool { 15751 // match: (Mul32uhilo x y) 15752 // cond: 15753 // result: (MULLQU x y) 15754 for { 15755 x := v.Args[0] 15756 y := v.Args[1] 15757 v.reset(Op386MULLQU) 15758 v.AddArg(x) 15759 v.AddArg(y) 15760 return true 15761 } 15762 } 15763 func rewriteValue386_OpMul64F_0(v *Value) bool { 15764 // match: (Mul64F x y) 15765 // cond: 15766 // result: (MULSD x y) 15767 for { 15768 x := v.Args[0] 15769 y := v.Args[1] 15770 v.reset(Op386MULSD) 15771 v.AddArg(x) 15772 v.AddArg(y) 15773 return true 15774 } 15775 } 15776 func rewriteValue386_OpMul8_0(v *Value) bool { 15777 // match: (Mul8 x y) 15778 // cond: 15779 // result: (MULL x y) 15780 for { 15781 x := v.Args[0] 15782 y := v.Args[1] 15783 v.reset(Op386MULL) 15784 v.AddArg(x) 15785 v.AddArg(y) 15786 return true 15787 } 15788 } 15789 func rewriteValue386_OpNeg16_0(v *Value) bool { 15790 // match: (Neg16 x) 15791 // cond: 15792 // result: (NEGL x) 15793 for { 15794 x := v.Args[0] 15795 v.reset(Op386NEGL) 15796 v.AddArg(x) 15797 return true 15798 } 15799 } 15800 func rewriteValue386_OpNeg32_0(v *Value) bool { 15801 // match: (Neg32 x) 15802 // cond: 15803 // result: (NEGL x) 15804 for { 15805 x := v.Args[0] 15806 v.reset(Op386NEGL) 15807 v.AddArg(x) 15808 return true 15809 } 15810 } 15811 func rewriteValue386_OpNeg32F_0(v *Value) bool { 15812 b := v.Block 15813 _ = b 15814 config := b.Func.Config 15815 _ = config 15816 types := &b.Func.Config.Types 15817 _ = types 15818 // match: (Neg32F x) 15819 // cond: !config.use387 15820 // result: (PXOR x (MOVSSconst <types.Float32> [f2i(math.Copysign(0, -1))])) 15821 for { 15822 x := v.Args[0] 15823 if !(!config.use387) { 15824 break 15825 } 15826 v.reset(Op386PXOR) 15827 v.AddArg(x) 15828 v0 := b.NewValue0(v.Pos, Op386MOVSSconst, types.Float32) 15829 v0.AuxInt = f2i(math.Copysign(0, -1)) 15830 v.AddArg(v0) 15831 return true 15832 } 15833 // match: (Neg32F x) 15834 // cond: config.use387 15835 // result: (FCHS x) 15836 for { 15837 x := v.Args[0] 15838 if !(config.use387) { 15839 break 15840 } 15841 v.reset(Op386FCHS) 15842 v.AddArg(x) 15843 return true 15844 } 15845 return false 15846 } 15847 func rewriteValue386_OpNeg64F_0(v *Value) bool { 15848 b := v.Block 15849 _ = b 15850 config := b.Func.Config 15851 _ = config 15852 types := &b.Func.Config.Types 15853 _ = types 15854 // match: (Neg64F x) 15855 // cond: !config.use387 15856 // result: (PXOR x (MOVSDconst <types.Float64> [f2i(math.Copysign(0, -1))])) 15857 for { 15858 x := v.Args[0] 15859 if !(!config.use387) { 15860 break 15861 } 15862 v.reset(Op386PXOR) 15863 v.AddArg(x) 15864 v0 := b.NewValue0(v.Pos, Op386MOVSDconst, types.Float64) 15865 v0.AuxInt = f2i(math.Copysign(0, -1)) 15866 v.AddArg(v0) 15867 return true 15868 } 15869 // match: (Neg64F x) 15870 // cond: config.use387 15871 // result: (FCHS x) 15872 for { 15873 x := v.Args[0] 15874 if !(config.use387) { 15875 break 15876 } 15877 v.reset(Op386FCHS) 15878 v.AddArg(x) 15879 return true 15880 } 15881 return false 15882 } 15883 func rewriteValue386_OpNeg8_0(v *Value) bool { 15884 // match: (Neg8 x) 15885 // cond: 15886 // result: (NEGL x) 15887 for { 15888 x := v.Args[0] 15889 v.reset(Op386NEGL) 15890 v.AddArg(x) 15891 return true 15892 } 15893 } 15894 func rewriteValue386_OpNeq16_0(v *Value) bool { 15895 b := v.Block 15896 _ = b 15897 // match: (Neq16 x y) 15898 // cond: 15899 // result: (SETNE (CMPW x y)) 15900 for { 15901 x := v.Args[0] 15902 y := v.Args[1] 15903 v.reset(Op386SETNE) 15904 v0 := b.NewValue0(v.Pos, Op386CMPW, TypeFlags) 15905 v0.AddArg(x) 15906 v0.AddArg(y) 15907 v.AddArg(v0) 15908 return true 15909 } 15910 } 15911 func rewriteValue386_OpNeq32_0(v *Value) bool { 15912 b := v.Block 15913 _ = b 15914 // match: (Neq32 x y) 15915 // cond: 15916 // result: (SETNE (CMPL x y)) 15917 for { 15918 x := v.Args[0] 15919 y := v.Args[1] 15920 v.reset(Op386SETNE) 15921 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 15922 v0.AddArg(x) 15923 v0.AddArg(y) 15924 v.AddArg(v0) 15925 return true 15926 } 15927 } 15928 func rewriteValue386_OpNeq32F_0(v *Value) bool { 15929 b := v.Block 15930 _ = b 15931 // match: (Neq32F x y) 15932 // cond: 15933 // result: (SETNEF (UCOMISS x y)) 15934 for { 15935 x := v.Args[0] 15936 y := v.Args[1] 15937 v.reset(Op386SETNEF) 15938 v0 := b.NewValue0(v.Pos, Op386UCOMISS, TypeFlags) 15939 v0.AddArg(x) 15940 v0.AddArg(y) 15941 v.AddArg(v0) 15942 return true 15943 } 15944 } 15945 func rewriteValue386_OpNeq64F_0(v *Value) bool { 15946 b := v.Block 15947 _ = b 15948 // match: (Neq64F x y) 15949 // cond: 15950 // result: (SETNEF (UCOMISD x y)) 15951 for { 15952 x := v.Args[0] 15953 y := v.Args[1] 15954 v.reset(Op386SETNEF) 15955 v0 := b.NewValue0(v.Pos, Op386UCOMISD, TypeFlags) 15956 v0.AddArg(x) 15957 v0.AddArg(y) 15958 v.AddArg(v0) 15959 return true 15960 } 15961 } 15962 func rewriteValue386_OpNeq8_0(v *Value) bool { 15963 b := v.Block 15964 _ = b 15965 // match: (Neq8 x y) 15966 // cond: 15967 // result: (SETNE (CMPB x y)) 15968 for { 15969 x := v.Args[0] 15970 y := v.Args[1] 15971 v.reset(Op386SETNE) 15972 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 15973 v0.AddArg(x) 15974 v0.AddArg(y) 15975 v.AddArg(v0) 15976 return true 15977 } 15978 } 15979 func rewriteValue386_OpNeqB_0(v *Value) bool { 15980 b := v.Block 15981 _ = b 15982 // match: (NeqB x y) 15983 // cond: 15984 // result: (SETNE (CMPB x y)) 15985 for { 15986 x := v.Args[0] 15987 y := v.Args[1] 15988 v.reset(Op386SETNE) 15989 v0 := b.NewValue0(v.Pos, Op386CMPB, TypeFlags) 15990 v0.AddArg(x) 15991 v0.AddArg(y) 15992 v.AddArg(v0) 15993 return true 15994 } 15995 } 15996 func rewriteValue386_OpNeqPtr_0(v *Value) bool { 15997 b := v.Block 15998 _ = b 15999 // match: (NeqPtr x y) 16000 // cond: 16001 // result: (SETNE (CMPL x y)) 16002 for { 16003 x := v.Args[0] 16004 y := v.Args[1] 16005 v.reset(Op386SETNE) 16006 v0 := b.NewValue0(v.Pos, Op386CMPL, TypeFlags) 16007 v0.AddArg(x) 16008 v0.AddArg(y) 16009 v.AddArg(v0) 16010 return true 16011 } 16012 } 16013 func rewriteValue386_OpNilCheck_0(v *Value) bool { 16014 // match: (NilCheck ptr mem) 16015 // cond: 16016 // result: (LoweredNilCheck ptr mem) 16017 for { 16018 ptr := v.Args[0] 16019 mem := v.Args[1] 16020 v.reset(Op386LoweredNilCheck) 16021 v.AddArg(ptr) 16022 v.AddArg(mem) 16023 return true 16024 } 16025 } 16026 func rewriteValue386_OpNot_0(v *Value) bool { 16027 // match: (Not x) 16028 // cond: 16029 // result: (XORLconst [1] x) 16030 for { 16031 x := v.Args[0] 16032 v.reset(Op386XORLconst) 16033 v.AuxInt = 1 16034 v.AddArg(x) 16035 return true 16036 } 16037 } 16038 func rewriteValue386_OpOffPtr_0(v *Value) bool { 16039 // match: (OffPtr [off] ptr) 16040 // cond: 16041 // result: (ADDLconst [off] ptr) 16042 for { 16043 off := v.AuxInt 16044 ptr := v.Args[0] 16045 v.reset(Op386ADDLconst) 16046 v.AuxInt = off 16047 v.AddArg(ptr) 16048 return true 16049 } 16050 } 16051 func rewriteValue386_OpOr16_0(v *Value) bool { 16052 // match: (Or16 x y) 16053 // cond: 16054 // result: (ORL x y) 16055 for { 16056 x := v.Args[0] 16057 y := v.Args[1] 16058 v.reset(Op386ORL) 16059 v.AddArg(x) 16060 v.AddArg(y) 16061 return true 16062 } 16063 } 16064 func rewriteValue386_OpOr32_0(v *Value) bool { 16065 // match: (Or32 x y) 16066 // cond: 16067 // result: (ORL x y) 16068 for { 16069 x := v.Args[0] 16070 y := v.Args[1] 16071 v.reset(Op386ORL) 16072 v.AddArg(x) 16073 v.AddArg(y) 16074 return true 16075 } 16076 } 16077 func rewriteValue386_OpOr8_0(v *Value) bool { 16078 // match: (Or8 x y) 16079 // cond: 16080 // result: (ORL x y) 16081 for { 16082 x := v.Args[0] 16083 y := v.Args[1] 16084 v.reset(Op386ORL) 16085 v.AddArg(x) 16086 v.AddArg(y) 16087 return true 16088 } 16089 } 16090 func rewriteValue386_OpOrB_0(v *Value) bool { 16091 // match: (OrB x y) 16092 // cond: 16093 // result: (ORL x y) 16094 for { 16095 x := v.Args[0] 16096 y := v.Args[1] 16097 v.reset(Op386ORL) 16098 v.AddArg(x) 16099 v.AddArg(y) 16100 return true 16101 } 16102 } 16103 func rewriteValue386_OpRound32F_0(v *Value) bool { 16104 // match: (Round32F x) 16105 // cond: 16106 // result: x 16107 for { 16108 x := v.Args[0] 16109 v.reset(OpCopy) 16110 v.Type = x.Type 16111 v.AddArg(x) 16112 return true 16113 } 16114 } 16115 func rewriteValue386_OpRound64F_0(v *Value) bool { 16116 // match: (Round64F x) 16117 // cond: 16118 // result: x 16119 for { 16120 x := v.Args[0] 16121 v.reset(OpCopy) 16122 v.Type = x.Type 16123 v.AddArg(x) 16124 return true 16125 } 16126 } 16127 func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { 16128 b := v.Block 16129 _ = b 16130 // match: (Rsh16Ux16 <t> x y) 16131 // cond: 16132 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16]))) 16133 for { 16134 t := v.Type 16135 x := v.Args[0] 16136 y := v.Args[1] 16137 v.reset(Op386ANDL) 16138 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16139 v0.AddArg(x) 16140 v0.AddArg(y) 16141 v.AddArg(v0) 16142 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16143 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16144 v2.AuxInt = 16 16145 v2.AddArg(y) 16146 v1.AddArg(v2) 16147 v.AddArg(v1) 16148 return true 16149 } 16150 } 16151 func rewriteValue386_OpRsh16Ux32_0(v *Value) bool { 16152 b := v.Block 16153 _ = b 16154 // match: (Rsh16Ux32 <t> x y) 16155 // cond: 16156 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16]))) 16157 for { 16158 t := v.Type 16159 x := v.Args[0] 16160 y := v.Args[1] 16161 v.reset(Op386ANDL) 16162 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16163 v0.AddArg(x) 16164 v0.AddArg(y) 16165 v.AddArg(v0) 16166 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16167 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16168 v2.AuxInt = 16 16169 v2.AddArg(y) 16170 v1.AddArg(v2) 16171 v.AddArg(v1) 16172 return true 16173 } 16174 } 16175 func rewriteValue386_OpRsh16Ux64_0(v *Value) bool { 16176 // match: (Rsh16Ux64 x (Const64 [c])) 16177 // cond: uint64(c) < 16 16178 // result: (SHRWconst x [c]) 16179 for { 16180 x := v.Args[0] 16181 v_1 := v.Args[1] 16182 if v_1.Op != OpConst64 { 16183 break 16184 } 16185 c := v_1.AuxInt 16186 if !(uint64(c) < 16) { 16187 break 16188 } 16189 v.reset(Op386SHRWconst) 16190 v.AuxInt = c 16191 v.AddArg(x) 16192 return true 16193 } 16194 // match: (Rsh16Ux64 _ (Const64 [c])) 16195 // cond: uint64(c) >= 16 16196 // result: (Const16 [0]) 16197 for { 16198 v_1 := v.Args[1] 16199 if v_1.Op != OpConst64 { 16200 break 16201 } 16202 c := v_1.AuxInt 16203 if !(uint64(c) >= 16) { 16204 break 16205 } 16206 v.reset(OpConst16) 16207 v.AuxInt = 0 16208 return true 16209 } 16210 return false 16211 } 16212 func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { 16213 b := v.Block 16214 _ = b 16215 // match: (Rsh16Ux8 <t> x y) 16216 // cond: 16217 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16]))) 16218 for { 16219 t := v.Type 16220 x := v.Args[0] 16221 y := v.Args[1] 16222 v.reset(Op386ANDL) 16223 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16224 v0.AddArg(x) 16225 v0.AddArg(y) 16226 v.AddArg(v0) 16227 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16228 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16229 v2.AuxInt = 16 16230 v2.AddArg(y) 16231 v1.AddArg(v2) 16232 v.AddArg(v1) 16233 return true 16234 } 16235 } 16236 func rewriteValue386_OpRsh16x16_0(v *Value) bool { 16237 b := v.Block 16238 _ = b 16239 // match: (Rsh16x16 <t> x y) 16240 // cond: 16241 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16]))))) 16242 for { 16243 t := v.Type 16244 x := v.Args[0] 16245 y := v.Args[1] 16246 v.reset(Op386SARW) 16247 v.Type = t 16248 v.AddArg(x) 16249 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16250 v0.AddArg(y) 16251 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16252 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16253 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16254 v3.AuxInt = 16 16255 v3.AddArg(y) 16256 v2.AddArg(v3) 16257 v1.AddArg(v2) 16258 v0.AddArg(v1) 16259 v.AddArg(v0) 16260 return true 16261 } 16262 } 16263 func rewriteValue386_OpRsh16x32_0(v *Value) bool { 16264 b := v.Block 16265 _ = b 16266 // match: (Rsh16x32 <t> x y) 16267 // cond: 16268 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16]))))) 16269 for { 16270 t := v.Type 16271 x := v.Args[0] 16272 y := v.Args[1] 16273 v.reset(Op386SARW) 16274 v.Type = t 16275 v.AddArg(x) 16276 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16277 v0.AddArg(y) 16278 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16279 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16280 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16281 v3.AuxInt = 16 16282 v3.AddArg(y) 16283 v2.AddArg(v3) 16284 v1.AddArg(v2) 16285 v0.AddArg(v1) 16286 v.AddArg(v0) 16287 return true 16288 } 16289 } 16290 func rewriteValue386_OpRsh16x64_0(v *Value) bool { 16291 // match: (Rsh16x64 x (Const64 [c])) 16292 // cond: uint64(c) < 16 16293 // result: (SARWconst x [c]) 16294 for { 16295 x := v.Args[0] 16296 v_1 := v.Args[1] 16297 if v_1.Op != OpConst64 { 16298 break 16299 } 16300 c := v_1.AuxInt 16301 if !(uint64(c) < 16) { 16302 break 16303 } 16304 v.reset(Op386SARWconst) 16305 v.AuxInt = c 16306 v.AddArg(x) 16307 return true 16308 } 16309 // match: (Rsh16x64 x (Const64 [c])) 16310 // cond: uint64(c) >= 16 16311 // result: (SARWconst x [15]) 16312 for { 16313 x := v.Args[0] 16314 v_1 := v.Args[1] 16315 if v_1.Op != OpConst64 { 16316 break 16317 } 16318 c := v_1.AuxInt 16319 if !(uint64(c) >= 16) { 16320 break 16321 } 16322 v.reset(Op386SARWconst) 16323 v.AuxInt = 15 16324 v.AddArg(x) 16325 return true 16326 } 16327 return false 16328 } 16329 func rewriteValue386_OpRsh16x8_0(v *Value) bool { 16330 b := v.Block 16331 _ = b 16332 // match: (Rsh16x8 <t> x y) 16333 // cond: 16334 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16]))))) 16335 for { 16336 t := v.Type 16337 x := v.Args[0] 16338 y := v.Args[1] 16339 v.reset(Op386SARW) 16340 v.Type = t 16341 v.AddArg(x) 16342 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16343 v0.AddArg(y) 16344 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16345 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16346 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16347 v3.AuxInt = 16 16348 v3.AddArg(y) 16349 v2.AddArg(v3) 16350 v1.AddArg(v2) 16351 v0.AddArg(v1) 16352 v.AddArg(v0) 16353 return true 16354 } 16355 } 16356 func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { 16357 b := v.Block 16358 _ = b 16359 // match: (Rsh32Ux16 <t> x y) 16360 // cond: 16361 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 16362 for { 16363 t := v.Type 16364 x := v.Args[0] 16365 y := v.Args[1] 16366 v.reset(Op386ANDL) 16367 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 16368 v0.AddArg(x) 16369 v0.AddArg(y) 16370 v.AddArg(v0) 16371 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16372 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16373 v2.AuxInt = 32 16374 v2.AddArg(y) 16375 v1.AddArg(v2) 16376 v.AddArg(v1) 16377 return true 16378 } 16379 } 16380 func rewriteValue386_OpRsh32Ux32_0(v *Value) bool { 16381 b := v.Block 16382 _ = b 16383 // match: (Rsh32Ux32 <t> x y) 16384 // cond: 16385 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 16386 for { 16387 t := v.Type 16388 x := v.Args[0] 16389 y := v.Args[1] 16390 v.reset(Op386ANDL) 16391 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 16392 v0.AddArg(x) 16393 v0.AddArg(y) 16394 v.AddArg(v0) 16395 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16396 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16397 v2.AuxInt = 32 16398 v2.AddArg(y) 16399 v1.AddArg(v2) 16400 v.AddArg(v1) 16401 return true 16402 } 16403 } 16404 func rewriteValue386_OpRsh32Ux64_0(v *Value) bool { 16405 // match: (Rsh32Ux64 x (Const64 [c])) 16406 // cond: uint64(c) < 32 16407 // result: (SHRLconst x [c]) 16408 for { 16409 x := v.Args[0] 16410 v_1 := v.Args[1] 16411 if v_1.Op != OpConst64 { 16412 break 16413 } 16414 c := v_1.AuxInt 16415 if !(uint64(c) < 32) { 16416 break 16417 } 16418 v.reset(Op386SHRLconst) 16419 v.AuxInt = c 16420 v.AddArg(x) 16421 return true 16422 } 16423 // match: (Rsh32Ux64 _ (Const64 [c])) 16424 // cond: uint64(c) >= 32 16425 // result: (Const32 [0]) 16426 for { 16427 v_1 := v.Args[1] 16428 if v_1.Op != OpConst64 { 16429 break 16430 } 16431 c := v_1.AuxInt 16432 if !(uint64(c) >= 32) { 16433 break 16434 } 16435 v.reset(OpConst32) 16436 v.AuxInt = 0 16437 return true 16438 } 16439 return false 16440 } 16441 func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { 16442 b := v.Block 16443 _ = b 16444 // match: (Rsh32Ux8 <t> x y) 16445 // cond: 16446 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 16447 for { 16448 t := v.Type 16449 x := v.Args[0] 16450 y := v.Args[1] 16451 v.reset(Op386ANDL) 16452 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 16453 v0.AddArg(x) 16454 v0.AddArg(y) 16455 v.AddArg(v0) 16456 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16457 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16458 v2.AuxInt = 32 16459 v2.AddArg(y) 16460 v1.AddArg(v2) 16461 v.AddArg(v1) 16462 return true 16463 } 16464 } 16465 func rewriteValue386_OpRsh32x16_0(v *Value) bool { 16466 b := v.Block 16467 _ = b 16468 // match: (Rsh32x16 <t> x y) 16469 // cond: 16470 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32]))))) 16471 for { 16472 t := v.Type 16473 x := v.Args[0] 16474 y := v.Args[1] 16475 v.reset(Op386SARL) 16476 v.Type = t 16477 v.AddArg(x) 16478 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16479 v0.AddArg(y) 16480 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16481 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16482 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16483 v3.AuxInt = 32 16484 v3.AddArg(y) 16485 v2.AddArg(v3) 16486 v1.AddArg(v2) 16487 v0.AddArg(v1) 16488 v.AddArg(v0) 16489 return true 16490 } 16491 } 16492 func rewriteValue386_OpRsh32x32_0(v *Value) bool { 16493 b := v.Block 16494 _ = b 16495 // match: (Rsh32x32 <t> x y) 16496 // cond: 16497 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32]))))) 16498 for { 16499 t := v.Type 16500 x := v.Args[0] 16501 y := v.Args[1] 16502 v.reset(Op386SARL) 16503 v.Type = t 16504 v.AddArg(x) 16505 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16506 v0.AddArg(y) 16507 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16508 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16509 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16510 v3.AuxInt = 32 16511 v3.AddArg(y) 16512 v2.AddArg(v3) 16513 v1.AddArg(v2) 16514 v0.AddArg(v1) 16515 v.AddArg(v0) 16516 return true 16517 } 16518 } 16519 func rewriteValue386_OpRsh32x64_0(v *Value) bool { 16520 // match: (Rsh32x64 x (Const64 [c])) 16521 // cond: uint64(c) < 32 16522 // result: (SARLconst x [c]) 16523 for { 16524 x := v.Args[0] 16525 v_1 := v.Args[1] 16526 if v_1.Op != OpConst64 { 16527 break 16528 } 16529 c := v_1.AuxInt 16530 if !(uint64(c) < 32) { 16531 break 16532 } 16533 v.reset(Op386SARLconst) 16534 v.AuxInt = c 16535 v.AddArg(x) 16536 return true 16537 } 16538 // match: (Rsh32x64 x (Const64 [c])) 16539 // cond: uint64(c) >= 32 16540 // result: (SARLconst x [31]) 16541 for { 16542 x := v.Args[0] 16543 v_1 := v.Args[1] 16544 if v_1.Op != OpConst64 { 16545 break 16546 } 16547 c := v_1.AuxInt 16548 if !(uint64(c) >= 32) { 16549 break 16550 } 16551 v.reset(Op386SARLconst) 16552 v.AuxInt = 31 16553 v.AddArg(x) 16554 return true 16555 } 16556 return false 16557 } 16558 func rewriteValue386_OpRsh32x8_0(v *Value) bool { 16559 b := v.Block 16560 _ = b 16561 // match: (Rsh32x8 <t> x y) 16562 // cond: 16563 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32]))))) 16564 for { 16565 t := v.Type 16566 x := v.Args[0] 16567 y := v.Args[1] 16568 v.reset(Op386SARL) 16569 v.Type = t 16570 v.AddArg(x) 16571 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16572 v0.AddArg(y) 16573 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16574 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16575 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16576 v3.AuxInt = 32 16577 v3.AddArg(y) 16578 v2.AddArg(v3) 16579 v1.AddArg(v2) 16580 v0.AddArg(v1) 16581 v.AddArg(v0) 16582 return true 16583 } 16584 } 16585 func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { 16586 b := v.Block 16587 _ = b 16588 // match: (Rsh8Ux16 <t> x y) 16589 // cond: 16590 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8]))) 16591 for { 16592 t := v.Type 16593 x := v.Args[0] 16594 y := v.Args[1] 16595 v.reset(Op386ANDL) 16596 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 16597 v0.AddArg(x) 16598 v0.AddArg(y) 16599 v.AddArg(v0) 16600 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16601 v2 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16602 v2.AuxInt = 8 16603 v2.AddArg(y) 16604 v1.AddArg(v2) 16605 v.AddArg(v1) 16606 return true 16607 } 16608 } 16609 func rewriteValue386_OpRsh8Ux32_0(v *Value) bool { 16610 b := v.Block 16611 _ = b 16612 // match: (Rsh8Ux32 <t> x y) 16613 // cond: 16614 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8]))) 16615 for { 16616 t := v.Type 16617 x := v.Args[0] 16618 y := v.Args[1] 16619 v.reset(Op386ANDL) 16620 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 16621 v0.AddArg(x) 16622 v0.AddArg(y) 16623 v.AddArg(v0) 16624 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16625 v2 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16626 v2.AuxInt = 8 16627 v2.AddArg(y) 16628 v1.AddArg(v2) 16629 v.AddArg(v1) 16630 return true 16631 } 16632 } 16633 func rewriteValue386_OpRsh8Ux64_0(v *Value) bool { 16634 // match: (Rsh8Ux64 x (Const64 [c])) 16635 // cond: uint64(c) < 8 16636 // result: (SHRBconst x [c]) 16637 for { 16638 x := v.Args[0] 16639 v_1 := v.Args[1] 16640 if v_1.Op != OpConst64 { 16641 break 16642 } 16643 c := v_1.AuxInt 16644 if !(uint64(c) < 8) { 16645 break 16646 } 16647 v.reset(Op386SHRBconst) 16648 v.AuxInt = c 16649 v.AddArg(x) 16650 return true 16651 } 16652 // match: (Rsh8Ux64 _ (Const64 [c])) 16653 // cond: uint64(c) >= 8 16654 // result: (Const8 [0]) 16655 for { 16656 v_1 := v.Args[1] 16657 if v_1.Op != OpConst64 { 16658 break 16659 } 16660 c := v_1.AuxInt 16661 if !(uint64(c) >= 8) { 16662 break 16663 } 16664 v.reset(OpConst8) 16665 v.AuxInt = 0 16666 return true 16667 } 16668 return false 16669 } 16670 func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { 16671 b := v.Block 16672 _ = b 16673 // match: (Rsh8Ux8 <t> x y) 16674 // cond: 16675 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8]))) 16676 for { 16677 t := v.Type 16678 x := v.Args[0] 16679 y := v.Args[1] 16680 v.reset(Op386ANDL) 16681 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 16682 v0.AddArg(x) 16683 v0.AddArg(y) 16684 v.AddArg(v0) 16685 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16686 v2 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16687 v2.AuxInt = 8 16688 v2.AddArg(y) 16689 v1.AddArg(v2) 16690 v.AddArg(v1) 16691 return true 16692 } 16693 } 16694 func rewriteValue386_OpRsh8x16_0(v *Value) bool { 16695 b := v.Block 16696 _ = b 16697 // match: (Rsh8x16 <t> x y) 16698 // cond: 16699 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8]))))) 16700 for { 16701 t := v.Type 16702 x := v.Args[0] 16703 y := v.Args[1] 16704 v.reset(Op386SARB) 16705 v.Type = t 16706 v.AddArg(x) 16707 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16708 v0.AddArg(y) 16709 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16710 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16711 v3 := b.NewValue0(v.Pos, Op386CMPWconst, TypeFlags) 16712 v3.AuxInt = 8 16713 v3.AddArg(y) 16714 v2.AddArg(v3) 16715 v1.AddArg(v2) 16716 v0.AddArg(v1) 16717 v.AddArg(v0) 16718 return true 16719 } 16720 } 16721 func rewriteValue386_OpRsh8x32_0(v *Value) bool { 16722 b := v.Block 16723 _ = b 16724 // match: (Rsh8x32 <t> x y) 16725 // cond: 16726 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8]))))) 16727 for { 16728 t := v.Type 16729 x := v.Args[0] 16730 y := v.Args[1] 16731 v.reset(Op386SARB) 16732 v.Type = t 16733 v.AddArg(x) 16734 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16735 v0.AddArg(y) 16736 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16737 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16738 v3 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 16739 v3.AuxInt = 8 16740 v3.AddArg(y) 16741 v2.AddArg(v3) 16742 v1.AddArg(v2) 16743 v0.AddArg(v1) 16744 v.AddArg(v0) 16745 return true 16746 } 16747 } 16748 func rewriteValue386_OpRsh8x64_0(v *Value) bool { 16749 // match: (Rsh8x64 x (Const64 [c])) 16750 // cond: uint64(c) < 8 16751 // result: (SARBconst x [c]) 16752 for { 16753 x := v.Args[0] 16754 v_1 := v.Args[1] 16755 if v_1.Op != OpConst64 { 16756 break 16757 } 16758 c := v_1.AuxInt 16759 if !(uint64(c) < 8) { 16760 break 16761 } 16762 v.reset(Op386SARBconst) 16763 v.AuxInt = c 16764 v.AddArg(x) 16765 return true 16766 } 16767 // match: (Rsh8x64 x (Const64 [c])) 16768 // cond: uint64(c) >= 8 16769 // result: (SARBconst x [7]) 16770 for { 16771 x := v.Args[0] 16772 v_1 := v.Args[1] 16773 if v_1.Op != OpConst64 { 16774 break 16775 } 16776 c := v_1.AuxInt 16777 if !(uint64(c) >= 8) { 16778 break 16779 } 16780 v.reset(Op386SARBconst) 16781 v.AuxInt = 7 16782 v.AddArg(x) 16783 return true 16784 } 16785 return false 16786 } 16787 func rewriteValue386_OpRsh8x8_0(v *Value) bool { 16788 b := v.Block 16789 _ = b 16790 // match: (Rsh8x8 <t> x y) 16791 // cond: 16792 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8]))))) 16793 for { 16794 t := v.Type 16795 x := v.Args[0] 16796 y := v.Args[1] 16797 v.reset(Op386SARB) 16798 v.Type = t 16799 v.AddArg(x) 16800 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16801 v0.AddArg(y) 16802 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 16803 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 16804 v3 := b.NewValue0(v.Pos, Op386CMPBconst, TypeFlags) 16805 v3.AuxInt = 8 16806 v3.AddArg(y) 16807 v2.AddArg(v3) 16808 v1.AddArg(v2) 16809 v0.AddArg(v1) 16810 v.AddArg(v0) 16811 return true 16812 } 16813 } 16814 func rewriteValue386_OpSignExt16to32_0(v *Value) bool { 16815 // match: (SignExt16to32 x) 16816 // cond: 16817 // result: (MOVWLSX x) 16818 for { 16819 x := v.Args[0] 16820 v.reset(Op386MOVWLSX) 16821 v.AddArg(x) 16822 return true 16823 } 16824 } 16825 func rewriteValue386_OpSignExt8to16_0(v *Value) bool { 16826 // match: (SignExt8to16 x) 16827 // cond: 16828 // result: (MOVBLSX x) 16829 for { 16830 x := v.Args[0] 16831 v.reset(Op386MOVBLSX) 16832 v.AddArg(x) 16833 return true 16834 } 16835 } 16836 func rewriteValue386_OpSignExt8to32_0(v *Value) bool { 16837 // match: (SignExt8to32 x) 16838 // cond: 16839 // result: (MOVBLSX x) 16840 for { 16841 x := v.Args[0] 16842 v.reset(Op386MOVBLSX) 16843 v.AddArg(x) 16844 return true 16845 } 16846 } 16847 func rewriteValue386_OpSignmask_0(v *Value) bool { 16848 // match: (Signmask x) 16849 // cond: 16850 // result: (SARLconst x [31]) 16851 for { 16852 x := v.Args[0] 16853 v.reset(Op386SARLconst) 16854 v.AuxInt = 31 16855 v.AddArg(x) 16856 return true 16857 } 16858 } 16859 func rewriteValue386_OpSlicemask_0(v *Value) bool { 16860 b := v.Block 16861 _ = b 16862 // match: (Slicemask <t> x) 16863 // cond: 16864 // result: (SARLconst (NEGL <t> x) [31]) 16865 for { 16866 t := v.Type 16867 x := v.Args[0] 16868 v.reset(Op386SARLconst) 16869 v.AuxInt = 31 16870 v0 := b.NewValue0(v.Pos, Op386NEGL, t) 16871 v0.AddArg(x) 16872 v.AddArg(v0) 16873 return true 16874 } 16875 } 16876 func rewriteValue386_OpSqrt_0(v *Value) bool { 16877 // match: (Sqrt x) 16878 // cond: 16879 // result: (SQRTSD x) 16880 for { 16881 x := v.Args[0] 16882 v.reset(Op386SQRTSD) 16883 v.AddArg(x) 16884 return true 16885 } 16886 } 16887 func rewriteValue386_OpStaticCall_0(v *Value) bool { 16888 // match: (StaticCall [argwid] {target} mem) 16889 // cond: 16890 // result: (CALLstatic [argwid] {target} mem) 16891 for { 16892 argwid := v.AuxInt 16893 target := v.Aux 16894 mem := v.Args[0] 16895 v.reset(Op386CALLstatic) 16896 v.AuxInt = argwid 16897 v.Aux = target 16898 v.AddArg(mem) 16899 return true 16900 } 16901 } 16902 func rewriteValue386_OpStore_0(v *Value) bool { 16903 // match: (Store {t} ptr val mem) 16904 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 16905 // result: (MOVSDstore ptr val mem) 16906 for { 16907 t := v.Aux 16908 ptr := v.Args[0] 16909 val := v.Args[1] 16910 mem := v.Args[2] 16911 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 16912 break 16913 } 16914 v.reset(Op386MOVSDstore) 16915 v.AddArg(ptr) 16916 v.AddArg(val) 16917 v.AddArg(mem) 16918 return true 16919 } 16920 // match: (Store {t} ptr val mem) 16921 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 16922 // result: (MOVSSstore ptr val mem) 16923 for { 16924 t := v.Aux 16925 ptr := v.Args[0] 16926 val := v.Args[1] 16927 mem := v.Args[2] 16928 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 16929 break 16930 } 16931 v.reset(Op386MOVSSstore) 16932 v.AddArg(ptr) 16933 v.AddArg(val) 16934 v.AddArg(mem) 16935 return true 16936 } 16937 // match: (Store {t} ptr val mem) 16938 // cond: t.(Type).Size() == 4 16939 // result: (MOVLstore ptr val mem) 16940 for { 16941 t := v.Aux 16942 ptr := v.Args[0] 16943 val := v.Args[1] 16944 mem := v.Args[2] 16945 if !(t.(Type).Size() == 4) { 16946 break 16947 } 16948 v.reset(Op386MOVLstore) 16949 v.AddArg(ptr) 16950 v.AddArg(val) 16951 v.AddArg(mem) 16952 return true 16953 } 16954 // match: (Store {t} ptr val mem) 16955 // cond: t.(Type).Size() == 2 16956 // result: (MOVWstore ptr val mem) 16957 for { 16958 t := v.Aux 16959 ptr := v.Args[0] 16960 val := v.Args[1] 16961 mem := v.Args[2] 16962 if !(t.(Type).Size() == 2) { 16963 break 16964 } 16965 v.reset(Op386MOVWstore) 16966 v.AddArg(ptr) 16967 v.AddArg(val) 16968 v.AddArg(mem) 16969 return true 16970 } 16971 // match: (Store {t} ptr val mem) 16972 // cond: t.(Type).Size() == 1 16973 // result: (MOVBstore ptr val mem) 16974 for { 16975 t := v.Aux 16976 ptr := v.Args[0] 16977 val := v.Args[1] 16978 mem := v.Args[2] 16979 if !(t.(Type).Size() == 1) { 16980 break 16981 } 16982 v.reset(Op386MOVBstore) 16983 v.AddArg(ptr) 16984 v.AddArg(val) 16985 v.AddArg(mem) 16986 return true 16987 } 16988 return false 16989 } 16990 func rewriteValue386_OpSub16_0(v *Value) bool { 16991 // match: (Sub16 x y) 16992 // cond: 16993 // result: (SUBL x y) 16994 for { 16995 x := v.Args[0] 16996 y := v.Args[1] 16997 v.reset(Op386SUBL) 16998 v.AddArg(x) 16999 v.AddArg(y) 17000 return true 17001 } 17002 } 17003 func rewriteValue386_OpSub32_0(v *Value) bool { 17004 // match: (Sub32 x y) 17005 // cond: 17006 // result: (SUBL x y) 17007 for { 17008 x := v.Args[0] 17009 y := v.Args[1] 17010 v.reset(Op386SUBL) 17011 v.AddArg(x) 17012 v.AddArg(y) 17013 return true 17014 } 17015 } 17016 func rewriteValue386_OpSub32F_0(v *Value) bool { 17017 // match: (Sub32F x y) 17018 // cond: 17019 // result: (SUBSS x y) 17020 for { 17021 x := v.Args[0] 17022 y := v.Args[1] 17023 v.reset(Op386SUBSS) 17024 v.AddArg(x) 17025 v.AddArg(y) 17026 return true 17027 } 17028 } 17029 func rewriteValue386_OpSub32carry_0(v *Value) bool { 17030 // match: (Sub32carry x y) 17031 // cond: 17032 // result: (SUBLcarry x y) 17033 for { 17034 x := v.Args[0] 17035 y := v.Args[1] 17036 v.reset(Op386SUBLcarry) 17037 v.AddArg(x) 17038 v.AddArg(y) 17039 return true 17040 } 17041 } 17042 func rewriteValue386_OpSub32withcarry_0(v *Value) bool { 17043 // match: (Sub32withcarry x y c) 17044 // cond: 17045 // result: (SBBL x y c) 17046 for { 17047 x := v.Args[0] 17048 y := v.Args[1] 17049 c := v.Args[2] 17050 v.reset(Op386SBBL) 17051 v.AddArg(x) 17052 v.AddArg(y) 17053 v.AddArg(c) 17054 return true 17055 } 17056 } 17057 func rewriteValue386_OpSub64F_0(v *Value) bool { 17058 // match: (Sub64F x y) 17059 // cond: 17060 // result: (SUBSD x y) 17061 for { 17062 x := v.Args[0] 17063 y := v.Args[1] 17064 v.reset(Op386SUBSD) 17065 v.AddArg(x) 17066 v.AddArg(y) 17067 return true 17068 } 17069 } 17070 func rewriteValue386_OpSub8_0(v *Value) bool { 17071 // match: (Sub8 x y) 17072 // cond: 17073 // result: (SUBL x y) 17074 for { 17075 x := v.Args[0] 17076 y := v.Args[1] 17077 v.reset(Op386SUBL) 17078 v.AddArg(x) 17079 v.AddArg(y) 17080 return true 17081 } 17082 } 17083 func rewriteValue386_OpSubPtr_0(v *Value) bool { 17084 // match: (SubPtr x y) 17085 // cond: 17086 // result: (SUBL x y) 17087 for { 17088 x := v.Args[0] 17089 y := v.Args[1] 17090 v.reset(Op386SUBL) 17091 v.AddArg(x) 17092 v.AddArg(y) 17093 return true 17094 } 17095 } 17096 func rewriteValue386_OpTrunc16to8_0(v *Value) bool { 17097 // match: (Trunc16to8 x) 17098 // cond: 17099 // result: x 17100 for { 17101 x := v.Args[0] 17102 v.reset(OpCopy) 17103 v.Type = x.Type 17104 v.AddArg(x) 17105 return true 17106 } 17107 } 17108 func rewriteValue386_OpTrunc32to16_0(v *Value) bool { 17109 // match: (Trunc32to16 x) 17110 // cond: 17111 // result: x 17112 for { 17113 x := v.Args[0] 17114 v.reset(OpCopy) 17115 v.Type = x.Type 17116 v.AddArg(x) 17117 return true 17118 } 17119 } 17120 func rewriteValue386_OpTrunc32to8_0(v *Value) bool { 17121 // match: (Trunc32to8 x) 17122 // cond: 17123 // result: x 17124 for { 17125 x := v.Args[0] 17126 v.reset(OpCopy) 17127 v.Type = x.Type 17128 v.AddArg(x) 17129 return true 17130 } 17131 } 17132 func rewriteValue386_OpXor16_0(v *Value) bool { 17133 // match: (Xor16 x y) 17134 // cond: 17135 // result: (XORL x y) 17136 for { 17137 x := v.Args[0] 17138 y := v.Args[1] 17139 v.reset(Op386XORL) 17140 v.AddArg(x) 17141 v.AddArg(y) 17142 return true 17143 } 17144 } 17145 func rewriteValue386_OpXor32_0(v *Value) bool { 17146 // match: (Xor32 x y) 17147 // cond: 17148 // result: (XORL x y) 17149 for { 17150 x := v.Args[0] 17151 y := v.Args[1] 17152 v.reset(Op386XORL) 17153 v.AddArg(x) 17154 v.AddArg(y) 17155 return true 17156 } 17157 } 17158 func rewriteValue386_OpXor8_0(v *Value) bool { 17159 // match: (Xor8 x y) 17160 // cond: 17161 // result: (XORL x y) 17162 for { 17163 x := v.Args[0] 17164 y := v.Args[1] 17165 v.reset(Op386XORL) 17166 v.AddArg(x) 17167 v.AddArg(y) 17168 return true 17169 } 17170 } 17171 func rewriteValue386_OpZero_0(v *Value) bool { 17172 b := v.Block 17173 _ = b 17174 types := &b.Func.Config.Types 17175 _ = types 17176 // match: (Zero [0] _ mem) 17177 // cond: 17178 // result: mem 17179 for { 17180 if v.AuxInt != 0 { 17181 break 17182 } 17183 mem := v.Args[1] 17184 v.reset(OpCopy) 17185 v.Type = mem.Type 17186 v.AddArg(mem) 17187 return true 17188 } 17189 // match: (Zero [1] destptr mem) 17190 // cond: 17191 // result: (MOVBstoreconst [0] destptr mem) 17192 for { 17193 if v.AuxInt != 1 { 17194 break 17195 } 17196 destptr := v.Args[0] 17197 mem := v.Args[1] 17198 v.reset(Op386MOVBstoreconst) 17199 v.AuxInt = 0 17200 v.AddArg(destptr) 17201 v.AddArg(mem) 17202 return true 17203 } 17204 // match: (Zero [2] destptr mem) 17205 // cond: 17206 // result: (MOVWstoreconst [0] destptr mem) 17207 for { 17208 if v.AuxInt != 2 { 17209 break 17210 } 17211 destptr := v.Args[0] 17212 mem := v.Args[1] 17213 v.reset(Op386MOVWstoreconst) 17214 v.AuxInt = 0 17215 v.AddArg(destptr) 17216 v.AddArg(mem) 17217 return true 17218 } 17219 // match: (Zero [4] destptr mem) 17220 // cond: 17221 // result: (MOVLstoreconst [0] destptr mem) 17222 for { 17223 if v.AuxInt != 4 { 17224 break 17225 } 17226 destptr := v.Args[0] 17227 mem := v.Args[1] 17228 v.reset(Op386MOVLstoreconst) 17229 v.AuxInt = 0 17230 v.AddArg(destptr) 17231 v.AddArg(mem) 17232 return true 17233 } 17234 // match: (Zero [3] destptr mem) 17235 // cond: 17236 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVWstoreconst [0] destptr mem)) 17237 for { 17238 if v.AuxInt != 3 { 17239 break 17240 } 17241 destptr := v.Args[0] 17242 mem := v.Args[1] 17243 v.reset(Op386MOVBstoreconst) 17244 v.AuxInt = makeValAndOff(0, 2) 17245 v.AddArg(destptr) 17246 v0 := b.NewValue0(v.Pos, Op386MOVWstoreconst, TypeMem) 17247 v0.AuxInt = 0 17248 v0.AddArg(destptr) 17249 v0.AddArg(mem) 17250 v.AddArg(v0) 17251 return true 17252 } 17253 // match: (Zero [5] destptr mem) 17254 // cond: 17255 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 17256 for { 17257 if v.AuxInt != 5 { 17258 break 17259 } 17260 destptr := v.Args[0] 17261 mem := v.Args[1] 17262 v.reset(Op386MOVBstoreconst) 17263 v.AuxInt = makeValAndOff(0, 4) 17264 v.AddArg(destptr) 17265 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17266 v0.AuxInt = 0 17267 v0.AddArg(destptr) 17268 v0.AddArg(mem) 17269 v.AddArg(v0) 17270 return true 17271 } 17272 // match: (Zero [6] destptr mem) 17273 // cond: 17274 // result: (MOVWstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 17275 for { 17276 if v.AuxInt != 6 { 17277 break 17278 } 17279 destptr := v.Args[0] 17280 mem := v.Args[1] 17281 v.reset(Op386MOVWstoreconst) 17282 v.AuxInt = makeValAndOff(0, 4) 17283 v.AddArg(destptr) 17284 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17285 v0.AuxInt = 0 17286 v0.AddArg(destptr) 17287 v0.AddArg(mem) 17288 v.AddArg(v0) 17289 return true 17290 } 17291 // match: (Zero [7] destptr mem) 17292 // cond: 17293 // result: (MOVLstoreconst [makeValAndOff(0,3)] destptr (MOVLstoreconst [0] destptr mem)) 17294 for { 17295 if v.AuxInt != 7 { 17296 break 17297 } 17298 destptr := v.Args[0] 17299 mem := v.Args[1] 17300 v.reset(Op386MOVLstoreconst) 17301 v.AuxInt = makeValAndOff(0, 3) 17302 v.AddArg(destptr) 17303 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17304 v0.AuxInt = 0 17305 v0.AddArg(destptr) 17306 v0.AddArg(mem) 17307 v.AddArg(v0) 17308 return true 17309 } 17310 // match: (Zero [s] destptr mem) 17311 // cond: s%4 != 0 && s > 4 17312 // result: (Zero [s-s%4] (ADDLconst destptr [s%4]) (MOVLstoreconst [0] destptr mem)) 17313 for { 17314 s := v.AuxInt 17315 destptr := v.Args[0] 17316 mem := v.Args[1] 17317 if !(s%4 != 0 && s > 4) { 17318 break 17319 } 17320 v.reset(OpZero) 17321 v.AuxInt = s - s%4 17322 v0 := b.NewValue0(v.Pos, Op386ADDLconst, types.UInt32) 17323 v0.AuxInt = s % 4 17324 v0.AddArg(destptr) 17325 v.AddArg(v0) 17326 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17327 v1.AuxInt = 0 17328 v1.AddArg(destptr) 17329 v1.AddArg(mem) 17330 v.AddArg(v1) 17331 return true 17332 } 17333 // match: (Zero [8] destptr mem) 17334 // cond: 17335 // result: (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 17336 for { 17337 if v.AuxInt != 8 { 17338 break 17339 } 17340 destptr := v.Args[0] 17341 mem := v.Args[1] 17342 v.reset(Op386MOVLstoreconst) 17343 v.AuxInt = makeValAndOff(0, 4) 17344 v.AddArg(destptr) 17345 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17346 v0.AuxInt = 0 17347 v0.AddArg(destptr) 17348 v0.AddArg(mem) 17349 v.AddArg(v0) 17350 return true 17351 } 17352 return false 17353 } 17354 func rewriteValue386_OpZero_10(v *Value) bool { 17355 b := v.Block 17356 _ = b 17357 config := b.Func.Config 17358 _ = config 17359 types := &b.Func.Config.Types 17360 _ = types 17361 // match: (Zero [12] destptr mem) 17362 // cond: 17363 // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) 17364 for { 17365 if v.AuxInt != 12 { 17366 break 17367 } 17368 destptr := v.Args[0] 17369 mem := v.Args[1] 17370 v.reset(Op386MOVLstoreconst) 17371 v.AuxInt = makeValAndOff(0, 8) 17372 v.AddArg(destptr) 17373 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17374 v0.AuxInt = makeValAndOff(0, 4) 17375 v0.AddArg(destptr) 17376 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17377 v1.AuxInt = 0 17378 v1.AddArg(destptr) 17379 v1.AddArg(mem) 17380 v0.AddArg(v1) 17381 v.AddArg(v0) 17382 return true 17383 } 17384 // match: (Zero [16] destptr mem) 17385 // cond: 17386 // result: (MOVLstoreconst [makeValAndOff(0,12)] destptr (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)))) 17387 for { 17388 if v.AuxInt != 16 { 17389 break 17390 } 17391 destptr := v.Args[0] 17392 mem := v.Args[1] 17393 v.reset(Op386MOVLstoreconst) 17394 v.AuxInt = makeValAndOff(0, 12) 17395 v.AddArg(destptr) 17396 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17397 v0.AuxInt = makeValAndOff(0, 8) 17398 v0.AddArg(destptr) 17399 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17400 v1.AuxInt = makeValAndOff(0, 4) 17401 v1.AddArg(destptr) 17402 v2 := b.NewValue0(v.Pos, Op386MOVLstoreconst, TypeMem) 17403 v2.AuxInt = 0 17404 v2.AddArg(destptr) 17405 v2.AddArg(mem) 17406 v1.AddArg(v2) 17407 v0.AddArg(v1) 17408 v.AddArg(v0) 17409 return true 17410 } 17411 // match: (Zero [s] destptr mem) 17412 // cond: s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 17413 // result: (DUFFZERO [1*(128-s/4)] destptr (MOVLconst [0]) mem) 17414 for { 17415 s := v.AuxInt 17416 destptr := v.Args[0] 17417 mem := v.Args[1] 17418 if !(s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 17419 break 17420 } 17421 v.reset(Op386DUFFZERO) 17422 v.AuxInt = 1 * (128 - s/4) 17423 v.AddArg(destptr) 17424 v0 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 17425 v0.AuxInt = 0 17426 v.AddArg(v0) 17427 v.AddArg(mem) 17428 return true 17429 } 17430 // match: (Zero [s] destptr mem) 17431 // cond: (s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0 17432 // result: (REPSTOSL destptr (MOVLconst [s/4]) (MOVLconst [0]) mem) 17433 for { 17434 s := v.AuxInt 17435 destptr := v.Args[0] 17436 mem := v.Args[1] 17437 if !((s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0) { 17438 break 17439 } 17440 v.reset(Op386REPSTOSL) 17441 v.AddArg(destptr) 17442 v0 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 17443 v0.AuxInt = s / 4 17444 v.AddArg(v0) 17445 v1 := b.NewValue0(v.Pos, Op386MOVLconst, types.UInt32) 17446 v1.AuxInt = 0 17447 v.AddArg(v1) 17448 v.AddArg(mem) 17449 return true 17450 } 17451 return false 17452 } 17453 func rewriteValue386_OpZeroExt16to32_0(v *Value) bool { 17454 // match: (ZeroExt16to32 x) 17455 // cond: 17456 // result: (MOVWLZX x) 17457 for { 17458 x := v.Args[0] 17459 v.reset(Op386MOVWLZX) 17460 v.AddArg(x) 17461 return true 17462 } 17463 } 17464 func rewriteValue386_OpZeroExt8to16_0(v *Value) bool { 17465 // match: (ZeroExt8to16 x) 17466 // cond: 17467 // result: (MOVBLZX x) 17468 for { 17469 x := v.Args[0] 17470 v.reset(Op386MOVBLZX) 17471 v.AddArg(x) 17472 return true 17473 } 17474 } 17475 func rewriteValue386_OpZeroExt8to32_0(v *Value) bool { 17476 // match: (ZeroExt8to32 x) 17477 // cond: 17478 // result: (MOVBLZX x) 17479 for { 17480 x := v.Args[0] 17481 v.reset(Op386MOVBLZX) 17482 v.AddArg(x) 17483 return true 17484 } 17485 } 17486 func rewriteValue386_OpZeromask_0(v *Value) bool { 17487 b := v.Block 17488 _ = b 17489 // match: (Zeromask <t> x) 17490 // cond: 17491 // result: (XORLconst [-1] (SBBLcarrymask <t> (CMPLconst x [1]))) 17492 for { 17493 t := v.Type 17494 x := v.Args[0] 17495 v.reset(Op386XORLconst) 17496 v.AuxInt = -1 17497 v0 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17498 v1 := b.NewValue0(v.Pos, Op386CMPLconst, TypeFlags) 17499 v1.AuxInt = 1 17500 v1.AddArg(x) 17501 v0.AddArg(v1) 17502 v.AddArg(v0) 17503 return true 17504 } 17505 } 17506 func rewriteBlock386(b *Block) bool { 17507 config := b.Func.Config 17508 _ = config 17509 fe := b.Func.fe 17510 _ = fe 17511 types := &config.Types 17512 _ = types 17513 switch b.Kind { 17514 case Block386EQ: 17515 // match: (EQ (InvertFlags cmp) yes no) 17516 // cond: 17517 // result: (EQ cmp yes no) 17518 for { 17519 v := b.Control 17520 if v.Op != Op386InvertFlags { 17521 break 17522 } 17523 cmp := v.Args[0] 17524 b.Kind = Block386EQ 17525 b.SetControl(cmp) 17526 return true 17527 } 17528 // match: (EQ (FlagEQ) yes no) 17529 // cond: 17530 // result: (First nil yes no) 17531 for { 17532 v := b.Control 17533 if v.Op != Op386FlagEQ { 17534 break 17535 } 17536 b.Kind = BlockFirst 17537 b.SetControl(nil) 17538 return true 17539 } 17540 // match: (EQ (FlagLT_ULT) yes no) 17541 // cond: 17542 // result: (First nil no yes) 17543 for { 17544 v := b.Control 17545 if v.Op != Op386FlagLT_ULT { 17546 break 17547 } 17548 b.Kind = BlockFirst 17549 b.SetControl(nil) 17550 b.swapSuccessors() 17551 return true 17552 } 17553 // match: (EQ (FlagLT_UGT) yes no) 17554 // cond: 17555 // result: (First nil no yes) 17556 for { 17557 v := b.Control 17558 if v.Op != Op386FlagLT_UGT { 17559 break 17560 } 17561 b.Kind = BlockFirst 17562 b.SetControl(nil) 17563 b.swapSuccessors() 17564 return true 17565 } 17566 // match: (EQ (FlagGT_ULT) yes no) 17567 // cond: 17568 // result: (First nil no yes) 17569 for { 17570 v := b.Control 17571 if v.Op != Op386FlagGT_ULT { 17572 break 17573 } 17574 b.Kind = BlockFirst 17575 b.SetControl(nil) 17576 b.swapSuccessors() 17577 return true 17578 } 17579 // match: (EQ (FlagGT_UGT) yes no) 17580 // cond: 17581 // result: (First nil no yes) 17582 for { 17583 v := b.Control 17584 if v.Op != Op386FlagGT_UGT { 17585 break 17586 } 17587 b.Kind = BlockFirst 17588 b.SetControl(nil) 17589 b.swapSuccessors() 17590 return true 17591 } 17592 case Block386GE: 17593 // match: (GE (InvertFlags cmp) yes no) 17594 // cond: 17595 // result: (LE cmp yes no) 17596 for { 17597 v := b.Control 17598 if v.Op != Op386InvertFlags { 17599 break 17600 } 17601 cmp := v.Args[0] 17602 b.Kind = Block386LE 17603 b.SetControl(cmp) 17604 return true 17605 } 17606 // match: (GE (FlagEQ) yes no) 17607 // cond: 17608 // result: (First nil yes no) 17609 for { 17610 v := b.Control 17611 if v.Op != Op386FlagEQ { 17612 break 17613 } 17614 b.Kind = BlockFirst 17615 b.SetControl(nil) 17616 return true 17617 } 17618 // match: (GE (FlagLT_ULT) yes no) 17619 // cond: 17620 // result: (First nil no yes) 17621 for { 17622 v := b.Control 17623 if v.Op != Op386FlagLT_ULT { 17624 break 17625 } 17626 b.Kind = BlockFirst 17627 b.SetControl(nil) 17628 b.swapSuccessors() 17629 return true 17630 } 17631 // match: (GE (FlagLT_UGT) yes no) 17632 // cond: 17633 // result: (First nil no yes) 17634 for { 17635 v := b.Control 17636 if v.Op != Op386FlagLT_UGT { 17637 break 17638 } 17639 b.Kind = BlockFirst 17640 b.SetControl(nil) 17641 b.swapSuccessors() 17642 return true 17643 } 17644 // match: (GE (FlagGT_ULT) yes no) 17645 // cond: 17646 // result: (First nil yes no) 17647 for { 17648 v := b.Control 17649 if v.Op != Op386FlagGT_ULT { 17650 break 17651 } 17652 b.Kind = BlockFirst 17653 b.SetControl(nil) 17654 return true 17655 } 17656 // match: (GE (FlagGT_UGT) yes no) 17657 // cond: 17658 // result: (First nil yes no) 17659 for { 17660 v := b.Control 17661 if v.Op != Op386FlagGT_UGT { 17662 break 17663 } 17664 b.Kind = BlockFirst 17665 b.SetControl(nil) 17666 return true 17667 } 17668 case Block386GT: 17669 // match: (GT (InvertFlags cmp) yes no) 17670 // cond: 17671 // result: (LT cmp yes no) 17672 for { 17673 v := b.Control 17674 if v.Op != Op386InvertFlags { 17675 break 17676 } 17677 cmp := v.Args[0] 17678 b.Kind = Block386LT 17679 b.SetControl(cmp) 17680 return true 17681 } 17682 // match: (GT (FlagEQ) yes no) 17683 // cond: 17684 // result: (First nil no yes) 17685 for { 17686 v := b.Control 17687 if v.Op != Op386FlagEQ { 17688 break 17689 } 17690 b.Kind = BlockFirst 17691 b.SetControl(nil) 17692 b.swapSuccessors() 17693 return true 17694 } 17695 // match: (GT (FlagLT_ULT) yes no) 17696 // cond: 17697 // result: (First nil no yes) 17698 for { 17699 v := b.Control 17700 if v.Op != Op386FlagLT_ULT { 17701 break 17702 } 17703 b.Kind = BlockFirst 17704 b.SetControl(nil) 17705 b.swapSuccessors() 17706 return true 17707 } 17708 // match: (GT (FlagLT_UGT) yes no) 17709 // cond: 17710 // result: (First nil no yes) 17711 for { 17712 v := b.Control 17713 if v.Op != Op386FlagLT_UGT { 17714 break 17715 } 17716 b.Kind = BlockFirst 17717 b.SetControl(nil) 17718 b.swapSuccessors() 17719 return true 17720 } 17721 // match: (GT (FlagGT_ULT) yes no) 17722 // cond: 17723 // result: (First nil yes no) 17724 for { 17725 v := b.Control 17726 if v.Op != Op386FlagGT_ULT { 17727 break 17728 } 17729 b.Kind = BlockFirst 17730 b.SetControl(nil) 17731 return true 17732 } 17733 // match: (GT (FlagGT_UGT) yes no) 17734 // cond: 17735 // result: (First nil yes no) 17736 for { 17737 v := b.Control 17738 if v.Op != Op386FlagGT_UGT { 17739 break 17740 } 17741 b.Kind = BlockFirst 17742 b.SetControl(nil) 17743 return true 17744 } 17745 case BlockIf: 17746 // match: (If (SETL cmp) yes no) 17747 // cond: 17748 // result: (LT cmp yes no) 17749 for { 17750 v := b.Control 17751 if v.Op != Op386SETL { 17752 break 17753 } 17754 cmp := v.Args[0] 17755 b.Kind = Block386LT 17756 b.SetControl(cmp) 17757 return true 17758 } 17759 // match: (If (SETLE cmp) yes no) 17760 // cond: 17761 // result: (LE cmp yes no) 17762 for { 17763 v := b.Control 17764 if v.Op != Op386SETLE { 17765 break 17766 } 17767 cmp := v.Args[0] 17768 b.Kind = Block386LE 17769 b.SetControl(cmp) 17770 return true 17771 } 17772 // match: (If (SETG cmp) yes no) 17773 // cond: 17774 // result: (GT cmp yes no) 17775 for { 17776 v := b.Control 17777 if v.Op != Op386SETG { 17778 break 17779 } 17780 cmp := v.Args[0] 17781 b.Kind = Block386GT 17782 b.SetControl(cmp) 17783 return true 17784 } 17785 // match: (If (SETGE cmp) yes no) 17786 // cond: 17787 // result: (GE cmp yes no) 17788 for { 17789 v := b.Control 17790 if v.Op != Op386SETGE { 17791 break 17792 } 17793 cmp := v.Args[0] 17794 b.Kind = Block386GE 17795 b.SetControl(cmp) 17796 return true 17797 } 17798 // match: (If (SETEQ cmp) yes no) 17799 // cond: 17800 // result: (EQ cmp yes no) 17801 for { 17802 v := b.Control 17803 if v.Op != Op386SETEQ { 17804 break 17805 } 17806 cmp := v.Args[0] 17807 b.Kind = Block386EQ 17808 b.SetControl(cmp) 17809 return true 17810 } 17811 // match: (If (SETNE cmp) yes no) 17812 // cond: 17813 // result: (NE cmp yes no) 17814 for { 17815 v := b.Control 17816 if v.Op != Op386SETNE { 17817 break 17818 } 17819 cmp := v.Args[0] 17820 b.Kind = Block386NE 17821 b.SetControl(cmp) 17822 return true 17823 } 17824 // match: (If (SETB cmp) yes no) 17825 // cond: 17826 // result: (ULT cmp yes no) 17827 for { 17828 v := b.Control 17829 if v.Op != Op386SETB { 17830 break 17831 } 17832 cmp := v.Args[0] 17833 b.Kind = Block386ULT 17834 b.SetControl(cmp) 17835 return true 17836 } 17837 // match: (If (SETBE cmp) yes no) 17838 // cond: 17839 // result: (ULE cmp yes no) 17840 for { 17841 v := b.Control 17842 if v.Op != Op386SETBE { 17843 break 17844 } 17845 cmp := v.Args[0] 17846 b.Kind = Block386ULE 17847 b.SetControl(cmp) 17848 return true 17849 } 17850 // match: (If (SETA cmp) yes no) 17851 // cond: 17852 // result: (UGT cmp yes no) 17853 for { 17854 v := b.Control 17855 if v.Op != Op386SETA { 17856 break 17857 } 17858 cmp := v.Args[0] 17859 b.Kind = Block386UGT 17860 b.SetControl(cmp) 17861 return true 17862 } 17863 // match: (If (SETAE cmp) yes no) 17864 // cond: 17865 // result: (UGE cmp yes no) 17866 for { 17867 v := b.Control 17868 if v.Op != Op386SETAE { 17869 break 17870 } 17871 cmp := v.Args[0] 17872 b.Kind = Block386UGE 17873 b.SetControl(cmp) 17874 return true 17875 } 17876 // match: (If (SETGF cmp) yes no) 17877 // cond: 17878 // result: (UGT cmp yes no) 17879 for { 17880 v := b.Control 17881 if v.Op != Op386SETGF { 17882 break 17883 } 17884 cmp := v.Args[0] 17885 b.Kind = Block386UGT 17886 b.SetControl(cmp) 17887 return true 17888 } 17889 // match: (If (SETGEF cmp) yes no) 17890 // cond: 17891 // result: (UGE cmp yes no) 17892 for { 17893 v := b.Control 17894 if v.Op != Op386SETGEF { 17895 break 17896 } 17897 cmp := v.Args[0] 17898 b.Kind = Block386UGE 17899 b.SetControl(cmp) 17900 return true 17901 } 17902 // match: (If (SETEQF cmp) yes no) 17903 // cond: 17904 // result: (EQF cmp yes no) 17905 for { 17906 v := b.Control 17907 if v.Op != Op386SETEQF { 17908 break 17909 } 17910 cmp := v.Args[0] 17911 b.Kind = Block386EQF 17912 b.SetControl(cmp) 17913 return true 17914 } 17915 // match: (If (SETNEF cmp) yes no) 17916 // cond: 17917 // result: (NEF cmp yes no) 17918 for { 17919 v := b.Control 17920 if v.Op != Op386SETNEF { 17921 break 17922 } 17923 cmp := v.Args[0] 17924 b.Kind = Block386NEF 17925 b.SetControl(cmp) 17926 return true 17927 } 17928 // match: (If cond yes no) 17929 // cond: 17930 // result: (NE (TESTB cond cond) yes no) 17931 for { 17932 v := b.Control 17933 _ = v 17934 cond := b.Control 17935 b.Kind = Block386NE 17936 v0 := b.NewValue0(v.Pos, Op386TESTB, TypeFlags) 17937 v0.AddArg(cond) 17938 v0.AddArg(cond) 17939 b.SetControl(v0) 17940 return true 17941 } 17942 case Block386LE: 17943 // match: (LE (InvertFlags cmp) yes no) 17944 // cond: 17945 // result: (GE cmp yes no) 17946 for { 17947 v := b.Control 17948 if v.Op != Op386InvertFlags { 17949 break 17950 } 17951 cmp := v.Args[0] 17952 b.Kind = Block386GE 17953 b.SetControl(cmp) 17954 return true 17955 } 17956 // match: (LE (FlagEQ) yes no) 17957 // cond: 17958 // result: (First nil yes no) 17959 for { 17960 v := b.Control 17961 if v.Op != Op386FlagEQ { 17962 break 17963 } 17964 b.Kind = BlockFirst 17965 b.SetControl(nil) 17966 return true 17967 } 17968 // match: (LE (FlagLT_ULT) yes no) 17969 // cond: 17970 // result: (First nil yes no) 17971 for { 17972 v := b.Control 17973 if v.Op != Op386FlagLT_ULT { 17974 break 17975 } 17976 b.Kind = BlockFirst 17977 b.SetControl(nil) 17978 return true 17979 } 17980 // match: (LE (FlagLT_UGT) yes no) 17981 // cond: 17982 // result: (First nil yes no) 17983 for { 17984 v := b.Control 17985 if v.Op != Op386FlagLT_UGT { 17986 break 17987 } 17988 b.Kind = BlockFirst 17989 b.SetControl(nil) 17990 return true 17991 } 17992 // match: (LE (FlagGT_ULT) yes no) 17993 // cond: 17994 // result: (First nil no yes) 17995 for { 17996 v := b.Control 17997 if v.Op != Op386FlagGT_ULT { 17998 break 17999 } 18000 b.Kind = BlockFirst 18001 b.SetControl(nil) 18002 b.swapSuccessors() 18003 return true 18004 } 18005 // match: (LE (FlagGT_UGT) yes no) 18006 // cond: 18007 // result: (First nil no yes) 18008 for { 18009 v := b.Control 18010 if v.Op != Op386FlagGT_UGT { 18011 break 18012 } 18013 b.Kind = BlockFirst 18014 b.SetControl(nil) 18015 b.swapSuccessors() 18016 return true 18017 } 18018 case Block386LT: 18019 // match: (LT (InvertFlags cmp) yes no) 18020 // cond: 18021 // result: (GT cmp yes no) 18022 for { 18023 v := b.Control 18024 if v.Op != Op386InvertFlags { 18025 break 18026 } 18027 cmp := v.Args[0] 18028 b.Kind = Block386GT 18029 b.SetControl(cmp) 18030 return true 18031 } 18032 // match: (LT (FlagEQ) yes no) 18033 // cond: 18034 // result: (First nil no yes) 18035 for { 18036 v := b.Control 18037 if v.Op != Op386FlagEQ { 18038 break 18039 } 18040 b.Kind = BlockFirst 18041 b.SetControl(nil) 18042 b.swapSuccessors() 18043 return true 18044 } 18045 // match: (LT (FlagLT_ULT) yes no) 18046 // cond: 18047 // result: (First nil yes no) 18048 for { 18049 v := b.Control 18050 if v.Op != Op386FlagLT_ULT { 18051 break 18052 } 18053 b.Kind = BlockFirst 18054 b.SetControl(nil) 18055 return true 18056 } 18057 // match: (LT (FlagLT_UGT) yes no) 18058 // cond: 18059 // result: (First nil yes no) 18060 for { 18061 v := b.Control 18062 if v.Op != Op386FlagLT_UGT { 18063 break 18064 } 18065 b.Kind = BlockFirst 18066 b.SetControl(nil) 18067 return true 18068 } 18069 // match: (LT (FlagGT_ULT) yes no) 18070 // cond: 18071 // result: (First nil no yes) 18072 for { 18073 v := b.Control 18074 if v.Op != Op386FlagGT_ULT { 18075 break 18076 } 18077 b.Kind = BlockFirst 18078 b.SetControl(nil) 18079 b.swapSuccessors() 18080 return true 18081 } 18082 // match: (LT (FlagGT_UGT) yes no) 18083 // cond: 18084 // result: (First nil no yes) 18085 for { 18086 v := b.Control 18087 if v.Op != Op386FlagGT_UGT { 18088 break 18089 } 18090 b.Kind = BlockFirst 18091 b.SetControl(nil) 18092 b.swapSuccessors() 18093 return true 18094 } 18095 case Block386NE: 18096 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18097 // cond: 18098 // result: (LT cmp yes no) 18099 for { 18100 v := b.Control 18101 if v.Op != Op386TESTB { 18102 break 18103 } 18104 v_0 := v.Args[0] 18105 if v_0.Op != Op386SETL { 18106 break 18107 } 18108 cmp := v_0.Args[0] 18109 v_1 := v.Args[1] 18110 if v_1.Op != Op386SETL { 18111 break 18112 } 18113 if cmp != v_1.Args[0] { 18114 break 18115 } 18116 b.Kind = Block386LT 18117 b.SetControl(cmp) 18118 return true 18119 } 18120 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18121 // cond: 18122 // result: (LT cmp yes no) 18123 for { 18124 v := b.Control 18125 if v.Op != Op386TESTB { 18126 break 18127 } 18128 v_0 := v.Args[0] 18129 if v_0.Op != Op386SETL { 18130 break 18131 } 18132 cmp := v_0.Args[0] 18133 v_1 := v.Args[1] 18134 if v_1.Op != Op386SETL { 18135 break 18136 } 18137 if cmp != v_1.Args[0] { 18138 break 18139 } 18140 b.Kind = Block386LT 18141 b.SetControl(cmp) 18142 return true 18143 } 18144 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 18145 // cond: 18146 // result: (LE cmp yes no) 18147 for { 18148 v := b.Control 18149 if v.Op != Op386TESTB { 18150 break 18151 } 18152 v_0 := v.Args[0] 18153 if v_0.Op != Op386SETLE { 18154 break 18155 } 18156 cmp := v_0.Args[0] 18157 v_1 := v.Args[1] 18158 if v_1.Op != Op386SETLE { 18159 break 18160 } 18161 if cmp != v_1.Args[0] { 18162 break 18163 } 18164 b.Kind = Block386LE 18165 b.SetControl(cmp) 18166 return true 18167 } 18168 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 18169 // cond: 18170 // result: (LE cmp yes no) 18171 for { 18172 v := b.Control 18173 if v.Op != Op386TESTB { 18174 break 18175 } 18176 v_0 := v.Args[0] 18177 if v_0.Op != Op386SETLE { 18178 break 18179 } 18180 cmp := v_0.Args[0] 18181 v_1 := v.Args[1] 18182 if v_1.Op != Op386SETLE { 18183 break 18184 } 18185 if cmp != v_1.Args[0] { 18186 break 18187 } 18188 b.Kind = Block386LE 18189 b.SetControl(cmp) 18190 return true 18191 } 18192 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 18193 // cond: 18194 // result: (GT cmp yes no) 18195 for { 18196 v := b.Control 18197 if v.Op != Op386TESTB { 18198 break 18199 } 18200 v_0 := v.Args[0] 18201 if v_0.Op != Op386SETG { 18202 break 18203 } 18204 cmp := v_0.Args[0] 18205 v_1 := v.Args[1] 18206 if v_1.Op != Op386SETG { 18207 break 18208 } 18209 if cmp != v_1.Args[0] { 18210 break 18211 } 18212 b.Kind = Block386GT 18213 b.SetControl(cmp) 18214 return true 18215 } 18216 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 18217 // cond: 18218 // result: (GT cmp yes no) 18219 for { 18220 v := b.Control 18221 if v.Op != Op386TESTB { 18222 break 18223 } 18224 v_0 := v.Args[0] 18225 if v_0.Op != Op386SETG { 18226 break 18227 } 18228 cmp := v_0.Args[0] 18229 v_1 := v.Args[1] 18230 if v_1.Op != Op386SETG { 18231 break 18232 } 18233 if cmp != v_1.Args[0] { 18234 break 18235 } 18236 b.Kind = Block386GT 18237 b.SetControl(cmp) 18238 return true 18239 } 18240 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 18241 // cond: 18242 // result: (GE cmp yes no) 18243 for { 18244 v := b.Control 18245 if v.Op != Op386TESTB { 18246 break 18247 } 18248 v_0 := v.Args[0] 18249 if v_0.Op != Op386SETGE { 18250 break 18251 } 18252 cmp := v_0.Args[0] 18253 v_1 := v.Args[1] 18254 if v_1.Op != Op386SETGE { 18255 break 18256 } 18257 if cmp != v_1.Args[0] { 18258 break 18259 } 18260 b.Kind = Block386GE 18261 b.SetControl(cmp) 18262 return true 18263 } 18264 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 18265 // cond: 18266 // result: (GE cmp yes no) 18267 for { 18268 v := b.Control 18269 if v.Op != Op386TESTB { 18270 break 18271 } 18272 v_0 := v.Args[0] 18273 if v_0.Op != Op386SETGE { 18274 break 18275 } 18276 cmp := v_0.Args[0] 18277 v_1 := v.Args[1] 18278 if v_1.Op != Op386SETGE { 18279 break 18280 } 18281 if cmp != v_1.Args[0] { 18282 break 18283 } 18284 b.Kind = Block386GE 18285 b.SetControl(cmp) 18286 return true 18287 } 18288 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 18289 // cond: 18290 // result: (EQ cmp yes no) 18291 for { 18292 v := b.Control 18293 if v.Op != Op386TESTB { 18294 break 18295 } 18296 v_0 := v.Args[0] 18297 if v_0.Op != Op386SETEQ { 18298 break 18299 } 18300 cmp := v_0.Args[0] 18301 v_1 := v.Args[1] 18302 if v_1.Op != Op386SETEQ { 18303 break 18304 } 18305 if cmp != v_1.Args[0] { 18306 break 18307 } 18308 b.Kind = Block386EQ 18309 b.SetControl(cmp) 18310 return true 18311 } 18312 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 18313 // cond: 18314 // result: (EQ cmp yes no) 18315 for { 18316 v := b.Control 18317 if v.Op != Op386TESTB { 18318 break 18319 } 18320 v_0 := v.Args[0] 18321 if v_0.Op != Op386SETEQ { 18322 break 18323 } 18324 cmp := v_0.Args[0] 18325 v_1 := v.Args[1] 18326 if v_1.Op != Op386SETEQ { 18327 break 18328 } 18329 if cmp != v_1.Args[0] { 18330 break 18331 } 18332 b.Kind = Block386EQ 18333 b.SetControl(cmp) 18334 return true 18335 } 18336 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 18337 // cond: 18338 // result: (NE cmp yes no) 18339 for { 18340 v := b.Control 18341 if v.Op != Op386TESTB { 18342 break 18343 } 18344 v_0 := v.Args[0] 18345 if v_0.Op != Op386SETNE { 18346 break 18347 } 18348 cmp := v_0.Args[0] 18349 v_1 := v.Args[1] 18350 if v_1.Op != Op386SETNE { 18351 break 18352 } 18353 if cmp != v_1.Args[0] { 18354 break 18355 } 18356 b.Kind = Block386NE 18357 b.SetControl(cmp) 18358 return true 18359 } 18360 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 18361 // cond: 18362 // result: (NE cmp yes no) 18363 for { 18364 v := b.Control 18365 if v.Op != Op386TESTB { 18366 break 18367 } 18368 v_0 := v.Args[0] 18369 if v_0.Op != Op386SETNE { 18370 break 18371 } 18372 cmp := v_0.Args[0] 18373 v_1 := v.Args[1] 18374 if v_1.Op != Op386SETNE { 18375 break 18376 } 18377 if cmp != v_1.Args[0] { 18378 break 18379 } 18380 b.Kind = Block386NE 18381 b.SetControl(cmp) 18382 return true 18383 } 18384 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 18385 // cond: 18386 // result: (ULT cmp yes no) 18387 for { 18388 v := b.Control 18389 if v.Op != Op386TESTB { 18390 break 18391 } 18392 v_0 := v.Args[0] 18393 if v_0.Op != Op386SETB { 18394 break 18395 } 18396 cmp := v_0.Args[0] 18397 v_1 := v.Args[1] 18398 if v_1.Op != Op386SETB { 18399 break 18400 } 18401 if cmp != v_1.Args[0] { 18402 break 18403 } 18404 b.Kind = Block386ULT 18405 b.SetControl(cmp) 18406 return true 18407 } 18408 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 18409 // cond: 18410 // result: (ULT cmp yes no) 18411 for { 18412 v := b.Control 18413 if v.Op != Op386TESTB { 18414 break 18415 } 18416 v_0 := v.Args[0] 18417 if v_0.Op != Op386SETB { 18418 break 18419 } 18420 cmp := v_0.Args[0] 18421 v_1 := v.Args[1] 18422 if v_1.Op != Op386SETB { 18423 break 18424 } 18425 if cmp != v_1.Args[0] { 18426 break 18427 } 18428 b.Kind = Block386ULT 18429 b.SetControl(cmp) 18430 return true 18431 } 18432 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 18433 // cond: 18434 // result: (ULE cmp yes no) 18435 for { 18436 v := b.Control 18437 if v.Op != Op386TESTB { 18438 break 18439 } 18440 v_0 := v.Args[0] 18441 if v_0.Op != Op386SETBE { 18442 break 18443 } 18444 cmp := v_0.Args[0] 18445 v_1 := v.Args[1] 18446 if v_1.Op != Op386SETBE { 18447 break 18448 } 18449 if cmp != v_1.Args[0] { 18450 break 18451 } 18452 b.Kind = Block386ULE 18453 b.SetControl(cmp) 18454 return true 18455 } 18456 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 18457 // cond: 18458 // result: (ULE cmp yes no) 18459 for { 18460 v := b.Control 18461 if v.Op != Op386TESTB { 18462 break 18463 } 18464 v_0 := v.Args[0] 18465 if v_0.Op != Op386SETBE { 18466 break 18467 } 18468 cmp := v_0.Args[0] 18469 v_1 := v.Args[1] 18470 if v_1.Op != Op386SETBE { 18471 break 18472 } 18473 if cmp != v_1.Args[0] { 18474 break 18475 } 18476 b.Kind = Block386ULE 18477 b.SetControl(cmp) 18478 return true 18479 } 18480 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 18481 // cond: 18482 // result: (UGT cmp yes no) 18483 for { 18484 v := b.Control 18485 if v.Op != Op386TESTB { 18486 break 18487 } 18488 v_0 := v.Args[0] 18489 if v_0.Op != Op386SETA { 18490 break 18491 } 18492 cmp := v_0.Args[0] 18493 v_1 := v.Args[1] 18494 if v_1.Op != Op386SETA { 18495 break 18496 } 18497 if cmp != v_1.Args[0] { 18498 break 18499 } 18500 b.Kind = Block386UGT 18501 b.SetControl(cmp) 18502 return true 18503 } 18504 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 18505 // cond: 18506 // result: (UGT cmp yes no) 18507 for { 18508 v := b.Control 18509 if v.Op != Op386TESTB { 18510 break 18511 } 18512 v_0 := v.Args[0] 18513 if v_0.Op != Op386SETA { 18514 break 18515 } 18516 cmp := v_0.Args[0] 18517 v_1 := v.Args[1] 18518 if v_1.Op != Op386SETA { 18519 break 18520 } 18521 if cmp != v_1.Args[0] { 18522 break 18523 } 18524 b.Kind = Block386UGT 18525 b.SetControl(cmp) 18526 return true 18527 } 18528 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 18529 // cond: 18530 // result: (UGE cmp yes no) 18531 for { 18532 v := b.Control 18533 if v.Op != Op386TESTB { 18534 break 18535 } 18536 v_0 := v.Args[0] 18537 if v_0.Op != Op386SETAE { 18538 break 18539 } 18540 cmp := v_0.Args[0] 18541 v_1 := v.Args[1] 18542 if v_1.Op != Op386SETAE { 18543 break 18544 } 18545 if cmp != v_1.Args[0] { 18546 break 18547 } 18548 b.Kind = Block386UGE 18549 b.SetControl(cmp) 18550 return true 18551 } 18552 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 18553 // cond: 18554 // result: (UGE cmp yes no) 18555 for { 18556 v := b.Control 18557 if v.Op != Op386TESTB { 18558 break 18559 } 18560 v_0 := v.Args[0] 18561 if v_0.Op != Op386SETAE { 18562 break 18563 } 18564 cmp := v_0.Args[0] 18565 v_1 := v.Args[1] 18566 if v_1.Op != Op386SETAE { 18567 break 18568 } 18569 if cmp != v_1.Args[0] { 18570 break 18571 } 18572 b.Kind = Block386UGE 18573 b.SetControl(cmp) 18574 return true 18575 } 18576 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 18577 // cond: 18578 // result: (UGT cmp yes no) 18579 for { 18580 v := b.Control 18581 if v.Op != Op386TESTB { 18582 break 18583 } 18584 v_0 := v.Args[0] 18585 if v_0.Op != Op386SETGF { 18586 break 18587 } 18588 cmp := v_0.Args[0] 18589 v_1 := v.Args[1] 18590 if v_1.Op != Op386SETGF { 18591 break 18592 } 18593 if cmp != v_1.Args[0] { 18594 break 18595 } 18596 b.Kind = Block386UGT 18597 b.SetControl(cmp) 18598 return true 18599 } 18600 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 18601 // cond: 18602 // result: (UGT cmp yes no) 18603 for { 18604 v := b.Control 18605 if v.Op != Op386TESTB { 18606 break 18607 } 18608 v_0 := v.Args[0] 18609 if v_0.Op != Op386SETGF { 18610 break 18611 } 18612 cmp := v_0.Args[0] 18613 v_1 := v.Args[1] 18614 if v_1.Op != Op386SETGF { 18615 break 18616 } 18617 if cmp != v_1.Args[0] { 18618 break 18619 } 18620 b.Kind = Block386UGT 18621 b.SetControl(cmp) 18622 return true 18623 } 18624 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 18625 // cond: 18626 // result: (UGE cmp yes no) 18627 for { 18628 v := b.Control 18629 if v.Op != Op386TESTB { 18630 break 18631 } 18632 v_0 := v.Args[0] 18633 if v_0.Op != Op386SETGEF { 18634 break 18635 } 18636 cmp := v_0.Args[0] 18637 v_1 := v.Args[1] 18638 if v_1.Op != Op386SETGEF { 18639 break 18640 } 18641 if cmp != v_1.Args[0] { 18642 break 18643 } 18644 b.Kind = Block386UGE 18645 b.SetControl(cmp) 18646 return true 18647 } 18648 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 18649 // cond: 18650 // result: (UGE cmp yes no) 18651 for { 18652 v := b.Control 18653 if v.Op != Op386TESTB { 18654 break 18655 } 18656 v_0 := v.Args[0] 18657 if v_0.Op != Op386SETGEF { 18658 break 18659 } 18660 cmp := v_0.Args[0] 18661 v_1 := v.Args[1] 18662 if v_1.Op != Op386SETGEF { 18663 break 18664 } 18665 if cmp != v_1.Args[0] { 18666 break 18667 } 18668 b.Kind = Block386UGE 18669 b.SetControl(cmp) 18670 return true 18671 } 18672 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 18673 // cond: 18674 // result: (EQF cmp yes no) 18675 for { 18676 v := b.Control 18677 if v.Op != Op386TESTB { 18678 break 18679 } 18680 v_0 := v.Args[0] 18681 if v_0.Op != Op386SETEQF { 18682 break 18683 } 18684 cmp := v_0.Args[0] 18685 v_1 := v.Args[1] 18686 if v_1.Op != Op386SETEQF { 18687 break 18688 } 18689 if cmp != v_1.Args[0] { 18690 break 18691 } 18692 b.Kind = Block386EQF 18693 b.SetControl(cmp) 18694 return true 18695 } 18696 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 18697 // cond: 18698 // result: (EQF cmp yes no) 18699 for { 18700 v := b.Control 18701 if v.Op != Op386TESTB { 18702 break 18703 } 18704 v_0 := v.Args[0] 18705 if v_0.Op != Op386SETEQF { 18706 break 18707 } 18708 cmp := v_0.Args[0] 18709 v_1 := v.Args[1] 18710 if v_1.Op != Op386SETEQF { 18711 break 18712 } 18713 if cmp != v_1.Args[0] { 18714 break 18715 } 18716 b.Kind = Block386EQF 18717 b.SetControl(cmp) 18718 return true 18719 } 18720 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 18721 // cond: 18722 // result: (NEF cmp yes no) 18723 for { 18724 v := b.Control 18725 if v.Op != Op386TESTB { 18726 break 18727 } 18728 v_0 := v.Args[0] 18729 if v_0.Op != Op386SETNEF { 18730 break 18731 } 18732 cmp := v_0.Args[0] 18733 v_1 := v.Args[1] 18734 if v_1.Op != Op386SETNEF { 18735 break 18736 } 18737 if cmp != v_1.Args[0] { 18738 break 18739 } 18740 b.Kind = Block386NEF 18741 b.SetControl(cmp) 18742 return true 18743 } 18744 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 18745 // cond: 18746 // result: (NEF cmp yes no) 18747 for { 18748 v := b.Control 18749 if v.Op != Op386TESTB { 18750 break 18751 } 18752 v_0 := v.Args[0] 18753 if v_0.Op != Op386SETNEF { 18754 break 18755 } 18756 cmp := v_0.Args[0] 18757 v_1 := v.Args[1] 18758 if v_1.Op != Op386SETNEF { 18759 break 18760 } 18761 if cmp != v_1.Args[0] { 18762 break 18763 } 18764 b.Kind = Block386NEF 18765 b.SetControl(cmp) 18766 return true 18767 } 18768 // match: (NE (InvertFlags cmp) yes no) 18769 // cond: 18770 // result: (NE cmp yes no) 18771 for { 18772 v := b.Control 18773 if v.Op != Op386InvertFlags { 18774 break 18775 } 18776 cmp := v.Args[0] 18777 b.Kind = Block386NE 18778 b.SetControl(cmp) 18779 return true 18780 } 18781 // match: (NE (FlagEQ) yes no) 18782 // cond: 18783 // result: (First nil no yes) 18784 for { 18785 v := b.Control 18786 if v.Op != Op386FlagEQ { 18787 break 18788 } 18789 b.Kind = BlockFirst 18790 b.SetControl(nil) 18791 b.swapSuccessors() 18792 return true 18793 } 18794 // match: (NE (FlagLT_ULT) yes no) 18795 // cond: 18796 // result: (First nil yes no) 18797 for { 18798 v := b.Control 18799 if v.Op != Op386FlagLT_ULT { 18800 break 18801 } 18802 b.Kind = BlockFirst 18803 b.SetControl(nil) 18804 return true 18805 } 18806 // match: (NE (FlagLT_UGT) yes no) 18807 // cond: 18808 // result: (First nil yes no) 18809 for { 18810 v := b.Control 18811 if v.Op != Op386FlagLT_UGT { 18812 break 18813 } 18814 b.Kind = BlockFirst 18815 b.SetControl(nil) 18816 return true 18817 } 18818 // match: (NE (FlagGT_ULT) yes no) 18819 // cond: 18820 // result: (First nil yes no) 18821 for { 18822 v := b.Control 18823 if v.Op != Op386FlagGT_ULT { 18824 break 18825 } 18826 b.Kind = BlockFirst 18827 b.SetControl(nil) 18828 return true 18829 } 18830 // match: (NE (FlagGT_UGT) yes no) 18831 // cond: 18832 // result: (First nil yes no) 18833 for { 18834 v := b.Control 18835 if v.Op != Op386FlagGT_UGT { 18836 break 18837 } 18838 b.Kind = BlockFirst 18839 b.SetControl(nil) 18840 return true 18841 } 18842 case Block386UGE: 18843 // match: (UGE (InvertFlags cmp) yes no) 18844 // cond: 18845 // result: (ULE cmp yes no) 18846 for { 18847 v := b.Control 18848 if v.Op != Op386InvertFlags { 18849 break 18850 } 18851 cmp := v.Args[0] 18852 b.Kind = Block386ULE 18853 b.SetControl(cmp) 18854 return true 18855 } 18856 // match: (UGE (FlagEQ) yes no) 18857 // cond: 18858 // result: (First nil yes no) 18859 for { 18860 v := b.Control 18861 if v.Op != Op386FlagEQ { 18862 break 18863 } 18864 b.Kind = BlockFirst 18865 b.SetControl(nil) 18866 return true 18867 } 18868 // match: (UGE (FlagLT_ULT) yes no) 18869 // cond: 18870 // result: (First nil no yes) 18871 for { 18872 v := b.Control 18873 if v.Op != Op386FlagLT_ULT { 18874 break 18875 } 18876 b.Kind = BlockFirst 18877 b.SetControl(nil) 18878 b.swapSuccessors() 18879 return true 18880 } 18881 // match: (UGE (FlagLT_UGT) yes no) 18882 // cond: 18883 // result: (First nil yes no) 18884 for { 18885 v := b.Control 18886 if v.Op != Op386FlagLT_UGT { 18887 break 18888 } 18889 b.Kind = BlockFirst 18890 b.SetControl(nil) 18891 return true 18892 } 18893 // match: (UGE (FlagGT_ULT) yes no) 18894 // cond: 18895 // result: (First nil no yes) 18896 for { 18897 v := b.Control 18898 if v.Op != Op386FlagGT_ULT { 18899 break 18900 } 18901 b.Kind = BlockFirst 18902 b.SetControl(nil) 18903 b.swapSuccessors() 18904 return true 18905 } 18906 // match: (UGE (FlagGT_UGT) yes no) 18907 // cond: 18908 // result: (First nil yes no) 18909 for { 18910 v := b.Control 18911 if v.Op != Op386FlagGT_UGT { 18912 break 18913 } 18914 b.Kind = BlockFirst 18915 b.SetControl(nil) 18916 return true 18917 } 18918 case Block386UGT: 18919 // match: (UGT (InvertFlags cmp) yes no) 18920 // cond: 18921 // result: (ULT cmp yes no) 18922 for { 18923 v := b.Control 18924 if v.Op != Op386InvertFlags { 18925 break 18926 } 18927 cmp := v.Args[0] 18928 b.Kind = Block386ULT 18929 b.SetControl(cmp) 18930 return true 18931 } 18932 // match: (UGT (FlagEQ) yes no) 18933 // cond: 18934 // result: (First nil no yes) 18935 for { 18936 v := b.Control 18937 if v.Op != Op386FlagEQ { 18938 break 18939 } 18940 b.Kind = BlockFirst 18941 b.SetControl(nil) 18942 b.swapSuccessors() 18943 return true 18944 } 18945 // match: (UGT (FlagLT_ULT) yes no) 18946 // cond: 18947 // result: (First nil no yes) 18948 for { 18949 v := b.Control 18950 if v.Op != Op386FlagLT_ULT { 18951 break 18952 } 18953 b.Kind = BlockFirst 18954 b.SetControl(nil) 18955 b.swapSuccessors() 18956 return true 18957 } 18958 // match: (UGT (FlagLT_UGT) yes no) 18959 // cond: 18960 // result: (First nil yes no) 18961 for { 18962 v := b.Control 18963 if v.Op != Op386FlagLT_UGT { 18964 break 18965 } 18966 b.Kind = BlockFirst 18967 b.SetControl(nil) 18968 return true 18969 } 18970 // match: (UGT (FlagGT_ULT) yes no) 18971 // cond: 18972 // result: (First nil no yes) 18973 for { 18974 v := b.Control 18975 if v.Op != Op386FlagGT_ULT { 18976 break 18977 } 18978 b.Kind = BlockFirst 18979 b.SetControl(nil) 18980 b.swapSuccessors() 18981 return true 18982 } 18983 // match: (UGT (FlagGT_UGT) yes no) 18984 // cond: 18985 // result: (First nil yes no) 18986 for { 18987 v := b.Control 18988 if v.Op != Op386FlagGT_UGT { 18989 break 18990 } 18991 b.Kind = BlockFirst 18992 b.SetControl(nil) 18993 return true 18994 } 18995 case Block386ULE: 18996 // match: (ULE (InvertFlags cmp) yes no) 18997 // cond: 18998 // result: (UGE cmp yes no) 18999 for { 19000 v := b.Control 19001 if v.Op != Op386InvertFlags { 19002 break 19003 } 19004 cmp := v.Args[0] 19005 b.Kind = Block386UGE 19006 b.SetControl(cmp) 19007 return true 19008 } 19009 // match: (ULE (FlagEQ) yes no) 19010 // cond: 19011 // result: (First nil yes no) 19012 for { 19013 v := b.Control 19014 if v.Op != Op386FlagEQ { 19015 break 19016 } 19017 b.Kind = BlockFirst 19018 b.SetControl(nil) 19019 return true 19020 } 19021 // match: (ULE (FlagLT_ULT) yes no) 19022 // cond: 19023 // result: (First nil yes no) 19024 for { 19025 v := b.Control 19026 if v.Op != Op386FlagLT_ULT { 19027 break 19028 } 19029 b.Kind = BlockFirst 19030 b.SetControl(nil) 19031 return true 19032 } 19033 // match: (ULE (FlagLT_UGT) yes no) 19034 // cond: 19035 // result: (First nil no yes) 19036 for { 19037 v := b.Control 19038 if v.Op != Op386FlagLT_UGT { 19039 break 19040 } 19041 b.Kind = BlockFirst 19042 b.SetControl(nil) 19043 b.swapSuccessors() 19044 return true 19045 } 19046 // match: (ULE (FlagGT_ULT) yes no) 19047 // cond: 19048 // result: (First nil yes no) 19049 for { 19050 v := b.Control 19051 if v.Op != Op386FlagGT_ULT { 19052 break 19053 } 19054 b.Kind = BlockFirst 19055 b.SetControl(nil) 19056 return true 19057 } 19058 // match: (ULE (FlagGT_UGT) yes no) 19059 // cond: 19060 // result: (First nil no yes) 19061 for { 19062 v := b.Control 19063 if v.Op != Op386FlagGT_UGT { 19064 break 19065 } 19066 b.Kind = BlockFirst 19067 b.SetControl(nil) 19068 b.swapSuccessors() 19069 return true 19070 } 19071 case Block386ULT: 19072 // match: (ULT (InvertFlags cmp) yes no) 19073 // cond: 19074 // result: (UGT cmp yes no) 19075 for { 19076 v := b.Control 19077 if v.Op != Op386InvertFlags { 19078 break 19079 } 19080 cmp := v.Args[0] 19081 b.Kind = Block386UGT 19082 b.SetControl(cmp) 19083 return true 19084 } 19085 // match: (ULT (FlagEQ) yes no) 19086 // cond: 19087 // result: (First nil no yes) 19088 for { 19089 v := b.Control 19090 if v.Op != Op386FlagEQ { 19091 break 19092 } 19093 b.Kind = BlockFirst 19094 b.SetControl(nil) 19095 b.swapSuccessors() 19096 return true 19097 } 19098 // match: (ULT (FlagLT_ULT) yes no) 19099 // cond: 19100 // result: (First nil yes no) 19101 for { 19102 v := b.Control 19103 if v.Op != Op386FlagLT_ULT { 19104 break 19105 } 19106 b.Kind = BlockFirst 19107 b.SetControl(nil) 19108 return true 19109 } 19110 // match: (ULT (FlagLT_UGT) yes no) 19111 // cond: 19112 // result: (First nil no yes) 19113 for { 19114 v := b.Control 19115 if v.Op != Op386FlagLT_UGT { 19116 break 19117 } 19118 b.Kind = BlockFirst 19119 b.SetControl(nil) 19120 b.swapSuccessors() 19121 return true 19122 } 19123 // match: (ULT (FlagGT_ULT) yes no) 19124 // cond: 19125 // result: (First nil yes no) 19126 for { 19127 v := b.Control 19128 if v.Op != Op386FlagGT_ULT { 19129 break 19130 } 19131 b.Kind = BlockFirst 19132 b.SetControl(nil) 19133 return true 19134 } 19135 // match: (ULT (FlagGT_UGT) yes no) 19136 // cond: 19137 // result: (First nil no yes) 19138 for { 19139 v := b.Control 19140 if v.Op != Op386FlagGT_UGT { 19141 break 19142 } 19143 b.Kind = BlockFirst 19144 b.SetControl(nil) 19145 b.swapSuccessors() 19146 return true 19147 } 19148 } 19149 return false 19150 }