github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/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 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValue386(v *Value) bool { 17 switch v.Op { 18 case Op386ADCL: 19 return rewriteValue386_Op386ADCL_0(v) 20 case Op386ADDL: 21 return rewriteValue386_Op386ADDL_0(v) || rewriteValue386_Op386ADDL_10(v) || rewriteValue386_Op386ADDL_20(v) 22 case Op386ADDLcarry: 23 return rewriteValue386_Op386ADDLcarry_0(v) 24 case Op386ADDLconst: 25 return rewriteValue386_Op386ADDLconst_0(v) 26 case Op386ANDL: 27 return rewriteValue386_Op386ANDL_0(v) 28 case Op386ANDLconst: 29 return rewriteValue386_Op386ANDLconst_0(v) 30 case Op386CMPB: 31 return rewriteValue386_Op386CMPB_0(v) 32 case Op386CMPBconst: 33 return rewriteValue386_Op386CMPBconst_0(v) 34 case Op386CMPL: 35 return rewriteValue386_Op386CMPL_0(v) 36 case Op386CMPLconst: 37 return rewriteValue386_Op386CMPLconst_0(v) 38 case Op386CMPW: 39 return rewriteValue386_Op386CMPW_0(v) 40 case Op386CMPWconst: 41 return rewriteValue386_Op386CMPWconst_0(v) 42 case Op386LEAL: 43 return rewriteValue386_Op386LEAL_0(v) 44 case Op386LEAL1: 45 return rewriteValue386_Op386LEAL1_0(v) 46 case Op386LEAL2: 47 return rewriteValue386_Op386LEAL2_0(v) 48 case Op386LEAL4: 49 return rewriteValue386_Op386LEAL4_0(v) 50 case Op386LEAL8: 51 return rewriteValue386_Op386LEAL8_0(v) 52 case Op386MOVBLSX: 53 return rewriteValue386_Op386MOVBLSX_0(v) 54 case Op386MOVBLSXload: 55 return rewriteValue386_Op386MOVBLSXload_0(v) 56 case Op386MOVBLZX: 57 return rewriteValue386_Op386MOVBLZX_0(v) 58 case Op386MOVBload: 59 return rewriteValue386_Op386MOVBload_0(v) 60 case Op386MOVBloadidx1: 61 return rewriteValue386_Op386MOVBloadidx1_0(v) 62 case Op386MOVBstore: 63 return rewriteValue386_Op386MOVBstore_0(v) 64 case Op386MOVBstoreconst: 65 return rewriteValue386_Op386MOVBstoreconst_0(v) 66 case Op386MOVBstoreconstidx1: 67 return rewriteValue386_Op386MOVBstoreconstidx1_0(v) 68 case Op386MOVBstoreidx1: 69 return rewriteValue386_Op386MOVBstoreidx1_0(v) || rewriteValue386_Op386MOVBstoreidx1_10(v) 70 case Op386MOVLload: 71 return rewriteValue386_Op386MOVLload_0(v) 72 case Op386MOVLloadidx1: 73 return rewriteValue386_Op386MOVLloadidx1_0(v) 74 case Op386MOVLloadidx4: 75 return rewriteValue386_Op386MOVLloadidx4_0(v) 76 case Op386MOVLstore: 77 return rewriteValue386_Op386MOVLstore_0(v) 78 case Op386MOVLstoreconst: 79 return rewriteValue386_Op386MOVLstoreconst_0(v) 80 case Op386MOVLstoreconstidx1: 81 return rewriteValue386_Op386MOVLstoreconstidx1_0(v) 82 case Op386MOVLstoreconstidx4: 83 return rewriteValue386_Op386MOVLstoreconstidx4_0(v) 84 case Op386MOVLstoreidx1: 85 return rewriteValue386_Op386MOVLstoreidx1_0(v) 86 case Op386MOVLstoreidx4: 87 return rewriteValue386_Op386MOVLstoreidx4_0(v) 88 case Op386MOVSDconst: 89 return rewriteValue386_Op386MOVSDconst_0(v) 90 case Op386MOVSDload: 91 return rewriteValue386_Op386MOVSDload_0(v) 92 case Op386MOVSDloadidx1: 93 return rewriteValue386_Op386MOVSDloadidx1_0(v) 94 case Op386MOVSDloadidx8: 95 return rewriteValue386_Op386MOVSDloadidx8_0(v) 96 case Op386MOVSDstore: 97 return rewriteValue386_Op386MOVSDstore_0(v) 98 case Op386MOVSDstoreidx1: 99 return rewriteValue386_Op386MOVSDstoreidx1_0(v) 100 case Op386MOVSDstoreidx8: 101 return rewriteValue386_Op386MOVSDstoreidx8_0(v) 102 case Op386MOVSSconst: 103 return rewriteValue386_Op386MOVSSconst_0(v) 104 case Op386MOVSSload: 105 return rewriteValue386_Op386MOVSSload_0(v) 106 case Op386MOVSSloadidx1: 107 return rewriteValue386_Op386MOVSSloadidx1_0(v) 108 case Op386MOVSSloadidx4: 109 return rewriteValue386_Op386MOVSSloadidx4_0(v) 110 case Op386MOVSSstore: 111 return rewriteValue386_Op386MOVSSstore_0(v) 112 case Op386MOVSSstoreidx1: 113 return rewriteValue386_Op386MOVSSstoreidx1_0(v) 114 case Op386MOVSSstoreidx4: 115 return rewriteValue386_Op386MOVSSstoreidx4_0(v) 116 case Op386MOVWLSX: 117 return rewriteValue386_Op386MOVWLSX_0(v) 118 case Op386MOVWLSXload: 119 return rewriteValue386_Op386MOVWLSXload_0(v) 120 case Op386MOVWLZX: 121 return rewriteValue386_Op386MOVWLZX_0(v) 122 case Op386MOVWload: 123 return rewriteValue386_Op386MOVWload_0(v) 124 case Op386MOVWloadidx1: 125 return rewriteValue386_Op386MOVWloadidx1_0(v) 126 case Op386MOVWloadidx2: 127 return rewriteValue386_Op386MOVWloadidx2_0(v) 128 case Op386MOVWstore: 129 return rewriteValue386_Op386MOVWstore_0(v) 130 case Op386MOVWstoreconst: 131 return rewriteValue386_Op386MOVWstoreconst_0(v) 132 case Op386MOVWstoreconstidx1: 133 return rewriteValue386_Op386MOVWstoreconstidx1_0(v) 134 case Op386MOVWstoreconstidx2: 135 return rewriteValue386_Op386MOVWstoreconstidx2_0(v) 136 case Op386MOVWstoreidx1: 137 return rewriteValue386_Op386MOVWstoreidx1_0(v) || rewriteValue386_Op386MOVWstoreidx1_10(v) 138 case Op386MOVWstoreidx2: 139 return rewriteValue386_Op386MOVWstoreidx2_0(v) 140 case Op386MULL: 141 return rewriteValue386_Op386MULL_0(v) 142 case Op386MULLconst: 143 return rewriteValue386_Op386MULLconst_0(v) || rewriteValue386_Op386MULLconst_10(v) || rewriteValue386_Op386MULLconst_20(v) 144 case Op386NEGL: 145 return rewriteValue386_Op386NEGL_0(v) 146 case Op386NOTL: 147 return rewriteValue386_Op386NOTL_0(v) 148 case Op386ORL: 149 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) 150 case Op386ORLconst: 151 return rewriteValue386_Op386ORLconst_0(v) 152 case Op386ROLBconst: 153 return rewriteValue386_Op386ROLBconst_0(v) 154 case Op386ROLLconst: 155 return rewriteValue386_Op386ROLLconst_0(v) 156 case Op386ROLWconst: 157 return rewriteValue386_Op386ROLWconst_0(v) 158 case Op386SARB: 159 return rewriteValue386_Op386SARB_0(v) 160 case Op386SARBconst: 161 return rewriteValue386_Op386SARBconst_0(v) 162 case Op386SARL: 163 return rewriteValue386_Op386SARL_0(v) 164 case Op386SARLconst: 165 return rewriteValue386_Op386SARLconst_0(v) 166 case Op386SARW: 167 return rewriteValue386_Op386SARW_0(v) 168 case Op386SARWconst: 169 return rewriteValue386_Op386SARWconst_0(v) 170 case Op386SBBL: 171 return rewriteValue386_Op386SBBL_0(v) 172 case Op386SBBLcarrymask: 173 return rewriteValue386_Op386SBBLcarrymask_0(v) 174 case Op386SETA: 175 return rewriteValue386_Op386SETA_0(v) 176 case Op386SETAE: 177 return rewriteValue386_Op386SETAE_0(v) 178 case Op386SETB: 179 return rewriteValue386_Op386SETB_0(v) 180 case Op386SETBE: 181 return rewriteValue386_Op386SETBE_0(v) 182 case Op386SETEQ: 183 return rewriteValue386_Op386SETEQ_0(v) 184 case Op386SETG: 185 return rewriteValue386_Op386SETG_0(v) 186 case Op386SETGE: 187 return rewriteValue386_Op386SETGE_0(v) 188 case Op386SETL: 189 return rewriteValue386_Op386SETL_0(v) 190 case Op386SETLE: 191 return rewriteValue386_Op386SETLE_0(v) 192 case Op386SETNE: 193 return rewriteValue386_Op386SETNE_0(v) 194 case Op386SHLL: 195 return rewriteValue386_Op386SHLL_0(v) 196 case Op386SHLLconst: 197 return rewriteValue386_Op386SHLLconst_0(v) 198 case Op386SHRB: 199 return rewriteValue386_Op386SHRB_0(v) 200 case Op386SHRBconst: 201 return rewriteValue386_Op386SHRBconst_0(v) 202 case Op386SHRL: 203 return rewriteValue386_Op386SHRL_0(v) 204 case Op386SHRLconst: 205 return rewriteValue386_Op386SHRLconst_0(v) 206 case Op386SHRW: 207 return rewriteValue386_Op386SHRW_0(v) 208 case Op386SHRWconst: 209 return rewriteValue386_Op386SHRWconst_0(v) 210 case Op386SUBL: 211 return rewriteValue386_Op386SUBL_0(v) 212 case Op386SUBLcarry: 213 return rewriteValue386_Op386SUBLcarry_0(v) 214 case Op386SUBLconst: 215 return rewriteValue386_Op386SUBLconst_0(v) 216 case Op386XORL: 217 return rewriteValue386_Op386XORL_0(v) 218 case Op386XORLconst: 219 return rewriteValue386_Op386XORLconst_0(v) 220 case OpAdd16: 221 return rewriteValue386_OpAdd16_0(v) 222 case OpAdd32: 223 return rewriteValue386_OpAdd32_0(v) 224 case OpAdd32F: 225 return rewriteValue386_OpAdd32F_0(v) 226 case OpAdd32carry: 227 return rewriteValue386_OpAdd32carry_0(v) 228 case OpAdd32withcarry: 229 return rewriteValue386_OpAdd32withcarry_0(v) 230 case OpAdd64F: 231 return rewriteValue386_OpAdd64F_0(v) 232 case OpAdd8: 233 return rewriteValue386_OpAdd8_0(v) 234 case OpAddPtr: 235 return rewriteValue386_OpAddPtr_0(v) 236 case OpAddr: 237 return rewriteValue386_OpAddr_0(v) 238 case OpAnd16: 239 return rewriteValue386_OpAnd16_0(v) 240 case OpAnd32: 241 return rewriteValue386_OpAnd32_0(v) 242 case OpAnd8: 243 return rewriteValue386_OpAnd8_0(v) 244 case OpAndB: 245 return rewriteValue386_OpAndB_0(v) 246 case OpAvg32u: 247 return rewriteValue386_OpAvg32u_0(v) 248 case OpBswap32: 249 return rewriteValue386_OpBswap32_0(v) 250 case OpClosureCall: 251 return rewriteValue386_OpClosureCall_0(v) 252 case OpCom16: 253 return rewriteValue386_OpCom16_0(v) 254 case OpCom32: 255 return rewriteValue386_OpCom32_0(v) 256 case OpCom8: 257 return rewriteValue386_OpCom8_0(v) 258 case OpConst16: 259 return rewriteValue386_OpConst16_0(v) 260 case OpConst32: 261 return rewriteValue386_OpConst32_0(v) 262 case OpConst32F: 263 return rewriteValue386_OpConst32F_0(v) 264 case OpConst64F: 265 return rewriteValue386_OpConst64F_0(v) 266 case OpConst8: 267 return rewriteValue386_OpConst8_0(v) 268 case OpConstBool: 269 return rewriteValue386_OpConstBool_0(v) 270 case OpConstNil: 271 return rewriteValue386_OpConstNil_0(v) 272 case OpConvert: 273 return rewriteValue386_OpConvert_0(v) 274 case OpCvt32Fto32: 275 return rewriteValue386_OpCvt32Fto32_0(v) 276 case OpCvt32Fto64F: 277 return rewriteValue386_OpCvt32Fto64F_0(v) 278 case OpCvt32to32F: 279 return rewriteValue386_OpCvt32to32F_0(v) 280 case OpCvt32to64F: 281 return rewriteValue386_OpCvt32to64F_0(v) 282 case OpCvt64Fto32: 283 return rewriteValue386_OpCvt64Fto32_0(v) 284 case OpCvt64Fto32F: 285 return rewriteValue386_OpCvt64Fto32F_0(v) 286 case OpDiv16: 287 return rewriteValue386_OpDiv16_0(v) 288 case OpDiv16u: 289 return rewriteValue386_OpDiv16u_0(v) 290 case OpDiv32: 291 return rewriteValue386_OpDiv32_0(v) 292 case OpDiv32F: 293 return rewriteValue386_OpDiv32F_0(v) 294 case OpDiv32u: 295 return rewriteValue386_OpDiv32u_0(v) 296 case OpDiv64F: 297 return rewriteValue386_OpDiv64F_0(v) 298 case OpDiv8: 299 return rewriteValue386_OpDiv8_0(v) 300 case OpDiv8u: 301 return rewriteValue386_OpDiv8u_0(v) 302 case OpEq16: 303 return rewriteValue386_OpEq16_0(v) 304 case OpEq32: 305 return rewriteValue386_OpEq32_0(v) 306 case OpEq32F: 307 return rewriteValue386_OpEq32F_0(v) 308 case OpEq64F: 309 return rewriteValue386_OpEq64F_0(v) 310 case OpEq8: 311 return rewriteValue386_OpEq8_0(v) 312 case OpEqB: 313 return rewriteValue386_OpEqB_0(v) 314 case OpEqPtr: 315 return rewriteValue386_OpEqPtr_0(v) 316 case OpGeq16: 317 return rewriteValue386_OpGeq16_0(v) 318 case OpGeq16U: 319 return rewriteValue386_OpGeq16U_0(v) 320 case OpGeq32: 321 return rewriteValue386_OpGeq32_0(v) 322 case OpGeq32F: 323 return rewriteValue386_OpGeq32F_0(v) 324 case OpGeq32U: 325 return rewriteValue386_OpGeq32U_0(v) 326 case OpGeq64F: 327 return rewriteValue386_OpGeq64F_0(v) 328 case OpGeq8: 329 return rewriteValue386_OpGeq8_0(v) 330 case OpGeq8U: 331 return rewriteValue386_OpGeq8U_0(v) 332 case OpGetClosurePtr: 333 return rewriteValue386_OpGetClosurePtr_0(v) 334 case OpGetG: 335 return rewriteValue386_OpGetG_0(v) 336 case OpGreater16: 337 return rewriteValue386_OpGreater16_0(v) 338 case OpGreater16U: 339 return rewriteValue386_OpGreater16U_0(v) 340 case OpGreater32: 341 return rewriteValue386_OpGreater32_0(v) 342 case OpGreater32F: 343 return rewriteValue386_OpGreater32F_0(v) 344 case OpGreater32U: 345 return rewriteValue386_OpGreater32U_0(v) 346 case OpGreater64F: 347 return rewriteValue386_OpGreater64F_0(v) 348 case OpGreater8: 349 return rewriteValue386_OpGreater8_0(v) 350 case OpGreater8U: 351 return rewriteValue386_OpGreater8U_0(v) 352 case OpHmul32: 353 return rewriteValue386_OpHmul32_0(v) 354 case OpHmul32u: 355 return rewriteValue386_OpHmul32u_0(v) 356 case OpInterCall: 357 return rewriteValue386_OpInterCall_0(v) 358 case OpIsInBounds: 359 return rewriteValue386_OpIsInBounds_0(v) 360 case OpIsNonNil: 361 return rewriteValue386_OpIsNonNil_0(v) 362 case OpIsSliceInBounds: 363 return rewriteValue386_OpIsSliceInBounds_0(v) 364 case OpLeq16: 365 return rewriteValue386_OpLeq16_0(v) 366 case OpLeq16U: 367 return rewriteValue386_OpLeq16U_0(v) 368 case OpLeq32: 369 return rewriteValue386_OpLeq32_0(v) 370 case OpLeq32F: 371 return rewriteValue386_OpLeq32F_0(v) 372 case OpLeq32U: 373 return rewriteValue386_OpLeq32U_0(v) 374 case OpLeq64F: 375 return rewriteValue386_OpLeq64F_0(v) 376 case OpLeq8: 377 return rewriteValue386_OpLeq8_0(v) 378 case OpLeq8U: 379 return rewriteValue386_OpLeq8U_0(v) 380 case OpLess16: 381 return rewriteValue386_OpLess16_0(v) 382 case OpLess16U: 383 return rewriteValue386_OpLess16U_0(v) 384 case OpLess32: 385 return rewriteValue386_OpLess32_0(v) 386 case OpLess32F: 387 return rewriteValue386_OpLess32F_0(v) 388 case OpLess32U: 389 return rewriteValue386_OpLess32U_0(v) 390 case OpLess64F: 391 return rewriteValue386_OpLess64F_0(v) 392 case OpLess8: 393 return rewriteValue386_OpLess8_0(v) 394 case OpLess8U: 395 return rewriteValue386_OpLess8U_0(v) 396 case OpLoad: 397 return rewriteValue386_OpLoad_0(v) 398 case OpLsh16x16: 399 return rewriteValue386_OpLsh16x16_0(v) 400 case OpLsh16x32: 401 return rewriteValue386_OpLsh16x32_0(v) 402 case OpLsh16x64: 403 return rewriteValue386_OpLsh16x64_0(v) 404 case OpLsh16x8: 405 return rewriteValue386_OpLsh16x8_0(v) 406 case OpLsh32x16: 407 return rewriteValue386_OpLsh32x16_0(v) 408 case OpLsh32x32: 409 return rewriteValue386_OpLsh32x32_0(v) 410 case OpLsh32x64: 411 return rewriteValue386_OpLsh32x64_0(v) 412 case OpLsh32x8: 413 return rewriteValue386_OpLsh32x8_0(v) 414 case OpLsh8x16: 415 return rewriteValue386_OpLsh8x16_0(v) 416 case OpLsh8x32: 417 return rewriteValue386_OpLsh8x32_0(v) 418 case OpLsh8x64: 419 return rewriteValue386_OpLsh8x64_0(v) 420 case OpLsh8x8: 421 return rewriteValue386_OpLsh8x8_0(v) 422 case OpMod16: 423 return rewriteValue386_OpMod16_0(v) 424 case OpMod16u: 425 return rewriteValue386_OpMod16u_0(v) 426 case OpMod32: 427 return rewriteValue386_OpMod32_0(v) 428 case OpMod32u: 429 return rewriteValue386_OpMod32u_0(v) 430 case OpMod8: 431 return rewriteValue386_OpMod8_0(v) 432 case OpMod8u: 433 return rewriteValue386_OpMod8u_0(v) 434 case OpMove: 435 return rewriteValue386_OpMove_0(v) || rewriteValue386_OpMove_10(v) 436 case OpMul16: 437 return rewriteValue386_OpMul16_0(v) 438 case OpMul32: 439 return rewriteValue386_OpMul32_0(v) 440 case OpMul32F: 441 return rewriteValue386_OpMul32F_0(v) 442 case OpMul32uhilo: 443 return rewriteValue386_OpMul32uhilo_0(v) 444 case OpMul64F: 445 return rewriteValue386_OpMul64F_0(v) 446 case OpMul8: 447 return rewriteValue386_OpMul8_0(v) 448 case OpNeg16: 449 return rewriteValue386_OpNeg16_0(v) 450 case OpNeg32: 451 return rewriteValue386_OpNeg32_0(v) 452 case OpNeg32F: 453 return rewriteValue386_OpNeg32F_0(v) 454 case OpNeg64F: 455 return rewriteValue386_OpNeg64F_0(v) 456 case OpNeg8: 457 return rewriteValue386_OpNeg8_0(v) 458 case OpNeq16: 459 return rewriteValue386_OpNeq16_0(v) 460 case OpNeq32: 461 return rewriteValue386_OpNeq32_0(v) 462 case OpNeq32F: 463 return rewriteValue386_OpNeq32F_0(v) 464 case OpNeq64F: 465 return rewriteValue386_OpNeq64F_0(v) 466 case OpNeq8: 467 return rewriteValue386_OpNeq8_0(v) 468 case OpNeqB: 469 return rewriteValue386_OpNeqB_0(v) 470 case OpNeqPtr: 471 return rewriteValue386_OpNeqPtr_0(v) 472 case OpNilCheck: 473 return rewriteValue386_OpNilCheck_0(v) 474 case OpNot: 475 return rewriteValue386_OpNot_0(v) 476 case OpOffPtr: 477 return rewriteValue386_OpOffPtr_0(v) 478 case OpOr16: 479 return rewriteValue386_OpOr16_0(v) 480 case OpOr32: 481 return rewriteValue386_OpOr32_0(v) 482 case OpOr8: 483 return rewriteValue386_OpOr8_0(v) 484 case OpOrB: 485 return rewriteValue386_OpOrB_0(v) 486 case OpRound32F: 487 return rewriteValue386_OpRound32F_0(v) 488 case OpRound64F: 489 return rewriteValue386_OpRound64F_0(v) 490 case OpRsh16Ux16: 491 return rewriteValue386_OpRsh16Ux16_0(v) 492 case OpRsh16Ux32: 493 return rewriteValue386_OpRsh16Ux32_0(v) 494 case OpRsh16Ux64: 495 return rewriteValue386_OpRsh16Ux64_0(v) 496 case OpRsh16Ux8: 497 return rewriteValue386_OpRsh16Ux8_0(v) 498 case OpRsh16x16: 499 return rewriteValue386_OpRsh16x16_0(v) 500 case OpRsh16x32: 501 return rewriteValue386_OpRsh16x32_0(v) 502 case OpRsh16x64: 503 return rewriteValue386_OpRsh16x64_0(v) 504 case OpRsh16x8: 505 return rewriteValue386_OpRsh16x8_0(v) 506 case OpRsh32Ux16: 507 return rewriteValue386_OpRsh32Ux16_0(v) 508 case OpRsh32Ux32: 509 return rewriteValue386_OpRsh32Ux32_0(v) 510 case OpRsh32Ux64: 511 return rewriteValue386_OpRsh32Ux64_0(v) 512 case OpRsh32Ux8: 513 return rewriteValue386_OpRsh32Ux8_0(v) 514 case OpRsh32x16: 515 return rewriteValue386_OpRsh32x16_0(v) 516 case OpRsh32x32: 517 return rewriteValue386_OpRsh32x32_0(v) 518 case OpRsh32x64: 519 return rewriteValue386_OpRsh32x64_0(v) 520 case OpRsh32x8: 521 return rewriteValue386_OpRsh32x8_0(v) 522 case OpRsh8Ux16: 523 return rewriteValue386_OpRsh8Ux16_0(v) 524 case OpRsh8Ux32: 525 return rewriteValue386_OpRsh8Ux32_0(v) 526 case OpRsh8Ux64: 527 return rewriteValue386_OpRsh8Ux64_0(v) 528 case OpRsh8Ux8: 529 return rewriteValue386_OpRsh8Ux8_0(v) 530 case OpRsh8x16: 531 return rewriteValue386_OpRsh8x16_0(v) 532 case OpRsh8x32: 533 return rewriteValue386_OpRsh8x32_0(v) 534 case OpRsh8x64: 535 return rewriteValue386_OpRsh8x64_0(v) 536 case OpRsh8x8: 537 return rewriteValue386_OpRsh8x8_0(v) 538 case OpSignExt16to32: 539 return rewriteValue386_OpSignExt16to32_0(v) 540 case OpSignExt8to16: 541 return rewriteValue386_OpSignExt8to16_0(v) 542 case OpSignExt8to32: 543 return rewriteValue386_OpSignExt8to32_0(v) 544 case OpSignmask: 545 return rewriteValue386_OpSignmask_0(v) 546 case OpSlicemask: 547 return rewriteValue386_OpSlicemask_0(v) 548 case OpSqrt: 549 return rewriteValue386_OpSqrt_0(v) 550 case OpStaticCall: 551 return rewriteValue386_OpStaticCall_0(v) 552 case OpStore: 553 return rewriteValue386_OpStore_0(v) 554 case OpSub16: 555 return rewriteValue386_OpSub16_0(v) 556 case OpSub32: 557 return rewriteValue386_OpSub32_0(v) 558 case OpSub32F: 559 return rewriteValue386_OpSub32F_0(v) 560 case OpSub32carry: 561 return rewriteValue386_OpSub32carry_0(v) 562 case OpSub32withcarry: 563 return rewriteValue386_OpSub32withcarry_0(v) 564 case OpSub64F: 565 return rewriteValue386_OpSub64F_0(v) 566 case OpSub8: 567 return rewriteValue386_OpSub8_0(v) 568 case OpSubPtr: 569 return rewriteValue386_OpSubPtr_0(v) 570 case OpTrunc16to8: 571 return rewriteValue386_OpTrunc16to8_0(v) 572 case OpTrunc32to16: 573 return rewriteValue386_OpTrunc32to16_0(v) 574 case OpTrunc32to8: 575 return rewriteValue386_OpTrunc32to8_0(v) 576 case OpXor16: 577 return rewriteValue386_OpXor16_0(v) 578 case OpXor32: 579 return rewriteValue386_OpXor32_0(v) 580 case OpXor8: 581 return rewriteValue386_OpXor8_0(v) 582 case OpZero: 583 return rewriteValue386_OpZero_0(v) || rewriteValue386_OpZero_10(v) 584 case OpZeroExt16to32: 585 return rewriteValue386_OpZeroExt16to32_0(v) 586 case OpZeroExt8to16: 587 return rewriteValue386_OpZeroExt8to16_0(v) 588 case OpZeroExt8to32: 589 return rewriteValue386_OpZeroExt8to32_0(v) 590 case OpZeromask: 591 return rewriteValue386_OpZeromask_0(v) 592 } 593 return false 594 } 595 func rewriteValue386_Op386ADCL_0(v *Value) bool { 596 // match: (ADCL x (MOVLconst [c]) f) 597 // cond: 598 // result: (ADCLconst [c] x f) 599 for { 600 _ = v.Args[2] 601 x := v.Args[0] 602 v_1 := v.Args[1] 603 if v_1.Op != Op386MOVLconst { 604 break 605 } 606 c := v_1.AuxInt 607 f := v.Args[2] 608 v.reset(Op386ADCLconst) 609 v.AuxInt = c 610 v.AddArg(x) 611 v.AddArg(f) 612 return true 613 } 614 // match: (ADCL (MOVLconst [c]) x f) 615 // cond: 616 // result: (ADCLconst [c] x f) 617 for { 618 _ = v.Args[2] 619 v_0 := v.Args[0] 620 if v_0.Op != Op386MOVLconst { 621 break 622 } 623 c := v_0.AuxInt 624 x := v.Args[1] 625 f := v.Args[2] 626 v.reset(Op386ADCLconst) 627 v.AuxInt = c 628 v.AddArg(x) 629 v.AddArg(f) 630 return true 631 } 632 // match: (ADCL (MOVLconst [c]) x f) 633 // cond: 634 // result: (ADCLconst [c] x f) 635 for { 636 _ = v.Args[2] 637 v_0 := v.Args[0] 638 if v_0.Op != Op386MOVLconst { 639 break 640 } 641 c := v_0.AuxInt 642 x := v.Args[1] 643 f := v.Args[2] 644 v.reset(Op386ADCLconst) 645 v.AuxInt = c 646 v.AddArg(x) 647 v.AddArg(f) 648 return true 649 } 650 // match: (ADCL x (MOVLconst [c]) f) 651 // cond: 652 // result: (ADCLconst [c] x f) 653 for { 654 _ = v.Args[2] 655 x := v.Args[0] 656 v_1 := v.Args[1] 657 if v_1.Op != Op386MOVLconst { 658 break 659 } 660 c := v_1.AuxInt 661 f := v.Args[2] 662 v.reset(Op386ADCLconst) 663 v.AuxInt = c 664 v.AddArg(x) 665 v.AddArg(f) 666 return true 667 } 668 return false 669 } 670 func rewriteValue386_Op386ADDL_0(v *Value) bool { 671 // match: (ADDL x (MOVLconst [c])) 672 // cond: 673 // result: (ADDLconst [c] x) 674 for { 675 _ = v.Args[1] 676 x := v.Args[0] 677 v_1 := v.Args[1] 678 if v_1.Op != Op386MOVLconst { 679 break 680 } 681 c := v_1.AuxInt 682 v.reset(Op386ADDLconst) 683 v.AuxInt = c 684 v.AddArg(x) 685 return true 686 } 687 // match: (ADDL (MOVLconst [c]) x) 688 // cond: 689 // result: (ADDLconst [c] x) 690 for { 691 _ = v.Args[1] 692 v_0 := v.Args[0] 693 if v_0.Op != Op386MOVLconst { 694 break 695 } 696 c := v_0.AuxInt 697 x := v.Args[1] 698 v.reset(Op386ADDLconst) 699 v.AuxInt = c 700 v.AddArg(x) 701 return true 702 } 703 // match: (ADDL (SHLLconst [c] x) (SHRLconst [d] x)) 704 // cond: d == 32-c 705 // result: (ROLLconst [c] x) 706 for { 707 _ = v.Args[1] 708 v_0 := v.Args[0] 709 if v_0.Op != Op386SHLLconst { 710 break 711 } 712 c := v_0.AuxInt 713 x := v_0.Args[0] 714 v_1 := v.Args[1] 715 if v_1.Op != Op386SHRLconst { 716 break 717 } 718 d := v_1.AuxInt 719 if x != v_1.Args[0] { 720 break 721 } 722 if !(d == 32-c) { 723 break 724 } 725 v.reset(Op386ROLLconst) 726 v.AuxInt = c 727 v.AddArg(x) 728 return true 729 } 730 // match: (ADDL (SHRLconst [d] x) (SHLLconst [c] x)) 731 // cond: d == 32-c 732 // result: (ROLLconst [c] x) 733 for { 734 _ = v.Args[1] 735 v_0 := v.Args[0] 736 if v_0.Op != Op386SHRLconst { 737 break 738 } 739 d := v_0.AuxInt 740 x := v_0.Args[0] 741 v_1 := v.Args[1] 742 if v_1.Op != Op386SHLLconst { 743 break 744 } 745 c := v_1.AuxInt 746 if x != v_1.Args[0] { 747 break 748 } 749 if !(d == 32-c) { 750 break 751 } 752 v.reset(Op386ROLLconst) 753 v.AuxInt = c 754 v.AddArg(x) 755 return true 756 } 757 // match: (ADDL <t> (SHLLconst x [c]) (SHRWconst x [d])) 758 // cond: c < 16 && d == 16-c && t.Size() == 2 759 // result: (ROLWconst x [c]) 760 for { 761 t := v.Type 762 _ = v.Args[1] 763 v_0 := v.Args[0] 764 if v_0.Op != Op386SHLLconst { 765 break 766 } 767 c := v_0.AuxInt 768 x := v_0.Args[0] 769 v_1 := v.Args[1] 770 if v_1.Op != Op386SHRWconst { 771 break 772 } 773 d := v_1.AuxInt 774 if x != v_1.Args[0] { 775 break 776 } 777 if !(c < 16 && d == 16-c && t.Size() == 2) { 778 break 779 } 780 v.reset(Op386ROLWconst) 781 v.AuxInt = c 782 v.AddArg(x) 783 return true 784 } 785 // match: (ADDL <t> (SHRWconst x [d]) (SHLLconst x [c])) 786 // cond: c < 16 && d == 16-c && t.Size() == 2 787 // result: (ROLWconst x [c]) 788 for { 789 t := v.Type 790 _ = v.Args[1] 791 v_0 := v.Args[0] 792 if v_0.Op != Op386SHRWconst { 793 break 794 } 795 d := v_0.AuxInt 796 x := v_0.Args[0] 797 v_1 := v.Args[1] 798 if v_1.Op != Op386SHLLconst { 799 break 800 } 801 c := v_1.AuxInt 802 if x != v_1.Args[0] { 803 break 804 } 805 if !(c < 16 && d == 16-c && t.Size() == 2) { 806 break 807 } 808 v.reset(Op386ROLWconst) 809 v.AuxInt = c 810 v.AddArg(x) 811 return true 812 } 813 // match: (ADDL <t> (SHLLconst x [c]) (SHRBconst x [d])) 814 // cond: c < 8 && d == 8-c && t.Size() == 1 815 // result: (ROLBconst x [c]) 816 for { 817 t := v.Type 818 _ = v.Args[1] 819 v_0 := v.Args[0] 820 if v_0.Op != Op386SHLLconst { 821 break 822 } 823 c := v_0.AuxInt 824 x := v_0.Args[0] 825 v_1 := v.Args[1] 826 if v_1.Op != Op386SHRBconst { 827 break 828 } 829 d := v_1.AuxInt 830 if x != v_1.Args[0] { 831 break 832 } 833 if !(c < 8 && d == 8-c && t.Size() == 1) { 834 break 835 } 836 v.reset(Op386ROLBconst) 837 v.AuxInt = c 838 v.AddArg(x) 839 return true 840 } 841 // match: (ADDL <t> (SHRBconst x [d]) (SHLLconst x [c])) 842 // cond: c < 8 && d == 8-c && t.Size() == 1 843 // result: (ROLBconst x [c]) 844 for { 845 t := v.Type 846 _ = v.Args[1] 847 v_0 := v.Args[0] 848 if v_0.Op != Op386SHRBconst { 849 break 850 } 851 d := v_0.AuxInt 852 x := v_0.Args[0] 853 v_1 := v.Args[1] 854 if v_1.Op != Op386SHLLconst { 855 break 856 } 857 c := v_1.AuxInt 858 if x != v_1.Args[0] { 859 break 860 } 861 if !(c < 8 && d == 8-c && t.Size() == 1) { 862 break 863 } 864 v.reset(Op386ROLBconst) 865 v.AuxInt = c 866 v.AddArg(x) 867 return true 868 } 869 // match: (ADDL x (SHLLconst [3] y)) 870 // cond: 871 // result: (LEAL8 x y) 872 for { 873 _ = v.Args[1] 874 x := v.Args[0] 875 v_1 := v.Args[1] 876 if v_1.Op != Op386SHLLconst { 877 break 878 } 879 if v_1.AuxInt != 3 { 880 break 881 } 882 y := v_1.Args[0] 883 v.reset(Op386LEAL8) 884 v.AddArg(x) 885 v.AddArg(y) 886 return true 887 } 888 // match: (ADDL (SHLLconst [3] y) x) 889 // cond: 890 // result: (LEAL8 x y) 891 for { 892 _ = v.Args[1] 893 v_0 := v.Args[0] 894 if v_0.Op != Op386SHLLconst { 895 break 896 } 897 if v_0.AuxInt != 3 { 898 break 899 } 900 y := v_0.Args[0] 901 x := v.Args[1] 902 v.reset(Op386LEAL8) 903 v.AddArg(x) 904 v.AddArg(y) 905 return true 906 } 907 return false 908 } 909 func rewriteValue386_Op386ADDL_10(v *Value) bool { 910 // match: (ADDL x (SHLLconst [2] y)) 911 // cond: 912 // result: (LEAL4 x y) 913 for { 914 _ = v.Args[1] 915 x := v.Args[0] 916 v_1 := v.Args[1] 917 if v_1.Op != Op386SHLLconst { 918 break 919 } 920 if v_1.AuxInt != 2 { 921 break 922 } 923 y := v_1.Args[0] 924 v.reset(Op386LEAL4) 925 v.AddArg(x) 926 v.AddArg(y) 927 return true 928 } 929 // match: (ADDL (SHLLconst [2] y) x) 930 // cond: 931 // result: (LEAL4 x y) 932 for { 933 _ = v.Args[1] 934 v_0 := v.Args[0] 935 if v_0.Op != Op386SHLLconst { 936 break 937 } 938 if v_0.AuxInt != 2 { 939 break 940 } 941 y := v_0.Args[0] 942 x := v.Args[1] 943 v.reset(Op386LEAL4) 944 v.AddArg(x) 945 v.AddArg(y) 946 return true 947 } 948 // match: (ADDL x (SHLLconst [1] y)) 949 // cond: 950 // result: (LEAL2 x y) 951 for { 952 _ = v.Args[1] 953 x := v.Args[0] 954 v_1 := v.Args[1] 955 if v_1.Op != Op386SHLLconst { 956 break 957 } 958 if v_1.AuxInt != 1 { 959 break 960 } 961 y := v_1.Args[0] 962 v.reset(Op386LEAL2) 963 v.AddArg(x) 964 v.AddArg(y) 965 return true 966 } 967 // match: (ADDL (SHLLconst [1] y) x) 968 // cond: 969 // result: (LEAL2 x y) 970 for { 971 _ = v.Args[1] 972 v_0 := v.Args[0] 973 if v_0.Op != Op386SHLLconst { 974 break 975 } 976 if v_0.AuxInt != 1 { 977 break 978 } 979 y := v_0.Args[0] 980 x := v.Args[1] 981 v.reset(Op386LEAL2) 982 v.AddArg(x) 983 v.AddArg(y) 984 return true 985 } 986 // match: (ADDL x (ADDL y y)) 987 // cond: 988 // result: (LEAL2 x y) 989 for { 990 _ = v.Args[1] 991 x := v.Args[0] 992 v_1 := v.Args[1] 993 if v_1.Op != Op386ADDL { 994 break 995 } 996 _ = v_1.Args[1] 997 y := v_1.Args[0] 998 if y != v_1.Args[1] { 999 break 1000 } 1001 v.reset(Op386LEAL2) 1002 v.AddArg(x) 1003 v.AddArg(y) 1004 return true 1005 } 1006 // match: (ADDL (ADDL y y) x) 1007 // cond: 1008 // result: (LEAL2 x y) 1009 for { 1010 _ = v.Args[1] 1011 v_0 := v.Args[0] 1012 if v_0.Op != Op386ADDL { 1013 break 1014 } 1015 _ = v_0.Args[1] 1016 y := v_0.Args[0] 1017 if y != v_0.Args[1] { 1018 break 1019 } 1020 x := v.Args[1] 1021 v.reset(Op386LEAL2) 1022 v.AddArg(x) 1023 v.AddArg(y) 1024 return true 1025 } 1026 // match: (ADDL x (ADDL x y)) 1027 // cond: 1028 // result: (LEAL2 y x) 1029 for { 1030 _ = v.Args[1] 1031 x := v.Args[0] 1032 v_1 := v.Args[1] 1033 if v_1.Op != Op386ADDL { 1034 break 1035 } 1036 _ = v_1.Args[1] 1037 if x != v_1.Args[0] { 1038 break 1039 } 1040 y := v_1.Args[1] 1041 v.reset(Op386LEAL2) 1042 v.AddArg(y) 1043 v.AddArg(x) 1044 return true 1045 } 1046 // match: (ADDL x (ADDL y x)) 1047 // cond: 1048 // result: (LEAL2 y x) 1049 for { 1050 _ = v.Args[1] 1051 x := v.Args[0] 1052 v_1 := v.Args[1] 1053 if v_1.Op != Op386ADDL { 1054 break 1055 } 1056 _ = v_1.Args[1] 1057 y := v_1.Args[0] 1058 if x != v_1.Args[1] { 1059 break 1060 } 1061 v.reset(Op386LEAL2) 1062 v.AddArg(y) 1063 v.AddArg(x) 1064 return true 1065 } 1066 // match: (ADDL (ADDL x y) x) 1067 // cond: 1068 // result: (LEAL2 y x) 1069 for { 1070 _ = v.Args[1] 1071 v_0 := v.Args[0] 1072 if v_0.Op != Op386ADDL { 1073 break 1074 } 1075 _ = v_0.Args[1] 1076 x := v_0.Args[0] 1077 y := v_0.Args[1] 1078 if x != v.Args[1] { 1079 break 1080 } 1081 v.reset(Op386LEAL2) 1082 v.AddArg(y) 1083 v.AddArg(x) 1084 return true 1085 } 1086 // match: (ADDL (ADDL y x) x) 1087 // cond: 1088 // result: (LEAL2 y x) 1089 for { 1090 _ = v.Args[1] 1091 v_0 := v.Args[0] 1092 if v_0.Op != Op386ADDL { 1093 break 1094 } 1095 _ = v_0.Args[1] 1096 y := v_0.Args[0] 1097 x := v_0.Args[1] 1098 if x != v.Args[1] { 1099 break 1100 } 1101 v.reset(Op386LEAL2) 1102 v.AddArg(y) 1103 v.AddArg(x) 1104 return true 1105 } 1106 return false 1107 } 1108 func rewriteValue386_Op386ADDL_20(v *Value) bool { 1109 // match: (ADDL (ADDLconst [c] x) y) 1110 // cond: 1111 // result: (LEAL1 [c] x y) 1112 for { 1113 _ = v.Args[1] 1114 v_0 := v.Args[0] 1115 if v_0.Op != Op386ADDLconst { 1116 break 1117 } 1118 c := v_0.AuxInt 1119 x := v_0.Args[0] 1120 y := v.Args[1] 1121 v.reset(Op386LEAL1) 1122 v.AuxInt = c 1123 v.AddArg(x) 1124 v.AddArg(y) 1125 return true 1126 } 1127 // match: (ADDL y (ADDLconst [c] x)) 1128 // cond: 1129 // result: (LEAL1 [c] x y) 1130 for { 1131 _ = v.Args[1] 1132 y := v.Args[0] 1133 v_1 := v.Args[1] 1134 if v_1.Op != Op386ADDLconst { 1135 break 1136 } 1137 c := v_1.AuxInt 1138 x := v_1.Args[0] 1139 v.reset(Op386LEAL1) 1140 v.AuxInt = c 1141 v.AddArg(x) 1142 v.AddArg(y) 1143 return true 1144 } 1145 // match: (ADDL x (LEAL [c] {s} y)) 1146 // cond: x.Op != OpSB && y.Op != OpSB 1147 // result: (LEAL1 [c] {s} x y) 1148 for { 1149 _ = v.Args[1] 1150 x := v.Args[0] 1151 v_1 := v.Args[1] 1152 if v_1.Op != Op386LEAL { 1153 break 1154 } 1155 c := v_1.AuxInt 1156 s := v_1.Aux 1157 y := v_1.Args[0] 1158 if !(x.Op != OpSB && y.Op != OpSB) { 1159 break 1160 } 1161 v.reset(Op386LEAL1) 1162 v.AuxInt = c 1163 v.Aux = s 1164 v.AddArg(x) 1165 v.AddArg(y) 1166 return true 1167 } 1168 // match: (ADDL (LEAL [c] {s} y) x) 1169 // cond: x.Op != OpSB && y.Op != OpSB 1170 // result: (LEAL1 [c] {s} x y) 1171 for { 1172 _ = v.Args[1] 1173 v_0 := v.Args[0] 1174 if v_0.Op != Op386LEAL { 1175 break 1176 } 1177 c := v_0.AuxInt 1178 s := v_0.Aux 1179 y := v_0.Args[0] 1180 x := v.Args[1] 1181 if !(x.Op != OpSB && y.Op != OpSB) { 1182 break 1183 } 1184 v.reset(Op386LEAL1) 1185 v.AuxInt = c 1186 v.Aux = s 1187 v.AddArg(x) 1188 v.AddArg(y) 1189 return true 1190 } 1191 // match: (ADDL x (NEGL y)) 1192 // cond: 1193 // result: (SUBL x y) 1194 for { 1195 _ = v.Args[1] 1196 x := v.Args[0] 1197 v_1 := v.Args[1] 1198 if v_1.Op != Op386NEGL { 1199 break 1200 } 1201 y := v_1.Args[0] 1202 v.reset(Op386SUBL) 1203 v.AddArg(x) 1204 v.AddArg(y) 1205 return true 1206 } 1207 // match: (ADDL (NEGL y) x) 1208 // cond: 1209 // result: (SUBL x y) 1210 for { 1211 _ = v.Args[1] 1212 v_0 := v.Args[0] 1213 if v_0.Op != Op386NEGL { 1214 break 1215 } 1216 y := v_0.Args[0] 1217 x := v.Args[1] 1218 v.reset(Op386SUBL) 1219 v.AddArg(x) 1220 v.AddArg(y) 1221 return true 1222 } 1223 return false 1224 } 1225 func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { 1226 // match: (ADDLcarry x (MOVLconst [c])) 1227 // cond: 1228 // result: (ADDLconstcarry [c] x) 1229 for { 1230 _ = v.Args[1] 1231 x := v.Args[0] 1232 v_1 := v.Args[1] 1233 if v_1.Op != Op386MOVLconst { 1234 break 1235 } 1236 c := v_1.AuxInt 1237 v.reset(Op386ADDLconstcarry) 1238 v.AuxInt = c 1239 v.AddArg(x) 1240 return true 1241 } 1242 // match: (ADDLcarry (MOVLconst [c]) x) 1243 // cond: 1244 // result: (ADDLconstcarry [c] x) 1245 for { 1246 _ = v.Args[1] 1247 v_0 := v.Args[0] 1248 if v_0.Op != Op386MOVLconst { 1249 break 1250 } 1251 c := v_0.AuxInt 1252 x := v.Args[1] 1253 v.reset(Op386ADDLconstcarry) 1254 v.AuxInt = c 1255 v.AddArg(x) 1256 return true 1257 } 1258 return false 1259 } 1260 func rewriteValue386_Op386ADDLconst_0(v *Value) bool { 1261 // match: (ADDLconst [c] (ADDL x y)) 1262 // cond: 1263 // result: (LEAL1 [c] x y) 1264 for { 1265 c := v.AuxInt 1266 v_0 := v.Args[0] 1267 if v_0.Op != Op386ADDL { 1268 break 1269 } 1270 _ = v_0.Args[1] 1271 x := v_0.Args[0] 1272 y := v_0.Args[1] 1273 v.reset(Op386LEAL1) 1274 v.AuxInt = c 1275 v.AddArg(x) 1276 v.AddArg(y) 1277 return true 1278 } 1279 // match: (ADDLconst [c] (LEAL [d] {s} x)) 1280 // cond: is32Bit(c+d) 1281 // result: (LEAL [c+d] {s} x) 1282 for { 1283 c := v.AuxInt 1284 v_0 := v.Args[0] 1285 if v_0.Op != Op386LEAL { 1286 break 1287 } 1288 d := v_0.AuxInt 1289 s := v_0.Aux 1290 x := v_0.Args[0] 1291 if !(is32Bit(c + d)) { 1292 break 1293 } 1294 v.reset(Op386LEAL) 1295 v.AuxInt = c + d 1296 v.Aux = s 1297 v.AddArg(x) 1298 return true 1299 } 1300 // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) 1301 // cond: is32Bit(c+d) 1302 // result: (LEAL1 [c+d] {s} x y) 1303 for { 1304 c := v.AuxInt 1305 v_0 := v.Args[0] 1306 if v_0.Op != Op386LEAL1 { 1307 break 1308 } 1309 d := v_0.AuxInt 1310 s := v_0.Aux 1311 _ = v_0.Args[1] 1312 x := v_0.Args[0] 1313 y := v_0.Args[1] 1314 if !(is32Bit(c + d)) { 1315 break 1316 } 1317 v.reset(Op386LEAL1) 1318 v.AuxInt = c + d 1319 v.Aux = s 1320 v.AddArg(x) 1321 v.AddArg(y) 1322 return true 1323 } 1324 // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) 1325 // cond: is32Bit(c+d) 1326 // result: (LEAL2 [c+d] {s} x y) 1327 for { 1328 c := v.AuxInt 1329 v_0 := v.Args[0] 1330 if v_0.Op != Op386LEAL2 { 1331 break 1332 } 1333 d := v_0.AuxInt 1334 s := v_0.Aux 1335 _ = v_0.Args[1] 1336 x := v_0.Args[0] 1337 y := v_0.Args[1] 1338 if !(is32Bit(c + d)) { 1339 break 1340 } 1341 v.reset(Op386LEAL2) 1342 v.AuxInt = c + d 1343 v.Aux = s 1344 v.AddArg(x) 1345 v.AddArg(y) 1346 return true 1347 } 1348 // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) 1349 // cond: is32Bit(c+d) 1350 // result: (LEAL4 [c+d] {s} x y) 1351 for { 1352 c := v.AuxInt 1353 v_0 := v.Args[0] 1354 if v_0.Op != Op386LEAL4 { 1355 break 1356 } 1357 d := v_0.AuxInt 1358 s := v_0.Aux 1359 _ = v_0.Args[1] 1360 x := v_0.Args[0] 1361 y := v_0.Args[1] 1362 if !(is32Bit(c + d)) { 1363 break 1364 } 1365 v.reset(Op386LEAL4) 1366 v.AuxInt = c + d 1367 v.Aux = s 1368 v.AddArg(x) 1369 v.AddArg(y) 1370 return true 1371 } 1372 // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) 1373 // cond: is32Bit(c+d) 1374 // result: (LEAL8 [c+d] {s} x y) 1375 for { 1376 c := v.AuxInt 1377 v_0 := v.Args[0] 1378 if v_0.Op != Op386LEAL8 { 1379 break 1380 } 1381 d := v_0.AuxInt 1382 s := v_0.Aux 1383 _ = v_0.Args[1] 1384 x := v_0.Args[0] 1385 y := v_0.Args[1] 1386 if !(is32Bit(c + d)) { 1387 break 1388 } 1389 v.reset(Op386LEAL8) 1390 v.AuxInt = c + d 1391 v.Aux = s 1392 v.AddArg(x) 1393 v.AddArg(y) 1394 return true 1395 } 1396 // match: (ADDLconst [c] x) 1397 // cond: int32(c)==0 1398 // result: x 1399 for { 1400 c := v.AuxInt 1401 x := v.Args[0] 1402 if !(int32(c) == 0) { 1403 break 1404 } 1405 v.reset(OpCopy) 1406 v.Type = x.Type 1407 v.AddArg(x) 1408 return true 1409 } 1410 // match: (ADDLconst [c] (MOVLconst [d])) 1411 // cond: 1412 // result: (MOVLconst [int64(int32(c+d))]) 1413 for { 1414 c := v.AuxInt 1415 v_0 := v.Args[0] 1416 if v_0.Op != Op386MOVLconst { 1417 break 1418 } 1419 d := v_0.AuxInt 1420 v.reset(Op386MOVLconst) 1421 v.AuxInt = int64(int32(c + d)) 1422 return true 1423 } 1424 // match: (ADDLconst [c] (ADDLconst [d] x)) 1425 // cond: 1426 // result: (ADDLconst [int64(int32(c+d))] x) 1427 for { 1428 c := v.AuxInt 1429 v_0 := v.Args[0] 1430 if v_0.Op != Op386ADDLconst { 1431 break 1432 } 1433 d := v_0.AuxInt 1434 x := v_0.Args[0] 1435 v.reset(Op386ADDLconst) 1436 v.AuxInt = int64(int32(c + d)) 1437 v.AddArg(x) 1438 return true 1439 } 1440 return false 1441 } 1442 func rewriteValue386_Op386ANDL_0(v *Value) bool { 1443 // match: (ANDL x (MOVLconst [c])) 1444 // cond: 1445 // result: (ANDLconst [c] x) 1446 for { 1447 _ = v.Args[1] 1448 x := v.Args[0] 1449 v_1 := v.Args[1] 1450 if v_1.Op != Op386MOVLconst { 1451 break 1452 } 1453 c := v_1.AuxInt 1454 v.reset(Op386ANDLconst) 1455 v.AuxInt = c 1456 v.AddArg(x) 1457 return true 1458 } 1459 // match: (ANDL (MOVLconst [c]) x) 1460 // cond: 1461 // result: (ANDLconst [c] x) 1462 for { 1463 _ = v.Args[1] 1464 v_0 := v.Args[0] 1465 if v_0.Op != Op386MOVLconst { 1466 break 1467 } 1468 c := v_0.AuxInt 1469 x := v.Args[1] 1470 v.reset(Op386ANDLconst) 1471 v.AuxInt = c 1472 v.AddArg(x) 1473 return true 1474 } 1475 // match: (ANDL x x) 1476 // cond: 1477 // result: x 1478 for { 1479 _ = v.Args[1] 1480 x := v.Args[0] 1481 if x != v.Args[1] { 1482 break 1483 } 1484 v.reset(OpCopy) 1485 v.Type = x.Type 1486 v.AddArg(x) 1487 return true 1488 } 1489 return false 1490 } 1491 func rewriteValue386_Op386ANDLconst_0(v *Value) bool { 1492 // match: (ANDLconst [c] (ANDLconst [d] x)) 1493 // cond: 1494 // result: (ANDLconst [c & d] x) 1495 for { 1496 c := v.AuxInt 1497 v_0 := v.Args[0] 1498 if v_0.Op != Op386ANDLconst { 1499 break 1500 } 1501 d := v_0.AuxInt 1502 x := v_0.Args[0] 1503 v.reset(Op386ANDLconst) 1504 v.AuxInt = c & d 1505 v.AddArg(x) 1506 return true 1507 } 1508 // match: (ANDLconst [c] _) 1509 // cond: int32(c)==0 1510 // result: (MOVLconst [0]) 1511 for { 1512 c := v.AuxInt 1513 if !(int32(c) == 0) { 1514 break 1515 } 1516 v.reset(Op386MOVLconst) 1517 v.AuxInt = 0 1518 return true 1519 } 1520 // match: (ANDLconst [c] x) 1521 // cond: int32(c)==-1 1522 // result: x 1523 for { 1524 c := v.AuxInt 1525 x := v.Args[0] 1526 if !(int32(c) == -1) { 1527 break 1528 } 1529 v.reset(OpCopy) 1530 v.Type = x.Type 1531 v.AddArg(x) 1532 return true 1533 } 1534 // match: (ANDLconst [c] (MOVLconst [d])) 1535 // cond: 1536 // result: (MOVLconst [c&d]) 1537 for { 1538 c := v.AuxInt 1539 v_0 := v.Args[0] 1540 if v_0.Op != Op386MOVLconst { 1541 break 1542 } 1543 d := v_0.AuxInt 1544 v.reset(Op386MOVLconst) 1545 v.AuxInt = c & d 1546 return true 1547 } 1548 return false 1549 } 1550 func rewriteValue386_Op386CMPB_0(v *Value) bool { 1551 b := v.Block 1552 _ = b 1553 // match: (CMPB x (MOVLconst [c])) 1554 // cond: 1555 // result: (CMPBconst x [int64(int8(c))]) 1556 for { 1557 _ = v.Args[1] 1558 x := v.Args[0] 1559 v_1 := v.Args[1] 1560 if v_1.Op != Op386MOVLconst { 1561 break 1562 } 1563 c := v_1.AuxInt 1564 v.reset(Op386CMPBconst) 1565 v.AuxInt = int64(int8(c)) 1566 v.AddArg(x) 1567 return true 1568 } 1569 // match: (CMPB (MOVLconst [c]) x) 1570 // cond: 1571 // result: (InvertFlags (CMPBconst x [int64(int8(c))])) 1572 for { 1573 _ = v.Args[1] 1574 v_0 := v.Args[0] 1575 if v_0.Op != Op386MOVLconst { 1576 break 1577 } 1578 c := v_0.AuxInt 1579 x := v.Args[1] 1580 v.reset(Op386InvertFlags) 1581 v0 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 1582 v0.AuxInt = int64(int8(c)) 1583 v0.AddArg(x) 1584 v.AddArg(v0) 1585 return true 1586 } 1587 return false 1588 } 1589 func rewriteValue386_Op386CMPBconst_0(v *Value) bool { 1590 // match: (CMPBconst (MOVLconst [x]) [y]) 1591 // cond: int8(x)==int8(y) 1592 // result: (FlagEQ) 1593 for { 1594 y := v.AuxInt 1595 v_0 := v.Args[0] 1596 if v_0.Op != Op386MOVLconst { 1597 break 1598 } 1599 x := v_0.AuxInt 1600 if !(int8(x) == int8(y)) { 1601 break 1602 } 1603 v.reset(Op386FlagEQ) 1604 return true 1605 } 1606 // match: (CMPBconst (MOVLconst [x]) [y]) 1607 // cond: int8(x)<int8(y) && uint8(x)<uint8(y) 1608 // result: (FlagLT_ULT) 1609 for { 1610 y := v.AuxInt 1611 v_0 := v.Args[0] 1612 if v_0.Op != Op386MOVLconst { 1613 break 1614 } 1615 x := v_0.AuxInt 1616 if !(int8(x) < int8(y) && uint8(x) < uint8(y)) { 1617 break 1618 } 1619 v.reset(Op386FlagLT_ULT) 1620 return true 1621 } 1622 // match: (CMPBconst (MOVLconst [x]) [y]) 1623 // cond: int8(x)<int8(y) && uint8(x)>uint8(y) 1624 // result: (FlagLT_UGT) 1625 for { 1626 y := v.AuxInt 1627 v_0 := v.Args[0] 1628 if v_0.Op != Op386MOVLconst { 1629 break 1630 } 1631 x := v_0.AuxInt 1632 if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { 1633 break 1634 } 1635 v.reset(Op386FlagLT_UGT) 1636 return true 1637 } 1638 // match: (CMPBconst (MOVLconst [x]) [y]) 1639 // cond: int8(x)>int8(y) && uint8(x)<uint8(y) 1640 // result: (FlagGT_ULT) 1641 for { 1642 y := v.AuxInt 1643 v_0 := v.Args[0] 1644 if v_0.Op != Op386MOVLconst { 1645 break 1646 } 1647 x := v_0.AuxInt 1648 if !(int8(x) > int8(y) && uint8(x) < uint8(y)) { 1649 break 1650 } 1651 v.reset(Op386FlagGT_ULT) 1652 return true 1653 } 1654 // match: (CMPBconst (MOVLconst [x]) [y]) 1655 // cond: int8(x)>int8(y) && uint8(x)>uint8(y) 1656 // result: (FlagGT_UGT) 1657 for { 1658 y := v.AuxInt 1659 v_0 := v.Args[0] 1660 if v_0.Op != Op386MOVLconst { 1661 break 1662 } 1663 x := v_0.AuxInt 1664 if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { 1665 break 1666 } 1667 v.reset(Op386FlagGT_UGT) 1668 return true 1669 } 1670 // match: (CMPBconst (ANDLconst _ [m]) [n]) 1671 // cond: 0 <= int8(m) && int8(m) < int8(n) 1672 // result: (FlagLT_ULT) 1673 for { 1674 n := v.AuxInt 1675 v_0 := v.Args[0] 1676 if v_0.Op != Op386ANDLconst { 1677 break 1678 } 1679 m := v_0.AuxInt 1680 if !(0 <= int8(m) && int8(m) < int8(n)) { 1681 break 1682 } 1683 v.reset(Op386FlagLT_ULT) 1684 return true 1685 } 1686 // match: (CMPBconst (ANDL x y) [0]) 1687 // cond: 1688 // result: (TESTB x y) 1689 for { 1690 if v.AuxInt != 0 { 1691 break 1692 } 1693 v_0 := v.Args[0] 1694 if v_0.Op != Op386ANDL { 1695 break 1696 } 1697 _ = v_0.Args[1] 1698 x := v_0.Args[0] 1699 y := v_0.Args[1] 1700 v.reset(Op386TESTB) 1701 v.AddArg(x) 1702 v.AddArg(y) 1703 return true 1704 } 1705 // match: (CMPBconst (ANDLconst [c] x) [0]) 1706 // cond: 1707 // result: (TESTBconst [int64(int8(c))] x) 1708 for { 1709 if v.AuxInt != 0 { 1710 break 1711 } 1712 v_0 := v.Args[0] 1713 if v_0.Op != Op386ANDLconst { 1714 break 1715 } 1716 c := v_0.AuxInt 1717 x := v_0.Args[0] 1718 v.reset(Op386TESTBconst) 1719 v.AuxInt = int64(int8(c)) 1720 v.AddArg(x) 1721 return true 1722 } 1723 // match: (CMPBconst x [0]) 1724 // cond: 1725 // result: (TESTB x x) 1726 for { 1727 if v.AuxInt != 0 { 1728 break 1729 } 1730 x := v.Args[0] 1731 v.reset(Op386TESTB) 1732 v.AddArg(x) 1733 v.AddArg(x) 1734 return true 1735 } 1736 return false 1737 } 1738 func rewriteValue386_Op386CMPL_0(v *Value) bool { 1739 b := v.Block 1740 _ = b 1741 // match: (CMPL x (MOVLconst [c])) 1742 // cond: 1743 // result: (CMPLconst x [c]) 1744 for { 1745 _ = v.Args[1] 1746 x := v.Args[0] 1747 v_1 := v.Args[1] 1748 if v_1.Op != Op386MOVLconst { 1749 break 1750 } 1751 c := v_1.AuxInt 1752 v.reset(Op386CMPLconst) 1753 v.AuxInt = c 1754 v.AddArg(x) 1755 return true 1756 } 1757 // match: (CMPL (MOVLconst [c]) x) 1758 // cond: 1759 // result: (InvertFlags (CMPLconst x [c])) 1760 for { 1761 _ = v.Args[1] 1762 v_0 := v.Args[0] 1763 if v_0.Op != Op386MOVLconst { 1764 break 1765 } 1766 c := v_0.AuxInt 1767 x := v.Args[1] 1768 v.reset(Op386InvertFlags) 1769 v0 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 1770 v0.AuxInt = c 1771 v0.AddArg(x) 1772 v.AddArg(v0) 1773 return true 1774 } 1775 return false 1776 } 1777 func rewriteValue386_Op386CMPLconst_0(v *Value) bool { 1778 // match: (CMPLconst (MOVLconst [x]) [y]) 1779 // cond: int32(x)==int32(y) 1780 // result: (FlagEQ) 1781 for { 1782 y := v.AuxInt 1783 v_0 := v.Args[0] 1784 if v_0.Op != Op386MOVLconst { 1785 break 1786 } 1787 x := v_0.AuxInt 1788 if !(int32(x) == int32(y)) { 1789 break 1790 } 1791 v.reset(Op386FlagEQ) 1792 return true 1793 } 1794 // match: (CMPLconst (MOVLconst [x]) [y]) 1795 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 1796 // result: (FlagLT_ULT) 1797 for { 1798 y := v.AuxInt 1799 v_0 := v.Args[0] 1800 if v_0.Op != Op386MOVLconst { 1801 break 1802 } 1803 x := v_0.AuxInt 1804 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 1805 break 1806 } 1807 v.reset(Op386FlagLT_ULT) 1808 return true 1809 } 1810 // match: (CMPLconst (MOVLconst [x]) [y]) 1811 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 1812 // result: (FlagLT_UGT) 1813 for { 1814 y := v.AuxInt 1815 v_0 := v.Args[0] 1816 if v_0.Op != Op386MOVLconst { 1817 break 1818 } 1819 x := v_0.AuxInt 1820 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 1821 break 1822 } 1823 v.reset(Op386FlagLT_UGT) 1824 return true 1825 } 1826 // match: (CMPLconst (MOVLconst [x]) [y]) 1827 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 1828 // result: (FlagGT_ULT) 1829 for { 1830 y := v.AuxInt 1831 v_0 := v.Args[0] 1832 if v_0.Op != Op386MOVLconst { 1833 break 1834 } 1835 x := v_0.AuxInt 1836 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 1837 break 1838 } 1839 v.reset(Op386FlagGT_ULT) 1840 return true 1841 } 1842 // match: (CMPLconst (MOVLconst [x]) [y]) 1843 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 1844 // result: (FlagGT_UGT) 1845 for { 1846 y := v.AuxInt 1847 v_0 := v.Args[0] 1848 if v_0.Op != Op386MOVLconst { 1849 break 1850 } 1851 x := v_0.AuxInt 1852 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 1853 break 1854 } 1855 v.reset(Op386FlagGT_UGT) 1856 return true 1857 } 1858 // match: (CMPLconst (SHRLconst _ [c]) [n]) 1859 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 1860 // result: (FlagLT_ULT) 1861 for { 1862 n := v.AuxInt 1863 v_0 := v.Args[0] 1864 if v_0.Op != Op386SHRLconst { 1865 break 1866 } 1867 c := v_0.AuxInt 1868 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 1869 break 1870 } 1871 v.reset(Op386FlagLT_ULT) 1872 return true 1873 } 1874 // match: (CMPLconst (ANDLconst _ [m]) [n]) 1875 // cond: 0 <= int32(m) && int32(m) < int32(n) 1876 // result: (FlagLT_ULT) 1877 for { 1878 n := v.AuxInt 1879 v_0 := v.Args[0] 1880 if v_0.Op != Op386ANDLconst { 1881 break 1882 } 1883 m := v_0.AuxInt 1884 if !(0 <= int32(m) && int32(m) < int32(n)) { 1885 break 1886 } 1887 v.reset(Op386FlagLT_ULT) 1888 return true 1889 } 1890 // match: (CMPLconst (ANDL x y) [0]) 1891 // cond: 1892 // result: (TESTL x y) 1893 for { 1894 if v.AuxInt != 0 { 1895 break 1896 } 1897 v_0 := v.Args[0] 1898 if v_0.Op != Op386ANDL { 1899 break 1900 } 1901 _ = v_0.Args[1] 1902 x := v_0.Args[0] 1903 y := v_0.Args[1] 1904 v.reset(Op386TESTL) 1905 v.AddArg(x) 1906 v.AddArg(y) 1907 return true 1908 } 1909 // match: (CMPLconst (ANDLconst [c] x) [0]) 1910 // cond: 1911 // result: (TESTLconst [c] x) 1912 for { 1913 if v.AuxInt != 0 { 1914 break 1915 } 1916 v_0 := v.Args[0] 1917 if v_0.Op != Op386ANDLconst { 1918 break 1919 } 1920 c := v_0.AuxInt 1921 x := v_0.Args[0] 1922 v.reset(Op386TESTLconst) 1923 v.AuxInt = c 1924 v.AddArg(x) 1925 return true 1926 } 1927 // match: (CMPLconst x [0]) 1928 // cond: 1929 // result: (TESTL x x) 1930 for { 1931 if v.AuxInt != 0 { 1932 break 1933 } 1934 x := v.Args[0] 1935 v.reset(Op386TESTL) 1936 v.AddArg(x) 1937 v.AddArg(x) 1938 return true 1939 } 1940 return false 1941 } 1942 func rewriteValue386_Op386CMPW_0(v *Value) bool { 1943 b := v.Block 1944 _ = b 1945 // match: (CMPW x (MOVLconst [c])) 1946 // cond: 1947 // result: (CMPWconst x [int64(int16(c))]) 1948 for { 1949 _ = v.Args[1] 1950 x := v.Args[0] 1951 v_1 := v.Args[1] 1952 if v_1.Op != Op386MOVLconst { 1953 break 1954 } 1955 c := v_1.AuxInt 1956 v.reset(Op386CMPWconst) 1957 v.AuxInt = int64(int16(c)) 1958 v.AddArg(x) 1959 return true 1960 } 1961 // match: (CMPW (MOVLconst [c]) x) 1962 // cond: 1963 // result: (InvertFlags (CMPWconst x [int64(int16(c))])) 1964 for { 1965 _ = v.Args[1] 1966 v_0 := v.Args[0] 1967 if v_0.Op != Op386MOVLconst { 1968 break 1969 } 1970 c := v_0.AuxInt 1971 x := v.Args[1] 1972 v.reset(Op386InvertFlags) 1973 v0 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 1974 v0.AuxInt = int64(int16(c)) 1975 v0.AddArg(x) 1976 v.AddArg(v0) 1977 return true 1978 } 1979 return false 1980 } 1981 func rewriteValue386_Op386CMPWconst_0(v *Value) bool { 1982 // match: (CMPWconst (MOVLconst [x]) [y]) 1983 // cond: int16(x)==int16(y) 1984 // result: (FlagEQ) 1985 for { 1986 y := v.AuxInt 1987 v_0 := v.Args[0] 1988 if v_0.Op != Op386MOVLconst { 1989 break 1990 } 1991 x := v_0.AuxInt 1992 if !(int16(x) == int16(y)) { 1993 break 1994 } 1995 v.reset(Op386FlagEQ) 1996 return true 1997 } 1998 // match: (CMPWconst (MOVLconst [x]) [y]) 1999 // cond: int16(x)<int16(y) && uint16(x)<uint16(y) 2000 // result: (FlagLT_ULT) 2001 for { 2002 y := v.AuxInt 2003 v_0 := v.Args[0] 2004 if v_0.Op != Op386MOVLconst { 2005 break 2006 } 2007 x := v_0.AuxInt 2008 if !(int16(x) < int16(y) && uint16(x) < uint16(y)) { 2009 break 2010 } 2011 v.reset(Op386FlagLT_ULT) 2012 return true 2013 } 2014 // match: (CMPWconst (MOVLconst [x]) [y]) 2015 // cond: int16(x)<int16(y) && uint16(x)>uint16(y) 2016 // result: (FlagLT_UGT) 2017 for { 2018 y := v.AuxInt 2019 v_0 := v.Args[0] 2020 if v_0.Op != Op386MOVLconst { 2021 break 2022 } 2023 x := v_0.AuxInt 2024 if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { 2025 break 2026 } 2027 v.reset(Op386FlagLT_UGT) 2028 return true 2029 } 2030 // match: (CMPWconst (MOVLconst [x]) [y]) 2031 // cond: int16(x)>int16(y) && uint16(x)<uint16(y) 2032 // result: (FlagGT_ULT) 2033 for { 2034 y := v.AuxInt 2035 v_0 := v.Args[0] 2036 if v_0.Op != Op386MOVLconst { 2037 break 2038 } 2039 x := v_0.AuxInt 2040 if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { 2041 break 2042 } 2043 v.reset(Op386FlagGT_ULT) 2044 return true 2045 } 2046 // match: (CMPWconst (MOVLconst [x]) [y]) 2047 // cond: int16(x)>int16(y) && uint16(x)>uint16(y) 2048 // result: (FlagGT_UGT) 2049 for { 2050 y := v.AuxInt 2051 v_0 := v.Args[0] 2052 if v_0.Op != Op386MOVLconst { 2053 break 2054 } 2055 x := v_0.AuxInt 2056 if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { 2057 break 2058 } 2059 v.reset(Op386FlagGT_UGT) 2060 return true 2061 } 2062 // match: (CMPWconst (ANDLconst _ [m]) [n]) 2063 // cond: 0 <= int16(m) && int16(m) < int16(n) 2064 // result: (FlagLT_ULT) 2065 for { 2066 n := v.AuxInt 2067 v_0 := v.Args[0] 2068 if v_0.Op != Op386ANDLconst { 2069 break 2070 } 2071 m := v_0.AuxInt 2072 if !(0 <= int16(m) && int16(m) < int16(n)) { 2073 break 2074 } 2075 v.reset(Op386FlagLT_ULT) 2076 return true 2077 } 2078 // match: (CMPWconst (ANDL x y) [0]) 2079 // cond: 2080 // result: (TESTW x y) 2081 for { 2082 if v.AuxInt != 0 { 2083 break 2084 } 2085 v_0 := v.Args[0] 2086 if v_0.Op != Op386ANDL { 2087 break 2088 } 2089 _ = v_0.Args[1] 2090 x := v_0.Args[0] 2091 y := v_0.Args[1] 2092 v.reset(Op386TESTW) 2093 v.AddArg(x) 2094 v.AddArg(y) 2095 return true 2096 } 2097 // match: (CMPWconst (ANDLconst [c] x) [0]) 2098 // cond: 2099 // result: (TESTWconst [int64(int16(c))] x) 2100 for { 2101 if v.AuxInt != 0 { 2102 break 2103 } 2104 v_0 := v.Args[0] 2105 if v_0.Op != Op386ANDLconst { 2106 break 2107 } 2108 c := v_0.AuxInt 2109 x := v_0.Args[0] 2110 v.reset(Op386TESTWconst) 2111 v.AuxInt = int64(int16(c)) 2112 v.AddArg(x) 2113 return true 2114 } 2115 // match: (CMPWconst x [0]) 2116 // cond: 2117 // result: (TESTW x x) 2118 for { 2119 if v.AuxInt != 0 { 2120 break 2121 } 2122 x := v.Args[0] 2123 v.reset(Op386TESTW) 2124 v.AddArg(x) 2125 v.AddArg(x) 2126 return true 2127 } 2128 return false 2129 } 2130 func rewriteValue386_Op386LEAL_0(v *Value) bool { 2131 // match: (LEAL [c] {s} (ADDLconst [d] x)) 2132 // cond: is32Bit(c+d) 2133 // result: (LEAL [c+d] {s} x) 2134 for { 2135 c := v.AuxInt 2136 s := v.Aux 2137 v_0 := v.Args[0] 2138 if v_0.Op != Op386ADDLconst { 2139 break 2140 } 2141 d := v_0.AuxInt 2142 x := v_0.Args[0] 2143 if !(is32Bit(c + d)) { 2144 break 2145 } 2146 v.reset(Op386LEAL) 2147 v.AuxInt = c + d 2148 v.Aux = s 2149 v.AddArg(x) 2150 return true 2151 } 2152 // match: (LEAL [c] {s} (ADDL x y)) 2153 // cond: x.Op != OpSB && y.Op != OpSB 2154 // result: (LEAL1 [c] {s} x y) 2155 for { 2156 c := v.AuxInt 2157 s := v.Aux 2158 v_0 := v.Args[0] 2159 if v_0.Op != Op386ADDL { 2160 break 2161 } 2162 _ = v_0.Args[1] 2163 x := v_0.Args[0] 2164 y := v_0.Args[1] 2165 if !(x.Op != OpSB && y.Op != OpSB) { 2166 break 2167 } 2168 v.reset(Op386LEAL1) 2169 v.AuxInt = c 2170 v.Aux = s 2171 v.AddArg(x) 2172 v.AddArg(y) 2173 return true 2174 } 2175 // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) 2176 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2177 // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) 2178 for { 2179 off1 := v.AuxInt 2180 sym1 := v.Aux 2181 v_0 := v.Args[0] 2182 if v_0.Op != Op386LEAL { 2183 break 2184 } 2185 off2 := v_0.AuxInt 2186 sym2 := v_0.Aux 2187 x := v_0.Args[0] 2188 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2189 break 2190 } 2191 v.reset(Op386LEAL) 2192 v.AuxInt = off1 + off2 2193 v.Aux = mergeSym(sym1, sym2) 2194 v.AddArg(x) 2195 return true 2196 } 2197 // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) 2198 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2199 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2200 for { 2201 off1 := v.AuxInt 2202 sym1 := v.Aux 2203 v_0 := v.Args[0] 2204 if v_0.Op != Op386LEAL1 { 2205 break 2206 } 2207 off2 := v_0.AuxInt 2208 sym2 := v_0.Aux 2209 _ = v_0.Args[1] 2210 x := v_0.Args[0] 2211 y := v_0.Args[1] 2212 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2213 break 2214 } 2215 v.reset(Op386LEAL1) 2216 v.AuxInt = off1 + off2 2217 v.Aux = mergeSym(sym1, sym2) 2218 v.AddArg(x) 2219 v.AddArg(y) 2220 return true 2221 } 2222 // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) 2223 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2224 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2225 for { 2226 off1 := v.AuxInt 2227 sym1 := v.Aux 2228 v_0 := v.Args[0] 2229 if v_0.Op != Op386LEAL2 { 2230 break 2231 } 2232 off2 := v_0.AuxInt 2233 sym2 := v_0.Aux 2234 _ = v_0.Args[1] 2235 x := v_0.Args[0] 2236 y := v_0.Args[1] 2237 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2238 break 2239 } 2240 v.reset(Op386LEAL2) 2241 v.AuxInt = off1 + off2 2242 v.Aux = mergeSym(sym1, sym2) 2243 v.AddArg(x) 2244 v.AddArg(y) 2245 return true 2246 } 2247 // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) 2248 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2249 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2250 for { 2251 off1 := v.AuxInt 2252 sym1 := v.Aux 2253 v_0 := v.Args[0] 2254 if v_0.Op != Op386LEAL4 { 2255 break 2256 } 2257 off2 := v_0.AuxInt 2258 sym2 := v_0.Aux 2259 _ = v_0.Args[1] 2260 x := v_0.Args[0] 2261 y := v_0.Args[1] 2262 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2263 break 2264 } 2265 v.reset(Op386LEAL4) 2266 v.AuxInt = off1 + off2 2267 v.Aux = mergeSym(sym1, sym2) 2268 v.AddArg(x) 2269 v.AddArg(y) 2270 return true 2271 } 2272 // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) 2273 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2274 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2275 for { 2276 off1 := v.AuxInt 2277 sym1 := v.Aux 2278 v_0 := v.Args[0] 2279 if v_0.Op != Op386LEAL8 { 2280 break 2281 } 2282 off2 := v_0.AuxInt 2283 sym2 := v_0.Aux 2284 _ = v_0.Args[1] 2285 x := v_0.Args[0] 2286 y := v_0.Args[1] 2287 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2288 break 2289 } 2290 v.reset(Op386LEAL8) 2291 v.AuxInt = off1 + off2 2292 v.Aux = mergeSym(sym1, sym2) 2293 v.AddArg(x) 2294 v.AddArg(y) 2295 return true 2296 } 2297 return false 2298 } 2299 func rewriteValue386_Op386LEAL1_0(v *Value) bool { 2300 // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) 2301 // cond: is32Bit(c+d) && x.Op != OpSB 2302 // result: (LEAL1 [c+d] {s} x y) 2303 for { 2304 c := v.AuxInt 2305 s := v.Aux 2306 _ = v.Args[1] 2307 v_0 := v.Args[0] 2308 if v_0.Op != Op386ADDLconst { 2309 break 2310 } 2311 d := v_0.AuxInt 2312 x := v_0.Args[0] 2313 y := v.Args[1] 2314 if !(is32Bit(c+d) && x.Op != OpSB) { 2315 break 2316 } 2317 v.reset(Op386LEAL1) 2318 v.AuxInt = c + d 2319 v.Aux = s 2320 v.AddArg(x) 2321 v.AddArg(y) 2322 return true 2323 } 2324 // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) 2325 // cond: is32Bit(c+d) && x.Op != OpSB 2326 // result: (LEAL1 [c+d] {s} x y) 2327 for { 2328 c := v.AuxInt 2329 s := v.Aux 2330 _ = v.Args[1] 2331 y := v.Args[0] 2332 v_1 := v.Args[1] 2333 if v_1.Op != Op386ADDLconst { 2334 break 2335 } 2336 d := v_1.AuxInt 2337 x := v_1.Args[0] 2338 if !(is32Bit(c+d) && x.Op != OpSB) { 2339 break 2340 } 2341 v.reset(Op386LEAL1) 2342 v.AuxInt = c + d 2343 v.Aux = s 2344 v.AddArg(x) 2345 v.AddArg(y) 2346 return true 2347 } 2348 // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) 2349 // cond: 2350 // result: (LEAL2 [c] {s} x y) 2351 for { 2352 c := v.AuxInt 2353 s := v.Aux 2354 _ = v.Args[1] 2355 x := v.Args[0] 2356 v_1 := v.Args[1] 2357 if v_1.Op != Op386SHLLconst { 2358 break 2359 } 2360 if v_1.AuxInt != 1 { 2361 break 2362 } 2363 y := v_1.Args[0] 2364 v.reset(Op386LEAL2) 2365 v.AuxInt = c 2366 v.Aux = s 2367 v.AddArg(x) 2368 v.AddArg(y) 2369 return true 2370 } 2371 // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) 2372 // cond: 2373 // result: (LEAL2 [c] {s} x y) 2374 for { 2375 c := v.AuxInt 2376 s := v.Aux 2377 _ = v.Args[1] 2378 v_0 := v.Args[0] 2379 if v_0.Op != Op386SHLLconst { 2380 break 2381 } 2382 if v_0.AuxInt != 1 { 2383 break 2384 } 2385 y := v_0.Args[0] 2386 x := v.Args[1] 2387 v.reset(Op386LEAL2) 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} x (SHLLconst [2] y)) 2395 // cond: 2396 // result: (LEAL4 [c] {s} x y) 2397 for { 2398 c := v.AuxInt 2399 s := v.Aux 2400 _ = v.Args[1] 2401 x := v.Args[0] 2402 v_1 := v.Args[1] 2403 if v_1.Op != Op386SHLLconst { 2404 break 2405 } 2406 if v_1.AuxInt != 2 { 2407 break 2408 } 2409 y := v_1.Args[0] 2410 v.reset(Op386LEAL4) 2411 v.AuxInt = c 2412 v.Aux = s 2413 v.AddArg(x) 2414 v.AddArg(y) 2415 return true 2416 } 2417 // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) 2418 // cond: 2419 // result: (LEAL4 [c] {s} x y) 2420 for { 2421 c := v.AuxInt 2422 s := v.Aux 2423 _ = v.Args[1] 2424 v_0 := v.Args[0] 2425 if v_0.Op != Op386SHLLconst { 2426 break 2427 } 2428 if v_0.AuxInt != 2 { 2429 break 2430 } 2431 y := v_0.Args[0] 2432 x := v.Args[1] 2433 v.reset(Op386LEAL4) 2434 v.AuxInt = c 2435 v.Aux = s 2436 v.AddArg(x) 2437 v.AddArg(y) 2438 return true 2439 } 2440 // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) 2441 // cond: 2442 // result: (LEAL8 [c] {s} x y) 2443 for { 2444 c := v.AuxInt 2445 s := v.Aux 2446 _ = v.Args[1] 2447 x := v.Args[0] 2448 v_1 := v.Args[1] 2449 if v_1.Op != Op386SHLLconst { 2450 break 2451 } 2452 if v_1.AuxInt != 3 { 2453 break 2454 } 2455 y := v_1.Args[0] 2456 v.reset(Op386LEAL8) 2457 v.AuxInt = c 2458 v.Aux = s 2459 v.AddArg(x) 2460 v.AddArg(y) 2461 return true 2462 } 2463 // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) 2464 // cond: 2465 // result: (LEAL8 [c] {s} x y) 2466 for { 2467 c := v.AuxInt 2468 s := v.Aux 2469 _ = v.Args[1] 2470 v_0 := v.Args[0] 2471 if v_0.Op != Op386SHLLconst { 2472 break 2473 } 2474 if v_0.AuxInt != 3 { 2475 break 2476 } 2477 y := v_0.Args[0] 2478 x := v.Args[1] 2479 v.reset(Op386LEAL8) 2480 v.AuxInt = c 2481 v.Aux = s 2482 v.AddArg(x) 2483 v.AddArg(y) 2484 return true 2485 } 2486 // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2487 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2488 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2489 for { 2490 off1 := v.AuxInt 2491 sym1 := v.Aux 2492 _ = v.Args[1] 2493 v_0 := v.Args[0] 2494 if v_0.Op != Op386LEAL { 2495 break 2496 } 2497 off2 := v_0.AuxInt 2498 sym2 := v_0.Aux 2499 x := v_0.Args[0] 2500 y := v.Args[1] 2501 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2502 break 2503 } 2504 v.reset(Op386LEAL1) 2505 v.AuxInt = off1 + off2 2506 v.Aux = mergeSym(sym1, sym2) 2507 v.AddArg(x) 2508 v.AddArg(y) 2509 return true 2510 } 2511 // match: (LEAL1 [off1] {sym1} y (LEAL [off2] {sym2} x)) 2512 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2513 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2514 for { 2515 off1 := v.AuxInt 2516 sym1 := v.Aux 2517 _ = v.Args[1] 2518 y := v.Args[0] 2519 v_1 := v.Args[1] 2520 if v_1.Op != Op386LEAL { 2521 break 2522 } 2523 off2 := v_1.AuxInt 2524 sym2 := v_1.Aux 2525 x := v_1.Args[0] 2526 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2527 break 2528 } 2529 v.reset(Op386LEAL1) 2530 v.AuxInt = off1 + off2 2531 v.Aux = mergeSym(sym1, sym2) 2532 v.AddArg(x) 2533 v.AddArg(y) 2534 return true 2535 } 2536 return false 2537 } 2538 func rewriteValue386_Op386LEAL2_0(v *Value) bool { 2539 // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) 2540 // cond: is32Bit(c+d) && x.Op != OpSB 2541 // result: (LEAL2 [c+d] {s} x y) 2542 for { 2543 c := v.AuxInt 2544 s := v.Aux 2545 _ = v.Args[1] 2546 v_0 := v.Args[0] 2547 if v_0.Op != Op386ADDLconst { 2548 break 2549 } 2550 d := v_0.AuxInt 2551 x := v_0.Args[0] 2552 y := v.Args[1] 2553 if !(is32Bit(c+d) && x.Op != OpSB) { 2554 break 2555 } 2556 v.reset(Op386LEAL2) 2557 v.AuxInt = c + d 2558 v.Aux = s 2559 v.AddArg(x) 2560 v.AddArg(y) 2561 return true 2562 } 2563 // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) 2564 // cond: is32Bit(c+2*d) && y.Op != OpSB 2565 // result: (LEAL2 [c+2*d] {s} x y) 2566 for { 2567 c := v.AuxInt 2568 s := v.Aux 2569 _ = v.Args[1] 2570 x := v.Args[0] 2571 v_1 := v.Args[1] 2572 if v_1.Op != Op386ADDLconst { 2573 break 2574 } 2575 d := v_1.AuxInt 2576 y := v_1.Args[0] 2577 if !(is32Bit(c+2*d) && y.Op != OpSB) { 2578 break 2579 } 2580 v.reset(Op386LEAL2) 2581 v.AuxInt = c + 2*d 2582 v.Aux = s 2583 v.AddArg(x) 2584 v.AddArg(y) 2585 return true 2586 } 2587 // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) 2588 // cond: 2589 // result: (LEAL4 [c] {s} x y) 2590 for { 2591 c := v.AuxInt 2592 s := v.Aux 2593 _ = v.Args[1] 2594 x := v.Args[0] 2595 v_1 := v.Args[1] 2596 if v_1.Op != Op386SHLLconst { 2597 break 2598 } 2599 if v_1.AuxInt != 1 { 2600 break 2601 } 2602 y := v_1.Args[0] 2603 v.reset(Op386LEAL4) 2604 v.AuxInt = c 2605 v.Aux = s 2606 v.AddArg(x) 2607 v.AddArg(y) 2608 return true 2609 } 2610 // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) 2611 // cond: 2612 // result: (LEAL8 [c] {s} x y) 2613 for { 2614 c := v.AuxInt 2615 s := v.Aux 2616 _ = v.Args[1] 2617 x := v.Args[0] 2618 v_1 := v.Args[1] 2619 if v_1.Op != Op386SHLLconst { 2620 break 2621 } 2622 if v_1.AuxInt != 2 { 2623 break 2624 } 2625 y := v_1.Args[0] 2626 v.reset(Op386LEAL8) 2627 v.AuxInt = c 2628 v.Aux = s 2629 v.AddArg(x) 2630 v.AddArg(y) 2631 return true 2632 } 2633 // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2634 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2635 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2636 for { 2637 off1 := v.AuxInt 2638 sym1 := v.Aux 2639 _ = v.Args[1] 2640 v_0 := v.Args[0] 2641 if v_0.Op != Op386LEAL { 2642 break 2643 } 2644 off2 := v_0.AuxInt 2645 sym2 := v_0.Aux 2646 x := v_0.Args[0] 2647 y := v.Args[1] 2648 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2649 break 2650 } 2651 v.reset(Op386LEAL2) 2652 v.AuxInt = off1 + off2 2653 v.Aux = mergeSym(sym1, sym2) 2654 v.AddArg(x) 2655 v.AddArg(y) 2656 return true 2657 } 2658 return false 2659 } 2660 func rewriteValue386_Op386LEAL4_0(v *Value) bool { 2661 // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) 2662 // cond: is32Bit(c+d) && x.Op != OpSB 2663 // result: (LEAL4 [c+d] {s} x y) 2664 for { 2665 c := v.AuxInt 2666 s := v.Aux 2667 _ = v.Args[1] 2668 v_0 := v.Args[0] 2669 if v_0.Op != Op386ADDLconst { 2670 break 2671 } 2672 d := v_0.AuxInt 2673 x := v_0.Args[0] 2674 y := v.Args[1] 2675 if !(is32Bit(c+d) && x.Op != OpSB) { 2676 break 2677 } 2678 v.reset(Op386LEAL4) 2679 v.AuxInt = c + d 2680 v.Aux = s 2681 v.AddArg(x) 2682 v.AddArg(y) 2683 return true 2684 } 2685 // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) 2686 // cond: is32Bit(c+4*d) && y.Op != OpSB 2687 // result: (LEAL4 [c+4*d] {s} x y) 2688 for { 2689 c := v.AuxInt 2690 s := v.Aux 2691 _ = v.Args[1] 2692 x := v.Args[0] 2693 v_1 := v.Args[1] 2694 if v_1.Op != Op386ADDLconst { 2695 break 2696 } 2697 d := v_1.AuxInt 2698 y := v_1.Args[0] 2699 if !(is32Bit(c+4*d) && y.Op != OpSB) { 2700 break 2701 } 2702 v.reset(Op386LEAL4) 2703 v.AuxInt = c + 4*d 2704 v.Aux = s 2705 v.AddArg(x) 2706 v.AddArg(y) 2707 return true 2708 } 2709 // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) 2710 // cond: 2711 // result: (LEAL8 [c] {s} x y) 2712 for { 2713 c := v.AuxInt 2714 s := v.Aux 2715 _ = v.Args[1] 2716 x := v.Args[0] 2717 v_1 := v.Args[1] 2718 if v_1.Op != Op386SHLLconst { 2719 break 2720 } 2721 if v_1.AuxInt != 1 { 2722 break 2723 } 2724 y := v_1.Args[0] 2725 v.reset(Op386LEAL8) 2726 v.AuxInt = c 2727 v.Aux = s 2728 v.AddArg(x) 2729 v.AddArg(y) 2730 return true 2731 } 2732 // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2733 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2734 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2735 for { 2736 off1 := v.AuxInt 2737 sym1 := v.Aux 2738 _ = v.Args[1] 2739 v_0 := v.Args[0] 2740 if v_0.Op != Op386LEAL { 2741 break 2742 } 2743 off2 := v_0.AuxInt 2744 sym2 := v_0.Aux 2745 x := v_0.Args[0] 2746 y := v.Args[1] 2747 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2748 break 2749 } 2750 v.reset(Op386LEAL4) 2751 v.AuxInt = off1 + off2 2752 v.Aux = mergeSym(sym1, sym2) 2753 v.AddArg(x) 2754 v.AddArg(y) 2755 return true 2756 } 2757 return false 2758 } 2759 func rewriteValue386_Op386LEAL8_0(v *Value) bool { 2760 // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) 2761 // cond: is32Bit(c+d) && x.Op != OpSB 2762 // result: (LEAL8 [c+d] {s} x y) 2763 for { 2764 c := v.AuxInt 2765 s := v.Aux 2766 _ = v.Args[1] 2767 v_0 := v.Args[0] 2768 if v_0.Op != Op386ADDLconst { 2769 break 2770 } 2771 d := v_0.AuxInt 2772 x := v_0.Args[0] 2773 y := v.Args[1] 2774 if !(is32Bit(c+d) && x.Op != OpSB) { 2775 break 2776 } 2777 v.reset(Op386LEAL8) 2778 v.AuxInt = c + d 2779 v.Aux = s 2780 v.AddArg(x) 2781 v.AddArg(y) 2782 return true 2783 } 2784 // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) 2785 // cond: is32Bit(c+8*d) && y.Op != OpSB 2786 // result: (LEAL8 [c+8*d] {s} x y) 2787 for { 2788 c := v.AuxInt 2789 s := v.Aux 2790 _ = v.Args[1] 2791 x := v.Args[0] 2792 v_1 := v.Args[1] 2793 if v_1.Op != Op386ADDLconst { 2794 break 2795 } 2796 d := v_1.AuxInt 2797 y := v_1.Args[0] 2798 if !(is32Bit(c+8*d) && y.Op != OpSB) { 2799 break 2800 } 2801 v.reset(Op386LEAL8) 2802 v.AuxInt = c + 8*d 2803 v.Aux = s 2804 v.AddArg(x) 2805 v.AddArg(y) 2806 return true 2807 } 2808 // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2809 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2810 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2811 for { 2812 off1 := v.AuxInt 2813 sym1 := v.Aux 2814 _ = v.Args[1] 2815 v_0 := v.Args[0] 2816 if v_0.Op != Op386LEAL { 2817 break 2818 } 2819 off2 := v_0.AuxInt 2820 sym2 := v_0.Aux 2821 x := v_0.Args[0] 2822 y := v.Args[1] 2823 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2824 break 2825 } 2826 v.reset(Op386LEAL8) 2827 v.AuxInt = off1 + off2 2828 v.Aux = mergeSym(sym1, sym2) 2829 v.AddArg(x) 2830 v.AddArg(y) 2831 return true 2832 } 2833 return false 2834 } 2835 func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { 2836 b := v.Block 2837 _ = b 2838 // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) 2839 // cond: x.Uses == 1 && clobber(x) 2840 // result: @x.Block (MOVBLSXload <v.Type> [off] {sym} ptr mem) 2841 for { 2842 x := v.Args[0] 2843 if x.Op != Op386MOVBload { 2844 break 2845 } 2846 off := x.AuxInt 2847 sym := x.Aux 2848 _ = x.Args[1] 2849 ptr := x.Args[0] 2850 mem := x.Args[1] 2851 if !(x.Uses == 1 && clobber(x)) { 2852 break 2853 } 2854 b = x.Block 2855 v0 := b.NewValue0(v.Pos, Op386MOVBLSXload, v.Type) 2856 v.reset(OpCopy) 2857 v.AddArg(v0) 2858 v0.AuxInt = off 2859 v0.Aux = sym 2860 v0.AddArg(ptr) 2861 v0.AddArg(mem) 2862 return true 2863 } 2864 // match: (MOVBLSX (ANDLconst [c] x)) 2865 // cond: c & 0x80 == 0 2866 // result: (ANDLconst [c & 0x7f] x) 2867 for { 2868 v_0 := v.Args[0] 2869 if v_0.Op != Op386ANDLconst { 2870 break 2871 } 2872 c := v_0.AuxInt 2873 x := v_0.Args[0] 2874 if !(c&0x80 == 0) { 2875 break 2876 } 2877 v.reset(Op386ANDLconst) 2878 v.AuxInt = c & 0x7f 2879 v.AddArg(x) 2880 return true 2881 } 2882 return false 2883 } 2884 func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { 2885 b := v.Block 2886 _ = b 2887 config := b.Func.Config 2888 _ = config 2889 // match: (MOVBLSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 2890 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 2891 // result: (MOVBLSX x) 2892 for { 2893 off := v.AuxInt 2894 sym := v.Aux 2895 _ = v.Args[1] 2896 ptr := v.Args[0] 2897 v_1 := v.Args[1] 2898 if v_1.Op != Op386MOVBstore { 2899 break 2900 } 2901 off2 := v_1.AuxInt 2902 sym2 := v_1.Aux 2903 _ = v_1.Args[2] 2904 ptr2 := v_1.Args[0] 2905 x := v_1.Args[1] 2906 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 2907 break 2908 } 2909 v.reset(Op386MOVBLSX) 2910 v.AddArg(x) 2911 return true 2912 } 2913 // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2914 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2915 // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2916 for { 2917 off1 := v.AuxInt 2918 sym1 := v.Aux 2919 _ = v.Args[1] 2920 v_0 := v.Args[0] 2921 if v_0.Op != Op386LEAL { 2922 break 2923 } 2924 off2 := v_0.AuxInt 2925 sym2 := v_0.Aux 2926 base := v_0.Args[0] 2927 mem := v.Args[1] 2928 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2929 break 2930 } 2931 v.reset(Op386MOVBLSXload) 2932 v.AuxInt = off1 + off2 2933 v.Aux = mergeSym(sym1, sym2) 2934 v.AddArg(base) 2935 v.AddArg(mem) 2936 return true 2937 } 2938 return false 2939 } 2940 func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { 2941 b := v.Block 2942 _ = b 2943 // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) 2944 // cond: x.Uses == 1 && clobber(x) 2945 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 2946 for { 2947 x := v.Args[0] 2948 if x.Op != Op386MOVBload { 2949 break 2950 } 2951 off := x.AuxInt 2952 sym := x.Aux 2953 _ = x.Args[1] 2954 ptr := x.Args[0] 2955 mem := x.Args[1] 2956 if !(x.Uses == 1 && clobber(x)) { 2957 break 2958 } 2959 b = x.Block 2960 v0 := b.NewValue0(v.Pos, Op386MOVBload, v.Type) 2961 v.reset(OpCopy) 2962 v.AddArg(v0) 2963 v0.AuxInt = off 2964 v0.Aux = sym 2965 v0.AddArg(ptr) 2966 v0.AddArg(mem) 2967 return true 2968 } 2969 // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) 2970 // cond: x.Uses == 1 && clobber(x) 2971 // result: @x.Block (MOVBloadidx1 <v.Type> [off] {sym} ptr idx mem) 2972 for { 2973 x := v.Args[0] 2974 if x.Op != Op386MOVBloadidx1 { 2975 break 2976 } 2977 off := x.AuxInt 2978 sym := x.Aux 2979 _ = x.Args[2] 2980 ptr := x.Args[0] 2981 idx := x.Args[1] 2982 mem := x.Args[2] 2983 if !(x.Uses == 1 && clobber(x)) { 2984 break 2985 } 2986 b = x.Block 2987 v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) 2988 v.reset(OpCopy) 2989 v.AddArg(v0) 2990 v0.AuxInt = off 2991 v0.Aux = sym 2992 v0.AddArg(ptr) 2993 v0.AddArg(idx) 2994 v0.AddArg(mem) 2995 return true 2996 } 2997 // match: (MOVBLZX (ANDLconst [c] x)) 2998 // cond: 2999 // result: (ANDLconst [c & 0xff] x) 3000 for { 3001 v_0 := v.Args[0] 3002 if v_0.Op != Op386ANDLconst { 3003 break 3004 } 3005 c := v_0.AuxInt 3006 x := v_0.Args[0] 3007 v.reset(Op386ANDLconst) 3008 v.AuxInt = c & 0xff 3009 v.AddArg(x) 3010 return true 3011 } 3012 return false 3013 } 3014 func rewriteValue386_Op386MOVBload_0(v *Value) bool { 3015 b := v.Block 3016 _ = b 3017 config := b.Func.Config 3018 _ = config 3019 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 3020 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3021 // result: (MOVBLZX x) 3022 for { 3023 off := v.AuxInt 3024 sym := v.Aux 3025 _ = v.Args[1] 3026 ptr := v.Args[0] 3027 v_1 := v.Args[1] 3028 if v_1.Op != Op386MOVBstore { 3029 break 3030 } 3031 off2 := v_1.AuxInt 3032 sym2 := v_1.Aux 3033 _ = v_1.Args[2] 3034 ptr2 := v_1.Args[0] 3035 x := v_1.Args[1] 3036 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3037 break 3038 } 3039 v.reset(Op386MOVBLZX) 3040 v.AddArg(x) 3041 return true 3042 } 3043 // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) 3044 // cond: is32Bit(off1+off2) 3045 // result: (MOVBload [off1+off2] {sym} ptr mem) 3046 for { 3047 off1 := v.AuxInt 3048 sym := v.Aux 3049 _ = v.Args[1] 3050 v_0 := v.Args[0] 3051 if v_0.Op != Op386ADDLconst { 3052 break 3053 } 3054 off2 := v_0.AuxInt 3055 ptr := v_0.Args[0] 3056 mem := v.Args[1] 3057 if !(is32Bit(off1 + off2)) { 3058 break 3059 } 3060 v.reset(Op386MOVBload) 3061 v.AuxInt = off1 + off2 3062 v.Aux = sym 3063 v.AddArg(ptr) 3064 v.AddArg(mem) 3065 return true 3066 } 3067 // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 3068 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3069 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 3070 for { 3071 off1 := v.AuxInt 3072 sym1 := v.Aux 3073 _ = v.Args[1] 3074 v_0 := v.Args[0] 3075 if v_0.Op != Op386LEAL { 3076 break 3077 } 3078 off2 := v_0.AuxInt 3079 sym2 := v_0.Aux 3080 base := v_0.Args[0] 3081 mem := v.Args[1] 3082 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3083 break 3084 } 3085 v.reset(Op386MOVBload) 3086 v.AuxInt = off1 + off2 3087 v.Aux = mergeSym(sym1, sym2) 3088 v.AddArg(base) 3089 v.AddArg(mem) 3090 return true 3091 } 3092 // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 3093 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3094 // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 3095 for { 3096 off1 := v.AuxInt 3097 sym1 := v.Aux 3098 _ = v.Args[1] 3099 v_0 := v.Args[0] 3100 if v_0.Op != Op386LEAL1 { 3101 break 3102 } 3103 off2 := v_0.AuxInt 3104 sym2 := v_0.Aux 3105 _ = v_0.Args[1] 3106 ptr := v_0.Args[0] 3107 idx := v_0.Args[1] 3108 mem := v.Args[1] 3109 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3110 break 3111 } 3112 v.reset(Op386MOVBloadidx1) 3113 v.AuxInt = off1 + off2 3114 v.Aux = mergeSym(sym1, sym2) 3115 v.AddArg(ptr) 3116 v.AddArg(idx) 3117 v.AddArg(mem) 3118 return true 3119 } 3120 // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) 3121 // cond: ptr.Op != OpSB 3122 // result: (MOVBloadidx1 [off] {sym} ptr idx mem) 3123 for { 3124 off := v.AuxInt 3125 sym := v.Aux 3126 _ = v.Args[1] 3127 v_0 := v.Args[0] 3128 if v_0.Op != Op386ADDL { 3129 break 3130 } 3131 _ = v_0.Args[1] 3132 ptr := v_0.Args[0] 3133 idx := v_0.Args[1] 3134 mem := v.Args[1] 3135 if !(ptr.Op != OpSB) { 3136 break 3137 } 3138 v.reset(Op386MOVBloadidx1) 3139 v.AuxInt = off 3140 v.Aux = sym 3141 v.AddArg(ptr) 3142 v.AddArg(idx) 3143 v.AddArg(mem) 3144 return true 3145 } 3146 return false 3147 } 3148 func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { 3149 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 3150 // cond: 3151 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3152 for { 3153 c := v.AuxInt 3154 sym := v.Aux 3155 _ = v.Args[2] 3156 v_0 := v.Args[0] 3157 if v_0.Op != Op386ADDLconst { 3158 break 3159 } 3160 d := v_0.AuxInt 3161 ptr := v_0.Args[0] 3162 idx := v.Args[1] 3163 mem := v.Args[2] 3164 v.reset(Op386MOVBloadidx1) 3165 v.AuxInt = int64(int32(c + d)) 3166 v.Aux = sym 3167 v.AddArg(ptr) 3168 v.AddArg(idx) 3169 v.AddArg(mem) 3170 return true 3171 } 3172 // match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 3173 // cond: 3174 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3175 for { 3176 c := v.AuxInt 3177 sym := v.Aux 3178 _ = v.Args[2] 3179 idx := v.Args[0] 3180 v_1 := v.Args[1] 3181 if v_1.Op != Op386ADDLconst { 3182 break 3183 } 3184 d := v_1.AuxInt 3185 ptr := v_1.Args[0] 3186 mem := v.Args[2] 3187 v.reset(Op386MOVBloadidx1) 3188 v.AuxInt = int64(int32(c + d)) 3189 v.Aux = sym 3190 v.AddArg(ptr) 3191 v.AddArg(idx) 3192 v.AddArg(mem) 3193 return true 3194 } 3195 // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 3196 // cond: 3197 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3198 for { 3199 c := v.AuxInt 3200 sym := v.Aux 3201 _ = v.Args[2] 3202 ptr := v.Args[0] 3203 v_1 := v.Args[1] 3204 if v_1.Op != Op386ADDLconst { 3205 break 3206 } 3207 d := v_1.AuxInt 3208 idx := v_1.Args[0] 3209 mem := v.Args[2] 3210 v.reset(Op386MOVBloadidx1) 3211 v.AuxInt = int64(int32(c + d)) 3212 v.Aux = sym 3213 v.AddArg(ptr) 3214 v.AddArg(idx) 3215 v.AddArg(mem) 3216 return true 3217 } 3218 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 3219 // cond: 3220 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3221 for { 3222 c := v.AuxInt 3223 sym := v.Aux 3224 _ = v.Args[2] 3225 v_0 := v.Args[0] 3226 if v_0.Op != Op386ADDLconst { 3227 break 3228 } 3229 d := v_0.AuxInt 3230 idx := v_0.Args[0] 3231 ptr := v.Args[1] 3232 mem := v.Args[2] 3233 v.reset(Op386MOVBloadidx1) 3234 v.AuxInt = int64(int32(c + d)) 3235 v.Aux = sym 3236 v.AddArg(ptr) 3237 v.AddArg(idx) 3238 v.AddArg(mem) 3239 return true 3240 } 3241 return false 3242 } 3243 func rewriteValue386_Op386MOVBstore_0(v *Value) bool { 3244 b := v.Block 3245 _ = b 3246 config := b.Func.Config 3247 _ = config 3248 // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) 3249 // cond: 3250 // result: (MOVBstore [off] {sym} ptr x mem) 3251 for { 3252 off := v.AuxInt 3253 sym := v.Aux 3254 _ = v.Args[2] 3255 ptr := v.Args[0] 3256 v_1 := v.Args[1] 3257 if v_1.Op != Op386MOVBLSX { 3258 break 3259 } 3260 x := v_1.Args[0] 3261 mem := v.Args[2] 3262 v.reset(Op386MOVBstore) 3263 v.AuxInt = off 3264 v.Aux = sym 3265 v.AddArg(ptr) 3266 v.AddArg(x) 3267 v.AddArg(mem) 3268 return true 3269 } 3270 // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) 3271 // cond: 3272 // result: (MOVBstore [off] {sym} ptr x mem) 3273 for { 3274 off := v.AuxInt 3275 sym := v.Aux 3276 _ = v.Args[2] 3277 ptr := v.Args[0] 3278 v_1 := v.Args[1] 3279 if v_1.Op != Op386MOVBLZX { 3280 break 3281 } 3282 x := v_1.Args[0] 3283 mem := v.Args[2] 3284 v.reset(Op386MOVBstore) 3285 v.AuxInt = off 3286 v.Aux = sym 3287 v.AddArg(ptr) 3288 v.AddArg(x) 3289 v.AddArg(mem) 3290 return true 3291 } 3292 // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 3293 // cond: is32Bit(off1+off2) 3294 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3295 for { 3296 off1 := v.AuxInt 3297 sym := v.Aux 3298 _ = v.Args[2] 3299 v_0 := v.Args[0] 3300 if v_0.Op != Op386ADDLconst { 3301 break 3302 } 3303 off2 := v_0.AuxInt 3304 ptr := v_0.Args[0] 3305 val := v.Args[1] 3306 mem := v.Args[2] 3307 if !(is32Bit(off1 + off2)) { 3308 break 3309 } 3310 v.reset(Op386MOVBstore) 3311 v.AuxInt = off1 + off2 3312 v.Aux = sym 3313 v.AddArg(ptr) 3314 v.AddArg(val) 3315 v.AddArg(mem) 3316 return true 3317 } 3318 // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) 3319 // cond: validOff(off) 3320 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 3321 for { 3322 off := v.AuxInt 3323 sym := v.Aux 3324 _ = v.Args[2] 3325 ptr := v.Args[0] 3326 v_1 := v.Args[1] 3327 if v_1.Op != Op386MOVLconst { 3328 break 3329 } 3330 c := v_1.AuxInt 3331 mem := v.Args[2] 3332 if !(validOff(off)) { 3333 break 3334 } 3335 v.reset(Op386MOVBstoreconst) 3336 v.AuxInt = makeValAndOff(int64(int8(c)), off) 3337 v.Aux = sym 3338 v.AddArg(ptr) 3339 v.AddArg(mem) 3340 return true 3341 } 3342 // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 3343 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3344 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 3345 for { 3346 off1 := v.AuxInt 3347 sym1 := v.Aux 3348 _ = v.Args[2] 3349 v_0 := v.Args[0] 3350 if v_0.Op != Op386LEAL { 3351 break 3352 } 3353 off2 := v_0.AuxInt 3354 sym2 := v_0.Aux 3355 base := v_0.Args[0] 3356 val := v.Args[1] 3357 mem := v.Args[2] 3358 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3359 break 3360 } 3361 v.reset(Op386MOVBstore) 3362 v.AuxInt = off1 + off2 3363 v.Aux = mergeSym(sym1, sym2) 3364 v.AddArg(base) 3365 v.AddArg(val) 3366 v.AddArg(mem) 3367 return true 3368 } 3369 // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 3370 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3371 // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3372 for { 3373 off1 := v.AuxInt 3374 sym1 := v.Aux 3375 _ = v.Args[2] 3376 v_0 := v.Args[0] 3377 if v_0.Op != Op386LEAL1 { 3378 break 3379 } 3380 off2 := v_0.AuxInt 3381 sym2 := v_0.Aux 3382 _ = v_0.Args[1] 3383 ptr := v_0.Args[0] 3384 idx := v_0.Args[1] 3385 val := v.Args[1] 3386 mem := v.Args[2] 3387 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3388 break 3389 } 3390 v.reset(Op386MOVBstoreidx1) 3391 v.AuxInt = off1 + off2 3392 v.Aux = mergeSym(sym1, sym2) 3393 v.AddArg(ptr) 3394 v.AddArg(idx) 3395 v.AddArg(val) 3396 v.AddArg(mem) 3397 return true 3398 } 3399 // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) 3400 // cond: ptr.Op != OpSB 3401 // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) 3402 for { 3403 off := v.AuxInt 3404 sym := v.Aux 3405 _ = v.Args[2] 3406 v_0 := v.Args[0] 3407 if v_0.Op != Op386ADDL { 3408 break 3409 } 3410 _ = v_0.Args[1] 3411 ptr := v_0.Args[0] 3412 idx := v_0.Args[1] 3413 val := v.Args[1] 3414 mem := v.Args[2] 3415 if !(ptr.Op != OpSB) { 3416 break 3417 } 3418 v.reset(Op386MOVBstoreidx1) 3419 v.AuxInt = off 3420 v.Aux = sym 3421 v.AddArg(ptr) 3422 v.AddArg(idx) 3423 v.AddArg(val) 3424 v.AddArg(mem) 3425 return true 3426 } 3427 // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 3428 // cond: x.Uses == 1 && clobber(x) 3429 // result: (MOVWstore [i-1] {s} p w mem) 3430 for { 3431 i := v.AuxInt 3432 s := v.Aux 3433 _ = v.Args[2] 3434 p := v.Args[0] 3435 v_1 := v.Args[1] 3436 if v_1.Op != Op386SHRLconst { 3437 break 3438 } 3439 if v_1.AuxInt != 8 { 3440 break 3441 } 3442 w := v_1.Args[0] 3443 x := v.Args[2] 3444 if x.Op != Op386MOVBstore { 3445 break 3446 } 3447 if x.AuxInt != i-1 { 3448 break 3449 } 3450 if x.Aux != s { 3451 break 3452 } 3453 _ = x.Args[2] 3454 if p != x.Args[0] { 3455 break 3456 } 3457 if w != x.Args[1] { 3458 break 3459 } 3460 mem := x.Args[2] 3461 if !(x.Uses == 1 && clobber(x)) { 3462 break 3463 } 3464 v.reset(Op386MOVWstore) 3465 v.AuxInt = i - 1 3466 v.Aux = s 3467 v.AddArg(p) 3468 v.AddArg(w) 3469 v.AddArg(mem) 3470 return true 3471 } 3472 // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) 3473 // cond: x.Uses == 1 && clobber(x) 3474 // result: (MOVWstore [i-1] {s} p w0 mem) 3475 for { 3476 i := v.AuxInt 3477 s := v.Aux 3478 _ = v.Args[2] 3479 p := v.Args[0] 3480 v_1 := v.Args[1] 3481 if v_1.Op != Op386SHRLconst { 3482 break 3483 } 3484 j := v_1.AuxInt 3485 w := v_1.Args[0] 3486 x := v.Args[2] 3487 if x.Op != Op386MOVBstore { 3488 break 3489 } 3490 if x.AuxInt != i-1 { 3491 break 3492 } 3493 if x.Aux != s { 3494 break 3495 } 3496 _ = x.Args[2] 3497 if p != x.Args[0] { 3498 break 3499 } 3500 w0 := x.Args[1] 3501 if w0.Op != Op386SHRLconst { 3502 break 3503 } 3504 if w0.AuxInt != j-8 { 3505 break 3506 } 3507 if w != w0.Args[0] { 3508 break 3509 } 3510 mem := x.Args[2] 3511 if !(x.Uses == 1 && clobber(x)) { 3512 break 3513 } 3514 v.reset(Op386MOVWstore) 3515 v.AuxInt = i - 1 3516 v.Aux = s 3517 v.AddArg(p) 3518 v.AddArg(w0) 3519 v.AddArg(mem) 3520 return true 3521 } 3522 return false 3523 } 3524 func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { 3525 b := v.Block 3526 _ = b 3527 config := b.Func.Config 3528 _ = config 3529 // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 3530 // cond: ValAndOff(sc).canAdd(off) 3531 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 3532 for { 3533 sc := v.AuxInt 3534 s := v.Aux 3535 _ = v.Args[1] 3536 v_0 := v.Args[0] 3537 if v_0.Op != Op386ADDLconst { 3538 break 3539 } 3540 off := v_0.AuxInt 3541 ptr := v_0.Args[0] 3542 mem := v.Args[1] 3543 if !(ValAndOff(sc).canAdd(off)) { 3544 break 3545 } 3546 v.reset(Op386MOVBstoreconst) 3547 v.AuxInt = ValAndOff(sc).add(off) 3548 v.Aux = s 3549 v.AddArg(ptr) 3550 v.AddArg(mem) 3551 return true 3552 } 3553 // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 3554 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 3555 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 3556 for { 3557 sc := v.AuxInt 3558 sym1 := v.Aux 3559 _ = v.Args[1] 3560 v_0 := v.Args[0] 3561 if v_0.Op != Op386LEAL { 3562 break 3563 } 3564 off := v_0.AuxInt 3565 sym2 := v_0.Aux 3566 ptr := v_0.Args[0] 3567 mem := v.Args[1] 3568 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 3569 break 3570 } 3571 v.reset(Op386MOVBstoreconst) 3572 v.AuxInt = ValAndOff(sc).add(off) 3573 v.Aux = mergeSym(sym1, sym2) 3574 v.AddArg(ptr) 3575 v.AddArg(mem) 3576 return true 3577 } 3578 // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 3579 // cond: canMergeSym(sym1, sym2) 3580 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 3581 for { 3582 x := v.AuxInt 3583 sym1 := v.Aux 3584 _ = v.Args[1] 3585 v_0 := v.Args[0] 3586 if v_0.Op != Op386LEAL1 { 3587 break 3588 } 3589 off := v_0.AuxInt 3590 sym2 := v_0.Aux 3591 _ = v_0.Args[1] 3592 ptr := v_0.Args[0] 3593 idx := v_0.Args[1] 3594 mem := v.Args[1] 3595 if !(canMergeSym(sym1, sym2)) { 3596 break 3597 } 3598 v.reset(Op386MOVBstoreconstidx1) 3599 v.AuxInt = ValAndOff(x).add(off) 3600 v.Aux = mergeSym(sym1, sym2) 3601 v.AddArg(ptr) 3602 v.AddArg(idx) 3603 v.AddArg(mem) 3604 return true 3605 } 3606 // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) 3607 // cond: 3608 // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) 3609 for { 3610 x := v.AuxInt 3611 sym := v.Aux 3612 _ = v.Args[1] 3613 v_0 := v.Args[0] 3614 if v_0.Op != Op386ADDL { 3615 break 3616 } 3617 _ = v_0.Args[1] 3618 ptr := v_0.Args[0] 3619 idx := v_0.Args[1] 3620 mem := v.Args[1] 3621 v.reset(Op386MOVBstoreconstidx1) 3622 v.AuxInt = x 3623 v.Aux = sym 3624 v.AddArg(ptr) 3625 v.AddArg(idx) 3626 v.AddArg(mem) 3627 return true 3628 } 3629 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 3630 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3631 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 3632 for { 3633 c := v.AuxInt 3634 s := v.Aux 3635 _ = v.Args[1] 3636 p := v.Args[0] 3637 x := v.Args[1] 3638 if x.Op != Op386MOVBstoreconst { 3639 break 3640 } 3641 a := x.AuxInt 3642 if x.Aux != s { 3643 break 3644 } 3645 _ = x.Args[1] 3646 if p != x.Args[0] { 3647 break 3648 } 3649 mem := x.Args[1] 3650 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3651 break 3652 } 3653 v.reset(Op386MOVWstoreconst) 3654 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3655 v.Aux = s 3656 v.AddArg(p) 3657 v.AddArg(mem) 3658 return true 3659 } 3660 return false 3661 } 3662 func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { 3663 // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 3664 // cond: 3665 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3666 for { 3667 x := v.AuxInt 3668 sym := v.Aux 3669 _ = v.Args[2] 3670 v_0 := v.Args[0] 3671 if v_0.Op != Op386ADDLconst { 3672 break 3673 } 3674 c := v_0.AuxInt 3675 ptr := v_0.Args[0] 3676 idx := v.Args[1] 3677 mem := v.Args[2] 3678 v.reset(Op386MOVBstoreconstidx1) 3679 v.AuxInt = ValAndOff(x).add(c) 3680 v.Aux = sym 3681 v.AddArg(ptr) 3682 v.AddArg(idx) 3683 v.AddArg(mem) 3684 return true 3685 } 3686 // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 3687 // cond: 3688 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3689 for { 3690 x := v.AuxInt 3691 sym := v.Aux 3692 _ = v.Args[2] 3693 ptr := v.Args[0] 3694 v_1 := v.Args[1] 3695 if v_1.Op != Op386ADDLconst { 3696 break 3697 } 3698 c := v_1.AuxInt 3699 idx := v_1.Args[0] 3700 mem := v.Args[2] 3701 v.reset(Op386MOVBstoreconstidx1) 3702 v.AuxInt = ValAndOff(x).add(c) 3703 v.Aux = sym 3704 v.AddArg(ptr) 3705 v.AddArg(idx) 3706 v.AddArg(mem) 3707 return true 3708 } 3709 // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) 3710 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3711 // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) 3712 for { 3713 c := v.AuxInt 3714 s := v.Aux 3715 _ = v.Args[2] 3716 p := v.Args[0] 3717 i := v.Args[1] 3718 x := v.Args[2] 3719 if x.Op != Op386MOVBstoreconstidx1 { 3720 break 3721 } 3722 a := x.AuxInt 3723 if x.Aux != s { 3724 break 3725 } 3726 _ = x.Args[2] 3727 if p != x.Args[0] { 3728 break 3729 } 3730 if i != x.Args[1] { 3731 break 3732 } 3733 mem := x.Args[2] 3734 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3735 break 3736 } 3737 v.reset(Op386MOVWstoreconstidx1) 3738 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3739 v.Aux = s 3740 v.AddArg(p) 3741 v.AddArg(i) 3742 v.AddArg(mem) 3743 return true 3744 } 3745 return false 3746 } 3747 func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { 3748 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 3749 // cond: 3750 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3751 for { 3752 c := v.AuxInt 3753 sym := v.Aux 3754 _ = v.Args[3] 3755 v_0 := v.Args[0] 3756 if v_0.Op != Op386ADDLconst { 3757 break 3758 } 3759 d := v_0.AuxInt 3760 ptr := v_0.Args[0] 3761 idx := v.Args[1] 3762 val := v.Args[2] 3763 mem := v.Args[3] 3764 v.reset(Op386MOVBstoreidx1) 3765 v.AuxInt = int64(int32(c + d)) 3766 v.Aux = sym 3767 v.AddArg(ptr) 3768 v.AddArg(idx) 3769 v.AddArg(val) 3770 v.AddArg(mem) 3771 return true 3772 } 3773 // match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 3774 // cond: 3775 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3776 for { 3777 c := v.AuxInt 3778 sym := v.Aux 3779 _ = v.Args[3] 3780 idx := v.Args[0] 3781 v_1 := v.Args[1] 3782 if v_1.Op != Op386ADDLconst { 3783 break 3784 } 3785 d := v_1.AuxInt 3786 ptr := v_1.Args[0] 3787 val := v.Args[2] 3788 mem := v.Args[3] 3789 v.reset(Op386MOVBstoreidx1) 3790 v.AuxInt = int64(int32(c + d)) 3791 v.Aux = sym 3792 v.AddArg(ptr) 3793 v.AddArg(idx) 3794 v.AddArg(val) 3795 v.AddArg(mem) 3796 return true 3797 } 3798 // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 3799 // cond: 3800 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3801 for { 3802 c := v.AuxInt 3803 sym := v.Aux 3804 _ = v.Args[3] 3805 ptr := v.Args[0] 3806 v_1 := v.Args[1] 3807 if v_1.Op != Op386ADDLconst { 3808 break 3809 } 3810 d := v_1.AuxInt 3811 idx := v_1.Args[0] 3812 val := v.Args[2] 3813 mem := v.Args[3] 3814 v.reset(Op386MOVBstoreidx1) 3815 v.AuxInt = int64(int32(c + d)) 3816 v.Aux = sym 3817 v.AddArg(ptr) 3818 v.AddArg(idx) 3819 v.AddArg(val) 3820 v.AddArg(mem) 3821 return true 3822 } 3823 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 3824 // cond: 3825 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3826 for { 3827 c := v.AuxInt 3828 sym := v.Aux 3829 _ = v.Args[3] 3830 v_0 := v.Args[0] 3831 if v_0.Op != Op386ADDLconst { 3832 break 3833 } 3834 d := v_0.AuxInt 3835 idx := v_0.Args[0] 3836 ptr := v.Args[1] 3837 val := v.Args[2] 3838 mem := v.Args[3] 3839 v.reset(Op386MOVBstoreidx1) 3840 v.AuxInt = int64(int32(c + d)) 3841 v.Aux = sym 3842 v.AddArg(ptr) 3843 v.AddArg(idx) 3844 v.AddArg(val) 3845 v.AddArg(mem) 3846 return true 3847 } 3848 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3849 // cond: x.Uses == 1 && clobber(x) 3850 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3851 for { 3852 i := v.AuxInt 3853 s := v.Aux 3854 _ = v.Args[3] 3855 p := v.Args[0] 3856 idx := v.Args[1] 3857 v_2 := v.Args[2] 3858 if v_2.Op != Op386SHRLconst { 3859 break 3860 } 3861 if v_2.AuxInt != 8 { 3862 break 3863 } 3864 w := v_2.Args[0] 3865 x := v.Args[3] 3866 if x.Op != Op386MOVBstoreidx1 { 3867 break 3868 } 3869 if x.AuxInt != i-1 { 3870 break 3871 } 3872 if x.Aux != s { 3873 break 3874 } 3875 _ = x.Args[3] 3876 if p != x.Args[0] { 3877 break 3878 } 3879 if idx != x.Args[1] { 3880 break 3881 } 3882 if w != x.Args[2] { 3883 break 3884 } 3885 mem := x.Args[3] 3886 if !(x.Uses == 1 && clobber(x)) { 3887 break 3888 } 3889 v.reset(Op386MOVWstoreidx1) 3890 v.AuxInt = i - 1 3891 v.Aux = s 3892 v.AddArg(p) 3893 v.AddArg(idx) 3894 v.AddArg(w) 3895 v.AddArg(mem) 3896 return true 3897 } 3898 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3899 // cond: x.Uses == 1 && clobber(x) 3900 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3901 for { 3902 i := v.AuxInt 3903 s := v.Aux 3904 _ = v.Args[3] 3905 p := v.Args[0] 3906 idx := v.Args[1] 3907 v_2 := v.Args[2] 3908 if v_2.Op != Op386SHRLconst { 3909 break 3910 } 3911 if v_2.AuxInt != 8 { 3912 break 3913 } 3914 w := v_2.Args[0] 3915 x := v.Args[3] 3916 if x.Op != Op386MOVBstoreidx1 { 3917 break 3918 } 3919 if x.AuxInt != i-1 { 3920 break 3921 } 3922 if x.Aux != s { 3923 break 3924 } 3925 _ = x.Args[3] 3926 if idx != x.Args[0] { 3927 break 3928 } 3929 if p != x.Args[1] { 3930 break 3931 } 3932 if w != x.Args[2] { 3933 break 3934 } 3935 mem := x.Args[3] 3936 if !(x.Uses == 1 && clobber(x)) { 3937 break 3938 } 3939 v.reset(Op386MOVWstoreidx1) 3940 v.AuxInt = i - 1 3941 v.Aux = s 3942 v.AddArg(p) 3943 v.AddArg(idx) 3944 v.AddArg(w) 3945 v.AddArg(mem) 3946 return true 3947 } 3948 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3949 // cond: x.Uses == 1 && clobber(x) 3950 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3951 for { 3952 i := v.AuxInt 3953 s := v.Aux 3954 _ = v.Args[3] 3955 idx := v.Args[0] 3956 p := v.Args[1] 3957 v_2 := v.Args[2] 3958 if v_2.Op != Op386SHRLconst { 3959 break 3960 } 3961 if v_2.AuxInt != 8 { 3962 break 3963 } 3964 w := v_2.Args[0] 3965 x := v.Args[3] 3966 if x.Op != Op386MOVBstoreidx1 { 3967 break 3968 } 3969 if x.AuxInt != i-1 { 3970 break 3971 } 3972 if x.Aux != s { 3973 break 3974 } 3975 _ = x.Args[3] 3976 if p != x.Args[0] { 3977 break 3978 } 3979 if idx != x.Args[1] { 3980 break 3981 } 3982 if w != x.Args[2] { 3983 break 3984 } 3985 mem := x.Args[3] 3986 if !(x.Uses == 1 && clobber(x)) { 3987 break 3988 } 3989 v.reset(Op386MOVWstoreidx1) 3990 v.AuxInt = i - 1 3991 v.Aux = s 3992 v.AddArg(p) 3993 v.AddArg(idx) 3994 v.AddArg(w) 3995 v.AddArg(mem) 3996 return true 3997 } 3998 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3999 // cond: x.Uses == 1 && clobber(x) 4000 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 4001 for { 4002 i := v.AuxInt 4003 s := v.Aux 4004 _ = v.Args[3] 4005 idx := v.Args[0] 4006 p := v.Args[1] 4007 v_2 := v.Args[2] 4008 if v_2.Op != Op386SHRLconst { 4009 break 4010 } 4011 if v_2.AuxInt != 8 { 4012 break 4013 } 4014 w := v_2.Args[0] 4015 x := v.Args[3] 4016 if x.Op != Op386MOVBstoreidx1 { 4017 break 4018 } 4019 if x.AuxInt != i-1 { 4020 break 4021 } 4022 if x.Aux != s { 4023 break 4024 } 4025 _ = x.Args[3] 4026 if idx != x.Args[0] { 4027 break 4028 } 4029 if p != x.Args[1] { 4030 break 4031 } 4032 if w != x.Args[2] { 4033 break 4034 } 4035 mem := x.Args[3] 4036 if !(x.Uses == 1 && clobber(x)) { 4037 break 4038 } 4039 v.reset(Op386MOVWstoreidx1) 4040 v.AuxInt = i - 1 4041 v.Aux = s 4042 v.AddArg(p) 4043 v.AddArg(idx) 4044 v.AddArg(w) 4045 v.AddArg(mem) 4046 return true 4047 } 4048 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 4049 // cond: x.Uses == 1 && clobber(x) 4050 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4051 for { 4052 i := v.AuxInt 4053 s := v.Aux 4054 _ = v.Args[3] 4055 p := v.Args[0] 4056 idx := v.Args[1] 4057 v_2 := v.Args[2] 4058 if v_2.Op != Op386SHRLconst { 4059 break 4060 } 4061 j := v_2.AuxInt 4062 w := v_2.Args[0] 4063 x := v.Args[3] 4064 if x.Op != Op386MOVBstoreidx1 { 4065 break 4066 } 4067 if x.AuxInt != i-1 { 4068 break 4069 } 4070 if x.Aux != s { 4071 break 4072 } 4073 _ = x.Args[3] 4074 if p != x.Args[0] { 4075 break 4076 } 4077 if idx != 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 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 4104 // cond: x.Uses == 1 && clobber(x) 4105 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4106 for { 4107 i := v.AuxInt 4108 s := v.Aux 4109 _ = v.Args[3] 4110 p := v.Args[0] 4111 idx := v.Args[1] 4112 v_2 := v.Args[2] 4113 if v_2.Op != Op386SHRLconst { 4114 break 4115 } 4116 j := v_2.AuxInt 4117 w := v_2.Args[0] 4118 x := v.Args[3] 4119 if x.Op != Op386MOVBstoreidx1 { 4120 break 4121 } 4122 if x.AuxInt != i-1 { 4123 break 4124 } 4125 if x.Aux != s { 4126 break 4127 } 4128 _ = x.Args[3] 4129 if idx != x.Args[0] { 4130 break 4131 } 4132 if p != x.Args[1] { 4133 break 4134 } 4135 w0 := x.Args[2] 4136 if w0.Op != Op386SHRLconst { 4137 break 4138 } 4139 if w0.AuxInt != j-8 { 4140 break 4141 } 4142 if w != w0.Args[0] { 4143 break 4144 } 4145 mem := x.Args[3] 4146 if !(x.Uses == 1 && clobber(x)) { 4147 break 4148 } 4149 v.reset(Op386MOVWstoreidx1) 4150 v.AuxInt = i - 1 4151 v.Aux = s 4152 v.AddArg(p) 4153 v.AddArg(idx) 4154 v.AddArg(w0) 4155 v.AddArg(mem) 4156 return true 4157 } 4158 return false 4159 } 4160 func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { 4161 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 4162 // cond: x.Uses == 1 && clobber(x) 4163 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4164 for { 4165 i := v.AuxInt 4166 s := v.Aux 4167 _ = v.Args[3] 4168 idx := v.Args[0] 4169 p := v.Args[1] 4170 v_2 := v.Args[2] 4171 if v_2.Op != Op386SHRLconst { 4172 break 4173 } 4174 j := v_2.AuxInt 4175 w := v_2.Args[0] 4176 x := v.Args[3] 4177 if x.Op != Op386MOVBstoreidx1 { 4178 break 4179 } 4180 if x.AuxInt != i-1 { 4181 break 4182 } 4183 if x.Aux != s { 4184 break 4185 } 4186 _ = x.Args[3] 4187 if p != x.Args[0] { 4188 break 4189 } 4190 if idx != x.Args[1] { 4191 break 4192 } 4193 w0 := x.Args[2] 4194 if w0.Op != Op386SHRLconst { 4195 break 4196 } 4197 if w0.AuxInt != j-8 { 4198 break 4199 } 4200 if w != w0.Args[0] { 4201 break 4202 } 4203 mem := x.Args[3] 4204 if !(x.Uses == 1 && clobber(x)) { 4205 break 4206 } 4207 v.reset(Op386MOVWstoreidx1) 4208 v.AuxInt = i - 1 4209 v.Aux = s 4210 v.AddArg(p) 4211 v.AddArg(idx) 4212 v.AddArg(w0) 4213 v.AddArg(mem) 4214 return true 4215 } 4216 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 4217 // cond: x.Uses == 1 && clobber(x) 4218 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4219 for { 4220 i := v.AuxInt 4221 s := v.Aux 4222 _ = v.Args[3] 4223 idx := v.Args[0] 4224 p := v.Args[1] 4225 v_2 := v.Args[2] 4226 if v_2.Op != Op386SHRLconst { 4227 break 4228 } 4229 j := v_2.AuxInt 4230 w := v_2.Args[0] 4231 x := v.Args[3] 4232 if x.Op != Op386MOVBstoreidx1 { 4233 break 4234 } 4235 if x.AuxInt != i-1 { 4236 break 4237 } 4238 if x.Aux != s { 4239 break 4240 } 4241 _ = x.Args[3] 4242 if idx != x.Args[0] { 4243 break 4244 } 4245 if p != x.Args[1] { 4246 break 4247 } 4248 w0 := x.Args[2] 4249 if w0.Op != Op386SHRLconst { 4250 break 4251 } 4252 if w0.AuxInt != j-8 { 4253 break 4254 } 4255 if w != w0.Args[0] { 4256 break 4257 } 4258 mem := x.Args[3] 4259 if !(x.Uses == 1 && clobber(x)) { 4260 break 4261 } 4262 v.reset(Op386MOVWstoreidx1) 4263 v.AuxInt = i - 1 4264 v.Aux = s 4265 v.AddArg(p) 4266 v.AddArg(idx) 4267 v.AddArg(w0) 4268 v.AddArg(mem) 4269 return true 4270 } 4271 return false 4272 } 4273 func rewriteValue386_Op386MOVLload_0(v *Value) bool { 4274 b := v.Block 4275 _ = b 4276 config := b.Func.Config 4277 _ = config 4278 // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) 4279 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4280 // result: x 4281 for { 4282 off := v.AuxInt 4283 sym := v.Aux 4284 _ = v.Args[1] 4285 ptr := v.Args[0] 4286 v_1 := v.Args[1] 4287 if v_1.Op != Op386MOVLstore { 4288 break 4289 } 4290 off2 := v_1.AuxInt 4291 sym2 := v_1.Aux 4292 _ = v_1.Args[2] 4293 ptr2 := v_1.Args[0] 4294 x := v_1.Args[1] 4295 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4296 break 4297 } 4298 v.reset(OpCopy) 4299 v.Type = x.Type 4300 v.AddArg(x) 4301 return true 4302 } 4303 // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) 4304 // cond: is32Bit(off1+off2) 4305 // result: (MOVLload [off1+off2] {sym} ptr mem) 4306 for { 4307 off1 := v.AuxInt 4308 sym := v.Aux 4309 _ = v.Args[1] 4310 v_0 := v.Args[0] 4311 if v_0.Op != Op386ADDLconst { 4312 break 4313 } 4314 off2 := v_0.AuxInt 4315 ptr := v_0.Args[0] 4316 mem := v.Args[1] 4317 if !(is32Bit(off1 + off2)) { 4318 break 4319 } 4320 v.reset(Op386MOVLload) 4321 v.AuxInt = off1 + off2 4322 v.Aux = sym 4323 v.AddArg(ptr) 4324 v.AddArg(mem) 4325 return true 4326 } 4327 // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 4328 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4329 // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) 4330 for { 4331 off1 := v.AuxInt 4332 sym1 := v.Aux 4333 _ = v.Args[1] 4334 v_0 := v.Args[0] 4335 if v_0.Op != Op386LEAL { 4336 break 4337 } 4338 off2 := v_0.AuxInt 4339 sym2 := v_0.Aux 4340 base := v_0.Args[0] 4341 mem := v.Args[1] 4342 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4343 break 4344 } 4345 v.reset(Op386MOVLload) 4346 v.AuxInt = off1 + off2 4347 v.Aux = mergeSym(sym1, sym2) 4348 v.AddArg(base) 4349 v.AddArg(mem) 4350 return true 4351 } 4352 // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 4353 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4354 // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4355 for { 4356 off1 := v.AuxInt 4357 sym1 := v.Aux 4358 _ = v.Args[1] 4359 v_0 := v.Args[0] 4360 if v_0.Op != Op386LEAL1 { 4361 break 4362 } 4363 off2 := v_0.AuxInt 4364 sym2 := v_0.Aux 4365 _ = v_0.Args[1] 4366 ptr := v_0.Args[0] 4367 idx := v_0.Args[1] 4368 mem := v.Args[1] 4369 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4370 break 4371 } 4372 v.reset(Op386MOVLloadidx1) 4373 v.AuxInt = off1 + off2 4374 v.Aux = mergeSym(sym1, sym2) 4375 v.AddArg(ptr) 4376 v.AddArg(idx) 4377 v.AddArg(mem) 4378 return true 4379 } 4380 // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 4381 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4382 // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4383 for { 4384 off1 := v.AuxInt 4385 sym1 := v.Aux 4386 _ = v.Args[1] 4387 v_0 := v.Args[0] 4388 if v_0.Op != Op386LEAL4 { 4389 break 4390 } 4391 off2 := v_0.AuxInt 4392 sym2 := v_0.Aux 4393 _ = v_0.Args[1] 4394 ptr := v_0.Args[0] 4395 idx := v_0.Args[1] 4396 mem := v.Args[1] 4397 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4398 break 4399 } 4400 v.reset(Op386MOVLloadidx4) 4401 v.AuxInt = off1 + off2 4402 v.Aux = mergeSym(sym1, sym2) 4403 v.AddArg(ptr) 4404 v.AddArg(idx) 4405 v.AddArg(mem) 4406 return true 4407 } 4408 // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) 4409 // cond: ptr.Op != OpSB 4410 // result: (MOVLloadidx1 [off] {sym} ptr idx mem) 4411 for { 4412 off := v.AuxInt 4413 sym := v.Aux 4414 _ = v.Args[1] 4415 v_0 := v.Args[0] 4416 if v_0.Op != Op386ADDL { 4417 break 4418 } 4419 _ = v_0.Args[1] 4420 ptr := v_0.Args[0] 4421 idx := v_0.Args[1] 4422 mem := v.Args[1] 4423 if !(ptr.Op != OpSB) { 4424 break 4425 } 4426 v.reset(Op386MOVLloadidx1) 4427 v.AuxInt = off 4428 v.Aux = sym 4429 v.AddArg(ptr) 4430 v.AddArg(idx) 4431 v.AddArg(mem) 4432 return true 4433 } 4434 return false 4435 } 4436 func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { 4437 // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4438 // cond: 4439 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4440 for { 4441 c := v.AuxInt 4442 sym := v.Aux 4443 _ = v.Args[2] 4444 ptr := v.Args[0] 4445 v_1 := v.Args[1] 4446 if v_1.Op != Op386SHLLconst { 4447 break 4448 } 4449 if v_1.AuxInt != 2 { 4450 break 4451 } 4452 idx := v_1.Args[0] 4453 mem := v.Args[2] 4454 v.reset(Op386MOVLloadidx4) 4455 v.AuxInt = c 4456 v.Aux = sym 4457 v.AddArg(ptr) 4458 v.AddArg(idx) 4459 v.AddArg(mem) 4460 return true 4461 } 4462 // match: (MOVLloadidx1 [c] {sym} (SHLLconst [2] idx) ptr mem) 4463 // cond: 4464 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4465 for { 4466 c := v.AuxInt 4467 sym := v.Aux 4468 _ = v.Args[2] 4469 v_0 := v.Args[0] 4470 if v_0.Op != Op386SHLLconst { 4471 break 4472 } 4473 if v_0.AuxInt != 2 { 4474 break 4475 } 4476 idx := v_0.Args[0] 4477 ptr := v.Args[1] 4478 mem := v.Args[2] 4479 v.reset(Op386MOVLloadidx4) 4480 v.AuxInt = c 4481 v.Aux = sym 4482 v.AddArg(ptr) 4483 v.AddArg(idx) 4484 v.AddArg(mem) 4485 return true 4486 } 4487 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 4488 // cond: 4489 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4490 for { 4491 c := v.AuxInt 4492 sym := v.Aux 4493 _ = v.Args[2] 4494 v_0 := v.Args[0] 4495 if v_0.Op != Op386ADDLconst { 4496 break 4497 } 4498 d := v_0.AuxInt 4499 ptr := v_0.Args[0] 4500 idx := v.Args[1] 4501 mem := v.Args[2] 4502 v.reset(Op386MOVLloadidx1) 4503 v.AuxInt = int64(int32(c + d)) 4504 v.Aux = sym 4505 v.AddArg(ptr) 4506 v.AddArg(idx) 4507 v.AddArg(mem) 4508 return true 4509 } 4510 // match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 4511 // cond: 4512 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4513 for { 4514 c := v.AuxInt 4515 sym := v.Aux 4516 _ = v.Args[2] 4517 idx := v.Args[0] 4518 v_1 := v.Args[1] 4519 if v_1.Op != Op386ADDLconst { 4520 break 4521 } 4522 d := v_1.AuxInt 4523 ptr := v_1.Args[0] 4524 mem := v.Args[2] 4525 v.reset(Op386MOVLloadidx1) 4526 v.AuxInt = int64(int32(c + d)) 4527 v.Aux = sym 4528 v.AddArg(ptr) 4529 v.AddArg(idx) 4530 v.AddArg(mem) 4531 return true 4532 } 4533 // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 4534 // cond: 4535 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4536 for { 4537 c := v.AuxInt 4538 sym := v.Aux 4539 _ = v.Args[2] 4540 ptr := v.Args[0] 4541 v_1 := v.Args[1] 4542 if v_1.Op != Op386ADDLconst { 4543 break 4544 } 4545 d := v_1.AuxInt 4546 idx := v_1.Args[0] 4547 mem := v.Args[2] 4548 v.reset(Op386MOVLloadidx1) 4549 v.AuxInt = int64(int32(c + d)) 4550 v.Aux = sym 4551 v.AddArg(ptr) 4552 v.AddArg(idx) 4553 v.AddArg(mem) 4554 return true 4555 } 4556 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 4557 // cond: 4558 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4559 for { 4560 c := v.AuxInt 4561 sym := v.Aux 4562 _ = v.Args[2] 4563 v_0 := v.Args[0] 4564 if v_0.Op != Op386ADDLconst { 4565 break 4566 } 4567 d := v_0.AuxInt 4568 idx := v_0.Args[0] 4569 ptr := v.Args[1] 4570 mem := v.Args[2] 4571 v.reset(Op386MOVLloadidx1) 4572 v.AuxInt = int64(int32(c + d)) 4573 v.Aux = sym 4574 v.AddArg(ptr) 4575 v.AddArg(idx) 4576 v.AddArg(mem) 4577 return true 4578 } 4579 return false 4580 } 4581 func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { 4582 // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 4583 // cond: 4584 // result: (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) 4585 for { 4586 c := v.AuxInt 4587 sym := v.Aux 4588 _ = v.Args[2] 4589 v_0 := v.Args[0] 4590 if v_0.Op != Op386ADDLconst { 4591 break 4592 } 4593 d := v_0.AuxInt 4594 ptr := v_0.Args[0] 4595 idx := v.Args[1] 4596 mem := v.Args[2] 4597 v.reset(Op386MOVLloadidx4) 4598 v.AuxInt = int64(int32(c + d)) 4599 v.Aux = sym 4600 v.AddArg(ptr) 4601 v.AddArg(idx) 4602 v.AddArg(mem) 4603 return true 4604 } 4605 // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 4606 // cond: 4607 // result: (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) 4608 for { 4609 c := v.AuxInt 4610 sym := v.Aux 4611 _ = v.Args[2] 4612 ptr := v.Args[0] 4613 v_1 := v.Args[1] 4614 if v_1.Op != Op386ADDLconst { 4615 break 4616 } 4617 d := v_1.AuxInt 4618 idx := v_1.Args[0] 4619 mem := v.Args[2] 4620 v.reset(Op386MOVLloadidx4) 4621 v.AuxInt = int64(int32(c + 4*d)) 4622 v.Aux = sym 4623 v.AddArg(ptr) 4624 v.AddArg(idx) 4625 v.AddArg(mem) 4626 return true 4627 } 4628 return false 4629 } 4630 func rewriteValue386_Op386MOVLstore_0(v *Value) bool { 4631 b := v.Block 4632 _ = b 4633 config := b.Func.Config 4634 _ = config 4635 // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 4636 // cond: is32Bit(off1+off2) 4637 // result: (MOVLstore [off1+off2] {sym} ptr val mem) 4638 for { 4639 off1 := v.AuxInt 4640 sym := v.Aux 4641 _ = v.Args[2] 4642 v_0 := v.Args[0] 4643 if v_0.Op != Op386ADDLconst { 4644 break 4645 } 4646 off2 := v_0.AuxInt 4647 ptr := v_0.Args[0] 4648 val := v.Args[1] 4649 mem := v.Args[2] 4650 if !(is32Bit(off1 + off2)) { 4651 break 4652 } 4653 v.reset(Op386MOVLstore) 4654 v.AuxInt = off1 + off2 4655 v.Aux = sym 4656 v.AddArg(ptr) 4657 v.AddArg(val) 4658 v.AddArg(mem) 4659 return true 4660 } 4661 // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) 4662 // cond: validOff(off) 4663 // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 4664 for { 4665 off := v.AuxInt 4666 sym := v.Aux 4667 _ = v.Args[2] 4668 ptr := v.Args[0] 4669 v_1 := v.Args[1] 4670 if v_1.Op != Op386MOVLconst { 4671 break 4672 } 4673 c := v_1.AuxInt 4674 mem := v.Args[2] 4675 if !(validOff(off)) { 4676 break 4677 } 4678 v.reset(Op386MOVLstoreconst) 4679 v.AuxInt = makeValAndOff(int64(int32(c)), off) 4680 v.Aux = sym 4681 v.AddArg(ptr) 4682 v.AddArg(mem) 4683 return true 4684 } 4685 // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 4686 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4687 // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 4688 for { 4689 off1 := v.AuxInt 4690 sym1 := v.Aux 4691 _ = v.Args[2] 4692 v_0 := v.Args[0] 4693 if v_0.Op != Op386LEAL { 4694 break 4695 } 4696 off2 := v_0.AuxInt 4697 sym2 := v_0.Aux 4698 base := v_0.Args[0] 4699 val := v.Args[1] 4700 mem := v.Args[2] 4701 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4702 break 4703 } 4704 v.reset(Op386MOVLstore) 4705 v.AuxInt = off1 + off2 4706 v.Aux = mergeSym(sym1, sym2) 4707 v.AddArg(base) 4708 v.AddArg(val) 4709 v.AddArg(mem) 4710 return true 4711 } 4712 // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 4713 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4714 // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4715 for { 4716 off1 := v.AuxInt 4717 sym1 := v.Aux 4718 _ = v.Args[2] 4719 v_0 := v.Args[0] 4720 if v_0.Op != Op386LEAL1 { 4721 break 4722 } 4723 off2 := v_0.AuxInt 4724 sym2 := v_0.Aux 4725 _ = v_0.Args[1] 4726 ptr := v_0.Args[0] 4727 idx := v_0.Args[1] 4728 val := v.Args[1] 4729 mem := v.Args[2] 4730 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4731 break 4732 } 4733 v.reset(Op386MOVLstoreidx1) 4734 v.AuxInt = off1 + off2 4735 v.Aux = mergeSym(sym1, sym2) 4736 v.AddArg(ptr) 4737 v.AddArg(idx) 4738 v.AddArg(val) 4739 v.AddArg(mem) 4740 return true 4741 } 4742 // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 4743 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4744 // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4745 for { 4746 off1 := v.AuxInt 4747 sym1 := v.Aux 4748 _ = v.Args[2] 4749 v_0 := v.Args[0] 4750 if v_0.Op != Op386LEAL4 { 4751 break 4752 } 4753 off2 := v_0.AuxInt 4754 sym2 := v_0.Aux 4755 _ = v_0.Args[1] 4756 ptr := v_0.Args[0] 4757 idx := v_0.Args[1] 4758 val := v.Args[1] 4759 mem := v.Args[2] 4760 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4761 break 4762 } 4763 v.reset(Op386MOVLstoreidx4) 4764 v.AuxInt = off1 + off2 4765 v.Aux = mergeSym(sym1, sym2) 4766 v.AddArg(ptr) 4767 v.AddArg(idx) 4768 v.AddArg(val) 4769 v.AddArg(mem) 4770 return true 4771 } 4772 // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) 4773 // cond: ptr.Op != OpSB 4774 // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) 4775 for { 4776 off := v.AuxInt 4777 sym := v.Aux 4778 _ = v.Args[2] 4779 v_0 := v.Args[0] 4780 if v_0.Op != Op386ADDL { 4781 break 4782 } 4783 _ = v_0.Args[1] 4784 ptr := v_0.Args[0] 4785 idx := v_0.Args[1] 4786 val := v.Args[1] 4787 mem := v.Args[2] 4788 if !(ptr.Op != OpSB) { 4789 break 4790 } 4791 v.reset(Op386MOVLstoreidx1) 4792 v.AuxInt = off 4793 v.Aux = sym 4794 v.AddArg(ptr) 4795 v.AddArg(idx) 4796 v.AddArg(val) 4797 v.AddArg(mem) 4798 return true 4799 } 4800 return false 4801 } 4802 func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { 4803 b := v.Block 4804 _ = b 4805 config := b.Func.Config 4806 _ = config 4807 // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 4808 // cond: ValAndOff(sc).canAdd(off) 4809 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 4810 for { 4811 sc := v.AuxInt 4812 s := v.Aux 4813 _ = v.Args[1] 4814 v_0 := v.Args[0] 4815 if v_0.Op != Op386ADDLconst { 4816 break 4817 } 4818 off := v_0.AuxInt 4819 ptr := v_0.Args[0] 4820 mem := v.Args[1] 4821 if !(ValAndOff(sc).canAdd(off)) { 4822 break 4823 } 4824 v.reset(Op386MOVLstoreconst) 4825 v.AuxInt = ValAndOff(sc).add(off) 4826 v.Aux = s 4827 v.AddArg(ptr) 4828 v.AddArg(mem) 4829 return true 4830 } 4831 // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 4832 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 4833 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 4834 for { 4835 sc := v.AuxInt 4836 sym1 := v.Aux 4837 _ = v.Args[1] 4838 v_0 := v.Args[0] 4839 if v_0.Op != Op386LEAL { 4840 break 4841 } 4842 off := v_0.AuxInt 4843 sym2 := v_0.Aux 4844 ptr := v_0.Args[0] 4845 mem := v.Args[1] 4846 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 4847 break 4848 } 4849 v.reset(Op386MOVLstoreconst) 4850 v.AuxInt = ValAndOff(sc).add(off) 4851 v.Aux = mergeSym(sym1, sym2) 4852 v.AddArg(ptr) 4853 v.AddArg(mem) 4854 return true 4855 } 4856 // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 4857 // cond: canMergeSym(sym1, sym2) 4858 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4859 for { 4860 x := v.AuxInt 4861 sym1 := v.Aux 4862 _ = v.Args[1] 4863 v_0 := v.Args[0] 4864 if v_0.Op != Op386LEAL1 { 4865 break 4866 } 4867 off := v_0.AuxInt 4868 sym2 := v_0.Aux 4869 _ = v_0.Args[1] 4870 ptr := v_0.Args[0] 4871 idx := v_0.Args[1] 4872 mem := v.Args[1] 4873 if !(canMergeSym(sym1, sym2)) { 4874 break 4875 } 4876 v.reset(Op386MOVLstoreconstidx1) 4877 v.AuxInt = ValAndOff(x).add(off) 4878 v.Aux = mergeSym(sym1, sym2) 4879 v.AddArg(ptr) 4880 v.AddArg(idx) 4881 v.AddArg(mem) 4882 return true 4883 } 4884 // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) 4885 // cond: canMergeSym(sym1, sym2) 4886 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4887 for { 4888 x := v.AuxInt 4889 sym1 := v.Aux 4890 _ = v.Args[1] 4891 v_0 := v.Args[0] 4892 if v_0.Op != Op386LEAL4 { 4893 break 4894 } 4895 off := v_0.AuxInt 4896 sym2 := v_0.Aux 4897 _ = v_0.Args[1] 4898 ptr := v_0.Args[0] 4899 idx := v_0.Args[1] 4900 mem := v.Args[1] 4901 if !(canMergeSym(sym1, sym2)) { 4902 break 4903 } 4904 v.reset(Op386MOVLstoreconstidx4) 4905 v.AuxInt = ValAndOff(x).add(off) 4906 v.Aux = mergeSym(sym1, sym2) 4907 v.AddArg(ptr) 4908 v.AddArg(idx) 4909 v.AddArg(mem) 4910 return true 4911 } 4912 // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) 4913 // cond: 4914 // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) 4915 for { 4916 x := v.AuxInt 4917 sym := v.Aux 4918 _ = v.Args[1] 4919 v_0 := v.Args[0] 4920 if v_0.Op != Op386ADDL { 4921 break 4922 } 4923 _ = v_0.Args[1] 4924 ptr := v_0.Args[0] 4925 idx := v_0.Args[1] 4926 mem := v.Args[1] 4927 v.reset(Op386MOVLstoreconstidx1) 4928 v.AuxInt = x 4929 v.Aux = sym 4930 v.AddArg(ptr) 4931 v.AddArg(idx) 4932 v.AddArg(mem) 4933 return true 4934 } 4935 return false 4936 } 4937 func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { 4938 // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4939 // cond: 4940 // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) 4941 for { 4942 c := v.AuxInt 4943 sym := v.Aux 4944 _ = v.Args[2] 4945 ptr := v.Args[0] 4946 v_1 := v.Args[1] 4947 if v_1.Op != Op386SHLLconst { 4948 break 4949 } 4950 if v_1.AuxInt != 2 { 4951 break 4952 } 4953 idx := v_1.Args[0] 4954 mem := v.Args[2] 4955 v.reset(Op386MOVLstoreconstidx4) 4956 v.AuxInt = c 4957 v.Aux = sym 4958 v.AddArg(ptr) 4959 v.AddArg(idx) 4960 v.AddArg(mem) 4961 return true 4962 } 4963 // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 4964 // cond: 4965 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4966 for { 4967 x := v.AuxInt 4968 sym := v.Aux 4969 _ = v.Args[2] 4970 v_0 := v.Args[0] 4971 if v_0.Op != Op386ADDLconst { 4972 break 4973 } 4974 c := v_0.AuxInt 4975 ptr := v_0.Args[0] 4976 idx := v.Args[1] 4977 mem := v.Args[2] 4978 v.reset(Op386MOVLstoreconstidx1) 4979 v.AuxInt = ValAndOff(x).add(c) 4980 v.Aux = sym 4981 v.AddArg(ptr) 4982 v.AddArg(idx) 4983 v.AddArg(mem) 4984 return true 4985 } 4986 // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 4987 // cond: 4988 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4989 for { 4990 x := v.AuxInt 4991 sym := v.Aux 4992 _ = v.Args[2] 4993 ptr := v.Args[0] 4994 v_1 := v.Args[1] 4995 if v_1.Op != Op386ADDLconst { 4996 break 4997 } 4998 c := v_1.AuxInt 4999 idx := v_1.Args[0] 5000 mem := v.Args[2] 5001 v.reset(Op386MOVLstoreconstidx1) 5002 v.AuxInt = ValAndOff(x).add(c) 5003 v.Aux = sym 5004 v.AddArg(ptr) 5005 v.AddArg(idx) 5006 v.AddArg(mem) 5007 return true 5008 } 5009 return false 5010 } 5011 func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { 5012 // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) 5013 // cond: 5014 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) 5015 for { 5016 x := v.AuxInt 5017 sym := v.Aux 5018 _ = v.Args[2] 5019 v_0 := v.Args[0] 5020 if v_0.Op != Op386ADDLconst { 5021 break 5022 } 5023 c := v_0.AuxInt 5024 ptr := v_0.Args[0] 5025 idx := v.Args[1] 5026 mem := v.Args[2] 5027 v.reset(Op386MOVLstoreconstidx4) 5028 v.AuxInt = ValAndOff(x).add(c) 5029 v.Aux = sym 5030 v.AddArg(ptr) 5031 v.AddArg(idx) 5032 v.AddArg(mem) 5033 return true 5034 } 5035 // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) 5036 // cond: 5037 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) 5038 for { 5039 x := v.AuxInt 5040 sym := v.Aux 5041 _ = v.Args[2] 5042 ptr := v.Args[0] 5043 v_1 := v.Args[1] 5044 if v_1.Op != Op386ADDLconst { 5045 break 5046 } 5047 c := v_1.AuxInt 5048 idx := v_1.Args[0] 5049 mem := v.Args[2] 5050 v.reset(Op386MOVLstoreconstidx4) 5051 v.AuxInt = ValAndOff(x).add(4 * c) 5052 v.Aux = sym 5053 v.AddArg(ptr) 5054 v.AddArg(idx) 5055 v.AddArg(mem) 5056 return true 5057 } 5058 return false 5059 } 5060 func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { 5061 // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) 5062 // cond: 5063 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 5064 for { 5065 c := v.AuxInt 5066 sym := v.Aux 5067 _ = v.Args[3] 5068 ptr := v.Args[0] 5069 v_1 := v.Args[1] 5070 if v_1.Op != Op386SHLLconst { 5071 break 5072 } 5073 if v_1.AuxInt != 2 { 5074 break 5075 } 5076 idx := v_1.Args[0] 5077 val := v.Args[2] 5078 mem := v.Args[3] 5079 v.reset(Op386MOVLstoreidx4) 5080 v.AuxInt = c 5081 v.Aux = sym 5082 v.AddArg(ptr) 5083 v.AddArg(idx) 5084 v.AddArg(val) 5085 v.AddArg(mem) 5086 return true 5087 } 5088 // match: (MOVLstoreidx1 [c] {sym} (SHLLconst [2] idx) ptr val mem) 5089 // cond: 5090 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 5091 for { 5092 c := v.AuxInt 5093 sym := v.Aux 5094 _ = v.Args[3] 5095 v_0 := v.Args[0] 5096 if v_0.Op != Op386SHLLconst { 5097 break 5098 } 5099 if v_0.AuxInt != 2 { 5100 break 5101 } 5102 idx := v_0.Args[0] 5103 ptr := v.Args[1] 5104 val := v.Args[2] 5105 mem := v.Args[3] 5106 v.reset(Op386MOVLstoreidx4) 5107 v.AuxInt = c 5108 v.Aux = sym 5109 v.AddArg(ptr) 5110 v.AddArg(idx) 5111 v.AddArg(val) 5112 v.AddArg(mem) 5113 return true 5114 } 5115 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5116 // cond: 5117 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5118 for { 5119 c := v.AuxInt 5120 sym := v.Aux 5121 _ = v.Args[3] 5122 v_0 := v.Args[0] 5123 if v_0.Op != Op386ADDLconst { 5124 break 5125 } 5126 d := v_0.AuxInt 5127 ptr := v_0.Args[0] 5128 idx := v.Args[1] 5129 val := v.Args[2] 5130 mem := v.Args[3] 5131 v.reset(Op386MOVLstoreidx1) 5132 v.AuxInt = int64(int32(c + d)) 5133 v.Aux = sym 5134 v.AddArg(ptr) 5135 v.AddArg(idx) 5136 v.AddArg(val) 5137 v.AddArg(mem) 5138 return true 5139 } 5140 // match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 5141 // cond: 5142 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5143 for { 5144 c := v.AuxInt 5145 sym := v.Aux 5146 _ = v.Args[3] 5147 idx := v.Args[0] 5148 v_1 := v.Args[1] 5149 if v_1.Op != Op386ADDLconst { 5150 break 5151 } 5152 d := v_1.AuxInt 5153 ptr := v_1.Args[0] 5154 val := v.Args[2] 5155 mem := v.Args[3] 5156 v.reset(Op386MOVLstoreidx1) 5157 v.AuxInt = int64(int32(c + d)) 5158 v.Aux = sym 5159 v.AddArg(ptr) 5160 v.AddArg(idx) 5161 v.AddArg(val) 5162 v.AddArg(mem) 5163 return true 5164 } 5165 // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5166 // cond: 5167 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5168 for { 5169 c := v.AuxInt 5170 sym := v.Aux 5171 _ = v.Args[3] 5172 ptr := v.Args[0] 5173 v_1 := v.Args[1] 5174 if v_1.Op != Op386ADDLconst { 5175 break 5176 } 5177 d := v_1.AuxInt 5178 idx := v_1.Args[0] 5179 val := v.Args[2] 5180 mem := v.Args[3] 5181 v.reset(Op386MOVLstoreidx1) 5182 v.AuxInt = int64(int32(c + d)) 5183 v.Aux = sym 5184 v.AddArg(ptr) 5185 v.AddArg(idx) 5186 v.AddArg(val) 5187 v.AddArg(mem) 5188 return true 5189 } 5190 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 5191 // cond: 5192 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5193 for { 5194 c := v.AuxInt 5195 sym := v.Aux 5196 _ = v.Args[3] 5197 v_0 := v.Args[0] 5198 if v_0.Op != Op386ADDLconst { 5199 break 5200 } 5201 d := v_0.AuxInt 5202 idx := v_0.Args[0] 5203 ptr := v.Args[1] 5204 val := v.Args[2] 5205 mem := v.Args[3] 5206 v.reset(Op386MOVLstoreidx1) 5207 v.AuxInt = int64(int32(c + d)) 5208 v.Aux = sym 5209 v.AddArg(ptr) 5210 v.AddArg(idx) 5211 v.AddArg(val) 5212 v.AddArg(mem) 5213 return true 5214 } 5215 return false 5216 } 5217 func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { 5218 // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5219 // cond: 5220 // result: (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) 5221 for { 5222 c := v.AuxInt 5223 sym := v.Aux 5224 _ = v.Args[3] 5225 v_0 := v.Args[0] 5226 if v_0.Op != Op386ADDLconst { 5227 break 5228 } 5229 d := v_0.AuxInt 5230 ptr := v_0.Args[0] 5231 idx := v.Args[1] 5232 val := v.Args[2] 5233 mem := v.Args[3] 5234 v.reset(Op386MOVLstoreidx4) 5235 v.AuxInt = int64(int32(c + d)) 5236 v.Aux = sym 5237 v.AddArg(ptr) 5238 v.AddArg(idx) 5239 v.AddArg(val) 5240 v.AddArg(mem) 5241 return true 5242 } 5243 // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5244 // cond: 5245 // result: (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) 5246 for { 5247 c := v.AuxInt 5248 sym := v.Aux 5249 _ = v.Args[3] 5250 ptr := v.Args[0] 5251 v_1 := v.Args[1] 5252 if v_1.Op != Op386ADDLconst { 5253 break 5254 } 5255 d := v_1.AuxInt 5256 idx := v_1.Args[0] 5257 val := v.Args[2] 5258 mem := v.Args[3] 5259 v.reset(Op386MOVLstoreidx4) 5260 v.AuxInt = int64(int32(c + 4*d)) 5261 v.Aux = sym 5262 v.AddArg(ptr) 5263 v.AddArg(idx) 5264 v.AddArg(val) 5265 v.AddArg(mem) 5266 return true 5267 } 5268 return false 5269 } 5270 func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { 5271 b := v.Block 5272 _ = b 5273 config := b.Func.Config 5274 _ = config 5275 typ := &b.Func.Config.Types 5276 _ = typ 5277 // match: (MOVSDconst [c]) 5278 // cond: config.ctxt.Flag_shared 5279 // result: (MOVSDconst2 (MOVSDconst1 [c])) 5280 for { 5281 c := v.AuxInt 5282 if !(config.ctxt.Flag_shared) { 5283 break 5284 } 5285 v.reset(Op386MOVSDconst2) 5286 v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, typ.UInt32) 5287 v0.AuxInt = c 5288 v.AddArg(v0) 5289 return true 5290 } 5291 return false 5292 } 5293 func rewriteValue386_Op386MOVSDload_0(v *Value) bool { 5294 b := v.Block 5295 _ = b 5296 config := b.Func.Config 5297 _ = config 5298 // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) 5299 // cond: is32Bit(off1+off2) 5300 // result: (MOVSDload [off1+off2] {sym} ptr mem) 5301 for { 5302 off1 := v.AuxInt 5303 sym := v.Aux 5304 _ = v.Args[1] 5305 v_0 := v.Args[0] 5306 if v_0.Op != Op386ADDLconst { 5307 break 5308 } 5309 off2 := v_0.AuxInt 5310 ptr := v_0.Args[0] 5311 mem := v.Args[1] 5312 if !(is32Bit(off1 + off2)) { 5313 break 5314 } 5315 v.reset(Op386MOVSDload) 5316 v.AuxInt = off1 + off2 5317 v.Aux = sym 5318 v.AddArg(ptr) 5319 v.AddArg(mem) 5320 return true 5321 } 5322 // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5323 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5324 // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5325 for { 5326 off1 := v.AuxInt 5327 sym1 := v.Aux 5328 _ = v.Args[1] 5329 v_0 := v.Args[0] 5330 if v_0.Op != Op386LEAL { 5331 break 5332 } 5333 off2 := v_0.AuxInt 5334 sym2 := v_0.Aux 5335 base := v_0.Args[0] 5336 mem := v.Args[1] 5337 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5338 break 5339 } 5340 v.reset(Op386MOVSDload) 5341 v.AuxInt = off1 + off2 5342 v.Aux = mergeSym(sym1, sym2) 5343 v.AddArg(base) 5344 v.AddArg(mem) 5345 return true 5346 } 5347 // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5348 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5349 // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5350 for { 5351 off1 := v.AuxInt 5352 sym1 := v.Aux 5353 _ = v.Args[1] 5354 v_0 := v.Args[0] 5355 if v_0.Op != Op386LEAL1 { 5356 break 5357 } 5358 off2 := v_0.AuxInt 5359 sym2 := v_0.Aux 5360 _ = v_0.Args[1] 5361 ptr := v_0.Args[0] 5362 idx := v_0.Args[1] 5363 mem := v.Args[1] 5364 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5365 break 5366 } 5367 v.reset(Op386MOVSDloadidx1) 5368 v.AuxInt = off1 + off2 5369 v.Aux = mergeSym(sym1, sym2) 5370 v.AddArg(ptr) 5371 v.AddArg(idx) 5372 v.AddArg(mem) 5373 return true 5374 } 5375 // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) 5376 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5377 // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5378 for { 5379 off1 := v.AuxInt 5380 sym1 := v.Aux 5381 _ = v.Args[1] 5382 v_0 := v.Args[0] 5383 if v_0.Op != Op386LEAL8 { 5384 break 5385 } 5386 off2 := v_0.AuxInt 5387 sym2 := v_0.Aux 5388 _ = v_0.Args[1] 5389 ptr := v_0.Args[0] 5390 idx := v_0.Args[1] 5391 mem := v.Args[1] 5392 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5393 break 5394 } 5395 v.reset(Op386MOVSDloadidx8) 5396 v.AuxInt = off1 + off2 5397 v.Aux = mergeSym(sym1, sym2) 5398 v.AddArg(ptr) 5399 v.AddArg(idx) 5400 v.AddArg(mem) 5401 return true 5402 } 5403 // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) 5404 // cond: ptr.Op != OpSB 5405 // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) 5406 for { 5407 off := v.AuxInt 5408 sym := v.Aux 5409 _ = v.Args[1] 5410 v_0 := v.Args[0] 5411 if v_0.Op != Op386ADDL { 5412 break 5413 } 5414 _ = v_0.Args[1] 5415 ptr := v_0.Args[0] 5416 idx := v_0.Args[1] 5417 mem := v.Args[1] 5418 if !(ptr.Op != OpSB) { 5419 break 5420 } 5421 v.reset(Op386MOVSDloadidx1) 5422 v.AuxInt = off 5423 v.Aux = sym 5424 v.AddArg(ptr) 5425 v.AddArg(idx) 5426 v.AddArg(mem) 5427 return true 5428 } 5429 return false 5430 } 5431 func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { 5432 // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5433 // cond: 5434 // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5435 for { 5436 c := v.AuxInt 5437 sym := v.Aux 5438 _ = v.Args[2] 5439 v_0 := v.Args[0] 5440 if v_0.Op != Op386ADDLconst { 5441 break 5442 } 5443 d := v_0.AuxInt 5444 ptr := v_0.Args[0] 5445 idx := v.Args[1] 5446 mem := v.Args[2] 5447 v.reset(Op386MOVSDloadidx1) 5448 v.AuxInt = int64(int32(c + d)) 5449 v.Aux = sym 5450 v.AddArg(ptr) 5451 v.AddArg(idx) 5452 v.AddArg(mem) 5453 return true 5454 } 5455 // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5456 // cond: 5457 // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5458 for { 5459 c := v.AuxInt 5460 sym := v.Aux 5461 _ = v.Args[2] 5462 ptr := v.Args[0] 5463 v_1 := v.Args[1] 5464 if v_1.Op != Op386ADDLconst { 5465 break 5466 } 5467 d := v_1.AuxInt 5468 idx := v_1.Args[0] 5469 mem := v.Args[2] 5470 v.reset(Op386MOVSDloadidx1) 5471 v.AuxInt = int64(int32(c + d)) 5472 v.Aux = sym 5473 v.AddArg(ptr) 5474 v.AddArg(idx) 5475 v.AddArg(mem) 5476 return true 5477 } 5478 return false 5479 } 5480 func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { 5481 // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) 5482 // cond: 5483 // result: (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem) 5484 for { 5485 c := v.AuxInt 5486 sym := v.Aux 5487 _ = v.Args[2] 5488 v_0 := v.Args[0] 5489 if v_0.Op != Op386ADDLconst { 5490 break 5491 } 5492 d := v_0.AuxInt 5493 ptr := v_0.Args[0] 5494 idx := v.Args[1] 5495 mem := v.Args[2] 5496 v.reset(Op386MOVSDloadidx8) 5497 v.AuxInt = int64(int32(c + d)) 5498 v.Aux = sym 5499 v.AddArg(ptr) 5500 v.AddArg(idx) 5501 v.AddArg(mem) 5502 return true 5503 } 5504 // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) 5505 // cond: 5506 // result: (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem) 5507 for { 5508 c := v.AuxInt 5509 sym := v.Aux 5510 _ = v.Args[2] 5511 ptr := v.Args[0] 5512 v_1 := v.Args[1] 5513 if v_1.Op != Op386ADDLconst { 5514 break 5515 } 5516 d := v_1.AuxInt 5517 idx := v_1.Args[0] 5518 mem := v.Args[2] 5519 v.reset(Op386MOVSDloadidx8) 5520 v.AuxInt = int64(int32(c + 8*d)) 5521 v.Aux = sym 5522 v.AddArg(ptr) 5523 v.AddArg(idx) 5524 v.AddArg(mem) 5525 return true 5526 } 5527 return false 5528 } 5529 func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { 5530 b := v.Block 5531 _ = b 5532 config := b.Func.Config 5533 _ = config 5534 // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5535 // cond: is32Bit(off1+off2) 5536 // result: (MOVSDstore [off1+off2] {sym} ptr val mem) 5537 for { 5538 off1 := v.AuxInt 5539 sym := v.Aux 5540 _ = v.Args[2] 5541 v_0 := v.Args[0] 5542 if v_0.Op != Op386ADDLconst { 5543 break 5544 } 5545 off2 := v_0.AuxInt 5546 ptr := v_0.Args[0] 5547 val := v.Args[1] 5548 mem := v.Args[2] 5549 if !(is32Bit(off1 + off2)) { 5550 break 5551 } 5552 v.reset(Op386MOVSDstore) 5553 v.AuxInt = off1 + off2 5554 v.Aux = sym 5555 v.AddArg(ptr) 5556 v.AddArg(val) 5557 v.AddArg(mem) 5558 return true 5559 } 5560 // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5561 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5562 // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5563 for { 5564 off1 := v.AuxInt 5565 sym1 := v.Aux 5566 _ = v.Args[2] 5567 v_0 := v.Args[0] 5568 if v_0.Op != Op386LEAL { 5569 break 5570 } 5571 off2 := v_0.AuxInt 5572 sym2 := v_0.Aux 5573 base := v_0.Args[0] 5574 val := v.Args[1] 5575 mem := v.Args[2] 5576 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5577 break 5578 } 5579 v.reset(Op386MOVSDstore) 5580 v.AuxInt = off1 + off2 5581 v.Aux = mergeSym(sym1, sym2) 5582 v.AddArg(base) 5583 v.AddArg(val) 5584 v.AddArg(mem) 5585 return true 5586 } 5587 // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5588 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5589 // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5590 for { 5591 off1 := v.AuxInt 5592 sym1 := v.Aux 5593 _ = v.Args[2] 5594 v_0 := v.Args[0] 5595 if v_0.Op != Op386LEAL1 { 5596 break 5597 } 5598 off2 := v_0.AuxInt 5599 sym2 := v_0.Aux 5600 _ = v_0.Args[1] 5601 ptr := v_0.Args[0] 5602 idx := v_0.Args[1] 5603 val := v.Args[1] 5604 mem := v.Args[2] 5605 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5606 break 5607 } 5608 v.reset(Op386MOVSDstoreidx1) 5609 v.AuxInt = off1 + off2 5610 v.Aux = mergeSym(sym1, sym2) 5611 v.AddArg(ptr) 5612 v.AddArg(idx) 5613 v.AddArg(val) 5614 v.AddArg(mem) 5615 return true 5616 } 5617 // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) 5618 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5619 // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5620 for { 5621 off1 := v.AuxInt 5622 sym1 := v.Aux 5623 _ = v.Args[2] 5624 v_0 := v.Args[0] 5625 if v_0.Op != Op386LEAL8 { 5626 break 5627 } 5628 off2 := v_0.AuxInt 5629 sym2 := v_0.Aux 5630 _ = v_0.Args[1] 5631 ptr := v_0.Args[0] 5632 idx := v_0.Args[1] 5633 val := v.Args[1] 5634 mem := v.Args[2] 5635 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5636 break 5637 } 5638 v.reset(Op386MOVSDstoreidx8) 5639 v.AuxInt = off1 + off2 5640 v.Aux = mergeSym(sym1, sym2) 5641 v.AddArg(ptr) 5642 v.AddArg(idx) 5643 v.AddArg(val) 5644 v.AddArg(mem) 5645 return true 5646 } 5647 // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) 5648 // cond: ptr.Op != OpSB 5649 // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) 5650 for { 5651 off := v.AuxInt 5652 sym := v.Aux 5653 _ = v.Args[2] 5654 v_0 := v.Args[0] 5655 if v_0.Op != Op386ADDL { 5656 break 5657 } 5658 _ = v_0.Args[1] 5659 ptr := v_0.Args[0] 5660 idx := v_0.Args[1] 5661 val := v.Args[1] 5662 mem := v.Args[2] 5663 if !(ptr.Op != OpSB) { 5664 break 5665 } 5666 v.reset(Op386MOVSDstoreidx1) 5667 v.AuxInt = off 5668 v.Aux = sym 5669 v.AddArg(ptr) 5670 v.AddArg(idx) 5671 v.AddArg(val) 5672 v.AddArg(mem) 5673 return true 5674 } 5675 return false 5676 } 5677 func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { 5678 // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5679 // cond: 5680 // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5681 for { 5682 c := v.AuxInt 5683 sym := v.Aux 5684 _ = v.Args[3] 5685 v_0 := v.Args[0] 5686 if v_0.Op != Op386ADDLconst { 5687 break 5688 } 5689 d := v_0.AuxInt 5690 ptr := v_0.Args[0] 5691 idx := v.Args[1] 5692 val := v.Args[2] 5693 mem := v.Args[3] 5694 v.reset(Op386MOVSDstoreidx1) 5695 v.AuxInt = int64(int32(c + d)) 5696 v.Aux = sym 5697 v.AddArg(ptr) 5698 v.AddArg(idx) 5699 v.AddArg(val) 5700 v.AddArg(mem) 5701 return true 5702 } 5703 // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5704 // cond: 5705 // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5706 for { 5707 c := v.AuxInt 5708 sym := v.Aux 5709 _ = v.Args[3] 5710 ptr := v.Args[0] 5711 v_1 := v.Args[1] 5712 if v_1.Op != Op386ADDLconst { 5713 break 5714 } 5715 d := v_1.AuxInt 5716 idx := v_1.Args[0] 5717 val := v.Args[2] 5718 mem := v.Args[3] 5719 v.reset(Op386MOVSDstoreidx1) 5720 v.AuxInt = int64(int32(c + d)) 5721 v.Aux = sym 5722 v.AddArg(ptr) 5723 v.AddArg(idx) 5724 v.AddArg(val) 5725 v.AddArg(mem) 5726 return true 5727 } 5728 return false 5729 } 5730 func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { 5731 // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5732 // cond: 5733 // result: (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem) 5734 for { 5735 c := v.AuxInt 5736 sym := v.Aux 5737 _ = v.Args[3] 5738 v_0 := v.Args[0] 5739 if v_0.Op != Op386ADDLconst { 5740 break 5741 } 5742 d := v_0.AuxInt 5743 ptr := v_0.Args[0] 5744 idx := v.Args[1] 5745 val := v.Args[2] 5746 mem := v.Args[3] 5747 v.reset(Op386MOVSDstoreidx8) 5748 v.AuxInt = int64(int32(c + d)) 5749 v.Aux = sym 5750 v.AddArg(ptr) 5751 v.AddArg(idx) 5752 v.AddArg(val) 5753 v.AddArg(mem) 5754 return true 5755 } 5756 // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5757 // cond: 5758 // result: (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem) 5759 for { 5760 c := v.AuxInt 5761 sym := v.Aux 5762 _ = v.Args[3] 5763 ptr := v.Args[0] 5764 v_1 := v.Args[1] 5765 if v_1.Op != Op386ADDLconst { 5766 break 5767 } 5768 d := v_1.AuxInt 5769 idx := v_1.Args[0] 5770 val := v.Args[2] 5771 mem := v.Args[3] 5772 v.reset(Op386MOVSDstoreidx8) 5773 v.AuxInt = int64(int32(c + 8*d)) 5774 v.Aux = sym 5775 v.AddArg(ptr) 5776 v.AddArg(idx) 5777 v.AddArg(val) 5778 v.AddArg(mem) 5779 return true 5780 } 5781 return false 5782 } 5783 func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { 5784 b := v.Block 5785 _ = b 5786 config := b.Func.Config 5787 _ = config 5788 typ := &b.Func.Config.Types 5789 _ = typ 5790 // match: (MOVSSconst [c]) 5791 // cond: config.ctxt.Flag_shared 5792 // result: (MOVSSconst2 (MOVSSconst1 [c])) 5793 for { 5794 c := v.AuxInt 5795 if !(config.ctxt.Flag_shared) { 5796 break 5797 } 5798 v.reset(Op386MOVSSconst2) 5799 v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, typ.UInt32) 5800 v0.AuxInt = c 5801 v.AddArg(v0) 5802 return true 5803 } 5804 return false 5805 } 5806 func rewriteValue386_Op386MOVSSload_0(v *Value) bool { 5807 b := v.Block 5808 _ = b 5809 config := b.Func.Config 5810 _ = config 5811 // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) 5812 // cond: is32Bit(off1+off2) 5813 // result: (MOVSSload [off1+off2] {sym} ptr mem) 5814 for { 5815 off1 := v.AuxInt 5816 sym := v.Aux 5817 _ = v.Args[1] 5818 v_0 := v.Args[0] 5819 if v_0.Op != Op386ADDLconst { 5820 break 5821 } 5822 off2 := v_0.AuxInt 5823 ptr := v_0.Args[0] 5824 mem := v.Args[1] 5825 if !(is32Bit(off1 + off2)) { 5826 break 5827 } 5828 v.reset(Op386MOVSSload) 5829 v.AuxInt = off1 + off2 5830 v.Aux = sym 5831 v.AddArg(ptr) 5832 v.AddArg(mem) 5833 return true 5834 } 5835 // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5836 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5837 // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5838 for { 5839 off1 := v.AuxInt 5840 sym1 := v.Aux 5841 _ = v.Args[1] 5842 v_0 := v.Args[0] 5843 if v_0.Op != Op386LEAL { 5844 break 5845 } 5846 off2 := v_0.AuxInt 5847 sym2 := v_0.Aux 5848 base := v_0.Args[0] 5849 mem := v.Args[1] 5850 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5851 break 5852 } 5853 v.reset(Op386MOVSSload) 5854 v.AuxInt = off1 + off2 5855 v.Aux = mergeSym(sym1, sym2) 5856 v.AddArg(base) 5857 v.AddArg(mem) 5858 return true 5859 } 5860 // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5861 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5862 // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5863 for { 5864 off1 := v.AuxInt 5865 sym1 := v.Aux 5866 _ = v.Args[1] 5867 v_0 := v.Args[0] 5868 if v_0.Op != Op386LEAL1 { 5869 break 5870 } 5871 off2 := v_0.AuxInt 5872 sym2 := v_0.Aux 5873 _ = v_0.Args[1] 5874 ptr := v_0.Args[0] 5875 idx := v_0.Args[1] 5876 mem := v.Args[1] 5877 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5878 break 5879 } 5880 v.reset(Op386MOVSSloadidx1) 5881 v.AuxInt = off1 + off2 5882 v.Aux = mergeSym(sym1, sym2) 5883 v.AddArg(ptr) 5884 v.AddArg(idx) 5885 v.AddArg(mem) 5886 return true 5887 } 5888 // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 5889 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5890 // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5891 for { 5892 off1 := v.AuxInt 5893 sym1 := v.Aux 5894 _ = v.Args[1] 5895 v_0 := v.Args[0] 5896 if v_0.Op != Op386LEAL4 { 5897 break 5898 } 5899 off2 := v_0.AuxInt 5900 sym2 := v_0.Aux 5901 _ = v_0.Args[1] 5902 ptr := v_0.Args[0] 5903 idx := v_0.Args[1] 5904 mem := v.Args[1] 5905 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5906 break 5907 } 5908 v.reset(Op386MOVSSloadidx4) 5909 v.AuxInt = off1 + off2 5910 v.Aux = mergeSym(sym1, sym2) 5911 v.AddArg(ptr) 5912 v.AddArg(idx) 5913 v.AddArg(mem) 5914 return true 5915 } 5916 // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) 5917 // cond: ptr.Op != OpSB 5918 // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) 5919 for { 5920 off := v.AuxInt 5921 sym := v.Aux 5922 _ = v.Args[1] 5923 v_0 := v.Args[0] 5924 if v_0.Op != Op386ADDL { 5925 break 5926 } 5927 _ = v_0.Args[1] 5928 ptr := v_0.Args[0] 5929 idx := v_0.Args[1] 5930 mem := v.Args[1] 5931 if !(ptr.Op != OpSB) { 5932 break 5933 } 5934 v.reset(Op386MOVSSloadidx1) 5935 v.AuxInt = off 5936 v.Aux = sym 5937 v.AddArg(ptr) 5938 v.AddArg(idx) 5939 v.AddArg(mem) 5940 return true 5941 } 5942 return false 5943 } 5944 func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { 5945 // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5946 // cond: 5947 // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5948 for { 5949 c := v.AuxInt 5950 sym := v.Aux 5951 _ = v.Args[2] 5952 v_0 := v.Args[0] 5953 if v_0.Op != Op386ADDLconst { 5954 break 5955 } 5956 d := v_0.AuxInt 5957 ptr := v_0.Args[0] 5958 idx := v.Args[1] 5959 mem := v.Args[2] 5960 v.reset(Op386MOVSSloadidx1) 5961 v.AuxInt = int64(int32(c + d)) 5962 v.Aux = sym 5963 v.AddArg(ptr) 5964 v.AddArg(idx) 5965 v.AddArg(mem) 5966 return true 5967 } 5968 // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5969 // cond: 5970 // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5971 for { 5972 c := v.AuxInt 5973 sym := v.Aux 5974 _ = v.Args[2] 5975 ptr := v.Args[0] 5976 v_1 := v.Args[1] 5977 if v_1.Op != Op386ADDLconst { 5978 break 5979 } 5980 d := v_1.AuxInt 5981 idx := v_1.Args[0] 5982 mem := v.Args[2] 5983 v.reset(Op386MOVSSloadidx1) 5984 v.AuxInt = int64(int32(c + d)) 5985 v.Aux = sym 5986 v.AddArg(ptr) 5987 v.AddArg(idx) 5988 v.AddArg(mem) 5989 return true 5990 } 5991 return false 5992 } 5993 func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { 5994 // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 5995 // cond: 5996 // result: (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) 5997 for { 5998 c := v.AuxInt 5999 sym := v.Aux 6000 _ = v.Args[2] 6001 v_0 := v.Args[0] 6002 if v_0.Op != Op386ADDLconst { 6003 break 6004 } 6005 d := v_0.AuxInt 6006 ptr := v_0.Args[0] 6007 idx := v.Args[1] 6008 mem := v.Args[2] 6009 v.reset(Op386MOVSSloadidx4) 6010 v.AuxInt = int64(int32(c + d)) 6011 v.Aux = sym 6012 v.AddArg(ptr) 6013 v.AddArg(idx) 6014 v.AddArg(mem) 6015 return true 6016 } 6017 // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 6018 // cond: 6019 // result: (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) 6020 for { 6021 c := v.AuxInt 6022 sym := v.Aux 6023 _ = v.Args[2] 6024 ptr := v.Args[0] 6025 v_1 := v.Args[1] 6026 if v_1.Op != Op386ADDLconst { 6027 break 6028 } 6029 d := v_1.AuxInt 6030 idx := v_1.Args[0] 6031 mem := v.Args[2] 6032 v.reset(Op386MOVSSloadidx4) 6033 v.AuxInt = int64(int32(c + 4*d)) 6034 v.Aux = sym 6035 v.AddArg(ptr) 6036 v.AddArg(idx) 6037 v.AddArg(mem) 6038 return true 6039 } 6040 return false 6041 } 6042 func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { 6043 b := v.Block 6044 _ = b 6045 config := b.Func.Config 6046 _ = config 6047 // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 6048 // cond: is32Bit(off1+off2) 6049 // result: (MOVSSstore [off1+off2] {sym} ptr val mem) 6050 for { 6051 off1 := v.AuxInt 6052 sym := v.Aux 6053 _ = v.Args[2] 6054 v_0 := v.Args[0] 6055 if v_0.Op != Op386ADDLconst { 6056 break 6057 } 6058 off2 := v_0.AuxInt 6059 ptr := v_0.Args[0] 6060 val := v.Args[1] 6061 mem := v.Args[2] 6062 if !(is32Bit(off1 + off2)) { 6063 break 6064 } 6065 v.reset(Op386MOVSSstore) 6066 v.AuxInt = off1 + off2 6067 v.Aux = sym 6068 v.AddArg(ptr) 6069 v.AddArg(val) 6070 v.AddArg(mem) 6071 return true 6072 } 6073 // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 6074 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6075 // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 6076 for { 6077 off1 := v.AuxInt 6078 sym1 := v.Aux 6079 _ = v.Args[2] 6080 v_0 := v.Args[0] 6081 if v_0.Op != Op386LEAL { 6082 break 6083 } 6084 off2 := v_0.AuxInt 6085 sym2 := v_0.Aux 6086 base := v_0.Args[0] 6087 val := v.Args[1] 6088 mem := v.Args[2] 6089 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6090 break 6091 } 6092 v.reset(Op386MOVSSstore) 6093 v.AuxInt = off1 + off2 6094 v.Aux = mergeSym(sym1, sym2) 6095 v.AddArg(base) 6096 v.AddArg(val) 6097 v.AddArg(mem) 6098 return true 6099 } 6100 // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 6101 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6102 // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6103 for { 6104 off1 := v.AuxInt 6105 sym1 := v.Aux 6106 _ = v.Args[2] 6107 v_0 := v.Args[0] 6108 if v_0.Op != Op386LEAL1 { 6109 break 6110 } 6111 off2 := v_0.AuxInt 6112 sym2 := v_0.Aux 6113 _ = v_0.Args[1] 6114 ptr := v_0.Args[0] 6115 idx := v_0.Args[1] 6116 val := v.Args[1] 6117 mem := v.Args[2] 6118 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6119 break 6120 } 6121 v.reset(Op386MOVSSstoreidx1) 6122 v.AuxInt = off1 + off2 6123 v.Aux = mergeSym(sym1, sym2) 6124 v.AddArg(ptr) 6125 v.AddArg(idx) 6126 v.AddArg(val) 6127 v.AddArg(mem) 6128 return true 6129 } 6130 // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 6131 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6132 // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6133 for { 6134 off1 := v.AuxInt 6135 sym1 := v.Aux 6136 _ = v.Args[2] 6137 v_0 := v.Args[0] 6138 if v_0.Op != Op386LEAL4 { 6139 break 6140 } 6141 off2 := v_0.AuxInt 6142 sym2 := v_0.Aux 6143 _ = v_0.Args[1] 6144 ptr := v_0.Args[0] 6145 idx := v_0.Args[1] 6146 val := v.Args[1] 6147 mem := v.Args[2] 6148 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6149 break 6150 } 6151 v.reset(Op386MOVSSstoreidx4) 6152 v.AuxInt = off1 + off2 6153 v.Aux = mergeSym(sym1, sym2) 6154 v.AddArg(ptr) 6155 v.AddArg(idx) 6156 v.AddArg(val) 6157 v.AddArg(mem) 6158 return true 6159 } 6160 // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) 6161 // cond: ptr.Op != OpSB 6162 // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) 6163 for { 6164 off := v.AuxInt 6165 sym := v.Aux 6166 _ = v.Args[2] 6167 v_0 := v.Args[0] 6168 if v_0.Op != Op386ADDL { 6169 break 6170 } 6171 _ = v_0.Args[1] 6172 ptr := v_0.Args[0] 6173 idx := v_0.Args[1] 6174 val := v.Args[1] 6175 mem := v.Args[2] 6176 if !(ptr.Op != OpSB) { 6177 break 6178 } 6179 v.reset(Op386MOVSSstoreidx1) 6180 v.AuxInt = off 6181 v.Aux = sym 6182 v.AddArg(ptr) 6183 v.AddArg(idx) 6184 v.AddArg(val) 6185 v.AddArg(mem) 6186 return true 6187 } 6188 return false 6189 } 6190 func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { 6191 // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6192 // cond: 6193 // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6194 for { 6195 c := v.AuxInt 6196 sym := v.Aux 6197 _ = v.Args[3] 6198 v_0 := v.Args[0] 6199 if v_0.Op != Op386ADDLconst { 6200 break 6201 } 6202 d := v_0.AuxInt 6203 ptr := v_0.Args[0] 6204 idx := v.Args[1] 6205 val := v.Args[2] 6206 mem := v.Args[3] 6207 v.reset(Op386MOVSSstoreidx1) 6208 v.AuxInt = int64(int32(c + d)) 6209 v.Aux = sym 6210 v.AddArg(ptr) 6211 v.AddArg(idx) 6212 v.AddArg(val) 6213 v.AddArg(mem) 6214 return true 6215 } 6216 // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6217 // cond: 6218 // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6219 for { 6220 c := v.AuxInt 6221 sym := v.Aux 6222 _ = v.Args[3] 6223 ptr := v.Args[0] 6224 v_1 := v.Args[1] 6225 if v_1.Op != Op386ADDLconst { 6226 break 6227 } 6228 d := v_1.AuxInt 6229 idx := v_1.Args[0] 6230 val := v.Args[2] 6231 mem := v.Args[3] 6232 v.reset(Op386MOVSSstoreidx1) 6233 v.AuxInt = int64(int32(c + d)) 6234 v.Aux = sym 6235 v.AddArg(ptr) 6236 v.AddArg(idx) 6237 v.AddArg(val) 6238 v.AddArg(mem) 6239 return true 6240 } 6241 return false 6242 } 6243 func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { 6244 // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6245 // cond: 6246 // result: (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) 6247 for { 6248 c := v.AuxInt 6249 sym := v.Aux 6250 _ = v.Args[3] 6251 v_0 := v.Args[0] 6252 if v_0.Op != Op386ADDLconst { 6253 break 6254 } 6255 d := v_0.AuxInt 6256 ptr := v_0.Args[0] 6257 idx := v.Args[1] 6258 val := v.Args[2] 6259 mem := v.Args[3] 6260 v.reset(Op386MOVSSstoreidx4) 6261 v.AuxInt = int64(int32(c + d)) 6262 v.Aux = sym 6263 v.AddArg(ptr) 6264 v.AddArg(idx) 6265 v.AddArg(val) 6266 v.AddArg(mem) 6267 return true 6268 } 6269 // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6270 // cond: 6271 // result: (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) 6272 for { 6273 c := v.AuxInt 6274 sym := v.Aux 6275 _ = v.Args[3] 6276 ptr := v.Args[0] 6277 v_1 := v.Args[1] 6278 if v_1.Op != Op386ADDLconst { 6279 break 6280 } 6281 d := v_1.AuxInt 6282 idx := v_1.Args[0] 6283 val := v.Args[2] 6284 mem := v.Args[3] 6285 v.reset(Op386MOVSSstoreidx4) 6286 v.AuxInt = int64(int32(c + 4*d)) 6287 v.Aux = sym 6288 v.AddArg(ptr) 6289 v.AddArg(idx) 6290 v.AddArg(val) 6291 v.AddArg(mem) 6292 return true 6293 } 6294 return false 6295 } 6296 func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { 6297 b := v.Block 6298 _ = b 6299 // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) 6300 // cond: x.Uses == 1 && clobber(x) 6301 // result: @x.Block (MOVWLSXload <v.Type> [off] {sym} ptr mem) 6302 for { 6303 x := v.Args[0] 6304 if x.Op != Op386MOVWload { 6305 break 6306 } 6307 off := x.AuxInt 6308 sym := x.Aux 6309 _ = x.Args[1] 6310 ptr := x.Args[0] 6311 mem := x.Args[1] 6312 if !(x.Uses == 1 && clobber(x)) { 6313 break 6314 } 6315 b = x.Block 6316 v0 := b.NewValue0(v.Pos, Op386MOVWLSXload, v.Type) 6317 v.reset(OpCopy) 6318 v.AddArg(v0) 6319 v0.AuxInt = off 6320 v0.Aux = sym 6321 v0.AddArg(ptr) 6322 v0.AddArg(mem) 6323 return true 6324 } 6325 // match: (MOVWLSX (ANDLconst [c] x)) 6326 // cond: c & 0x8000 == 0 6327 // result: (ANDLconst [c & 0x7fff] x) 6328 for { 6329 v_0 := v.Args[0] 6330 if v_0.Op != Op386ANDLconst { 6331 break 6332 } 6333 c := v_0.AuxInt 6334 x := v_0.Args[0] 6335 if !(c&0x8000 == 0) { 6336 break 6337 } 6338 v.reset(Op386ANDLconst) 6339 v.AuxInt = c & 0x7fff 6340 v.AddArg(x) 6341 return true 6342 } 6343 return false 6344 } 6345 func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { 6346 b := v.Block 6347 _ = b 6348 config := b.Func.Config 6349 _ = config 6350 // match: (MOVWLSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6351 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6352 // result: (MOVWLSX x) 6353 for { 6354 off := v.AuxInt 6355 sym := v.Aux 6356 _ = v.Args[1] 6357 ptr := v.Args[0] 6358 v_1 := v.Args[1] 6359 if v_1.Op != Op386MOVWstore { 6360 break 6361 } 6362 off2 := v_1.AuxInt 6363 sym2 := v_1.Aux 6364 _ = v_1.Args[2] 6365 ptr2 := v_1.Args[0] 6366 x := v_1.Args[1] 6367 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6368 break 6369 } 6370 v.reset(Op386MOVWLSX) 6371 v.AddArg(x) 6372 return true 6373 } 6374 // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6375 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6376 // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6377 for { 6378 off1 := v.AuxInt 6379 sym1 := v.Aux 6380 _ = v.Args[1] 6381 v_0 := v.Args[0] 6382 if v_0.Op != Op386LEAL { 6383 break 6384 } 6385 off2 := v_0.AuxInt 6386 sym2 := v_0.Aux 6387 base := v_0.Args[0] 6388 mem := v.Args[1] 6389 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6390 break 6391 } 6392 v.reset(Op386MOVWLSXload) 6393 v.AuxInt = off1 + off2 6394 v.Aux = mergeSym(sym1, sym2) 6395 v.AddArg(base) 6396 v.AddArg(mem) 6397 return true 6398 } 6399 return false 6400 } 6401 func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { 6402 b := v.Block 6403 _ = b 6404 // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) 6405 // cond: x.Uses == 1 && clobber(x) 6406 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 6407 for { 6408 x := v.Args[0] 6409 if x.Op != Op386MOVWload { 6410 break 6411 } 6412 off := x.AuxInt 6413 sym := x.Aux 6414 _ = x.Args[1] 6415 ptr := x.Args[0] 6416 mem := x.Args[1] 6417 if !(x.Uses == 1 && clobber(x)) { 6418 break 6419 } 6420 b = x.Block 6421 v0 := b.NewValue0(v.Pos, Op386MOVWload, v.Type) 6422 v.reset(OpCopy) 6423 v.AddArg(v0) 6424 v0.AuxInt = off 6425 v0.Aux = sym 6426 v0.AddArg(ptr) 6427 v0.AddArg(mem) 6428 return true 6429 } 6430 // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) 6431 // cond: x.Uses == 1 && clobber(x) 6432 // result: @x.Block (MOVWloadidx1 <v.Type> [off] {sym} ptr idx mem) 6433 for { 6434 x := v.Args[0] 6435 if x.Op != Op386MOVWloadidx1 { 6436 break 6437 } 6438 off := x.AuxInt 6439 sym := x.Aux 6440 _ = x.Args[2] 6441 ptr := x.Args[0] 6442 idx := x.Args[1] 6443 mem := x.Args[2] 6444 if !(x.Uses == 1 && clobber(x)) { 6445 break 6446 } 6447 b = x.Block 6448 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 6449 v.reset(OpCopy) 6450 v.AddArg(v0) 6451 v0.AuxInt = off 6452 v0.Aux = sym 6453 v0.AddArg(ptr) 6454 v0.AddArg(idx) 6455 v0.AddArg(mem) 6456 return true 6457 } 6458 // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) 6459 // cond: x.Uses == 1 && clobber(x) 6460 // result: @x.Block (MOVWloadidx2 <v.Type> [off] {sym} ptr idx mem) 6461 for { 6462 x := v.Args[0] 6463 if x.Op != Op386MOVWloadidx2 { 6464 break 6465 } 6466 off := x.AuxInt 6467 sym := x.Aux 6468 _ = x.Args[2] 6469 ptr := x.Args[0] 6470 idx := x.Args[1] 6471 mem := x.Args[2] 6472 if !(x.Uses == 1 && clobber(x)) { 6473 break 6474 } 6475 b = x.Block 6476 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) 6477 v.reset(OpCopy) 6478 v.AddArg(v0) 6479 v0.AuxInt = off 6480 v0.Aux = sym 6481 v0.AddArg(ptr) 6482 v0.AddArg(idx) 6483 v0.AddArg(mem) 6484 return true 6485 } 6486 // match: (MOVWLZX (ANDLconst [c] x)) 6487 // cond: 6488 // result: (ANDLconst [c & 0xffff] x) 6489 for { 6490 v_0 := v.Args[0] 6491 if v_0.Op != Op386ANDLconst { 6492 break 6493 } 6494 c := v_0.AuxInt 6495 x := v_0.Args[0] 6496 v.reset(Op386ANDLconst) 6497 v.AuxInt = c & 0xffff 6498 v.AddArg(x) 6499 return true 6500 } 6501 return false 6502 } 6503 func rewriteValue386_Op386MOVWload_0(v *Value) bool { 6504 b := v.Block 6505 _ = b 6506 config := b.Func.Config 6507 _ = config 6508 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6509 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6510 // result: (MOVWLZX x) 6511 for { 6512 off := v.AuxInt 6513 sym := v.Aux 6514 _ = v.Args[1] 6515 ptr := v.Args[0] 6516 v_1 := v.Args[1] 6517 if v_1.Op != Op386MOVWstore { 6518 break 6519 } 6520 off2 := v_1.AuxInt 6521 sym2 := v_1.Aux 6522 _ = v_1.Args[2] 6523 ptr2 := v_1.Args[0] 6524 x := v_1.Args[1] 6525 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6526 break 6527 } 6528 v.reset(Op386MOVWLZX) 6529 v.AddArg(x) 6530 return true 6531 } 6532 // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) 6533 // cond: is32Bit(off1+off2) 6534 // result: (MOVWload [off1+off2] {sym} ptr mem) 6535 for { 6536 off1 := v.AuxInt 6537 sym := v.Aux 6538 _ = v.Args[1] 6539 v_0 := v.Args[0] 6540 if v_0.Op != Op386ADDLconst { 6541 break 6542 } 6543 off2 := v_0.AuxInt 6544 ptr := v_0.Args[0] 6545 mem := v.Args[1] 6546 if !(is32Bit(off1 + off2)) { 6547 break 6548 } 6549 v.reset(Op386MOVWload) 6550 v.AuxInt = off1 + off2 6551 v.Aux = sym 6552 v.AddArg(ptr) 6553 v.AddArg(mem) 6554 return true 6555 } 6556 // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6557 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6558 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6559 for { 6560 off1 := v.AuxInt 6561 sym1 := v.Aux 6562 _ = v.Args[1] 6563 v_0 := v.Args[0] 6564 if v_0.Op != Op386LEAL { 6565 break 6566 } 6567 off2 := v_0.AuxInt 6568 sym2 := v_0.Aux 6569 base := v_0.Args[0] 6570 mem := v.Args[1] 6571 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6572 break 6573 } 6574 v.reset(Op386MOVWload) 6575 v.AuxInt = off1 + off2 6576 v.Aux = mergeSym(sym1, sym2) 6577 v.AddArg(base) 6578 v.AddArg(mem) 6579 return true 6580 } 6581 // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 6582 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6583 // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6584 for { 6585 off1 := v.AuxInt 6586 sym1 := v.Aux 6587 _ = v.Args[1] 6588 v_0 := v.Args[0] 6589 if v_0.Op != Op386LEAL1 { 6590 break 6591 } 6592 off2 := v_0.AuxInt 6593 sym2 := v_0.Aux 6594 _ = v_0.Args[1] 6595 ptr := v_0.Args[0] 6596 idx := v_0.Args[1] 6597 mem := v.Args[1] 6598 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6599 break 6600 } 6601 v.reset(Op386MOVWloadidx1) 6602 v.AuxInt = off1 + off2 6603 v.Aux = mergeSym(sym1, sym2) 6604 v.AddArg(ptr) 6605 v.AddArg(idx) 6606 v.AddArg(mem) 6607 return true 6608 } 6609 // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) 6610 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6611 // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6612 for { 6613 off1 := v.AuxInt 6614 sym1 := v.Aux 6615 _ = v.Args[1] 6616 v_0 := v.Args[0] 6617 if v_0.Op != Op386LEAL2 { 6618 break 6619 } 6620 off2 := v_0.AuxInt 6621 sym2 := v_0.Aux 6622 _ = v_0.Args[1] 6623 ptr := v_0.Args[0] 6624 idx := v_0.Args[1] 6625 mem := v.Args[1] 6626 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6627 break 6628 } 6629 v.reset(Op386MOVWloadidx2) 6630 v.AuxInt = off1 + off2 6631 v.Aux = mergeSym(sym1, sym2) 6632 v.AddArg(ptr) 6633 v.AddArg(idx) 6634 v.AddArg(mem) 6635 return true 6636 } 6637 // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) 6638 // cond: ptr.Op != OpSB 6639 // result: (MOVWloadidx1 [off] {sym} ptr idx mem) 6640 for { 6641 off := v.AuxInt 6642 sym := v.Aux 6643 _ = v.Args[1] 6644 v_0 := v.Args[0] 6645 if v_0.Op != Op386ADDL { 6646 break 6647 } 6648 _ = v_0.Args[1] 6649 ptr := v_0.Args[0] 6650 idx := v_0.Args[1] 6651 mem := v.Args[1] 6652 if !(ptr.Op != OpSB) { 6653 break 6654 } 6655 v.reset(Op386MOVWloadidx1) 6656 v.AuxInt = off 6657 v.Aux = sym 6658 v.AddArg(ptr) 6659 v.AddArg(idx) 6660 v.AddArg(mem) 6661 return true 6662 } 6663 return false 6664 } 6665 func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { 6666 // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 6667 // cond: 6668 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6669 for { 6670 c := v.AuxInt 6671 sym := v.Aux 6672 _ = v.Args[2] 6673 ptr := v.Args[0] 6674 v_1 := v.Args[1] 6675 if v_1.Op != Op386SHLLconst { 6676 break 6677 } 6678 if v_1.AuxInt != 1 { 6679 break 6680 } 6681 idx := v_1.Args[0] 6682 mem := v.Args[2] 6683 v.reset(Op386MOVWloadidx2) 6684 v.AuxInt = c 6685 v.Aux = sym 6686 v.AddArg(ptr) 6687 v.AddArg(idx) 6688 v.AddArg(mem) 6689 return true 6690 } 6691 // match: (MOVWloadidx1 [c] {sym} (SHLLconst [1] idx) ptr mem) 6692 // cond: 6693 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6694 for { 6695 c := v.AuxInt 6696 sym := v.Aux 6697 _ = v.Args[2] 6698 v_0 := v.Args[0] 6699 if v_0.Op != Op386SHLLconst { 6700 break 6701 } 6702 if v_0.AuxInt != 1 { 6703 break 6704 } 6705 idx := v_0.Args[0] 6706 ptr := v.Args[1] 6707 mem := v.Args[2] 6708 v.reset(Op386MOVWloadidx2) 6709 v.AuxInt = c 6710 v.Aux = sym 6711 v.AddArg(ptr) 6712 v.AddArg(idx) 6713 v.AddArg(mem) 6714 return true 6715 } 6716 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 6717 // cond: 6718 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6719 for { 6720 c := v.AuxInt 6721 sym := v.Aux 6722 _ = v.Args[2] 6723 v_0 := v.Args[0] 6724 if v_0.Op != Op386ADDLconst { 6725 break 6726 } 6727 d := v_0.AuxInt 6728 ptr := v_0.Args[0] 6729 idx := v.Args[1] 6730 mem := v.Args[2] 6731 v.reset(Op386MOVWloadidx1) 6732 v.AuxInt = int64(int32(c + d)) 6733 v.Aux = sym 6734 v.AddArg(ptr) 6735 v.AddArg(idx) 6736 v.AddArg(mem) 6737 return true 6738 } 6739 // match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 6740 // cond: 6741 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6742 for { 6743 c := v.AuxInt 6744 sym := v.Aux 6745 _ = v.Args[2] 6746 idx := v.Args[0] 6747 v_1 := v.Args[1] 6748 if v_1.Op != Op386ADDLconst { 6749 break 6750 } 6751 d := v_1.AuxInt 6752 ptr := v_1.Args[0] 6753 mem := v.Args[2] 6754 v.reset(Op386MOVWloadidx1) 6755 v.AuxInt = int64(int32(c + d)) 6756 v.Aux = sym 6757 v.AddArg(ptr) 6758 v.AddArg(idx) 6759 v.AddArg(mem) 6760 return true 6761 } 6762 // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 6763 // cond: 6764 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6765 for { 6766 c := v.AuxInt 6767 sym := v.Aux 6768 _ = v.Args[2] 6769 ptr := v.Args[0] 6770 v_1 := v.Args[1] 6771 if v_1.Op != Op386ADDLconst { 6772 break 6773 } 6774 d := v_1.AuxInt 6775 idx := v_1.Args[0] 6776 mem := v.Args[2] 6777 v.reset(Op386MOVWloadidx1) 6778 v.AuxInt = int64(int32(c + d)) 6779 v.Aux = sym 6780 v.AddArg(ptr) 6781 v.AddArg(idx) 6782 v.AddArg(mem) 6783 return true 6784 } 6785 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 6786 // cond: 6787 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6788 for { 6789 c := v.AuxInt 6790 sym := v.Aux 6791 _ = v.Args[2] 6792 v_0 := v.Args[0] 6793 if v_0.Op != Op386ADDLconst { 6794 break 6795 } 6796 d := v_0.AuxInt 6797 idx := v_0.Args[0] 6798 ptr := v.Args[1] 6799 mem := v.Args[2] 6800 v.reset(Op386MOVWloadidx1) 6801 v.AuxInt = int64(int32(c + d)) 6802 v.Aux = sym 6803 v.AddArg(ptr) 6804 v.AddArg(idx) 6805 v.AddArg(mem) 6806 return true 6807 } 6808 return false 6809 } 6810 func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { 6811 // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) 6812 // cond: 6813 // result: (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem) 6814 for { 6815 c := v.AuxInt 6816 sym := v.Aux 6817 _ = v.Args[2] 6818 v_0 := v.Args[0] 6819 if v_0.Op != Op386ADDLconst { 6820 break 6821 } 6822 d := v_0.AuxInt 6823 ptr := v_0.Args[0] 6824 idx := v.Args[1] 6825 mem := v.Args[2] 6826 v.reset(Op386MOVWloadidx2) 6827 v.AuxInt = int64(int32(c + d)) 6828 v.Aux = sym 6829 v.AddArg(ptr) 6830 v.AddArg(idx) 6831 v.AddArg(mem) 6832 return true 6833 } 6834 // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) 6835 // cond: 6836 // result: (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem) 6837 for { 6838 c := v.AuxInt 6839 sym := v.Aux 6840 _ = v.Args[2] 6841 ptr := v.Args[0] 6842 v_1 := v.Args[1] 6843 if v_1.Op != Op386ADDLconst { 6844 break 6845 } 6846 d := v_1.AuxInt 6847 idx := v_1.Args[0] 6848 mem := v.Args[2] 6849 v.reset(Op386MOVWloadidx2) 6850 v.AuxInt = int64(int32(c + 2*d)) 6851 v.Aux = sym 6852 v.AddArg(ptr) 6853 v.AddArg(idx) 6854 v.AddArg(mem) 6855 return true 6856 } 6857 return false 6858 } 6859 func rewriteValue386_Op386MOVWstore_0(v *Value) bool { 6860 b := v.Block 6861 _ = b 6862 config := b.Func.Config 6863 _ = config 6864 // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) 6865 // cond: 6866 // result: (MOVWstore [off] {sym} ptr x mem) 6867 for { 6868 off := v.AuxInt 6869 sym := v.Aux 6870 _ = v.Args[2] 6871 ptr := v.Args[0] 6872 v_1 := v.Args[1] 6873 if v_1.Op != Op386MOVWLSX { 6874 break 6875 } 6876 x := v_1.Args[0] 6877 mem := v.Args[2] 6878 v.reset(Op386MOVWstore) 6879 v.AuxInt = off 6880 v.Aux = sym 6881 v.AddArg(ptr) 6882 v.AddArg(x) 6883 v.AddArg(mem) 6884 return true 6885 } 6886 // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) 6887 // cond: 6888 // result: (MOVWstore [off] {sym} ptr x mem) 6889 for { 6890 off := v.AuxInt 6891 sym := v.Aux 6892 _ = v.Args[2] 6893 ptr := v.Args[0] 6894 v_1 := v.Args[1] 6895 if v_1.Op != Op386MOVWLZX { 6896 break 6897 } 6898 x := v_1.Args[0] 6899 mem := v.Args[2] 6900 v.reset(Op386MOVWstore) 6901 v.AuxInt = off 6902 v.Aux = sym 6903 v.AddArg(ptr) 6904 v.AddArg(x) 6905 v.AddArg(mem) 6906 return true 6907 } 6908 // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 6909 // cond: is32Bit(off1+off2) 6910 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6911 for { 6912 off1 := v.AuxInt 6913 sym := v.Aux 6914 _ = v.Args[2] 6915 v_0 := v.Args[0] 6916 if v_0.Op != Op386ADDLconst { 6917 break 6918 } 6919 off2 := v_0.AuxInt 6920 ptr := v_0.Args[0] 6921 val := v.Args[1] 6922 mem := v.Args[2] 6923 if !(is32Bit(off1 + off2)) { 6924 break 6925 } 6926 v.reset(Op386MOVWstore) 6927 v.AuxInt = off1 + off2 6928 v.Aux = sym 6929 v.AddArg(ptr) 6930 v.AddArg(val) 6931 v.AddArg(mem) 6932 return true 6933 } 6934 // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) 6935 // cond: validOff(off) 6936 // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 6937 for { 6938 off := v.AuxInt 6939 sym := v.Aux 6940 _ = v.Args[2] 6941 ptr := v.Args[0] 6942 v_1 := v.Args[1] 6943 if v_1.Op != Op386MOVLconst { 6944 break 6945 } 6946 c := v_1.AuxInt 6947 mem := v.Args[2] 6948 if !(validOff(off)) { 6949 break 6950 } 6951 v.reset(Op386MOVWstoreconst) 6952 v.AuxInt = makeValAndOff(int64(int16(c)), off) 6953 v.Aux = sym 6954 v.AddArg(ptr) 6955 v.AddArg(mem) 6956 return true 6957 } 6958 // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 6959 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6960 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 6961 for { 6962 off1 := v.AuxInt 6963 sym1 := v.Aux 6964 _ = v.Args[2] 6965 v_0 := v.Args[0] 6966 if v_0.Op != Op386LEAL { 6967 break 6968 } 6969 off2 := v_0.AuxInt 6970 sym2 := v_0.Aux 6971 base := v_0.Args[0] 6972 val := v.Args[1] 6973 mem := v.Args[2] 6974 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6975 break 6976 } 6977 v.reset(Op386MOVWstore) 6978 v.AuxInt = off1 + off2 6979 v.Aux = mergeSym(sym1, sym2) 6980 v.AddArg(base) 6981 v.AddArg(val) 6982 v.AddArg(mem) 6983 return true 6984 } 6985 // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 6986 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6987 // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6988 for { 6989 off1 := v.AuxInt 6990 sym1 := v.Aux 6991 _ = v.Args[2] 6992 v_0 := v.Args[0] 6993 if v_0.Op != Op386LEAL1 { 6994 break 6995 } 6996 off2 := v_0.AuxInt 6997 sym2 := v_0.Aux 6998 _ = v_0.Args[1] 6999 ptr := v_0.Args[0] 7000 idx := v_0.Args[1] 7001 val := v.Args[1] 7002 mem := v.Args[2] 7003 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7004 break 7005 } 7006 v.reset(Op386MOVWstoreidx1) 7007 v.AuxInt = off1 + off2 7008 v.Aux = mergeSym(sym1, sym2) 7009 v.AddArg(ptr) 7010 v.AddArg(idx) 7011 v.AddArg(val) 7012 v.AddArg(mem) 7013 return true 7014 } 7015 // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) 7016 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7017 // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7018 for { 7019 off1 := v.AuxInt 7020 sym1 := v.Aux 7021 _ = v.Args[2] 7022 v_0 := v.Args[0] 7023 if v_0.Op != Op386LEAL2 { 7024 break 7025 } 7026 off2 := v_0.AuxInt 7027 sym2 := v_0.Aux 7028 _ = v_0.Args[1] 7029 ptr := v_0.Args[0] 7030 idx := v_0.Args[1] 7031 val := v.Args[1] 7032 mem := v.Args[2] 7033 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7034 break 7035 } 7036 v.reset(Op386MOVWstoreidx2) 7037 v.AuxInt = off1 + off2 7038 v.Aux = mergeSym(sym1, sym2) 7039 v.AddArg(ptr) 7040 v.AddArg(idx) 7041 v.AddArg(val) 7042 v.AddArg(mem) 7043 return true 7044 } 7045 // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) 7046 // cond: ptr.Op != OpSB 7047 // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) 7048 for { 7049 off := v.AuxInt 7050 sym := v.Aux 7051 _ = v.Args[2] 7052 v_0 := v.Args[0] 7053 if v_0.Op != Op386ADDL { 7054 break 7055 } 7056 _ = v_0.Args[1] 7057 ptr := v_0.Args[0] 7058 idx := v_0.Args[1] 7059 val := v.Args[1] 7060 mem := v.Args[2] 7061 if !(ptr.Op != OpSB) { 7062 break 7063 } 7064 v.reset(Op386MOVWstoreidx1) 7065 v.AuxInt = off 7066 v.Aux = sym 7067 v.AddArg(ptr) 7068 v.AddArg(idx) 7069 v.AddArg(val) 7070 v.AddArg(mem) 7071 return true 7072 } 7073 // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) 7074 // cond: x.Uses == 1 && clobber(x) 7075 // result: (MOVLstore [i-2] {s} p w mem) 7076 for { 7077 i := v.AuxInt 7078 s := v.Aux 7079 _ = v.Args[2] 7080 p := v.Args[0] 7081 v_1 := v.Args[1] 7082 if v_1.Op != Op386SHRLconst { 7083 break 7084 } 7085 if v_1.AuxInt != 16 { 7086 break 7087 } 7088 w := v_1.Args[0] 7089 x := v.Args[2] 7090 if x.Op != Op386MOVWstore { 7091 break 7092 } 7093 if x.AuxInt != i-2 { 7094 break 7095 } 7096 if x.Aux != s { 7097 break 7098 } 7099 _ = x.Args[2] 7100 if p != x.Args[0] { 7101 break 7102 } 7103 if w != x.Args[1] { 7104 break 7105 } 7106 mem := x.Args[2] 7107 if !(x.Uses == 1 && clobber(x)) { 7108 break 7109 } 7110 v.reset(Op386MOVLstore) 7111 v.AuxInt = i - 2 7112 v.Aux = s 7113 v.AddArg(p) 7114 v.AddArg(w) 7115 v.AddArg(mem) 7116 return true 7117 } 7118 // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) 7119 // cond: x.Uses == 1 && clobber(x) 7120 // result: (MOVLstore [i-2] {s} p w0 mem) 7121 for { 7122 i := v.AuxInt 7123 s := v.Aux 7124 _ = v.Args[2] 7125 p := v.Args[0] 7126 v_1 := v.Args[1] 7127 if v_1.Op != Op386SHRLconst { 7128 break 7129 } 7130 j := v_1.AuxInt 7131 w := v_1.Args[0] 7132 x := v.Args[2] 7133 if x.Op != Op386MOVWstore { 7134 break 7135 } 7136 if x.AuxInt != i-2 { 7137 break 7138 } 7139 if x.Aux != s { 7140 break 7141 } 7142 _ = x.Args[2] 7143 if p != x.Args[0] { 7144 break 7145 } 7146 w0 := x.Args[1] 7147 if w0.Op != Op386SHRLconst { 7148 break 7149 } 7150 if w0.AuxInt != j-16 { 7151 break 7152 } 7153 if w != w0.Args[0] { 7154 break 7155 } 7156 mem := x.Args[2] 7157 if !(x.Uses == 1 && clobber(x)) { 7158 break 7159 } 7160 v.reset(Op386MOVLstore) 7161 v.AuxInt = i - 2 7162 v.Aux = s 7163 v.AddArg(p) 7164 v.AddArg(w0) 7165 v.AddArg(mem) 7166 return true 7167 } 7168 return false 7169 } 7170 func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { 7171 b := v.Block 7172 _ = b 7173 config := b.Func.Config 7174 _ = config 7175 // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 7176 // cond: ValAndOff(sc).canAdd(off) 7177 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 7178 for { 7179 sc := v.AuxInt 7180 s := v.Aux 7181 _ = v.Args[1] 7182 v_0 := v.Args[0] 7183 if v_0.Op != Op386ADDLconst { 7184 break 7185 } 7186 off := v_0.AuxInt 7187 ptr := v_0.Args[0] 7188 mem := v.Args[1] 7189 if !(ValAndOff(sc).canAdd(off)) { 7190 break 7191 } 7192 v.reset(Op386MOVWstoreconst) 7193 v.AuxInt = ValAndOff(sc).add(off) 7194 v.Aux = s 7195 v.AddArg(ptr) 7196 v.AddArg(mem) 7197 return true 7198 } 7199 // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 7200 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 7201 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 7202 for { 7203 sc := v.AuxInt 7204 sym1 := v.Aux 7205 _ = v.Args[1] 7206 v_0 := v.Args[0] 7207 if v_0.Op != Op386LEAL { 7208 break 7209 } 7210 off := v_0.AuxInt 7211 sym2 := v_0.Aux 7212 ptr := v_0.Args[0] 7213 mem := v.Args[1] 7214 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 7215 break 7216 } 7217 v.reset(Op386MOVWstoreconst) 7218 v.AuxInt = ValAndOff(sc).add(off) 7219 v.Aux = mergeSym(sym1, sym2) 7220 v.AddArg(ptr) 7221 v.AddArg(mem) 7222 return true 7223 } 7224 // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 7225 // cond: canMergeSym(sym1, sym2) 7226 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 7227 for { 7228 x := v.AuxInt 7229 sym1 := v.Aux 7230 _ = v.Args[1] 7231 v_0 := v.Args[0] 7232 if v_0.Op != Op386LEAL1 { 7233 break 7234 } 7235 off := v_0.AuxInt 7236 sym2 := v_0.Aux 7237 _ = v_0.Args[1] 7238 ptr := v_0.Args[0] 7239 idx := v_0.Args[1] 7240 mem := v.Args[1] 7241 if !(canMergeSym(sym1, sym2)) { 7242 break 7243 } 7244 v.reset(Op386MOVWstoreconstidx1) 7245 v.AuxInt = ValAndOff(x).add(off) 7246 v.Aux = mergeSym(sym1, sym2) 7247 v.AddArg(ptr) 7248 v.AddArg(idx) 7249 v.AddArg(mem) 7250 return true 7251 } 7252 // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) 7253 // cond: canMergeSym(sym1, sym2) 7254 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 7255 for { 7256 x := v.AuxInt 7257 sym1 := v.Aux 7258 _ = v.Args[1] 7259 v_0 := v.Args[0] 7260 if v_0.Op != Op386LEAL2 { 7261 break 7262 } 7263 off := v_0.AuxInt 7264 sym2 := v_0.Aux 7265 _ = v_0.Args[1] 7266 ptr := v_0.Args[0] 7267 idx := v_0.Args[1] 7268 mem := v.Args[1] 7269 if !(canMergeSym(sym1, sym2)) { 7270 break 7271 } 7272 v.reset(Op386MOVWstoreconstidx2) 7273 v.AuxInt = ValAndOff(x).add(off) 7274 v.Aux = mergeSym(sym1, sym2) 7275 v.AddArg(ptr) 7276 v.AddArg(idx) 7277 v.AddArg(mem) 7278 return true 7279 } 7280 // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) 7281 // cond: 7282 // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) 7283 for { 7284 x := v.AuxInt 7285 sym := v.Aux 7286 _ = v.Args[1] 7287 v_0 := v.Args[0] 7288 if v_0.Op != Op386ADDL { 7289 break 7290 } 7291 _ = v_0.Args[1] 7292 ptr := v_0.Args[0] 7293 idx := v_0.Args[1] 7294 mem := v.Args[1] 7295 v.reset(Op386MOVWstoreconstidx1) 7296 v.AuxInt = x 7297 v.Aux = sym 7298 v.AddArg(ptr) 7299 v.AddArg(idx) 7300 v.AddArg(mem) 7301 return true 7302 } 7303 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 7304 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7305 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 7306 for { 7307 c := v.AuxInt 7308 s := v.Aux 7309 _ = v.Args[1] 7310 p := v.Args[0] 7311 x := v.Args[1] 7312 if x.Op != Op386MOVWstoreconst { 7313 break 7314 } 7315 a := x.AuxInt 7316 if x.Aux != s { 7317 break 7318 } 7319 _ = x.Args[1] 7320 if p != x.Args[0] { 7321 break 7322 } 7323 mem := x.Args[1] 7324 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7325 break 7326 } 7327 v.reset(Op386MOVLstoreconst) 7328 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7329 v.Aux = s 7330 v.AddArg(p) 7331 v.AddArg(mem) 7332 return true 7333 } 7334 return false 7335 } 7336 func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { 7337 // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 7338 // cond: 7339 // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) 7340 for { 7341 c := v.AuxInt 7342 sym := v.Aux 7343 _ = v.Args[2] 7344 ptr := v.Args[0] 7345 v_1 := v.Args[1] 7346 if v_1.Op != Op386SHLLconst { 7347 break 7348 } 7349 if v_1.AuxInt != 1 { 7350 break 7351 } 7352 idx := v_1.Args[0] 7353 mem := v.Args[2] 7354 v.reset(Op386MOVWstoreconstidx2) 7355 v.AuxInt = c 7356 v.Aux = sym 7357 v.AddArg(ptr) 7358 v.AddArg(idx) 7359 v.AddArg(mem) 7360 return true 7361 } 7362 // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 7363 // cond: 7364 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7365 for { 7366 x := v.AuxInt 7367 sym := v.Aux 7368 _ = v.Args[2] 7369 v_0 := v.Args[0] 7370 if v_0.Op != Op386ADDLconst { 7371 break 7372 } 7373 c := v_0.AuxInt 7374 ptr := v_0.Args[0] 7375 idx := v.Args[1] 7376 mem := v.Args[2] 7377 v.reset(Op386MOVWstoreconstidx1) 7378 v.AuxInt = ValAndOff(x).add(c) 7379 v.Aux = sym 7380 v.AddArg(ptr) 7381 v.AddArg(idx) 7382 v.AddArg(mem) 7383 return true 7384 } 7385 // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 7386 // cond: 7387 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7388 for { 7389 x := v.AuxInt 7390 sym := v.Aux 7391 _ = v.Args[2] 7392 ptr := v.Args[0] 7393 v_1 := v.Args[1] 7394 if v_1.Op != Op386ADDLconst { 7395 break 7396 } 7397 c := v_1.AuxInt 7398 idx := v_1.Args[0] 7399 mem := v.Args[2] 7400 v.reset(Op386MOVWstoreconstidx1) 7401 v.AuxInt = ValAndOff(x).add(c) 7402 v.Aux = sym 7403 v.AddArg(ptr) 7404 v.AddArg(idx) 7405 v.AddArg(mem) 7406 return true 7407 } 7408 // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) 7409 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7410 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) 7411 for { 7412 c := v.AuxInt 7413 s := v.Aux 7414 _ = v.Args[2] 7415 p := v.Args[0] 7416 i := v.Args[1] 7417 x := v.Args[2] 7418 if x.Op != Op386MOVWstoreconstidx1 { 7419 break 7420 } 7421 a := x.AuxInt 7422 if x.Aux != s { 7423 break 7424 } 7425 _ = x.Args[2] 7426 if p != x.Args[0] { 7427 break 7428 } 7429 if i != x.Args[1] { 7430 break 7431 } 7432 mem := x.Args[2] 7433 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7434 break 7435 } 7436 v.reset(Op386MOVLstoreconstidx1) 7437 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7438 v.Aux = s 7439 v.AddArg(p) 7440 v.AddArg(i) 7441 v.AddArg(mem) 7442 return true 7443 } 7444 return false 7445 } 7446 func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { 7447 b := v.Block 7448 _ = b 7449 // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) 7450 // cond: 7451 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7452 for { 7453 x := v.AuxInt 7454 sym := v.Aux 7455 _ = v.Args[2] 7456 v_0 := v.Args[0] 7457 if v_0.Op != Op386ADDLconst { 7458 break 7459 } 7460 c := v_0.AuxInt 7461 ptr := v_0.Args[0] 7462 idx := v.Args[1] 7463 mem := v.Args[2] 7464 v.reset(Op386MOVWstoreconstidx2) 7465 v.AuxInt = ValAndOff(x).add(c) 7466 v.Aux = sym 7467 v.AddArg(ptr) 7468 v.AddArg(idx) 7469 v.AddArg(mem) 7470 return true 7471 } 7472 // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) 7473 // cond: 7474 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) 7475 for { 7476 x := v.AuxInt 7477 sym := v.Aux 7478 _ = v.Args[2] 7479 ptr := v.Args[0] 7480 v_1 := v.Args[1] 7481 if v_1.Op != Op386ADDLconst { 7482 break 7483 } 7484 c := v_1.AuxInt 7485 idx := v_1.Args[0] 7486 mem := v.Args[2] 7487 v.reset(Op386MOVWstoreconstidx2) 7488 v.AuxInt = ValAndOff(x).add(2 * c) 7489 v.Aux = sym 7490 v.AddArg(ptr) 7491 v.AddArg(idx) 7492 v.AddArg(mem) 7493 return true 7494 } 7495 // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) 7496 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7497 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst <i.Type> [1] i) mem) 7498 for { 7499 c := v.AuxInt 7500 s := v.Aux 7501 _ = v.Args[2] 7502 p := v.Args[0] 7503 i := v.Args[1] 7504 x := v.Args[2] 7505 if x.Op != Op386MOVWstoreconstidx2 { 7506 break 7507 } 7508 a := x.AuxInt 7509 if x.Aux != s { 7510 break 7511 } 7512 _ = x.Args[2] 7513 if p != x.Args[0] { 7514 break 7515 } 7516 if i != x.Args[1] { 7517 break 7518 } 7519 mem := x.Args[2] 7520 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7521 break 7522 } 7523 v.reset(Op386MOVLstoreconstidx1) 7524 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7525 v.Aux = s 7526 v.AddArg(p) 7527 v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) 7528 v0.AuxInt = 1 7529 v0.AddArg(i) 7530 v.AddArg(v0) 7531 v.AddArg(mem) 7532 return true 7533 } 7534 return false 7535 } 7536 func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { 7537 // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) 7538 // cond: 7539 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7540 for { 7541 c := v.AuxInt 7542 sym := v.Aux 7543 _ = v.Args[3] 7544 ptr := v.Args[0] 7545 v_1 := v.Args[1] 7546 if v_1.Op != Op386SHLLconst { 7547 break 7548 } 7549 if v_1.AuxInt != 1 { 7550 break 7551 } 7552 idx := v_1.Args[0] 7553 val := v.Args[2] 7554 mem := v.Args[3] 7555 v.reset(Op386MOVWstoreidx2) 7556 v.AuxInt = c 7557 v.Aux = sym 7558 v.AddArg(ptr) 7559 v.AddArg(idx) 7560 v.AddArg(val) 7561 v.AddArg(mem) 7562 return true 7563 } 7564 // match: (MOVWstoreidx1 [c] {sym} (SHLLconst [1] idx) ptr val mem) 7565 // cond: 7566 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7567 for { 7568 c := v.AuxInt 7569 sym := v.Aux 7570 _ = v.Args[3] 7571 v_0 := v.Args[0] 7572 if v_0.Op != Op386SHLLconst { 7573 break 7574 } 7575 if v_0.AuxInt != 1 { 7576 break 7577 } 7578 idx := v_0.Args[0] 7579 ptr := v.Args[1] 7580 val := v.Args[2] 7581 mem := v.Args[3] 7582 v.reset(Op386MOVWstoreidx2) 7583 v.AuxInt = c 7584 v.Aux = sym 7585 v.AddArg(ptr) 7586 v.AddArg(idx) 7587 v.AddArg(val) 7588 v.AddArg(mem) 7589 return true 7590 } 7591 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 7592 // cond: 7593 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7594 for { 7595 c := v.AuxInt 7596 sym := v.Aux 7597 _ = v.Args[3] 7598 v_0 := v.Args[0] 7599 if v_0.Op != Op386ADDLconst { 7600 break 7601 } 7602 d := v_0.AuxInt 7603 ptr := v_0.Args[0] 7604 idx := v.Args[1] 7605 val := v.Args[2] 7606 mem := v.Args[3] 7607 v.reset(Op386MOVWstoreidx1) 7608 v.AuxInt = int64(int32(c + d)) 7609 v.Aux = sym 7610 v.AddArg(ptr) 7611 v.AddArg(idx) 7612 v.AddArg(val) 7613 v.AddArg(mem) 7614 return true 7615 } 7616 // match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 7617 // cond: 7618 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7619 for { 7620 c := v.AuxInt 7621 sym := v.Aux 7622 _ = v.Args[3] 7623 idx := v.Args[0] 7624 v_1 := v.Args[1] 7625 if v_1.Op != Op386ADDLconst { 7626 break 7627 } 7628 d := v_1.AuxInt 7629 ptr := v_1.Args[0] 7630 val := v.Args[2] 7631 mem := v.Args[3] 7632 v.reset(Op386MOVWstoreidx1) 7633 v.AuxInt = int64(int32(c + d)) 7634 v.Aux = sym 7635 v.AddArg(ptr) 7636 v.AddArg(idx) 7637 v.AddArg(val) 7638 v.AddArg(mem) 7639 return true 7640 } 7641 // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 7642 // cond: 7643 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7644 for { 7645 c := v.AuxInt 7646 sym := v.Aux 7647 _ = v.Args[3] 7648 ptr := v.Args[0] 7649 v_1 := v.Args[1] 7650 if v_1.Op != Op386ADDLconst { 7651 break 7652 } 7653 d := v_1.AuxInt 7654 idx := v_1.Args[0] 7655 val := v.Args[2] 7656 mem := v.Args[3] 7657 v.reset(Op386MOVWstoreidx1) 7658 v.AuxInt = int64(int32(c + d)) 7659 v.Aux = sym 7660 v.AddArg(ptr) 7661 v.AddArg(idx) 7662 v.AddArg(val) 7663 v.AddArg(mem) 7664 return true 7665 } 7666 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 7667 // cond: 7668 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7669 for { 7670 c := v.AuxInt 7671 sym := v.Aux 7672 _ = v.Args[3] 7673 v_0 := v.Args[0] 7674 if v_0.Op != Op386ADDLconst { 7675 break 7676 } 7677 d := v_0.AuxInt 7678 idx := v_0.Args[0] 7679 ptr := v.Args[1] 7680 val := v.Args[2] 7681 mem := v.Args[3] 7682 v.reset(Op386MOVWstoreidx1) 7683 v.AuxInt = int64(int32(c + d)) 7684 v.Aux = sym 7685 v.AddArg(ptr) 7686 v.AddArg(idx) 7687 v.AddArg(val) 7688 v.AddArg(mem) 7689 return true 7690 } 7691 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7692 // cond: x.Uses == 1 && clobber(x) 7693 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7694 for { 7695 i := v.AuxInt 7696 s := v.Aux 7697 _ = v.Args[3] 7698 p := v.Args[0] 7699 idx := v.Args[1] 7700 v_2 := v.Args[2] 7701 if v_2.Op != Op386SHRLconst { 7702 break 7703 } 7704 if v_2.AuxInt != 16 { 7705 break 7706 } 7707 w := v_2.Args[0] 7708 x := v.Args[3] 7709 if x.Op != Op386MOVWstoreidx1 { 7710 break 7711 } 7712 if x.AuxInt != i-2 { 7713 break 7714 } 7715 if x.Aux != s { 7716 break 7717 } 7718 _ = x.Args[3] 7719 if p != x.Args[0] { 7720 break 7721 } 7722 if idx != x.Args[1] { 7723 break 7724 } 7725 if w != x.Args[2] { 7726 break 7727 } 7728 mem := x.Args[3] 7729 if !(x.Uses == 1 && clobber(x)) { 7730 break 7731 } 7732 v.reset(Op386MOVLstoreidx1) 7733 v.AuxInt = i - 2 7734 v.Aux = s 7735 v.AddArg(p) 7736 v.AddArg(idx) 7737 v.AddArg(w) 7738 v.AddArg(mem) 7739 return true 7740 } 7741 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7742 // cond: x.Uses == 1 && clobber(x) 7743 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7744 for { 7745 i := v.AuxInt 7746 s := v.Aux 7747 _ = v.Args[3] 7748 p := v.Args[0] 7749 idx := v.Args[1] 7750 v_2 := v.Args[2] 7751 if v_2.Op != Op386SHRLconst { 7752 break 7753 } 7754 if v_2.AuxInt != 16 { 7755 break 7756 } 7757 w := v_2.Args[0] 7758 x := v.Args[3] 7759 if x.Op != Op386MOVWstoreidx1 { 7760 break 7761 } 7762 if x.AuxInt != i-2 { 7763 break 7764 } 7765 if x.Aux != s { 7766 break 7767 } 7768 _ = x.Args[3] 7769 if idx != x.Args[0] { 7770 break 7771 } 7772 if p != x.Args[1] { 7773 break 7774 } 7775 if w != x.Args[2] { 7776 break 7777 } 7778 mem := x.Args[3] 7779 if !(x.Uses == 1 && clobber(x)) { 7780 break 7781 } 7782 v.reset(Op386MOVLstoreidx1) 7783 v.AuxInt = i - 2 7784 v.Aux = s 7785 v.AddArg(p) 7786 v.AddArg(idx) 7787 v.AddArg(w) 7788 v.AddArg(mem) 7789 return true 7790 } 7791 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7792 // cond: x.Uses == 1 && clobber(x) 7793 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7794 for { 7795 i := v.AuxInt 7796 s := v.Aux 7797 _ = v.Args[3] 7798 idx := v.Args[0] 7799 p := v.Args[1] 7800 v_2 := v.Args[2] 7801 if v_2.Op != Op386SHRLconst { 7802 break 7803 } 7804 if v_2.AuxInt != 16 { 7805 break 7806 } 7807 w := v_2.Args[0] 7808 x := v.Args[3] 7809 if x.Op != Op386MOVWstoreidx1 { 7810 break 7811 } 7812 if x.AuxInt != i-2 { 7813 break 7814 } 7815 if x.Aux != s { 7816 break 7817 } 7818 _ = x.Args[3] 7819 if p != x.Args[0] { 7820 break 7821 } 7822 if idx != x.Args[1] { 7823 break 7824 } 7825 if w != x.Args[2] { 7826 break 7827 } 7828 mem := x.Args[3] 7829 if !(x.Uses == 1 && clobber(x)) { 7830 break 7831 } 7832 v.reset(Op386MOVLstoreidx1) 7833 v.AuxInt = i - 2 7834 v.Aux = s 7835 v.AddArg(p) 7836 v.AddArg(idx) 7837 v.AddArg(w) 7838 v.AddArg(mem) 7839 return true 7840 } 7841 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7842 // cond: x.Uses == 1 && clobber(x) 7843 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7844 for { 7845 i := v.AuxInt 7846 s := v.Aux 7847 _ = v.Args[3] 7848 idx := v.Args[0] 7849 p := v.Args[1] 7850 v_2 := v.Args[2] 7851 if v_2.Op != Op386SHRLconst { 7852 break 7853 } 7854 if v_2.AuxInt != 16 { 7855 break 7856 } 7857 w := v_2.Args[0] 7858 x := v.Args[3] 7859 if x.Op != Op386MOVWstoreidx1 { 7860 break 7861 } 7862 if x.AuxInt != i-2 { 7863 break 7864 } 7865 if x.Aux != s { 7866 break 7867 } 7868 _ = x.Args[3] 7869 if idx != x.Args[0] { 7870 break 7871 } 7872 if p != x.Args[1] { 7873 break 7874 } 7875 if w != x.Args[2] { 7876 break 7877 } 7878 mem := x.Args[3] 7879 if !(x.Uses == 1 && clobber(x)) { 7880 break 7881 } 7882 v.reset(Op386MOVLstoreidx1) 7883 v.AuxInt = i - 2 7884 v.Aux = s 7885 v.AddArg(p) 7886 v.AddArg(idx) 7887 v.AddArg(w) 7888 v.AddArg(mem) 7889 return true 7890 } 7891 return false 7892 } 7893 func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { 7894 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7895 // cond: x.Uses == 1 && clobber(x) 7896 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7897 for { 7898 i := v.AuxInt 7899 s := v.Aux 7900 _ = v.Args[3] 7901 p := v.Args[0] 7902 idx := v.Args[1] 7903 v_2 := v.Args[2] 7904 if v_2.Op != Op386SHRLconst { 7905 break 7906 } 7907 j := v_2.AuxInt 7908 w := v_2.Args[0] 7909 x := v.Args[3] 7910 if x.Op != Op386MOVWstoreidx1 { 7911 break 7912 } 7913 if x.AuxInt != i-2 { 7914 break 7915 } 7916 if x.Aux != s { 7917 break 7918 } 7919 _ = x.Args[3] 7920 if p != x.Args[0] { 7921 break 7922 } 7923 if idx != x.Args[1] { 7924 break 7925 } 7926 w0 := x.Args[2] 7927 if w0.Op != Op386SHRLconst { 7928 break 7929 } 7930 if w0.AuxInt != j-16 { 7931 break 7932 } 7933 if w != w0.Args[0] { 7934 break 7935 } 7936 mem := x.Args[3] 7937 if !(x.Uses == 1 && clobber(x)) { 7938 break 7939 } 7940 v.reset(Op386MOVLstoreidx1) 7941 v.AuxInt = i - 2 7942 v.Aux = s 7943 v.AddArg(p) 7944 v.AddArg(idx) 7945 v.AddArg(w0) 7946 v.AddArg(mem) 7947 return true 7948 } 7949 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 7950 // cond: x.Uses == 1 && clobber(x) 7951 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7952 for { 7953 i := v.AuxInt 7954 s := v.Aux 7955 _ = v.Args[3] 7956 p := v.Args[0] 7957 idx := v.Args[1] 7958 v_2 := v.Args[2] 7959 if v_2.Op != Op386SHRLconst { 7960 break 7961 } 7962 j := v_2.AuxInt 7963 w := v_2.Args[0] 7964 x := v.Args[3] 7965 if x.Op != Op386MOVWstoreidx1 { 7966 break 7967 } 7968 if x.AuxInt != i-2 { 7969 break 7970 } 7971 if x.Aux != s { 7972 break 7973 } 7974 _ = x.Args[3] 7975 if idx != x.Args[0] { 7976 break 7977 } 7978 if p != x.Args[1] { 7979 break 7980 } 7981 w0 := x.Args[2] 7982 if w0.Op != Op386SHRLconst { 7983 break 7984 } 7985 if w0.AuxInt != j-16 { 7986 break 7987 } 7988 if w != w0.Args[0] { 7989 break 7990 } 7991 mem := x.Args[3] 7992 if !(x.Uses == 1 && clobber(x)) { 7993 break 7994 } 7995 v.reset(Op386MOVLstoreidx1) 7996 v.AuxInt = i - 2 7997 v.Aux = s 7998 v.AddArg(p) 7999 v.AddArg(idx) 8000 v.AddArg(w0) 8001 v.AddArg(mem) 8002 return true 8003 } 8004 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 8005 // cond: x.Uses == 1 && clobber(x) 8006 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 8007 for { 8008 i := v.AuxInt 8009 s := v.Aux 8010 _ = v.Args[3] 8011 idx := v.Args[0] 8012 p := v.Args[1] 8013 v_2 := v.Args[2] 8014 if v_2.Op != Op386SHRLconst { 8015 break 8016 } 8017 j := v_2.AuxInt 8018 w := v_2.Args[0] 8019 x := v.Args[3] 8020 if x.Op != Op386MOVWstoreidx1 { 8021 break 8022 } 8023 if x.AuxInt != i-2 { 8024 break 8025 } 8026 if x.Aux != s { 8027 break 8028 } 8029 _ = x.Args[3] 8030 if p != x.Args[0] { 8031 break 8032 } 8033 if idx != x.Args[1] { 8034 break 8035 } 8036 w0 := x.Args[2] 8037 if w0.Op != Op386SHRLconst { 8038 break 8039 } 8040 if w0.AuxInt != j-16 { 8041 break 8042 } 8043 if w != w0.Args[0] { 8044 break 8045 } 8046 mem := x.Args[3] 8047 if !(x.Uses == 1 && clobber(x)) { 8048 break 8049 } 8050 v.reset(Op386MOVLstoreidx1) 8051 v.AuxInt = i - 2 8052 v.Aux = s 8053 v.AddArg(p) 8054 v.AddArg(idx) 8055 v.AddArg(w0) 8056 v.AddArg(mem) 8057 return true 8058 } 8059 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 8060 // cond: x.Uses == 1 && clobber(x) 8061 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 8062 for { 8063 i := v.AuxInt 8064 s := v.Aux 8065 _ = v.Args[3] 8066 idx := v.Args[0] 8067 p := v.Args[1] 8068 v_2 := v.Args[2] 8069 if v_2.Op != Op386SHRLconst { 8070 break 8071 } 8072 j := v_2.AuxInt 8073 w := v_2.Args[0] 8074 x := v.Args[3] 8075 if x.Op != Op386MOVWstoreidx1 { 8076 break 8077 } 8078 if x.AuxInt != i-2 { 8079 break 8080 } 8081 if x.Aux != s { 8082 break 8083 } 8084 _ = x.Args[3] 8085 if idx != x.Args[0] { 8086 break 8087 } 8088 if p != x.Args[1] { 8089 break 8090 } 8091 w0 := x.Args[2] 8092 if w0.Op != Op386SHRLconst { 8093 break 8094 } 8095 if w0.AuxInt != j-16 { 8096 break 8097 } 8098 if w != w0.Args[0] { 8099 break 8100 } 8101 mem := x.Args[3] 8102 if !(x.Uses == 1 && clobber(x)) { 8103 break 8104 } 8105 v.reset(Op386MOVLstoreidx1) 8106 v.AuxInt = i - 2 8107 v.Aux = s 8108 v.AddArg(p) 8109 v.AddArg(idx) 8110 v.AddArg(w0) 8111 v.AddArg(mem) 8112 return true 8113 } 8114 return false 8115 } 8116 func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { 8117 b := v.Block 8118 _ = b 8119 // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) 8120 // cond: 8121 // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem) 8122 for { 8123 c := v.AuxInt 8124 sym := v.Aux 8125 _ = v.Args[3] 8126 v_0 := v.Args[0] 8127 if v_0.Op != Op386ADDLconst { 8128 break 8129 } 8130 d := v_0.AuxInt 8131 ptr := v_0.Args[0] 8132 idx := v.Args[1] 8133 val := v.Args[2] 8134 mem := v.Args[3] 8135 v.reset(Op386MOVWstoreidx2) 8136 v.AuxInt = int64(int32(c + d)) 8137 v.Aux = sym 8138 v.AddArg(ptr) 8139 v.AddArg(idx) 8140 v.AddArg(val) 8141 v.AddArg(mem) 8142 return true 8143 } 8144 // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) 8145 // cond: 8146 // result: (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem) 8147 for { 8148 c := v.AuxInt 8149 sym := v.Aux 8150 _ = v.Args[3] 8151 ptr := v.Args[0] 8152 v_1 := v.Args[1] 8153 if v_1.Op != Op386ADDLconst { 8154 break 8155 } 8156 d := v_1.AuxInt 8157 idx := v_1.Args[0] 8158 val := v.Args[2] 8159 mem := v.Args[3] 8160 v.reset(Op386MOVWstoreidx2) 8161 v.AuxInt = int64(int32(c + 2*d)) 8162 v.Aux = sym 8163 v.AddArg(ptr) 8164 v.AddArg(idx) 8165 v.AddArg(val) 8166 v.AddArg(mem) 8167 return true 8168 } 8169 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) 8170 // cond: x.Uses == 1 && clobber(x) 8171 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w mem) 8172 for { 8173 i := v.AuxInt 8174 s := v.Aux 8175 _ = v.Args[3] 8176 p := v.Args[0] 8177 idx := v.Args[1] 8178 v_2 := v.Args[2] 8179 if v_2.Op != Op386SHRLconst { 8180 break 8181 } 8182 if v_2.AuxInt != 16 { 8183 break 8184 } 8185 w := v_2.Args[0] 8186 x := v.Args[3] 8187 if x.Op != Op386MOVWstoreidx2 { 8188 break 8189 } 8190 if x.AuxInt != i-2 { 8191 break 8192 } 8193 if x.Aux != s { 8194 break 8195 } 8196 _ = x.Args[3] 8197 if p != x.Args[0] { 8198 break 8199 } 8200 if idx != x.Args[1] { 8201 break 8202 } 8203 if w != x.Args[2] { 8204 break 8205 } 8206 mem := x.Args[3] 8207 if !(x.Uses == 1 && clobber(x)) { 8208 break 8209 } 8210 v.reset(Op386MOVLstoreidx1) 8211 v.AuxInt = i - 2 8212 v.Aux = s 8213 v.AddArg(p) 8214 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 8215 v0.AuxInt = 1 8216 v0.AddArg(idx) 8217 v.AddArg(v0) 8218 v.AddArg(w) 8219 v.AddArg(mem) 8220 return true 8221 } 8222 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 8223 // cond: x.Uses == 1 && clobber(x) 8224 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w0 mem) 8225 for { 8226 i := v.AuxInt 8227 s := v.Aux 8228 _ = v.Args[3] 8229 p := v.Args[0] 8230 idx := v.Args[1] 8231 v_2 := v.Args[2] 8232 if v_2.Op != Op386SHRLconst { 8233 break 8234 } 8235 j := v_2.AuxInt 8236 w := v_2.Args[0] 8237 x := v.Args[3] 8238 if x.Op != Op386MOVWstoreidx2 { 8239 break 8240 } 8241 if x.AuxInt != i-2 { 8242 break 8243 } 8244 if x.Aux != s { 8245 break 8246 } 8247 _ = x.Args[3] 8248 if p != x.Args[0] { 8249 break 8250 } 8251 if idx != x.Args[1] { 8252 break 8253 } 8254 w0 := x.Args[2] 8255 if w0.Op != Op386SHRLconst { 8256 break 8257 } 8258 if w0.AuxInt != j-16 { 8259 break 8260 } 8261 if w != w0.Args[0] { 8262 break 8263 } 8264 mem := x.Args[3] 8265 if !(x.Uses == 1 && clobber(x)) { 8266 break 8267 } 8268 v.reset(Op386MOVLstoreidx1) 8269 v.AuxInt = i - 2 8270 v.Aux = s 8271 v.AddArg(p) 8272 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 8273 v0.AuxInt = 1 8274 v0.AddArg(idx) 8275 v.AddArg(v0) 8276 v.AddArg(w0) 8277 v.AddArg(mem) 8278 return true 8279 } 8280 return false 8281 } 8282 func rewriteValue386_Op386MULL_0(v *Value) bool { 8283 // match: (MULL x (MOVLconst [c])) 8284 // cond: 8285 // result: (MULLconst [c] x) 8286 for { 8287 _ = v.Args[1] 8288 x := v.Args[0] 8289 v_1 := v.Args[1] 8290 if v_1.Op != Op386MOVLconst { 8291 break 8292 } 8293 c := v_1.AuxInt 8294 v.reset(Op386MULLconst) 8295 v.AuxInt = c 8296 v.AddArg(x) 8297 return true 8298 } 8299 // match: (MULL (MOVLconst [c]) x) 8300 // cond: 8301 // result: (MULLconst [c] x) 8302 for { 8303 _ = v.Args[1] 8304 v_0 := v.Args[0] 8305 if v_0.Op != Op386MOVLconst { 8306 break 8307 } 8308 c := v_0.AuxInt 8309 x := v.Args[1] 8310 v.reset(Op386MULLconst) 8311 v.AuxInt = c 8312 v.AddArg(x) 8313 return true 8314 } 8315 return false 8316 } 8317 func rewriteValue386_Op386MULLconst_0(v *Value) bool { 8318 b := v.Block 8319 _ = b 8320 // match: (MULLconst [c] (MULLconst [d] x)) 8321 // cond: 8322 // result: (MULLconst [int64(int32(c * d))] x) 8323 for { 8324 c := v.AuxInt 8325 v_0 := v.Args[0] 8326 if v_0.Op != Op386MULLconst { 8327 break 8328 } 8329 d := v_0.AuxInt 8330 x := v_0.Args[0] 8331 v.reset(Op386MULLconst) 8332 v.AuxInt = int64(int32(c * d)) 8333 v.AddArg(x) 8334 return true 8335 } 8336 // match: (MULLconst [-1] x) 8337 // cond: 8338 // result: (NEGL x) 8339 for { 8340 if v.AuxInt != -1 { 8341 break 8342 } 8343 x := v.Args[0] 8344 v.reset(Op386NEGL) 8345 v.AddArg(x) 8346 return true 8347 } 8348 // match: (MULLconst [0] _) 8349 // cond: 8350 // result: (MOVLconst [0]) 8351 for { 8352 if v.AuxInt != 0 { 8353 break 8354 } 8355 v.reset(Op386MOVLconst) 8356 v.AuxInt = 0 8357 return true 8358 } 8359 // match: (MULLconst [1] x) 8360 // cond: 8361 // result: x 8362 for { 8363 if v.AuxInt != 1 { 8364 break 8365 } 8366 x := v.Args[0] 8367 v.reset(OpCopy) 8368 v.Type = x.Type 8369 v.AddArg(x) 8370 return true 8371 } 8372 // match: (MULLconst [3] x) 8373 // cond: 8374 // result: (LEAL2 x x) 8375 for { 8376 if v.AuxInt != 3 { 8377 break 8378 } 8379 x := v.Args[0] 8380 v.reset(Op386LEAL2) 8381 v.AddArg(x) 8382 v.AddArg(x) 8383 return true 8384 } 8385 // match: (MULLconst [5] x) 8386 // cond: 8387 // result: (LEAL4 x x) 8388 for { 8389 if v.AuxInt != 5 { 8390 break 8391 } 8392 x := v.Args[0] 8393 v.reset(Op386LEAL4) 8394 v.AddArg(x) 8395 v.AddArg(x) 8396 return true 8397 } 8398 // match: (MULLconst [7] x) 8399 // cond: 8400 // result: (LEAL8 (NEGL <v.Type> x) x) 8401 for { 8402 if v.AuxInt != 7 { 8403 break 8404 } 8405 x := v.Args[0] 8406 v.reset(Op386LEAL8) 8407 v0 := b.NewValue0(v.Pos, Op386NEGL, v.Type) 8408 v0.AddArg(x) 8409 v.AddArg(v0) 8410 v.AddArg(x) 8411 return true 8412 } 8413 // match: (MULLconst [9] x) 8414 // cond: 8415 // result: (LEAL8 x x) 8416 for { 8417 if v.AuxInt != 9 { 8418 break 8419 } 8420 x := v.Args[0] 8421 v.reset(Op386LEAL8) 8422 v.AddArg(x) 8423 v.AddArg(x) 8424 return true 8425 } 8426 // match: (MULLconst [11] x) 8427 // cond: 8428 // result: (LEAL2 x (LEAL4 <v.Type> x x)) 8429 for { 8430 if v.AuxInt != 11 { 8431 break 8432 } 8433 x := v.Args[0] 8434 v.reset(Op386LEAL2) 8435 v.AddArg(x) 8436 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8437 v0.AddArg(x) 8438 v0.AddArg(x) 8439 v.AddArg(v0) 8440 return true 8441 } 8442 // match: (MULLconst [13] x) 8443 // cond: 8444 // result: (LEAL4 x (LEAL2 <v.Type> x x)) 8445 for { 8446 if v.AuxInt != 13 { 8447 break 8448 } 8449 x := v.Args[0] 8450 v.reset(Op386LEAL4) 8451 v.AddArg(x) 8452 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8453 v0.AddArg(x) 8454 v0.AddArg(x) 8455 v.AddArg(v0) 8456 return true 8457 } 8458 return false 8459 } 8460 func rewriteValue386_Op386MULLconst_10(v *Value) bool { 8461 b := v.Block 8462 _ = b 8463 // match: (MULLconst [21] x) 8464 // cond: 8465 // result: (LEAL4 x (LEAL4 <v.Type> x x)) 8466 for { 8467 if v.AuxInt != 21 { 8468 break 8469 } 8470 x := v.Args[0] 8471 v.reset(Op386LEAL4) 8472 v.AddArg(x) 8473 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8474 v0.AddArg(x) 8475 v0.AddArg(x) 8476 v.AddArg(v0) 8477 return true 8478 } 8479 // match: (MULLconst [25] x) 8480 // cond: 8481 // result: (LEAL8 x (LEAL2 <v.Type> x x)) 8482 for { 8483 if v.AuxInt != 25 { 8484 break 8485 } 8486 x := v.Args[0] 8487 v.reset(Op386LEAL8) 8488 v.AddArg(x) 8489 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8490 v0.AddArg(x) 8491 v0.AddArg(x) 8492 v.AddArg(v0) 8493 return true 8494 } 8495 // match: (MULLconst [37] x) 8496 // cond: 8497 // result: (LEAL4 x (LEAL8 <v.Type> x x)) 8498 for { 8499 if v.AuxInt != 37 { 8500 break 8501 } 8502 x := v.Args[0] 8503 v.reset(Op386LEAL4) 8504 v.AddArg(x) 8505 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8506 v0.AddArg(x) 8507 v0.AddArg(x) 8508 v.AddArg(v0) 8509 return true 8510 } 8511 // match: (MULLconst [41] x) 8512 // cond: 8513 // result: (LEAL8 x (LEAL4 <v.Type> x x)) 8514 for { 8515 if v.AuxInt != 41 { 8516 break 8517 } 8518 x := v.Args[0] 8519 v.reset(Op386LEAL8) 8520 v.AddArg(x) 8521 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8522 v0.AddArg(x) 8523 v0.AddArg(x) 8524 v.AddArg(v0) 8525 return true 8526 } 8527 // match: (MULLconst [73] x) 8528 // cond: 8529 // result: (LEAL8 x (LEAL8 <v.Type> x x)) 8530 for { 8531 if v.AuxInt != 73 { 8532 break 8533 } 8534 x := v.Args[0] 8535 v.reset(Op386LEAL8) 8536 v.AddArg(x) 8537 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8538 v0.AddArg(x) 8539 v0.AddArg(x) 8540 v.AddArg(v0) 8541 return true 8542 } 8543 // match: (MULLconst [c] x) 8544 // cond: isPowerOfTwo(c) 8545 // result: (SHLLconst [log2(c)] x) 8546 for { 8547 c := v.AuxInt 8548 x := v.Args[0] 8549 if !(isPowerOfTwo(c)) { 8550 break 8551 } 8552 v.reset(Op386SHLLconst) 8553 v.AuxInt = log2(c) 8554 v.AddArg(x) 8555 return true 8556 } 8557 // match: (MULLconst [c] x) 8558 // cond: isPowerOfTwo(c+1) && c >= 15 8559 // result: (SUBL (SHLLconst <v.Type> [log2(c+1)] x) x) 8560 for { 8561 c := v.AuxInt 8562 x := v.Args[0] 8563 if !(isPowerOfTwo(c+1) && c >= 15) { 8564 break 8565 } 8566 v.reset(Op386SUBL) 8567 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8568 v0.AuxInt = log2(c + 1) 8569 v0.AddArg(x) 8570 v.AddArg(v0) 8571 v.AddArg(x) 8572 return true 8573 } 8574 // match: (MULLconst [c] x) 8575 // cond: isPowerOfTwo(c-1) && c >= 17 8576 // result: (LEAL1 (SHLLconst <v.Type> [log2(c-1)] x) x) 8577 for { 8578 c := v.AuxInt 8579 x := v.Args[0] 8580 if !(isPowerOfTwo(c-1) && c >= 17) { 8581 break 8582 } 8583 v.reset(Op386LEAL1) 8584 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8585 v0.AuxInt = log2(c - 1) 8586 v0.AddArg(x) 8587 v.AddArg(v0) 8588 v.AddArg(x) 8589 return true 8590 } 8591 // match: (MULLconst [c] x) 8592 // cond: isPowerOfTwo(c-2) && c >= 34 8593 // result: (LEAL2 (SHLLconst <v.Type> [log2(c-2)] x) x) 8594 for { 8595 c := v.AuxInt 8596 x := v.Args[0] 8597 if !(isPowerOfTwo(c-2) && c >= 34) { 8598 break 8599 } 8600 v.reset(Op386LEAL2) 8601 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8602 v0.AuxInt = log2(c - 2) 8603 v0.AddArg(x) 8604 v.AddArg(v0) 8605 v.AddArg(x) 8606 return true 8607 } 8608 // match: (MULLconst [c] x) 8609 // cond: isPowerOfTwo(c-4) && c >= 68 8610 // result: (LEAL4 (SHLLconst <v.Type> [log2(c-4)] x) x) 8611 for { 8612 c := v.AuxInt 8613 x := v.Args[0] 8614 if !(isPowerOfTwo(c-4) && c >= 68) { 8615 break 8616 } 8617 v.reset(Op386LEAL4) 8618 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8619 v0.AuxInt = log2(c - 4) 8620 v0.AddArg(x) 8621 v.AddArg(v0) 8622 v.AddArg(x) 8623 return true 8624 } 8625 return false 8626 } 8627 func rewriteValue386_Op386MULLconst_20(v *Value) bool { 8628 b := v.Block 8629 _ = b 8630 // match: (MULLconst [c] x) 8631 // cond: isPowerOfTwo(c-8) && c >= 136 8632 // result: (LEAL8 (SHLLconst <v.Type> [log2(c-8)] x) x) 8633 for { 8634 c := v.AuxInt 8635 x := v.Args[0] 8636 if !(isPowerOfTwo(c-8) && c >= 136) { 8637 break 8638 } 8639 v.reset(Op386LEAL8) 8640 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8641 v0.AuxInt = log2(c - 8) 8642 v0.AddArg(x) 8643 v.AddArg(v0) 8644 v.AddArg(x) 8645 return true 8646 } 8647 // match: (MULLconst [c] x) 8648 // cond: c%3 == 0 && isPowerOfTwo(c/3) 8649 // result: (SHLLconst [log2(c/3)] (LEAL2 <v.Type> x x)) 8650 for { 8651 c := v.AuxInt 8652 x := v.Args[0] 8653 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 8654 break 8655 } 8656 v.reset(Op386SHLLconst) 8657 v.AuxInt = log2(c / 3) 8658 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8659 v0.AddArg(x) 8660 v0.AddArg(x) 8661 v.AddArg(v0) 8662 return true 8663 } 8664 // match: (MULLconst [c] x) 8665 // cond: c%5 == 0 && isPowerOfTwo(c/5) 8666 // result: (SHLLconst [log2(c/5)] (LEAL4 <v.Type> x x)) 8667 for { 8668 c := v.AuxInt 8669 x := v.Args[0] 8670 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 8671 break 8672 } 8673 v.reset(Op386SHLLconst) 8674 v.AuxInt = log2(c / 5) 8675 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8676 v0.AddArg(x) 8677 v0.AddArg(x) 8678 v.AddArg(v0) 8679 return true 8680 } 8681 // match: (MULLconst [c] x) 8682 // cond: c%9 == 0 && isPowerOfTwo(c/9) 8683 // result: (SHLLconst [log2(c/9)] (LEAL8 <v.Type> x x)) 8684 for { 8685 c := v.AuxInt 8686 x := v.Args[0] 8687 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 8688 break 8689 } 8690 v.reset(Op386SHLLconst) 8691 v.AuxInt = log2(c / 9) 8692 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8693 v0.AddArg(x) 8694 v0.AddArg(x) 8695 v.AddArg(v0) 8696 return true 8697 } 8698 // match: (MULLconst [c] (MOVLconst [d])) 8699 // cond: 8700 // result: (MOVLconst [int64(int32(c*d))]) 8701 for { 8702 c := v.AuxInt 8703 v_0 := v.Args[0] 8704 if v_0.Op != Op386MOVLconst { 8705 break 8706 } 8707 d := v_0.AuxInt 8708 v.reset(Op386MOVLconst) 8709 v.AuxInt = int64(int32(c * d)) 8710 return true 8711 } 8712 return false 8713 } 8714 func rewriteValue386_Op386NEGL_0(v *Value) bool { 8715 // match: (NEGL (MOVLconst [c])) 8716 // cond: 8717 // result: (MOVLconst [int64(int32(-c))]) 8718 for { 8719 v_0 := v.Args[0] 8720 if v_0.Op != Op386MOVLconst { 8721 break 8722 } 8723 c := v_0.AuxInt 8724 v.reset(Op386MOVLconst) 8725 v.AuxInt = int64(int32(-c)) 8726 return true 8727 } 8728 return false 8729 } 8730 func rewriteValue386_Op386NOTL_0(v *Value) bool { 8731 // match: (NOTL (MOVLconst [c])) 8732 // cond: 8733 // result: (MOVLconst [^c]) 8734 for { 8735 v_0 := v.Args[0] 8736 if v_0.Op != Op386MOVLconst { 8737 break 8738 } 8739 c := v_0.AuxInt 8740 v.reset(Op386MOVLconst) 8741 v.AuxInt = ^c 8742 return true 8743 } 8744 return false 8745 } 8746 func rewriteValue386_Op386ORL_0(v *Value) bool { 8747 b := v.Block 8748 _ = b 8749 typ := &b.Func.Config.Types 8750 _ = typ 8751 // match: (ORL x (MOVLconst [c])) 8752 // cond: 8753 // result: (ORLconst [c] x) 8754 for { 8755 _ = v.Args[1] 8756 x := v.Args[0] 8757 v_1 := v.Args[1] 8758 if v_1.Op != Op386MOVLconst { 8759 break 8760 } 8761 c := v_1.AuxInt 8762 v.reset(Op386ORLconst) 8763 v.AuxInt = c 8764 v.AddArg(x) 8765 return true 8766 } 8767 // match: (ORL (MOVLconst [c]) x) 8768 // cond: 8769 // result: (ORLconst [c] x) 8770 for { 8771 _ = v.Args[1] 8772 v_0 := v.Args[0] 8773 if v_0.Op != Op386MOVLconst { 8774 break 8775 } 8776 c := v_0.AuxInt 8777 x := v.Args[1] 8778 v.reset(Op386ORLconst) 8779 v.AuxInt = c 8780 v.AddArg(x) 8781 return true 8782 } 8783 // match: (ORL (SHLLconst [c] x) (SHRLconst [d] x)) 8784 // cond: d == 32-c 8785 // result: (ROLLconst [c] x) 8786 for { 8787 _ = v.Args[1] 8788 v_0 := v.Args[0] 8789 if v_0.Op != Op386SHLLconst { 8790 break 8791 } 8792 c := v_0.AuxInt 8793 x := v_0.Args[0] 8794 v_1 := v.Args[1] 8795 if v_1.Op != Op386SHRLconst { 8796 break 8797 } 8798 d := v_1.AuxInt 8799 if x != v_1.Args[0] { 8800 break 8801 } 8802 if !(d == 32-c) { 8803 break 8804 } 8805 v.reset(Op386ROLLconst) 8806 v.AuxInt = c 8807 v.AddArg(x) 8808 return true 8809 } 8810 // match: (ORL (SHRLconst [d] x) (SHLLconst [c] x)) 8811 // cond: d == 32-c 8812 // result: (ROLLconst [c] x) 8813 for { 8814 _ = v.Args[1] 8815 v_0 := v.Args[0] 8816 if v_0.Op != Op386SHRLconst { 8817 break 8818 } 8819 d := v_0.AuxInt 8820 x := v_0.Args[0] 8821 v_1 := v.Args[1] 8822 if v_1.Op != Op386SHLLconst { 8823 break 8824 } 8825 c := v_1.AuxInt 8826 if x != v_1.Args[0] { 8827 break 8828 } 8829 if !(d == 32-c) { 8830 break 8831 } 8832 v.reset(Op386ROLLconst) 8833 v.AuxInt = c 8834 v.AddArg(x) 8835 return true 8836 } 8837 // match: (ORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 8838 // cond: c < 16 && d == 16-c && t.Size() == 2 8839 // result: (ROLWconst x [c]) 8840 for { 8841 t := v.Type 8842 _ = v.Args[1] 8843 v_0 := v.Args[0] 8844 if v_0.Op != Op386SHLLconst { 8845 break 8846 } 8847 c := v_0.AuxInt 8848 x := v_0.Args[0] 8849 v_1 := v.Args[1] 8850 if v_1.Op != Op386SHRWconst { 8851 break 8852 } 8853 d := v_1.AuxInt 8854 if x != v_1.Args[0] { 8855 break 8856 } 8857 if !(c < 16 && d == 16-c && t.Size() == 2) { 8858 break 8859 } 8860 v.reset(Op386ROLWconst) 8861 v.AuxInt = c 8862 v.AddArg(x) 8863 return true 8864 } 8865 // match: (ORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 8866 // cond: c < 16 && d == 16-c && t.Size() == 2 8867 // result: (ROLWconst x [c]) 8868 for { 8869 t := v.Type 8870 _ = v.Args[1] 8871 v_0 := v.Args[0] 8872 if v_0.Op != Op386SHRWconst { 8873 break 8874 } 8875 d := v_0.AuxInt 8876 x := v_0.Args[0] 8877 v_1 := v.Args[1] 8878 if v_1.Op != Op386SHLLconst { 8879 break 8880 } 8881 c := v_1.AuxInt 8882 if x != v_1.Args[0] { 8883 break 8884 } 8885 if !(c < 16 && d == 16-c && t.Size() == 2) { 8886 break 8887 } 8888 v.reset(Op386ROLWconst) 8889 v.AuxInt = c 8890 v.AddArg(x) 8891 return true 8892 } 8893 // match: (ORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 8894 // cond: c < 8 && d == 8-c && t.Size() == 1 8895 // result: (ROLBconst x [c]) 8896 for { 8897 t := v.Type 8898 _ = v.Args[1] 8899 v_0 := v.Args[0] 8900 if v_0.Op != Op386SHLLconst { 8901 break 8902 } 8903 c := v_0.AuxInt 8904 x := v_0.Args[0] 8905 v_1 := v.Args[1] 8906 if v_1.Op != Op386SHRBconst { 8907 break 8908 } 8909 d := v_1.AuxInt 8910 if x != v_1.Args[0] { 8911 break 8912 } 8913 if !(c < 8 && d == 8-c && t.Size() == 1) { 8914 break 8915 } 8916 v.reset(Op386ROLBconst) 8917 v.AuxInt = c 8918 v.AddArg(x) 8919 return true 8920 } 8921 // match: (ORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 8922 // cond: c < 8 && d == 8-c && t.Size() == 1 8923 // result: (ROLBconst x [c]) 8924 for { 8925 t := v.Type 8926 _ = v.Args[1] 8927 v_0 := v.Args[0] 8928 if v_0.Op != Op386SHRBconst { 8929 break 8930 } 8931 d := v_0.AuxInt 8932 x := v_0.Args[0] 8933 v_1 := v.Args[1] 8934 if v_1.Op != Op386SHLLconst { 8935 break 8936 } 8937 c := v_1.AuxInt 8938 if x != v_1.Args[0] { 8939 break 8940 } 8941 if !(c < 8 && d == 8-c && t.Size() == 1) { 8942 break 8943 } 8944 v.reset(Op386ROLBconst) 8945 v.AuxInt = c 8946 v.AddArg(x) 8947 return true 8948 } 8949 // match: (ORL x x) 8950 // cond: 8951 // result: x 8952 for { 8953 _ = v.Args[1] 8954 x := v.Args[0] 8955 if x != v.Args[1] { 8956 break 8957 } 8958 v.reset(OpCopy) 8959 v.Type = x.Type 8960 v.AddArg(x) 8961 return true 8962 } 8963 // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p 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) (MOVWload [i0] {s} p mem) 8966 for { 8967 _ = v.Args[1] 8968 x0 := v.Args[0] 8969 if x0.Op != Op386MOVBload { 8970 break 8971 } 8972 i0 := x0.AuxInt 8973 s := x0.Aux 8974 _ = x0.Args[1] 8975 p := x0.Args[0] 8976 mem := x0.Args[1] 8977 s0 := v.Args[1] 8978 if s0.Op != Op386SHLLconst { 8979 break 8980 } 8981 if s0.AuxInt != 8 { 8982 break 8983 } 8984 x1 := s0.Args[0] 8985 if x1.Op != Op386MOVBload { 8986 break 8987 } 8988 i1 := x1.AuxInt 8989 if x1.Aux != s { 8990 break 8991 } 8992 _ = x1.Args[1] 8993 if p != x1.Args[0] { 8994 break 8995 } 8996 if mem != x1.Args[1] { 8997 break 8998 } 8999 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9000 break 9001 } 9002 b = mergePoint(b, x0, x1) 9003 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 9004 v.reset(OpCopy) 9005 v.AddArg(v0) 9006 v0.AuxInt = i0 9007 v0.Aux = s 9008 v0.AddArg(p) 9009 v0.AddArg(mem) 9010 return true 9011 } 9012 return false 9013 } 9014 func rewriteValue386_Op386ORL_10(v *Value) bool { 9015 b := v.Block 9016 _ = b 9017 typ := &b.Func.Config.Types 9018 _ = typ 9019 // match: (ORL s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) 9020 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9021 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 9022 for { 9023 _ = v.Args[1] 9024 s0 := v.Args[0] 9025 if s0.Op != Op386SHLLconst { 9026 break 9027 } 9028 if s0.AuxInt != 8 { 9029 break 9030 } 9031 x1 := s0.Args[0] 9032 if x1.Op != Op386MOVBload { 9033 break 9034 } 9035 i1 := x1.AuxInt 9036 s := x1.Aux 9037 _ = x1.Args[1] 9038 p := x1.Args[0] 9039 mem := x1.Args[1] 9040 x0 := v.Args[1] 9041 if x0.Op != Op386MOVBload { 9042 break 9043 } 9044 i0 := x0.AuxInt 9045 if x0.Aux != s { 9046 break 9047 } 9048 _ = x0.Args[1] 9049 if p != x0.Args[0] { 9050 break 9051 } 9052 if mem != x0.Args[1] { 9053 break 9054 } 9055 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9056 break 9057 } 9058 b = mergePoint(b, x0, x1) 9059 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 9060 v.reset(OpCopy) 9061 v.AddArg(v0) 9062 v0.AuxInt = i0 9063 v0.Aux = s 9064 v0.AddArg(p) 9065 v0.AddArg(mem) 9066 return true 9067 } 9068 // 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))) 9069 // 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) 9070 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9071 for { 9072 _ = v.Args[1] 9073 o0 := v.Args[0] 9074 if o0.Op != Op386ORL { 9075 break 9076 } 9077 _ = o0.Args[1] 9078 x0 := o0.Args[0] 9079 if x0.Op != Op386MOVWload { 9080 break 9081 } 9082 i0 := x0.AuxInt 9083 s := x0.Aux 9084 _ = x0.Args[1] 9085 p := x0.Args[0] 9086 mem := x0.Args[1] 9087 s0 := o0.Args[1] 9088 if s0.Op != Op386SHLLconst { 9089 break 9090 } 9091 if s0.AuxInt != 16 { 9092 break 9093 } 9094 x1 := s0.Args[0] 9095 if x1.Op != Op386MOVBload { 9096 break 9097 } 9098 i2 := x1.AuxInt 9099 if x1.Aux != s { 9100 break 9101 } 9102 _ = x1.Args[1] 9103 if p != x1.Args[0] { 9104 break 9105 } 9106 if mem != x1.Args[1] { 9107 break 9108 } 9109 s1 := v.Args[1] 9110 if s1.Op != Op386SHLLconst { 9111 break 9112 } 9113 if s1.AuxInt != 24 { 9114 break 9115 } 9116 x2 := s1.Args[0] 9117 if x2.Op != Op386MOVBload { 9118 break 9119 } 9120 i3 := x2.AuxInt 9121 if x2.Aux != s { 9122 break 9123 } 9124 _ = x2.Args[1] 9125 if p != x2.Args[0] { 9126 break 9127 } 9128 if mem != x2.Args[1] { 9129 break 9130 } 9131 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)) { 9132 break 9133 } 9134 b = mergePoint(b, x0, x1, x2) 9135 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9136 v.reset(OpCopy) 9137 v.AddArg(v0) 9138 v0.AuxInt = i0 9139 v0.Aux = s 9140 v0.AddArg(p) 9141 v0.AddArg(mem) 9142 return true 9143 } 9144 // 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))) 9145 // 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) 9146 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9147 for { 9148 _ = v.Args[1] 9149 o0 := v.Args[0] 9150 if o0.Op != Op386ORL { 9151 break 9152 } 9153 _ = o0.Args[1] 9154 s0 := o0.Args[0] 9155 if s0.Op != Op386SHLLconst { 9156 break 9157 } 9158 if s0.AuxInt != 16 { 9159 break 9160 } 9161 x1 := s0.Args[0] 9162 if x1.Op != Op386MOVBload { 9163 break 9164 } 9165 i2 := x1.AuxInt 9166 s := x1.Aux 9167 _ = x1.Args[1] 9168 p := x1.Args[0] 9169 mem := x1.Args[1] 9170 x0 := o0.Args[1] 9171 if x0.Op != Op386MOVWload { 9172 break 9173 } 9174 i0 := x0.AuxInt 9175 if x0.Aux != s { 9176 break 9177 } 9178 _ = x0.Args[1] 9179 if p != x0.Args[0] { 9180 break 9181 } 9182 if mem != x0.Args[1] { 9183 break 9184 } 9185 s1 := v.Args[1] 9186 if s1.Op != Op386SHLLconst { 9187 break 9188 } 9189 if s1.AuxInt != 24 { 9190 break 9191 } 9192 x2 := s1.Args[0] 9193 if x2.Op != Op386MOVBload { 9194 break 9195 } 9196 i3 := x2.AuxInt 9197 if x2.Aux != s { 9198 break 9199 } 9200 _ = x2.Args[1] 9201 if p != x2.Args[0] { 9202 break 9203 } 9204 if mem != x2.Args[1] { 9205 break 9206 } 9207 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)) { 9208 break 9209 } 9210 b = mergePoint(b, x0, x1, x2) 9211 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9212 v.reset(OpCopy) 9213 v.AddArg(v0) 9214 v0.AuxInt = i0 9215 v0.Aux = s 9216 v0.AddArg(p) 9217 v0.AddArg(mem) 9218 return true 9219 } 9220 // 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)))) 9221 // 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) 9222 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9223 for { 9224 _ = v.Args[1] 9225 s1 := v.Args[0] 9226 if s1.Op != Op386SHLLconst { 9227 break 9228 } 9229 if s1.AuxInt != 24 { 9230 break 9231 } 9232 x2 := s1.Args[0] 9233 if x2.Op != Op386MOVBload { 9234 break 9235 } 9236 i3 := x2.AuxInt 9237 s := x2.Aux 9238 _ = x2.Args[1] 9239 p := x2.Args[0] 9240 mem := x2.Args[1] 9241 o0 := v.Args[1] 9242 if o0.Op != Op386ORL { 9243 break 9244 } 9245 _ = o0.Args[1] 9246 x0 := o0.Args[0] 9247 if x0.Op != Op386MOVWload { 9248 break 9249 } 9250 i0 := x0.AuxInt 9251 if x0.Aux != s { 9252 break 9253 } 9254 _ = x0.Args[1] 9255 if p != x0.Args[0] { 9256 break 9257 } 9258 if mem != x0.Args[1] { 9259 break 9260 } 9261 s0 := o0.Args[1] 9262 if s0.Op != Op386SHLLconst { 9263 break 9264 } 9265 if s0.AuxInt != 16 { 9266 break 9267 } 9268 x1 := s0.Args[0] 9269 if x1.Op != Op386MOVBload { 9270 break 9271 } 9272 i2 := x1.AuxInt 9273 if x1.Aux != s { 9274 break 9275 } 9276 _ = x1.Args[1] 9277 if p != x1.Args[0] { 9278 break 9279 } 9280 if mem != x1.Args[1] { 9281 break 9282 } 9283 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)) { 9284 break 9285 } 9286 b = mergePoint(b, x0, x1, x2) 9287 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9288 v.reset(OpCopy) 9289 v.AddArg(v0) 9290 v0.AuxInt = i0 9291 v0.Aux = s 9292 v0.AddArg(p) 9293 v0.AddArg(mem) 9294 return true 9295 } 9296 // 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))) 9297 // 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) 9298 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9299 for { 9300 _ = v.Args[1] 9301 s1 := v.Args[0] 9302 if s1.Op != Op386SHLLconst { 9303 break 9304 } 9305 if s1.AuxInt != 24 { 9306 break 9307 } 9308 x2 := s1.Args[0] 9309 if x2.Op != Op386MOVBload { 9310 break 9311 } 9312 i3 := x2.AuxInt 9313 s := x2.Aux 9314 _ = x2.Args[1] 9315 p := x2.Args[0] 9316 mem := x2.Args[1] 9317 o0 := v.Args[1] 9318 if o0.Op != Op386ORL { 9319 break 9320 } 9321 _ = o0.Args[1] 9322 s0 := o0.Args[0] 9323 if s0.Op != Op386SHLLconst { 9324 break 9325 } 9326 if s0.AuxInt != 16 { 9327 break 9328 } 9329 x1 := s0.Args[0] 9330 if x1.Op != Op386MOVBload { 9331 break 9332 } 9333 i2 := x1.AuxInt 9334 if x1.Aux != s { 9335 break 9336 } 9337 _ = x1.Args[1] 9338 if p != x1.Args[0] { 9339 break 9340 } 9341 if mem != x1.Args[1] { 9342 break 9343 } 9344 x0 := o0.Args[1] 9345 if x0.Op != Op386MOVWload { 9346 break 9347 } 9348 i0 := x0.AuxInt 9349 if x0.Aux != s { 9350 break 9351 } 9352 _ = x0.Args[1] 9353 if p != x0.Args[0] { 9354 break 9355 } 9356 if mem != x0.Args[1] { 9357 break 9358 } 9359 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)) { 9360 break 9361 } 9362 b = mergePoint(b, x0, x1, x2) 9363 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9364 v.reset(OpCopy) 9365 v.AddArg(v0) 9366 v0.AuxInt = i0 9367 v0.Aux = s 9368 v0.AddArg(p) 9369 v0.AddArg(mem) 9370 return true 9371 } 9372 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 9373 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9374 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9375 for { 9376 _ = v.Args[1] 9377 x0 := v.Args[0] 9378 if x0.Op != Op386MOVBloadidx1 { 9379 break 9380 } 9381 i0 := x0.AuxInt 9382 s := x0.Aux 9383 _ = x0.Args[2] 9384 p := x0.Args[0] 9385 idx := x0.Args[1] 9386 mem := x0.Args[2] 9387 s0 := v.Args[1] 9388 if s0.Op != Op386SHLLconst { 9389 break 9390 } 9391 if s0.AuxInt != 8 { 9392 break 9393 } 9394 x1 := s0.Args[0] 9395 if x1.Op != Op386MOVBloadidx1 { 9396 break 9397 } 9398 i1 := x1.AuxInt 9399 if x1.Aux != s { 9400 break 9401 } 9402 _ = x1.Args[2] 9403 if p != x1.Args[0] { 9404 break 9405 } 9406 if idx != x1.Args[1] { 9407 break 9408 } 9409 if mem != x1.Args[2] { 9410 break 9411 } 9412 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9413 break 9414 } 9415 b = mergePoint(b, x0, x1) 9416 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9417 v.reset(OpCopy) 9418 v.AddArg(v0) 9419 v0.AuxInt = i0 9420 v0.Aux = s 9421 v0.AddArg(p) 9422 v0.AddArg(idx) 9423 v0.AddArg(mem) 9424 return true 9425 } 9426 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 9427 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9428 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9429 for { 9430 _ = v.Args[1] 9431 x0 := v.Args[0] 9432 if x0.Op != Op386MOVBloadidx1 { 9433 break 9434 } 9435 i0 := x0.AuxInt 9436 s := x0.Aux 9437 _ = x0.Args[2] 9438 idx := x0.Args[0] 9439 p := x0.Args[1] 9440 mem := x0.Args[2] 9441 s0 := v.Args[1] 9442 if s0.Op != Op386SHLLconst { 9443 break 9444 } 9445 if s0.AuxInt != 8 { 9446 break 9447 } 9448 x1 := s0.Args[0] 9449 if x1.Op != Op386MOVBloadidx1 { 9450 break 9451 } 9452 i1 := x1.AuxInt 9453 if x1.Aux != s { 9454 break 9455 } 9456 _ = x1.Args[2] 9457 if p != x1.Args[0] { 9458 break 9459 } 9460 if idx != x1.Args[1] { 9461 break 9462 } 9463 if mem != x1.Args[2] { 9464 break 9465 } 9466 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9467 break 9468 } 9469 b = mergePoint(b, x0, x1) 9470 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9471 v.reset(OpCopy) 9472 v.AddArg(v0) 9473 v0.AuxInt = i0 9474 v0.Aux = s 9475 v0.AddArg(p) 9476 v0.AddArg(idx) 9477 v0.AddArg(mem) 9478 return true 9479 } 9480 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9481 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9482 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9483 for { 9484 _ = v.Args[1] 9485 x0 := v.Args[0] 9486 if x0.Op != Op386MOVBloadidx1 { 9487 break 9488 } 9489 i0 := x0.AuxInt 9490 s := x0.Aux 9491 _ = x0.Args[2] 9492 p := x0.Args[0] 9493 idx := x0.Args[1] 9494 mem := x0.Args[2] 9495 s0 := v.Args[1] 9496 if s0.Op != Op386SHLLconst { 9497 break 9498 } 9499 if s0.AuxInt != 8 { 9500 break 9501 } 9502 x1 := s0.Args[0] 9503 if x1.Op != Op386MOVBloadidx1 { 9504 break 9505 } 9506 i1 := x1.AuxInt 9507 if x1.Aux != s { 9508 break 9509 } 9510 _ = x1.Args[2] 9511 if idx != x1.Args[0] { 9512 break 9513 } 9514 if p != x1.Args[1] { 9515 break 9516 } 9517 if mem != x1.Args[2] { 9518 break 9519 } 9520 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9521 break 9522 } 9523 b = mergePoint(b, x0, x1) 9524 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, 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 x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9535 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9536 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9537 for { 9538 _ = v.Args[1] 9539 x0 := v.Args[0] 9540 if x0.Op != Op386MOVBloadidx1 { 9541 break 9542 } 9543 i0 := x0.AuxInt 9544 s := x0.Aux 9545 _ = x0.Args[2] 9546 idx := x0.Args[0] 9547 p := x0.Args[1] 9548 mem := x0.Args[2] 9549 s0 := v.Args[1] 9550 if s0.Op != Op386SHLLconst { 9551 break 9552 } 9553 if s0.AuxInt != 8 { 9554 break 9555 } 9556 x1 := s0.Args[0] 9557 if x1.Op != Op386MOVBloadidx1 { 9558 break 9559 } 9560 i1 := x1.AuxInt 9561 if x1.Aux != s { 9562 break 9563 } 9564 _ = x1.Args[2] 9565 if idx != x1.Args[0] { 9566 break 9567 } 9568 if p != x1.Args[1] { 9569 break 9570 } 9571 if mem != x1.Args[2] { 9572 break 9573 } 9574 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9575 break 9576 } 9577 b = mergePoint(b, x0, x1) 9578 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9579 v.reset(OpCopy) 9580 v.AddArg(v0) 9581 v0.AuxInt = i0 9582 v0.Aux = s 9583 v0.AddArg(p) 9584 v0.AddArg(idx) 9585 v0.AddArg(mem) 9586 return true 9587 } 9588 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9589 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9590 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9591 for { 9592 _ = v.Args[1] 9593 s0 := v.Args[0] 9594 if s0.Op != Op386SHLLconst { 9595 break 9596 } 9597 if s0.AuxInt != 8 { 9598 break 9599 } 9600 x1 := s0.Args[0] 9601 if x1.Op != Op386MOVBloadidx1 { 9602 break 9603 } 9604 i1 := x1.AuxInt 9605 s := x1.Aux 9606 _ = x1.Args[2] 9607 p := x1.Args[0] 9608 idx := x1.Args[1] 9609 mem := x1.Args[2] 9610 x0 := v.Args[1] 9611 if x0.Op != Op386MOVBloadidx1 { 9612 break 9613 } 9614 i0 := x0.AuxInt 9615 if x0.Aux != s { 9616 break 9617 } 9618 _ = x0.Args[2] 9619 if p != x0.Args[0] { 9620 break 9621 } 9622 if idx != x0.Args[1] { 9623 break 9624 } 9625 if mem != x0.Args[2] { 9626 break 9627 } 9628 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9629 break 9630 } 9631 b = mergePoint(b, x0, x1) 9632 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9633 v.reset(OpCopy) 9634 v.AddArg(v0) 9635 v0.AuxInt = i0 9636 v0.Aux = s 9637 v0.AddArg(p) 9638 v0.AddArg(idx) 9639 v0.AddArg(mem) 9640 return true 9641 } 9642 return false 9643 } 9644 func rewriteValue386_Op386ORL_20(v *Value) bool { 9645 b := v.Block 9646 _ = b 9647 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9648 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9649 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9650 for { 9651 _ = v.Args[1] 9652 s0 := v.Args[0] 9653 if s0.Op != Op386SHLLconst { 9654 break 9655 } 9656 if s0.AuxInt != 8 { 9657 break 9658 } 9659 x1 := s0.Args[0] 9660 if x1.Op != Op386MOVBloadidx1 { 9661 break 9662 } 9663 i1 := x1.AuxInt 9664 s := x1.Aux 9665 _ = x1.Args[2] 9666 idx := x1.Args[0] 9667 p := x1.Args[1] 9668 mem := x1.Args[2] 9669 x0 := v.Args[1] 9670 if x0.Op != Op386MOVBloadidx1 { 9671 break 9672 } 9673 i0 := x0.AuxInt 9674 if x0.Aux != s { 9675 break 9676 } 9677 _ = x0.Args[2] 9678 if p != x0.Args[0] { 9679 break 9680 } 9681 if idx != x0.Args[1] { 9682 break 9683 } 9684 if mem != x0.Args[2] { 9685 break 9686 } 9687 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9688 break 9689 } 9690 b = mergePoint(b, x0, x1) 9691 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9692 v.reset(OpCopy) 9693 v.AddArg(v0) 9694 v0.AuxInt = i0 9695 v0.Aux = s 9696 v0.AddArg(p) 9697 v0.AddArg(idx) 9698 v0.AddArg(mem) 9699 return true 9700 } 9701 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9702 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9703 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9704 for { 9705 _ = v.Args[1] 9706 s0 := v.Args[0] 9707 if s0.Op != Op386SHLLconst { 9708 break 9709 } 9710 if s0.AuxInt != 8 { 9711 break 9712 } 9713 x1 := s0.Args[0] 9714 if x1.Op != Op386MOVBloadidx1 { 9715 break 9716 } 9717 i1 := x1.AuxInt 9718 s := x1.Aux 9719 _ = x1.Args[2] 9720 p := x1.Args[0] 9721 idx := x1.Args[1] 9722 mem := x1.Args[2] 9723 x0 := v.Args[1] 9724 if x0.Op != Op386MOVBloadidx1 { 9725 break 9726 } 9727 i0 := x0.AuxInt 9728 if x0.Aux != s { 9729 break 9730 } 9731 _ = x0.Args[2] 9732 if idx != x0.Args[0] { 9733 break 9734 } 9735 if p != x0.Args[1] { 9736 break 9737 } 9738 if mem != x0.Args[2] { 9739 break 9740 } 9741 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9742 break 9743 } 9744 b = mergePoint(b, x0, x1) 9745 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9746 v.reset(OpCopy) 9747 v.AddArg(v0) 9748 v0.AuxInt = i0 9749 v0.Aux = s 9750 v0.AddArg(p) 9751 v0.AddArg(idx) 9752 v0.AddArg(mem) 9753 return true 9754 } 9755 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9756 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9757 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9758 for { 9759 _ = v.Args[1] 9760 s0 := v.Args[0] 9761 if s0.Op != Op386SHLLconst { 9762 break 9763 } 9764 if s0.AuxInt != 8 { 9765 break 9766 } 9767 x1 := s0.Args[0] 9768 if x1.Op != Op386MOVBloadidx1 { 9769 break 9770 } 9771 i1 := x1.AuxInt 9772 s := x1.Aux 9773 _ = x1.Args[2] 9774 idx := x1.Args[0] 9775 p := x1.Args[1] 9776 mem := x1.Args[2] 9777 x0 := v.Args[1] 9778 if x0.Op != Op386MOVBloadidx1 { 9779 break 9780 } 9781 i0 := x0.AuxInt 9782 if x0.Aux != s { 9783 break 9784 } 9785 _ = x0.Args[2] 9786 if idx != x0.Args[0] { 9787 break 9788 } 9789 if p != x0.Args[1] { 9790 break 9791 } 9792 if mem != x0.Args[2] { 9793 break 9794 } 9795 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9796 break 9797 } 9798 b = mergePoint(b, x0, x1) 9799 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9800 v.reset(OpCopy) 9801 v.AddArg(v0) 9802 v0.AuxInt = i0 9803 v0.Aux = s 9804 v0.AddArg(p) 9805 v0.AddArg(idx) 9806 v0.AddArg(mem) 9807 return true 9808 } 9809 // 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))) 9810 // 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) 9811 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9812 for { 9813 _ = v.Args[1] 9814 o0 := v.Args[0] 9815 if o0.Op != Op386ORL { 9816 break 9817 } 9818 _ = o0.Args[1] 9819 x0 := o0.Args[0] 9820 if x0.Op != Op386MOVWloadidx1 { 9821 break 9822 } 9823 i0 := x0.AuxInt 9824 s := x0.Aux 9825 _ = x0.Args[2] 9826 p := x0.Args[0] 9827 idx := x0.Args[1] 9828 mem := x0.Args[2] 9829 s0 := o0.Args[1] 9830 if s0.Op != Op386SHLLconst { 9831 break 9832 } 9833 if s0.AuxInt != 16 { 9834 break 9835 } 9836 x1 := s0.Args[0] 9837 if x1.Op != Op386MOVBloadidx1 { 9838 break 9839 } 9840 i2 := x1.AuxInt 9841 if x1.Aux != s { 9842 break 9843 } 9844 _ = x1.Args[2] 9845 if p != x1.Args[0] { 9846 break 9847 } 9848 if idx != x1.Args[1] { 9849 break 9850 } 9851 if mem != x1.Args[2] { 9852 break 9853 } 9854 s1 := v.Args[1] 9855 if s1.Op != Op386SHLLconst { 9856 break 9857 } 9858 if s1.AuxInt != 24 { 9859 break 9860 } 9861 x2 := s1.Args[0] 9862 if x2.Op != Op386MOVBloadidx1 { 9863 break 9864 } 9865 i3 := x2.AuxInt 9866 if x2.Aux != s { 9867 break 9868 } 9869 _ = x2.Args[2] 9870 if p != x2.Args[0] { 9871 break 9872 } 9873 if idx != x2.Args[1] { 9874 break 9875 } 9876 if mem != x2.Args[2] { 9877 break 9878 } 9879 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)) { 9880 break 9881 } 9882 b = mergePoint(b, x0, x1, x2) 9883 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9884 v.reset(OpCopy) 9885 v.AddArg(v0) 9886 v0.AuxInt = i0 9887 v0.Aux = s 9888 v0.AddArg(p) 9889 v0.AddArg(idx) 9890 v0.AddArg(mem) 9891 return true 9892 } 9893 // 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))) 9894 // 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) 9895 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9896 for { 9897 _ = v.Args[1] 9898 o0 := v.Args[0] 9899 if o0.Op != Op386ORL { 9900 break 9901 } 9902 _ = o0.Args[1] 9903 x0 := o0.Args[0] 9904 if x0.Op != Op386MOVWloadidx1 { 9905 break 9906 } 9907 i0 := x0.AuxInt 9908 s := x0.Aux 9909 _ = x0.Args[2] 9910 idx := x0.Args[0] 9911 p := x0.Args[1] 9912 mem := x0.Args[2] 9913 s0 := o0.Args[1] 9914 if s0.Op != Op386SHLLconst { 9915 break 9916 } 9917 if s0.AuxInt != 16 { 9918 break 9919 } 9920 x1 := s0.Args[0] 9921 if x1.Op != Op386MOVBloadidx1 { 9922 break 9923 } 9924 i2 := x1.AuxInt 9925 if x1.Aux != s { 9926 break 9927 } 9928 _ = x1.Args[2] 9929 if p != x1.Args[0] { 9930 break 9931 } 9932 if idx != x1.Args[1] { 9933 break 9934 } 9935 if mem != x1.Args[2] { 9936 break 9937 } 9938 s1 := v.Args[1] 9939 if s1.Op != Op386SHLLconst { 9940 break 9941 } 9942 if s1.AuxInt != 24 { 9943 break 9944 } 9945 x2 := s1.Args[0] 9946 if x2.Op != Op386MOVBloadidx1 { 9947 break 9948 } 9949 i3 := x2.AuxInt 9950 if x2.Aux != s { 9951 break 9952 } 9953 _ = x2.Args[2] 9954 if p != x2.Args[0] { 9955 break 9956 } 9957 if idx != x2.Args[1] { 9958 break 9959 } 9960 if mem != x2.Args[2] { 9961 break 9962 } 9963 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)) { 9964 break 9965 } 9966 b = mergePoint(b, x0, x1, x2) 9967 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9968 v.reset(OpCopy) 9969 v.AddArg(v0) 9970 v0.AuxInt = i0 9971 v0.Aux = s 9972 v0.AddArg(p) 9973 v0.AddArg(idx) 9974 v0.AddArg(mem) 9975 return true 9976 } 9977 // 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))) 9978 // 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) 9979 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9980 for { 9981 _ = v.Args[1] 9982 o0 := v.Args[0] 9983 if o0.Op != Op386ORL { 9984 break 9985 } 9986 _ = o0.Args[1] 9987 x0 := o0.Args[0] 9988 if x0.Op != Op386MOVWloadidx1 { 9989 break 9990 } 9991 i0 := x0.AuxInt 9992 s := x0.Aux 9993 _ = x0.Args[2] 9994 p := x0.Args[0] 9995 idx := x0.Args[1] 9996 mem := x0.Args[2] 9997 s0 := o0.Args[1] 9998 if s0.Op != Op386SHLLconst { 9999 break 10000 } 10001 if s0.AuxInt != 16 { 10002 break 10003 } 10004 x1 := s0.Args[0] 10005 if x1.Op != Op386MOVBloadidx1 { 10006 break 10007 } 10008 i2 := x1.AuxInt 10009 if x1.Aux != s { 10010 break 10011 } 10012 _ = x1.Args[2] 10013 if idx != x1.Args[0] { 10014 break 10015 } 10016 if p != x1.Args[1] { 10017 break 10018 } 10019 if mem != x1.Args[2] { 10020 break 10021 } 10022 s1 := v.Args[1] 10023 if s1.Op != Op386SHLLconst { 10024 break 10025 } 10026 if s1.AuxInt != 24 { 10027 break 10028 } 10029 x2 := s1.Args[0] 10030 if x2.Op != Op386MOVBloadidx1 { 10031 break 10032 } 10033 i3 := x2.AuxInt 10034 if x2.Aux != s { 10035 break 10036 } 10037 _ = x2.Args[2] 10038 if p != x2.Args[0] { 10039 break 10040 } 10041 if idx != x2.Args[1] { 10042 break 10043 } 10044 if mem != x2.Args[2] { 10045 break 10046 } 10047 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)) { 10048 break 10049 } 10050 b = mergePoint(b, x0, x1, x2) 10051 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10052 v.reset(OpCopy) 10053 v.AddArg(v0) 10054 v0.AuxInt = i0 10055 v0.Aux = s 10056 v0.AddArg(p) 10057 v0.AddArg(idx) 10058 v0.AddArg(mem) 10059 return true 10060 } 10061 // 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))) 10062 // 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) 10063 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10064 for { 10065 _ = v.Args[1] 10066 o0 := v.Args[0] 10067 if o0.Op != Op386ORL { 10068 break 10069 } 10070 _ = o0.Args[1] 10071 x0 := o0.Args[0] 10072 if x0.Op != Op386MOVWloadidx1 { 10073 break 10074 } 10075 i0 := x0.AuxInt 10076 s := x0.Aux 10077 _ = x0.Args[2] 10078 idx := x0.Args[0] 10079 p := x0.Args[1] 10080 mem := x0.Args[2] 10081 s0 := o0.Args[1] 10082 if s0.Op != Op386SHLLconst { 10083 break 10084 } 10085 if s0.AuxInt != 16 { 10086 break 10087 } 10088 x1 := s0.Args[0] 10089 if x1.Op != Op386MOVBloadidx1 { 10090 break 10091 } 10092 i2 := x1.AuxInt 10093 if x1.Aux != s { 10094 break 10095 } 10096 _ = x1.Args[2] 10097 if idx != x1.Args[0] { 10098 break 10099 } 10100 if p != x1.Args[1] { 10101 break 10102 } 10103 if mem != x1.Args[2] { 10104 break 10105 } 10106 s1 := v.Args[1] 10107 if s1.Op != Op386SHLLconst { 10108 break 10109 } 10110 if s1.AuxInt != 24 { 10111 break 10112 } 10113 x2 := s1.Args[0] 10114 if x2.Op != Op386MOVBloadidx1 { 10115 break 10116 } 10117 i3 := x2.AuxInt 10118 if x2.Aux != s { 10119 break 10120 } 10121 _ = x2.Args[2] 10122 if p != x2.Args[0] { 10123 break 10124 } 10125 if idx != x2.Args[1] { 10126 break 10127 } 10128 if mem != x2.Args[2] { 10129 break 10130 } 10131 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)) { 10132 break 10133 } 10134 b = mergePoint(b, x0, x1, x2) 10135 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10136 v.reset(OpCopy) 10137 v.AddArg(v0) 10138 v0.AuxInt = i0 10139 v0.Aux = s 10140 v0.AddArg(p) 10141 v0.AddArg(idx) 10142 v0.AddArg(mem) 10143 return true 10144 } 10145 // 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))) 10146 // 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) 10147 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10148 for { 10149 _ = v.Args[1] 10150 o0 := v.Args[0] 10151 if o0.Op != Op386ORL { 10152 break 10153 } 10154 _ = o0.Args[1] 10155 s0 := o0.Args[0] 10156 if s0.Op != Op386SHLLconst { 10157 break 10158 } 10159 if s0.AuxInt != 16 { 10160 break 10161 } 10162 x1 := s0.Args[0] 10163 if x1.Op != Op386MOVBloadidx1 { 10164 break 10165 } 10166 i2 := x1.AuxInt 10167 s := x1.Aux 10168 _ = x1.Args[2] 10169 p := x1.Args[0] 10170 idx := x1.Args[1] 10171 mem := x1.Args[2] 10172 x0 := o0.Args[1] 10173 if x0.Op != Op386MOVWloadidx1 { 10174 break 10175 } 10176 i0 := x0.AuxInt 10177 if x0.Aux != s { 10178 break 10179 } 10180 _ = x0.Args[2] 10181 if p != x0.Args[0] { 10182 break 10183 } 10184 if idx != x0.Args[1] { 10185 break 10186 } 10187 if mem != x0.Args[2] { 10188 break 10189 } 10190 s1 := v.Args[1] 10191 if s1.Op != Op386SHLLconst { 10192 break 10193 } 10194 if s1.AuxInt != 24 { 10195 break 10196 } 10197 x2 := s1.Args[0] 10198 if x2.Op != Op386MOVBloadidx1 { 10199 break 10200 } 10201 i3 := x2.AuxInt 10202 if x2.Aux != s { 10203 break 10204 } 10205 _ = x2.Args[2] 10206 if p != x2.Args[0] { 10207 break 10208 } 10209 if idx != x2.Args[1] { 10210 break 10211 } 10212 if mem != x2.Args[2] { 10213 break 10214 } 10215 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)) { 10216 break 10217 } 10218 b = mergePoint(b, x0, x1, x2) 10219 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10220 v.reset(OpCopy) 10221 v.AddArg(v0) 10222 v0.AuxInt = i0 10223 v0.Aux = s 10224 v0.AddArg(p) 10225 v0.AddArg(idx) 10226 v0.AddArg(mem) 10227 return true 10228 } 10229 // 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))) 10230 // 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) 10231 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10232 for { 10233 _ = v.Args[1] 10234 o0 := v.Args[0] 10235 if o0.Op != Op386ORL { 10236 break 10237 } 10238 _ = o0.Args[1] 10239 s0 := o0.Args[0] 10240 if s0.Op != Op386SHLLconst { 10241 break 10242 } 10243 if s0.AuxInt != 16 { 10244 break 10245 } 10246 x1 := s0.Args[0] 10247 if x1.Op != Op386MOVBloadidx1 { 10248 break 10249 } 10250 i2 := x1.AuxInt 10251 s := x1.Aux 10252 _ = x1.Args[2] 10253 idx := x1.Args[0] 10254 p := x1.Args[1] 10255 mem := x1.Args[2] 10256 x0 := o0.Args[1] 10257 if x0.Op != Op386MOVWloadidx1 { 10258 break 10259 } 10260 i0 := x0.AuxInt 10261 if x0.Aux != s { 10262 break 10263 } 10264 _ = x0.Args[2] 10265 if p != x0.Args[0] { 10266 break 10267 } 10268 if idx != x0.Args[1] { 10269 break 10270 } 10271 if mem != x0.Args[2] { 10272 break 10273 } 10274 s1 := v.Args[1] 10275 if s1.Op != Op386SHLLconst { 10276 break 10277 } 10278 if s1.AuxInt != 24 { 10279 break 10280 } 10281 x2 := s1.Args[0] 10282 if x2.Op != Op386MOVBloadidx1 { 10283 break 10284 } 10285 i3 := x2.AuxInt 10286 if x2.Aux != s { 10287 break 10288 } 10289 _ = x2.Args[2] 10290 if p != x2.Args[0] { 10291 break 10292 } 10293 if idx != x2.Args[1] { 10294 break 10295 } 10296 if mem != x2.Args[2] { 10297 break 10298 } 10299 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)) { 10300 break 10301 } 10302 b = mergePoint(b, x0, x1, x2) 10303 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10304 v.reset(OpCopy) 10305 v.AddArg(v0) 10306 v0.AuxInt = i0 10307 v0.Aux = s 10308 v0.AddArg(p) 10309 v0.AddArg(idx) 10310 v0.AddArg(mem) 10311 return true 10312 } 10313 // 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))) 10314 // 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) 10315 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10316 for { 10317 _ = v.Args[1] 10318 o0 := v.Args[0] 10319 if o0.Op != Op386ORL { 10320 break 10321 } 10322 _ = o0.Args[1] 10323 s0 := o0.Args[0] 10324 if s0.Op != Op386SHLLconst { 10325 break 10326 } 10327 if s0.AuxInt != 16 { 10328 break 10329 } 10330 x1 := s0.Args[0] 10331 if x1.Op != Op386MOVBloadidx1 { 10332 break 10333 } 10334 i2 := x1.AuxInt 10335 s := x1.Aux 10336 _ = x1.Args[2] 10337 p := x1.Args[0] 10338 idx := x1.Args[1] 10339 mem := x1.Args[2] 10340 x0 := o0.Args[1] 10341 if x0.Op != Op386MOVWloadidx1 { 10342 break 10343 } 10344 i0 := x0.AuxInt 10345 if x0.Aux != s { 10346 break 10347 } 10348 _ = x0.Args[2] 10349 if idx != x0.Args[0] { 10350 break 10351 } 10352 if p != x0.Args[1] { 10353 break 10354 } 10355 if mem != x0.Args[2] { 10356 break 10357 } 10358 s1 := v.Args[1] 10359 if s1.Op != Op386SHLLconst { 10360 break 10361 } 10362 if s1.AuxInt != 24 { 10363 break 10364 } 10365 x2 := s1.Args[0] 10366 if x2.Op != Op386MOVBloadidx1 { 10367 break 10368 } 10369 i3 := x2.AuxInt 10370 if x2.Aux != s { 10371 break 10372 } 10373 _ = x2.Args[2] 10374 if p != x2.Args[0] { 10375 break 10376 } 10377 if idx != x2.Args[1] { 10378 break 10379 } 10380 if mem != x2.Args[2] { 10381 break 10382 } 10383 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)) { 10384 break 10385 } 10386 b = mergePoint(b, x0, x1, x2) 10387 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10388 v.reset(OpCopy) 10389 v.AddArg(v0) 10390 v0.AuxInt = i0 10391 v0.Aux = s 10392 v0.AddArg(p) 10393 v0.AddArg(idx) 10394 v0.AddArg(mem) 10395 return true 10396 } 10397 return false 10398 } 10399 func rewriteValue386_Op386ORL_30(v *Value) bool { 10400 b := v.Block 10401 _ = b 10402 // 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))) 10403 // 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) 10404 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10405 for { 10406 _ = v.Args[1] 10407 o0 := v.Args[0] 10408 if o0.Op != Op386ORL { 10409 break 10410 } 10411 _ = o0.Args[1] 10412 s0 := o0.Args[0] 10413 if s0.Op != Op386SHLLconst { 10414 break 10415 } 10416 if s0.AuxInt != 16 { 10417 break 10418 } 10419 x1 := s0.Args[0] 10420 if x1.Op != Op386MOVBloadidx1 { 10421 break 10422 } 10423 i2 := x1.AuxInt 10424 s := x1.Aux 10425 _ = x1.Args[2] 10426 idx := x1.Args[0] 10427 p := x1.Args[1] 10428 mem := x1.Args[2] 10429 x0 := o0.Args[1] 10430 if x0.Op != Op386MOVWloadidx1 { 10431 break 10432 } 10433 i0 := x0.AuxInt 10434 if x0.Aux != s { 10435 break 10436 } 10437 _ = x0.Args[2] 10438 if idx != x0.Args[0] { 10439 break 10440 } 10441 if p != x0.Args[1] { 10442 break 10443 } 10444 if mem != x0.Args[2] { 10445 break 10446 } 10447 s1 := v.Args[1] 10448 if s1.Op != Op386SHLLconst { 10449 break 10450 } 10451 if s1.AuxInt != 24 { 10452 break 10453 } 10454 x2 := s1.Args[0] 10455 if x2.Op != Op386MOVBloadidx1 { 10456 break 10457 } 10458 i3 := x2.AuxInt 10459 if x2.Aux != s { 10460 break 10461 } 10462 _ = x2.Args[2] 10463 if p != x2.Args[0] { 10464 break 10465 } 10466 if idx != x2.Args[1] { 10467 break 10468 } 10469 if mem != x2.Args[2] { 10470 break 10471 } 10472 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)) { 10473 break 10474 } 10475 b = mergePoint(b, x0, x1, x2) 10476 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10477 v.reset(OpCopy) 10478 v.AddArg(v0) 10479 v0.AuxInt = i0 10480 v0.Aux = s 10481 v0.AddArg(p) 10482 v0.AddArg(idx) 10483 v0.AddArg(mem) 10484 return true 10485 } 10486 // 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))) 10487 // 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) 10488 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10489 for { 10490 _ = v.Args[1] 10491 o0 := v.Args[0] 10492 if o0.Op != Op386ORL { 10493 break 10494 } 10495 _ = o0.Args[1] 10496 x0 := o0.Args[0] 10497 if x0.Op != Op386MOVWloadidx1 { 10498 break 10499 } 10500 i0 := x0.AuxInt 10501 s := x0.Aux 10502 _ = x0.Args[2] 10503 p := x0.Args[0] 10504 idx := x0.Args[1] 10505 mem := x0.Args[2] 10506 s0 := o0.Args[1] 10507 if s0.Op != Op386SHLLconst { 10508 break 10509 } 10510 if s0.AuxInt != 16 { 10511 break 10512 } 10513 x1 := s0.Args[0] 10514 if x1.Op != Op386MOVBloadidx1 { 10515 break 10516 } 10517 i2 := x1.AuxInt 10518 if x1.Aux != s { 10519 break 10520 } 10521 _ = x1.Args[2] 10522 if p != x1.Args[0] { 10523 break 10524 } 10525 if idx != x1.Args[1] { 10526 break 10527 } 10528 if mem != x1.Args[2] { 10529 break 10530 } 10531 s1 := v.Args[1] 10532 if s1.Op != Op386SHLLconst { 10533 break 10534 } 10535 if s1.AuxInt != 24 { 10536 break 10537 } 10538 x2 := s1.Args[0] 10539 if x2.Op != Op386MOVBloadidx1 { 10540 break 10541 } 10542 i3 := x2.AuxInt 10543 if x2.Aux != s { 10544 break 10545 } 10546 _ = x2.Args[2] 10547 if idx != x2.Args[0] { 10548 break 10549 } 10550 if p != x2.Args[1] { 10551 break 10552 } 10553 if mem != x2.Args[2] { 10554 break 10555 } 10556 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)) { 10557 break 10558 } 10559 b = mergePoint(b, x0, x1, x2) 10560 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10561 v.reset(OpCopy) 10562 v.AddArg(v0) 10563 v0.AuxInt = i0 10564 v0.Aux = s 10565 v0.AddArg(p) 10566 v0.AddArg(idx) 10567 v0.AddArg(mem) 10568 return true 10569 } 10570 // 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))) 10571 // 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) 10572 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10573 for { 10574 _ = v.Args[1] 10575 o0 := v.Args[0] 10576 if o0.Op != Op386ORL { 10577 break 10578 } 10579 _ = o0.Args[1] 10580 x0 := o0.Args[0] 10581 if x0.Op != Op386MOVWloadidx1 { 10582 break 10583 } 10584 i0 := x0.AuxInt 10585 s := x0.Aux 10586 _ = x0.Args[2] 10587 idx := x0.Args[0] 10588 p := x0.Args[1] 10589 mem := x0.Args[2] 10590 s0 := o0.Args[1] 10591 if s0.Op != Op386SHLLconst { 10592 break 10593 } 10594 if s0.AuxInt != 16 { 10595 break 10596 } 10597 x1 := s0.Args[0] 10598 if x1.Op != Op386MOVBloadidx1 { 10599 break 10600 } 10601 i2 := x1.AuxInt 10602 if x1.Aux != s { 10603 break 10604 } 10605 _ = x1.Args[2] 10606 if p != x1.Args[0] { 10607 break 10608 } 10609 if idx != x1.Args[1] { 10610 break 10611 } 10612 if mem != x1.Args[2] { 10613 break 10614 } 10615 s1 := v.Args[1] 10616 if s1.Op != Op386SHLLconst { 10617 break 10618 } 10619 if s1.AuxInt != 24 { 10620 break 10621 } 10622 x2 := s1.Args[0] 10623 if x2.Op != Op386MOVBloadidx1 { 10624 break 10625 } 10626 i3 := x2.AuxInt 10627 if x2.Aux != s { 10628 break 10629 } 10630 _ = x2.Args[2] 10631 if idx != x2.Args[0] { 10632 break 10633 } 10634 if p != x2.Args[1] { 10635 break 10636 } 10637 if mem != x2.Args[2] { 10638 break 10639 } 10640 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)) { 10641 break 10642 } 10643 b = mergePoint(b, x0, x1, x2) 10644 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10645 v.reset(OpCopy) 10646 v.AddArg(v0) 10647 v0.AuxInt = i0 10648 v0.Aux = s 10649 v0.AddArg(p) 10650 v0.AddArg(idx) 10651 v0.AddArg(mem) 10652 return true 10653 } 10654 // 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))) 10655 // 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) 10656 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10657 for { 10658 _ = v.Args[1] 10659 o0 := v.Args[0] 10660 if o0.Op != Op386ORL { 10661 break 10662 } 10663 _ = o0.Args[1] 10664 x0 := o0.Args[0] 10665 if x0.Op != Op386MOVWloadidx1 { 10666 break 10667 } 10668 i0 := x0.AuxInt 10669 s := x0.Aux 10670 _ = x0.Args[2] 10671 p := x0.Args[0] 10672 idx := x0.Args[1] 10673 mem := x0.Args[2] 10674 s0 := o0.Args[1] 10675 if s0.Op != Op386SHLLconst { 10676 break 10677 } 10678 if s0.AuxInt != 16 { 10679 break 10680 } 10681 x1 := s0.Args[0] 10682 if x1.Op != Op386MOVBloadidx1 { 10683 break 10684 } 10685 i2 := x1.AuxInt 10686 if x1.Aux != s { 10687 break 10688 } 10689 _ = x1.Args[2] 10690 if idx != x1.Args[0] { 10691 break 10692 } 10693 if p != x1.Args[1] { 10694 break 10695 } 10696 if mem != x1.Args[2] { 10697 break 10698 } 10699 s1 := v.Args[1] 10700 if s1.Op != Op386SHLLconst { 10701 break 10702 } 10703 if s1.AuxInt != 24 { 10704 break 10705 } 10706 x2 := s1.Args[0] 10707 if x2.Op != Op386MOVBloadidx1 { 10708 break 10709 } 10710 i3 := x2.AuxInt 10711 if x2.Aux != s { 10712 break 10713 } 10714 _ = x2.Args[2] 10715 if idx != x2.Args[0] { 10716 break 10717 } 10718 if p != x2.Args[1] { 10719 break 10720 } 10721 if mem != x2.Args[2] { 10722 break 10723 } 10724 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)) { 10725 break 10726 } 10727 b = mergePoint(b, x0, x1, x2) 10728 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10729 v.reset(OpCopy) 10730 v.AddArg(v0) 10731 v0.AuxInt = i0 10732 v0.Aux = s 10733 v0.AddArg(p) 10734 v0.AddArg(idx) 10735 v0.AddArg(mem) 10736 return true 10737 } 10738 // 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))) 10739 // 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) 10740 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10741 for { 10742 _ = v.Args[1] 10743 o0 := v.Args[0] 10744 if o0.Op != Op386ORL { 10745 break 10746 } 10747 _ = o0.Args[1] 10748 x0 := o0.Args[0] 10749 if x0.Op != Op386MOVWloadidx1 { 10750 break 10751 } 10752 i0 := x0.AuxInt 10753 s := x0.Aux 10754 _ = x0.Args[2] 10755 idx := x0.Args[0] 10756 p := x0.Args[1] 10757 mem := x0.Args[2] 10758 s0 := o0.Args[1] 10759 if s0.Op != Op386SHLLconst { 10760 break 10761 } 10762 if s0.AuxInt != 16 { 10763 break 10764 } 10765 x1 := s0.Args[0] 10766 if x1.Op != Op386MOVBloadidx1 { 10767 break 10768 } 10769 i2 := x1.AuxInt 10770 if x1.Aux != s { 10771 break 10772 } 10773 _ = x1.Args[2] 10774 if idx != x1.Args[0] { 10775 break 10776 } 10777 if p != x1.Args[1] { 10778 break 10779 } 10780 if mem != x1.Args[2] { 10781 break 10782 } 10783 s1 := v.Args[1] 10784 if s1.Op != Op386SHLLconst { 10785 break 10786 } 10787 if s1.AuxInt != 24 { 10788 break 10789 } 10790 x2 := s1.Args[0] 10791 if x2.Op != Op386MOVBloadidx1 { 10792 break 10793 } 10794 i3 := x2.AuxInt 10795 if x2.Aux != s { 10796 break 10797 } 10798 _ = x2.Args[2] 10799 if idx != x2.Args[0] { 10800 break 10801 } 10802 if p != x2.Args[1] { 10803 break 10804 } 10805 if mem != x2.Args[2] { 10806 break 10807 } 10808 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)) { 10809 break 10810 } 10811 b = mergePoint(b, x0, x1, x2) 10812 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10813 v.reset(OpCopy) 10814 v.AddArg(v0) 10815 v0.AuxInt = i0 10816 v0.Aux = s 10817 v0.AddArg(p) 10818 v0.AddArg(idx) 10819 v0.AddArg(mem) 10820 return true 10821 } 10822 // 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))) 10823 // 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) 10824 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10825 for { 10826 _ = v.Args[1] 10827 o0 := v.Args[0] 10828 if o0.Op != Op386ORL { 10829 break 10830 } 10831 _ = o0.Args[1] 10832 s0 := o0.Args[0] 10833 if s0.Op != Op386SHLLconst { 10834 break 10835 } 10836 if s0.AuxInt != 16 { 10837 break 10838 } 10839 x1 := s0.Args[0] 10840 if x1.Op != Op386MOVBloadidx1 { 10841 break 10842 } 10843 i2 := x1.AuxInt 10844 s := x1.Aux 10845 _ = x1.Args[2] 10846 p := x1.Args[0] 10847 idx := x1.Args[1] 10848 mem := x1.Args[2] 10849 x0 := o0.Args[1] 10850 if x0.Op != Op386MOVWloadidx1 { 10851 break 10852 } 10853 i0 := x0.AuxInt 10854 if x0.Aux != s { 10855 break 10856 } 10857 _ = x0.Args[2] 10858 if p != x0.Args[0] { 10859 break 10860 } 10861 if idx != x0.Args[1] { 10862 break 10863 } 10864 if mem != x0.Args[2] { 10865 break 10866 } 10867 s1 := v.Args[1] 10868 if s1.Op != Op386SHLLconst { 10869 break 10870 } 10871 if s1.AuxInt != 24 { 10872 break 10873 } 10874 x2 := s1.Args[0] 10875 if x2.Op != Op386MOVBloadidx1 { 10876 break 10877 } 10878 i3 := x2.AuxInt 10879 if x2.Aux != s { 10880 break 10881 } 10882 _ = x2.Args[2] 10883 if idx != x2.Args[0] { 10884 break 10885 } 10886 if p != x2.Args[1] { 10887 break 10888 } 10889 if mem != x2.Args[2] { 10890 break 10891 } 10892 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)) { 10893 break 10894 } 10895 b = mergePoint(b, x0, x1, x2) 10896 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10897 v.reset(OpCopy) 10898 v.AddArg(v0) 10899 v0.AuxInt = i0 10900 v0.Aux = s 10901 v0.AddArg(p) 10902 v0.AddArg(idx) 10903 v0.AddArg(mem) 10904 return true 10905 } 10906 // 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))) 10907 // 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) 10908 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10909 for { 10910 _ = v.Args[1] 10911 o0 := v.Args[0] 10912 if o0.Op != Op386ORL { 10913 break 10914 } 10915 _ = o0.Args[1] 10916 s0 := o0.Args[0] 10917 if s0.Op != Op386SHLLconst { 10918 break 10919 } 10920 if s0.AuxInt != 16 { 10921 break 10922 } 10923 x1 := s0.Args[0] 10924 if x1.Op != Op386MOVBloadidx1 { 10925 break 10926 } 10927 i2 := x1.AuxInt 10928 s := x1.Aux 10929 _ = x1.Args[2] 10930 idx := x1.Args[0] 10931 p := x1.Args[1] 10932 mem := x1.Args[2] 10933 x0 := o0.Args[1] 10934 if x0.Op != Op386MOVWloadidx1 { 10935 break 10936 } 10937 i0 := x0.AuxInt 10938 if x0.Aux != s { 10939 break 10940 } 10941 _ = x0.Args[2] 10942 if p != x0.Args[0] { 10943 break 10944 } 10945 if idx != x0.Args[1] { 10946 break 10947 } 10948 if mem != x0.Args[2] { 10949 break 10950 } 10951 s1 := v.Args[1] 10952 if s1.Op != Op386SHLLconst { 10953 break 10954 } 10955 if s1.AuxInt != 24 { 10956 break 10957 } 10958 x2 := s1.Args[0] 10959 if x2.Op != Op386MOVBloadidx1 { 10960 break 10961 } 10962 i3 := x2.AuxInt 10963 if x2.Aux != s { 10964 break 10965 } 10966 _ = x2.Args[2] 10967 if idx != x2.Args[0] { 10968 break 10969 } 10970 if p != x2.Args[1] { 10971 break 10972 } 10973 if mem != x2.Args[2] { 10974 break 10975 } 10976 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)) { 10977 break 10978 } 10979 b = mergePoint(b, x0, x1, x2) 10980 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10981 v.reset(OpCopy) 10982 v.AddArg(v0) 10983 v0.AuxInt = i0 10984 v0.Aux = s 10985 v0.AddArg(p) 10986 v0.AddArg(idx) 10987 v0.AddArg(mem) 10988 return true 10989 } 10990 // 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))) 10991 // 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) 10992 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10993 for { 10994 _ = v.Args[1] 10995 o0 := v.Args[0] 10996 if o0.Op != Op386ORL { 10997 break 10998 } 10999 _ = o0.Args[1] 11000 s0 := o0.Args[0] 11001 if s0.Op != Op386SHLLconst { 11002 break 11003 } 11004 if s0.AuxInt != 16 { 11005 break 11006 } 11007 x1 := s0.Args[0] 11008 if x1.Op != Op386MOVBloadidx1 { 11009 break 11010 } 11011 i2 := x1.AuxInt 11012 s := x1.Aux 11013 _ = x1.Args[2] 11014 p := x1.Args[0] 11015 idx := x1.Args[1] 11016 mem := x1.Args[2] 11017 x0 := o0.Args[1] 11018 if x0.Op != Op386MOVWloadidx1 { 11019 break 11020 } 11021 i0 := x0.AuxInt 11022 if x0.Aux != s { 11023 break 11024 } 11025 _ = x0.Args[2] 11026 if idx != x0.Args[0] { 11027 break 11028 } 11029 if p != x0.Args[1] { 11030 break 11031 } 11032 if mem != x0.Args[2] { 11033 break 11034 } 11035 s1 := v.Args[1] 11036 if s1.Op != Op386SHLLconst { 11037 break 11038 } 11039 if s1.AuxInt != 24 { 11040 break 11041 } 11042 x2 := s1.Args[0] 11043 if x2.Op != Op386MOVBloadidx1 { 11044 break 11045 } 11046 i3 := x2.AuxInt 11047 if x2.Aux != s { 11048 break 11049 } 11050 _ = x2.Args[2] 11051 if idx != x2.Args[0] { 11052 break 11053 } 11054 if p != x2.Args[1] { 11055 break 11056 } 11057 if mem != x2.Args[2] { 11058 break 11059 } 11060 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)) { 11061 break 11062 } 11063 b = mergePoint(b, x0, x1, x2) 11064 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11065 v.reset(OpCopy) 11066 v.AddArg(v0) 11067 v0.AuxInt = i0 11068 v0.Aux = s 11069 v0.AddArg(p) 11070 v0.AddArg(idx) 11071 v0.AddArg(mem) 11072 return true 11073 } 11074 // 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))) 11075 // 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) 11076 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11077 for { 11078 _ = v.Args[1] 11079 o0 := v.Args[0] 11080 if o0.Op != Op386ORL { 11081 break 11082 } 11083 _ = o0.Args[1] 11084 s0 := o0.Args[0] 11085 if s0.Op != Op386SHLLconst { 11086 break 11087 } 11088 if s0.AuxInt != 16 { 11089 break 11090 } 11091 x1 := s0.Args[0] 11092 if x1.Op != Op386MOVBloadidx1 { 11093 break 11094 } 11095 i2 := x1.AuxInt 11096 s := x1.Aux 11097 _ = x1.Args[2] 11098 idx := x1.Args[0] 11099 p := x1.Args[1] 11100 mem := x1.Args[2] 11101 x0 := o0.Args[1] 11102 if x0.Op != Op386MOVWloadidx1 { 11103 break 11104 } 11105 i0 := x0.AuxInt 11106 if x0.Aux != s { 11107 break 11108 } 11109 _ = x0.Args[2] 11110 if idx != x0.Args[0] { 11111 break 11112 } 11113 if p != x0.Args[1] { 11114 break 11115 } 11116 if mem != x0.Args[2] { 11117 break 11118 } 11119 s1 := v.Args[1] 11120 if s1.Op != Op386SHLLconst { 11121 break 11122 } 11123 if s1.AuxInt != 24 { 11124 break 11125 } 11126 x2 := s1.Args[0] 11127 if x2.Op != Op386MOVBloadidx1 { 11128 break 11129 } 11130 i3 := x2.AuxInt 11131 if x2.Aux != s { 11132 break 11133 } 11134 _ = x2.Args[2] 11135 if idx != x2.Args[0] { 11136 break 11137 } 11138 if p != x2.Args[1] { 11139 break 11140 } 11141 if mem != x2.Args[2] { 11142 break 11143 } 11144 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)) { 11145 break 11146 } 11147 b = mergePoint(b, x0, x1, x2) 11148 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11149 v.reset(OpCopy) 11150 v.AddArg(v0) 11151 v0.AuxInt = i0 11152 v0.Aux = s 11153 v0.AddArg(p) 11154 v0.AddArg(idx) 11155 v0.AddArg(mem) 11156 return true 11157 } 11158 // 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)))) 11159 // 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) 11160 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11161 for { 11162 _ = v.Args[1] 11163 s1 := v.Args[0] 11164 if s1.Op != Op386SHLLconst { 11165 break 11166 } 11167 if s1.AuxInt != 24 { 11168 break 11169 } 11170 x2 := s1.Args[0] 11171 if x2.Op != Op386MOVBloadidx1 { 11172 break 11173 } 11174 i3 := x2.AuxInt 11175 s := x2.Aux 11176 _ = x2.Args[2] 11177 p := x2.Args[0] 11178 idx := x2.Args[1] 11179 mem := x2.Args[2] 11180 o0 := v.Args[1] 11181 if o0.Op != Op386ORL { 11182 break 11183 } 11184 _ = o0.Args[1] 11185 x0 := o0.Args[0] 11186 if x0.Op != Op386MOVWloadidx1 { 11187 break 11188 } 11189 i0 := x0.AuxInt 11190 if x0.Aux != s { 11191 break 11192 } 11193 _ = x0.Args[2] 11194 if p != x0.Args[0] { 11195 break 11196 } 11197 if idx != x0.Args[1] { 11198 break 11199 } 11200 if mem != x0.Args[2] { 11201 break 11202 } 11203 s0 := o0.Args[1] 11204 if s0.Op != Op386SHLLconst { 11205 break 11206 } 11207 if s0.AuxInt != 16 { 11208 break 11209 } 11210 x1 := s0.Args[0] 11211 if x1.Op != Op386MOVBloadidx1 { 11212 break 11213 } 11214 i2 := x1.AuxInt 11215 if x1.Aux != s { 11216 break 11217 } 11218 _ = x1.Args[2] 11219 if p != x1.Args[0] { 11220 break 11221 } 11222 if idx != x1.Args[1] { 11223 break 11224 } 11225 if mem != x1.Args[2] { 11226 break 11227 } 11228 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)) { 11229 break 11230 } 11231 b = mergePoint(b, x0, x1, x2) 11232 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11233 v.reset(OpCopy) 11234 v.AddArg(v0) 11235 v0.AuxInt = i0 11236 v0.Aux = s 11237 v0.AddArg(p) 11238 v0.AddArg(idx) 11239 v0.AddArg(mem) 11240 return true 11241 } 11242 return false 11243 } 11244 func rewriteValue386_Op386ORL_40(v *Value) bool { 11245 b := v.Block 11246 _ = b 11247 // 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)))) 11248 // 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) 11249 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11250 for { 11251 _ = v.Args[1] 11252 s1 := v.Args[0] 11253 if s1.Op != Op386SHLLconst { 11254 break 11255 } 11256 if s1.AuxInt != 24 { 11257 break 11258 } 11259 x2 := s1.Args[0] 11260 if x2.Op != Op386MOVBloadidx1 { 11261 break 11262 } 11263 i3 := x2.AuxInt 11264 s := x2.Aux 11265 _ = x2.Args[2] 11266 idx := x2.Args[0] 11267 p := x2.Args[1] 11268 mem := x2.Args[2] 11269 o0 := v.Args[1] 11270 if o0.Op != Op386ORL { 11271 break 11272 } 11273 _ = o0.Args[1] 11274 x0 := o0.Args[0] 11275 if x0.Op != Op386MOVWloadidx1 { 11276 break 11277 } 11278 i0 := x0.AuxInt 11279 if x0.Aux != s { 11280 break 11281 } 11282 _ = x0.Args[2] 11283 if p != x0.Args[0] { 11284 break 11285 } 11286 if idx != x0.Args[1] { 11287 break 11288 } 11289 if mem != x0.Args[2] { 11290 break 11291 } 11292 s0 := o0.Args[1] 11293 if s0.Op != Op386SHLLconst { 11294 break 11295 } 11296 if s0.AuxInt != 16 { 11297 break 11298 } 11299 x1 := s0.Args[0] 11300 if x1.Op != Op386MOVBloadidx1 { 11301 break 11302 } 11303 i2 := x1.AuxInt 11304 if x1.Aux != s { 11305 break 11306 } 11307 _ = x1.Args[2] 11308 if p != x1.Args[0] { 11309 break 11310 } 11311 if idx != x1.Args[1] { 11312 break 11313 } 11314 if mem != x1.Args[2] { 11315 break 11316 } 11317 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)) { 11318 break 11319 } 11320 b = mergePoint(b, x0, x1, x2) 11321 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11322 v.reset(OpCopy) 11323 v.AddArg(v0) 11324 v0.AuxInt = i0 11325 v0.Aux = s 11326 v0.AddArg(p) 11327 v0.AddArg(idx) 11328 v0.AddArg(mem) 11329 return true 11330 } 11331 // 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)))) 11332 // 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) 11333 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11334 for { 11335 _ = v.Args[1] 11336 s1 := v.Args[0] 11337 if s1.Op != Op386SHLLconst { 11338 break 11339 } 11340 if s1.AuxInt != 24 { 11341 break 11342 } 11343 x2 := s1.Args[0] 11344 if x2.Op != Op386MOVBloadidx1 { 11345 break 11346 } 11347 i3 := x2.AuxInt 11348 s := x2.Aux 11349 _ = x2.Args[2] 11350 p := x2.Args[0] 11351 idx := x2.Args[1] 11352 mem := x2.Args[2] 11353 o0 := v.Args[1] 11354 if o0.Op != Op386ORL { 11355 break 11356 } 11357 _ = o0.Args[1] 11358 x0 := o0.Args[0] 11359 if x0.Op != Op386MOVWloadidx1 { 11360 break 11361 } 11362 i0 := x0.AuxInt 11363 if x0.Aux != s { 11364 break 11365 } 11366 _ = x0.Args[2] 11367 if idx != x0.Args[0] { 11368 break 11369 } 11370 if p != x0.Args[1] { 11371 break 11372 } 11373 if mem != x0.Args[2] { 11374 break 11375 } 11376 s0 := o0.Args[1] 11377 if s0.Op != Op386SHLLconst { 11378 break 11379 } 11380 if s0.AuxInt != 16 { 11381 break 11382 } 11383 x1 := s0.Args[0] 11384 if x1.Op != Op386MOVBloadidx1 { 11385 break 11386 } 11387 i2 := x1.AuxInt 11388 if x1.Aux != s { 11389 break 11390 } 11391 _ = x1.Args[2] 11392 if p != x1.Args[0] { 11393 break 11394 } 11395 if idx != x1.Args[1] { 11396 break 11397 } 11398 if mem != x1.Args[2] { 11399 break 11400 } 11401 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)) { 11402 break 11403 } 11404 b = mergePoint(b, x0, x1, x2) 11405 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11406 v.reset(OpCopy) 11407 v.AddArg(v0) 11408 v0.AuxInt = i0 11409 v0.Aux = s 11410 v0.AddArg(p) 11411 v0.AddArg(idx) 11412 v0.AddArg(mem) 11413 return true 11414 } 11415 // 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)))) 11416 // 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) 11417 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11418 for { 11419 _ = v.Args[1] 11420 s1 := v.Args[0] 11421 if s1.Op != Op386SHLLconst { 11422 break 11423 } 11424 if s1.AuxInt != 24 { 11425 break 11426 } 11427 x2 := s1.Args[0] 11428 if x2.Op != Op386MOVBloadidx1 { 11429 break 11430 } 11431 i3 := x2.AuxInt 11432 s := x2.Aux 11433 _ = x2.Args[2] 11434 idx := x2.Args[0] 11435 p := x2.Args[1] 11436 mem := x2.Args[2] 11437 o0 := v.Args[1] 11438 if o0.Op != Op386ORL { 11439 break 11440 } 11441 _ = o0.Args[1] 11442 x0 := o0.Args[0] 11443 if x0.Op != Op386MOVWloadidx1 { 11444 break 11445 } 11446 i0 := x0.AuxInt 11447 if x0.Aux != s { 11448 break 11449 } 11450 _ = x0.Args[2] 11451 if idx != x0.Args[0] { 11452 break 11453 } 11454 if p != x0.Args[1] { 11455 break 11456 } 11457 if mem != x0.Args[2] { 11458 break 11459 } 11460 s0 := o0.Args[1] 11461 if s0.Op != Op386SHLLconst { 11462 break 11463 } 11464 if s0.AuxInt != 16 { 11465 break 11466 } 11467 x1 := s0.Args[0] 11468 if x1.Op != Op386MOVBloadidx1 { 11469 break 11470 } 11471 i2 := x1.AuxInt 11472 if x1.Aux != s { 11473 break 11474 } 11475 _ = x1.Args[2] 11476 if p != x1.Args[0] { 11477 break 11478 } 11479 if idx != x1.Args[1] { 11480 break 11481 } 11482 if mem != x1.Args[2] { 11483 break 11484 } 11485 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)) { 11486 break 11487 } 11488 b = mergePoint(b, x0, x1, x2) 11489 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11490 v.reset(OpCopy) 11491 v.AddArg(v0) 11492 v0.AuxInt = i0 11493 v0.Aux = s 11494 v0.AddArg(p) 11495 v0.AddArg(idx) 11496 v0.AddArg(mem) 11497 return true 11498 } 11499 // 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)))) 11500 // 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) 11501 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11502 for { 11503 _ = v.Args[1] 11504 s1 := v.Args[0] 11505 if s1.Op != Op386SHLLconst { 11506 break 11507 } 11508 if s1.AuxInt != 24 { 11509 break 11510 } 11511 x2 := s1.Args[0] 11512 if x2.Op != Op386MOVBloadidx1 { 11513 break 11514 } 11515 i3 := x2.AuxInt 11516 s := x2.Aux 11517 _ = x2.Args[2] 11518 p := x2.Args[0] 11519 idx := x2.Args[1] 11520 mem := x2.Args[2] 11521 o0 := v.Args[1] 11522 if o0.Op != Op386ORL { 11523 break 11524 } 11525 _ = o0.Args[1] 11526 x0 := o0.Args[0] 11527 if x0.Op != Op386MOVWloadidx1 { 11528 break 11529 } 11530 i0 := x0.AuxInt 11531 if x0.Aux != s { 11532 break 11533 } 11534 _ = x0.Args[2] 11535 if p != x0.Args[0] { 11536 break 11537 } 11538 if idx != x0.Args[1] { 11539 break 11540 } 11541 if mem != x0.Args[2] { 11542 break 11543 } 11544 s0 := o0.Args[1] 11545 if s0.Op != Op386SHLLconst { 11546 break 11547 } 11548 if s0.AuxInt != 16 { 11549 break 11550 } 11551 x1 := s0.Args[0] 11552 if x1.Op != Op386MOVBloadidx1 { 11553 break 11554 } 11555 i2 := x1.AuxInt 11556 if x1.Aux != s { 11557 break 11558 } 11559 _ = x1.Args[2] 11560 if idx != x1.Args[0] { 11561 break 11562 } 11563 if p != x1.Args[1] { 11564 break 11565 } 11566 if mem != x1.Args[2] { 11567 break 11568 } 11569 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)) { 11570 break 11571 } 11572 b = mergePoint(b, x0, x1, x2) 11573 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11574 v.reset(OpCopy) 11575 v.AddArg(v0) 11576 v0.AuxInt = i0 11577 v0.Aux = s 11578 v0.AddArg(p) 11579 v0.AddArg(idx) 11580 v0.AddArg(mem) 11581 return true 11582 } 11583 // 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)))) 11584 // 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) 11585 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11586 for { 11587 _ = v.Args[1] 11588 s1 := v.Args[0] 11589 if s1.Op != Op386SHLLconst { 11590 break 11591 } 11592 if s1.AuxInt != 24 { 11593 break 11594 } 11595 x2 := s1.Args[0] 11596 if x2.Op != Op386MOVBloadidx1 { 11597 break 11598 } 11599 i3 := x2.AuxInt 11600 s := x2.Aux 11601 _ = x2.Args[2] 11602 idx := x2.Args[0] 11603 p := x2.Args[1] 11604 mem := x2.Args[2] 11605 o0 := v.Args[1] 11606 if o0.Op != Op386ORL { 11607 break 11608 } 11609 _ = o0.Args[1] 11610 x0 := o0.Args[0] 11611 if x0.Op != Op386MOVWloadidx1 { 11612 break 11613 } 11614 i0 := x0.AuxInt 11615 if x0.Aux != s { 11616 break 11617 } 11618 _ = x0.Args[2] 11619 if p != x0.Args[0] { 11620 break 11621 } 11622 if idx != x0.Args[1] { 11623 break 11624 } 11625 if mem != x0.Args[2] { 11626 break 11627 } 11628 s0 := o0.Args[1] 11629 if s0.Op != Op386SHLLconst { 11630 break 11631 } 11632 if s0.AuxInt != 16 { 11633 break 11634 } 11635 x1 := s0.Args[0] 11636 if x1.Op != Op386MOVBloadidx1 { 11637 break 11638 } 11639 i2 := x1.AuxInt 11640 if x1.Aux != s { 11641 break 11642 } 11643 _ = x1.Args[2] 11644 if idx != x1.Args[0] { 11645 break 11646 } 11647 if p != x1.Args[1] { 11648 break 11649 } 11650 if mem != x1.Args[2] { 11651 break 11652 } 11653 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)) { 11654 break 11655 } 11656 b = mergePoint(b, x0, x1, x2) 11657 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11658 v.reset(OpCopy) 11659 v.AddArg(v0) 11660 v0.AuxInt = i0 11661 v0.Aux = s 11662 v0.AddArg(p) 11663 v0.AddArg(idx) 11664 v0.AddArg(mem) 11665 return true 11666 } 11667 // 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)))) 11668 // 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) 11669 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11670 for { 11671 _ = v.Args[1] 11672 s1 := v.Args[0] 11673 if s1.Op != Op386SHLLconst { 11674 break 11675 } 11676 if s1.AuxInt != 24 { 11677 break 11678 } 11679 x2 := s1.Args[0] 11680 if x2.Op != Op386MOVBloadidx1 { 11681 break 11682 } 11683 i3 := x2.AuxInt 11684 s := x2.Aux 11685 _ = x2.Args[2] 11686 p := x2.Args[0] 11687 idx := x2.Args[1] 11688 mem := x2.Args[2] 11689 o0 := v.Args[1] 11690 if o0.Op != Op386ORL { 11691 break 11692 } 11693 _ = o0.Args[1] 11694 x0 := o0.Args[0] 11695 if x0.Op != Op386MOVWloadidx1 { 11696 break 11697 } 11698 i0 := x0.AuxInt 11699 if x0.Aux != s { 11700 break 11701 } 11702 _ = x0.Args[2] 11703 if idx != x0.Args[0] { 11704 break 11705 } 11706 if p != x0.Args[1] { 11707 break 11708 } 11709 if mem != x0.Args[2] { 11710 break 11711 } 11712 s0 := o0.Args[1] 11713 if s0.Op != Op386SHLLconst { 11714 break 11715 } 11716 if s0.AuxInt != 16 { 11717 break 11718 } 11719 x1 := s0.Args[0] 11720 if x1.Op != Op386MOVBloadidx1 { 11721 break 11722 } 11723 i2 := x1.AuxInt 11724 if x1.Aux != s { 11725 break 11726 } 11727 _ = x1.Args[2] 11728 if idx != x1.Args[0] { 11729 break 11730 } 11731 if p != x1.Args[1] { 11732 break 11733 } 11734 if mem != x1.Args[2] { 11735 break 11736 } 11737 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)) { 11738 break 11739 } 11740 b = mergePoint(b, x0, x1, x2) 11741 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11742 v.reset(OpCopy) 11743 v.AddArg(v0) 11744 v0.AuxInt = i0 11745 v0.Aux = s 11746 v0.AddArg(p) 11747 v0.AddArg(idx) 11748 v0.AddArg(mem) 11749 return true 11750 } 11751 // 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)))) 11752 // 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) 11753 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11754 for { 11755 _ = v.Args[1] 11756 s1 := v.Args[0] 11757 if s1.Op != Op386SHLLconst { 11758 break 11759 } 11760 if s1.AuxInt != 24 { 11761 break 11762 } 11763 x2 := s1.Args[0] 11764 if x2.Op != Op386MOVBloadidx1 { 11765 break 11766 } 11767 i3 := x2.AuxInt 11768 s := x2.Aux 11769 _ = x2.Args[2] 11770 idx := x2.Args[0] 11771 p := x2.Args[1] 11772 mem := x2.Args[2] 11773 o0 := v.Args[1] 11774 if o0.Op != Op386ORL { 11775 break 11776 } 11777 _ = o0.Args[1] 11778 x0 := o0.Args[0] 11779 if x0.Op != Op386MOVWloadidx1 { 11780 break 11781 } 11782 i0 := x0.AuxInt 11783 if x0.Aux != s { 11784 break 11785 } 11786 _ = x0.Args[2] 11787 if idx != x0.Args[0] { 11788 break 11789 } 11790 if p != x0.Args[1] { 11791 break 11792 } 11793 if mem != x0.Args[2] { 11794 break 11795 } 11796 s0 := o0.Args[1] 11797 if s0.Op != Op386SHLLconst { 11798 break 11799 } 11800 if s0.AuxInt != 16 { 11801 break 11802 } 11803 x1 := s0.Args[0] 11804 if x1.Op != Op386MOVBloadidx1 { 11805 break 11806 } 11807 i2 := x1.AuxInt 11808 if x1.Aux != s { 11809 break 11810 } 11811 _ = x1.Args[2] 11812 if idx != x1.Args[0] { 11813 break 11814 } 11815 if p != x1.Args[1] { 11816 break 11817 } 11818 if mem != x1.Args[2] { 11819 break 11820 } 11821 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)) { 11822 break 11823 } 11824 b = mergePoint(b, x0, x1, x2) 11825 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11826 v.reset(OpCopy) 11827 v.AddArg(v0) 11828 v0.AuxInt = i0 11829 v0.Aux = s 11830 v0.AddArg(p) 11831 v0.AddArg(idx) 11832 v0.AddArg(mem) 11833 return true 11834 } 11835 // 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))) 11836 // 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) 11837 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11838 for { 11839 _ = v.Args[1] 11840 s1 := v.Args[0] 11841 if s1.Op != Op386SHLLconst { 11842 break 11843 } 11844 if s1.AuxInt != 24 { 11845 break 11846 } 11847 x2 := s1.Args[0] 11848 if x2.Op != Op386MOVBloadidx1 { 11849 break 11850 } 11851 i3 := x2.AuxInt 11852 s := x2.Aux 11853 _ = x2.Args[2] 11854 p := x2.Args[0] 11855 idx := x2.Args[1] 11856 mem := x2.Args[2] 11857 o0 := v.Args[1] 11858 if o0.Op != Op386ORL { 11859 break 11860 } 11861 _ = o0.Args[1] 11862 s0 := o0.Args[0] 11863 if s0.Op != Op386SHLLconst { 11864 break 11865 } 11866 if s0.AuxInt != 16 { 11867 break 11868 } 11869 x1 := s0.Args[0] 11870 if x1.Op != Op386MOVBloadidx1 { 11871 break 11872 } 11873 i2 := x1.AuxInt 11874 if x1.Aux != s { 11875 break 11876 } 11877 _ = x1.Args[2] 11878 if p != x1.Args[0] { 11879 break 11880 } 11881 if idx != x1.Args[1] { 11882 break 11883 } 11884 if mem != x1.Args[2] { 11885 break 11886 } 11887 x0 := o0.Args[1] 11888 if x0.Op != Op386MOVWloadidx1 { 11889 break 11890 } 11891 i0 := x0.AuxInt 11892 if x0.Aux != s { 11893 break 11894 } 11895 _ = x0.Args[2] 11896 if p != x0.Args[0] { 11897 break 11898 } 11899 if idx != 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 // 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))) 11920 // 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) 11921 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11922 for { 11923 _ = v.Args[1] 11924 s1 := v.Args[0] 11925 if s1.Op != Op386SHLLconst { 11926 break 11927 } 11928 if s1.AuxInt != 24 { 11929 break 11930 } 11931 x2 := s1.Args[0] 11932 if x2.Op != Op386MOVBloadidx1 { 11933 break 11934 } 11935 i3 := x2.AuxInt 11936 s := x2.Aux 11937 _ = x2.Args[2] 11938 idx := x2.Args[0] 11939 p := x2.Args[1] 11940 mem := x2.Args[2] 11941 o0 := v.Args[1] 11942 if o0.Op != Op386ORL { 11943 break 11944 } 11945 _ = o0.Args[1] 11946 s0 := o0.Args[0] 11947 if s0.Op != Op386SHLLconst { 11948 break 11949 } 11950 if s0.AuxInt != 16 { 11951 break 11952 } 11953 x1 := s0.Args[0] 11954 if x1.Op != Op386MOVBloadidx1 { 11955 break 11956 } 11957 i2 := x1.AuxInt 11958 if x1.Aux != s { 11959 break 11960 } 11961 _ = x1.Args[2] 11962 if p != x1.Args[0] { 11963 break 11964 } 11965 if idx != x1.Args[1] { 11966 break 11967 } 11968 if mem != x1.Args[2] { 11969 break 11970 } 11971 x0 := o0.Args[1] 11972 if x0.Op != Op386MOVWloadidx1 { 11973 break 11974 } 11975 i0 := x0.AuxInt 11976 if x0.Aux != s { 11977 break 11978 } 11979 _ = x0.Args[2] 11980 if p != x0.Args[0] { 11981 break 11982 } 11983 if idx != x0.Args[1] { 11984 break 11985 } 11986 if mem != x0.Args[2] { 11987 break 11988 } 11989 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)) { 11990 break 11991 } 11992 b = mergePoint(b, x0, x1, x2) 11993 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11994 v.reset(OpCopy) 11995 v.AddArg(v0) 11996 v0.AuxInt = i0 11997 v0.Aux = s 11998 v0.AddArg(p) 11999 v0.AddArg(idx) 12000 v0.AddArg(mem) 12001 return true 12002 } 12003 // 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))) 12004 // 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) 12005 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12006 for { 12007 _ = v.Args[1] 12008 s1 := v.Args[0] 12009 if s1.Op != Op386SHLLconst { 12010 break 12011 } 12012 if s1.AuxInt != 24 { 12013 break 12014 } 12015 x2 := s1.Args[0] 12016 if x2.Op != Op386MOVBloadidx1 { 12017 break 12018 } 12019 i3 := x2.AuxInt 12020 s := x2.Aux 12021 _ = x2.Args[2] 12022 p := x2.Args[0] 12023 idx := x2.Args[1] 12024 mem := x2.Args[2] 12025 o0 := v.Args[1] 12026 if o0.Op != Op386ORL { 12027 break 12028 } 12029 _ = o0.Args[1] 12030 s0 := o0.Args[0] 12031 if s0.Op != Op386SHLLconst { 12032 break 12033 } 12034 if s0.AuxInt != 16 { 12035 break 12036 } 12037 x1 := s0.Args[0] 12038 if x1.Op != Op386MOVBloadidx1 { 12039 break 12040 } 12041 i2 := x1.AuxInt 12042 if x1.Aux != s { 12043 break 12044 } 12045 _ = x1.Args[2] 12046 if idx != x1.Args[0] { 12047 break 12048 } 12049 if p != x1.Args[1] { 12050 break 12051 } 12052 if mem != x1.Args[2] { 12053 break 12054 } 12055 x0 := o0.Args[1] 12056 if x0.Op != Op386MOVWloadidx1 { 12057 break 12058 } 12059 i0 := x0.AuxInt 12060 if x0.Aux != s { 12061 break 12062 } 12063 _ = x0.Args[2] 12064 if p != x0.Args[0] { 12065 break 12066 } 12067 if idx != x0.Args[1] { 12068 break 12069 } 12070 if mem != x0.Args[2] { 12071 break 12072 } 12073 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)) { 12074 break 12075 } 12076 b = mergePoint(b, x0, x1, x2) 12077 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12078 v.reset(OpCopy) 12079 v.AddArg(v0) 12080 v0.AuxInt = i0 12081 v0.Aux = s 12082 v0.AddArg(p) 12083 v0.AddArg(idx) 12084 v0.AddArg(mem) 12085 return true 12086 } 12087 return false 12088 } 12089 func rewriteValue386_Op386ORL_50(v *Value) bool { 12090 b := v.Block 12091 _ = b 12092 // 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))) 12093 // 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) 12094 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12095 for { 12096 _ = v.Args[1] 12097 s1 := v.Args[0] 12098 if s1.Op != Op386SHLLconst { 12099 break 12100 } 12101 if s1.AuxInt != 24 { 12102 break 12103 } 12104 x2 := s1.Args[0] 12105 if x2.Op != Op386MOVBloadidx1 { 12106 break 12107 } 12108 i3 := x2.AuxInt 12109 s := x2.Aux 12110 _ = x2.Args[2] 12111 idx := x2.Args[0] 12112 p := x2.Args[1] 12113 mem := x2.Args[2] 12114 o0 := v.Args[1] 12115 if o0.Op != Op386ORL { 12116 break 12117 } 12118 _ = o0.Args[1] 12119 s0 := o0.Args[0] 12120 if s0.Op != Op386SHLLconst { 12121 break 12122 } 12123 if s0.AuxInt != 16 { 12124 break 12125 } 12126 x1 := s0.Args[0] 12127 if x1.Op != Op386MOVBloadidx1 { 12128 break 12129 } 12130 i2 := x1.AuxInt 12131 if x1.Aux != s { 12132 break 12133 } 12134 _ = x1.Args[2] 12135 if idx != x1.Args[0] { 12136 break 12137 } 12138 if p != x1.Args[1] { 12139 break 12140 } 12141 if mem != x1.Args[2] { 12142 break 12143 } 12144 x0 := o0.Args[1] 12145 if x0.Op != Op386MOVWloadidx1 { 12146 break 12147 } 12148 i0 := x0.AuxInt 12149 if x0.Aux != s { 12150 break 12151 } 12152 _ = x0.Args[2] 12153 if p != x0.Args[0] { 12154 break 12155 } 12156 if idx != x0.Args[1] { 12157 break 12158 } 12159 if mem != x0.Args[2] { 12160 break 12161 } 12162 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)) { 12163 break 12164 } 12165 b = mergePoint(b, x0, x1, x2) 12166 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12167 v.reset(OpCopy) 12168 v.AddArg(v0) 12169 v0.AuxInt = i0 12170 v0.Aux = s 12171 v0.AddArg(p) 12172 v0.AddArg(idx) 12173 v0.AddArg(mem) 12174 return true 12175 } 12176 // 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))) 12177 // 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) 12178 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12179 for { 12180 _ = v.Args[1] 12181 s1 := v.Args[0] 12182 if s1.Op != Op386SHLLconst { 12183 break 12184 } 12185 if s1.AuxInt != 24 { 12186 break 12187 } 12188 x2 := s1.Args[0] 12189 if x2.Op != Op386MOVBloadidx1 { 12190 break 12191 } 12192 i3 := x2.AuxInt 12193 s := x2.Aux 12194 _ = x2.Args[2] 12195 p := x2.Args[0] 12196 idx := x2.Args[1] 12197 mem := x2.Args[2] 12198 o0 := v.Args[1] 12199 if o0.Op != Op386ORL { 12200 break 12201 } 12202 _ = o0.Args[1] 12203 s0 := o0.Args[0] 12204 if s0.Op != Op386SHLLconst { 12205 break 12206 } 12207 if s0.AuxInt != 16 { 12208 break 12209 } 12210 x1 := s0.Args[0] 12211 if x1.Op != Op386MOVBloadidx1 { 12212 break 12213 } 12214 i2 := x1.AuxInt 12215 if x1.Aux != s { 12216 break 12217 } 12218 _ = x1.Args[2] 12219 if p != x1.Args[0] { 12220 break 12221 } 12222 if idx != x1.Args[1] { 12223 break 12224 } 12225 if mem != x1.Args[2] { 12226 break 12227 } 12228 x0 := o0.Args[1] 12229 if x0.Op != Op386MOVWloadidx1 { 12230 break 12231 } 12232 i0 := x0.AuxInt 12233 if x0.Aux != s { 12234 break 12235 } 12236 _ = x0.Args[2] 12237 if idx != x0.Args[0] { 12238 break 12239 } 12240 if p != x0.Args[1] { 12241 break 12242 } 12243 if mem != x0.Args[2] { 12244 break 12245 } 12246 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)) { 12247 break 12248 } 12249 b = mergePoint(b, x0, x1, x2) 12250 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12251 v.reset(OpCopy) 12252 v.AddArg(v0) 12253 v0.AuxInt = i0 12254 v0.Aux = s 12255 v0.AddArg(p) 12256 v0.AddArg(idx) 12257 v0.AddArg(mem) 12258 return true 12259 } 12260 // 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))) 12261 // 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) 12262 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12263 for { 12264 _ = v.Args[1] 12265 s1 := v.Args[0] 12266 if s1.Op != Op386SHLLconst { 12267 break 12268 } 12269 if s1.AuxInt != 24 { 12270 break 12271 } 12272 x2 := s1.Args[0] 12273 if x2.Op != Op386MOVBloadidx1 { 12274 break 12275 } 12276 i3 := x2.AuxInt 12277 s := x2.Aux 12278 _ = x2.Args[2] 12279 idx := x2.Args[0] 12280 p := x2.Args[1] 12281 mem := x2.Args[2] 12282 o0 := v.Args[1] 12283 if o0.Op != Op386ORL { 12284 break 12285 } 12286 _ = o0.Args[1] 12287 s0 := o0.Args[0] 12288 if s0.Op != Op386SHLLconst { 12289 break 12290 } 12291 if s0.AuxInt != 16 { 12292 break 12293 } 12294 x1 := s0.Args[0] 12295 if x1.Op != Op386MOVBloadidx1 { 12296 break 12297 } 12298 i2 := x1.AuxInt 12299 if x1.Aux != s { 12300 break 12301 } 12302 _ = x1.Args[2] 12303 if p != x1.Args[0] { 12304 break 12305 } 12306 if idx != x1.Args[1] { 12307 break 12308 } 12309 if mem != x1.Args[2] { 12310 break 12311 } 12312 x0 := o0.Args[1] 12313 if x0.Op != Op386MOVWloadidx1 { 12314 break 12315 } 12316 i0 := x0.AuxInt 12317 if x0.Aux != s { 12318 break 12319 } 12320 _ = x0.Args[2] 12321 if idx != x0.Args[0] { 12322 break 12323 } 12324 if p != x0.Args[1] { 12325 break 12326 } 12327 if mem != x0.Args[2] { 12328 break 12329 } 12330 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)) { 12331 break 12332 } 12333 b = mergePoint(b, x0, x1, x2) 12334 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12335 v.reset(OpCopy) 12336 v.AddArg(v0) 12337 v0.AuxInt = i0 12338 v0.Aux = s 12339 v0.AddArg(p) 12340 v0.AddArg(idx) 12341 v0.AddArg(mem) 12342 return true 12343 } 12344 // 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))) 12345 // 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) 12346 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12347 for { 12348 _ = v.Args[1] 12349 s1 := v.Args[0] 12350 if s1.Op != Op386SHLLconst { 12351 break 12352 } 12353 if s1.AuxInt != 24 { 12354 break 12355 } 12356 x2 := s1.Args[0] 12357 if x2.Op != Op386MOVBloadidx1 { 12358 break 12359 } 12360 i3 := x2.AuxInt 12361 s := x2.Aux 12362 _ = x2.Args[2] 12363 p := x2.Args[0] 12364 idx := x2.Args[1] 12365 mem := x2.Args[2] 12366 o0 := v.Args[1] 12367 if o0.Op != Op386ORL { 12368 break 12369 } 12370 _ = o0.Args[1] 12371 s0 := o0.Args[0] 12372 if s0.Op != Op386SHLLconst { 12373 break 12374 } 12375 if s0.AuxInt != 16 { 12376 break 12377 } 12378 x1 := s0.Args[0] 12379 if x1.Op != Op386MOVBloadidx1 { 12380 break 12381 } 12382 i2 := x1.AuxInt 12383 if x1.Aux != s { 12384 break 12385 } 12386 _ = x1.Args[2] 12387 if idx != x1.Args[0] { 12388 break 12389 } 12390 if p != x1.Args[1] { 12391 break 12392 } 12393 if mem != x1.Args[2] { 12394 break 12395 } 12396 x0 := o0.Args[1] 12397 if x0.Op != Op386MOVWloadidx1 { 12398 break 12399 } 12400 i0 := x0.AuxInt 12401 if x0.Aux != s { 12402 break 12403 } 12404 _ = x0.Args[2] 12405 if idx != x0.Args[0] { 12406 break 12407 } 12408 if p != x0.Args[1] { 12409 break 12410 } 12411 if mem != x0.Args[2] { 12412 break 12413 } 12414 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)) { 12415 break 12416 } 12417 b = mergePoint(b, x0, x1, x2) 12418 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12419 v.reset(OpCopy) 12420 v.AddArg(v0) 12421 v0.AuxInt = i0 12422 v0.Aux = s 12423 v0.AddArg(p) 12424 v0.AddArg(idx) 12425 v0.AddArg(mem) 12426 return true 12427 } 12428 // 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))) 12429 // 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) 12430 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12431 for { 12432 _ = v.Args[1] 12433 s1 := v.Args[0] 12434 if s1.Op != Op386SHLLconst { 12435 break 12436 } 12437 if s1.AuxInt != 24 { 12438 break 12439 } 12440 x2 := s1.Args[0] 12441 if x2.Op != Op386MOVBloadidx1 { 12442 break 12443 } 12444 i3 := x2.AuxInt 12445 s := x2.Aux 12446 _ = x2.Args[2] 12447 idx := x2.Args[0] 12448 p := x2.Args[1] 12449 mem := x2.Args[2] 12450 o0 := v.Args[1] 12451 if o0.Op != Op386ORL { 12452 break 12453 } 12454 _ = o0.Args[1] 12455 s0 := o0.Args[0] 12456 if s0.Op != Op386SHLLconst { 12457 break 12458 } 12459 if s0.AuxInt != 16 { 12460 break 12461 } 12462 x1 := s0.Args[0] 12463 if x1.Op != Op386MOVBloadidx1 { 12464 break 12465 } 12466 i2 := x1.AuxInt 12467 if x1.Aux != s { 12468 break 12469 } 12470 _ = x1.Args[2] 12471 if idx != x1.Args[0] { 12472 break 12473 } 12474 if p != x1.Args[1] { 12475 break 12476 } 12477 if mem != x1.Args[2] { 12478 break 12479 } 12480 x0 := o0.Args[1] 12481 if x0.Op != Op386MOVWloadidx1 { 12482 break 12483 } 12484 i0 := x0.AuxInt 12485 if x0.Aux != s { 12486 break 12487 } 12488 _ = x0.Args[2] 12489 if idx != x0.Args[0] { 12490 break 12491 } 12492 if p != x0.Args[1] { 12493 break 12494 } 12495 if mem != x0.Args[2] { 12496 break 12497 } 12498 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)) { 12499 break 12500 } 12501 b = mergePoint(b, x0, x1, x2) 12502 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12503 v.reset(OpCopy) 12504 v.AddArg(v0) 12505 v0.AuxInt = i0 12506 v0.Aux = s 12507 v0.AddArg(p) 12508 v0.AddArg(idx) 12509 v0.AddArg(mem) 12510 return true 12511 } 12512 return false 12513 } 12514 func rewriteValue386_Op386ORLconst_0(v *Value) bool { 12515 // match: (ORLconst [c] x) 12516 // cond: int32(c)==0 12517 // result: x 12518 for { 12519 c := v.AuxInt 12520 x := v.Args[0] 12521 if !(int32(c) == 0) { 12522 break 12523 } 12524 v.reset(OpCopy) 12525 v.Type = x.Type 12526 v.AddArg(x) 12527 return true 12528 } 12529 // match: (ORLconst [c] _) 12530 // cond: int32(c)==-1 12531 // result: (MOVLconst [-1]) 12532 for { 12533 c := v.AuxInt 12534 if !(int32(c) == -1) { 12535 break 12536 } 12537 v.reset(Op386MOVLconst) 12538 v.AuxInt = -1 12539 return true 12540 } 12541 // match: (ORLconst [c] (MOVLconst [d])) 12542 // cond: 12543 // result: (MOVLconst [c|d]) 12544 for { 12545 c := v.AuxInt 12546 v_0 := v.Args[0] 12547 if v_0.Op != Op386MOVLconst { 12548 break 12549 } 12550 d := v_0.AuxInt 12551 v.reset(Op386MOVLconst) 12552 v.AuxInt = c | d 12553 return true 12554 } 12555 return false 12556 } 12557 func rewriteValue386_Op386ROLBconst_0(v *Value) bool { 12558 // match: (ROLBconst [c] (ROLBconst [d] x)) 12559 // cond: 12560 // result: (ROLBconst [(c+d)& 7] x) 12561 for { 12562 c := v.AuxInt 12563 v_0 := v.Args[0] 12564 if v_0.Op != Op386ROLBconst { 12565 break 12566 } 12567 d := v_0.AuxInt 12568 x := v_0.Args[0] 12569 v.reset(Op386ROLBconst) 12570 v.AuxInt = (c + d) & 7 12571 v.AddArg(x) 12572 return true 12573 } 12574 // match: (ROLBconst [0] x) 12575 // cond: 12576 // result: x 12577 for { 12578 if v.AuxInt != 0 { 12579 break 12580 } 12581 x := v.Args[0] 12582 v.reset(OpCopy) 12583 v.Type = x.Type 12584 v.AddArg(x) 12585 return true 12586 } 12587 return false 12588 } 12589 func rewriteValue386_Op386ROLLconst_0(v *Value) bool { 12590 // match: (ROLLconst [c] (ROLLconst [d] x)) 12591 // cond: 12592 // result: (ROLLconst [(c+d)&31] x) 12593 for { 12594 c := v.AuxInt 12595 v_0 := v.Args[0] 12596 if v_0.Op != Op386ROLLconst { 12597 break 12598 } 12599 d := v_0.AuxInt 12600 x := v_0.Args[0] 12601 v.reset(Op386ROLLconst) 12602 v.AuxInt = (c + d) & 31 12603 v.AddArg(x) 12604 return true 12605 } 12606 // match: (ROLLconst [0] x) 12607 // cond: 12608 // result: x 12609 for { 12610 if v.AuxInt != 0 { 12611 break 12612 } 12613 x := v.Args[0] 12614 v.reset(OpCopy) 12615 v.Type = x.Type 12616 v.AddArg(x) 12617 return true 12618 } 12619 return false 12620 } 12621 func rewriteValue386_Op386ROLWconst_0(v *Value) bool { 12622 // match: (ROLWconst [c] (ROLWconst [d] x)) 12623 // cond: 12624 // result: (ROLWconst [(c+d)&15] x) 12625 for { 12626 c := v.AuxInt 12627 v_0 := v.Args[0] 12628 if v_0.Op != Op386ROLWconst { 12629 break 12630 } 12631 d := v_0.AuxInt 12632 x := v_0.Args[0] 12633 v.reset(Op386ROLWconst) 12634 v.AuxInt = (c + d) & 15 12635 v.AddArg(x) 12636 return true 12637 } 12638 // match: (ROLWconst [0] x) 12639 // cond: 12640 // result: x 12641 for { 12642 if v.AuxInt != 0 { 12643 break 12644 } 12645 x := v.Args[0] 12646 v.reset(OpCopy) 12647 v.Type = x.Type 12648 v.AddArg(x) 12649 return true 12650 } 12651 return false 12652 } 12653 func rewriteValue386_Op386SARB_0(v *Value) bool { 12654 // match: (SARB x (MOVLconst [c])) 12655 // cond: 12656 // result: (SARBconst [min(c&31,7)] x) 12657 for { 12658 _ = v.Args[1] 12659 x := v.Args[0] 12660 v_1 := v.Args[1] 12661 if v_1.Op != Op386MOVLconst { 12662 break 12663 } 12664 c := v_1.AuxInt 12665 v.reset(Op386SARBconst) 12666 v.AuxInt = min(c&31, 7) 12667 v.AddArg(x) 12668 return true 12669 } 12670 return false 12671 } 12672 func rewriteValue386_Op386SARBconst_0(v *Value) bool { 12673 // match: (SARBconst x [0]) 12674 // cond: 12675 // result: x 12676 for { 12677 if v.AuxInt != 0 { 12678 break 12679 } 12680 x := v.Args[0] 12681 v.reset(OpCopy) 12682 v.Type = x.Type 12683 v.AddArg(x) 12684 return true 12685 } 12686 // match: (SARBconst [c] (MOVLconst [d])) 12687 // cond: 12688 // result: (MOVLconst [d>>uint64(c)]) 12689 for { 12690 c := v.AuxInt 12691 v_0 := v.Args[0] 12692 if v_0.Op != Op386MOVLconst { 12693 break 12694 } 12695 d := v_0.AuxInt 12696 v.reset(Op386MOVLconst) 12697 v.AuxInt = d >> uint64(c) 12698 return true 12699 } 12700 return false 12701 } 12702 func rewriteValue386_Op386SARL_0(v *Value) bool { 12703 // match: (SARL x (MOVLconst [c])) 12704 // cond: 12705 // result: (SARLconst [c&31] x) 12706 for { 12707 _ = v.Args[1] 12708 x := v.Args[0] 12709 v_1 := v.Args[1] 12710 if v_1.Op != Op386MOVLconst { 12711 break 12712 } 12713 c := v_1.AuxInt 12714 v.reset(Op386SARLconst) 12715 v.AuxInt = c & 31 12716 v.AddArg(x) 12717 return true 12718 } 12719 // match: (SARL x (ANDLconst [31] y)) 12720 // cond: 12721 // result: (SARL x y) 12722 for { 12723 _ = v.Args[1] 12724 x := v.Args[0] 12725 v_1 := v.Args[1] 12726 if v_1.Op != Op386ANDLconst { 12727 break 12728 } 12729 if v_1.AuxInt != 31 { 12730 break 12731 } 12732 y := v_1.Args[0] 12733 v.reset(Op386SARL) 12734 v.AddArg(x) 12735 v.AddArg(y) 12736 return true 12737 } 12738 return false 12739 } 12740 func rewriteValue386_Op386SARLconst_0(v *Value) bool { 12741 // match: (SARLconst x [0]) 12742 // cond: 12743 // result: x 12744 for { 12745 if v.AuxInt != 0 { 12746 break 12747 } 12748 x := v.Args[0] 12749 v.reset(OpCopy) 12750 v.Type = x.Type 12751 v.AddArg(x) 12752 return true 12753 } 12754 // match: (SARLconst [c] (MOVLconst [d])) 12755 // cond: 12756 // result: (MOVLconst [d>>uint64(c)]) 12757 for { 12758 c := v.AuxInt 12759 v_0 := v.Args[0] 12760 if v_0.Op != Op386MOVLconst { 12761 break 12762 } 12763 d := v_0.AuxInt 12764 v.reset(Op386MOVLconst) 12765 v.AuxInt = d >> uint64(c) 12766 return true 12767 } 12768 return false 12769 } 12770 func rewriteValue386_Op386SARW_0(v *Value) bool { 12771 // match: (SARW x (MOVLconst [c])) 12772 // cond: 12773 // result: (SARWconst [min(c&31,15)] x) 12774 for { 12775 _ = v.Args[1] 12776 x := v.Args[0] 12777 v_1 := v.Args[1] 12778 if v_1.Op != Op386MOVLconst { 12779 break 12780 } 12781 c := v_1.AuxInt 12782 v.reset(Op386SARWconst) 12783 v.AuxInt = min(c&31, 15) 12784 v.AddArg(x) 12785 return true 12786 } 12787 return false 12788 } 12789 func rewriteValue386_Op386SARWconst_0(v *Value) bool { 12790 // match: (SARWconst x [0]) 12791 // cond: 12792 // result: x 12793 for { 12794 if v.AuxInt != 0 { 12795 break 12796 } 12797 x := v.Args[0] 12798 v.reset(OpCopy) 12799 v.Type = x.Type 12800 v.AddArg(x) 12801 return true 12802 } 12803 // match: (SARWconst [c] (MOVLconst [d])) 12804 // cond: 12805 // result: (MOVLconst [d>>uint64(c)]) 12806 for { 12807 c := v.AuxInt 12808 v_0 := v.Args[0] 12809 if v_0.Op != Op386MOVLconst { 12810 break 12811 } 12812 d := v_0.AuxInt 12813 v.reset(Op386MOVLconst) 12814 v.AuxInt = d >> uint64(c) 12815 return true 12816 } 12817 return false 12818 } 12819 func rewriteValue386_Op386SBBL_0(v *Value) bool { 12820 // match: (SBBL x (MOVLconst [c]) f) 12821 // cond: 12822 // result: (SBBLconst [c] x f) 12823 for { 12824 _ = v.Args[2] 12825 x := v.Args[0] 12826 v_1 := v.Args[1] 12827 if v_1.Op != Op386MOVLconst { 12828 break 12829 } 12830 c := v_1.AuxInt 12831 f := v.Args[2] 12832 v.reset(Op386SBBLconst) 12833 v.AuxInt = c 12834 v.AddArg(x) 12835 v.AddArg(f) 12836 return true 12837 } 12838 return false 12839 } 12840 func rewriteValue386_Op386SBBLcarrymask_0(v *Value) bool { 12841 // match: (SBBLcarrymask (FlagEQ)) 12842 // cond: 12843 // result: (MOVLconst [0]) 12844 for { 12845 v_0 := v.Args[0] 12846 if v_0.Op != Op386FlagEQ { 12847 break 12848 } 12849 v.reset(Op386MOVLconst) 12850 v.AuxInt = 0 12851 return true 12852 } 12853 // match: (SBBLcarrymask (FlagLT_ULT)) 12854 // cond: 12855 // result: (MOVLconst [-1]) 12856 for { 12857 v_0 := v.Args[0] 12858 if v_0.Op != Op386FlagLT_ULT { 12859 break 12860 } 12861 v.reset(Op386MOVLconst) 12862 v.AuxInt = -1 12863 return true 12864 } 12865 // match: (SBBLcarrymask (FlagLT_UGT)) 12866 // cond: 12867 // result: (MOVLconst [0]) 12868 for { 12869 v_0 := v.Args[0] 12870 if v_0.Op != Op386FlagLT_UGT { 12871 break 12872 } 12873 v.reset(Op386MOVLconst) 12874 v.AuxInt = 0 12875 return true 12876 } 12877 // match: (SBBLcarrymask (FlagGT_ULT)) 12878 // cond: 12879 // result: (MOVLconst [-1]) 12880 for { 12881 v_0 := v.Args[0] 12882 if v_0.Op != Op386FlagGT_ULT { 12883 break 12884 } 12885 v.reset(Op386MOVLconst) 12886 v.AuxInt = -1 12887 return true 12888 } 12889 // match: (SBBLcarrymask (FlagGT_UGT)) 12890 // cond: 12891 // result: (MOVLconst [0]) 12892 for { 12893 v_0 := v.Args[0] 12894 if v_0.Op != Op386FlagGT_UGT { 12895 break 12896 } 12897 v.reset(Op386MOVLconst) 12898 v.AuxInt = 0 12899 return true 12900 } 12901 return false 12902 } 12903 func rewriteValue386_Op386SETA_0(v *Value) bool { 12904 // match: (SETA (InvertFlags x)) 12905 // cond: 12906 // result: (SETB x) 12907 for { 12908 v_0 := v.Args[0] 12909 if v_0.Op != Op386InvertFlags { 12910 break 12911 } 12912 x := v_0.Args[0] 12913 v.reset(Op386SETB) 12914 v.AddArg(x) 12915 return true 12916 } 12917 // match: (SETA (FlagEQ)) 12918 // cond: 12919 // result: (MOVLconst [0]) 12920 for { 12921 v_0 := v.Args[0] 12922 if v_0.Op != Op386FlagEQ { 12923 break 12924 } 12925 v.reset(Op386MOVLconst) 12926 v.AuxInt = 0 12927 return true 12928 } 12929 // match: (SETA (FlagLT_ULT)) 12930 // cond: 12931 // result: (MOVLconst [0]) 12932 for { 12933 v_0 := v.Args[0] 12934 if v_0.Op != Op386FlagLT_ULT { 12935 break 12936 } 12937 v.reset(Op386MOVLconst) 12938 v.AuxInt = 0 12939 return true 12940 } 12941 // match: (SETA (FlagLT_UGT)) 12942 // cond: 12943 // result: (MOVLconst [1]) 12944 for { 12945 v_0 := v.Args[0] 12946 if v_0.Op != Op386FlagLT_UGT { 12947 break 12948 } 12949 v.reset(Op386MOVLconst) 12950 v.AuxInt = 1 12951 return true 12952 } 12953 // match: (SETA (FlagGT_ULT)) 12954 // cond: 12955 // result: (MOVLconst [0]) 12956 for { 12957 v_0 := v.Args[0] 12958 if v_0.Op != Op386FlagGT_ULT { 12959 break 12960 } 12961 v.reset(Op386MOVLconst) 12962 v.AuxInt = 0 12963 return true 12964 } 12965 // match: (SETA (FlagGT_UGT)) 12966 // cond: 12967 // result: (MOVLconst [1]) 12968 for { 12969 v_0 := v.Args[0] 12970 if v_0.Op != Op386FlagGT_UGT { 12971 break 12972 } 12973 v.reset(Op386MOVLconst) 12974 v.AuxInt = 1 12975 return true 12976 } 12977 return false 12978 } 12979 func rewriteValue386_Op386SETAE_0(v *Value) bool { 12980 // match: (SETAE (InvertFlags x)) 12981 // cond: 12982 // result: (SETBE x) 12983 for { 12984 v_0 := v.Args[0] 12985 if v_0.Op != Op386InvertFlags { 12986 break 12987 } 12988 x := v_0.Args[0] 12989 v.reset(Op386SETBE) 12990 v.AddArg(x) 12991 return true 12992 } 12993 // match: (SETAE (FlagEQ)) 12994 // cond: 12995 // result: (MOVLconst [1]) 12996 for { 12997 v_0 := v.Args[0] 12998 if v_0.Op != Op386FlagEQ { 12999 break 13000 } 13001 v.reset(Op386MOVLconst) 13002 v.AuxInt = 1 13003 return true 13004 } 13005 // match: (SETAE (FlagLT_ULT)) 13006 // cond: 13007 // result: (MOVLconst [0]) 13008 for { 13009 v_0 := v.Args[0] 13010 if v_0.Op != Op386FlagLT_ULT { 13011 break 13012 } 13013 v.reset(Op386MOVLconst) 13014 v.AuxInt = 0 13015 return true 13016 } 13017 // match: (SETAE (FlagLT_UGT)) 13018 // cond: 13019 // result: (MOVLconst [1]) 13020 for { 13021 v_0 := v.Args[0] 13022 if v_0.Op != Op386FlagLT_UGT { 13023 break 13024 } 13025 v.reset(Op386MOVLconst) 13026 v.AuxInt = 1 13027 return true 13028 } 13029 // match: (SETAE (FlagGT_ULT)) 13030 // cond: 13031 // result: (MOVLconst [0]) 13032 for { 13033 v_0 := v.Args[0] 13034 if v_0.Op != Op386FlagGT_ULT { 13035 break 13036 } 13037 v.reset(Op386MOVLconst) 13038 v.AuxInt = 0 13039 return true 13040 } 13041 // match: (SETAE (FlagGT_UGT)) 13042 // cond: 13043 // result: (MOVLconst [1]) 13044 for { 13045 v_0 := v.Args[0] 13046 if v_0.Op != Op386FlagGT_UGT { 13047 break 13048 } 13049 v.reset(Op386MOVLconst) 13050 v.AuxInt = 1 13051 return true 13052 } 13053 return false 13054 } 13055 func rewriteValue386_Op386SETB_0(v *Value) bool { 13056 // match: (SETB (InvertFlags x)) 13057 // cond: 13058 // result: (SETA x) 13059 for { 13060 v_0 := v.Args[0] 13061 if v_0.Op != Op386InvertFlags { 13062 break 13063 } 13064 x := v_0.Args[0] 13065 v.reset(Op386SETA) 13066 v.AddArg(x) 13067 return true 13068 } 13069 // match: (SETB (FlagEQ)) 13070 // cond: 13071 // result: (MOVLconst [0]) 13072 for { 13073 v_0 := v.Args[0] 13074 if v_0.Op != Op386FlagEQ { 13075 break 13076 } 13077 v.reset(Op386MOVLconst) 13078 v.AuxInt = 0 13079 return true 13080 } 13081 // match: (SETB (FlagLT_ULT)) 13082 // cond: 13083 // result: (MOVLconst [1]) 13084 for { 13085 v_0 := v.Args[0] 13086 if v_0.Op != Op386FlagLT_ULT { 13087 break 13088 } 13089 v.reset(Op386MOVLconst) 13090 v.AuxInt = 1 13091 return true 13092 } 13093 // match: (SETB (FlagLT_UGT)) 13094 // cond: 13095 // result: (MOVLconst [0]) 13096 for { 13097 v_0 := v.Args[0] 13098 if v_0.Op != Op386FlagLT_UGT { 13099 break 13100 } 13101 v.reset(Op386MOVLconst) 13102 v.AuxInt = 0 13103 return true 13104 } 13105 // match: (SETB (FlagGT_ULT)) 13106 // cond: 13107 // result: (MOVLconst [1]) 13108 for { 13109 v_0 := v.Args[0] 13110 if v_0.Op != Op386FlagGT_ULT { 13111 break 13112 } 13113 v.reset(Op386MOVLconst) 13114 v.AuxInt = 1 13115 return true 13116 } 13117 // match: (SETB (FlagGT_UGT)) 13118 // cond: 13119 // result: (MOVLconst [0]) 13120 for { 13121 v_0 := v.Args[0] 13122 if v_0.Op != Op386FlagGT_UGT { 13123 break 13124 } 13125 v.reset(Op386MOVLconst) 13126 v.AuxInt = 0 13127 return true 13128 } 13129 return false 13130 } 13131 func rewriteValue386_Op386SETBE_0(v *Value) bool { 13132 // match: (SETBE (InvertFlags x)) 13133 // cond: 13134 // result: (SETAE x) 13135 for { 13136 v_0 := v.Args[0] 13137 if v_0.Op != Op386InvertFlags { 13138 break 13139 } 13140 x := v_0.Args[0] 13141 v.reset(Op386SETAE) 13142 v.AddArg(x) 13143 return true 13144 } 13145 // match: (SETBE (FlagEQ)) 13146 // cond: 13147 // result: (MOVLconst [1]) 13148 for { 13149 v_0 := v.Args[0] 13150 if v_0.Op != Op386FlagEQ { 13151 break 13152 } 13153 v.reset(Op386MOVLconst) 13154 v.AuxInt = 1 13155 return true 13156 } 13157 // match: (SETBE (FlagLT_ULT)) 13158 // cond: 13159 // result: (MOVLconst [1]) 13160 for { 13161 v_0 := v.Args[0] 13162 if v_0.Op != Op386FlagLT_ULT { 13163 break 13164 } 13165 v.reset(Op386MOVLconst) 13166 v.AuxInt = 1 13167 return true 13168 } 13169 // match: (SETBE (FlagLT_UGT)) 13170 // cond: 13171 // result: (MOVLconst [0]) 13172 for { 13173 v_0 := v.Args[0] 13174 if v_0.Op != Op386FlagLT_UGT { 13175 break 13176 } 13177 v.reset(Op386MOVLconst) 13178 v.AuxInt = 0 13179 return true 13180 } 13181 // match: (SETBE (FlagGT_ULT)) 13182 // cond: 13183 // result: (MOVLconst [1]) 13184 for { 13185 v_0 := v.Args[0] 13186 if v_0.Op != Op386FlagGT_ULT { 13187 break 13188 } 13189 v.reset(Op386MOVLconst) 13190 v.AuxInt = 1 13191 return true 13192 } 13193 // match: (SETBE (FlagGT_UGT)) 13194 // cond: 13195 // result: (MOVLconst [0]) 13196 for { 13197 v_0 := v.Args[0] 13198 if v_0.Op != Op386FlagGT_UGT { 13199 break 13200 } 13201 v.reset(Op386MOVLconst) 13202 v.AuxInt = 0 13203 return true 13204 } 13205 return false 13206 } 13207 func rewriteValue386_Op386SETEQ_0(v *Value) bool { 13208 // match: (SETEQ (InvertFlags x)) 13209 // cond: 13210 // result: (SETEQ x) 13211 for { 13212 v_0 := v.Args[0] 13213 if v_0.Op != Op386InvertFlags { 13214 break 13215 } 13216 x := v_0.Args[0] 13217 v.reset(Op386SETEQ) 13218 v.AddArg(x) 13219 return true 13220 } 13221 // match: (SETEQ (FlagEQ)) 13222 // cond: 13223 // result: (MOVLconst [1]) 13224 for { 13225 v_0 := v.Args[0] 13226 if v_0.Op != Op386FlagEQ { 13227 break 13228 } 13229 v.reset(Op386MOVLconst) 13230 v.AuxInt = 1 13231 return true 13232 } 13233 // match: (SETEQ (FlagLT_ULT)) 13234 // cond: 13235 // result: (MOVLconst [0]) 13236 for { 13237 v_0 := v.Args[0] 13238 if v_0.Op != Op386FlagLT_ULT { 13239 break 13240 } 13241 v.reset(Op386MOVLconst) 13242 v.AuxInt = 0 13243 return true 13244 } 13245 // match: (SETEQ (FlagLT_UGT)) 13246 // cond: 13247 // result: (MOVLconst [0]) 13248 for { 13249 v_0 := v.Args[0] 13250 if v_0.Op != Op386FlagLT_UGT { 13251 break 13252 } 13253 v.reset(Op386MOVLconst) 13254 v.AuxInt = 0 13255 return true 13256 } 13257 // match: (SETEQ (FlagGT_ULT)) 13258 // cond: 13259 // result: (MOVLconst [0]) 13260 for { 13261 v_0 := v.Args[0] 13262 if v_0.Op != Op386FlagGT_ULT { 13263 break 13264 } 13265 v.reset(Op386MOVLconst) 13266 v.AuxInt = 0 13267 return true 13268 } 13269 // match: (SETEQ (FlagGT_UGT)) 13270 // cond: 13271 // result: (MOVLconst [0]) 13272 for { 13273 v_0 := v.Args[0] 13274 if v_0.Op != Op386FlagGT_UGT { 13275 break 13276 } 13277 v.reset(Op386MOVLconst) 13278 v.AuxInt = 0 13279 return true 13280 } 13281 return false 13282 } 13283 func rewriteValue386_Op386SETG_0(v *Value) bool { 13284 // match: (SETG (InvertFlags x)) 13285 // cond: 13286 // result: (SETL x) 13287 for { 13288 v_0 := v.Args[0] 13289 if v_0.Op != Op386InvertFlags { 13290 break 13291 } 13292 x := v_0.Args[0] 13293 v.reset(Op386SETL) 13294 v.AddArg(x) 13295 return true 13296 } 13297 // match: (SETG (FlagEQ)) 13298 // cond: 13299 // result: (MOVLconst [0]) 13300 for { 13301 v_0 := v.Args[0] 13302 if v_0.Op != Op386FlagEQ { 13303 break 13304 } 13305 v.reset(Op386MOVLconst) 13306 v.AuxInt = 0 13307 return true 13308 } 13309 // match: (SETG (FlagLT_ULT)) 13310 // cond: 13311 // result: (MOVLconst [0]) 13312 for { 13313 v_0 := v.Args[0] 13314 if v_0.Op != Op386FlagLT_ULT { 13315 break 13316 } 13317 v.reset(Op386MOVLconst) 13318 v.AuxInt = 0 13319 return true 13320 } 13321 // match: (SETG (FlagLT_UGT)) 13322 // cond: 13323 // result: (MOVLconst [0]) 13324 for { 13325 v_0 := v.Args[0] 13326 if v_0.Op != Op386FlagLT_UGT { 13327 break 13328 } 13329 v.reset(Op386MOVLconst) 13330 v.AuxInt = 0 13331 return true 13332 } 13333 // match: (SETG (FlagGT_ULT)) 13334 // cond: 13335 // result: (MOVLconst [1]) 13336 for { 13337 v_0 := v.Args[0] 13338 if v_0.Op != Op386FlagGT_ULT { 13339 break 13340 } 13341 v.reset(Op386MOVLconst) 13342 v.AuxInt = 1 13343 return true 13344 } 13345 // match: (SETG (FlagGT_UGT)) 13346 // cond: 13347 // result: (MOVLconst [1]) 13348 for { 13349 v_0 := v.Args[0] 13350 if v_0.Op != Op386FlagGT_UGT { 13351 break 13352 } 13353 v.reset(Op386MOVLconst) 13354 v.AuxInt = 1 13355 return true 13356 } 13357 return false 13358 } 13359 func rewriteValue386_Op386SETGE_0(v *Value) bool { 13360 // match: (SETGE (InvertFlags x)) 13361 // cond: 13362 // result: (SETLE x) 13363 for { 13364 v_0 := v.Args[0] 13365 if v_0.Op != Op386InvertFlags { 13366 break 13367 } 13368 x := v_0.Args[0] 13369 v.reset(Op386SETLE) 13370 v.AddArg(x) 13371 return true 13372 } 13373 // match: (SETGE (FlagEQ)) 13374 // cond: 13375 // result: (MOVLconst [1]) 13376 for { 13377 v_0 := v.Args[0] 13378 if v_0.Op != Op386FlagEQ { 13379 break 13380 } 13381 v.reset(Op386MOVLconst) 13382 v.AuxInt = 1 13383 return true 13384 } 13385 // match: (SETGE (FlagLT_ULT)) 13386 // cond: 13387 // result: (MOVLconst [0]) 13388 for { 13389 v_0 := v.Args[0] 13390 if v_0.Op != Op386FlagLT_ULT { 13391 break 13392 } 13393 v.reset(Op386MOVLconst) 13394 v.AuxInt = 0 13395 return true 13396 } 13397 // match: (SETGE (FlagLT_UGT)) 13398 // cond: 13399 // result: (MOVLconst [0]) 13400 for { 13401 v_0 := v.Args[0] 13402 if v_0.Op != Op386FlagLT_UGT { 13403 break 13404 } 13405 v.reset(Op386MOVLconst) 13406 v.AuxInt = 0 13407 return true 13408 } 13409 // match: (SETGE (FlagGT_ULT)) 13410 // cond: 13411 // result: (MOVLconst [1]) 13412 for { 13413 v_0 := v.Args[0] 13414 if v_0.Op != Op386FlagGT_ULT { 13415 break 13416 } 13417 v.reset(Op386MOVLconst) 13418 v.AuxInt = 1 13419 return true 13420 } 13421 // match: (SETGE (FlagGT_UGT)) 13422 // cond: 13423 // result: (MOVLconst [1]) 13424 for { 13425 v_0 := v.Args[0] 13426 if v_0.Op != Op386FlagGT_UGT { 13427 break 13428 } 13429 v.reset(Op386MOVLconst) 13430 v.AuxInt = 1 13431 return true 13432 } 13433 return false 13434 } 13435 func rewriteValue386_Op386SETL_0(v *Value) bool { 13436 // match: (SETL (InvertFlags x)) 13437 // cond: 13438 // result: (SETG x) 13439 for { 13440 v_0 := v.Args[0] 13441 if v_0.Op != Op386InvertFlags { 13442 break 13443 } 13444 x := v_0.Args[0] 13445 v.reset(Op386SETG) 13446 v.AddArg(x) 13447 return true 13448 } 13449 // match: (SETL (FlagEQ)) 13450 // cond: 13451 // result: (MOVLconst [0]) 13452 for { 13453 v_0 := v.Args[0] 13454 if v_0.Op != Op386FlagEQ { 13455 break 13456 } 13457 v.reset(Op386MOVLconst) 13458 v.AuxInt = 0 13459 return true 13460 } 13461 // match: (SETL (FlagLT_ULT)) 13462 // cond: 13463 // result: (MOVLconst [1]) 13464 for { 13465 v_0 := v.Args[0] 13466 if v_0.Op != Op386FlagLT_ULT { 13467 break 13468 } 13469 v.reset(Op386MOVLconst) 13470 v.AuxInt = 1 13471 return true 13472 } 13473 // match: (SETL (FlagLT_UGT)) 13474 // cond: 13475 // result: (MOVLconst [1]) 13476 for { 13477 v_0 := v.Args[0] 13478 if v_0.Op != Op386FlagLT_UGT { 13479 break 13480 } 13481 v.reset(Op386MOVLconst) 13482 v.AuxInt = 1 13483 return true 13484 } 13485 // match: (SETL (FlagGT_ULT)) 13486 // cond: 13487 // result: (MOVLconst [0]) 13488 for { 13489 v_0 := v.Args[0] 13490 if v_0.Op != Op386FlagGT_ULT { 13491 break 13492 } 13493 v.reset(Op386MOVLconst) 13494 v.AuxInt = 0 13495 return true 13496 } 13497 // match: (SETL (FlagGT_UGT)) 13498 // cond: 13499 // result: (MOVLconst [0]) 13500 for { 13501 v_0 := v.Args[0] 13502 if v_0.Op != Op386FlagGT_UGT { 13503 break 13504 } 13505 v.reset(Op386MOVLconst) 13506 v.AuxInt = 0 13507 return true 13508 } 13509 return false 13510 } 13511 func rewriteValue386_Op386SETLE_0(v *Value) bool { 13512 // match: (SETLE (InvertFlags x)) 13513 // cond: 13514 // result: (SETGE x) 13515 for { 13516 v_0 := v.Args[0] 13517 if v_0.Op != Op386InvertFlags { 13518 break 13519 } 13520 x := v_0.Args[0] 13521 v.reset(Op386SETGE) 13522 v.AddArg(x) 13523 return true 13524 } 13525 // match: (SETLE (FlagEQ)) 13526 // cond: 13527 // result: (MOVLconst [1]) 13528 for { 13529 v_0 := v.Args[0] 13530 if v_0.Op != Op386FlagEQ { 13531 break 13532 } 13533 v.reset(Op386MOVLconst) 13534 v.AuxInt = 1 13535 return true 13536 } 13537 // match: (SETLE (FlagLT_ULT)) 13538 // cond: 13539 // result: (MOVLconst [1]) 13540 for { 13541 v_0 := v.Args[0] 13542 if v_0.Op != Op386FlagLT_ULT { 13543 break 13544 } 13545 v.reset(Op386MOVLconst) 13546 v.AuxInt = 1 13547 return true 13548 } 13549 // match: (SETLE (FlagLT_UGT)) 13550 // cond: 13551 // result: (MOVLconst [1]) 13552 for { 13553 v_0 := v.Args[0] 13554 if v_0.Op != Op386FlagLT_UGT { 13555 break 13556 } 13557 v.reset(Op386MOVLconst) 13558 v.AuxInt = 1 13559 return true 13560 } 13561 // match: (SETLE (FlagGT_ULT)) 13562 // cond: 13563 // result: (MOVLconst [0]) 13564 for { 13565 v_0 := v.Args[0] 13566 if v_0.Op != Op386FlagGT_ULT { 13567 break 13568 } 13569 v.reset(Op386MOVLconst) 13570 v.AuxInt = 0 13571 return true 13572 } 13573 // match: (SETLE (FlagGT_UGT)) 13574 // cond: 13575 // result: (MOVLconst [0]) 13576 for { 13577 v_0 := v.Args[0] 13578 if v_0.Op != Op386FlagGT_UGT { 13579 break 13580 } 13581 v.reset(Op386MOVLconst) 13582 v.AuxInt = 0 13583 return true 13584 } 13585 return false 13586 } 13587 func rewriteValue386_Op386SETNE_0(v *Value) bool { 13588 // match: (SETNE (InvertFlags x)) 13589 // cond: 13590 // result: (SETNE x) 13591 for { 13592 v_0 := v.Args[0] 13593 if v_0.Op != Op386InvertFlags { 13594 break 13595 } 13596 x := v_0.Args[0] 13597 v.reset(Op386SETNE) 13598 v.AddArg(x) 13599 return true 13600 } 13601 // match: (SETNE (FlagEQ)) 13602 // cond: 13603 // result: (MOVLconst [0]) 13604 for { 13605 v_0 := v.Args[0] 13606 if v_0.Op != Op386FlagEQ { 13607 break 13608 } 13609 v.reset(Op386MOVLconst) 13610 v.AuxInt = 0 13611 return true 13612 } 13613 // match: (SETNE (FlagLT_ULT)) 13614 // cond: 13615 // result: (MOVLconst [1]) 13616 for { 13617 v_0 := v.Args[0] 13618 if v_0.Op != Op386FlagLT_ULT { 13619 break 13620 } 13621 v.reset(Op386MOVLconst) 13622 v.AuxInt = 1 13623 return true 13624 } 13625 // match: (SETNE (FlagLT_UGT)) 13626 // cond: 13627 // result: (MOVLconst [1]) 13628 for { 13629 v_0 := v.Args[0] 13630 if v_0.Op != Op386FlagLT_UGT { 13631 break 13632 } 13633 v.reset(Op386MOVLconst) 13634 v.AuxInt = 1 13635 return true 13636 } 13637 // match: (SETNE (FlagGT_ULT)) 13638 // cond: 13639 // result: (MOVLconst [1]) 13640 for { 13641 v_0 := v.Args[0] 13642 if v_0.Op != Op386FlagGT_ULT { 13643 break 13644 } 13645 v.reset(Op386MOVLconst) 13646 v.AuxInt = 1 13647 return true 13648 } 13649 // match: (SETNE (FlagGT_UGT)) 13650 // cond: 13651 // result: (MOVLconst [1]) 13652 for { 13653 v_0 := v.Args[0] 13654 if v_0.Op != Op386FlagGT_UGT { 13655 break 13656 } 13657 v.reset(Op386MOVLconst) 13658 v.AuxInt = 1 13659 return true 13660 } 13661 return false 13662 } 13663 func rewriteValue386_Op386SHLL_0(v *Value) bool { 13664 // match: (SHLL x (MOVLconst [c])) 13665 // cond: 13666 // result: (SHLLconst [c&31] x) 13667 for { 13668 _ = v.Args[1] 13669 x := v.Args[0] 13670 v_1 := v.Args[1] 13671 if v_1.Op != Op386MOVLconst { 13672 break 13673 } 13674 c := v_1.AuxInt 13675 v.reset(Op386SHLLconst) 13676 v.AuxInt = c & 31 13677 v.AddArg(x) 13678 return true 13679 } 13680 // match: (SHLL x (ANDLconst [31] y)) 13681 // cond: 13682 // result: (SHLL x y) 13683 for { 13684 _ = v.Args[1] 13685 x := v.Args[0] 13686 v_1 := v.Args[1] 13687 if v_1.Op != Op386ANDLconst { 13688 break 13689 } 13690 if v_1.AuxInt != 31 { 13691 break 13692 } 13693 y := v_1.Args[0] 13694 v.reset(Op386SHLL) 13695 v.AddArg(x) 13696 v.AddArg(y) 13697 return true 13698 } 13699 return false 13700 } 13701 func rewriteValue386_Op386SHLLconst_0(v *Value) bool { 13702 // match: (SHLLconst x [0]) 13703 // cond: 13704 // result: x 13705 for { 13706 if v.AuxInt != 0 { 13707 break 13708 } 13709 x := v.Args[0] 13710 v.reset(OpCopy) 13711 v.Type = x.Type 13712 v.AddArg(x) 13713 return true 13714 } 13715 return false 13716 } 13717 func rewriteValue386_Op386SHRB_0(v *Value) bool { 13718 // match: (SHRB x (MOVLconst [c])) 13719 // cond: c&31 < 8 13720 // result: (SHRBconst [c&31] x) 13721 for { 13722 _ = v.Args[1] 13723 x := v.Args[0] 13724 v_1 := v.Args[1] 13725 if v_1.Op != Op386MOVLconst { 13726 break 13727 } 13728 c := v_1.AuxInt 13729 if !(c&31 < 8) { 13730 break 13731 } 13732 v.reset(Op386SHRBconst) 13733 v.AuxInt = c & 31 13734 v.AddArg(x) 13735 return true 13736 } 13737 // match: (SHRB _ (MOVLconst [c])) 13738 // cond: c&31 >= 8 13739 // result: (MOVLconst [0]) 13740 for { 13741 _ = v.Args[1] 13742 v_1 := v.Args[1] 13743 if v_1.Op != Op386MOVLconst { 13744 break 13745 } 13746 c := v_1.AuxInt 13747 if !(c&31 >= 8) { 13748 break 13749 } 13750 v.reset(Op386MOVLconst) 13751 v.AuxInt = 0 13752 return true 13753 } 13754 return false 13755 } 13756 func rewriteValue386_Op386SHRBconst_0(v *Value) bool { 13757 // match: (SHRBconst x [0]) 13758 // cond: 13759 // result: x 13760 for { 13761 if v.AuxInt != 0 { 13762 break 13763 } 13764 x := v.Args[0] 13765 v.reset(OpCopy) 13766 v.Type = x.Type 13767 v.AddArg(x) 13768 return true 13769 } 13770 return false 13771 } 13772 func rewriteValue386_Op386SHRL_0(v *Value) bool { 13773 // match: (SHRL x (MOVLconst [c])) 13774 // cond: 13775 // result: (SHRLconst [c&31] x) 13776 for { 13777 _ = v.Args[1] 13778 x := v.Args[0] 13779 v_1 := v.Args[1] 13780 if v_1.Op != Op386MOVLconst { 13781 break 13782 } 13783 c := v_1.AuxInt 13784 v.reset(Op386SHRLconst) 13785 v.AuxInt = c & 31 13786 v.AddArg(x) 13787 return true 13788 } 13789 // match: (SHRL x (ANDLconst [31] y)) 13790 // cond: 13791 // result: (SHRL x y) 13792 for { 13793 _ = v.Args[1] 13794 x := v.Args[0] 13795 v_1 := v.Args[1] 13796 if v_1.Op != Op386ANDLconst { 13797 break 13798 } 13799 if v_1.AuxInt != 31 { 13800 break 13801 } 13802 y := v_1.Args[0] 13803 v.reset(Op386SHRL) 13804 v.AddArg(x) 13805 v.AddArg(y) 13806 return true 13807 } 13808 return false 13809 } 13810 func rewriteValue386_Op386SHRLconst_0(v *Value) bool { 13811 // match: (SHRLconst x [0]) 13812 // cond: 13813 // result: x 13814 for { 13815 if v.AuxInt != 0 { 13816 break 13817 } 13818 x := v.Args[0] 13819 v.reset(OpCopy) 13820 v.Type = x.Type 13821 v.AddArg(x) 13822 return true 13823 } 13824 return false 13825 } 13826 func rewriteValue386_Op386SHRW_0(v *Value) bool { 13827 // match: (SHRW x (MOVLconst [c])) 13828 // cond: c&31 < 16 13829 // result: (SHRWconst [c&31] x) 13830 for { 13831 _ = v.Args[1] 13832 x := v.Args[0] 13833 v_1 := v.Args[1] 13834 if v_1.Op != Op386MOVLconst { 13835 break 13836 } 13837 c := v_1.AuxInt 13838 if !(c&31 < 16) { 13839 break 13840 } 13841 v.reset(Op386SHRWconst) 13842 v.AuxInt = c & 31 13843 v.AddArg(x) 13844 return true 13845 } 13846 // match: (SHRW _ (MOVLconst [c])) 13847 // cond: c&31 >= 16 13848 // result: (MOVLconst [0]) 13849 for { 13850 _ = v.Args[1] 13851 v_1 := v.Args[1] 13852 if v_1.Op != Op386MOVLconst { 13853 break 13854 } 13855 c := v_1.AuxInt 13856 if !(c&31 >= 16) { 13857 break 13858 } 13859 v.reset(Op386MOVLconst) 13860 v.AuxInt = 0 13861 return true 13862 } 13863 return false 13864 } 13865 func rewriteValue386_Op386SHRWconst_0(v *Value) bool { 13866 // match: (SHRWconst x [0]) 13867 // cond: 13868 // result: x 13869 for { 13870 if v.AuxInt != 0 { 13871 break 13872 } 13873 x := v.Args[0] 13874 v.reset(OpCopy) 13875 v.Type = x.Type 13876 v.AddArg(x) 13877 return true 13878 } 13879 return false 13880 } 13881 func rewriteValue386_Op386SUBL_0(v *Value) bool { 13882 b := v.Block 13883 _ = b 13884 // match: (SUBL x (MOVLconst [c])) 13885 // cond: 13886 // result: (SUBLconst x [c]) 13887 for { 13888 _ = v.Args[1] 13889 x := v.Args[0] 13890 v_1 := v.Args[1] 13891 if v_1.Op != Op386MOVLconst { 13892 break 13893 } 13894 c := v_1.AuxInt 13895 v.reset(Op386SUBLconst) 13896 v.AuxInt = c 13897 v.AddArg(x) 13898 return true 13899 } 13900 // match: (SUBL (MOVLconst [c]) x) 13901 // cond: 13902 // result: (NEGL (SUBLconst <v.Type> x [c])) 13903 for { 13904 _ = v.Args[1] 13905 v_0 := v.Args[0] 13906 if v_0.Op != Op386MOVLconst { 13907 break 13908 } 13909 c := v_0.AuxInt 13910 x := v.Args[1] 13911 v.reset(Op386NEGL) 13912 v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) 13913 v0.AuxInt = c 13914 v0.AddArg(x) 13915 v.AddArg(v0) 13916 return true 13917 } 13918 // match: (SUBL x x) 13919 // cond: 13920 // result: (MOVLconst [0]) 13921 for { 13922 _ = v.Args[1] 13923 x := v.Args[0] 13924 if x != v.Args[1] { 13925 break 13926 } 13927 v.reset(Op386MOVLconst) 13928 v.AuxInt = 0 13929 return true 13930 } 13931 return false 13932 } 13933 func rewriteValue386_Op386SUBLcarry_0(v *Value) bool { 13934 // match: (SUBLcarry x (MOVLconst [c])) 13935 // cond: 13936 // result: (SUBLconstcarry [c] x) 13937 for { 13938 _ = v.Args[1] 13939 x := v.Args[0] 13940 v_1 := v.Args[1] 13941 if v_1.Op != Op386MOVLconst { 13942 break 13943 } 13944 c := v_1.AuxInt 13945 v.reset(Op386SUBLconstcarry) 13946 v.AuxInt = c 13947 v.AddArg(x) 13948 return true 13949 } 13950 return false 13951 } 13952 func rewriteValue386_Op386SUBLconst_0(v *Value) bool { 13953 // match: (SUBLconst [c] x) 13954 // cond: int32(c) == 0 13955 // result: x 13956 for { 13957 c := v.AuxInt 13958 x := v.Args[0] 13959 if !(int32(c) == 0) { 13960 break 13961 } 13962 v.reset(OpCopy) 13963 v.Type = x.Type 13964 v.AddArg(x) 13965 return true 13966 } 13967 // match: (SUBLconst [c] x) 13968 // cond: 13969 // result: (ADDLconst [int64(int32(-c))] x) 13970 for { 13971 c := v.AuxInt 13972 x := v.Args[0] 13973 v.reset(Op386ADDLconst) 13974 v.AuxInt = int64(int32(-c)) 13975 v.AddArg(x) 13976 return true 13977 } 13978 } 13979 func rewriteValue386_Op386XORL_0(v *Value) bool { 13980 // match: (XORL x (MOVLconst [c])) 13981 // cond: 13982 // result: (XORLconst [c] x) 13983 for { 13984 _ = v.Args[1] 13985 x := v.Args[0] 13986 v_1 := v.Args[1] 13987 if v_1.Op != Op386MOVLconst { 13988 break 13989 } 13990 c := v_1.AuxInt 13991 v.reset(Op386XORLconst) 13992 v.AuxInt = c 13993 v.AddArg(x) 13994 return true 13995 } 13996 // match: (XORL (MOVLconst [c]) x) 13997 // cond: 13998 // result: (XORLconst [c] x) 13999 for { 14000 _ = v.Args[1] 14001 v_0 := v.Args[0] 14002 if v_0.Op != Op386MOVLconst { 14003 break 14004 } 14005 c := v_0.AuxInt 14006 x := v.Args[1] 14007 v.reset(Op386XORLconst) 14008 v.AuxInt = c 14009 v.AddArg(x) 14010 return true 14011 } 14012 // match: (XORL (SHLLconst [c] x) (SHRLconst [d] x)) 14013 // cond: d == 32-c 14014 // result: (ROLLconst [c] x) 14015 for { 14016 _ = v.Args[1] 14017 v_0 := v.Args[0] 14018 if v_0.Op != Op386SHLLconst { 14019 break 14020 } 14021 c := v_0.AuxInt 14022 x := v_0.Args[0] 14023 v_1 := v.Args[1] 14024 if v_1.Op != Op386SHRLconst { 14025 break 14026 } 14027 d := v_1.AuxInt 14028 if x != v_1.Args[0] { 14029 break 14030 } 14031 if !(d == 32-c) { 14032 break 14033 } 14034 v.reset(Op386ROLLconst) 14035 v.AuxInt = c 14036 v.AddArg(x) 14037 return true 14038 } 14039 // match: (XORL (SHRLconst [d] x) (SHLLconst [c] x)) 14040 // cond: d == 32-c 14041 // result: (ROLLconst [c] x) 14042 for { 14043 _ = v.Args[1] 14044 v_0 := v.Args[0] 14045 if v_0.Op != Op386SHRLconst { 14046 break 14047 } 14048 d := v_0.AuxInt 14049 x := v_0.Args[0] 14050 v_1 := v.Args[1] 14051 if v_1.Op != Op386SHLLconst { 14052 break 14053 } 14054 c := v_1.AuxInt 14055 if x != v_1.Args[0] { 14056 break 14057 } 14058 if !(d == 32-c) { 14059 break 14060 } 14061 v.reset(Op386ROLLconst) 14062 v.AuxInt = c 14063 v.AddArg(x) 14064 return true 14065 } 14066 // match: (XORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 14067 // cond: c < 16 && d == 16-c && t.Size() == 2 14068 // result: (ROLWconst x [c]) 14069 for { 14070 t := v.Type 14071 _ = v.Args[1] 14072 v_0 := v.Args[0] 14073 if v_0.Op != Op386SHLLconst { 14074 break 14075 } 14076 c := v_0.AuxInt 14077 x := v_0.Args[0] 14078 v_1 := v.Args[1] 14079 if v_1.Op != Op386SHRWconst { 14080 break 14081 } 14082 d := v_1.AuxInt 14083 if x != v_1.Args[0] { 14084 break 14085 } 14086 if !(c < 16 && d == 16-c && t.Size() == 2) { 14087 break 14088 } 14089 v.reset(Op386ROLWconst) 14090 v.AuxInt = c 14091 v.AddArg(x) 14092 return true 14093 } 14094 // match: (XORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 14095 // cond: c < 16 && d == 16-c && t.Size() == 2 14096 // result: (ROLWconst x [c]) 14097 for { 14098 t := v.Type 14099 _ = v.Args[1] 14100 v_0 := v.Args[0] 14101 if v_0.Op != Op386SHRWconst { 14102 break 14103 } 14104 d := v_0.AuxInt 14105 x := v_0.Args[0] 14106 v_1 := v.Args[1] 14107 if v_1.Op != Op386SHLLconst { 14108 break 14109 } 14110 c := v_1.AuxInt 14111 if x != v_1.Args[0] { 14112 break 14113 } 14114 if !(c < 16 && d == 16-c && t.Size() == 2) { 14115 break 14116 } 14117 v.reset(Op386ROLWconst) 14118 v.AuxInt = c 14119 v.AddArg(x) 14120 return true 14121 } 14122 // match: (XORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 14123 // cond: c < 8 && d == 8-c && t.Size() == 1 14124 // result: (ROLBconst x [c]) 14125 for { 14126 t := v.Type 14127 _ = v.Args[1] 14128 v_0 := v.Args[0] 14129 if v_0.Op != Op386SHLLconst { 14130 break 14131 } 14132 c := v_0.AuxInt 14133 x := v_0.Args[0] 14134 v_1 := v.Args[1] 14135 if v_1.Op != Op386SHRBconst { 14136 break 14137 } 14138 d := v_1.AuxInt 14139 if x != v_1.Args[0] { 14140 break 14141 } 14142 if !(c < 8 && d == 8-c && t.Size() == 1) { 14143 break 14144 } 14145 v.reset(Op386ROLBconst) 14146 v.AuxInt = c 14147 v.AddArg(x) 14148 return true 14149 } 14150 // match: (XORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 14151 // cond: c < 8 && d == 8-c && t.Size() == 1 14152 // result: (ROLBconst x [c]) 14153 for { 14154 t := v.Type 14155 _ = v.Args[1] 14156 v_0 := v.Args[0] 14157 if v_0.Op != Op386SHRBconst { 14158 break 14159 } 14160 d := v_0.AuxInt 14161 x := v_0.Args[0] 14162 v_1 := v.Args[1] 14163 if v_1.Op != Op386SHLLconst { 14164 break 14165 } 14166 c := v_1.AuxInt 14167 if x != v_1.Args[0] { 14168 break 14169 } 14170 if !(c < 8 && d == 8-c && t.Size() == 1) { 14171 break 14172 } 14173 v.reset(Op386ROLBconst) 14174 v.AuxInt = c 14175 v.AddArg(x) 14176 return true 14177 } 14178 // match: (XORL x x) 14179 // cond: 14180 // result: (MOVLconst [0]) 14181 for { 14182 _ = v.Args[1] 14183 x := v.Args[0] 14184 if x != v.Args[1] { 14185 break 14186 } 14187 v.reset(Op386MOVLconst) 14188 v.AuxInt = 0 14189 return true 14190 } 14191 return false 14192 } 14193 func rewriteValue386_Op386XORLconst_0(v *Value) bool { 14194 // match: (XORLconst [c] (XORLconst [d] x)) 14195 // cond: 14196 // result: (XORLconst [c ^ d] x) 14197 for { 14198 c := v.AuxInt 14199 v_0 := v.Args[0] 14200 if v_0.Op != Op386XORLconst { 14201 break 14202 } 14203 d := v_0.AuxInt 14204 x := v_0.Args[0] 14205 v.reset(Op386XORLconst) 14206 v.AuxInt = c ^ d 14207 v.AddArg(x) 14208 return true 14209 } 14210 // match: (XORLconst [c] x) 14211 // cond: int32(c)==0 14212 // result: x 14213 for { 14214 c := v.AuxInt 14215 x := v.Args[0] 14216 if !(int32(c) == 0) { 14217 break 14218 } 14219 v.reset(OpCopy) 14220 v.Type = x.Type 14221 v.AddArg(x) 14222 return true 14223 } 14224 // match: (XORLconst [c] (MOVLconst [d])) 14225 // cond: 14226 // result: (MOVLconst [c^d]) 14227 for { 14228 c := v.AuxInt 14229 v_0 := v.Args[0] 14230 if v_0.Op != Op386MOVLconst { 14231 break 14232 } 14233 d := v_0.AuxInt 14234 v.reset(Op386MOVLconst) 14235 v.AuxInt = c ^ d 14236 return true 14237 } 14238 return false 14239 } 14240 func rewriteValue386_OpAdd16_0(v *Value) bool { 14241 // match: (Add16 x y) 14242 // cond: 14243 // result: (ADDL x y) 14244 for { 14245 _ = v.Args[1] 14246 x := v.Args[0] 14247 y := v.Args[1] 14248 v.reset(Op386ADDL) 14249 v.AddArg(x) 14250 v.AddArg(y) 14251 return true 14252 } 14253 } 14254 func rewriteValue386_OpAdd32_0(v *Value) bool { 14255 // match: (Add32 x y) 14256 // cond: 14257 // result: (ADDL x y) 14258 for { 14259 _ = v.Args[1] 14260 x := v.Args[0] 14261 y := v.Args[1] 14262 v.reset(Op386ADDL) 14263 v.AddArg(x) 14264 v.AddArg(y) 14265 return true 14266 } 14267 } 14268 func rewriteValue386_OpAdd32F_0(v *Value) bool { 14269 // match: (Add32F x y) 14270 // cond: 14271 // result: (ADDSS x y) 14272 for { 14273 _ = v.Args[1] 14274 x := v.Args[0] 14275 y := v.Args[1] 14276 v.reset(Op386ADDSS) 14277 v.AddArg(x) 14278 v.AddArg(y) 14279 return true 14280 } 14281 } 14282 func rewriteValue386_OpAdd32carry_0(v *Value) bool { 14283 // match: (Add32carry x y) 14284 // cond: 14285 // result: (ADDLcarry x y) 14286 for { 14287 _ = v.Args[1] 14288 x := v.Args[0] 14289 y := v.Args[1] 14290 v.reset(Op386ADDLcarry) 14291 v.AddArg(x) 14292 v.AddArg(y) 14293 return true 14294 } 14295 } 14296 func rewriteValue386_OpAdd32withcarry_0(v *Value) bool { 14297 // match: (Add32withcarry x y c) 14298 // cond: 14299 // result: (ADCL x y c) 14300 for { 14301 _ = v.Args[2] 14302 x := v.Args[0] 14303 y := v.Args[1] 14304 c := v.Args[2] 14305 v.reset(Op386ADCL) 14306 v.AddArg(x) 14307 v.AddArg(y) 14308 v.AddArg(c) 14309 return true 14310 } 14311 } 14312 func rewriteValue386_OpAdd64F_0(v *Value) bool { 14313 // match: (Add64F x y) 14314 // cond: 14315 // result: (ADDSD x y) 14316 for { 14317 _ = v.Args[1] 14318 x := v.Args[0] 14319 y := v.Args[1] 14320 v.reset(Op386ADDSD) 14321 v.AddArg(x) 14322 v.AddArg(y) 14323 return true 14324 } 14325 } 14326 func rewriteValue386_OpAdd8_0(v *Value) bool { 14327 // match: (Add8 x y) 14328 // cond: 14329 // result: (ADDL x y) 14330 for { 14331 _ = v.Args[1] 14332 x := v.Args[0] 14333 y := v.Args[1] 14334 v.reset(Op386ADDL) 14335 v.AddArg(x) 14336 v.AddArg(y) 14337 return true 14338 } 14339 } 14340 func rewriteValue386_OpAddPtr_0(v *Value) bool { 14341 // match: (AddPtr x y) 14342 // cond: 14343 // result: (ADDL x y) 14344 for { 14345 _ = v.Args[1] 14346 x := v.Args[0] 14347 y := v.Args[1] 14348 v.reset(Op386ADDL) 14349 v.AddArg(x) 14350 v.AddArg(y) 14351 return true 14352 } 14353 } 14354 func rewriteValue386_OpAddr_0(v *Value) bool { 14355 // match: (Addr {sym} base) 14356 // cond: 14357 // result: (LEAL {sym} base) 14358 for { 14359 sym := v.Aux 14360 base := v.Args[0] 14361 v.reset(Op386LEAL) 14362 v.Aux = sym 14363 v.AddArg(base) 14364 return true 14365 } 14366 } 14367 func rewriteValue386_OpAnd16_0(v *Value) bool { 14368 // match: (And16 x y) 14369 // cond: 14370 // result: (ANDL x y) 14371 for { 14372 _ = v.Args[1] 14373 x := v.Args[0] 14374 y := v.Args[1] 14375 v.reset(Op386ANDL) 14376 v.AddArg(x) 14377 v.AddArg(y) 14378 return true 14379 } 14380 } 14381 func rewriteValue386_OpAnd32_0(v *Value) bool { 14382 // match: (And32 x y) 14383 // cond: 14384 // result: (ANDL x y) 14385 for { 14386 _ = v.Args[1] 14387 x := v.Args[0] 14388 y := v.Args[1] 14389 v.reset(Op386ANDL) 14390 v.AddArg(x) 14391 v.AddArg(y) 14392 return true 14393 } 14394 } 14395 func rewriteValue386_OpAnd8_0(v *Value) bool { 14396 // match: (And8 x y) 14397 // cond: 14398 // result: (ANDL x y) 14399 for { 14400 _ = v.Args[1] 14401 x := v.Args[0] 14402 y := v.Args[1] 14403 v.reset(Op386ANDL) 14404 v.AddArg(x) 14405 v.AddArg(y) 14406 return true 14407 } 14408 } 14409 func rewriteValue386_OpAndB_0(v *Value) bool { 14410 // match: (AndB x y) 14411 // cond: 14412 // result: (ANDL x y) 14413 for { 14414 _ = v.Args[1] 14415 x := v.Args[0] 14416 y := v.Args[1] 14417 v.reset(Op386ANDL) 14418 v.AddArg(x) 14419 v.AddArg(y) 14420 return true 14421 } 14422 } 14423 func rewriteValue386_OpAvg32u_0(v *Value) bool { 14424 // match: (Avg32u x y) 14425 // cond: 14426 // result: (AVGLU x y) 14427 for { 14428 _ = v.Args[1] 14429 x := v.Args[0] 14430 y := v.Args[1] 14431 v.reset(Op386AVGLU) 14432 v.AddArg(x) 14433 v.AddArg(y) 14434 return true 14435 } 14436 } 14437 func rewriteValue386_OpBswap32_0(v *Value) bool { 14438 // match: (Bswap32 x) 14439 // cond: 14440 // result: (BSWAPL x) 14441 for { 14442 x := v.Args[0] 14443 v.reset(Op386BSWAPL) 14444 v.AddArg(x) 14445 return true 14446 } 14447 } 14448 func rewriteValue386_OpClosureCall_0(v *Value) bool { 14449 // match: (ClosureCall [argwid] entry closure mem) 14450 // cond: 14451 // result: (CALLclosure [argwid] entry closure mem) 14452 for { 14453 argwid := v.AuxInt 14454 _ = v.Args[2] 14455 entry := v.Args[0] 14456 closure := v.Args[1] 14457 mem := v.Args[2] 14458 v.reset(Op386CALLclosure) 14459 v.AuxInt = argwid 14460 v.AddArg(entry) 14461 v.AddArg(closure) 14462 v.AddArg(mem) 14463 return true 14464 } 14465 } 14466 func rewriteValue386_OpCom16_0(v *Value) bool { 14467 // match: (Com16 x) 14468 // cond: 14469 // result: (NOTL x) 14470 for { 14471 x := v.Args[0] 14472 v.reset(Op386NOTL) 14473 v.AddArg(x) 14474 return true 14475 } 14476 } 14477 func rewriteValue386_OpCom32_0(v *Value) bool { 14478 // match: (Com32 x) 14479 // cond: 14480 // result: (NOTL x) 14481 for { 14482 x := v.Args[0] 14483 v.reset(Op386NOTL) 14484 v.AddArg(x) 14485 return true 14486 } 14487 } 14488 func rewriteValue386_OpCom8_0(v *Value) bool { 14489 // match: (Com8 x) 14490 // cond: 14491 // result: (NOTL x) 14492 for { 14493 x := v.Args[0] 14494 v.reset(Op386NOTL) 14495 v.AddArg(x) 14496 return true 14497 } 14498 } 14499 func rewriteValue386_OpConst16_0(v *Value) bool { 14500 // match: (Const16 [val]) 14501 // cond: 14502 // result: (MOVLconst [val]) 14503 for { 14504 val := v.AuxInt 14505 v.reset(Op386MOVLconst) 14506 v.AuxInt = val 14507 return true 14508 } 14509 } 14510 func rewriteValue386_OpConst32_0(v *Value) bool { 14511 // match: (Const32 [val]) 14512 // cond: 14513 // result: (MOVLconst [val]) 14514 for { 14515 val := v.AuxInt 14516 v.reset(Op386MOVLconst) 14517 v.AuxInt = val 14518 return true 14519 } 14520 } 14521 func rewriteValue386_OpConst32F_0(v *Value) bool { 14522 // match: (Const32F [val]) 14523 // cond: 14524 // result: (MOVSSconst [val]) 14525 for { 14526 val := v.AuxInt 14527 v.reset(Op386MOVSSconst) 14528 v.AuxInt = val 14529 return true 14530 } 14531 } 14532 func rewriteValue386_OpConst64F_0(v *Value) bool { 14533 // match: (Const64F [val]) 14534 // cond: 14535 // result: (MOVSDconst [val]) 14536 for { 14537 val := v.AuxInt 14538 v.reset(Op386MOVSDconst) 14539 v.AuxInt = val 14540 return true 14541 } 14542 } 14543 func rewriteValue386_OpConst8_0(v *Value) bool { 14544 // match: (Const8 [val]) 14545 // cond: 14546 // result: (MOVLconst [val]) 14547 for { 14548 val := v.AuxInt 14549 v.reset(Op386MOVLconst) 14550 v.AuxInt = val 14551 return true 14552 } 14553 } 14554 func rewriteValue386_OpConstBool_0(v *Value) bool { 14555 // match: (ConstBool [b]) 14556 // cond: 14557 // result: (MOVLconst [b]) 14558 for { 14559 b := v.AuxInt 14560 v.reset(Op386MOVLconst) 14561 v.AuxInt = b 14562 return true 14563 } 14564 } 14565 func rewriteValue386_OpConstNil_0(v *Value) bool { 14566 // match: (ConstNil) 14567 // cond: 14568 // result: (MOVLconst [0]) 14569 for { 14570 v.reset(Op386MOVLconst) 14571 v.AuxInt = 0 14572 return true 14573 } 14574 } 14575 func rewriteValue386_OpConvert_0(v *Value) bool { 14576 // match: (Convert <t> x mem) 14577 // cond: 14578 // result: (MOVLconvert <t> x mem) 14579 for { 14580 t := v.Type 14581 _ = v.Args[1] 14582 x := v.Args[0] 14583 mem := v.Args[1] 14584 v.reset(Op386MOVLconvert) 14585 v.Type = t 14586 v.AddArg(x) 14587 v.AddArg(mem) 14588 return true 14589 } 14590 } 14591 func rewriteValue386_OpCvt32Fto32_0(v *Value) bool { 14592 // match: (Cvt32Fto32 x) 14593 // cond: 14594 // result: (CVTTSS2SL x) 14595 for { 14596 x := v.Args[0] 14597 v.reset(Op386CVTTSS2SL) 14598 v.AddArg(x) 14599 return true 14600 } 14601 } 14602 func rewriteValue386_OpCvt32Fto64F_0(v *Value) bool { 14603 // match: (Cvt32Fto64F x) 14604 // cond: 14605 // result: (CVTSS2SD x) 14606 for { 14607 x := v.Args[0] 14608 v.reset(Op386CVTSS2SD) 14609 v.AddArg(x) 14610 return true 14611 } 14612 } 14613 func rewriteValue386_OpCvt32to32F_0(v *Value) bool { 14614 // match: (Cvt32to32F x) 14615 // cond: 14616 // result: (CVTSL2SS x) 14617 for { 14618 x := v.Args[0] 14619 v.reset(Op386CVTSL2SS) 14620 v.AddArg(x) 14621 return true 14622 } 14623 } 14624 func rewriteValue386_OpCvt32to64F_0(v *Value) bool { 14625 // match: (Cvt32to64F x) 14626 // cond: 14627 // result: (CVTSL2SD x) 14628 for { 14629 x := v.Args[0] 14630 v.reset(Op386CVTSL2SD) 14631 v.AddArg(x) 14632 return true 14633 } 14634 } 14635 func rewriteValue386_OpCvt64Fto32_0(v *Value) bool { 14636 // match: (Cvt64Fto32 x) 14637 // cond: 14638 // result: (CVTTSD2SL x) 14639 for { 14640 x := v.Args[0] 14641 v.reset(Op386CVTTSD2SL) 14642 v.AddArg(x) 14643 return true 14644 } 14645 } 14646 func rewriteValue386_OpCvt64Fto32F_0(v *Value) bool { 14647 // match: (Cvt64Fto32F x) 14648 // cond: 14649 // result: (CVTSD2SS x) 14650 for { 14651 x := v.Args[0] 14652 v.reset(Op386CVTSD2SS) 14653 v.AddArg(x) 14654 return true 14655 } 14656 } 14657 func rewriteValue386_OpDiv16_0(v *Value) bool { 14658 // match: (Div16 x y) 14659 // cond: 14660 // result: (DIVW x y) 14661 for { 14662 _ = v.Args[1] 14663 x := v.Args[0] 14664 y := v.Args[1] 14665 v.reset(Op386DIVW) 14666 v.AddArg(x) 14667 v.AddArg(y) 14668 return true 14669 } 14670 } 14671 func rewriteValue386_OpDiv16u_0(v *Value) bool { 14672 // match: (Div16u x y) 14673 // cond: 14674 // result: (DIVWU x y) 14675 for { 14676 _ = v.Args[1] 14677 x := v.Args[0] 14678 y := v.Args[1] 14679 v.reset(Op386DIVWU) 14680 v.AddArg(x) 14681 v.AddArg(y) 14682 return true 14683 } 14684 } 14685 func rewriteValue386_OpDiv32_0(v *Value) bool { 14686 // match: (Div32 x y) 14687 // cond: 14688 // result: (DIVL x y) 14689 for { 14690 _ = v.Args[1] 14691 x := v.Args[0] 14692 y := v.Args[1] 14693 v.reset(Op386DIVL) 14694 v.AddArg(x) 14695 v.AddArg(y) 14696 return true 14697 } 14698 } 14699 func rewriteValue386_OpDiv32F_0(v *Value) bool { 14700 // match: (Div32F x y) 14701 // cond: 14702 // result: (DIVSS x y) 14703 for { 14704 _ = v.Args[1] 14705 x := v.Args[0] 14706 y := v.Args[1] 14707 v.reset(Op386DIVSS) 14708 v.AddArg(x) 14709 v.AddArg(y) 14710 return true 14711 } 14712 } 14713 func rewriteValue386_OpDiv32u_0(v *Value) bool { 14714 // match: (Div32u x y) 14715 // cond: 14716 // result: (DIVLU x y) 14717 for { 14718 _ = v.Args[1] 14719 x := v.Args[0] 14720 y := v.Args[1] 14721 v.reset(Op386DIVLU) 14722 v.AddArg(x) 14723 v.AddArg(y) 14724 return true 14725 } 14726 } 14727 func rewriteValue386_OpDiv64F_0(v *Value) bool { 14728 // match: (Div64F x y) 14729 // cond: 14730 // result: (DIVSD x y) 14731 for { 14732 _ = v.Args[1] 14733 x := v.Args[0] 14734 y := v.Args[1] 14735 v.reset(Op386DIVSD) 14736 v.AddArg(x) 14737 v.AddArg(y) 14738 return true 14739 } 14740 } 14741 func rewriteValue386_OpDiv8_0(v *Value) bool { 14742 b := v.Block 14743 _ = b 14744 typ := &b.Func.Config.Types 14745 _ = typ 14746 // match: (Div8 x y) 14747 // cond: 14748 // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) 14749 for { 14750 _ = v.Args[1] 14751 x := v.Args[0] 14752 y := v.Args[1] 14753 v.reset(Op386DIVW) 14754 v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 14755 v0.AddArg(x) 14756 v.AddArg(v0) 14757 v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 14758 v1.AddArg(y) 14759 v.AddArg(v1) 14760 return true 14761 } 14762 } 14763 func rewriteValue386_OpDiv8u_0(v *Value) bool { 14764 b := v.Block 14765 _ = b 14766 typ := &b.Func.Config.Types 14767 _ = typ 14768 // match: (Div8u x y) 14769 // cond: 14770 // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 14771 for { 14772 _ = v.Args[1] 14773 x := v.Args[0] 14774 y := v.Args[1] 14775 v.reset(Op386DIVWU) 14776 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 14777 v0.AddArg(x) 14778 v.AddArg(v0) 14779 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 14780 v1.AddArg(y) 14781 v.AddArg(v1) 14782 return true 14783 } 14784 } 14785 func rewriteValue386_OpEq16_0(v *Value) bool { 14786 b := v.Block 14787 _ = b 14788 // match: (Eq16 x y) 14789 // cond: 14790 // result: (SETEQ (CMPW x y)) 14791 for { 14792 _ = v.Args[1] 14793 x := v.Args[0] 14794 y := v.Args[1] 14795 v.reset(Op386SETEQ) 14796 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 14797 v0.AddArg(x) 14798 v0.AddArg(y) 14799 v.AddArg(v0) 14800 return true 14801 } 14802 } 14803 func rewriteValue386_OpEq32_0(v *Value) bool { 14804 b := v.Block 14805 _ = b 14806 // match: (Eq32 x y) 14807 // cond: 14808 // result: (SETEQ (CMPL x y)) 14809 for { 14810 _ = v.Args[1] 14811 x := v.Args[0] 14812 y := v.Args[1] 14813 v.reset(Op386SETEQ) 14814 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14815 v0.AddArg(x) 14816 v0.AddArg(y) 14817 v.AddArg(v0) 14818 return true 14819 } 14820 } 14821 func rewriteValue386_OpEq32F_0(v *Value) bool { 14822 b := v.Block 14823 _ = b 14824 // match: (Eq32F x y) 14825 // cond: 14826 // result: (SETEQF (UCOMISS x y)) 14827 for { 14828 _ = v.Args[1] 14829 x := v.Args[0] 14830 y := v.Args[1] 14831 v.reset(Op386SETEQF) 14832 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 14833 v0.AddArg(x) 14834 v0.AddArg(y) 14835 v.AddArg(v0) 14836 return true 14837 } 14838 } 14839 func rewriteValue386_OpEq64F_0(v *Value) bool { 14840 b := v.Block 14841 _ = b 14842 // match: (Eq64F x y) 14843 // cond: 14844 // result: (SETEQF (UCOMISD x y)) 14845 for { 14846 _ = v.Args[1] 14847 x := v.Args[0] 14848 y := v.Args[1] 14849 v.reset(Op386SETEQF) 14850 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 14851 v0.AddArg(x) 14852 v0.AddArg(y) 14853 v.AddArg(v0) 14854 return true 14855 } 14856 } 14857 func rewriteValue386_OpEq8_0(v *Value) bool { 14858 b := v.Block 14859 _ = b 14860 // match: (Eq8 x y) 14861 // cond: 14862 // result: (SETEQ (CMPB x y)) 14863 for { 14864 _ = v.Args[1] 14865 x := v.Args[0] 14866 y := v.Args[1] 14867 v.reset(Op386SETEQ) 14868 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 14869 v0.AddArg(x) 14870 v0.AddArg(y) 14871 v.AddArg(v0) 14872 return true 14873 } 14874 } 14875 func rewriteValue386_OpEqB_0(v *Value) bool { 14876 b := v.Block 14877 _ = b 14878 // match: (EqB x y) 14879 // cond: 14880 // result: (SETEQ (CMPB x y)) 14881 for { 14882 _ = v.Args[1] 14883 x := v.Args[0] 14884 y := v.Args[1] 14885 v.reset(Op386SETEQ) 14886 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 14887 v0.AddArg(x) 14888 v0.AddArg(y) 14889 v.AddArg(v0) 14890 return true 14891 } 14892 } 14893 func rewriteValue386_OpEqPtr_0(v *Value) bool { 14894 b := v.Block 14895 _ = b 14896 // match: (EqPtr x y) 14897 // cond: 14898 // result: (SETEQ (CMPL x y)) 14899 for { 14900 _ = v.Args[1] 14901 x := v.Args[0] 14902 y := v.Args[1] 14903 v.reset(Op386SETEQ) 14904 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14905 v0.AddArg(x) 14906 v0.AddArg(y) 14907 v.AddArg(v0) 14908 return true 14909 } 14910 } 14911 func rewriteValue386_OpGeq16_0(v *Value) bool { 14912 b := v.Block 14913 _ = b 14914 // match: (Geq16 x y) 14915 // cond: 14916 // result: (SETGE (CMPW x y)) 14917 for { 14918 _ = v.Args[1] 14919 x := v.Args[0] 14920 y := v.Args[1] 14921 v.reset(Op386SETGE) 14922 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 14923 v0.AddArg(x) 14924 v0.AddArg(y) 14925 v.AddArg(v0) 14926 return true 14927 } 14928 } 14929 func rewriteValue386_OpGeq16U_0(v *Value) bool { 14930 b := v.Block 14931 _ = b 14932 // match: (Geq16U x y) 14933 // cond: 14934 // result: (SETAE (CMPW x y)) 14935 for { 14936 _ = v.Args[1] 14937 x := v.Args[0] 14938 y := v.Args[1] 14939 v.reset(Op386SETAE) 14940 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 14941 v0.AddArg(x) 14942 v0.AddArg(y) 14943 v.AddArg(v0) 14944 return true 14945 } 14946 } 14947 func rewriteValue386_OpGeq32_0(v *Value) bool { 14948 b := v.Block 14949 _ = b 14950 // match: (Geq32 x y) 14951 // cond: 14952 // result: (SETGE (CMPL x y)) 14953 for { 14954 _ = v.Args[1] 14955 x := v.Args[0] 14956 y := v.Args[1] 14957 v.reset(Op386SETGE) 14958 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14959 v0.AddArg(x) 14960 v0.AddArg(y) 14961 v.AddArg(v0) 14962 return true 14963 } 14964 } 14965 func rewriteValue386_OpGeq32F_0(v *Value) bool { 14966 b := v.Block 14967 _ = b 14968 // match: (Geq32F x y) 14969 // cond: 14970 // result: (SETGEF (UCOMISS x y)) 14971 for { 14972 _ = v.Args[1] 14973 x := v.Args[0] 14974 y := v.Args[1] 14975 v.reset(Op386SETGEF) 14976 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 14977 v0.AddArg(x) 14978 v0.AddArg(y) 14979 v.AddArg(v0) 14980 return true 14981 } 14982 } 14983 func rewriteValue386_OpGeq32U_0(v *Value) bool { 14984 b := v.Block 14985 _ = b 14986 // match: (Geq32U x y) 14987 // cond: 14988 // result: (SETAE (CMPL x y)) 14989 for { 14990 _ = v.Args[1] 14991 x := v.Args[0] 14992 y := v.Args[1] 14993 v.reset(Op386SETAE) 14994 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14995 v0.AddArg(x) 14996 v0.AddArg(y) 14997 v.AddArg(v0) 14998 return true 14999 } 15000 } 15001 func rewriteValue386_OpGeq64F_0(v *Value) bool { 15002 b := v.Block 15003 _ = b 15004 // match: (Geq64F x y) 15005 // cond: 15006 // result: (SETGEF (UCOMISD x y)) 15007 for { 15008 _ = v.Args[1] 15009 x := v.Args[0] 15010 y := v.Args[1] 15011 v.reset(Op386SETGEF) 15012 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15013 v0.AddArg(x) 15014 v0.AddArg(y) 15015 v.AddArg(v0) 15016 return true 15017 } 15018 } 15019 func rewriteValue386_OpGeq8_0(v *Value) bool { 15020 b := v.Block 15021 _ = b 15022 // match: (Geq8 x y) 15023 // cond: 15024 // result: (SETGE (CMPB x y)) 15025 for { 15026 _ = v.Args[1] 15027 x := v.Args[0] 15028 y := v.Args[1] 15029 v.reset(Op386SETGE) 15030 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15031 v0.AddArg(x) 15032 v0.AddArg(y) 15033 v.AddArg(v0) 15034 return true 15035 } 15036 } 15037 func rewriteValue386_OpGeq8U_0(v *Value) bool { 15038 b := v.Block 15039 _ = b 15040 // match: (Geq8U x y) 15041 // cond: 15042 // result: (SETAE (CMPB x y)) 15043 for { 15044 _ = v.Args[1] 15045 x := v.Args[0] 15046 y := v.Args[1] 15047 v.reset(Op386SETAE) 15048 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15049 v0.AddArg(x) 15050 v0.AddArg(y) 15051 v.AddArg(v0) 15052 return true 15053 } 15054 } 15055 func rewriteValue386_OpGetClosurePtr_0(v *Value) bool { 15056 // match: (GetClosurePtr) 15057 // cond: 15058 // result: (LoweredGetClosurePtr) 15059 for { 15060 v.reset(Op386LoweredGetClosurePtr) 15061 return true 15062 } 15063 } 15064 func rewriteValue386_OpGetG_0(v *Value) bool { 15065 // match: (GetG mem) 15066 // cond: 15067 // result: (LoweredGetG mem) 15068 for { 15069 mem := v.Args[0] 15070 v.reset(Op386LoweredGetG) 15071 v.AddArg(mem) 15072 return true 15073 } 15074 } 15075 func rewriteValue386_OpGreater16_0(v *Value) bool { 15076 b := v.Block 15077 _ = b 15078 // match: (Greater16 x y) 15079 // cond: 15080 // result: (SETG (CMPW x y)) 15081 for { 15082 _ = v.Args[1] 15083 x := v.Args[0] 15084 y := v.Args[1] 15085 v.reset(Op386SETG) 15086 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15087 v0.AddArg(x) 15088 v0.AddArg(y) 15089 v.AddArg(v0) 15090 return true 15091 } 15092 } 15093 func rewriteValue386_OpGreater16U_0(v *Value) bool { 15094 b := v.Block 15095 _ = b 15096 // match: (Greater16U x y) 15097 // cond: 15098 // result: (SETA (CMPW x y)) 15099 for { 15100 _ = v.Args[1] 15101 x := v.Args[0] 15102 y := v.Args[1] 15103 v.reset(Op386SETA) 15104 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15105 v0.AddArg(x) 15106 v0.AddArg(y) 15107 v.AddArg(v0) 15108 return true 15109 } 15110 } 15111 func rewriteValue386_OpGreater32_0(v *Value) bool { 15112 b := v.Block 15113 _ = b 15114 // match: (Greater32 x y) 15115 // cond: 15116 // result: (SETG (CMPL x y)) 15117 for { 15118 _ = v.Args[1] 15119 x := v.Args[0] 15120 y := v.Args[1] 15121 v.reset(Op386SETG) 15122 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15123 v0.AddArg(x) 15124 v0.AddArg(y) 15125 v.AddArg(v0) 15126 return true 15127 } 15128 } 15129 func rewriteValue386_OpGreater32F_0(v *Value) bool { 15130 b := v.Block 15131 _ = b 15132 // match: (Greater32F x y) 15133 // cond: 15134 // result: (SETGF (UCOMISS x y)) 15135 for { 15136 _ = v.Args[1] 15137 x := v.Args[0] 15138 y := v.Args[1] 15139 v.reset(Op386SETGF) 15140 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 15141 v0.AddArg(x) 15142 v0.AddArg(y) 15143 v.AddArg(v0) 15144 return true 15145 } 15146 } 15147 func rewriteValue386_OpGreater32U_0(v *Value) bool { 15148 b := v.Block 15149 _ = b 15150 // match: (Greater32U x y) 15151 // cond: 15152 // result: (SETA (CMPL x y)) 15153 for { 15154 _ = v.Args[1] 15155 x := v.Args[0] 15156 y := v.Args[1] 15157 v.reset(Op386SETA) 15158 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15159 v0.AddArg(x) 15160 v0.AddArg(y) 15161 v.AddArg(v0) 15162 return true 15163 } 15164 } 15165 func rewriteValue386_OpGreater64F_0(v *Value) bool { 15166 b := v.Block 15167 _ = b 15168 // match: (Greater64F x y) 15169 // cond: 15170 // result: (SETGF (UCOMISD x y)) 15171 for { 15172 _ = v.Args[1] 15173 x := v.Args[0] 15174 y := v.Args[1] 15175 v.reset(Op386SETGF) 15176 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15177 v0.AddArg(x) 15178 v0.AddArg(y) 15179 v.AddArg(v0) 15180 return true 15181 } 15182 } 15183 func rewriteValue386_OpGreater8_0(v *Value) bool { 15184 b := v.Block 15185 _ = b 15186 // match: (Greater8 x y) 15187 // cond: 15188 // result: (SETG (CMPB x y)) 15189 for { 15190 _ = v.Args[1] 15191 x := v.Args[0] 15192 y := v.Args[1] 15193 v.reset(Op386SETG) 15194 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15195 v0.AddArg(x) 15196 v0.AddArg(y) 15197 v.AddArg(v0) 15198 return true 15199 } 15200 } 15201 func rewriteValue386_OpGreater8U_0(v *Value) bool { 15202 b := v.Block 15203 _ = b 15204 // match: (Greater8U x y) 15205 // cond: 15206 // result: (SETA (CMPB x y)) 15207 for { 15208 _ = v.Args[1] 15209 x := v.Args[0] 15210 y := v.Args[1] 15211 v.reset(Op386SETA) 15212 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15213 v0.AddArg(x) 15214 v0.AddArg(y) 15215 v.AddArg(v0) 15216 return true 15217 } 15218 } 15219 func rewriteValue386_OpHmul32_0(v *Value) bool { 15220 // match: (Hmul32 x y) 15221 // cond: 15222 // result: (HMULL x y) 15223 for { 15224 _ = v.Args[1] 15225 x := v.Args[0] 15226 y := v.Args[1] 15227 v.reset(Op386HMULL) 15228 v.AddArg(x) 15229 v.AddArg(y) 15230 return true 15231 } 15232 } 15233 func rewriteValue386_OpHmul32u_0(v *Value) bool { 15234 // match: (Hmul32u x y) 15235 // cond: 15236 // result: (HMULLU x y) 15237 for { 15238 _ = v.Args[1] 15239 x := v.Args[0] 15240 y := v.Args[1] 15241 v.reset(Op386HMULLU) 15242 v.AddArg(x) 15243 v.AddArg(y) 15244 return true 15245 } 15246 } 15247 func rewriteValue386_OpInterCall_0(v *Value) bool { 15248 // match: (InterCall [argwid] entry mem) 15249 // cond: 15250 // result: (CALLinter [argwid] entry mem) 15251 for { 15252 argwid := v.AuxInt 15253 _ = v.Args[1] 15254 entry := v.Args[0] 15255 mem := v.Args[1] 15256 v.reset(Op386CALLinter) 15257 v.AuxInt = argwid 15258 v.AddArg(entry) 15259 v.AddArg(mem) 15260 return true 15261 } 15262 } 15263 func rewriteValue386_OpIsInBounds_0(v *Value) bool { 15264 b := v.Block 15265 _ = b 15266 // match: (IsInBounds idx len) 15267 // cond: 15268 // result: (SETB (CMPL idx len)) 15269 for { 15270 _ = v.Args[1] 15271 idx := v.Args[0] 15272 len := v.Args[1] 15273 v.reset(Op386SETB) 15274 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15275 v0.AddArg(idx) 15276 v0.AddArg(len) 15277 v.AddArg(v0) 15278 return true 15279 } 15280 } 15281 func rewriteValue386_OpIsNonNil_0(v *Value) bool { 15282 b := v.Block 15283 _ = b 15284 // match: (IsNonNil p) 15285 // cond: 15286 // result: (SETNE (TESTL p p)) 15287 for { 15288 p := v.Args[0] 15289 v.reset(Op386SETNE) 15290 v0 := b.NewValue0(v.Pos, Op386TESTL, types.TypeFlags) 15291 v0.AddArg(p) 15292 v0.AddArg(p) 15293 v.AddArg(v0) 15294 return true 15295 } 15296 } 15297 func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { 15298 b := v.Block 15299 _ = b 15300 // match: (IsSliceInBounds idx len) 15301 // cond: 15302 // result: (SETBE (CMPL idx len)) 15303 for { 15304 _ = v.Args[1] 15305 idx := v.Args[0] 15306 len := v.Args[1] 15307 v.reset(Op386SETBE) 15308 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15309 v0.AddArg(idx) 15310 v0.AddArg(len) 15311 v.AddArg(v0) 15312 return true 15313 } 15314 } 15315 func rewriteValue386_OpLeq16_0(v *Value) bool { 15316 b := v.Block 15317 _ = b 15318 // match: (Leq16 x y) 15319 // cond: 15320 // result: (SETLE (CMPW x y)) 15321 for { 15322 _ = v.Args[1] 15323 x := v.Args[0] 15324 y := v.Args[1] 15325 v.reset(Op386SETLE) 15326 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15327 v0.AddArg(x) 15328 v0.AddArg(y) 15329 v.AddArg(v0) 15330 return true 15331 } 15332 } 15333 func rewriteValue386_OpLeq16U_0(v *Value) bool { 15334 b := v.Block 15335 _ = b 15336 // match: (Leq16U x y) 15337 // cond: 15338 // result: (SETBE (CMPW x y)) 15339 for { 15340 _ = v.Args[1] 15341 x := v.Args[0] 15342 y := v.Args[1] 15343 v.reset(Op386SETBE) 15344 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15345 v0.AddArg(x) 15346 v0.AddArg(y) 15347 v.AddArg(v0) 15348 return true 15349 } 15350 } 15351 func rewriteValue386_OpLeq32_0(v *Value) bool { 15352 b := v.Block 15353 _ = b 15354 // match: (Leq32 x y) 15355 // cond: 15356 // result: (SETLE (CMPL x y)) 15357 for { 15358 _ = v.Args[1] 15359 x := v.Args[0] 15360 y := v.Args[1] 15361 v.reset(Op386SETLE) 15362 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15363 v0.AddArg(x) 15364 v0.AddArg(y) 15365 v.AddArg(v0) 15366 return true 15367 } 15368 } 15369 func rewriteValue386_OpLeq32F_0(v *Value) bool { 15370 b := v.Block 15371 _ = b 15372 // match: (Leq32F x y) 15373 // cond: 15374 // result: (SETGEF (UCOMISS y x)) 15375 for { 15376 _ = v.Args[1] 15377 x := v.Args[0] 15378 y := v.Args[1] 15379 v.reset(Op386SETGEF) 15380 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 15381 v0.AddArg(y) 15382 v0.AddArg(x) 15383 v.AddArg(v0) 15384 return true 15385 } 15386 } 15387 func rewriteValue386_OpLeq32U_0(v *Value) bool { 15388 b := v.Block 15389 _ = b 15390 // match: (Leq32U x y) 15391 // cond: 15392 // result: (SETBE (CMPL x y)) 15393 for { 15394 _ = v.Args[1] 15395 x := v.Args[0] 15396 y := v.Args[1] 15397 v.reset(Op386SETBE) 15398 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15399 v0.AddArg(x) 15400 v0.AddArg(y) 15401 v.AddArg(v0) 15402 return true 15403 } 15404 } 15405 func rewriteValue386_OpLeq64F_0(v *Value) bool { 15406 b := v.Block 15407 _ = b 15408 // match: (Leq64F x y) 15409 // cond: 15410 // result: (SETGEF (UCOMISD y x)) 15411 for { 15412 _ = v.Args[1] 15413 x := v.Args[0] 15414 y := v.Args[1] 15415 v.reset(Op386SETGEF) 15416 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15417 v0.AddArg(y) 15418 v0.AddArg(x) 15419 v.AddArg(v0) 15420 return true 15421 } 15422 } 15423 func rewriteValue386_OpLeq8_0(v *Value) bool { 15424 b := v.Block 15425 _ = b 15426 // match: (Leq8 x y) 15427 // cond: 15428 // result: (SETLE (CMPB x y)) 15429 for { 15430 _ = v.Args[1] 15431 x := v.Args[0] 15432 y := v.Args[1] 15433 v.reset(Op386SETLE) 15434 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15435 v0.AddArg(x) 15436 v0.AddArg(y) 15437 v.AddArg(v0) 15438 return true 15439 } 15440 } 15441 func rewriteValue386_OpLeq8U_0(v *Value) bool { 15442 b := v.Block 15443 _ = b 15444 // match: (Leq8U x y) 15445 // cond: 15446 // result: (SETBE (CMPB x y)) 15447 for { 15448 _ = v.Args[1] 15449 x := v.Args[0] 15450 y := v.Args[1] 15451 v.reset(Op386SETBE) 15452 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15453 v0.AddArg(x) 15454 v0.AddArg(y) 15455 v.AddArg(v0) 15456 return true 15457 } 15458 } 15459 func rewriteValue386_OpLess16_0(v *Value) bool { 15460 b := v.Block 15461 _ = b 15462 // match: (Less16 x y) 15463 // cond: 15464 // result: (SETL (CMPW x y)) 15465 for { 15466 _ = v.Args[1] 15467 x := v.Args[0] 15468 y := v.Args[1] 15469 v.reset(Op386SETL) 15470 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15471 v0.AddArg(x) 15472 v0.AddArg(y) 15473 v.AddArg(v0) 15474 return true 15475 } 15476 } 15477 func rewriteValue386_OpLess16U_0(v *Value) bool { 15478 b := v.Block 15479 _ = b 15480 // match: (Less16U x y) 15481 // cond: 15482 // result: (SETB (CMPW x y)) 15483 for { 15484 _ = v.Args[1] 15485 x := v.Args[0] 15486 y := v.Args[1] 15487 v.reset(Op386SETB) 15488 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15489 v0.AddArg(x) 15490 v0.AddArg(y) 15491 v.AddArg(v0) 15492 return true 15493 } 15494 } 15495 func rewriteValue386_OpLess32_0(v *Value) bool { 15496 b := v.Block 15497 _ = b 15498 // match: (Less32 x y) 15499 // cond: 15500 // result: (SETL (CMPL x y)) 15501 for { 15502 _ = v.Args[1] 15503 x := v.Args[0] 15504 y := v.Args[1] 15505 v.reset(Op386SETL) 15506 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15507 v0.AddArg(x) 15508 v0.AddArg(y) 15509 v.AddArg(v0) 15510 return true 15511 } 15512 } 15513 func rewriteValue386_OpLess32F_0(v *Value) bool { 15514 b := v.Block 15515 _ = b 15516 // match: (Less32F x y) 15517 // cond: 15518 // result: (SETGF (UCOMISS y x)) 15519 for { 15520 _ = v.Args[1] 15521 x := v.Args[0] 15522 y := v.Args[1] 15523 v.reset(Op386SETGF) 15524 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 15525 v0.AddArg(y) 15526 v0.AddArg(x) 15527 v.AddArg(v0) 15528 return true 15529 } 15530 } 15531 func rewriteValue386_OpLess32U_0(v *Value) bool { 15532 b := v.Block 15533 _ = b 15534 // match: (Less32U x y) 15535 // cond: 15536 // result: (SETB (CMPL x y)) 15537 for { 15538 _ = v.Args[1] 15539 x := v.Args[0] 15540 y := v.Args[1] 15541 v.reset(Op386SETB) 15542 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15543 v0.AddArg(x) 15544 v0.AddArg(y) 15545 v.AddArg(v0) 15546 return true 15547 } 15548 } 15549 func rewriteValue386_OpLess64F_0(v *Value) bool { 15550 b := v.Block 15551 _ = b 15552 // match: (Less64F x y) 15553 // cond: 15554 // result: (SETGF (UCOMISD y x)) 15555 for { 15556 _ = v.Args[1] 15557 x := v.Args[0] 15558 y := v.Args[1] 15559 v.reset(Op386SETGF) 15560 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15561 v0.AddArg(y) 15562 v0.AddArg(x) 15563 v.AddArg(v0) 15564 return true 15565 } 15566 } 15567 func rewriteValue386_OpLess8_0(v *Value) bool { 15568 b := v.Block 15569 _ = b 15570 // match: (Less8 x y) 15571 // cond: 15572 // result: (SETL (CMPB x y)) 15573 for { 15574 _ = v.Args[1] 15575 x := v.Args[0] 15576 y := v.Args[1] 15577 v.reset(Op386SETL) 15578 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15579 v0.AddArg(x) 15580 v0.AddArg(y) 15581 v.AddArg(v0) 15582 return true 15583 } 15584 } 15585 func rewriteValue386_OpLess8U_0(v *Value) bool { 15586 b := v.Block 15587 _ = b 15588 // match: (Less8U x y) 15589 // cond: 15590 // result: (SETB (CMPB x y)) 15591 for { 15592 _ = v.Args[1] 15593 x := v.Args[0] 15594 y := v.Args[1] 15595 v.reset(Op386SETB) 15596 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15597 v0.AddArg(x) 15598 v0.AddArg(y) 15599 v.AddArg(v0) 15600 return true 15601 } 15602 } 15603 func rewriteValue386_OpLoad_0(v *Value) bool { 15604 // match: (Load <t> ptr mem) 15605 // cond: (is32BitInt(t) || isPtr(t)) 15606 // result: (MOVLload ptr mem) 15607 for { 15608 t := v.Type 15609 _ = v.Args[1] 15610 ptr := v.Args[0] 15611 mem := v.Args[1] 15612 if !(is32BitInt(t) || isPtr(t)) { 15613 break 15614 } 15615 v.reset(Op386MOVLload) 15616 v.AddArg(ptr) 15617 v.AddArg(mem) 15618 return true 15619 } 15620 // match: (Load <t> ptr mem) 15621 // cond: is16BitInt(t) 15622 // result: (MOVWload ptr mem) 15623 for { 15624 t := v.Type 15625 _ = v.Args[1] 15626 ptr := v.Args[0] 15627 mem := v.Args[1] 15628 if !(is16BitInt(t)) { 15629 break 15630 } 15631 v.reset(Op386MOVWload) 15632 v.AddArg(ptr) 15633 v.AddArg(mem) 15634 return true 15635 } 15636 // match: (Load <t> ptr mem) 15637 // cond: (t.IsBoolean() || is8BitInt(t)) 15638 // result: (MOVBload ptr mem) 15639 for { 15640 t := v.Type 15641 _ = v.Args[1] 15642 ptr := v.Args[0] 15643 mem := v.Args[1] 15644 if !(t.IsBoolean() || is8BitInt(t)) { 15645 break 15646 } 15647 v.reset(Op386MOVBload) 15648 v.AddArg(ptr) 15649 v.AddArg(mem) 15650 return true 15651 } 15652 // match: (Load <t> ptr mem) 15653 // cond: is32BitFloat(t) 15654 // result: (MOVSSload ptr mem) 15655 for { 15656 t := v.Type 15657 _ = v.Args[1] 15658 ptr := v.Args[0] 15659 mem := v.Args[1] 15660 if !(is32BitFloat(t)) { 15661 break 15662 } 15663 v.reset(Op386MOVSSload) 15664 v.AddArg(ptr) 15665 v.AddArg(mem) 15666 return true 15667 } 15668 // match: (Load <t> ptr mem) 15669 // cond: is64BitFloat(t) 15670 // result: (MOVSDload ptr mem) 15671 for { 15672 t := v.Type 15673 _ = v.Args[1] 15674 ptr := v.Args[0] 15675 mem := v.Args[1] 15676 if !(is64BitFloat(t)) { 15677 break 15678 } 15679 v.reset(Op386MOVSDload) 15680 v.AddArg(ptr) 15681 v.AddArg(mem) 15682 return true 15683 } 15684 return false 15685 } 15686 func rewriteValue386_OpLsh16x16_0(v *Value) bool { 15687 b := v.Block 15688 _ = b 15689 // match: (Lsh16x16 <t> x y) 15690 // cond: 15691 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15692 for { 15693 t := v.Type 15694 _ = v.Args[1] 15695 x := v.Args[0] 15696 y := v.Args[1] 15697 v.reset(Op386ANDL) 15698 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15699 v0.AddArg(x) 15700 v0.AddArg(y) 15701 v.AddArg(v0) 15702 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15703 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 15704 v2.AuxInt = 32 15705 v2.AddArg(y) 15706 v1.AddArg(v2) 15707 v.AddArg(v1) 15708 return true 15709 } 15710 } 15711 func rewriteValue386_OpLsh16x32_0(v *Value) bool { 15712 b := v.Block 15713 _ = b 15714 // match: (Lsh16x32 <t> x y) 15715 // cond: 15716 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15717 for { 15718 t := v.Type 15719 _ = v.Args[1] 15720 x := v.Args[0] 15721 y := v.Args[1] 15722 v.reset(Op386ANDL) 15723 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15724 v0.AddArg(x) 15725 v0.AddArg(y) 15726 v.AddArg(v0) 15727 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15728 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 15729 v2.AuxInt = 32 15730 v2.AddArg(y) 15731 v1.AddArg(v2) 15732 v.AddArg(v1) 15733 return true 15734 } 15735 } 15736 func rewriteValue386_OpLsh16x64_0(v *Value) bool { 15737 // match: (Lsh16x64 x (Const64 [c])) 15738 // cond: uint64(c) < 16 15739 // result: (SHLLconst x [c]) 15740 for { 15741 _ = v.Args[1] 15742 x := v.Args[0] 15743 v_1 := v.Args[1] 15744 if v_1.Op != OpConst64 { 15745 break 15746 } 15747 c := v_1.AuxInt 15748 if !(uint64(c) < 16) { 15749 break 15750 } 15751 v.reset(Op386SHLLconst) 15752 v.AuxInt = c 15753 v.AddArg(x) 15754 return true 15755 } 15756 // match: (Lsh16x64 _ (Const64 [c])) 15757 // cond: uint64(c) >= 16 15758 // result: (Const16 [0]) 15759 for { 15760 _ = v.Args[1] 15761 v_1 := v.Args[1] 15762 if v_1.Op != OpConst64 { 15763 break 15764 } 15765 c := v_1.AuxInt 15766 if !(uint64(c) >= 16) { 15767 break 15768 } 15769 v.reset(OpConst16) 15770 v.AuxInt = 0 15771 return true 15772 } 15773 return false 15774 } 15775 func rewriteValue386_OpLsh16x8_0(v *Value) bool { 15776 b := v.Block 15777 _ = b 15778 // match: (Lsh16x8 <t> x y) 15779 // cond: 15780 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15781 for { 15782 t := v.Type 15783 _ = v.Args[1] 15784 x := v.Args[0] 15785 y := v.Args[1] 15786 v.reset(Op386ANDL) 15787 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15788 v0.AddArg(x) 15789 v0.AddArg(y) 15790 v.AddArg(v0) 15791 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15792 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 15793 v2.AuxInt = 32 15794 v2.AddArg(y) 15795 v1.AddArg(v2) 15796 v.AddArg(v1) 15797 return true 15798 } 15799 } 15800 func rewriteValue386_OpLsh32x16_0(v *Value) bool { 15801 b := v.Block 15802 _ = b 15803 // match: (Lsh32x16 <t> x y) 15804 // cond: 15805 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15806 for { 15807 t := v.Type 15808 _ = v.Args[1] 15809 x := v.Args[0] 15810 y := v.Args[1] 15811 v.reset(Op386ANDL) 15812 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15813 v0.AddArg(x) 15814 v0.AddArg(y) 15815 v.AddArg(v0) 15816 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15817 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 15818 v2.AuxInt = 32 15819 v2.AddArg(y) 15820 v1.AddArg(v2) 15821 v.AddArg(v1) 15822 return true 15823 } 15824 } 15825 func rewriteValue386_OpLsh32x32_0(v *Value) bool { 15826 b := v.Block 15827 _ = b 15828 // match: (Lsh32x32 <t> x y) 15829 // cond: 15830 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15831 for { 15832 t := v.Type 15833 _ = v.Args[1] 15834 x := v.Args[0] 15835 y := v.Args[1] 15836 v.reset(Op386ANDL) 15837 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15838 v0.AddArg(x) 15839 v0.AddArg(y) 15840 v.AddArg(v0) 15841 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15842 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 15843 v2.AuxInt = 32 15844 v2.AddArg(y) 15845 v1.AddArg(v2) 15846 v.AddArg(v1) 15847 return true 15848 } 15849 } 15850 func rewriteValue386_OpLsh32x64_0(v *Value) bool { 15851 // match: (Lsh32x64 x (Const64 [c])) 15852 // cond: uint64(c) < 32 15853 // result: (SHLLconst x [c]) 15854 for { 15855 _ = v.Args[1] 15856 x := v.Args[0] 15857 v_1 := v.Args[1] 15858 if v_1.Op != OpConst64 { 15859 break 15860 } 15861 c := v_1.AuxInt 15862 if !(uint64(c) < 32) { 15863 break 15864 } 15865 v.reset(Op386SHLLconst) 15866 v.AuxInt = c 15867 v.AddArg(x) 15868 return true 15869 } 15870 // match: (Lsh32x64 _ (Const64 [c])) 15871 // cond: uint64(c) >= 32 15872 // result: (Const32 [0]) 15873 for { 15874 _ = v.Args[1] 15875 v_1 := v.Args[1] 15876 if v_1.Op != OpConst64 { 15877 break 15878 } 15879 c := v_1.AuxInt 15880 if !(uint64(c) >= 32) { 15881 break 15882 } 15883 v.reset(OpConst32) 15884 v.AuxInt = 0 15885 return true 15886 } 15887 return false 15888 } 15889 func rewriteValue386_OpLsh32x8_0(v *Value) bool { 15890 b := v.Block 15891 _ = b 15892 // match: (Lsh32x8 <t> x y) 15893 // cond: 15894 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15895 for { 15896 t := v.Type 15897 _ = v.Args[1] 15898 x := v.Args[0] 15899 y := v.Args[1] 15900 v.reset(Op386ANDL) 15901 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15902 v0.AddArg(x) 15903 v0.AddArg(y) 15904 v.AddArg(v0) 15905 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15906 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 15907 v2.AuxInt = 32 15908 v2.AddArg(y) 15909 v1.AddArg(v2) 15910 v.AddArg(v1) 15911 return true 15912 } 15913 } 15914 func rewriteValue386_OpLsh8x16_0(v *Value) bool { 15915 b := v.Block 15916 _ = b 15917 // match: (Lsh8x16 <t> x y) 15918 // cond: 15919 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15920 for { 15921 t := v.Type 15922 _ = v.Args[1] 15923 x := v.Args[0] 15924 y := v.Args[1] 15925 v.reset(Op386ANDL) 15926 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15927 v0.AddArg(x) 15928 v0.AddArg(y) 15929 v.AddArg(v0) 15930 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15931 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 15932 v2.AuxInt = 32 15933 v2.AddArg(y) 15934 v1.AddArg(v2) 15935 v.AddArg(v1) 15936 return true 15937 } 15938 } 15939 func rewriteValue386_OpLsh8x32_0(v *Value) bool { 15940 b := v.Block 15941 _ = b 15942 // match: (Lsh8x32 <t> x y) 15943 // cond: 15944 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15945 for { 15946 t := v.Type 15947 _ = v.Args[1] 15948 x := v.Args[0] 15949 y := v.Args[1] 15950 v.reset(Op386ANDL) 15951 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15952 v0.AddArg(x) 15953 v0.AddArg(y) 15954 v.AddArg(v0) 15955 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15956 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 15957 v2.AuxInt = 32 15958 v2.AddArg(y) 15959 v1.AddArg(v2) 15960 v.AddArg(v1) 15961 return true 15962 } 15963 } 15964 func rewriteValue386_OpLsh8x64_0(v *Value) bool { 15965 // match: (Lsh8x64 x (Const64 [c])) 15966 // cond: uint64(c) < 8 15967 // result: (SHLLconst x [c]) 15968 for { 15969 _ = v.Args[1] 15970 x := v.Args[0] 15971 v_1 := v.Args[1] 15972 if v_1.Op != OpConst64 { 15973 break 15974 } 15975 c := v_1.AuxInt 15976 if !(uint64(c) < 8) { 15977 break 15978 } 15979 v.reset(Op386SHLLconst) 15980 v.AuxInt = c 15981 v.AddArg(x) 15982 return true 15983 } 15984 // match: (Lsh8x64 _ (Const64 [c])) 15985 // cond: uint64(c) >= 8 15986 // result: (Const8 [0]) 15987 for { 15988 _ = v.Args[1] 15989 v_1 := v.Args[1] 15990 if v_1.Op != OpConst64 { 15991 break 15992 } 15993 c := v_1.AuxInt 15994 if !(uint64(c) >= 8) { 15995 break 15996 } 15997 v.reset(OpConst8) 15998 v.AuxInt = 0 15999 return true 16000 } 16001 return false 16002 } 16003 func rewriteValue386_OpLsh8x8_0(v *Value) bool { 16004 b := v.Block 16005 _ = b 16006 // match: (Lsh8x8 <t> x y) 16007 // cond: 16008 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 16009 for { 16010 t := v.Type 16011 _ = v.Args[1] 16012 x := v.Args[0] 16013 y := v.Args[1] 16014 v.reset(Op386ANDL) 16015 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 16016 v0.AddArg(x) 16017 v0.AddArg(y) 16018 v.AddArg(v0) 16019 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16020 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 16021 v2.AuxInt = 32 16022 v2.AddArg(y) 16023 v1.AddArg(v2) 16024 v.AddArg(v1) 16025 return true 16026 } 16027 } 16028 func rewriteValue386_OpMod16_0(v *Value) bool { 16029 // match: (Mod16 x y) 16030 // cond: 16031 // result: (MODW x y) 16032 for { 16033 _ = v.Args[1] 16034 x := v.Args[0] 16035 y := v.Args[1] 16036 v.reset(Op386MODW) 16037 v.AddArg(x) 16038 v.AddArg(y) 16039 return true 16040 } 16041 } 16042 func rewriteValue386_OpMod16u_0(v *Value) bool { 16043 // match: (Mod16u x y) 16044 // cond: 16045 // result: (MODWU x y) 16046 for { 16047 _ = v.Args[1] 16048 x := v.Args[0] 16049 y := v.Args[1] 16050 v.reset(Op386MODWU) 16051 v.AddArg(x) 16052 v.AddArg(y) 16053 return true 16054 } 16055 } 16056 func rewriteValue386_OpMod32_0(v *Value) bool { 16057 // match: (Mod32 x y) 16058 // cond: 16059 // result: (MODL x y) 16060 for { 16061 _ = v.Args[1] 16062 x := v.Args[0] 16063 y := v.Args[1] 16064 v.reset(Op386MODL) 16065 v.AddArg(x) 16066 v.AddArg(y) 16067 return true 16068 } 16069 } 16070 func rewriteValue386_OpMod32u_0(v *Value) bool { 16071 // match: (Mod32u x y) 16072 // cond: 16073 // result: (MODLU x y) 16074 for { 16075 _ = v.Args[1] 16076 x := v.Args[0] 16077 y := v.Args[1] 16078 v.reset(Op386MODLU) 16079 v.AddArg(x) 16080 v.AddArg(y) 16081 return true 16082 } 16083 } 16084 func rewriteValue386_OpMod8_0(v *Value) bool { 16085 b := v.Block 16086 _ = b 16087 typ := &b.Func.Config.Types 16088 _ = typ 16089 // match: (Mod8 x y) 16090 // cond: 16091 // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) 16092 for { 16093 _ = v.Args[1] 16094 x := v.Args[0] 16095 y := v.Args[1] 16096 v.reset(Op386MODW) 16097 v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 16098 v0.AddArg(x) 16099 v.AddArg(v0) 16100 v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 16101 v1.AddArg(y) 16102 v.AddArg(v1) 16103 return true 16104 } 16105 } 16106 func rewriteValue386_OpMod8u_0(v *Value) bool { 16107 b := v.Block 16108 _ = b 16109 typ := &b.Func.Config.Types 16110 _ = typ 16111 // match: (Mod8u x y) 16112 // cond: 16113 // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 16114 for { 16115 _ = v.Args[1] 16116 x := v.Args[0] 16117 y := v.Args[1] 16118 v.reset(Op386MODWU) 16119 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 16120 v0.AddArg(x) 16121 v.AddArg(v0) 16122 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 16123 v1.AddArg(y) 16124 v.AddArg(v1) 16125 return true 16126 } 16127 } 16128 func rewriteValue386_OpMove_0(v *Value) bool { 16129 b := v.Block 16130 _ = b 16131 typ := &b.Func.Config.Types 16132 _ = typ 16133 // match: (Move [0] _ _ mem) 16134 // cond: 16135 // result: mem 16136 for { 16137 if v.AuxInt != 0 { 16138 break 16139 } 16140 _ = v.Args[2] 16141 mem := v.Args[2] 16142 v.reset(OpCopy) 16143 v.Type = mem.Type 16144 v.AddArg(mem) 16145 return true 16146 } 16147 // match: (Move [1] dst src mem) 16148 // cond: 16149 // result: (MOVBstore dst (MOVBload src mem) mem) 16150 for { 16151 if v.AuxInt != 1 { 16152 break 16153 } 16154 _ = v.Args[2] 16155 dst := v.Args[0] 16156 src := v.Args[1] 16157 mem := v.Args[2] 16158 v.reset(Op386MOVBstore) 16159 v.AddArg(dst) 16160 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 16161 v0.AddArg(src) 16162 v0.AddArg(mem) 16163 v.AddArg(v0) 16164 v.AddArg(mem) 16165 return true 16166 } 16167 // match: (Move [2] dst src mem) 16168 // cond: 16169 // result: (MOVWstore dst (MOVWload src mem) mem) 16170 for { 16171 if v.AuxInt != 2 { 16172 break 16173 } 16174 _ = v.Args[2] 16175 dst := v.Args[0] 16176 src := v.Args[1] 16177 mem := v.Args[2] 16178 v.reset(Op386MOVWstore) 16179 v.AddArg(dst) 16180 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 16181 v0.AddArg(src) 16182 v0.AddArg(mem) 16183 v.AddArg(v0) 16184 v.AddArg(mem) 16185 return true 16186 } 16187 // match: (Move [4] dst src mem) 16188 // cond: 16189 // result: (MOVLstore dst (MOVLload src mem) mem) 16190 for { 16191 if v.AuxInt != 4 { 16192 break 16193 } 16194 _ = v.Args[2] 16195 dst := v.Args[0] 16196 src := v.Args[1] 16197 mem := v.Args[2] 16198 v.reset(Op386MOVLstore) 16199 v.AddArg(dst) 16200 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16201 v0.AddArg(src) 16202 v0.AddArg(mem) 16203 v.AddArg(v0) 16204 v.AddArg(mem) 16205 return true 16206 } 16207 // match: (Move [3] dst src mem) 16208 // cond: 16209 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) 16210 for { 16211 if v.AuxInt != 3 { 16212 break 16213 } 16214 _ = v.Args[2] 16215 dst := v.Args[0] 16216 src := v.Args[1] 16217 mem := v.Args[2] 16218 v.reset(Op386MOVBstore) 16219 v.AuxInt = 2 16220 v.AddArg(dst) 16221 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 16222 v0.AuxInt = 2 16223 v0.AddArg(src) 16224 v0.AddArg(mem) 16225 v.AddArg(v0) 16226 v1 := b.NewValue0(v.Pos, Op386MOVWstore, types.TypeMem) 16227 v1.AddArg(dst) 16228 v2 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 16229 v2.AddArg(src) 16230 v2.AddArg(mem) 16231 v1.AddArg(v2) 16232 v1.AddArg(mem) 16233 v.AddArg(v1) 16234 return true 16235 } 16236 // match: (Move [5] dst src mem) 16237 // cond: 16238 // result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16239 for { 16240 if v.AuxInt != 5 { 16241 break 16242 } 16243 _ = v.Args[2] 16244 dst := v.Args[0] 16245 src := v.Args[1] 16246 mem := v.Args[2] 16247 v.reset(Op386MOVBstore) 16248 v.AuxInt = 4 16249 v.AddArg(dst) 16250 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 16251 v0.AuxInt = 4 16252 v0.AddArg(src) 16253 v0.AddArg(mem) 16254 v.AddArg(v0) 16255 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16256 v1.AddArg(dst) 16257 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16258 v2.AddArg(src) 16259 v2.AddArg(mem) 16260 v1.AddArg(v2) 16261 v1.AddArg(mem) 16262 v.AddArg(v1) 16263 return true 16264 } 16265 // match: (Move [6] dst src mem) 16266 // cond: 16267 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16268 for { 16269 if v.AuxInt != 6 { 16270 break 16271 } 16272 _ = v.Args[2] 16273 dst := v.Args[0] 16274 src := v.Args[1] 16275 mem := v.Args[2] 16276 v.reset(Op386MOVWstore) 16277 v.AuxInt = 4 16278 v.AddArg(dst) 16279 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 16280 v0.AuxInt = 4 16281 v0.AddArg(src) 16282 v0.AddArg(mem) 16283 v.AddArg(v0) 16284 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16285 v1.AddArg(dst) 16286 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16287 v2.AddArg(src) 16288 v2.AddArg(mem) 16289 v1.AddArg(v2) 16290 v1.AddArg(mem) 16291 v.AddArg(v1) 16292 return true 16293 } 16294 // match: (Move [7] dst src mem) 16295 // cond: 16296 // result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16297 for { 16298 if v.AuxInt != 7 { 16299 break 16300 } 16301 _ = v.Args[2] 16302 dst := v.Args[0] 16303 src := v.Args[1] 16304 mem := v.Args[2] 16305 v.reset(Op386MOVLstore) 16306 v.AuxInt = 3 16307 v.AddArg(dst) 16308 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16309 v0.AuxInt = 3 16310 v0.AddArg(src) 16311 v0.AddArg(mem) 16312 v.AddArg(v0) 16313 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16314 v1.AddArg(dst) 16315 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16316 v2.AddArg(src) 16317 v2.AddArg(mem) 16318 v1.AddArg(v2) 16319 v1.AddArg(mem) 16320 v.AddArg(v1) 16321 return true 16322 } 16323 // match: (Move [8] dst src mem) 16324 // cond: 16325 // result: (MOVLstore [4] dst (MOVLload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16326 for { 16327 if v.AuxInt != 8 { 16328 break 16329 } 16330 _ = v.Args[2] 16331 dst := v.Args[0] 16332 src := v.Args[1] 16333 mem := v.Args[2] 16334 v.reset(Op386MOVLstore) 16335 v.AuxInt = 4 16336 v.AddArg(dst) 16337 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16338 v0.AuxInt = 4 16339 v0.AddArg(src) 16340 v0.AddArg(mem) 16341 v.AddArg(v0) 16342 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16343 v1.AddArg(dst) 16344 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16345 v2.AddArg(src) 16346 v2.AddArg(mem) 16347 v1.AddArg(v2) 16348 v1.AddArg(mem) 16349 v.AddArg(v1) 16350 return true 16351 } 16352 // match: (Move [s] dst src mem) 16353 // cond: s > 8 && s%4 != 0 16354 // result: (Move [s-s%4] (ADDLconst <dst.Type> dst [s%4]) (ADDLconst <src.Type> src [s%4]) (MOVLstore dst (MOVLload src mem) mem)) 16355 for { 16356 s := v.AuxInt 16357 _ = v.Args[2] 16358 dst := v.Args[0] 16359 src := v.Args[1] 16360 mem := v.Args[2] 16361 if !(s > 8 && s%4 != 0) { 16362 break 16363 } 16364 v.reset(OpMove) 16365 v.AuxInt = s - s%4 16366 v0 := b.NewValue0(v.Pos, Op386ADDLconst, dst.Type) 16367 v0.AuxInt = s % 4 16368 v0.AddArg(dst) 16369 v.AddArg(v0) 16370 v1 := b.NewValue0(v.Pos, Op386ADDLconst, src.Type) 16371 v1.AuxInt = s % 4 16372 v1.AddArg(src) 16373 v.AddArg(v1) 16374 v2 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16375 v2.AddArg(dst) 16376 v3 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16377 v3.AddArg(src) 16378 v3.AddArg(mem) 16379 v2.AddArg(v3) 16380 v2.AddArg(mem) 16381 v.AddArg(v2) 16382 return true 16383 } 16384 return false 16385 } 16386 func rewriteValue386_OpMove_10(v *Value) bool { 16387 b := v.Block 16388 _ = b 16389 config := b.Func.Config 16390 _ = config 16391 typ := &b.Func.Config.Types 16392 _ = typ 16393 // match: (Move [s] dst src mem) 16394 // cond: s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 16395 // result: (DUFFCOPY [10*(128-s/4)] dst src mem) 16396 for { 16397 s := v.AuxInt 16398 _ = v.Args[2] 16399 dst := v.Args[0] 16400 src := v.Args[1] 16401 mem := v.Args[2] 16402 if !(s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 16403 break 16404 } 16405 v.reset(Op386DUFFCOPY) 16406 v.AuxInt = 10 * (128 - s/4) 16407 v.AddArg(dst) 16408 v.AddArg(src) 16409 v.AddArg(mem) 16410 return true 16411 } 16412 // match: (Move [s] dst src mem) 16413 // cond: (s > 4*128 || config.noDuffDevice) && s%4 == 0 16414 // result: (REPMOVSL dst src (MOVLconst [s/4]) mem) 16415 for { 16416 s := v.AuxInt 16417 _ = v.Args[2] 16418 dst := v.Args[0] 16419 src := v.Args[1] 16420 mem := v.Args[2] 16421 if !((s > 4*128 || config.noDuffDevice) && s%4 == 0) { 16422 break 16423 } 16424 v.reset(Op386REPMOVSL) 16425 v.AddArg(dst) 16426 v.AddArg(src) 16427 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 16428 v0.AuxInt = s / 4 16429 v.AddArg(v0) 16430 v.AddArg(mem) 16431 return true 16432 } 16433 return false 16434 } 16435 func rewriteValue386_OpMul16_0(v *Value) bool { 16436 // match: (Mul16 x y) 16437 // cond: 16438 // result: (MULL x y) 16439 for { 16440 _ = v.Args[1] 16441 x := v.Args[0] 16442 y := v.Args[1] 16443 v.reset(Op386MULL) 16444 v.AddArg(x) 16445 v.AddArg(y) 16446 return true 16447 } 16448 } 16449 func rewriteValue386_OpMul32_0(v *Value) bool { 16450 // match: (Mul32 x y) 16451 // cond: 16452 // result: (MULL x y) 16453 for { 16454 _ = v.Args[1] 16455 x := v.Args[0] 16456 y := v.Args[1] 16457 v.reset(Op386MULL) 16458 v.AddArg(x) 16459 v.AddArg(y) 16460 return true 16461 } 16462 } 16463 func rewriteValue386_OpMul32F_0(v *Value) bool { 16464 // match: (Mul32F x y) 16465 // cond: 16466 // result: (MULSS x y) 16467 for { 16468 _ = v.Args[1] 16469 x := v.Args[0] 16470 y := v.Args[1] 16471 v.reset(Op386MULSS) 16472 v.AddArg(x) 16473 v.AddArg(y) 16474 return true 16475 } 16476 } 16477 func rewriteValue386_OpMul32uhilo_0(v *Value) bool { 16478 // match: (Mul32uhilo x y) 16479 // cond: 16480 // result: (MULLQU x y) 16481 for { 16482 _ = v.Args[1] 16483 x := v.Args[0] 16484 y := v.Args[1] 16485 v.reset(Op386MULLQU) 16486 v.AddArg(x) 16487 v.AddArg(y) 16488 return true 16489 } 16490 } 16491 func rewriteValue386_OpMul64F_0(v *Value) bool { 16492 // match: (Mul64F x y) 16493 // cond: 16494 // result: (MULSD x y) 16495 for { 16496 _ = v.Args[1] 16497 x := v.Args[0] 16498 y := v.Args[1] 16499 v.reset(Op386MULSD) 16500 v.AddArg(x) 16501 v.AddArg(y) 16502 return true 16503 } 16504 } 16505 func rewriteValue386_OpMul8_0(v *Value) bool { 16506 // match: (Mul8 x y) 16507 // cond: 16508 // result: (MULL x y) 16509 for { 16510 _ = v.Args[1] 16511 x := v.Args[0] 16512 y := v.Args[1] 16513 v.reset(Op386MULL) 16514 v.AddArg(x) 16515 v.AddArg(y) 16516 return true 16517 } 16518 } 16519 func rewriteValue386_OpNeg16_0(v *Value) bool { 16520 // match: (Neg16 x) 16521 // cond: 16522 // result: (NEGL x) 16523 for { 16524 x := v.Args[0] 16525 v.reset(Op386NEGL) 16526 v.AddArg(x) 16527 return true 16528 } 16529 } 16530 func rewriteValue386_OpNeg32_0(v *Value) bool { 16531 // match: (Neg32 x) 16532 // cond: 16533 // result: (NEGL x) 16534 for { 16535 x := v.Args[0] 16536 v.reset(Op386NEGL) 16537 v.AddArg(x) 16538 return true 16539 } 16540 } 16541 func rewriteValue386_OpNeg32F_0(v *Value) bool { 16542 b := v.Block 16543 _ = b 16544 config := b.Func.Config 16545 _ = config 16546 typ := &b.Func.Config.Types 16547 _ = typ 16548 // match: (Neg32F x) 16549 // cond: !config.use387 16550 // result: (PXOR x (MOVSSconst <typ.Float32> [f2i(math.Copysign(0, -1))])) 16551 for { 16552 x := v.Args[0] 16553 if !(!config.use387) { 16554 break 16555 } 16556 v.reset(Op386PXOR) 16557 v.AddArg(x) 16558 v0 := b.NewValue0(v.Pos, Op386MOVSSconst, typ.Float32) 16559 v0.AuxInt = f2i(math.Copysign(0, -1)) 16560 v.AddArg(v0) 16561 return true 16562 } 16563 // match: (Neg32F x) 16564 // cond: config.use387 16565 // result: (FCHS x) 16566 for { 16567 x := v.Args[0] 16568 if !(config.use387) { 16569 break 16570 } 16571 v.reset(Op386FCHS) 16572 v.AddArg(x) 16573 return true 16574 } 16575 return false 16576 } 16577 func rewriteValue386_OpNeg64F_0(v *Value) bool { 16578 b := v.Block 16579 _ = b 16580 config := b.Func.Config 16581 _ = config 16582 typ := &b.Func.Config.Types 16583 _ = typ 16584 // match: (Neg64F x) 16585 // cond: !config.use387 16586 // result: (PXOR x (MOVSDconst <typ.Float64> [f2i(math.Copysign(0, -1))])) 16587 for { 16588 x := v.Args[0] 16589 if !(!config.use387) { 16590 break 16591 } 16592 v.reset(Op386PXOR) 16593 v.AddArg(x) 16594 v0 := b.NewValue0(v.Pos, Op386MOVSDconst, typ.Float64) 16595 v0.AuxInt = f2i(math.Copysign(0, -1)) 16596 v.AddArg(v0) 16597 return true 16598 } 16599 // match: (Neg64F x) 16600 // cond: config.use387 16601 // result: (FCHS x) 16602 for { 16603 x := v.Args[0] 16604 if !(config.use387) { 16605 break 16606 } 16607 v.reset(Op386FCHS) 16608 v.AddArg(x) 16609 return true 16610 } 16611 return false 16612 } 16613 func rewriteValue386_OpNeg8_0(v *Value) bool { 16614 // match: (Neg8 x) 16615 // cond: 16616 // result: (NEGL x) 16617 for { 16618 x := v.Args[0] 16619 v.reset(Op386NEGL) 16620 v.AddArg(x) 16621 return true 16622 } 16623 } 16624 func rewriteValue386_OpNeq16_0(v *Value) bool { 16625 b := v.Block 16626 _ = b 16627 // match: (Neq16 x y) 16628 // cond: 16629 // result: (SETNE (CMPW x y)) 16630 for { 16631 _ = v.Args[1] 16632 x := v.Args[0] 16633 y := v.Args[1] 16634 v.reset(Op386SETNE) 16635 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 16636 v0.AddArg(x) 16637 v0.AddArg(y) 16638 v.AddArg(v0) 16639 return true 16640 } 16641 } 16642 func rewriteValue386_OpNeq32_0(v *Value) bool { 16643 b := v.Block 16644 _ = b 16645 // match: (Neq32 x y) 16646 // cond: 16647 // result: (SETNE (CMPL x y)) 16648 for { 16649 _ = v.Args[1] 16650 x := v.Args[0] 16651 y := v.Args[1] 16652 v.reset(Op386SETNE) 16653 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 16654 v0.AddArg(x) 16655 v0.AddArg(y) 16656 v.AddArg(v0) 16657 return true 16658 } 16659 } 16660 func rewriteValue386_OpNeq32F_0(v *Value) bool { 16661 b := v.Block 16662 _ = b 16663 // match: (Neq32F x y) 16664 // cond: 16665 // result: (SETNEF (UCOMISS x y)) 16666 for { 16667 _ = v.Args[1] 16668 x := v.Args[0] 16669 y := v.Args[1] 16670 v.reset(Op386SETNEF) 16671 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 16672 v0.AddArg(x) 16673 v0.AddArg(y) 16674 v.AddArg(v0) 16675 return true 16676 } 16677 } 16678 func rewriteValue386_OpNeq64F_0(v *Value) bool { 16679 b := v.Block 16680 _ = b 16681 // match: (Neq64F x y) 16682 // cond: 16683 // result: (SETNEF (UCOMISD x y)) 16684 for { 16685 _ = v.Args[1] 16686 x := v.Args[0] 16687 y := v.Args[1] 16688 v.reset(Op386SETNEF) 16689 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 16690 v0.AddArg(x) 16691 v0.AddArg(y) 16692 v.AddArg(v0) 16693 return true 16694 } 16695 } 16696 func rewriteValue386_OpNeq8_0(v *Value) bool { 16697 b := v.Block 16698 _ = b 16699 // match: (Neq8 x y) 16700 // cond: 16701 // result: (SETNE (CMPB x y)) 16702 for { 16703 _ = v.Args[1] 16704 x := v.Args[0] 16705 y := v.Args[1] 16706 v.reset(Op386SETNE) 16707 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 16708 v0.AddArg(x) 16709 v0.AddArg(y) 16710 v.AddArg(v0) 16711 return true 16712 } 16713 } 16714 func rewriteValue386_OpNeqB_0(v *Value) bool { 16715 b := v.Block 16716 _ = b 16717 // match: (NeqB x y) 16718 // cond: 16719 // result: (SETNE (CMPB x y)) 16720 for { 16721 _ = v.Args[1] 16722 x := v.Args[0] 16723 y := v.Args[1] 16724 v.reset(Op386SETNE) 16725 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 16726 v0.AddArg(x) 16727 v0.AddArg(y) 16728 v.AddArg(v0) 16729 return true 16730 } 16731 } 16732 func rewriteValue386_OpNeqPtr_0(v *Value) bool { 16733 b := v.Block 16734 _ = b 16735 // match: (NeqPtr x y) 16736 // cond: 16737 // result: (SETNE (CMPL x y)) 16738 for { 16739 _ = v.Args[1] 16740 x := v.Args[0] 16741 y := v.Args[1] 16742 v.reset(Op386SETNE) 16743 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 16744 v0.AddArg(x) 16745 v0.AddArg(y) 16746 v.AddArg(v0) 16747 return true 16748 } 16749 } 16750 func rewriteValue386_OpNilCheck_0(v *Value) bool { 16751 // match: (NilCheck ptr mem) 16752 // cond: 16753 // result: (LoweredNilCheck ptr mem) 16754 for { 16755 _ = v.Args[1] 16756 ptr := v.Args[0] 16757 mem := v.Args[1] 16758 v.reset(Op386LoweredNilCheck) 16759 v.AddArg(ptr) 16760 v.AddArg(mem) 16761 return true 16762 } 16763 } 16764 func rewriteValue386_OpNot_0(v *Value) bool { 16765 // match: (Not x) 16766 // cond: 16767 // result: (XORLconst [1] x) 16768 for { 16769 x := v.Args[0] 16770 v.reset(Op386XORLconst) 16771 v.AuxInt = 1 16772 v.AddArg(x) 16773 return true 16774 } 16775 } 16776 func rewriteValue386_OpOffPtr_0(v *Value) bool { 16777 // match: (OffPtr [off] ptr) 16778 // cond: 16779 // result: (ADDLconst [off] ptr) 16780 for { 16781 off := v.AuxInt 16782 ptr := v.Args[0] 16783 v.reset(Op386ADDLconst) 16784 v.AuxInt = off 16785 v.AddArg(ptr) 16786 return true 16787 } 16788 } 16789 func rewriteValue386_OpOr16_0(v *Value) bool { 16790 // match: (Or16 x y) 16791 // cond: 16792 // result: (ORL x y) 16793 for { 16794 _ = v.Args[1] 16795 x := v.Args[0] 16796 y := v.Args[1] 16797 v.reset(Op386ORL) 16798 v.AddArg(x) 16799 v.AddArg(y) 16800 return true 16801 } 16802 } 16803 func rewriteValue386_OpOr32_0(v *Value) bool { 16804 // match: (Or32 x y) 16805 // cond: 16806 // result: (ORL x y) 16807 for { 16808 _ = v.Args[1] 16809 x := v.Args[0] 16810 y := v.Args[1] 16811 v.reset(Op386ORL) 16812 v.AddArg(x) 16813 v.AddArg(y) 16814 return true 16815 } 16816 } 16817 func rewriteValue386_OpOr8_0(v *Value) bool { 16818 // match: (Or8 x y) 16819 // cond: 16820 // result: (ORL x y) 16821 for { 16822 _ = v.Args[1] 16823 x := v.Args[0] 16824 y := v.Args[1] 16825 v.reset(Op386ORL) 16826 v.AddArg(x) 16827 v.AddArg(y) 16828 return true 16829 } 16830 } 16831 func rewriteValue386_OpOrB_0(v *Value) bool { 16832 // match: (OrB x y) 16833 // cond: 16834 // result: (ORL x y) 16835 for { 16836 _ = v.Args[1] 16837 x := v.Args[0] 16838 y := v.Args[1] 16839 v.reset(Op386ORL) 16840 v.AddArg(x) 16841 v.AddArg(y) 16842 return true 16843 } 16844 } 16845 func rewriteValue386_OpRound32F_0(v *Value) bool { 16846 // match: (Round32F x) 16847 // cond: 16848 // result: x 16849 for { 16850 x := v.Args[0] 16851 v.reset(OpCopy) 16852 v.Type = x.Type 16853 v.AddArg(x) 16854 return true 16855 } 16856 } 16857 func rewriteValue386_OpRound64F_0(v *Value) bool { 16858 // match: (Round64F x) 16859 // cond: 16860 // result: x 16861 for { 16862 x := v.Args[0] 16863 v.reset(OpCopy) 16864 v.Type = x.Type 16865 v.AddArg(x) 16866 return true 16867 } 16868 } 16869 func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { 16870 b := v.Block 16871 _ = b 16872 // match: (Rsh16Ux16 <t> x y) 16873 // cond: 16874 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16]))) 16875 for { 16876 t := v.Type 16877 _ = v.Args[1] 16878 x := v.Args[0] 16879 y := v.Args[1] 16880 v.reset(Op386ANDL) 16881 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16882 v0.AddArg(x) 16883 v0.AddArg(y) 16884 v.AddArg(v0) 16885 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16886 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 16887 v2.AuxInt = 16 16888 v2.AddArg(y) 16889 v1.AddArg(v2) 16890 v.AddArg(v1) 16891 return true 16892 } 16893 } 16894 func rewriteValue386_OpRsh16Ux32_0(v *Value) bool { 16895 b := v.Block 16896 _ = b 16897 // match: (Rsh16Ux32 <t> x y) 16898 // cond: 16899 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16]))) 16900 for { 16901 t := v.Type 16902 _ = v.Args[1] 16903 x := v.Args[0] 16904 y := v.Args[1] 16905 v.reset(Op386ANDL) 16906 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16907 v0.AddArg(x) 16908 v0.AddArg(y) 16909 v.AddArg(v0) 16910 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16911 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 16912 v2.AuxInt = 16 16913 v2.AddArg(y) 16914 v1.AddArg(v2) 16915 v.AddArg(v1) 16916 return true 16917 } 16918 } 16919 func rewriteValue386_OpRsh16Ux64_0(v *Value) bool { 16920 // match: (Rsh16Ux64 x (Const64 [c])) 16921 // cond: uint64(c) < 16 16922 // result: (SHRWconst x [c]) 16923 for { 16924 _ = v.Args[1] 16925 x := v.Args[0] 16926 v_1 := v.Args[1] 16927 if v_1.Op != OpConst64 { 16928 break 16929 } 16930 c := v_1.AuxInt 16931 if !(uint64(c) < 16) { 16932 break 16933 } 16934 v.reset(Op386SHRWconst) 16935 v.AuxInt = c 16936 v.AddArg(x) 16937 return true 16938 } 16939 // match: (Rsh16Ux64 _ (Const64 [c])) 16940 // cond: uint64(c) >= 16 16941 // result: (Const16 [0]) 16942 for { 16943 _ = v.Args[1] 16944 v_1 := v.Args[1] 16945 if v_1.Op != OpConst64 { 16946 break 16947 } 16948 c := v_1.AuxInt 16949 if !(uint64(c) >= 16) { 16950 break 16951 } 16952 v.reset(OpConst16) 16953 v.AuxInt = 0 16954 return true 16955 } 16956 return false 16957 } 16958 func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { 16959 b := v.Block 16960 _ = b 16961 // match: (Rsh16Ux8 <t> x y) 16962 // cond: 16963 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16]))) 16964 for { 16965 t := v.Type 16966 _ = v.Args[1] 16967 x := v.Args[0] 16968 y := v.Args[1] 16969 v.reset(Op386ANDL) 16970 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16971 v0.AddArg(x) 16972 v0.AddArg(y) 16973 v.AddArg(v0) 16974 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16975 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 16976 v2.AuxInt = 16 16977 v2.AddArg(y) 16978 v1.AddArg(v2) 16979 v.AddArg(v1) 16980 return true 16981 } 16982 } 16983 func rewriteValue386_OpRsh16x16_0(v *Value) bool { 16984 b := v.Block 16985 _ = b 16986 // match: (Rsh16x16 <t> x y) 16987 // cond: 16988 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16]))))) 16989 for { 16990 t := v.Type 16991 _ = v.Args[1] 16992 x := v.Args[0] 16993 y := v.Args[1] 16994 v.reset(Op386SARW) 16995 v.Type = t 16996 v.AddArg(x) 16997 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 16998 v0.AddArg(y) 16999 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17000 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17001 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17002 v3.AuxInt = 16 17003 v3.AddArg(y) 17004 v2.AddArg(v3) 17005 v1.AddArg(v2) 17006 v0.AddArg(v1) 17007 v.AddArg(v0) 17008 return true 17009 } 17010 } 17011 func rewriteValue386_OpRsh16x32_0(v *Value) bool { 17012 b := v.Block 17013 _ = b 17014 // match: (Rsh16x32 <t> x y) 17015 // cond: 17016 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16]))))) 17017 for { 17018 t := v.Type 17019 _ = v.Args[1] 17020 x := v.Args[0] 17021 y := v.Args[1] 17022 v.reset(Op386SARW) 17023 v.Type = t 17024 v.AddArg(x) 17025 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17026 v0.AddArg(y) 17027 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17028 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17029 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17030 v3.AuxInt = 16 17031 v3.AddArg(y) 17032 v2.AddArg(v3) 17033 v1.AddArg(v2) 17034 v0.AddArg(v1) 17035 v.AddArg(v0) 17036 return true 17037 } 17038 } 17039 func rewriteValue386_OpRsh16x64_0(v *Value) bool { 17040 // match: (Rsh16x64 x (Const64 [c])) 17041 // cond: uint64(c) < 16 17042 // result: (SARWconst x [c]) 17043 for { 17044 _ = v.Args[1] 17045 x := v.Args[0] 17046 v_1 := v.Args[1] 17047 if v_1.Op != OpConst64 { 17048 break 17049 } 17050 c := v_1.AuxInt 17051 if !(uint64(c) < 16) { 17052 break 17053 } 17054 v.reset(Op386SARWconst) 17055 v.AuxInt = c 17056 v.AddArg(x) 17057 return true 17058 } 17059 // match: (Rsh16x64 x (Const64 [c])) 17060 // cond: uint64(c) >= 16 17061 // result: (SARWconst x [15]) 17062 for { 17063 _ = v.Args[1] 17064 x := v.Args[0] 17065 v_1 := v.Args[1] 17066 if v_1.Op != OpConst64 { 17067 break 17068 } 17069 c := v_1.AuxInt 17070 if !(uint64(c) >= 16) { 17071 break 17072 } 17073 v.reset(Op386SARWconst) 17074 v.AuxInt = 15 17075 v.AddArg(x) 17076 return true 17077 } 17078 return false 17079 } 17080 func rewriteValue386_OpRsh16x8_0(v *Value) bool { 17081 b := v.Block 17082 _ = b 17083 // match: (Rsh16x8 <t> x y) 17084 // cond: 17085 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16]))))) 17086 for { 17087 t := v.Type 17088 _ = v.Args[1] 17089 x := v.Args[0] 17090 y := v.Args[1] 17091 v.reset(Op386SARW) 17092 v.Type = t 17093 v.AddArg(x) 17094 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17095 v0.AddArg(y) 17096 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17097 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17098 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17099 v3.AuxInt = 16 17100 v3.AddArg(y) 17101 v2.AddArg(v3) 17102 v1.AddArg(v2) 17103 v0.AddArg(v1) 17104 v.AddArg(v0) 17105 return true 17106 } 17107 } 17108 func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { 17109 b := v.Block 17110 _ = b 17111 // match: (Rsh32Ux16 <t> x y) 17112 // cond: 17113 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 17114 for { 17115 t := v.Type 17116 _ = v.Args[1] 17117 x := v.Args[0] 17118 y := v.Args[1] 17119 v.reset(Op386ANDL) 17120 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 17121 v0.AddArg(x) 17122 v0.AddArg(y) 17123 v.AddArg(v0) 17124 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17125 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17126 v2.AuxInt = 32 17127 v2.AddArg(y) 17128 v1.AddArg(v2) 17129 v.AddArg(v1) 17130 return true 17131 } 17132 } 17133 func rewriteValue386_OpRsh32Ux32_0(v *Value) bool { 17134 b := v.Block 17135 _ = b 17136 // match: (Rsh32Ux32 <t> x y) 17137 // cond: 17138 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 17139 for { 17140 t := v.Type 17141 _ = v.Args[1] 17142 x := v.Args[0] 17143 y := v.Args[1] 17144 v.reset(Op386ANDL) 17145 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 17146 v0.AddArg(x) 17147 v0.AddArg(y) 17148 v.AddArg(v0) 17149 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17150 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17151 v2.AuxInt = 32 17152 v2.AddArg(y) 17153 v1.AddArg(v2) 17154 v.AddArg(v1) 17155 return true 17156 } 17157 } 17158 func rewriteValue386_OpRsh32Ux64_0(v *Value) bool { 17159 // match: (Rsh32Ux64 x (Const64 [c])) 17160 // cond: uint64(c) < 32 17161 // result: (SHRLconst x [c]) 17162 for { 17163 _ = v.Args[1] 17164 x := v.Args[0] 17165 v_1 := v.Args[1] 17166 if v_1.Op != OpConst64 { 17167 break 17168 } 17169 c := v_1.AuxInt 17170 if !(uint64(c) < 32) { 17171 break 17172 } 17173 v.reset(Op386SHRLconst) 17174 v.AuxInt = c 17175 v.AddArg(x) 17176 return true 17177 } 17178 // match: (Rsh32Ux64 _ (Const64 [c])) 17179 // cond: uint64(c) >= 32 17180 // result: (Const32 [0]) 17181 for { 17182 _ = v.Args[1] 17183 v_1 := v.Args[1] 17184 if v_1.Op != OpConst64 { 17185 break 17186 } 17187 c := v_1.AuxInt 17188 if !(uint64(c) >= 32) { 17189 break 17190 } 17191 v.reset(OpConst32) 17192 v.AuxInt = 0 17193 return true 17194 } 17195 return false 17196 } 17197 func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { 17198 b := v.Block 17199 _ = b 17200 // match: (Rsh32Ux8 <t> x y) 17201 // cond: 17202 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 17203 for { 17204 t := v.Type 17205 _ = v.Args[1] 17206 x := v.Args[0] 17207 y := v.Args[1] 17208 v.reset(Op386ANDL) 17209 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 17210 v0.AddArg(x) 17211 v0.AddArg(y) 17212 v.AddArg(v0) 17213 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17214 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17215 v2.AuxInt = 32 17216 v2.AddArg(y) 17217 v1.AddArg(v2) 17218 v.AddArg(v1) 17219 return true 17220 } 17221 } 17222 func rewriteValue386_OpRsh32x16_0(v *Value) bool { 17223 b := v.Block 17224 _ = b 17225 // match: (Rsh32x16 <t> x y) 17226 // cond: 17227 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32]))))) 17228 for { 17229 t := v.Type 17230 _ = v.Args[1] 17231 x := v.Args[0] 17232 y := v.Args[1] 17233 v.reset(Op386SARL) 17234 v.Type = t 17235 v.AddArg(x) 17236 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17237 v0.AddArg(y) 17238 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17239 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17240 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17241 v3.AuxInt = 32 17242 v3.AddArg(y) 17243 v2.AddArg(v3) 17244 v1.AddArg(v2) 17245 v0.AddArg(v1) 17246 v.AddArg(v0) 17247 return true 17248 } 17249 } 17250 func rewriteValue386_OpRsh32x32_0(v *Value) bool { 17251 b := v.Block 17252 _ = b 17253 // match: (Rsh32x32 <t> x y) 17254 // cond: 17255 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32]))))) 17256 for { 17257 t := v.Type 17258 _ = v.Args[1] 17259 x := v.Args[0] 17260 y := v.Args[1] 17261 v.reset(Op386SARL) 17262 v.Type = t 17263 v.AddArg(x) 17264 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17265 v0.AddArg(y) 17266 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17267 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17268 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17269 v3.AuxInt = 32 17270 v3.AddArg(y) 17271 v2.AddArg(v3) 17272 v1.AddArg(v2) 17273 v0.AddArg(v1) 17274 v.AddArg(v0) 17275 return true 17276 } 17277 } 17278 func rewriteValue386_OpRsh32x64_0(v *Value) bool { 17279 // match: (Rsh32x64 x (Const64 [c])) 17280 // cond: uint64(c) < 32 17281 // result: (SARLconst x [c]) 17282 for { 17283 _ = v.Args[1] 17284 x := v.Args[0] 17285 v_1 := v.Args[1] 17286 if v_1.Op != OpConst64 { 17287 break 17288 } 17289 c := v_1.AuxInt 17290 if !(uint64(c) < 32) { 17291 break 17292 } 17293 v.reset(Op386SARLconst) 17294 v.AuxInt = c 17295 v.AddArg(x) 17296 return true 17297 } 17298 // match: (Rsh32x64 x (Const64 [c])) 17299 // cond: uint64(c) >= 32 17300 // result: (SARLconst x [31]) 17301 for { 17302 _ = v.Args[1] 17303 x := v.Args[0] 17304 v_1 := v.Args[1] 17305 if v_1.Op != OpConst64 { 17306 break 17307 } 17308 c := v_1.AuxInt 17309 if !(uint64(c) >= 32) { 17310 break 17311 } 17312 v.reset(Op386SARLconst) 17313 v.AuxInt = 31 17314 v.AddArg(x) 17315 return true 17316 } 17317 return false 17318 } 17319 func rewriteValue386_OpRsh32x8_0(v *Value) bool { 17320 b := v.Block 17321 _ = b 17322 // match: (Rsh32x8 <t> x y) 17323 // cond: 17324 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32]))))) 17325 for { 17326 t := v.Type 17327 _ = v.Args[1] 17328 x := v.Args[0] 17329 y := v.Args[1] 17330 v.reset(Op386SARL) 17331 v.Type = t 17332 v.AddArg(x) 17333 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17334 v0.AddArg(y) 17335 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17336 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17337 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17338 v3.AuxInt = 32 17339 v3.AddArg(y) 17340 v2.AddArg(v3) 17341 v1.AddArg(v2) 17342 v0.AddArg(v1) 17343 v.AddArg(v0) 17344 return true 17345 } 17346 } 17347 func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { 17348 b := v.Block 17349 _ = b 17350 // match: (Rsh8Ux16 <t> x y) 17351 // cond: 17352 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8]))) 17353 for { 17354 t := v.Type 17355 _ = v.Args[1] 17356 x := v.Args[0] 17357 y := v.Args[1] 17358 v.reset(Op386ANDL) 17359 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 17360 v0.AddArg(x) 17361 v0.AddArg(y) 17362 v.AddArg(v0) 17363 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17364 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17365 v2.AuxInt = 8 17366 v2.AddArg(y) 17367 v1.AddArg(v2) 17368 v.AddArg(v1) 17369 return true 17370 } 17371 } 17372 func rewriteValue386_OpRsh8Ux32_0(v *Value) bool { 17373 b := v.Block 17374 _ = b 17375 // match: (Rsh8Ux32 <t> x y) 17376 // cond: 17377 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8]))) 17378 for { 17379 t := v.Type 17380 _ = v.Args[1] 17381 x := v.Args[0] 17382 y := v.Args[1] 17383 v.reset(Op386ANDL) 17384 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 17385 v0.AddArg(x) 17386 v0.AddArg(y) 17387 v.AddArg(v0) 17388 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17389 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17390 v2.AuxInt = 8 17391 v2.AddArg(y) 17392 v1.AddArg(v2) 17393 v.AddArg(v1) 17394 return true 17395 } 17396 } 17397 func rewriteValue386_OpRsh8Ux64_0(v *Value) bool { 17398 // match: (Rsh8Ux64 x (Const64 [c])) 17399 // cond: uint64(c) < 8 17400 // result: (SHRBconst x [c]) 17401 for { 17402 _ = v.Args[1] 17403 x := v.Args[0] 17404 v_1 := v.Args[1] 17405 if v_1.Op != OpConst64 { 17406 break 17407 } 17408 c := v_1.AuxInt 17409 if !(uint64(c) < 8) { 17410 break 17411 } 17412 v.reset(Op386SHRBconst) 17413 v.AuxInt = c 17414 v.AddArg(x) 17415 return true 17416 } 17417 // match: (Rsh8Ux64 _ (Const64 [c])) 17418 // cond: uint64(c) >= 8 17419 // result: (Const8 [0]) 17420 for { 17421 _ = v.Args[1] 17422 v_1 := v.Args[1] 17423 if v_1.Op != OpConst64 { 17424 break 17425 } 17426 c := v_1.AuxInt 17427 if !(uint64(c) >= 8) { 17428 break 17429 } 17430 v.reset(OpConst8) 17431 v.AuxInt = 0 17432 return true 17433 } 17434 return false 17435 } 17436 func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { 17437 b := v.Block 17438 _ = b 17439 // match: (Rsh8Ux8 <t> x y) 17440 // cond: 17441 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8]))) 17442 for { 17443 t := v.Type 17444 _ = v.Args[1] 17445 x := v.Args[0] 17446 y := v.Args[1] 17447 v.reset(Op386ANDL) 17448 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 17449 v0.AddArg(x) 17450 v0.AddArg(y) 17451 v.AddArg(v0) 17452 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17453 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17454 v2.AuxInt = 8 17455 v2.AddArg(y) 17456 v1.AddArg(v2) 17457 v.AddArg(v1) 17458 return true 17459 } 17460 } 17461 func rewriteValue386_OpRsh8x16_0(v *Value) bool { 17462 b := v.Block 17463 _ = b 17464 // match: (Rsh8x16 <t> x y) 17465 // cond: 17466 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8]))))) 17467 for { 17468 t := v.Type 17469 _ = v.Args[1] 17470 x := v.Args[0] 17471 y := v.Args[1] 17472 v.reset(Op386SARB) 17473 v.Type = t 17474 v.AddArg(x) 17475 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17476 v0.AddArg(y) 17477 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17478 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17479 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17480 v3.AuxInt = 8 17481 v3.AddArg(y) 17482 v2.AddArg(v3) 17483 v1.AddArg(v2) 17484 v0.AddArg(v1) 17485 v.AddArg(v0) 17486 return true 17487 } 17488 } 17489 func rewriteValue386_OpRsh8x32_0(v *Value) bool { 17490 b := v.Block 17491 _ = b 17492 // match: (Rsh8x32 <t> x y) 17493 // cond: 17494 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8]))))) 17495 for { 17496 t := v.Type 17497 _ = v.Args[1] 17498 x := v.Args[0] 17499 y := v.Args[1] 17500 v.reset(Op386SARB) 17501 v.Type = t 17502 v.AddArg(x) 17503 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17504 v0.AddArg(y) 17505 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17506 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17507 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17508 v3.AuxInt = 8 17509 v3.AddArg(y) 17510 v2.AddArg(v3) 17511 v1.AddArg(v2) 17512 v0.AddArg(v1) 17513 v.AddArg(v0) 17514 return true 17515 } 17516 } 17517 func rewriteValue386_OpRsh8x64_0(v *Value) bool { 17518 // match: (Rsh8x64 x (Const64 [c])) 17519 // cond: uint64(c) < 8 17520 // result: (SARBconst x [c]) 17521 for { 17522 _ = v.Args[1] 17523 x := v.Args[0] 17524 v_1 := v.Args[1] 17525 if v_1.Op != OpConst64 { 17526 break 17527 } 17528 c := v_1.AuxInt 17529 if !(uint64(c) < 8) { 17530 break 17531 } 17532 v.reset(Op386SARBconst) 17533 v.AuxInt = c 17534 v.AddArg(x) 17535 return true 17536 } 17537 // match: (Rsh8x64 x (Const64 [c])) 17538 // cond: uint64(c) >= 8 17539 // result: (SARBconst x [7]) 17540 for { 17541 _ = v.Args[1] 17542 x := v.Args[0] 17543 v_1 := v.Args[1] 17544 if v_1.Op != OpConst64 { 17545 break 17546 } 17547 c := v_1.AuxInt 17548 if !(uint64(c) >= 8) { 17549 break 17550 } 17551 v.reset(Op386SARBconst) 17552 v.AuxInt = 7 17553 v.AddArg(x) 17554 return true 17555 } 17556 return false 17557 } 17558 func rewriteValue386_OpRsh8x8_0(v *Value) bool { 17559 b := v.Block 17560 _ = b 17561 // match: (Rsh8x8 <t> x y) 17562 // cond: 17563 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8]))))) 17564 for { 17565 t := v.Type 17566 _ = v.Args[1] 17567 x := v.Args[0] 17568 y := v.Args[1] 17569 v.reset(Op386SARB) 17570 v.Type = t 17571 v.AddArg(x) 17572 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17573 v0.AddArg(y) 17574 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17575 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17576 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17577 v3.AuxInt = 8 17578 v3.AddArg(y) 17579 v2.AddArg(v3) 17580 v1.AddArg(v2) 17581 v0.AddArg(v1) 17582 v.AddArg(v0) 17583 return true 17584 } 17585 } 17586 func rewriteValue386_OpSignExt16to32_0(v *Value) bool { 17587 // match: (SignExt16to32 x) 17588 // cond: 17589 // result: (MOVWLSX x) 17590 for { 17591 x := v.Args[0] 17592 v.reset(Op386MOVWLSX) 17593 v.AddArg(x) 17594 return true 17595 } 17596 } 17597 func rewriteValue386_OpSignExt8to16_0(v *Value) bool { 17598 // match: (SignExt8to16 x) 17599 // cond: 17600 // result: (MOVBLSX x) 17601 for { 17602 x := v.Args[0] 17603 v.reset(Op386MOVBLSX) 17604 v.AddArg(x) 17605 return true 17606 } 17607 } 17608 func rewriteValue386_OpSignExt8to32_0(v *Value) bool { 17609 // match: (SignExt8to32 x) 17610 // cond: 17611 // result: (MOVBLSX x) 17612 for { 17613 x := v.Args[0] 17614 v.reset(Op386MOVBLSX) 17615 v.AddArg(x) 17616 return true 17617 } 17618 } 17619 func rewriteValue386_OpSignmask_0(v *Value) bool { 17620 // match: (Signmask x) 17621 // cond: 17622 // result: (SARLconst x [31]) 17623 for { 17624 x := v.Args[0] 17625 v.reset(Op386SARLconst) 17626 v.AuxInt = 31 17627 v.AddArg(x) 17628 return true 17629 } 17630 } 17631 func rewriteValue386_OpSlicemask_0(v *Value) bool { 17632 b := v.Block 17633 _ = b 17634 // match: (Slicemask <t> x) 17635 // cond: 17636 // result: (SARLconst (NEGL <t> x) [31]) 17637 for { 17638 t := v.Type 17639 x := v.Args[0] 17640 v.reset(Op386SARLconst) 17641 v.AuxInt = 31 17642 v0 := b.NewValue0(v.Pos, Op386NEGL, t) 17643 v0.AddArg(x) 17644 v.AddArg(v0) 17645 return true 17646 } 17647 } 17648 func rewriteValue386_OpSqrt_0(v *Value) bool { 17649 // match: (Sqrt x) 17650 // cond: 17651 // result: (SQRTSD x) 17652 for { 17653 x := v.Args[0] 17654 v.reset(Op386SQRTSD) 17655 v.AddArg(x) 17656 return true 17657 } 17658 } 17659 func rewriteValue386_OpStaticCall_0(v *Value) bool { 17660 // match: (StaticCall [argwid] {target} mem) 17661 // cond: 17662 // result: (CALLstatic [argwid] {target} mem) 17663 for { 17664 argwid := v.AuxInt 17665 target := v.Aux 17666 mem := v.Args[0] 17667 v.reset(Op386CALLstatic) 17668 v.AuxInt = argwid 17669 v.Aux = target 17670 v.AddArg(mem) 17671 return true 17672 } 17673 } 17674 func rewriteValue386_OpStore_0(v *Value) bool { 17675 // match: (Store {t} ptr val mem) 17676 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 17677 // result: (MOVSDstore ptr val mem) 17678 for { 17679 t := v.Aux 17680 _ = v.Args[2] 17681 ptr := v.Args[0] 17682 val := v.Args[1] 17683 mem := v.Args[2] 17684 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 17685 break 17686 } 17687 v.reset(Op386MOVSDstore) 17688 v.AddArg(ptr) 17689 v.AddArg(val) 17690 v.AddArg(mem) 17691 return true 17692 } 17693 // match: (Store {t} ptr val mem) 17694 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 17695 // result: (MOVSSstore ptr val mem) 17696 for { 17697 t := v.Aux 17698 _ = v.Args[2] 17699 ptr := v.Args[0] 17700 val := v.Args[1] 17701 mem := v.Args[2] 17702 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 17703 break 17704 } 17705 v.reset(Op386MOVSSstore) 17706 v.AddArg(ptr) 17707 v.AddArg(val) 17708 v.AddArg(mem) 17709 return true 17710 } 17711 // match: (Store {t} ptr val mem) 17712 // cond: t.(*types.Type).Size() == 4 17713 // result: (MOVLstore ptr val mem) 17714 for { 17715 t := v.Aux 17716 _ = v.Args[2] 17717 ptr := v.Args[0] 17718 val := v.Args[1] 17719 mem := v.Args[2] 17720 if !(t.(*types.Type).Size() == 4) { 17721 break 17722 } 17723 v.reset(Op386MOVLstore) 17724 v.AddArg(ptr) 17725 v.AddArg(val) 17726 v.AddArg(mem) 17727 return true 17728 } 17729 // match: (Store {t} ptr val mem) 17730 // cond: t.(*types.Type).Size() == 2 17731 // result: (MOVWstore ptr val mem) 17732 for { 17733 t := v.Aux 17734 _ = v.Args[2] 17735 ptr := v.Args[0] 17736 val := v.Args[1] 17737 mem := v.Args[2] 17738 if !(t.(*types.Type).Size() == 2) { 17739 break 17740 } 17741 v.reset(Op386MOVWstore) 17742 v.AddArg(ptr) 17743 v.AddArg(val) 17744 v.AddArg(mem) 17745 return true 17746 } 17747 // match: (Store {t} ptr val mem) 17748 // cond: t.(*types.Type).Size() == 1 17749 // result: (MOVBstore ptr val mem) 17750 for { 17751 t := v.Aux 17752 _ = v.Args[2] 17753 ptr := v.Args[0] 17754 val := v.Args[1] 17755 mem := v.Args[2] 17756 if !(t.(*types.Type).Size() == 1) { 17757 break 17758 } 17759 v.reset(Op386MOVBstore) 17760 v.AddArg(ptr) 17761 v.AddArg(val) 17762 v.AddArg(mem) 17763 return true 17764 } 17765 return false 17766 } 17767 func rewriteValue386_OpSub16_0(v *Value) bool { 17768 // match: (Sub16 x y) 17769 // cond: 17770 // result: (SUBL x y) 17771 for { 17772 _ = v.Args[1] 17773 x := v.Args[0] 17774 y := v.Args[1] 17775 v.reset(Op386SUBL) 17776 v.AddArg(x) 17777 v.AddArg(y) 17778 return true 17779 } 17780 } 17781 func rewriteValue386_OpSub32_0(v *Value) bool { 17782 // match: (Sub32 x y) 17783 // cond: 17784 // result: (SUBL x y) 17785 for { 17786 _ = v.Args[1] 17787 x := v.Args[0] 17788 y := v.Args[1] 17789 v.reset(Op386SUBL) 17790 v.AddArg(x) 17791 v.AddArg(y) 17792 return true 17793 } 17794 } 17795 func rewriteValue386_OpSub32F_0(v *Value) bool { 17796 // match: (Sub32F x y) 17797 // cond: 17798 // result: (SUBSS x y) 17799 for { 17800 _ = v.Args[1] 17801 x := v.Args[0] 17802 y := v.Args[1] 17803 v.reset(Op386SUBSS) 17804 v.AddArg(x) 17805 v.AddArg(y) 17806 return true 17807 } 17808 } 17809 func rewriteValue386_OpSub32carry_0(v *Value) bool { 17810 // match: (Sub32carry x y) 17811 // cond: 17812 // result: (SUBLcarry x y) 17813 for { 17814 _ = v.Args[1] 17815 x := v.Args[0] 17816 y := v.Args[1] 17817 v.reset(Op386SUBLcarry) 17818 v.AddArg(x) 17819 v.AddArg(y) 17820 return true 17821 } 17822 } 17823 func rewriteValue386_OpSub32withcarry_0(v *Value) bool { 17824 // match: (Sub32withcarry x y c) 17825 // cond: 17826 // result: (SBBL x y c) 17827 for { 17828 _ = v.Args[2] 17829 x := v.Args[0] 17830 y := v.Args[1] 17831 c := v.Args[2] 17832 v.reset(Op386SBBL) 17833 v.AddArg(x) 17834 v.AddArg(y) 17835 v.AddArg(c) 17836 return true 17837 } 17838 } 17839 func rewriteValue386_OpSub64F_0(v *Value) bool { 17840 // match: (Sub64F x y) 17841 // cond: 17842 // result: (SUBSD x y) 17843 for { 17844 _ = v.Args[1] 17845 x := v.Args[0] 17846 y := v.Args[1] 17847 v.reset(Op386SUBSD) 17848 v.AddArg(x) 17849 v.AddArg(y) 17850 return true 17851 } 17852 } 17853 func rewriteValue386_OpSub8_0(v *Value) bool { 17854 // match: (Sub8 x y) 17855 // cond: 17856 // result: (SUBL x y) 17857 for { 17858 _ = v.Args[1] 17859 x := v.Args[0] 17860 y := v.Args[1] 17861 v.reset(Op386SUBL) 17862 v.AddArg(x) 17863 v.AddArg(y) 17864 return true 17865 } 17866 } 17867 func rewriteValue386_OpSubPtr_0(v *Value) bool { 17868 // match: (SubPtr x y) 17869 // cond: 17870 // result: (SUBL x y) 17871 for { 17872 _ = v.Args[1] 17873 x := v.Args[0] 17874 y := v.Args[1] 17875 v.reset(Op386SUBL) 17876 v.AddArg(x) 17877 v.AddArg(y) 17878 return true 17879 } 17880 } 17881 func rewriteValue386_OpTrunc16to8_0(v *Value) bool { 17882 // match: (Trunc16to8 x) 17883 // cond: 17884 // result: x 17885 for { 17886 x := v.Args[0] 17887 v.reset(OpCopy) 17888 v.Type = x.Type 17889 v.AddArg(x) 17890 return true 17891 } 17892 } 17893 func rewriteValue386_OpTrunc32to16_0(v *Value) bool { 17894 // match: (Trunc32to16 x) 17895 // cond: 17896 // result: x 17897 for { 17898 x := v.Args[0] 17899 v.reset(OpCopy) 17900 v.Type = x.Type 17901 v.AddArg(x) 17902 return true 17903 } 17904 } 17905 func rewriteValue386_OpTrunc32to8_0(v *Value) bool { 17906 // match: (Trunc32to8 x) 17907 // cond: 17908 // result: x 17909 for { 17910 x := v.Args[0] 17911 v.reset(OpCopy) 17912 v.Type = x.Type 17913 v.AddArg(x) 17914 return true 17915 } 17916 } 17917 func rewriteValue386_OpXor16_0(v *Value) bool { 17918 // match: (Xor16 x y) 17919 // cond: 17920 // result: (XORL x y) 17921 for { 17922 _ = v.Args[1] 17923 x := v.Args[0] 17924 y := v.Args[1] 17925 v.reset(Op386XORL) 17926 v.AddArg(x) 17927 v.AddArg(y) 17928 return true 17929 } 17930 } 17931 func rewriteValue386_OpXor32_0(v *Value) bool { 17932 // match: (Xor32 x y) 17933 // cond: 17934 // result: (XORL x y) 17935 for { 17936 _ = v.Args[1] 17937 x := v.Args[0] 17938 y := v.Args[1] 17939 v.reset(Op386XORL) 17940 v.AddArg(x) 17941 v.AddArg(y) 17942 return true 17943 } 17944 } 17945 func rewriteValue386_OpXor8_0(v *Value) bool { 17946 // match: (Xor8 x y) 17947 // cond: 17948 // result: (XORL x y) 17949 for { 17950 _ = v.Args[1] 17951 x := v.Args[0] 17952 y := v.Args[1] 17953 v.reset(Op386XORL) 17954 v.AddArg(x) 17955 v.AddArg(y) 17956 return true 17957 } 17958 } 17959 func rewriteValue386_OpZero_0(v *Value) bool { 17960 b := v.Block 17961 _ = b 17962 typ := &b.Func.Config.Types 17963 _ = typ 17964 // match: (Zero [0] _ mem) 17965 // cond: 17966 // result: mem 17967 for { 17968 if v.AuxInt != 0 { 17969 break 17970 } 17971 _ = v.Args[1] 17972 mem := v.Args[1] 17973 v.reset(OpCopy) 17974 v.Type = mem.Type 17975 v.AddArg(mem) 17976 return true 17977 } 17978 // match: (Zero [1] destptr mem) 17979 // cond: 17980 // result: (MOVBstoreconst [0] destptr mem) 17981 for { 17982 if v.AuxInt != 1 { 17983 break 17984 } 17985 _ = v.Args[1] 17986 destptr := v.Args[0] 17987 mem := v.Args[1] 17988 v.reset(Op386MOVBstoreconst) 17989 v.AuxInt = 0 17990 v.AddArg(destptr) 17991 v.AddArg(mem) 17992 return true 17993 } 17994 // match: (Zero [2] destptr mem) 17995 // cond: 17996 // result: (MOVWstoreconst [0] destptr mem) 17997 for { 17998 if v.AuxInt != 2 { 17999 break 18000 } 18001 _ = v.Args[1] 18002 destptr := v.Args[0] 18003 mem := v.Args[1] 18004 v.reset(Op386MOVWstoreconst) 18005 v.AuxInt = 0 18006 v.AddArg(destptr) 18007 v.AddArg(mem) 18008 return true 18009 } 18010 // match: (Zero [4] destptr mem) 18011 // cond: 18012 // result: (MOVLstoreconst [0] destptr mem) 18013 for { 18014 if v.AuxInt != 4 { 18015 break 18016 } 18017 _ = v.Args[1] 18018 destptr := v.Args[0] 18019 mem := v.Args[1] 18020 v.reset(Op386MOVLstoreconst) 18021 v.AuxInt = 0 18022 v.AddArg(destptr) 18023 v.AddArg(mem) 18024 return true 18025 } 18026 // match: (Zero [3] destptr mem) 18027 // cond: 18028 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVWstoreconst [0] destptr mem)) 18029 for { 18030 if v.AuxInt != 3 { 18031 break 18032 } 18033 _ = v.Args[1] 18034 destptr := v.Args[0] 18035 mem := v.Args[1] 18036 v.reset(Op386MOVBstoreconst) 18037 v.AuxInt = makeValAndOff(0, 2) 18038 v.AddArg(destptr) 18039 v0 := b.NewValue0(v.Pos, Op386MOVWstoreconst, types.TypeMem) 18040 v0.AuxInt = 0 18041 v0.AddArg(destptr) 18042 v0.AddArg(mem) 18043 v.AddArg(v0) 18044 return true 18045 } 18046 // match: (Zero [5] destptr mem) 18047 // cond: 18048 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 18049 for { 18050 if v.AuxInt != 5 { 18051 break 18052 } 18053 _ = v.Args[1] 18054 destptr := v.Args[0] 18055 mem := v.Args[1] 18056 v.reset(Op386MOVBstoreconst) 18057 v.AuxInt = makeValAndOff(0, 4) 18058 v.AddArg(destptr) 18059 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18060 v0.AuxInt = 0 18061 v0.AddArg(destptr) 18062 v0.AddArg(mem) 18063 v.AddArg(v0) 18064 return true 18065 } 18066 // match: (Zero [6] destptr mem) 18067 // cond: 18068 // result: (MOVWstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 18069 for { 18070 if v.AuxInt != 6 { 18071 break 18072 } 18073 _ = v.Args[1] 18074 destptr := v.Args[0] 18075 mem := v.Args[1] 18076 v.reset(Op386MOVWstoreconst) 18077 v.AuxInt = makeValAndOff(0, 4) 18078 v.AddArg(destptr) 18079 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18080 v0.AuxInt = 0 18081 v0.AddArg(destptr) 18082 v0.AddArg(mem) 18083 v.AddArg(v0) 18084 return true 18085 } 18086 // match: (Zero [7] destptr mem) 18087 // cond: 18088 // result: (MOVLstoreconst [makeValAndOff(0,3)] destptr (MOVLstoreconst [0] destptr mem)) 18089 for { 18090 if v.AuxInt != 7 { 18091 break 18092 } 18093 _ = v.Args[1] 18094 destptr := v.Args[0] 18095 mem := v.Args[1] 18096 v.reset(Op386MOVLstoreconst) 18097 v.AuxInt = makeValAndOff(0, 3) 18098 v.AddArg(destptr) 18099 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18100 v0.AuxInt = 0 18101 v0.AddArg(destptr) 18102 v0.AddArg(mem) 18103 v.AddArg(v0) 18104 return true 18105 } 18106 // match: (Zero [s] destptr mem) 18107 // cond: s%4 != 0 && s > 4 18108 // result: (Zero [s-s%4] (ADDLconst destptr [s%4]) (MOVLstoreconst [0] destptr mem)) 18109 for { 18110 s := v.AuxInt 18111 _ = v.Args[1] 18112 destptr := v.Args[0] 18113 mem := v.Args[1] 18114 if !(s%4 != 0 && s > 4) { 18115 break 18116 } 18117 v.reset(OpZero) 18118 v.AuxInt = s - s%4 18119 v0 := b.NewValue0(v.Pos, Op386ADDLconst, typ.UInt32) 18120 v0.AuxInt = s % 4 18121 v0.AddArg(destptr) 18122 v.AddArg(v0) 18123 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18124 v1.AuxInt = 0 18125 v1.AddArg(destptr) 18126 v1.AddArg(mem) 18127 v.AddArg(v1) 18128 return true 18129 } 18130 // match: (Zero [8] destptr mem) 18131 // cond: 18132 // result: (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 18133 for { 18134 if v.AuxInt != 8 { 18135 break 18136 } 18137 _ = v.Args[1] 18138 destptr := v.Args[0] 18139 mem := v.Args[1] 18140 v.reset(Op386MOVLstoreconst) 18141 v.AuxInt = makeValAndOff(0, 4) 18142 v.AddArg(destptr) 18143 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18144 v0.AuxInt = 0 18145 v0.AddArg(destptr) 18146 v0.AddArg(mem) 18147 v.AddArg(v0) 18148 return true 18149 } 18150 return false 18151 } 18152 func rewriteValue386_OpZero_10(v *Value) bool { 18153 b := v.Block 18154 _ = b 18155 config := b.Func.Config 18156 _ = config 18157 typ := &b.Func.Config.Types 18158 _ = typ 18159 // match: (Zero [12] destptr mem) 18160 // cond: 18161 // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) 18162 for { 18163 if v.AuxInt != 12 { 18164 break 18165 } 18166 _ = v.Args[1] 18167 destptr := v.Args[0] 18168 mem := v.Args[1] 18169 v.reset(Op386MOVLstoreconst) 18170 v.AuxInt = makeValAndOff(0, 8) 18171 v.AddArg(destptr) 18172 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18173 v0.AuxInt = makeValAndOff(0, 4) 18174 v0.AddArg(destptr) 18175 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18176 v1.AuxInt = 0 18177 v1.AddArg(destptr) 18178 v1.AddArg(mem) 18179 v0.AddArg(v1) 18180 v.AddArg(v0) 18181 return true 18182 } 18183 // match: (Zero [16] destptr mem) 18184 // cond: 18185 // result: (MOVLstoreconst [makeValAndOff(0,12)] destptr (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)))) 18186 for { 18187 if v.AuxInt != 16 { 18188 break 18189 } 18190 _ = v.Args[1] 18191 destptr := v.Args[0] 18192 mem := v.Args[1] 18193 v.reset(Op386MOVLstoreconst) 18194 v.AuxInt = makeValAndOff(0, 12) 18195 v.AddArg(destptr) 18196 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18197 v0.AuxInt = makeValAndOff(0, 8) 18198 v0.AddArg(destptr) 18199 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18200 v1.AuxInt = makeValAndOff(0, 4) 18201 v1.AddArg(destptr) 18202 v2 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18203 v2.AuxInt = 0 18204 v2.AddArg(destptr) 18205 v2.AddArg(mem) 18206 v1.AddArg(v2) 18207 v0.AddArg(v1) 18208 v.AddArg(v0) 18209 return true 18210 } 18211 // match: (Zero [s] destptr mem) 18212 // cond: s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 18213 // result: (DUFFZERO [1*(128-s/4)] destptr (MOVLconst [0]) mem) 18214 for { 18215 s := v.AuxInt 18216 _ = v.Args[1] 18217 destptr := v.Args[0] 18218 mem := v.Args[1] 18219 if !(s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 18220 break 18221 } 18222 v.reset(Op386DUFFZERO) 18223 v.AuxInt = 1 * (128 - s/4) 18224 v.AddArg(destptr) 18225 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 18226 v0.AuxInt = 0 18227 v.AddArg(v0) 18228 v.AddArg(mem) 18229 return true 18230 } 18231 // match: (Zero [s] destptr mem) 18232 // cond: (s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0 18233 // result: (REPSTOSL destptr (MOVLconst [s/4]) (MOVLconst [0]) mem) 18234 for { 18235 s := v.AuxInt 18236 _ = v.Args[1] 18237 destptr := v.Args[0] 18238 mem := v.Args[1] 18239 if !((s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0) { 18240 break 18241 } 18242 v.reset(Op386REPSTOSL) 18243 v.AddArg(destptr) 18244 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 18245 v0.AuxInt = s / 4 18246 v.AddArg(v0) 18247 v1 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 18248 v1.AuxInt = 0 18249 v.AddArg(v1) 18250 v.AddArg(mem) 18251 return true 18252 } 18253 return false 18254 } 18255 func rewriteValue386_OpZeroExt16to32_0(v *Value) bool { 18256 // match: (ZeroExt16to32 x) 18257 // cond: 18258 // result: (MOVWLZX x) 18259 for { 18260 x := v.Args[0] 18261 v.reset(Op386MOVWLZX) 18262 v.AddArg(x) 18263 return true 18264 } 18265 } 18266 func rewriteValue386_OpZeroExt8to16_0(v *Value) bool { 18267 // match: (ZeroExt8to16 x) 18268 // cond: 18269 // result: (MOVBLZX x) 18270 for { 18271 x := v.Args[0] 18272 v.reset(Op386MOVBLZX) 18273 v.AddArg(x) 18274 return true 18275 } 18276 } 18277 func rewriteValue386_OpZeroExt8to32_0(v *Value) bool { 18278 // match: (ZeroExt8to32 x) 18279 // cond: 18280 // result: (MOVBLZX x) 18281 for { 18282 x := v.Args[0] 18283 v.reset(Op386MOVBLZX) 18284 v.AddArg(x) 18285 return true 18286 } 18287 } 18288 func rewriteValue386_OpZeromask_0(v *Value) bool { 18289 b := v.Block 18290 _ = b 18291 // match: (Zeromask <t> x) 18292 // cond: 18293 // result: (XORLconst [-1] (SBBLcarrymask <t> (CMPLconst x [1]))) 18294 for { 18295 t := v.Type 18296 x := v.Args[0] 18297 v.reset(Op386XORLconst) 18298 v.AuxInt = -1 18299 v0 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 18300 v1 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 18301 v1.AuxInt = 1 18302 v1.AddArg(x) 18303 v0.AddArg(v1) 18304 v.AddArg(v0) 18305 return true 18306 } 18307 } 18308 func rewriteBlock386(b *Block) bool { 18309 config := b.Func.Config 18310 _ = config 18311 fe := b.Func.fe 18312 _ = fe 18313 typ := &config.Types 18314 _ = typ 18315 switch b.Kind { 18316 case Block386EQ: 18317 // match: (EQ (InvertFlags cmp) yes no) 18318 // cond: 18319 // result: (EQ cmp yes no) 18320 for { 18321 v := b.Control 18322 if v.Op != Op386InvertFlags { 18323 break 18324 } 18325 cmp := v.Args[0] 18326 b.Kind = Block386EQ 18327 b.SetControl(cmp) 18328 return true 18329 } 18330 // match: (EQ (FlagEQ) yes no) 18331 // cond: 18332 // result: (First nil yes no) 18333 for { 18334 v := b.Control 18335 if v.Op != Op386FlagEQ { 18336 break 18337 } 18338 b.Kind = BlockFirst 18339 b.SetControl(nil) 18340 return true 18341 } 18342 // match: (EQ (FlagLT_ULT) yes no) 18343 // cond: 18344 // result: (First nil no yes) 18345 for { 18346 v := b.Control 18347 if v.Op != Op386FlagLT_ULT { 18348 break 18349 } 18350 b.Kind = BlockFirst 18351 b.SetControl(nil) 18352 b.swapSuccessors() 18353 return true 18354 } 18355 // match: (EQ (FlagLT_UGT) yes no) 18356 // cond: 18357 // result: (First nil no yes) 18358 for { 18359 v := b.Control 18360 if v.Op != Op386FlagLT_UGT { 18361 break 18362 } 18363 b.Kind = BlockFirst 18364 b.SetControl(nil) 18365 b.swapSuccessors() 18366 return true 18367 } 18368 // match: (EQ (FlagGT_ULT) yes no) 18369 // cond: 18370 // result: (First nil no yes) 18371 for { 18372 v := b.Control 18373 if v.Op != Op386FlagGT_ULT { 18374 break 18375 } 18376 b.Kind = BlockFirst 18377 b.SetControl(nil) 18378 b.swapSuccessors() 18379 return true 18380 } 18381 // match: (EQ (FlagGT_UGT) yes no) 18382 // cond: 18383 // result: (First nil no yes) 18384 for { 18385 v := b.Control 18386 if v.Op != Op386FlagGT_UGT { 18387 break 18388 } 18389 b.Kind = BlockFirst 18390 b.SetControl(nil) 18391 b.swapSuccessors() 18392 return true 18393 } 18394 case Block386GE: 18395 // match: (GE (InvertFlags cmp) yes no) 18396 // cond: 18397 // result: (LE cmp yes no) 18398 for { 18399 v := b.Control 18400 if v.Op != Op386InvertFlags { 18401 break 18402 } 18403 cmp := v.Args[0] 18404 b.Kind = Block386LE 18405 b.SetControl(cmp) 18406 return true 18407 } 18408 // match: (GE (FlagEQ) yes no) 18409 // cond: 18410 // result: (First nil yes no) 18411 for { 18412 v := b.Control 18413 if v.Op != Op386FlagEQ { 18414 break 18415 } 18416 b.Kind = BlockFirst 18417 b.SetControl(nil) 18418 return true 18419 } 18420 // match: (GE (FlagLT_ULT) yes no) 18421 // cond: 18422 // result: (First nil no yes) 18423 for { 18424 v := b.Control 18425 if v.Op != Op386FlagLT_ULT { 18426 break 18427 } 18428 b.Kind = BlockFirst 18429 b.SetControl(nil) 18430 b.swapSuccessors() 18431 return true 18432 } 18433 // match: (GE (FlagLT_UGT) yes no) 18434 // cond: 18435 // result: (First nil no yes) 18436 for { 18437 v := b.Control 18438 if v.Op != Op386FlagLT_UGT { 18439 break 18440 } 18441 b.Kind = BlockFirst 18442 b.SetControl(nil) 18443 b.swapSuccessors() 18444 return true 18445 } 18446 // match: (GE (FlagGT_ULT) yes no) 18447 // cond: 18448 // result: (First nil yes no) 18449 for { 18450 v := b.Control 18451 if v.Op != Op386FlagGT_ULT { 18452 break 18453 } 18454 b.Kind = BlockFirst 18455 b.SetControl(nil) 18456 return true 18457 } 18458 // match: (GE (FlagGT_UGT) yes no) 18459 // cond: 18460 // result: (First nil yes no) 18461 for { 18462 v := b.Control 18463 if v.Op != Op386FlagGT_UGT { 18464 break 18465 } 18466 b.Kind = BlockFirst 18467 b.SetControl(nil) 18468 return true 18469 } 18470 case Block386GT: 18471 // match: (GT (InvertFlags cmp) yes no) 18472 // cond: 18473 // result: (LT cmp yes no) 18474 for { 18475 v := b.Control 18476 if v.Op != Op386InvertFlags { 18477 break 18478 } 18479 cmp := v.Args[0] 18480 b.Kind = Block386LT 18481 b.SetControl(cmp) 18482 return true 18483 } 18484 // match: (GT (FlagEQ) yes no) 18485 // cond: 18486 // result: (First nil no yes) 18487 for { 18488 v := b.Control 18489 if v.Op != Op386FlagEQ { 18490 break 18491 } 18492 b.Kind = BlockFirst 18493 b.SetControl(nil) 18494 b.swapSuccessors() 18495 return true 18496 } 18497 // match: (GT (FlagLT_ULT) yes no) 18498 // cond: 18499 // result: (First nil no yes) 18500 for { 18501 v := b.Control 18502 if v.Op != Op386FlagLT_ULT { 18503 break 18504 } 18505 b.Kind = BlockFirst 18506 b.SetControl(nil) 18507 b.swapSuccessors() 18508 return true 18509 } 18510 // match: (GT (FlagLT_UGT) yes no) 18511 // cond: 18512 // result: (First nil no yes) 18513 for { 18514 v := b.Control 18515 if v.Op != Op386FlagLT_UGT { 18516 break 18517 } 18518 b.Kind = BlockFirst 18519 b.SetControl(nil) 18520 b.swapSuccessors() 18521 return true 18522 } 18523 // match: (GT (FlagGT_ULT) yes no) 18524 // cond: 18525 // result: (First nil yes no) 18526 for { 18527 v := b.Control 18528 if v.Op != Op386FlagGT_ULT { 18529 break 18530 } 18531 b.Kind = BlockFirst 18532 b.SetControl(nil) 18533 return true 18534 } 18535 // match: (GT (FlagGT_UGT) yes no) 18536 // cond: 18537 // result: (First nil yes no) 18538 for { 18539 v := b.Control 18540 if v.Op != Op386FlagGT_UGT { 18541 break 18542 } 18543 b.Kind = BlockFirst 18544 b.SetControl(nil) 18545 return true 18546 } 18547 case BlockIf: 18548 // match: (If (SETL cmp) yes no) 18549 // cond: 18550 // result: (LT cmp yes no) 18551 for { 18552 v := b.Control 18553 if v.Op != Op386SETL { 18554 break 18555 } 18556 cmp := v.Args[0] 18557 b.Kind = Block386LT 18558 b.SetControl(cmp) 18559 return true 18560 } 18561 // match: (If (SETLE cmp) yes no) 18562 // cond: 18563 // result: (LE cmp yes no) 18564 for { 18565 v := b.Control 18566 if v.Op != Op386SETLE { 18567 break 18568 } 18569 cmp := v.Args[0] 18570 b.Kind = Block386LE 18571 b.SetControl(cmp) 18572 return true 18573 } 18574 // match: (If (SETG cmp) yes no) 18575 // cond: 18576 // result: (GT cmp yes no) 18577 for { 18578 v := b.Control 18579 if v.Op != Op386SETG { 18580 break 18581 } 18582 cmp := v.Args[0] 18583 b.Kind = Block386GT 18584 b.SetControl(cmp) 18585 return true 18586 } 18587 // match: (If (SETGE cmp) yes no) 18588 // cond: 18589 // result: (GE cmp yes no) 18590 for { 18591 v := b.Control 18592 if v.Op != Op386SETGE { 18593 break 18594 } 18595 cmp := v.Args[0] 18596 b.Kind = Block386GE 18597 b.SetControl(cmp) 18598 return true 18599 } 18600 // match: (If (SETEQ cmp) yes no) 18601 // cond: 18602 // result: (EQ cmp yes no) 18603 for { 18604 v := b.Control 18605 if v.Op != Op386SETEQ { 18606 break 18607 } 18608 cmp := v.Args[0] 18609 b.Kind = Block386EQ 18610 b.SetControl(cmp) 18611 return true 18612 } 18613 // match: (If (SETNE cmp) yes no) 18614 // cond: 18615 // result: (NE cmp yes no) 18616 for { 18617 v := b.Control 18618 if v.Op != Op386SETNE { 18619 break 18620 } 18621 cmp := v.Args[0] 18622 b.Kind = Block386NE 18623 b.SetControl(cmp) 18624 return true 18625 } 18626 // match: (If (SETB cmp) yes no) 18627 // cond: 18628 // result: (ULT cmp yes no) 18629 for { 18630 v := b.Control 18631 if v.Op != Op386SETB { 18632 break 18633 } 18634 cmp := v.Args[0] 18635 b.Kind = Block386ULT 18636 b.SetControl(cmp) 18637 return true 18638 } 18639 // match: (If (SETBE cmp) yes no) 18640 // cond: 18641 // result: (ULE cmp yes no) 18642 for { 18643 v := b.Control 18644 if v.Op != Op386SETBE { 18645 break 18646 } 18647 cmp := v.Args[0] 18648 b.Kind = Block386ULE 18649 b.SetControl(cmp) 18650 return true 18651 } 18652 // match: (If (SETA cmp) yes no) 18653 // cond: 18654 // result: (UGT cmp yes no) 18655 for { 18656 v := b.Control 18657 if v.Op != Op386SETA { 18658 break 18659 } 18660 cmp := v.Args[0] 18661 b.Kind = Block386UGT 18662 b.SetControl(cmp) 18663 return true 18664 } 18665 // match: (If (SETAE cmp) yes no) 18666 // cond: 18667 // result: (UGE cmp yes no) 18668 for { 18669 v := b.Control 18670 if v.Op != Op386SETAE { 18671 break 18672 } 18673 cmp := v.Args[0] 18674 b.Kind = Block386UGE 18675 b.SetControl(cmp) 18676 return true 18677 } 18678 // match: (If (SETGF cmp) yes no) 18679 // cond: 18680 // result: (UGT cmp yes no) 18681 for { 18682 v := b.Control 18683 if v.Op != Op386SETGF { 18684 break 18685 } 18686 cmp := v.Args[0] 18687 b.Kind = Block386UGT 18688 b.SetControl(cmp) 18689 return true 18690 } 18691 // match: (If (SETGEF cmp) yes no) 18692 // cond: 18693 // result: (UGE cmp yes no) 18694 for { 18695 v := b.Control 18696 if v.Op != Op386SETGEF { 18697 break 18698 } 18699 cmp := v.Args[0] 18700 b.Kind = Block386UGE 18701 b.SetControl(cmp) 18702 return true 18703 } 18704 // match: (If (SETEQF cmp) yes no) 18705 // cond: 18706 // result: (EQF cmp yes no) 18707 for { 18708 v := b.Control 18709 if v.Op != Op386SETEQF { 18710 break 18711 } 18712 cmp := v.Args[0] 18713 b.Kind = Block386EQF 18714 b.SetControl(cmp) 18715 return true 18716 } 18717 // match: (If (SETNEF cmp) yes no) 18718 // cond: 18719 // result: (NEF cmp yes no) 18720 for { 18721 v := b.Control 18722 if v.Op != Op386SETNEF { 18723 break 18724 } 18725 cmp := v.Args[0] 18726 b.Kind = Block386NEF 18727 b.SetControl(cmp) 18728 return true 18729 } 18730 // match: (If cond yes no) 18731 // cond: 18732 // result: (NE (TESTB cond cond) yes no) 18733 for { 18734 v := b.Control 18735 _ = v 18736 cond := b.Control 18737 b.Kind = Block386NE 18738 v0 := b.NewValue0(v.Pos, Op386TESTB, types.TypeFlags) 18739 v0.AddArg(cond) 18740 v0.AddArg(cond) 18741 b.SetControl(v0) 18742 return true 18743 } 18744 case Block386LE: 18745 // match: (LE (InvertFlags cmp) yes no) 18746 // cond: 18747 // result: (GE cmp yes no) 18748 for { 18749 v := b.Control 18750 if v.Op != Op386InvertFlags { 18751 break 18752 } 18753 cmp := v.Args[0] 18754 b.Kind = Block386GE 18755 b.SetControl(cmp) 18756 return true 18757 } 18758 // match: (LE (FlagEQ) yes no) 18759 // cond: 18760 // result: (First nil yes no) 18761 for { 18762 v := b.Control 18763 if v.Op != Op386FlagEQ { 18764 break 18765 } 18766 b.Kind = BlockFirst 18767 b.SetControl(nil) 18768 return true 18769 } 18770 // match: (LE (FlagLT_ULT) yes no) 18771 // cond: 18772 // result: (First nil yes no) 18773 for { 18774 v := b.Control 18775 if v.Op != Op386FlagLT_ULT { 18776 break 18777 } 18778 b.Kind = BlockFirst 18779 b.SetControl(nil) 18780 return true 18781 } 18782 // match: (LE (FlagLT_UGT) yes no) 18783 // cond: 18784 // result: (First nil yes no) 18785 for { 18786 v := b.Control 18787 if v.Op != Op386FlagLT_UGT { 18788 break 18789 } 18790 b.Kind = BlockFirst 18791 b.SetControl(nil) 18792 return true 18793 } 18794 // match: (LE (FlagGT_ULT) yes no) 18795 // cond: 18796 // result: (First nil no yes) 18797 for { 18798 v := b.Control 18799 if v.Op != Op386FlagGT_ULT { 18800 break 18801 } 18802 b.Kind = BlockFirst 18803 b.SetControl(nil) 18804 b.swapSuccessors() 18805 return true 18806 } 18807 // match: (LE (FlagGT_UGT) yes no) 18808 // cond: 18809 // result: (First nil no yes) 18810 for { 18811 v := b.Control 18812 if v.Op != Op386FlagGT_UGT { 18813 break 18814 } 18815 b.Kind = BlockFirst 18816 b.SetControl(nil) 18817 b.swapSuccessors() 18818 return true 18819 } 18820 case Block386LT: 18821 // match: (LT (InvertFlags cmp) yes no) 18822 // cond: 18823 // result: (GT cmp yes no) 18824 for { 18825 v := b.Control 18826 if v.Op != Op386InvertFlags { 18827 break 18828 } 18829 cmp := v.Args[0] 18830 b.Kind = Block386GT 18831 b.SetControl(cmp) 18832 return true 18833 } 18834 // match: (LT (FlagEQ) yes no) 18835 // cond: 18836 // result: (First nil no yes) 18837 for { 18838 v := b.Control 18839 if v.Op != Op386FlagEQ { 18840 break 18841 } 18842 b.Kind = BlockFirst 18843 b.SetControl(nil) 18844 b.swapSuccessors() 18845 return true 18846 } 18847 // match: (LT (FlagLT_ULT) yes no) 18848 // cond: 18849 // result: (First nil yes no) 18850 for { 18851 v := b.Control 18852 if v.Op != Op386FlagLT_ULT { 18853 break 18854 } 18855 b.Kind = BlockFirst 18856 b.SetControl(nil) 18857 return true 18858 } 18859 // match: (LT (FlagLT_UGT) yes no) 18860 // cond: 18861 // result: (First nil yes no) 18862 for { 18863 v := b.Control 18864 if v.Op != Op386FlagLT_UGT { 18865 break 18866 } 18867 b.Kind = BlockFirst 18868 b.SetControl(nil) 18869 return true 18870 } 18871 // match: (LT (FlagGT_ULT) yes no) 18872 // cond: 18873 // result: (First nil no yes) 18874 for { 18875 v := b.Control 18876 if v.Op != Op386FlagGT_ULT { 18877 break 18878 } 18879 b.Kind = BlockFirst 18880 b.SetControl(nil) 18881 b.swapSuccessors() 18882 return true 18883 } 18884 // match: (LT (FlagGT_UGT) yes no) 18885 // cond: 18886 // result: (First nil no yes) 18887 for { 18888 v := b.Control 18889 if v.Op != Op386FlagGT_UGT { 18890 break 18891 } 18892 b.Kind = BlockFirst 18893 b.SetControl(nil) 18894 b.swapSuccessors() 18895 return true 18896 } 18897 case Block386NE: 18898 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18899 // cond: 18900 // result: (LT cmp yes no) 18901 for { 18902 v := b.Control 18903 if v.Op != Op386TESTB { 18904 break 18905 } 18906 _ = v.Args[1] 18907 v_0 := v.Args[0] 18908 if v_0.Op != Op386SETL { 18909 break 18910 } 18911 cmp := v_0.Args[0] 18912 v_1 := v.Args[1] 18913 if v_1.Op != Op386SETL { 18914 break 18915 } 18916 if cmp != v_1.Args[0] { 18917 break 18918 } 18919 b.Kind = Block386LT 18920 b.SetControl(cmp) 18921 return true 18922 } 18923 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18924 // cond: 18925 // result: (LT cmp yes no) 18926 for { 18927 v := b.Control 18928 if v.Op != Op386TESTB { 18929 break 18930 } 18931 _ = v.Args[1] 18932 v_0 := v.Args[0] 18933 if v_0.Op != Op386SETL { 18934 break 18935 } 18936 cmp := v_0.Args[0] 18937 v_1 := v.Args[1] 18938 if v_1.Op != Op386SETL { 18939 break 18940 } 18941 if cmp != v_1.Args[0] { 18942 break 18943 } 18944 b.Kind = Block386LT 18945 b.SetControl(cmp) 18946 return true 18947 } 18948 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 18949 // cond: 18950 // result: (LE cmp yes no) 18951 for { 18952 v := b.Control 18953 if v.Op != Op386TESTB { 18954 break 18955 } 18956 _ = v.Args[1] 18957 v_0 := v.Args[0] 18958 if v_0.Op != Op386SETLE { 18959 break 18960 } 18961 cmp := v_0.Args[0] 18962 v_1 := v.Args[1] 18963 if v_1.Op != Op386SETLE { 18964 break 18965 } 18966 if cmp != v_1.Args[0] { 18967 break 18968 } 18969 b.Kind = Block386LE 18970 b.SetControl(cmp) 18971 return true 18972 } 18973 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 18974 // cond: 18975 // result: (LE cmp yes no) 18976 for { 18977 v := b.Control 18978 if v.Op != Op386TESTB { 18979 break 18980 } 18981 _ = v.Args[1] 18982 v_0 := v.Args[0] 18983 if v_0.Op != Op386SETLE { 18984 break 18985 } 18986 cmp := v_0.Args[0] 18987 v_1 := v.Args[1] 18988 if v_1.Op != Op386SETLE { 18989 break 18990 } 18991 if cmp != v_1.Args[0] { 18992 break 18993 } 18994 b.Kind = Block386LE 18995 b.SetControl(cmp) 18996 return true 18997 } 18998 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 18999 // cond: 19000 // result: (GT cmp yes no) 19001 for { 19002 v := b.Control 19003 if v.Op != Op386TESTB { 19004 break 19005 } 19006 _ = v.Args[1] 19007 v_0 := v.Args[0] 19008 if v_0.Op != Op386SETG { 19009 break 19010 } 19011 cmp := v_0.Args[0] 19012 v_1 := v.Args[1] 19013 if v_1.Op != Op386SETG { 19014 break 19015 } 19016 if cmp != v_1.Args[0] { 19017 break 19018 } 19019 b.Kind = Block386GT 19020 b.SetControl(cmp) 19021 return true 19022 } 19023 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 19024 // cond: 19025 // result: (GT cmp yes no) 19026 for { 19027 v := b.Control 19028 if v.Op != Op386TESTB { 19029 break 19030 } 19031 _ = v.Args[1] 19032 v_0 := v.Args[0] 19033 if v_0.Op != Op386SETG { 19034 break 19035 } 19036 cmp := v_0.Args[0] 19037 v_1 := v.Args[1] 19038 if v_1.Op != Op386SETG { 19039 break 19040 } 19041 if cmp != v_1.Args[0] { 19042 break 19043 } 19044 b.Kind = Block386GT 19045 b.SetControl(cmp) 19046 return true 19047 } 19048 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 19049 // cond: 19050 // result: (GE cmp yes no) 19051 for { 19052 v := b.Control 19053 if v.Op != Op386TESTB { 19054 break 19055 } 19056 _ = v.Args[1] 19057 v_0 := v.Args[0] 19058 if v_0.Op != Op386SETGE { 19059 break 19060 } 19061 cmp := v_0.Args[0] 19062 v_1 := v.Args[1] 19063 if v_1.Op != Op386SETGE { 19064 break 19065 } 19066 if cmp != v_1.Args[0] { 19067 break 19068 } 19069 b.Kind = Block386GE 19070 b.SetControl(cmp) 19071 return true 19072 } 19073 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 19074 // cond: 19075 // result: (GE cmp yes no) 19076 for { 19077 v := b.Control 19078 if v.Op != Op386TESTB { 19079 break 19080 } 19081 _ = v.Args[1] 19082 v_0 := v.Args[0] 19083 if v_0.Op != Op386SETGE { 19084 break 19085 } 19086 cmp := v_0.Args[0] 19087 v_1 := v.Args[1] 19088 if v_1.Op != Op386SETGE { 19089 break 19090 } 19091 if cmp != v_1.Args[0] { 19092 break 19093 } 19094 b.Kind = Block386GE 19095 b.SetControl(cmp) 19096 return true 19097 } 19098 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 19099 // cond: 19100 // result: (EQ cmp yes no) 19101 for { 19102 v := b.Control 19103 if v.Op != Op386TESTB { 19104 break 19105 } 19106 _ = v.Args[1] 19107 v_0 := v.Args[0] 19108 if v_0.Op != Op386SETEQ { 19109 break 19110 } 19111 cmp := v_0.Args[0] 19112 v_1 := v.Args[1] 19113 if v_1.Op != Op386SETEQ { 19114 break 19115 } 19116 if cmp != v_1.Args[0] { 19117 break 19118 } 19119 b.Kind = Block386EQ 19120 b.SetControl(cmp) 19121 return true 19122 } 19123 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 19124 // cond: 19125 // result: (EQ cmp yes no) 19126 for { 19127 v := b.Control 19128 if v.Op != Op386TESTB { 19129 break 19130 } 19131 _ = v.Args[1] 19132 v_0 := v.Args[0] 19133 if v_0.Op != Op386SETEQ { 19134 break 19135 } 19136 cmp := v_0.Args[0] 19137 v_1 := v.Args[1] 19138 if v_1.Op != Op386SETEQ { 19139 break 19140 } 19141 if cmp != v_1.Args[0] { 19142 break 19143 } 19144 b.Kind = Block386EQ 19145 b.SetControl(cmp) 19146 return true 19147 } 19148 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 19149 // cond: 19150 // result: (NE cmp yes no) 19151 for { 19152 v := b.Control 19153 if v.Op != Op386TESTB { 19154 break 19155 } 19156 _ = v.Args[1] 19157 v_0 := v.Args[0] 19158 if v_0.Op != Op386SETNE { 19159 break 19160 } 19161 cmp := v_0.Args[0] 19162 v_1 := v.Args[1] 19163 if v_1.Op != Op386SETNE { 19164 break 19165 } 19166 if cmp != v_1.Args[0] { 19167 break 19168 } 19169 b.Kind = Block386NE 19170 b.SetControl(cmp) 19171 return true 19172 } 19173 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 19174 // cond: 19175 // result: (NE cmp yes no) 19176 for { 19177 v := b.Control 19178 if v.Op != Op386TESTB { 19179 break 19180 } 19181 _ = v.Args[1] 19182 v_0 := v.Args[0] 19183 if v_0.Op != Op386SETNE { 19184 break 19185 } 19186 cmp := v_0.Args[0] 19187 v_1 := v.Args[1] 19188 if v_1.Op != Op386SETNE { 19189 break 19190 } 19191 if cmp != v_1.Args[0] { 19192 break 19193 } 19194 b.Kind = Block386NE 19195 b.SetControl(cmp) 19196 return true 19197 } 19198 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 19199 // cond: 19200 // result: (ULT cmp yes no) 19201 for { 19202 v := b.Control 19203 if v.Op != Op386TESTB { 19204 break 19205 } 19206 _ = v.Args[1] 19207 v_0 := v.Args[0] 19208 if v_0.Op != Op386SETB { 19209 break 19210 } 19211 cmp := v_0.Args[0] 19212 v_1 := v.Args[1] 19213 if v_1.Op != Op386SETB { 19214 break 19215 } 19216 if cmp != v_1.Args[0] { 19217 break 19218 } 19219 b.Kind = Block386ULT 19220 b.SetControl(cmp) 19221 return true 19222 } 19223 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 19224 // cond: 19225 // result: (ULT cmp yes no) 19226 for { 19227 v := b.Control 19228 if v.Op != Op386TESTB { 19229 break 19230 } 19231 _ = v.Args[1] 19232 v_0 := v.Args[0] 19233 if v_0.Op != Op386SETB { 19234 break 19235 } 19236 cmp := v_0.Args[0] 19237 v_1 := v.Args[1] 19238 if v_1.Op != Op386SETB { 19239 break 19240 } 19241 if cmp != v_1.Args[0] { 19242 break 19243 } 19244 b.Kind = Block386ULT 19245 b.SetControl(cmp) 19246 return true 19247 } 19248 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 19249 // cond: 19250 // result: (ULE cmp yes no) 19251 for { 19252 v := b.Control 19253 if v.Op != Op386TESTB { 19254 break 19255 } 19256 _ = v.Args[1] 19257 v_0 := v.Args[0] 19258 if v_0.Op != Op386SETBE { 19259 break 19260 } 19261 cmp := v_0.Args[0] 19262 v_1 := v.Args[1] 19263 if v_1.Op != Op386SETBE { 19264 break 19265 } 19266 if cmp != v_1.Args[0] { 19267 break 19268 } 19269 b.Kind = Block386ULE 19270 b.SetControl(cmp) 19271 return true 19272 } 19273 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 19274 // cond: 19275 // result: (ULE cmp yes no) 19276 for { 19277 v := b.Control 19278 if v.Op != Op386TESTB { 19279 break 19280 } 19281 _ = v.Args[1] 19282 v_0 := v.Args[0] 19283 if v_0.Op != Op386SETBE { 19284 break 19285 } 19286 cmp := v_0.Args[0] 19287 v_1 := v.Args[1] 19288 if v_1.Op != Op386SETBE { 19289 break 19290 } 19291 if cmp != v_1.Args[0] { 19292 break 19293 } 19294 b.Kind = Block386ULE 19295 b.SetControl(cmp) 19296 return true 19297 } 19298 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 19299 // cond: 19300 // result: (UGT cmp yes no) 19301 for { 19302 v := b.Control 19303 if v.Op != Op386TESTB { 19304 break 19305 } 19306 _ = v.Args[1] 19307 v_0 := v.Args[0] 19308 if v_0.Op != Op386SETA { 19309 break 19310 } 19311 cmp := v_0.Args[0] 19312 v_1 := v.Args[1] 19313 if v_1.Op != Op386SETA { 19314 break 19315 } 19316 if cmp != v_1.Args[0] { 19317 break 19318 } 19319 b.Kind = Block386UGT 19320 b.SetControl(cmp) 19321 return true 19322 } 19323 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 19324 // cond: 19325 // result: (UGT cmp yes no) 19326 for { 19327 v := b.Control 19328 if v.Op != Op386TESTB { 19329 break 19330 } 19331 _ = v.Args[1] 19332 v_0 := v.Args[0] 19333 if v_0.Op != Op386SETA { 19334 break 19335 } 19336 cmp := v_0.Args[0] 19337 v_1 := v.Args[1] 19338 if v_1.Op != Op386SETA { 19339 break 19340 } 19341 if cmp != v_1.Args[0] { 19342 break 19343 } 19344 b.Kind = Block386UGT 19345 b.SetControl(cmp) 19346 return true 19347 } 19348 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 19349 // cond: 19350 // result: (UGE cmp yes no) 19351 for { 19352 v := b.Control 19353 if v.Op != Op386TESTB { 19354 break 19355 } 19356 _ = v.Args[1] 19357 v_0 := v.Args[0] 19358 if v_0.Op != Op386SETAE { 19359 break 19360 } 19361 cmp := v_0.Args[0] 19362 v_1 := v.Args[1] 19363 if v_1.Op != Op386SETAE { 19364 break 19365 } 19366 if cmp != v_1.Args[0] { 19367 break 19368 } 19369 b.Kind = Block386UGE 19370 b.SetControl(cmp) 19371 return true 19372 } 19373 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 19374 // cond: 19375 // result: (UGE cmp yes no) 19376 for { 19377 v := b.Control 19378 if v.Op != Op386TESTB { 19379 break 19380 } 19381 _ = v.Args[1] 19382 v_0 := v.Args[0] 19383 if v_0.Op != Op386SETAE { 19384 break 19385 } 19386 cmp := v_0.Args[0] 19387 v_1 := v.Args[1] 19388 if v_1.Op != Op386SETAE { 19389 break 19390 } 19391 if cmp != v_1.Args[0] { 19392 break 19393 } 19394 b.Kind = Block386UGE 19395 b.SetControl(cmp) 19396 return true 19397 } 19398 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 19399 // cond: 19400 // result: (UGT cmp yes no) 19401 for { 19402 v := b.Control 19403 if v.Op != Op386TESTB { 19404 break 19405 } 19406 _ = v.Args[1] 19407 v_0 := v.Args[0] 19408 if v_0.Op != Op386SETGF { 19409 break 19410 } 19411 cmp := v_0.Args[0] 19412 v_1 := v.Args[1] 19413 if v_1.Op != Op386SETGF { 19414 break 19415 } 19416 if cmp != v_1.Args[0] { 19417 break 19418 } 19419 b.Kind = Block386UGT 19420 b.SetControl(cmp) 19421 return true 19422 } 19423 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 19424 // cond: 19425 // result: (UGT cmp yes no) 19426 for { 19427 v := b.Control 19428 if v.Op != Op386TESTB { 19429 break 19430 } 19431 _ = v.Args[1] 19432 v_0 := v.Args[0] 19433 if v_0.Op != Op386SETGF { 19434 break 19435 } 19436 cmp := v_0.Args[0] 19437 v_1 := v.Args[1] 19438 if v_1.Op != Op386SETGF { 19439 break 19440 } 19441 if cmp != v_1.Args[0] { 19442 break 19443 } 19444 b.Kind = Block386UGT 19445 b.SetControl(cmp) 19446 return true 19447 } 19448 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 19449 // cond: 19450 // result: (UGE cmp yes no) 19451 for { 19452 v := b.Control 19453 if v.Op != Op386TESTB { 19454 break 19455 } 19456 _ = v.Args[1] 19457 v_0 := v.Args[0] 19458 if v_0.Op != Op386SETGEF { 19459 break 19460 } 19461 cmp := v_0.Args[0] 19462 v_1 := v.Args[1] 19463 if v_1.Op != Op386SETGEF { 19464 break 19465 } 19466 if cmp != v_1.Args[0] { 19467 break 19468 } 19469 b.Kind = Block386UGE 19470 b.SetControl(cmp) 19471 return true 19472 } 19473 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 19474 // cond: 19475 // result: (UGE cmp yes no) 19476 for { 19477 v := b.Control 19478 if v.Op != Op386TESTB { 19479 break 19480 } 19481 _ = v.Args[1] 19482 v_0 := v.Args[0] 19483 if v_0.Op != Op386SETGEF { 19484 break 19485 } 19486 cmp := v_0.Args[0] 19487 v_1 := v.Args[1] 19488 if v_1.Op != Op386SETGEF { 19489 break 19490 } 19491 if cmp != v_1.Args[0] { 19492 break 19493 } 19494 b.Kind = Block386UGE 19495 b.SetControl(cmp) 19496 return true 19497 } 19498 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 19499 // cond: 19500 // result: (EQF cmp yes no) 19501 for { 19502 v := b.Control 19503 if v.Op != Op386TESTB { 19504 break 19505 } 19506 _ = v.Args[1] 19507 v_0 := v.Args[0] 19508 if v_0.Op != Op386SETEQF { 19509 break 19510 } 19511 cmp := v_0.Args[0] 19512 v_1 := v.Args[1] 19513 if v_1.Op != Op386SETEQF { 19514 break 19515 } 19516 if cmp != v_1.Args[0] { 19517 break 19518 } 19519 b.Kind = Block386EQF 19520 b.SetControl(cmp) 19521 return true 19522 } 19523 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 19524 // cond: 19525 // result: (EQF cmp yes no) 19526 for { 19527 v := b.Control 19528 if v.Op != Op386TESTB { 19529 break 19530 } 19531 _ = v.Args[1] 19532 v_0 := v.Args[0] 19533 if v_0.Op != Op386SETEQF { 19534 break 19535 } 19536 cmp := v_0.Args[0] 19537 v_1 := v.Args[1] 19538 if v_1.Op != Op386SETEQF { 19539 break 19540 } 19541 if cmp != v_1.Args[0] { 19542 break 19543 } 19544 b.Kind = Block386EQF 19545 b.SetControl(cmp) 19546 return true 19547 } 19548 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 19549 // cond: 19550 // result: (NEF cmp yes no) 19551 for { 19552 v := b.Control 19553 if v.Op != Op386TESTB { 19554 break 19555 } 19556 _ = v.Args[1] 19557 v_0 := v.Args[0] 19558 if v_0.Op != Op386SETNEF { 19559 break 19560 } 19561 cmp := v_0.Args[0] 19562 v_1 := v.Args[1] 19563 if v_1.Op != Op386SETNEF { 19564 break 19565 } 19566 if cmp != v_1.Args[0] { 19567 break 19568 } 19569 b.Kind = Block386NEF 19570 b.SetControl(cmp) 19571 return true 19572 } 19573 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 19574 // cond: 19575 // result: (NEF cmp yes no) 19576 for { 19577 v := b.Control 19578 if v.Op != Op386TESTB { 19579 break 19580 } 19581 _ = v.Args[1] 19582 v_0 := v.Args[0] 19583 if v_0.Op != Op386SETNEF { 19584 break 19585 } 19586 cmp := v_0.Args[0] 19587 v_1 := v.Args[1] 19588 if v_1.Op != Op386SETNEF { 19589 break 19590 } 19591 if cmp != v_1.Args[0] { 19592 break 19593 } 19594 b.Kind = Block386NEF 19595 b.SetControl(cmp) 19596 return true 19597 } 19598 // match: (NE (InvertFlags cmp) yes no) 19599 // cond: 19600 // result: (NE cmp yes no) 19601 for { 19602 v := b.Control 19603 if v.Op != Op386InvertFlags { 19604 break 19605 } 19606 cmp := v.Args[0] 19607 b.Kind = Block386NE 19608 b.SetControl(cmp) 19609 return true 19610 } 19611 // match: (NE (FlagEQ) yes no) 19612 // cond: 19613 // result: (First nil no yes) 19614 for { 19615 v := b.Control 19616 if v.Op != Op386FlagEQ { 19617 break 19618 } 19619 b.Kind = BlockFirst 19620 b.SetControl(nil) 19621 b.swapSuccessors() 19622 return true 19623 } 19624 // match: (NE (FlagLT_ULT) yes no) 19625 // cond: 19626 // result: (First nil yes no) 19627 for { 19628 v := b.Control 19629 if v.Op != Op386FlagLT_ULT { 19630 break 19631 } 19632 b.Kind = BlockFirst 19633 b.SetControl(nil) 19634 return true 19635 } 19636 // match: (NE (FlagLT_UGT) yes no) 19637 // cond: 19638 // result: (First nil yes no) 19639 for { 19640 v := b.Control 19641 if v.Op != Op386FlagLT_UGT { 19642 break 19643 } 19644 b.Kind = BlockFirst 19645 b.SetControl(nil) 19646 return true 19647 } 19648 // match: (NE (FlagGT_ULT) yes no) 19649 // cond: 19650 // result: (First nil yes no) 19651 for { 19652 v := b.Control 19653 if v.Op != Op386FlagGT_ULT { 19654 break 19655 } 19656 b.Kind = BlockFirst 19657 b.SetControl(nil) 19658 return true 19659 } 19660 // match: (NE (FlagGT_UGT) yes no) 19661 // cond: 19662 // result: (First nil yes no) 19663 for { 19664 v := b.Control 19665 if v.Op != Op386FlagGT_UGT { 19666 break 19667 } 19668 b.Kind = BlockFirst 19669 b.SetControl(nil) 19670 return true 19671 } 19672 case Block386UGE: 19673 // match: (UGE (InvertFlags cmp) yes no) 19674 // cond: 19675 // result: (ULE cmp yes no) 19676 for { 19677 v := b.Control 19678 if v.Op != Op386InvertFlags { 19679 break 19680 } 19681 cmp := v.Args[0] 19682 b.Kind = Block386ULE 19683 b.SetControl(cmp) 19684 return true 19685 } 19686 // match: (UGE (FlagEQ) yes no) 19687 // cond: 19688 // result: (First nil yes no) 19689 for { 19690 v := b.Control 19691 if v.Op != Op386FlagEQ { 19692 break 19693 } 19694 b.Kind = BlockFirst 19695 b.SetControl(nil) 19696 return true 19697 } 19698 // match: (UGE (FlagLT_ULT) yes no) 19699 // cond: 19700 // result: (First nil no yes) 19701 for { 19702 v := b.Control 19703 if v.Op != Op386FlagLT_ULT { 19704 break 19705 } 19706 b.Kind = BlockFirst 19707 b.SetControl(nil) 19708 b.swapSuccessors() 19709 return true 19710 } 19711 // match: (UGE (FlagLT_UGT) yes no) 19712 // cond: 19713 // result: (First nil yes no) 19714 for { 19715 v := b.Control 19716 if v.Op != Op386FlagLT_UGT { 19717 break 19718 } 19719 b.Kind = BlockFirst 19720 b.SetControl(nil) 19721 return true 19722 } 19723 // match: (UGE (FlagGT_ULT) yes no) 19724 // cond: 19725 // result: (First nil no yes) 19726 for { 19727 v := b.Control 19728 if v.Op != Op386FlagGT_ULT { 19729 break 19730 } 19731 b.Kind = BlockFirst 19732 b.SetControl(nil) 19733 b.swapSuccessors() 19734 return true 19735 } 19736 // match: (UGE (FlagGT_UGT) yes no) 19737 // cond: 19738 // result: (First nil yes no) 19739 for { 19740 v := b.Control 19741 if v.Op != Op386FlagGT_UGT { 19742 break 19743 } 19744 b.Kind = BlockFirst 19745 b.SetControl(nil) 19746 return true 19747 } 19748 case Block386UGT: 19749 // match: (UGT (InvertFlags cmp) yes no) 19750 // cond: 19751 // result: (ULT cmp yes no) 19752 for { 19753 v := b.Control 19754 if v.Op != Op386InvertFlags { 19755 break 19756 } 19757 cmp := v.Args[0] 19758 b.Kind = Block386ULT 19759 b.SetControl(cmp) 19760 return true 19761 } 19762 // match: (UGT (FlagEQ) yes no) 19763 // cond: 19764 // result: (First nil no yes) 19765 for { 19766 v := b.Control 19767 if v.Op != Op386FlagEQ { 19768 break 19769 } 19770 b.Kind = BlockFirst 19771 b.SetControl(nil) 19772 b.swapSuccessors() 19773 return true 19774 } 19775 // match: (UGT (FlagLT_ULT) yes no) 19776 // cond: 19777 // result: (First nil no yes) 19778 for { 19779 v := b.Control 19780 if v.Op != Op386FlagLT_ULT { 19781 break 19782 } 19783 b.Kind = BlockFirst 19784 b.SetControl(nil) 19785 b.swapSuccessors() 19786 return true 19787 } 19788 // match: (UGT (FlagLT_UGT) yes no) 19789 // cond: 19790 // result: (First nil yes no) 19791 for { 19792 v := b.Control 19793 if v.Op != Op386FlagLT_UGT { 19794 break 19795 } 19796 b.Kind = BlockFirst 19797 b.SetControl(nil) 19798 return true 19799 } 19800 // match: (UGT (FlagGT_ULT) yes no) 19801 // cond: 19802 // result: (First nil no yes) 19803 for { 19804 v := b.Control 19805 if v.Op != Op386FlagGT_ULT { 19806 break 19807 } 19808 b.Kind = BlockFirst 19809 b.SetControl(nil) 19810 b.swapSuccessors() 19811 return true 19812 } 19813 // match: (UGT (FlagGT_UGT) yes no) 19814 // cond: 19815 // result: (First nil yes no) 19816 for { 19817 v := b.Control 19818 if v.Op != Op386FlagGT_UGT { 19819 break 19820 } 19821 b.Kind = BlockFirst 19822 b.SetControl(nil) 19823 return true 19824 } 19825 case Block386ULE: 19826 // match: (ULE (InvertFlags cmp) yes no) 19827 // cond: 19828 // result: (UGE cmp yes no) 19829 for { 19830 v := b.Control 19831 if v.Op != Op386InvertFlags { 19832 break 19833 } 19834 cmp := v.Args[0] 19835 b.Kind = Block386UGE 19836 b.SetControl(cmp) 19837 return true 19838 } 19839 // match: (ULE (FlagEQ) yes no) 19840 // cond: 19841 // result: (First nil yes no) 19842 for { 19843 v := b.Control 19844 if v.Op != Op386FlagEQ { 19845 break 19846 } 19847 b.Kind = BlockFirst 19848 b.SetControl(nil) 19849 return true 19850 } 19851 // match: (ULE (FlagLT_ULT) yes no) 19852 // cond: 19853 // result: (First nil yes no) 19854 for { 19855 v := b.Control 19856 if v.Op != Op386FlagLT_ULT { 19857 break 19858 } 19859 b.Kind = BlockFirst 19860 b.SetControl(nil) 19861 return true 19862 } 19863 // match: (ULE (FlagLT_UGT) yes no) 19864 // cond: 19865 // result: (First nil no yes) 19866 for { 19867 v := b.Control 19868 if v.Op != Op386FlagLT_UGT { 19869 break 19870 } 19871 b.Kind = BlockFirst 19872 b.SetControl(nil) 19873 b.swapSuccessors() 19874 return true 19875 } 19876 // match: (ULE (FlagGT_ULT) yes no) 19877 // cond: 19878 // result: (First nil yes no) 19879 for { 19880 v := b.Control 19881 if v.Op != Op386FlagGT_ULT { 19882 break 19883 } 19884 b.Kind = BlockFirst 19885 b.SetControl(nil) 19886 return true 19887 } 19888 // match: (ULE (FlagGT_UGT) yes no) 19889 // cond: 19890 // result: (First nil no yes) 19891 for { 19892 v := b.Control 19893 if v.Op != Op386FlagGT_UGT { 19894 break 19895 } 19896 b.Kind = BlockFirst 19897 b.SetControl(nil) 19898 b.swapSuccessors() 19899 return true 19900 } 19901 case Block386ULT: 19902 // match: (ULT (InvertFlags cmp) yes no) 19903 // cond: 19904 // result: (UGT cmp yes no) 19905 for { 19906 v := b.Control 19907 if v.Op != Op386InvertFlags { 19908 break 19909 } 19910 cmp := v.Args[0] 19911 b.Kind = Block386UGT 19912 b.SetControl(cmp) 19913 return true 19914 } 19915 // match: (ULT (FlagEQ) yes no) 19916 // cond: 19917 // result: (First nil no yes) 19918 for { 19919 v := b.Control 19920 if v.Op != Op386FlagEQ { 19921 break 19922 } 19923 b.Kind = BlockFirst 19924 b.SetControl(nil) 19925 b.swapSuccessors() 19926 return true 19927 } 19928 // match: (ULT (FlagLT_ULT) yes no) 19929 // cond: 19930 // result: (First nil yes no) 19931 for { 19932 v := b.Control 19933 if v.Op != Op386FlagLT_ULT { 19934 break 19935 } 19936 b.Kind = BlockFirst 19937 b.SetControl(nil) 19938 return true 19939 } 19940 // match: (ULT (FlagLT_UGT) yes no) 19941 // cond: 19942 // result: (First nil no yes) 19943 for { 19944 v := b.Control 19945 if v.Op != Op386FlagLT_UGT { 19946 break 19947 } 19948 b.Kind = BlockFirst 19949 b.SetControl(nil) 19950 b.swapSuccessors() 19951 return true 19952 } 19953 // match: (ULT (FlagGT_ULT) yes no) 19954 // cond: 19955 // result: (First nil yes no) 19956 for { 19957 v := b.Control 19958 if v.Op != Op386FlagGT_ULT { 19959 break 19960 } 19961 b.Kind = BlockFirst 19962 b.SetControl(nil) 19963 return true 19964 } 19965 // match: (ULT (FlagGT_UGT) yes no) 19966 // cond: 19967 // result: (First nil no yes) 19968 for { 19969 v := b.Control 19970 if v.Op != Op386FlagGT_UGT { 19971 break 19972 } 19973 b.Kind = BlockFirst 19974 b.SetControl(nil) 19975 b.swapSuccessors() 19976 return true 19977 } 19978 } 19979 return false 19980 }