github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/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 OpGetCallerPC: 333 return rewriteValue386_OpGetCallerPC_0(v) 334 case OpGetCallerSP: 335 return rewriteValue386_OpGetCallerSP_0(v) 336 case OpGetClosurePtr: 337 return rewriteValue386_OpGetClosurePtr_0(v) 338 case OpGetG: 339 return rewriteValue386_OpGetG_0(v) 340 case OpGreater16: 341 return rewriteValue386_OpGreater16_0(v) 342 case OpGreater16U: 343 return rewriteValue386_OpGreater16U_0(v) 344 case OpGreater32: 345 return rewriteValue386_OpGreater32_0(v) 346 case OpGreater32F: 347 return rewriteValue386_OpGreater32F_0(v) 348 case OpGreater32U: 349 return rewriteValue386_OpGreater32U_0(v) 350 case OpGreater64F: 351 return rewriteValue386_OpGreater64F_0(v) 352 case OpGreater8: 353 return rewriteValue386_OpGreater8_0(v) 354 case OpGreater8U: 355 return rewriteValue386_OpGreater8U_0(v) 356 case OpHmul32: 357 return rewriteValue386_OpHmul32_0(v) 358 case OpHmul32u: 359 return rewriteValue386_OpHmul32u_0(v) 360 case OpInterCall: 361 return rewriteValue386_OpInterCall_0(v) 362 case OpIsInBounds: 363 return rewriteValue386_OpIsInBounds_0(v) 364 case OpIsNonNil: 365 return rewriteValue386_OpIsNonNil_0(v) 366 case OpIsSliceInBounds: 367 return rewriteValue386_OpIsSliceInBounds_0(v) 368 case OpLeq16: 369 return rewriteValue386_OpLeq16_0(v) 370 case OpLeq16U: 371 return rewriteValue386_OpLeq16U_0(v) 372 case OpLeq32: 373 return rewriteValue386_OpLeq32_0(v) 374 case OpLeq32F: 375 return rewriteValue386_OpLeq32F_0(v) 376 case OpLeq32U: 377 return rewriteValue386_OpLeq32U_0(v) 378 case OpLeq64F: 379 return rewriteValue386_OpLeq64F_0(v) 380 case OpLeq8: 381 return rewriteValue386_OpLeq8_0(v) 382 case OpLeq8U: 383 return rewriteValue386_OpLeq8U_0(v) 384 case OpLess16: 385 return rewriteValue386_OpLess16_0(v) 386 case OpLess16U: 387 return rewriteValue386_OpLess16U_0(v) 388 case OpLess32: 389 return rewriteValue386_OpLess32_0(v) 390 case OpLess32F: 391 return rewriteValue386_OpLess32F_0(v) 392 case OpLess32U: 393 return rewriteValue386_OpLess32U_0(v) 394 case OpLess64F: 395 return rewriteValue386_OpLess64F_0(v) 396 case OpLess8: 397 return rewriteValue386_OpLess8_0(v) 398 case OpLess8U: 399 return rewriteValue386_OpLess8U_0(v) 400 case OpLoad: 401 return rewriteValue386_OpLoad_0(v) 402 case OpLsh16x16: 403 return rewriteValue386_OpLsh16x16_0(v) 404 case OpLsh16x32: 405 return rewriteValue386_OpLsh16x32_0(v) 406 case OpLsh16x64: 407 return rewriteValue386_OpLsh16x64_0(v) 408 case OpLsh16x8: 409 return rewriteValue386_OpLsh16x8_0(v) 410 case OpLsh32x16: 411 return rewriteValue386_OpLsh32x16_0(v) 412 case OpLsh32x32: 413 return rewriteValue386_OpLsh32x32_0(v) 414 case OpLsh32x64: 415 return rewriteValue386_OpLsh32x64_0(v) 416 case OpLsh32x8: 417 return rewriteValue386_OpLsh32x8_0(v) 418 case OpLsh8x16: 419 return rewriteValue386_OpLsh8x16_0(v) 420 case OpLsh8x32: 421 return rewriteValue386_OpLsh8x32_0(v) 422 case OpLsh8x64: 423 return rewriteValue386_OpLsh8x64_0(v) 424 case OpLsh8x8: 425 return rewriteValue386_OpLsh8x8_0(v) 426 case OpMod16: 427 return rewriteValue386_OpMod16_0(v) 428 case OpMod16u: 429 return rewriteValue386_OpMod16u_0(v) 430 case OpMod32: 431 return rewriteValue386_OpMod32_0(v) 432 case OpMod32u: 433 return rewriteValue386_OpMod32u_0(v) 434 case OpMod8: 435 return rewriteValue386_OpMod8_0(v) 436 case OpMod8u: 437 return rewriteValue386_OpMod8u_0(v) 438 case OpMove: 439 return rewriteValue386_OpMove_0(v) || rewriteValue386_OpMove_10(v) 440 case OpMul16: 441 return rewriteValue386_OpMul16_0(v) 442 case OpMul32: 443 return rewriteValue386_OpMul32_0(v) 444 case OpMul32F: 445 return rewriteValue386_OpMul32F_0(v) 446 case OpMul32uhilo: 447 return rewriteValue386_OpMul32uhilo_0(v) 448 case OpMul64F: 449 return rewriteValue386_OpMul64F_0(v) 450 case OpMul8: 451 return rewriteValue386_OpMul8_0(v) 452 case OpNeg16: 453 return rewriteValue386_OpNeg16_0(v) 454 case OpNeg32: 455 return rewriteValue386_OpNeg32_0(v) 456 case OpNeg32F: 457 return rewriteValue386_OpNeg32F_0(v) 458 case OpNeg64F: 459 return rewriteValue386_OpNeg64F_0(v) 460 case OpNeg8: 461 return rewriteValue386_OpNeg8_0(v) 462 case OpNeq16: 463 return rewriteValue386_OpNeq16_0(v) 464 case OpNeq32: 465 return rewriteValue386_OpNeq32_0(v) 466 case OpNeq32F: 467 return rewriteValue386_OpNeq32F_0(v) 468 case OpNeq64F: 469 return rewriteValue386_OpNeq64F_0(v) 470 case OpNeq8: 471 return rewriteValue386_OpNeq8_0(v) 472 case OpNeqB: 473 return rewriteValue386_OpNeqB_0(v) 474 case OpNeqPtr: 475 return rewriteValue386_OpNeqPtr_0(v) 476 case OpNilCheck: 477 return rewriteValue386_OpNilCheck_0(v) 478 case OpNot: 479 return rewriteValue386_OpNot_0(v) 480 case OpOffPtr: 481 return rewriteValue386_OpOffPtr_0(v) 482 case OpOr16: 483 return rewriteValue386_OpOr16_0(v) 484 case OpOr32: 485 return rewriteValue386_OpOr32_0(v) 486 case OpOr8: 487 return rewriteValue386_OpOr8_0(v) 488 case OpOrB: 489 return rewriteValue386_OpOrB_0(v) 490 case OpRound32F: 491 return rewriteValue386_OpRound32F_0(v) 492 case OpRound64F: 493 return rewriteValue386_OpRound64F_0(v) 494 case OpRsh16Ux16: 495 return rewriteValue386_OpRsh16Ux16_0(v) 496 case OpRsh16Ux32: 497 return rewriteValue386_OpRsh16Ux32_0(v) 498 case OpRsh16Ux64: 499 return rewriteValue386_OpRsh16Ux64_0(v) 500 case OpRsh16Ux8: 501 return rewriteValue386_OpRsh16Ux8_0(v) 502 case OpRsh16x16: 503 return rewriteValue386_OpRsh16x16_0(v) 504 case OpRsh16x32: 505 return rewriteValue386_OpRsh16x32_0(v) 506 case OpRsh16x64: 507 return rewriteValue386_OpRsh16x64_0(v) 508 case OpRsh16x8: 509 return rewriteValue386_OpRsh16x8_0(v) 510 case OpRsh32Ux16: 511 return rewriteValue386_OpRsh32Ux16_0(v) 512 case OpRsh32Ux32: 513 return rewriteValue386_OpRsh32Ux32_0(v) 514 case OpRsh32Ux64: 515 return rewriteValue386_OpRsh32Ux64_0(v) 516 case OpRsh32Ux8: 517 return rewriteValue386_OpRsh32Ux8_0(v) 518 case OpRsh32x16: 519 return rewriteValue386_OpRsh32x16_0(v) 520 case OpRsh32x32: 521 return rewriteValue386_OpRsh32x32_0(v) 522 case OpRsh32x64: 523 return rewriteValue386_OpRsh32x64_0(v) 524 case OpRsh32x8: 525 return rewriteValue386_OpRsh32x8_0(v) 526 case OpRsh8Ux16: 527 return rewriteValue386_OpRsh8Ux16_0(v) 528 case OpRsh8Ux32: 529 return rewriteValue386_OpRsh8Ux32_0(v) 530 case OpRsh8Ux64: 531 return rewriteValue386_OpRsh8Ux64_0(v) 532 case OpRsh8Ux8: 533 return rewriteValue386_OpRsh8Ux8_0(v) 534 case OpRsh8x16: 535 return rewriteValue386_OpRsh8x16_0(v) 536 case OpRsh8x32: 537 return rewriteValue386_OpRsh8x32_0(v) 538 case OpRsh8x64: 539 return rewriteValue386_OpRsh8x64_0(v) 540 case OpRsh8x8: 541 return rewriteValue386_OpRsh8x8_0(v) 542 case OpSignExt16to32: 543 return rewriteValue386_OpSignExt16to32_0(v) 544 case OpSignExt8to16: 545 return rewriteValue386_OpSignExt8to16_0(v) 546 case OpSignExt8to32: 547 return rewriteValue386_OpSignExt8to32_0(v) 548 case OpSignmask: 549 return rewriteValue386_OpSignmask_0(v) 550 case OpSlicemask: 551 return rewriteValue386_OpSlicemask_0(v) 552 case OpSqrt: 553 return rewriteValue386_OpSqrt_0(v) 554 case OpStaticCall: 555 return rewriteValue386_OpStaticCall_0(v) 556 case OpStore: 557 return rewriteValue386_OpStore_0(v) 558 case OpSub16: 559 return rewriteValue386_OpSub16_0(v) 560 case OpSub32: 561 return rewriteValue386_OpSub32_0(v) 562 case OpSub32F: 563 return rewriteValue386_OpSub32F_0(v) 564 case OpSub32carry: 565 return rewriteValue386_OpSub32carry_0(v) 566 case OpSub32withcarry: 567 return rewriteValue386_OpSub32withcarry_0(v) 568 case OpSub64F: 569 return rewriteValue386_OpSub64F_0(v) 570 case OpSub8: 571 return rewriteValue386_OpSub8_0(v) 572 case OpSubPtr: 573 return rewriteValue386_OpSubPtr_0(v) 574 case OpTrunc16to8: 575 return rewriteValue386_OpTrunc16to8_0(v) 576 case OpTrunc32to16: 577 return rewriteValue386_OpTrunc32to16_0(v) 578 case OpTrunc32to8: 579 return rewriteValue386_OpTrunc32to8_0(v) 580 case OpWB: 581 return rewriteValue386_OpWB_0(v) 582 case OpXor16: 583 return rewriteValue386_OpXor16_0(v) 584 case OpXor32: 585 return rewriteValue386_OpXor32_0(v) 586 case OpXor8: 587 return rewriteValue386_OpXor8_0(v) 588 case OpZero: 589 return rewriteValue386_OpZero_0(v) || rewriteValue386_OpZero_10(v) 590 case OpZeroExt16to32: 591 return rewriteValue386_OpZeroExt16to32_0(v) 592 case OpZeroExt8to16: 593 return rewriteValue386_OpZeroExt8to16_0(v) 594 case OpZeroExt8to32: 595 return rewriteValue386_OpZeroExt8to32_0(v) 596 case OpZeromask: 597 return rewriteValue386_OpZeromask_0(v) 598 } 599 return false 600 } 601 func rewriteValue386_Op386ADCL_0(v *Value) bool { 602 // match: (ADCL x (MOVLconst [c]) f) 603 // cond: 604 // result: (ADCLconst [c] x f) 605 for { 606 _ = v.Args[2] 607 x := v.Args[0] 608 v_1 := v.Args[1] 609 if v_1.Op != Op386MOVLconst { 610 break 611 } 612 c := v_1.AuxInt 613 f := v.Args[2] 614 v.reset(Op386ADCLconst) 615 v.AuxInt = c 616 v.AddArg(x) 617 v.AddArg(f) 618 return true 619 } 620 // match: (ADCL (MOVLconst [c]) x f) 621 // cond: 622 // result: (ADCLconst [c] x f) 623 for { 624 _ = v.Args[2] 625 v_0 := v.Args[0] 626 if v_0.Op != Op386MOVLconst { 627 break 628 } 629 c := v_0.AuxInt 630 x := v.Args[1] 631 f := v.Args[2] 632 v.reset(Op386ADCLconst) 633 v.AuxInt = c 634 v.AddArg(x) 635 v.AddArg(f) 636 return true 637 } 638 // match: (ADCL (MOVLconst [c]) x f) 639 // cond: 640 // result: (ADCLconst [c] x f) 641 for { 642 _ = v.Args[2] 643 v_0 := v.Args[0] 644 if v_0.Op != Op386MOVLconst { 645 break 646 } 647 c := v_0.AuxInt 648 x := v.Args[1] 649 f := v.Args[2] 650 v.reset(Op386ADCLconst) 651 v.AuxInt = c 652 v.AddArg(x) 653 v.AddArg(f) 654 return true 655 } 656 // match: (ADCL x (MOVLconst [c]) f) 657 // cond: 658 // result: (ADCLconst [c] x f) 659 for { 660 _ = v.Args[2] 661 x := v.Args[0] 662 v_1 := v.Args[1] 663 if v_1.Op != Op386MOVLconst { 664 break 665 } 666 c := v_1.AuxInt 667 f := v.Args[2] 668 v.reset(Op386ADCLconst) 669 v.AuxInt = c 670 v.AddArg(x) 671 v.AddArg(f) 672 return true 673 } 674 return false 675 } 676 func rewriteValue386_Op386ADDL_0(v *Value) bool { 677 // match: (ADDL x (MOVLconst [c])) 678 // cond: 679 // result: (ADDLconst [c] x) 680 for { 681 _ = v.Args[1] 682 x := v.Args[0] 683 v_1 := v.Args[1] 684 if v_1.Op != Op386MOVLconst { 685 break 686 } 687 c := v_1.AuxInt 688 v.reset(Op386ADDLconst) 689 v.AuxInt = c 690 v.AddArg(x) 691 return true 692 } 693 // match: (ADDL (MOVLconst [c]) x) 694 // cond: 695 // result: (ADDLconst [c] x) 696 for { 697 _ = v.Args[1] 698 v_0 := v.Args[0] 699 if v_0.Op != Op386MOVLconst { 700 break 701 } 702 c := v_0.AuxInt 703 x := v.Args[1] 704 v.reset(Op386ADDLconst) 705 v.AuxInt = c 706 v.AddArg(x) 707 return true 708 } 709 // match: (ADDL (SHLLconst [c] x) (SHRLconst [d] x)) 710 // cond: d == 32-c 711 // result: (ROLLconst [c] x) 712 for { 713 _ = v.Args[1] 714 v_0 := v.Args[0] 715 if v_0.Op != Op386SHLLconst { 716 break 717 } 718 c := v_0.AuxInt 719 x := v_0.Args[0] 720 v_1 := v.Args[1] 721 if v_1.Op != Op386SHRLconst { 722 break 723 } 724 d := v_1.AuxInt 725 if x != v_1.Args[0] { 726 break 727 } 728 if !(d == 32-c) { 729 break 730 } 731 v.reset(Op386ROLLconst) 732 v.AuxInt = c 733 v.AddArg(x) 734 return true 735 } 736 // match: (ADDL (SHRLconst [d] x) (SHLLconst [c] x)) 737 // cond: d == 32-c 738 // result: (ROLLconst [c] x) 739 for { 740 _ = v.Args[1] 741 v_0 := v.Args[0] 742 if v_0.Op != Op386SHRLconst { 743 break 744 } 745 d := v_0.AuxInt 746 x := v_0.Args[0] 747 v_1 := v.Args[1] 748 if v_1.Op != Op386SHLLconst { 749 break 750 } 751 c := v_1.AuxInt 752 if x != v_1.Args[0] { 753 break 754 } 755 if !(d == 32-c) { 756 break 757 } 758 v.reset(Op386ROLLconst) 759 v.AuxInt = c 760 v.AddArg(x) 761 return true 762 } 763 // match: (ADDL <t> (SHLLconst x [c]) (SHRWconst x [d])) 764 // cond: c < 16 && d == 16-c && t.Size() == 2 765 // result: (ROLWconst x [c]) 766 for { 767 t := v.Type 768 _ = v.Args[1] 769 v_0 := v.Args[0] 770 if v_0.Op != Op386SHLLconst { 771 break 772 } 773 c := v_0.AuxInt 774 x := v_0.Args[0] 775 v_1 := v.Args[1] 776 if v_1.Op != Op386SHRWconst { 777 break 778 } 779 d := v_1.AuxInt 780 if x != v_1.Args[0] { 781 break 782 } 783 if !(c < 16 && d == 16-c && t.Size() == 2) { 784 break 785 } 786 v.reset(Op386ROLWconst) 787 v.AuxInt = c 788 v.AddArg(x) 789 return true 790 } 791 // match: (ADDL <t> (SHRWconst x [d]) (SHLLconst x [c])) 792 // cond: c < 16 && d == 16-c && t.Size() == 2 793 // result: (ROLWconst x [c]) 794 for { 795 t := v.Type 796 _ = v.Args[1] 797 v_0 := v.Args[0] 798 if v_0.Op != Op386SHRWconst { 799 break 800 } 801 d := v_0.AuxInt 802 x := v_0.Args[0] 803 v_1 := v.Args[1] 804 if v_1.Op != Op386SHLLconst { 805 break 806 } 807 c := v_1.AuxInt 808 if x != v_1.Args[0] { 809 break 810 } 811 if !(c < 16 && d == 16-c && t.Size() == 2) { 812 break 813 } 814 v.reset(Op386ROLWconst) 815 v.AuxInt = c 816 v.AddArg(x) 817 return true 818 } 819 // match: (ADDL <t> (SHLLconst x [c]) (SHRBconst x [d])) 820 // cond: c < 8 && d == 8-c && t.Size() == 1 821 // result: (ROLBconst x [c]) 822 for { 823 t := v.Type 824 _ = v.Args[1] 825 v_0 := v.Args[0] 826 if v_0.Op != Op386SHLLconst { 827 break 828 } 829 c := v_0.AuxInt 830 x := v_0.Args[0] 831 v_1 := v.Args[1] 832 if v_1.Op != Op386SHRBconst { 833 break 834 } 835 d := v_1.AuxInt 836 if x != v_1.Args[0] { 837 break 838 } 839 if !(c < 8 && d == 8-c && t.Size() == 1) { 840 break 841 } 842 v.reset(Op386ROLBconst) 843 v.AuxInt = c 844 v.AddArg(x) 845 return true 846 } 847 // match: (ADDL <t> (SHRBconst x [d]) (SHLLconst x [c])) 848 // cond: c < 8 && d == 8-c && t.Size() == 1 849 // result: (ROLBconst x [c]) 850 for { 851 t := v.Type 852 _ = v.Args[1] 853 v_0 := v.Args[0] 854 if v_0.Op != Op386SHRBconst { 855 break 856 } 857 d := v_0.AuxInt 858 x := v_0.Args[0] 859 v_1 := v.Args[1] 860 if v_1.Op != Op386SHLLconst { 861 break 862 } 863 c := v_1.AuxInt 864 if x != v_1.Args[0] { 865 break 866 } 867 if !(c < 8 && d == 8-c && t.Size() == 1) { 868 break 869 } 870 v.reset(Op386ROLBconst) 871 v.AuxInt = c 872 v.AddArg(x) 873 return true 874 } 875 // match: (ADDL x (SHLLconst [3] y)) 876 // cond: 877 // result: (LEAL8 x y) 878 for { 879 _ = v.Args[1] 880 x := v.Args[0] 881 v_1 := v.Args[1] 882 if v_1.Op != Op386SHLLconst { 883 break 884 } 885 if v_1.AuxInt != 3 { 886 break 887 } 888 y := v_1.Args[0] 889 v.reset(Op386LEAL8) 890 v.AddArg(x) 891 v.AddArg(y) 892 return true 893 } 894 // match: (ADDL (SHLLconst [3] y) x) 895 // cond: 896 // result: (LEAL8 x y) 897 for { 898 _ = v.Args[1] 899 v_0 := v.Args[0] 900 if v_0.Op != Op386SHLLconst { 901 break 902 } 903 if v_0.AuxInt != 3 { 904 break 905 } 906 y := v_0.Args[0] 907 x := v.Args[1] 908 v.reset(Op386LEAL8) 909 v.AddArg(x) 910 v.AddArg(y) 911 return true 912 } 913 return false 914 } 915 func rewriteValue386_Op386ADDL_10(v *Value) bool { 916 // match: (ADDL x (SHLLconst [2] y)) 917 // cond: 918 // result: (LEAL4 x y) 919 for { 920 _ = v.Args[1] 921 x := v.Args[0] 922 v_1 := v.Args[1] 923 if v_1.Op != Op386SHLLconst { 924 break 925 } 926 if v_1.AuxInt != 2 { 927 break 928 } 929 y := v_1.Args[0] 930 v.reset(Op386LEAL4) 931 v.AddArg(x) 932 v.AddArg(y) 933 return true 934 } 935 // match: (ADDL (SHLLconst [2] y) x) 936 // cond: 937 // result: (LEAL4 x y) 938 for { 939 _ = v.Args[1] 940 v_0 := v.Args[0] 941 if v_0.Op != Op386SHLLconst { 942 break 943 } 944 if v_0.AuxInt != 2 { 945 break 946 } 947 y := v_0.Args[0] 948 x := v.Args[1] 949 v.reset(Op386LEAL4) 950 v.AddArg(x) 951 v.AddArg(y) 952 return true 953 } 954 // match: (ADDL x (SHLLconst [1] y)) 955 // cond: 956 // result: (LEAL2 x y) 957 for { 958 _ = v.Args[1] 959 x := v.Args[0] 960 v_1 := v.Args[1] 961 if v_1.Op != Op386SHLLconst { 962 break 963 } 964 if v_1.AuxInt != 1 { 965 break 966 } 967 y := v_1.Args[0] 968 v.reset(Op386LEAL2) 969 v.AddArg(x) 970 v.AddArg(y) 971 return true 972 } 973 // match: (ADDL (SHLLconst [1] y) x) 974 // cond: 975 // result: (LEAL2 x y) 976 for { 977 _ = v.Args[1] 978 v_0 := v.Args[0] 979 if v_0.Op != Op386SHLLconst { 980 break 981 } 982 if v_0.AuxInt != 1 { 983 break 984 } 985 y := v_0.Args[0] 986 x := v.Args[1] 987 v.reset(Op386LEAL2) 988 v.AddArg(x) 989 v.AddArg(y) 990 return true 991 } 992 // match: (ADDL x (ADDL y y)) 993 // cond: 994 // result: (LEAL2 x y) 995 for { 996 _ = v.Args[1] 997 x := v.Args[0] 998 v_1 := v.Args[1] 999 if v_1.Op != Op386ADDL { 1000 break 1001 } 1002 _ = v_1.Args[1] 1003 y := v_1.Args[0] 1004 if y != v_1.Args[1] { 1005 break 1006 } 1007 v.reset(Op386LEAL2) 1008 v.AddArg(x) 1009 v.AddArg(y) 1010 return true 1011 } 1012 // match: (ADDL (ADDL y y) x) 1013 // cond: 1014 // result: (LEAL2 x y) 1015 for { 1016 _ = v.Args[1] 1017 v_0 := v.Args[0] 1018 if v_0.Op != Op386ADDL { 1019 break 1020 } 1021 _ = v_0.Args[1] 1022 y := v_0.Args[0] 1023 if y != v_0.Args[1] { 1024 break 1025 } 1026 x := v.Args[1] 1027 v.reset(Op386LEAL2) 1028 v.AddArg(x) 1029 v.AddArg(y) 1030 return true 1031 } 1032 // match: (ADDL x (ADDL x y)) 1033 // cond: 1034 // result: (LEAL2 y x) 1035 for { 1036 _ = v.Args[1] 1037 x := v.Args[0] 1038 v_1 := v.Args[1] 1039 if v_1.Op != Op386ADDL { 1040 break 1041 } 1042 _ = v_1.Args[1] 1043 if x != v_1.Args[0] { 1044 break 1045 } 1046 y := v_1.Args[1] 1047 v.reset(Op386LEAL2) 1048 v.AddArg(y) 1049 v.AddArg(x) 1050 return true 1051 } 1052 // match: (ADDL x (ADDL y x)) 1053 // cond: 1054 // result: (LEAL2 y x) 1055 for { 1056 _ = v.Args[1] 1057 x := v.Args[0] 1058 v_1 := v.Args[1] 1059 if v_1.Op != Op386ADDL { 1060 break 1061 } 1062 _ = v_1.Args[1] 1063 y := v_1.Args[0] 1064 if x != v_1.Args[1] { 1065 break 1066 } 1067 v.reset(Op386LEAL2) 1068 v.AddArg(y) 1069 v.AddArg(x) 1070 return true 1071 } 1072 // match: (ADDL (ADDL x y) x) 1073 // cond: 1074 // result: (LEAL2 y x) 1075 for { 1076 _ = v.Args[1] 1077 v_0 := v.Args[0] 1078 if v_0.Op != Op386ADDL { 1079 break 1080 } 1081 _ = v_0.Args[1] 1082 x := v_0.Args[0] 1083 y := v_0.Args[1] 1084 if x != v.Args[1] { 1085 break 1086 } 1087 v.reset(Op386LEAL2) 1088 v.AddArg(y) 1089 v.AddArg(x) 1090 return true 1091 } 1092 // match: (ADDL (ADDL y x) x) 1093 // cond: 1094 // result: (LEAL2 y x) 1095 for { 1096 _ = v.Args[1] 1097 v_0 := v.Args[0] 1098 if v_0.Op != Op386ADDL { 1099 break 1100 } 1101 _ = v_0.Args[1] 1102 y := v_0.Args[0] 1103 x := v_0.Args[1] 1104 if x != v.Args[1] { 1105 break 1106 } 1107 v.reset(Op386LEAL2) 1108 v.AddArg(y) 1109 v.AddArg(x) 1110 return true 1111 } 1112 return false 1113 } 1114 func rewriteValue386_Op386ADDL_20(v *Value) bool { 1115 // match: (ADDL (ADDLconst [c] x) y) 1116 // cond: 1117 // result: (LEAL1 [c] x y) 1118 for { 1119 _ = v.Args[1] 1120 v_0 := v.Args[0] 1121 if v_0.Op != Op386ADDLconst { 1122 break 1123 } 1124 c := v_0.AuxInt 1125 x := v_0.Args[0] 1126 y := v.Args[1] 1127 v.reset(Op386LEAL1) 1128 v.AuxInt = c 1129 v.AddArg(x) 1130 v.AddArg(y) 1131 return true 1132 } 1133 // match: (ADDL y (ADDLconst [c] x)) 1134 // cond: 1135 // result: (LEAL1 [c] x y) 1136 for { 1137 _ = v.Args[1] 1138 y := v.Args[0] 1139 v_1 := v.Args[1] 1140 if v_1.Op != Op386ADDLconst { 1141 break 1142 } 1143 c := v_1.AuxInt 1144 x := v_1.Args[0] 1145 v.reset(Op386LEAL1) 1146 v.AuxInt = c 1147 v.AddArg(x) 1148 v.AddArg(y) 1149 return true 1150 } 1151 // match: (ADDL x (LEAL [c] {s} y)) 1152 // cond: x.Op != OpSB && y.Op != OpSB 1153 // result: (LEAL1 [c] {s} x y) 1154 for { 1155 _ = v.Args[1] 1156 x := v.Args[0] 1157 v_1 := v.Args[1] 1158 if v_1.Op != Op386LEAL { 1159 break 1160 } 1161 c := v_1.AuxInt 1162 s := v_1.Aux 1163 y := v_1.Args[0] 1164 if !(x.Op != OpSB && y.Op != OpSB) { 1165 break 1166 } 1167 v.reset(Op386LEAL1) 1168 v.AuxInt = c 1169 v.Aux = s 1170 v.AddArg(x) 1171 v.AddArg(y) 1172 return true 1173 } 1174 // match: (ADDL (LEAL [c] {s} y) x) 1175 // cond: x.Op != OpSB && y.Op != OpSB 1176 // result: (LEAL1 [c] {s} x y) 1177 for { 1178 _ = v.Args[1] 1179 v_0 := v.Args[0] 1180 if v_0.Op != Op386LEAL { 1181 break 1182 } 1183 c := v_0.AuxInt 1184 s := v_0.Aux 1185 y := v_0.Args[0] 1186 x := v.Args[1] 1187 if !(x.Op != OpSB && y.Op != OpSB) { 1188 break 1189 } 1190 v.reset(Op386LEAL1) 1191 v.AuxInt = c 1192 v.Aux = s 1193 v.AddArg(x) 1194 v.AddArg(y) 1195 return true 1196 } 1197 // match: (ADDL x (NEGL y)) 1198 // cond: 1199 // result: (SUBL x y) 1200 for { 1201 _ = v.Args[1] 1202 x := v.Args[0] 1203 v_1 := v.Args[1] 1204 if v_1.Op != Op386NEGL { 1205 break 1206 } 1207 y := v_1.Args[0] 1208 v.reset(Op386SUBL) 1209 v.AddArg(x) 1210 v.AddArg(y) 1211 return true 1212 } 1213 // match: (ADDL (NEGL y) x) 1214 // cond: 1215 // result: (SUBL x y) 1216 for { 1217 _ = v.Args[1] 1218 v_0 := v.Args[0] 1219 if v_0.Op != Op386NEGL { 1220 break 1221 } 1222 y := v_0.Args[0] 1223 x := v.Args[1] 1224 v.reset(Op386SUBL) 1225 v.AddArg(x) 1226 v.AddArg(y) 1227 return true 1228 } 1229 return false 1230 } 1231 func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { 1232 // match: (ADDLcarry x (MOVLconst [c])) 1233 // cond: 1234 // result: (ADDLconstcarry [c] x) 1235 for { 1236 _ = v.Args[1] 1237 x := v.Args[0] 1238 v_1 := v.Args[1] 1239 if v_1.Op != Op386MOVLconst { 1240 break 1241 } 1242 c := v_1.AuxInt 1243 v.reset(Op386ADDLconstcarry) 1244 v.AuxInt = c 1245 v.AddArg(x) 1246 return true 1247 } 1248 // match: (ADDLcarry (MOVLconst [c]) x) 1249 // cond: 1250 // result: (ADDLconstcarry [c] x) 1251 for { 1252 _ = v.Args[1] 1253 v_0 := v.Args[0] 1254 if v_0.Op != Op386MOVLconst { 1255 break 1256 } 1257 c := v_0.AuxInt 1258 x := v.Args[1] 1259 v.reset(Op386ADDLconstcarry) 1260 v.AuxInt = c 1261 v.AddArg(x) 1262 return true 1263 } 1264 return false 1265 } 1266 func rewriteValue386_Op386ADDLconst_0(v *Value) bool { 1267 // match: (ADDLconst [c] (ADDL x y)) 1268 // cond: 1269 // result: (LEAL1 [c] x y) 1270 for { 1271 c := v.AuxInt 1272 v_0 := v.Args[0] 1273 if v_0.Op != Op386ADDL { 1274 break 1275 } 1276 _ = v_0.Args[1] 1277 x := v_0.Args[0] 1278 y := v_0.Args[1] 1279 v.reset(Op386LEAL1) 1280 v.AuxInt = c 1281 v.AddArg(x) 1282 v.AddArg(y) 1283 return true 1284 } 1285 // match: (ADDLconst [c] (LEAL [d] {s} x)) 1286 // cond: is32Bit(c+d) 1287 // result: (LEAL [c+d] {s} x) 1288 for { 1289 c := v.AuxInt 1290 v_0 := v.Args[0] 1291 if v_0.Op != Op386LEAL { 1292 break 1293 } 1294 d := v_0.AuxInt 1295 s := v_0.Aux 1296 x := v_0.Args[0] 1297 if !(is32Bit(c + d)) { 1298 break 1299 } 1300 v.reset(Op386LEAL) 1301 v.AuxInt = c + d 1302 v.Aux = s 1303 v.AddArg(x) 1304 return true 1305 } 1306 // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) 1307 // cond: is32Bit(c+d) 1308 // result: (LEAL1 [c+d] {s} x y) 1309 for { 1310 c := v.AuxInt 1311 v_0 := v.Args[0] 1312 if v_0.Op != Op386LEAL1 { 1313 break 1314 } 1315 d := v_0.AuxInt 1316 s := v_0.Aux 1317 _ = v_0.Args[1] 1318 x := v_0.Args[0] 1319 y := v_0.Args[1] 1320 if !(is32Bit(c + d)) { 1321 break 1322 } 1323 v.reset(Op386LEAL1) 1324 v.AuxInt = c + d 1325 v.Aux = s 1326 v.AddArg(x) 1327 v.AddArg(y) 1328 return true 1329 } 1330 // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) 1331 // cond: is32Bit(c+d) 1332 // result: (LEAL2 [c+d] {s} x y) 1333 for { 1334 c := v.AuxInt 1335 v_0 := v.Args[0] 1336 if v_0.Op != Op386LEAL2 { 1337 break 1338 } 1339 d := v_0.AuxInt 1340 s := v_0.Aux 1341 _ = v_0.Args[1] 1342 x := v_0.Args[0] 1343 y := v_0.Args[1] 1344 if !(is32Bit(c + d)) { 1345 break 1346 } 1347 v.reset(Op386LEAL2) 1348 v.AuxInt = c + d 1349 v.Aux = s 1350 v.AddArg(x) 1351 v.AddArg(y) 1352 return true 1353 } 1354 // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) 1355 // cond: is32Bit(c+d) 1356 // result: (LEAL4 [c+d] {s} x y) 1357 for { 1358 c := v.AuxInt 1359 v_0 := v.Args[0] 1360 if v_0.Op != Op386LEAL4 { 1361 break 1362 } 1363 d := v_0.AuxInt 1364 s := v_0.Aux 1365 _ = v_0.Args[1] 1366 x := v_0.Args[0] 1367 y := v_0.Args[1] 1368 if !(is32Bit(c + d)) { 1369 break 1370 } 1371 v.reset(Op386LEAL4) 1372 v.AuxInt = c + d 1373 v.Aux = s 1374 v.AddArg(x) 1375 v.AddArg(y) 1376 return true 1377 } 1378 // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) 1379 // cond: is32Bit(c+d) 1380 // result: (LEAL8 [c+d] {s} x y) 1381 for { 1382 c := v.AuxInt 1383 v_0 := v.Args[0] 1384 if v_0.Op != Op386LEAL8 { 1385 break 1386 } 1387 d := v_0.AuxInt 1388 s := v_0.Aux 1389 _ = v_0.Args[1] 1390 x := v_0.Args[0] 1391 y := v_0.Args[1] 1392 if !(is32Bit(c + d)) { 1393 break 1394 } 1395 v.reset(Op386LEAL8) 1396 v.AuxInt = c + d 1397 v.Aux = s 1398 v.AddArg(x) 1399 v.AddArg(y) 1400 return true 1401 } 1402 // match: (ADDLconst [c] x) 1403 // cond: int32(c)==0 1404 // result: x 1405 for { 1406 c := v.AuxInt 1407 x := v.Args[0] 1408 if !(int32(c) == 0) { 1409 break 1410 } 1411 v.reset(OpCopy) 1412 v.Type = x.Type 1413 v.AddArg(x) 1414 return true 1415 } 1416 // match: (ADDLconst [c] (MOVLconst [d])) 1417 // cond: 1418 // result: (MOVLconst [int64(int32(c+d))]) 1419 for { 1420 c := v.AuxInt 1421 v_0 := v.Args[0] 1422 if v_0.Op != Op386MOVLconst { 1423 break 1424 } 1425 d := v_0.AuxInt 1426 v.reset(Op386MOVLconst) 1427 v.AuxInt = int64(int32(c + d)) 1428 return true 1429 } 1430 // match: (ADDLconst [c] (ADDLconst [d] x)) 1431 // cond: 1432 // result: (ADDLconst [int64(int32(c+d))] x) 1433 for { 1434 c := v.AuxInt 1435 v_0 := v.Args[0] 1436 if v_0.Op != Op386ADDLconst { 1437 break 1438 } 1439 d := v_0.AuxInt 1440 x := v_0.Args[0] 1441 v.reset(Op386ADDLconst) 1442 v.AuxInt = int64(int32(c + d)) 1443 v.AddArg(x) 1444 return true 1445 } 1446 return false 1447 } 1448 func rewriteValue386_Op386ANDL_0(v *Value) bool { 1449 // match: (ANDL x (MOVLconst [c])) 1450 // cond: 1451 // result: (ANDLconst [c] x) 1452 for { 1453 _ = v.Args[1] 1454 x := v.Args[0] 1455 v_1 := v.Args[1] 1456 if v_1.Op != Op386MOVLconst { 1457 break 1458 } 1459 c := v_1.AuxInt 1460 v.reset(Op386ANDLconst) 1461 v.AuxInt = c 1462 v.AddArg(x) 1463 return true 1464 } 1465 // match: (ANDL (MOVLconst [c]) x) 1466 // cond: 1467 // result: (ANDLconst [c] x) 1468 for { 1469 _ = v.Args[1] 1470 v_0 := v.Args[0] 1471 if v_0.Op != Op386MOVLconst { 1472 break 1473 } 1474 c := v_0.AuxInt 1475 x := v.Args[1] 1476 v.reset(Op386ANDLconst) 1477 v.AuxInt = c 1478 v.AddArg(x) 1479 return true 1480 } 1481 // match: (ANDL x x) 1482 // cond: 1483 // result: x 1484 for { 1485 _ = v.Args[1] 1486 x := v.Args[0] 1487 if x != v.Args[1] { 1488 break 1489 } 1490 v.reset(OpCopy) 1491 v.Type = x.Type 1492 v.AddArg(x) 1493 return true 1494 } 1495 return false 1496 } 1497 func rewriteValue386_Op386ANDLconst_0(v *Value) bool { 1498 // match: (ANDLconst [c] (ANDLconst [d] x)) 1499 // cond: 1500 // result: (ANDLconst [c & d] x) 1501 for { 1502 c := v.AuxInt 1503 v_0 := v.Args[0] 1504 if v_0.Op != Op386ANDLconst { 1505 break 1506 } 1507 d := v_0.AuxInt 1508 x := v_0.Args[0] 1509 v.reset(Op386ANDLconst) 1510 v.AuxInt = c & d 1511 v.AddArg(x) 1512 return true 1513 } 1514 // match: (ANDLconst [c] _) 1515 // cond: int32(c)==0 1516 // result: (MOVLconst [0]) 1517 for { 1518 c := v.AuxInt 1519 if !(int32(c) == 0) { 1520 break 1521 } 1522 v.reset(Op386MOVLconst) 1523 v.AuxInt = 0 1524 return true 1525 } 1526 // match: (ANDLconst [c] x) 1527 // cond: int32(c)==-1 1528 // result: x 1529 for { 1530 c := v.AuxInt 1531 x := v.Args[0] 1532 if !(int32(c) == -1) { 1533 break 1534 } 1535 v.reset(OpCopy) 1536 v.Type = x.Type 1537 v.AddArg(x) 1538 return true 1539 } 1540 // match: (ANDLconst [c] (MOVLconst [d])) 1541 // cond: 1542 // result: (MOVLconst [c&d]) 1543 for { 1544 c := v.AuxInt 1545 v_0 := v.Args[0] 1546 if v_0.Op != Op386MOVLconst { 1547 break 1548 } 1549 d := v_0.AuxInt 1550 v.reset(Op386MOVLconst) 1551 v.AuxInt = c & d 1552 return true 1553 } 1554 return false 1555 } 1556 func rewriteValue386_Op386CMPB_0(v *Value) bool { 1557 b := v.Block 1558 _ = b 1559 // match: (CMPB x (MOVLconst [c])) 1560 // cond: 1561 // result: (CMPBconst x [int64(int8(c))]) 1562 for { 1563 _ = v.Args[1] 1564 x := v.Args[0] 1565 v_1 := v.Args[1] 1566 if v_1.Op != Op386MOVLconst { 1567 break 1568 } 1569 c := v_1.AuxInt 1570 v.reset(Op386CMPBconst) 1571 v.AuxInt = int64(int8(c)) 1572 v.AddArg(x) 1573 return true 1574 } 1575 // match: (CMPB (MOVLconst [c]) x) 1576 // cond: 1577 // result: (InvertFlags (CMPBconst x [int64(int8(c))])) 1578 for { 1579 _ = v.Args[1] 1580 v_0 := v.Args[0] 1581 if v_0.Op != Op386MOVLconst { 1582 break 1583 } 1584 c := v_0.AuxInt 1585 x := v.Args[1] 1586 v.reset(Op386InvertFlags) 1587 v0 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 1588 v0.AuxInt = int64(int8(c)) 1589 v0.AddArg(x) 1590 v.AddArg(v0) 1591 return true 1592 } 1593 return false 1594 } 1595 func rewriteValue386_Op386CMPBconst_0(v *Value) bool { 1596 // match: (CMPBconst (MOVLconst [x]) [y]) 1597 // cond: int8(x)==int8(y) 1598 // result: (FlagEQ) 1599 for { 1600 y := v.AuxInt 1601 v_0 := v.Args[0] 1602 if v_0.Op != Op386MOVLconst { 1603 break 1604 } 1605 x := v_0.AuxInt 1606 if !(int8(x) == int8(y)) { 1607 break 1608 } 1609 v.reset(Op386FlagEQ) 1610 return true 1611 } 1612 // match: (CMPBconst (MOVLconst [x]) [y]) 1613 // cond: int8(x)<int8(y) && uint8(x)<uint8(y) 1614 // result: (FlagLT_ULT) 1615 for { 1616 y := v.AuxInt 1617 v_0 := v.Args[0] 1618 if v_0.Op != Op386MOVLconst { 1619 break 1620 } 1621 x := v_0.AuxInt 1622 if !(int8(x) < int8(y) && uint8(x) < uint8(y)) { 1623 break 1624 } 1625 v.reset(Op386FlagLT_ULT) 1626 return true 1627 } 1628 // match: (CMPBconst (MOVLconst [x]) [y]) 1629 // cond: int8(x)<int8(y) && uint8(x)>uint8(y) 1630 // result: (FlagLT_UGT) 1631 for { 1632 y := v.AuxInt 1633 v_0 := v.Args[0] 1634 if v_0.Op != Op386MOVLconst { 1635 break 1636 } 1637 x := v_0.AuxInt 1638 if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { 1639 break 1640 } 1641 v.reset(Op386FlagLT_UGT) 1642 return true 1643 } 1644 // match: (CMPBconst (MOVLconst [x]) [y]) 1645 // cond: int8(x)>int8(y) && uint8(x)<uint8(y) 1646 // result: (FlagGT_ULT) 1647 for { 1648 y := v.AuxInt 1649 v_0 := v.Args[0] 1650 if v_0.Op != Op386MOVLconst { 1651 break 1652 } 1653 x := v_0.AuxInt 1654 if !(int8(x) > int8(y) && uint8(x) < uint8(y)) { 1655 break 1656 } 1657 v.reset(Op386FlagGT_ULT) 1658 return true 1659 } 1660 // match: (CMPBconst (MOVLconst [x]) [y]) 1661 // cond: int8(x)>int8(y) && uint8(x)>uint8(y) 1662 // result: (FlagGT_UGT) 1663 for { 1664 y := v.AuxInt 1665 v_0 := v.Args[0] 1666 if v_0.Op != Op386MOVLconst { 1667 break 1668 } 1669 x := v_0.AuxInt 1670 if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { 1671 break 1672 } 1673 v.reset(Op386FlagGT_UGT) 1674 return true 1675 } 1676 // match: (CMPBconst (ANDLconst _ [m]) [n]) 1677 // cond: 0 <= int8(m) && int8(m) < int8(n) 1678 // result: (FlagLT_ULT) 1679 for { 1680 n := v.AuxInt 1681 v_0 := v.Args[0] 1682 if v_0.Op != Op386ANDLconst { 1683 break 1684 } 1685 m := v_0.AuxInt 1686 if !(0 <= int8(m) && int8(m) < int8(n)) { 1687 break 1688 } 1689 v.reset(Op386FlagLT_ULT) 1690 return true 1691 } 1692 // match: (CMPBconst (ANDL x y) [0]) 1693 // cond: 1694 // result: (TESTB x y) 1695 for { 1696 if v.AuxInt != 0 { 1697 break 1698 } 1699 v_0 := v.Args[0] 1700 if v_0.Op != Op386ANDL { 1701 break 1702 } 1703 _ = v_0.Args[1] 1704 x := v_0.Args[0] 1705 y := v_0.Args[1] 1706 v.reset(Op386TESTB) 1707 v.AddArg(x) 1708 v.AddArg(y) 1709 return true 1710 } 1711 // match: (CMPBconst (ANDLconst [c] x) [0]) 1712 // cond: 1713 // result: (TESTBconst [int64(int8(c))] x) 1714 for { 1715 if v.AuxInt != 0 { 1716 break 1717 } 1718 v_0 := v.Args[0] 1719 if v_0.Op != Op386ANDLconst { 1720 break 1721 } 1722 c := v_0.AuxInt 1723 x := v_0.Args[0] 1724 v.reset(Op386TESTBconst) 1725 v.AuxInt = int64(int8(c)) 1726 v.AddArg(x) 1727 return true 1728 } 1729 // match: (CMPBconst x [0]) 1730 // cond: 1731 // result: (TESTB x x) 1732 for { 1733 if v.AuxInt != 0 { 1734 break 1735 } 1736 x := v.Args[0] 1737 v.reset(Op386TESTB) 1738 v.AddArg(x) 1739 v.AddArg(x) 1740 return true 1741 } 1742 return false 1743 } 1744 func rewriteValue386_Op386CMPL_0(v *Value) bool { 1745 b := v.Block 1746 _ = b 1747 // match: (CMPL x (MOVLconst [c])) 1748 // cond: 1749 // result: (CMPLconst x [c]) 1750 for { 1751 _ = v.Args[1] 1752 x := v.Args[0] 1753 v_1 := v.Args[1] 1754 if v_1.Op != Op386MOVLconst { 1755 break 1756 } 1757 c := v_1.AuxInt 1758 v.reset(Op386CMPLconst) 1759 v.AuxInt = c 1760 v.AddArg(x) 1761 return true 1762 } 1763 // match: (CMPL (MOVLconst [c]) x) 1764 // cond: 1765 // result: (InvertFlags (CMPLconst x [c])) 1766 for { 1767 _ = v.Args[1] 1768 v_0 := v.Args[0] 1769 if v_0.Op != Op386MOVLconst { 1770 break 1771 } 1772 c := v_0.AuxInt 1773 x := v.Args[1] 1774 v.reset(Op386InvertFlags) 1775 v0 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 1776 v0.AuxInt = c 1777 v0.AddArg(x) 1778 v.AddArg(v0) 1779 return true 1780 } 1781 return false 1782 } 1783 func rewriteValue386_Op386CMPLconst_0(v *Value) bool { 1784 // match: (CMPLconst (MOVLconst [x]) [y]) 1785 // cond: int32(x)==int32(y) 1786 // result: (FlagEQ) 1787 for { 1788 y := v.AuxInt 1789 v_0 := v.Args[0] 1790 if v_0.Op != Op386MOVLconst { 1791 break 1792 } 1793 x := v_0.AuxInt 1794 if !(int32(x) == int32(y)) { 1795 break 1796 } 1797 v.reset(Op386FlagEQ) 1798 return true 1799 } 1800 // match: (CMPLconst (MOVLconst [x]) [y]) 1801 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 1802 // result: (FlagLT_ULT) 1803 for { 1804 y := v.AuxInt 1805 v_0 := v.Args[0] 1806 if v_0.Op != Op386MOVLconst { 1807 break 1808 } 1809 x := v_0.AuxInt 1810 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 1811 break 1812 } 1813 v.reset(Op386FlagLT_ULT) 1814 return true 1815 } 1816 // match: (CMPLconst (MOVLconst [x]) [y]) 1817 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 1818 // result: (FlagLT_UGT) 1819 for { 1820 y := v.AuxInt 1821 v_0 := v.Args[0] 1822 if v_0.Op != Op386MOVLconst { 1823 break 1824 } 1825 x := v_0.AuxInt 1826 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 1827 break 1828 } 1829 v.reset(Op386FlagLT_UGT) 1830 return true 1831 } 1832 // match: (CMPLconst (MOVLconst [x]) [y]) 1833 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 1834 // result: (FlagGT_ULT) 1835 for { 1836 y := v.AuxInt 1837 v_0 := v.Args[0] 1838 if v_0.Op != Op386MOVLconst { 1839 break 1840 } 1841 x := v_0.AuxInt 1842 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 1843 break 1844 } 1845 v.reset(Op386FlagGT_ULT) 1846 return true 1847 } 1848 // match: (CMPLconst (MOVLconst [x]) [y]) 1849 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 1850 // result: (FlagGT_UGT) 1851 for { 1852 y := v.AuxInt 1853 v_0 := v.Args[0] 1854 if v_0.Op != Op386MOVLconst { 1855 break 1856 } 1857 x := v_0.AuxInt 1858 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 1859 break 1860 } 1861 v.reset(Op386FlagGT_UGT) 1862 return true 1863 } 1864 // match: (CMPLconst (SHRLconst _ [c]) [n]) 1865 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 1866 // result: (FlagLT_ULT) 1867 for { 1868 n := v.AuxInt 1869 v_0 := v.Args[0] 1870 if v_0.Op != Op386SHRLconst { 1871 break 1872 } 1873 c := v_0.AuxInt 1874 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 1875 break 1876 } 1877 v.reset(Op386FlagLT_ULT) 1878 return true 1879 } 1880 // match: (CMPLconst (ANDLconst _ [m]) [n]) 1881 // cond: 0 <= int32(m) && int32(m) < int32(n) 1882 // result: (FlagLT_ULT) 1883 for { 1884 n := v.AuxInt 1885 v_0 := v.Args[0] 1886 if v_0.Op != Op386ANDLconst { 1887 break 1888 } 1889 m := v_0.AuxInt 1890 if !(0 <= int32(m) && int32(m) < int32(n)) { 1891 break 1892 } 1893 v.reset(Op386FlagLT_ULT) 1894 return true 1895 } 1896 // match: (CMPLconst (ANDL x y) [0]) 1897 // cond: 1898 // result: (TESTL x y) 1899 for { 1900 if v.AuxInt != 0 { 1901 break 1902 } 1903 v_0 := v.Args[0] 1904 if v_0.Op != Op386ANDL { 1905 break 1906 } 1907 _ = v_0.Args[1] 1908 x := v_0.Args[0] 1909 y := v_0.Args[1] 1910 v.reset(Op386TESTL) 1911 v.AddArg(x) 1912 v.AddArg(y) 1913 return true 1914 } 1915 // match: (CMPLconst (ANDLconst [c] x) [0]) 1916 // cond: 1917 // result: (TESTLconst [c] x) 1918 for { 1919 if v.AuxInt != 0 { 1920 break 1921 } 1922 v_0 := v.Args[0] 1923 if v_0.Op != Op386ANDLconst { 1924 break 1925 } 1926 c := v_0.AuxInt 1927 x := v_0.Args[0] 1928 v.reset(Op386TESTLconst) 1929 v.AuxInt = c 1930 v.AddArg(x) 1931 return true 1932 } 1933 // match: (CMPLconst x [0]) 1934 // cond: 1935 // result: (TESTL x x) 1936 for { 1937 if v.AuxInt != 0 { 1938 break 1939 } 1940 x := v.Args[0] 1941 v.reset(Op386TESTL) 1942 v.AddArg(x) 1943 v.AddArg(x) 1944 return true 1945 } 1946 return false 1947 } 1948 func rewriteValue386_Op386CMPW_0(v *Value) bool { 1949 b := v.Block 1950 _ = b 1951 // match: (CMPW x (MOVLconst [c])) 1952 // cond: 1953 // result: (CMPWconst x [int64(int16(c))]) 1954 for { 1955 _ = v.Args[1] 1956 x := v.Args[0] 1957 v_1 := v.Args[1] 1958 if v_1.Op != Op386MOVLconst { 1959 break 1960 } 1961 c := v_1.AuxInt 1962 v.reset(Op386CMPWconst) 1963 v.AuxInt = int64(int16(c)) 1964 v.AddArg(x) 1965 return true 1966 } 1967 // match: (CMPW (MOVLconst [c]) x) 1968 // cond: 1969 // result: (InvertFlags (CMPWconst x [int64(int16(c))])) 1970 for { 1971 _ = v.Args[1] 1972 v_0 := v.Args[0] 1973 if v_0.Op != Op386MOVLconst { 1974 break 1975 } 1976 c := v_0.AuxInt 1977 x := v.Args[1] 1978 v.reset(Op386InvertFlags) 1979 v0 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 1980 v0.AuxInt = int64(int16(c)) 1981 v0.AddArg(x) 1982 v.AddArg(v0) 1983 return true 1984 } 1985 return false 1986 } 1987 func rewriteValue386_Op386CMPWconst_0(v *Value) bool { 1988 // match: (CMPWconst (MOVLconst [x]) [y]) 1989 // cond: int16(x)==int16(y) 1990 // result: (FlagEQ) 1991 for { 1992 y := v.AuxInt 1993 v_0 := v.Args[0] 1994 if v_0.Op != Op386MOVLconst { 1995 break 1996 } 1997 x := v_0.AuxInt 1998 if !(int16(x) == int16(y)) { 1999 break 2000 } 2001 v.reset(Op386FlagEQ) 2002 return true 2003 } 2004 // match: (CMPWconst (MOVLconst [x]) [y]) 2005 // cond: int16(x)<int16(y) && uint16(x)<uint16(y) 2006 // result: (FlagLT_ULT) 2007 for { 2008 y := v.AuxInt 2009 v_0 := v.Args[0] 2010 if v_0.Op != Op386MOVLconst { 2011 break 2012 } 2013 x := v_0.AuxInt 2014 if !(int16(x) < int16(y) && uint16(x) < uint16(y)) { 2015 break 2016 } 2017 v.reset(Op386FlagLT_ULT) 2018 return true 2019 } 2020 // match: (CMPWconst (MOVLconst [x]) [y]) 2021 // cond: int16(x)<int16(y) && uint16(x)>uint16(y) 2022 // result: (FlagLT_UGT) 2023 for { 2024 y := v.AuxInt 2025 v_0 := v.Args[0] 2026 if v_0.Op != Op386MOVLconst { 2027 break 2028 } 2029 x := v_0.AuxInt 2030 if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { 2031 break 2032 } 2033 v.reset(Op386FlagLT_UGT) 2034 return true 2035 } 2036 // match: (CMPWconst (MOVLconst [x]) [y]) 2037 // cond: int16(x)>int16(y) && uint16(x)<uint16(y) 2038 // result: (FlagGT_ULT) 2039 for { 2040 y := v.AuxInt 2041 v_0 := v.Args[0] 2042 if v_0.Op != Op386MOVLconst { 2043 break 2044 } 2045 x := v_0.AuxInt 2046 if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { 2047 break 2048 } 2049 v.reset(Op386FlagGT_ULT) 2050 return true 2051 } 2052 // match: (CMPWconst (MOVLconst [x]) [y]) 2053 // cond: int16(x)>int16(y) && uint16(x)>uint16(y) 2054 // result: (FlagGT_UGT) 2055 for { 2056 y := v.AuxInt 2057 v_0 := v.Args[0] 2058 if v_0.Op != Op386MOVLconst { 2059 break 2060 } 2061 x := v_0.AuxInt 2062 if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { 2063 break 2064 } 2065 v.reset(Op386FlagGT_UGT) 2066 return true 2067 } 2068 // match: (CMPWconst (ANDLconst _ [m]) [n]) 2069 // cond: 0 <= int16(m) && int16(m) < int16(n) 2070 // result: (FlagLT_ULT) 2071 for { 2072 n := v.AuxInt 2073 v_0 := v.Args[0] 2074 if v_0.Op != Op386ANDLconst { 2075 break 2076 } 2077 m := v_0.AuxInt 2078 if !(0 <= int16(m) && int16(m) < int16(n)) { 2079 break 2080 } 2081 v.reset(Op386FlagLT_ULT) 2082 return true 2083 } 2084 // match: (CMPWconst (ANDL x y) [0]) 2085 // cond: 2086 // result: (TESTW x y) 2087 for { 2088 if v.AuxInt != 0 { 2089 break 2090 } 2091 v_0 := v.Args[0] 2092 if v_0.Op != Op386ANDL { 2093 break 2094 } 2095 _ = v_0.Args[1] 2096 x := v_0.Args[0] 2097 y := v_0.Args[1] 2098 v.reset(Op386TESTW) 2099 v.AddArg(x) 2100 v.AddArg(y) 2101 return true 2102 } 2103 // match: (CMPWconst (ANDLconst [c] x) [0]) 2104 // cond: 2105 // result: (TESTWconst [int64(int16(c))] x) 2106 for { 2107 if v.AuxInt != 0 { 2108 break 2109 } 2110 v_0 := v.Args[0] 2111 if v_0.Op != Op386ANDLconst { 2112 break 2113 } 2114 c := v_0.AuxInt 2115 x := v_0.Args[0] 2116 v.reset(Op386TESTWconst) 2117 v.AuxInt = int64(int16(c)) 2118 v.AddArg(x) 2119 return true 2120 } 2121 // match: (CMPWconst x [0]) 2122 // cond: 2123 // result: (TESTW x x) 2124 for { 2125 if v.AuxInt != 0 { 2126 break 2127 } 2128 x := v.Args[0] 2129 v.reset(Op386TESTW) 2130 v.AddArg(x) 2131 v.AddArg(x) 2132 return true 2133 } 2134 return false 2135 } 2136 func rewriteValue386_Op386LEAL_0(v *Value) bool { 2137 // match: (LEAL [c] {s} (ADDLconst [d] x)) 2138 // cond: is32Bit(c+d) 2139 // result: (LEAL [c+d] {s} x) 2140 for { 2141 c := v.AuxInt 2142 s := v.Aux 2143 v_0 := v.Args[0] 2144 if v_0.Op != Op386ADDLconst { 2145 break 2146 } 2147 d := v_0.AuxInt 2148 x := v_0.Args[0] 2149 if !(is32Bit(c + d)) { 2150 break 2151 } 2152 v.reset(Op386LEAL) 2153 v.AuxInt = c + d 2154 v.Aux = s 2155 v.AddArg(x) 2156 return true 2157 } 2158 // match: (LEAL [c] {s} (ADDL x y)) 2159 // cond: x.Op != OpSB && y.Op != OpSB 2160 // result: (LEAL1 [c] {s} x y) 2161 for { 2162 c := v.AuxInt 2163 s := v.Aux 2164 v_0 := v.Args[0] 2165 if v_0.Op != Op386ADDL { 2166 break 2167 } 2168 _ = v_0.Args[1] 2169 x := v_0.Args[0] 2170 y := v_0.Args[1] 2171 if !(x.Op != OpSB && y.Op != OpSB) { 2172 break 2173 } 2174 v.reset(Op386LEAL1) 2175 v.AuxInt = c 2176 v.Aux = s 2177 v.AddArg(x) 2178 v.AddArg(y) 2179 return true 2180 } 2181 // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) 2182 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2183 // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) 2184 for { 2185 off1 := v.AuxInt 2186 sym1 := v.Aux 2187 v_0 := v.Args[0] 2188 if v_0.Op != Op386LEAL { 2189 break 2190 } 2191 off2 := v_0.AuxInt 2192 sym2 := v_0.Aux 2193 x := v_0.Args[0] 2194 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2195 break 2196 } 2197 v.reset(Op386LEAL) 2198 v.AuxInt = off1 + off2 2199 v.Aux = mergeSym(sym1, sym2) 2200 v.AddArg(x) 2201 return true 2202 } 2203 // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) 2204 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2205 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2206 for { 2207 off1 := v.AuxInt 2208 sym1 := v.Aux 2209 v_0 := v.Args[0] 2210 if v_0.Op != Op386LEAL1 { 2211 break 2212 } 2213 off2 := v_0.AuxInt 2214 sym2 := v_0.Aux 2215 _ = v_0.Args[1] 2216 x := v_0.Args[0] 2217 y := v_0.Args[1] 2218 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2219 break 2220 } 2221 v.reset(Op386LEAL1) 2222 v.AuxInt = off1 + off2 2223 v.Aux = mergeSym(sym1, sym2) 2224 v.AddArg(x) 2225 v.AddArg(y) 2226 return true 2227 } 2228 // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) 2229 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2230 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2231 for { 2232 off1 := v.AuxInt 2233 sym1 := v.Aux 2234 v_0 := v.Args[0] 2235 if v_0.Op != Op386LEAL2 { 2236 break 2237 } 2238 off2 := v_0.AuxInt 2239 sym2 := v_0.Aux 2240 _ = v_0.Args[1] 2241 x := v_0.Args[0] 2242 y := v_0.Args[1] 2243 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2244 break 2245 } 2246 v.reset(Op386LEAL2) 2247 v.AuxInt = off1 + off2 2248 v.Aux = mergeSym(sym1, sym2) 2249 v.AddArg(x) 2250 v.AddArg(y) 2251 return true 2252 } 2253 // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) 2254 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2255 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2256 for { 2257 off1 := v.AuxInt 2258 sym1 := v.Aux 2259 v_0 := v.Args[0] 2260 if v_0.Op != Op386LEAL4 { 2261 break 2262 } 2263 off2 := v_0.AuxInt 2264 sym2 := v_0.Aux 2265 _ = v_0.Args[1] 2266 x := v_0.Args[0] 2267 y := v_0.Args[1] 2268 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2269 break 2270 } 2271 v.reset(Op386LEAL4) 2272 v.AuxInt = off1 + off2 2273 v.Aux = mergeSym(sym1, sym2) 2274 v.AddArg(x) 2275 v.AddArg(y) 2276 return true 2277 } 2278 // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) 2279 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2280 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2281 for { 2282 off1 := v.AuxInt 2283 sym1 := v.Aux 2284 v_0 := v.Args[0] 2285 if v_0.Op != Op386LEAL8 { 2286 break 2287 } 2288 off2 := v_0.AuxInt 2289 sym2 := v_0.Aux 2290 _ = v_0.Args[1] 2291 x := v_0.Args[0] 2292 y := v_0.Args[1] 2293 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2294 break 2295 } 2296 v.reset(Op386LEAL8) 2297 v.AuxInt = off1 + off2 2298 v.Aux = mergeSym(sym1, sym2) 2299 v.AddArg(x) 2300 v.AddArg(y) 2301 return true 2302 } 2303 return false 2304 } 2305 func rewriteValue386_Op386LEAL1_0(v *Value) bool { 2306 // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) 2307 // cond: is32Bit(c+d) && x.Op != OpSB 2308 // result: (LEAL1 [c+d] {s} x y) 2309 for { 2310 c := v.AuxInt 2311 s := v.Aux 2312 _ = v.Args[1] 2313 v_0 := v.Args[0] 2314 if v_0.Op != Op386ADDLconst { 2315 break 2316 } 2317 d := v_0.AuxInt 2318 x := v_0.Args[0] 2319 y := v.Args[1] 2320 if !(is32Bit(c+d) && x.Op != OpSB) { 2321 break 2322 } 2323 v.reset(Op386LEAL1) 2324 v.AuxInt = c + d 2325 v.Aux = s 2326 v.AddArg(x) 2327 v.AddArg(y) 2328 return true 2329 } 2330 // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) 2331 // cond: is32Bit(c+d) && x.Op != OpSB 2332 // result: (LEAL1 [c+d] {s} x y) 2333 for { 2334 c := v.AuxInt 2335 s := v.Aux 2336 _ = v.Args[1] 2337 y := v.Args[0] 2338 v_1 := v.Args[1] 2339 if v_1.Op != Op386ADDLconst { 2340 break 2341 } 2342 d := v_1.AuxInt 2343 x := v_1.Args[0] 2344 if !(is32Bit(c+d) && x.Op != OpSB) { 2345 break 2346 } 2347 v.reset(Op386LEAL1) 2348 v.AuxInt = c + d 2349 v.Aux = s 2350 v.AddArg(x) 2351 v.AddArg(y) 2352 return true 2353 } 2354 // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) 2355 // cond: 2356 // result: (LEAL2 [c] {s} x y) 2357 for { 2358 c := v.AuxInt 2359 s := v.Aux 2360 _ = v.Args[1] 2361 x := v.Args[0] 2362 v_1 := v.Args[1] 2363 if v_1.Op != Op386SHLLconst { 2364 break 2365 } 2366 if v_1.AuxInt != 1 { 2367 break 2368 } 2369 y := v_1.Args[0] 2370 v.reset(Op386LEAL2) 2371 v.AuxInt = c 2372 v.Aux = s 2373 v.AddArg(x) 2374 v.AddArg(y) 2375 return true 2376 } 2377 // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) 2378 // cond: 2379 // result: (LEAL2 [c] {s} x y) 2380 for { 2381 c := v.AuxInt 2382 s := v.Aux 2383 _ = v.Args[1] 2384 v_0 := v.Args[0] 2385 if v_0.Op != Op386SHLLconst { 2386 break 2387 } 2388 if v_0.AuxInt != 1 { 2389 break 2390 } 2391 y := v_0.Args[0] 2392 x := v.Args[1] 2393 v.reset(Op386LEAL2) 2394 v.AuxInt = c 2395 v.Aux = s 2396 v.AddArg(x) 2397 v.AddArg(y) 2398 return true 2399 } 2400 // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) 2401 // cond: 2402 // result: (LEAL4 [c] {s} x y) 2403 for { 2404 c := v.AuxInt 2405 s := v.Aux 2406 _ = v.Args[1] 2407 x := v.Args[0] 2408 v_1 := v.Args[1] 2409 if v_1.Op != Op386SHLLconst { 2410 break 2411 } 2412 if v_1.AuxInt != 2 { 2413 break 2414 } 2415 y := v_1.Args[0] 2416 v.reset(Op386LEAL4) 2417 v.AuxInt = c 2418 v.Aux = s 2419 v.AddArg(x) 2420 v.AddArg(y) 2421 return true 2422 } 2423 // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) 2424 // cond: 2425 // result: (LEAL4 [c] {s} x y) 2426 for { 2427 c := v.AuxInt 2428 s := v.Aux 2429 _ = v.Args[1] 2430 v_0 := v.Args[0] 2431 if v_0.Op != Op386SHLLconst { 2432 break 2433 } 2434 if v_0.AuxInt != 2 { 2435 break 2436 } 2437 y := v_0.Args[0] 2438 x := v.Args[1] 2439 v.reset(Op386LEAL4) 2440 v.AuxInt = c 2441 v.Aux = s 2442 v.AddArg(x) 2443 v.AddArg(y) 2444 return true 2445 } 2446 // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) 2447 // cond: 2448 // result: (LEAL8 [c] {s} x y) 2449 for { 2450 c := v.AuxInt 2451 s := v.Aux 2452 _ = v.Args[1] 2453 x := v.Args[0] 2454 v_1 := v.Args[1] 2455 if v_1.Op != Op386SHLLconst { 2456 break 2457 } 2458 if v_1.AuxInt != 3 { 2459 break 2460 } 2461 y := v_1.Args[0] 2462 v.reset(Op386LEAL8) 2463 v.AuxInt = c 2464 v.Aux = s 2465 v.AddArg(x) 2466 v.AddArg(y) 2467 return true 2468 } 2469 // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) 2470 // cond: 2471 // result: (LEAL8 [c] {s} x y) 2472 for { 2473 c := v.AuxInt 2474 s := v.Aux 2475 _ = v.Args[1] 2476 v_0 := v.Args[0] 2477 if v_0.Op != Op386SHLLconst { 2478 break 2479 } 2480 if v_0.AuxInt != 3 { 2481 break 2482 } 2483 y := v_0.Args[0] 2484 x := v.Args[1] 2485 v.reset(Op386LEAL8) 2486 v.AuxInt = c 2487 v.Aux = s 2488 v.AddArg(x) 2489 v.AddArg(y) 2490 return true 2491 } 2492 // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2493 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2494 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2495 for { 2496 off1 := v.AuxInt 2497 sym1 := v.Aux 2498 _ = v.Args[1] 2499 v_0 := v.Args[0] 2500 if v_0.Op != Op386LEAL { 2501 break 2502 } 2503 off2 := v_0.AuxInt 2504 sym2 := v_0.Aux 2505 x := v_0.Args[0] 2506 y := v.Args[1] 2507 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2508 break 2509 } 2510 v.reset(Op386LEAL1) 2511 v.AuxInt = off1 + off2 2512 v.Aux = mergeSym(sym1, sym2) 2513 v.AddArg(x) 2514 v.AddArg(y) 2515 return true 2516 } 2517 // match: (LEAL1 [off1] {sym1} y (LEAL [off2] {sym2} x)) 2518 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2519 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 2520 for { 2521 off1 := v.AuxInt 2522 sym1 := v.Aux 2523 _ = v.Args[1] 2524 y := v.Args[0] 2525 v_1 := v.Args[1] 2526 if v_1.Op != Op386LEAL { 2527 break 2528 } 2529 off2 := v_1.AuxInt 2530 sym2 := v_1.Aux 2531 x := v_1.Args[0] 2532 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2533 break 2534 } 2535 v.reset(Op386LEAL1) 2536 v.AuxInt = off1 + off2 2537 v.Aux = mergeSym(sym1, sym2) 2538 v.AddArg(x) 2539 v.AddArg(y) 2540 return true 2541 } 2542 return false 2543 } 2544 func rewriteValue386_Op386LEAL2_0(v *Value) bool { 2545 // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) 2546 // cond: is32Bit(c+d) && x.Op != OpSB 2547 // result: (LEAL2 [c+d] {s} x y) 2548 for { 2549 c := v.AuxInt 2550 s := v.Aux 2551 _ = v.Args[1] 2552 v_0 := v.Args[0] 2553 if v_0.Op != Op386ADDLconst { 2554 break 2555 } 2556 d := v_0.AuxInt 2557 x := v_0.Args[0] 2558 y := v.Args[1] 2559 if !(is32Bit(c+d) && x.Op != OpSB) { 2560 break 2561 } 2562 v.reset(Op386LEAL2) 2563 v.AuxInt = c + d 2564 v.Aux = s 2565 v.AddArg(x) 2566 v.AddArg(y) 2567 return true 2568 } 2569 // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) 2570 // cond: is32Bit(c+2*d) && y.Op != OpSB 2571 // result: (LEAL2 [c+2*d] {s} x y) 2572 for { 2573 c := v.AuxInt 2574 s := v.Aux 2575 _ = v.Args[1] 2576 x := v.Args[0] 2577 v_1 := v.Args[1] 2578 if v_1.Op != Op386ADDLconst { 2579 break 2580 } 2581 d := v_1.AuxInt 2582 y := v_1.Args[0] 2583 if !(is32Bit(c+2*d) && y.Op != OpSB) { 2584 break 2585 } 2586 v.reset(Op386LEAL2) 2587 v.AuxInt = c + 2*d 2588 v.Aux = s 2589 v.AddArg(x) 2590 v.AddArg(y) 2591 return true 2592 } 2593 // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) 2594 // cond: 2595 // result: (LEAL4 [c] {s} x y) 2596 for { 2597 c := v.AuxInt 2598 s := v.Aux 2599 _ = v.Args[1] 2600 x := v.Args[0] 2601 v_1 := v.Args[1] 2602 if v_1.Op != Op386SHLLconst { 2603 break 2604 } 2605 if v_1.AuxInt != 1 { 2606 break 2607 } 2608 y := v_1.Args[0] 2609 v.reset(Op386LEAL4) 2610 v.AuxInt = c 2611 v.Aux = s 2612 v.AddArg(x) 2613 v.AddArg(y) 2614 return true 2615 } 2616 // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) 2617 // cond: 2618 // result: (LEAL8 [c] {s} x y) 2619 for { 2620 c := v.AuxInt 2621 s := v.Aux 2622 _ = v.Args[1] 2623 x := v.Args[0] 2624 v_1 := v.Args[1] 2625 if v_1.Op != Op386SHLLconst { 2626 break 2627 } 2628 if v_1.AuxInt != 2 { 2629 break 2630 } 2631 y := v_1.Args[0] 2632 v.reset(Op386LEAL8) 2633 v.AuxInt = c 2634 v.Aux = s 2635 v.AddArg(x) 2636 v.AddArg(y) 2637 return true 2638 } 2639 // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2640 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2641 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 2642 for { 2643 off1 := v.AuxInt 2644 sym1 := v.Aux 2645 _ = v.Args[1] 2646 v_0 := v.Args[0] 2647 if v_0.Op != Op386LEAL { 2648 break 2649 } 2650 off2 := v_0.AuxInt 2651 sym2 := v_0.Aux 2652 x := v_0.Args[0] 2653 y := v.Args[1] 2654 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2655 break 2656 } 2657 v.reset(Op386LEAL2) 2658 v.AuxInt = off1 + off2 2659 v.Aux = mergeSym(sym1, sym2) 2660 v.AddArg(x) 2661 v.AddArg(y) 2662 return true 2663 } 2664 return false 2665 } 2666 func rewriteValue386_Op386LEAL4_0(v *Value) bool { 2667 // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) 2668 // cond: is32Bit(c+d) && x.Op != OpSB 2669 // result: (LEAL4 [c+d] {s} x y) 2670 for { 2671 c := v.AuxInt 2672 s := v.Aux 2673 _ = v.Args[1] 2674 v_0 := v.Args[0] 2675 if v_0.Op != Op386ADDLconst { 2676 break 2677 } 2678 d := v_0.AuxInt 2679 x := v_0.Args[0] 2680 y := v.Args[1] 2681 if !(is32Bit(c+d) && x.Op != OpSB) { 2682 break 2683 } 2684 v.reset(Op386LEAL4) 2685 v.AuxInt = c + d 2686 v.Aux = s 2687 v.AddArg(x) 2688 v.AddArg(y) 2689 return true 2690 } 2691 // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) 2692 // cond: is32Bit(c+4*d) && y.Op != OpSB 2693 // result: (LEAL4 [c+4*d] {s} x y) 2694 for { 2695 c := v.AuxInt 2696 s := v.Aux 2697 _ = v.Args[1] 2698 x := v.Args[0] 2699 v_1 := v.Args[1] 2700 if v_1.Op != Op386ADDLconst { 2701 break 2702 } 2703 d := v_1.AuxInt 2704 y := v_1.Args[0] 2705 if !(is32Bit(c+4*d) && y.Op != OpSB) { 2706 break 2707 } 2708 v.reset(Op386LEAL4) 2709 v.AuxInt = c + 4*d 2710 v.Aux = s 2711 v.AddArg(x) 2712 v.AddArg(y) 2713 return true 2714 } 2715 // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) 2716 // cond: 2717 // result: (LEAL8 [c] {s} x y) 2718 for { 2719 c := v.AuxInt 2720 s := v.Aux 2721 _ = v.Args[1] 2722 x := v.Args[0] 2723 v_1 := v.Args[1] 2724 if v_1.Op != Op386SHLLconst { 2725 break 2726 } 2727 if v_1.AuxInt != 1 { 2728 break 2729 } 2730 y := v_1.Args[0] 2731 v.reset(Op386LEAL8) 2732 v.AuxInt = c 2733 v.Aux = s 2734 v.AddArg(x) 2735 v.AddArg(y) 2736 return true 2737 } 2738 // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2739 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2740 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 2741 for { 2742 off1 := v.AuxInt 2743 sym1 := v.Aux 2744 _ = v.Args[1] 2745 v_0 := v.Args[0] 2746 if v_0.Op != Op386LEAL { 2747 break 2748 } 2749 off2 := v_0.AuxInt 2750 sym2 := v_0.Aux 2751 x := v_0.Args[0] 2752 y := v.Args[1] 2753 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2754 break 2755 } 2756 v.reset(Op386LEAL4) 2757 v.AuxInt = off1 + off2 2758 v.Aux = mergeSym(sym1, sym2) 2759 v.AddArg(x) 2760 v.AddArg(y) 2761 return true 2762 } 2763 return false 2764 } 2765 func rewriteValue386_Op386LEAL8_0(v *Value) bool { 2766 // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) 2767 // cond: is32Bit(c+d) && x.Op != OpSB 2768 // result: (LEAL8 [c+d] {s} x y) 2769 for { 2770 c := v.AuxInt 2771 s := v.Aux 2772 _ = v.Args[1] 2773 v_0 := v.Args[0] 2774 if v_0.Op != Op386ADDLconst { 2775 break 2776 } 2777 d := v_0.AuxInt 2778 x := v_0.Args[0] 2779 y := v.Args[1] 2780 if !(is32Bit(c+d) && x.Op != OpSB) { 2781 break 2782 } 2783 v.reset(Op386LEAL8) 2784 v.AuxInt = c + d 2785 v.Aux = s 2786 v.AddArg(x) 2787 v.AddArg(y) 2788 return true 2789 } 2790 // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) 2791 // cond: is32Bit(c+8*d) && y.Op != OpSB 2792 // result: (LEAL8 [c+8*d] {s} x y) 2793 for { 2794 c := v.AuxInt 2795 s := v.Aux 2796 _ = v.Args[1] 2797 x := v.Args[0] 2798 v_1 := v.Args[1] 2799 if v_1.Op != Op386ADDLconst { 2800 break 2801 } 2802 d := v_1.AuxInt 2803 y := v_1.Args[0] 2804 if !(is32Bit(c+8*d) && y.Op != OpSB) { 2805 break 2806 } 2807 v.reset(Op386LEAL8) 2808 v.AuxInt = c + 8*d 2809 v.Aux = s 2810 v.AddArg(x) 2811 v.AddArg(y) 2812 return true 2813 } 2814 // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) 2815 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 2816 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 2817 for { 2818 off1 := v.AuxInt 2819 sym1 := v.Aux 2820 _ = v.Args[1] 2821 v_0 := v.Args[0] 2822 if v_0.Op != Op386LEAL { 2823 break 2824 } 2825 off2 := v_0.AuxInt 2826 sym2 := v_0.Aux 2827 x := v_0.Args[0] 2828 y := v.Args[1] 2829 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 2830 break 2831 } 2832 v.reset(Op386LEAL8) 2833 v.AuxInt = off1 + off2 2834 v.Aux = mergeSym(sym1, sym2) 2835 v.AddArg(x) 2836 v.AddArg(y) 2837 return true 2838 } 2839 return false 2840 } 2841 func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { 2842 b := v.Block 2843 _ = b 2844 // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) 2845 // cond: x.Uses == 1 && clobber(x) 2846 // result: @x.Block (MOVBLSXload <v.Type> [off] {sym} ptr mem) 2847 for { 2848 x := v.Args[0] 2849 if x.Op != Op386MOVBload { 2850 break 2851 } 2852 off := x.AuxInt 2853 sym := x.Aux 2854 _ = x.Args[1] 2855 ptr := x.Args[0] 2856 mem := x.Args[1] 2857 if !(x.Uses == 1 && clobber(x)) { 2858 break 2859 } 2860 b = x.Block 2861 v0 := b.NewValue0(v.Pos, Op386MOVBLSXload, v.Type) 2862 v.reset(OpCopy) 2863 v.AddArg(v0) 2864 v0.AuxInt = off 2865 v0.Aux = sym 2866 v0.AddArg(ptr) 2867 v0.AddArg(mem) 2868 return true 2869 } 2870 // match: (MOVBLSX (ANDLconst [c] x)) 2871 // cond: c & 0x80 == 0 2872 // result: (ANDLconst [c & 0x7f] x) 2873 for { 2874 v_0 := v.Args[0] 2875 if v_0.Op != Op386ANDLconst { 2876 break 2877 } 2878 c := v_0.AuxInt 2879 x := v_0.Args[0] 2880 if !(c&0x80 == 0) { 2881 break 2882 } 2883 v.reset(Op386ANDLconst) 2884 v.AuxInt = c & 0x7f 2885 v.AddArg(x) 2886 return true 2887 } 2888 return false 2889 } 2890 func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { 2891 b := v.Block 2892 _ = b 2893 config := b.Func.Config 2894 _ = config 2895 // match: (MOVBLSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 2896 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 2897 // result: (MOVBLSX x) 2898 for { 2899 off := v.AuxInt 2900 sym := v.Aux 2901 _ = v.Args[1] 2902 ptr := v.Args[0] 2903 v_1 := v.Args[1] 2904 if v_1.Op != Op386MOVBstore { 2905 break 2906 } 2907 off2 := v_1.AuxInt 2908 sym2 := v_1.Aux 2909 _ = v_1.Args[2] 2910 ptr2 := v_1.Args[0] 2911 x := v_1.Args[1] 2912 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 2913 break 2914 } 2915 v.reset(Op386MOVBLSX) 2916 v.AddArg(x) 2917 return true 2918 } 2919 // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 2920 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2921 // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 2922 for { 2923 off1 := v.AuxInt 2924 sym1 := v.Aux 2925 _ = v.Args[1] 2926 v_0 := v.Args[0] 2927 if v_0.Op != Op386LEAL { 2928 break 2929 } 2930 off2 := v_0.AuxInt 2931 sym2 := v_0.Aux 2932 base := v_0.Args[0] 2933 mem := v.Args[1] 2934 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2935 break 2936 } 2937 v.reset(Op386MOVBLSXload) 2938 v.AuxInt = off1 + off2 2939 v.Aux = mergeSym(sym1, sym2) 2940 v.AddArg(base) 2941 v.AddArg(mem) 2942 return true 2943 } 2944 return false 2945 } 2946 func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { 2947 b := v.Block 2948 _ = b 2949 // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) 2950 // cond: x.Uses == 1 && clobber(x) 2951 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 2952 for { 2953 x := v.Args[0] 2954 if x.Op != Op386MOVBload { 2955 break 2956 } 2957 off := x.AuxInt 2958 sym := x.Aux 2959 _ = x.Args[1] 2960 ptr := x.Args[0] 2961 mem := x.Args[1] 2962 if !(x.Uses == 1 && clobber(x)) { 2963 break 2964 } 2965 b = x.Block 2966 v0 := b.NewValue0(v.Pos, Op386MOVBload, v.Type) 2967 v.reset(OpCopy) 2968 v.AddArg(v0) 2969 v0.AuxInt = off 2970 v0.Aux = sym 2971 v0.AddArg(ptr) 2972 v0.AddArg(mem) 2973 return true 2974 } 2975 // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) 2976 // cond: x.Uses == 1 && clobber(x) 2977 // result: @x.Block (MOVBloadidx1 <v.Type> [off] {sym} ptr idx mem) 2978 for { 2979 x := v.Args[0] 2980 if x.Op != Op386MOVBloadidx1 { 2981 break 2982 } 2983 off := x.AuxInt 2984 sym := x.Aux 2985 _ = x.Args[2] 2986 ptr := x.Args[0] 2987 idx := x.Args[1] 2988 mem := x.Args[2] 2989 if !(x.Uses == 1 && clobber(x)) { 2990 break 2991 } 2992 b = x.Block 2993 v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) 2994 v.reset(OpCopy) 2995 v.AddArg(v0) 2996 v0.AuxInt = off 2997 v0.Aux = sym 2998 v0.AddArg(ptr) 2999 v0.AddArg(idx) 3000 v0.AddArg(mem) 3001 return true 3002 } 3003 // match: (MOVBLZX (ANDLconst [c] x)) 3004 // cond: 3005 // result: (ANDLconst [c & 0xff] x) 3006 for { 3007 v_0 := v.Args[0] 3008 if v_0.Op != Op386ANDLconst { 3009 break 3010 } 3011 c := v_0.AuxInt 3012 x := v_0.Args[0] 3013 v.reset(Op386ANDLconst) 3014 v.AuxInt = c & 0xff 3015 v.AddArg(x) 3016 return true 3017 } 3018 return false 3019 } 3020 func rewriteValue386_Op386MOVBload_0(v *Value) bool { 3021 b := v.Block 3022 _ = b 3023 config := b.Func.Config 3024 _ = config 3025 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 3026 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3027 // result: (MOVBLZX x) 3028 for { 3029 off := v.AuxInt 3030 sym := v.Aux 3031 _ = v.Args[1] 3032 ptr := v.Args[0] 3033 v_1 := v.Args[1] 3034 if v_1.Op != Op386MOVBstore { 3035 break 3036 } 3037 off2 := v_1.AuxInt 3038 sym2 := v_1.Aux 3039 _ = v_1.Args[2] 3040 ptr2 := v_1.Args[0] 3041 x := v_1.Args[1] 3042 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3043 break 3044 } 3045 v.reset(Op386MOVBLZX) 3046 v.AddArg(x) 3047 return true 3048 } 3049 // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) 3050 // cond: is32Bit(off1+off2) 3051 // result: (MOVBload [off1+off2] {sym} ptr mem) 3052 for { 3053 off1 := v.AuxInt 3054 sym := v.Aux 3055 _ = v.Args[1] 3056 v_0 := v.Args[0] 3057 if v_0.Op != Op386ADDLconst { 3058 break 3059 } 3060 off2 := v_0.AuxInt 3061 ptr := v_0.Args[0] 3062 mem := v.Args[1] 3063 if !(is32Bit(off1 + off2)) { 3064 break 3065 } 3066 v.reset(Op386MOVBload) 3067 v.AuxInt = off1 + off2 3068 v.Aux = sym 3069 v.AddArg(ptr) 3070 v.AddArg(mem) 3071 return true 3072 } 3073 // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 3074 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3075 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 3076 for { 3077 off1 := v.AuxInt 3078 sym1 := v.Aux 3079 _ = v.Args[1] 3080 v_0 := v.Args[0] 3081 if v_0.Op != Op386LEAL { 3082 break 3083 } 3084 off2 := v_0.AuxInt 3085 sym2 := v_0.Aux 3086 base := v_0.Args[0] 3087 mem := v.Args[1] 3088 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3089 break 3090 } 3091 v.reset(Op386MOVBload) 3092 v.AuxInt = off1 + off2 3093 v.Aux = mergeSym(sym1, sym2) 3094 v.AddArg(base) 3095 v.AddArg(mem) 3096 return true 3097 } 3098 // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 3099 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3100 // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 3101 for { 3102 off1 := v.AuxInt 3103 sym1 := v.Aux 3104 _ = v.Args[1] 3105 v_0 := v.Args[0] 3106 if v_0.Op != Op386LEAL1 { 3107 break 3108 } 3109 off2 := v_0.AuxInt 3110 sym2 := v_0.Aux 3111 _ = v_0.Args[1] 3112 ptr := v_0.Args[0] 3113 idx := v_0.Args[1] 3114 mem := v.Args[1] 3115 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3116 break 3117 } 3118 v.reset(Op386MOVBloadidx1) 3119 v.AuxInt = off1 + off2 3120 v.Aux = mergeSym(sym1, sym2) 3121 v.AddArg(ptr) 3122 v.AddArg(idx) 3123 v.AddArg(mem) 3124 return true 3125 } 3126 // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) 3127 // cond: ptr.Op != OpSB 3128 // result: (MOVBloadidx1 [off] {sym} ptr idx mem) 3129 for { 3130 off := v.AuxInt 3131 sym := v.Aux 3132 _ = v.Args[1] 3133 v_0 := v.Args[0] 3134 if v_0.Op != Op386ADDL { 3135 break 3136 } 3137 _ = v_0.Args[1] 3138 ptr := v_0.Args[0] 3139 idx := v_0.Args[1] 3140 mem := v.Args[1] 3141 if !(ptr.Op != OpSB) { 3142 break 3143 } 3144 v.reset(Op386MOVBloadidx1) 3145 v.AuxInt = off 3146 v.Aux = sym 3147 v.AddArg(ptr) 3148 v.AddArg(idx) 3149 v.AddArg(mem) 3150 return true 3151 } 3152 return false 3153 } 3154 func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { 3155 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 3156 // cond: 3157 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3158 for { 3159 c := v.AuxInt 3160 sym := v.Aux 3161 _ = v.Args[2] 3162 v_0 := v.Args[0] 3163 if v_0.Op != Op386ADDLconst { 3164 break 3165 } 3166 d := v_0.AuxInt 3167 ptr := v_0.Args[0] 3168 idx := v.Args[1] 3169 mem := v.Args[2] 3170 v.reset(Op386MOVBloadidx1) 3171 v.AuxInt = int64(int32(c + d)) 3172 v.Aux = sym 3173 v.AddArg(ptr) 3174 v.AddArg(idx) 3175 v.AddArg(mem) 3176 return true 3177 } 3178 // match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 3179 // cond: 3180 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3181 for { 3182 c := v.AuxInt 3183 sym := v.Aux 3184 _ = v.Args[2] 3185 idx := v.Args[0] 3186 v_1 := v.Args[1] 3187 if v_1.Op != Op386ADDLconst { 3188 break 3189 } 3190 d := v_1.AuxInt 3191 ptr := v_1.Args[0] 3192 mem := v.Args[2] 3193 v.reset(Op386MOVBloadidx1) 3194 v.AuxInt = int64(int32(c + d)) 3195 v.Aux = sym 3196 v.AddArg(ptr) 3197 v.AddArg(idx) 3198 v.AddArg(mem) 3199 return true 3200 } 3201 // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 3202 // cond: 3203 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3204 for { 3205 c := v.AuxInt 3206 sym := v.Aux 3207 _ = v.Args[2] 3208 ptr := v.Args[0] 3209 v_1 := v.Args[1] 3210 if v_1.Op != Op386ADDLconst { 3211 break 3212 } 3213 d := v_1.AuxInt 3214 idx := v_1.Args[0] 3215 mem := v.Args[2] 3216 v.reset(Op386MOVBloadidx1) 3217 v.AuxInt = int64(int32(c + d)) 3218 v.Aux = sym 3219 v.AddArg(ptr) 3220 v.AddArg(idx) 3221 v.AddArg(mem) 3222 return true 3223 } 3224 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 3225 // cond: 3226 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 3227 for { 3228 c := v.AuxInt 3229 sym := v.Aux 3230 _ = v.Args[2] 3231 v_0 := v.Args[0] 3232 if v_0.Op != Op386ADDLconst { 3233 break 3234 } 3235 d := v_0.AuxInt 3236 idx := v_0.Args[0] 3237 ptr := v.Args[1] 3238 mem := v.Args[2] 3239 v.reset(Op386MOVBloadidx1) 3240 v.AuxInt = int64(int32(c + d)) 3241 v.Aux = sym 3242 v.AddArg(ptr) 3243 v.AddArg(idx) 3244 v.AddArg(mem) 3245 return true 3246 } 3247 return false 3248 } 3249 func rewriteValue386_Op386MOVBstore_0(v *Value) bool { 3250 b := v.Block 3251 _ = b 3252 config := b.Func.Config 3253 _ = config 3254 // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) 3255 // cond: 3256 // result: (MOVBstore [off] {sym} ptr x mem) 3257 for { 3258 off := v.AuxInt 3259 sym := v.Aux 3260 _ = v.Args[2] 3261 ptr := v.Args[0] 3262 v_1 := v.Args[1] 3263 if v_1.Op != Op386MOVBLSX { 3264 break 3265 } 3266 x := v_1.Args[0] 3267 mem := v.Args[2] 3268 v.reset(Op386MOVBstore) 3269 v.AuxInt = off 3270 v.Aux = sym 3271 v.AddArg(ptr) 3272 v.AddArg(x) 3273 v.AddArg(mem) 3274 return true 3275 } 3276 // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) 3277 // cond: 3278 // result: (MOVBstore [off] {sym} ptr x mem) 3279 for { 3280 off := v.AuxInt 3281 sym := v.Aux 3282 _ = v.Args[2] 3283 ptr := v.Args[0] 3284 v_1 := v.Args[1] 3285 if v_1.Op != Op386MOVBLZX { 3286 break 3287 } 3288 x := v_1.Args[0] 3289 mem := v.Args[2] 3290 v.reset(Op386MOVBstore) 3291 v.AuxInt = off 3292 v.Aux = sym 3293 v.AddArg(ptr) 3294 v.AddArg(x) 3295 v.AddArg(mem) 3296 return true 3297 } 3298 // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 3299 // cond: is32Bit(off1+off2) 3300 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3301 for { 3302 off1 := v.AuxInt 3303 sym := v.Aux 3304 _ = v.Args[2] 3305 v_0 := v.Args[0] 3306 if v_0.Op != Op386ADDLconst { 3307 break 3308 } 3309 off2 := v_0.AuxInt 3310 ptr := v_0.Args[0] 3311 val := v.Args[1] 3312 mem := v.Args[2] 3313 if !(is32Bit(off1 + off2)) { 3314 break 3315 } 3316 v.reset(Op386MOVBstore) 3317 v.AuxInt = off1 + off2 3318 v.Aux = sym 3319 v.AddArg(ptr) 3320 v.AddArg(val) 3321 v.AddArg(mem) 3322 return true 3323 } 3324 // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) 3325 // cond: validOff(off) 3326 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 3327 for { 3328 off := v.AuxInt 3329 sym := v.Aux 3330 _ = v.Args[2] 3331 ptr := v.Args[0] 3332 v_1 := v.Args[1] 3333 if v_1.Op != Op386MOVLconst { 3334 break 3335 } 3336 c := v_1.AuxInt 3337 mem := v.Args[2] 3338 if !(validOff(off)) { 3339 break 3340 } 3341 v.reset(Op386MOVBstoreconst) 3342 v.AuxInt = makeValAndOff(int64(int8(c)), off) 3343 v.Aux = sym 3344 v.AddArg(ptr) 3345 v.AddArg(mem) 3346 return true 3347 } 3348 // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 3349 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3350 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 3351 for { 3352 off1 := v.AuxInt 3353 sym1 := v.Aux 3354 _ = v.Args[2] 3355 v_0 := v.Args[0] 3356 if v_0.Op != Op386LEAL { 3357 break 3358 } 3359 off2 := v_0.AuxInt 3360 sym2 := v_0.Aux 3361 base := v_0.Args[0] 3362 val := v.Args[1] 3363 mem := v.Args[2] 3364 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3365 break 3366 } 3367 v.reset(Op386MOVBstore) 3368 v.AuxInt = off1 + off2 3369 v.Aux = mergeSym(sym1, sym2) 3370 v.AddArg(base) 3371 v.AddArg(val) 3372 v.AddArg(mem) 3373 return true 3374 } 3375 // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 3376 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 3377 // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 3378 for { 3379 off1 := v.AuxInt 3380 sym1 := v.Aux 3381 _ = v.Args[2] 3382 v_0 := v.Args[0] 3383 if v_0.Op != Op386LEAL1 { 3384 break 3385 } 3386 off2 := v_0.AuxInt 3387 sym2 := v_0.Aux 3388 _ = v_0.Args[1] 3389 ptr := v_0.Args[0] 3390 idx := v_0.Args[1] 3391 val := v.Args[1] 3392 mem := v.Args[2] 3393 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 3394 break 3395 } 3396 v.reset(Op386MOVBstoreidx1) 3397 v.AuxInt = off1 + off2 3398 v.Aux = mergeSym(sym1, sym2) 3399 v.AddArg(ptr) 3400 v.AddArg(idx) 3401 v.AddArg(val) 3402 v.AddArg(mem) 3403 return true 3404 } 3405 // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) 3406 // cond: ptr.Op != OpSB 3407 // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) 3408 for { 3409 off := v.AuxInt 3410 sym := v.Aux 3411 _ = v.Args[2] 3412 v_0 := v.Args[0] 3413 if v_0.Op != Op386ADDL { 3414 break 3415 } 3416 _ = v_0.Args[1] 3417 ptr := v_0.Args[0] 3418 idx := v_0.Args[1] 3419 val := v.Args[1] 3420 mem := v.Args[2] 3421 if !(ptr.Op != OpSB) { 3422 break 3423 } 3424 v.reset(Op386MOVBstoreidx1) 3425 v.AuxInt = off 3426 v.Aux = sym 3427 v.AddArg(ptr) 3428 v.AddArg(idx) 3429 v.AddArg(val) 3430 v.AddArg(mem) 3431 return true 3432 } 3433 // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 3434 // cond: x.Uses == 1 && clobber(x) 3435 // result: (MOVWstore [i-1] {s} p w mem) 3436 for { 3437 i := v.AuxInt 3438 s := v.Aux 3439 _ = v.Args[2] 3440 p := v.Args[0] 3441 v_1 := v.Args[1] 3442 if v_1.Op != Op386SHRLconst { 3443 break 3444 } 3445 if v_1.AuxInt != 8 { 3446 break 3447 } 3448 w := v_1.Args[0] 3449 x := v.Args[2] 3450 if x.Op != Op386MOVBstore { 3451 break 3452 } 3453 if x.AuxInt != i-1 { 3454 break 3455 } 3456 if x.Aux != s { 3457 break 3458 } 3459 _ = x.Args[2] 3460 if p != x.Args[0] { 3461 break 3462 } 3463 if w != x.Args[1] { 3464 break 3465 } 3466 mem := x.Args[2] 3467 if !(x.Uses == 1 && clobber(x)) { 3468 break 3469 } 3470 v.reset(Op386MOVWstore) 3471 v.AuxInt = i - 1 3472 v.Aux = s 3473 v.AddArg(p) 3474 v.AddArg(w) 3475 v.AddArg(mem) 3476 return true 3477 } 3478 // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) 3479 // cond: x.Uses == 1 && clobber(x) 3480 // result: (MOVWstore [i-1] {s} p w0 mem) 3481 for { 3482 i := v.AuxInt 3483 s := v.Aux 3484 _ = v.Args[2] 3485 p := v.Args[0] 3486 v_1 := v.Args[1] 3487 if v_1.Op != Op386SHRLconst { 3488 break 3489 } 3490 j := v_1.AuxInt 3491 w := v_1.Args[0] 3492 x := v.Args[2] 3493 if x.Op != Op386MOVBstore { 3494 break 3495 } 3496 if x.AuxInt != i-1 { 3497 break 3498 } 3499 if x.Aux != s { 3500 break 3501 } 3502 _ = x.Args[2] 3503 if p != x.Args[0] { 3504 break 3505 } 3506 w0 := x.Args[1] 3507 if w0.Op != Op386SHRLconst { 3508 break 3509 } 3510 if w0.AuxInt != j-8 { 3511 break 3512 } 3513 if w != w0.Args[0] { 3514 break 3515 } 3516 mem := x.Args[2] 3517 if !(x.Uses == 1 && clobber(x)) { 3518 break 3519 } 3520 v.reset(Op386MOVWstore) 3521 v.AuxInt = i - 1 3522 v.Aux = s 3523 v.AddArg(p) 3524 v.AddArg(w0) 3525 v.AddArg(mem) 3526 return true 3527 } 3528 return false 3529 } 3530 func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { 3531 b := v.Block 3532 _ = b 3533 config := b.Func.Config 3534 _ = config 3535 // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 3536 // cond: ValAndOff(sc).canAdd(off) 3537 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 3538 for { 3539 sc := v.AuxInt 3540 s := v.Aux 3541 _ = v.Args[1] 3542 v_0 := v.Args[0] 3543 if v_0.Op != Op386ADDLconst { 3544 break 3545 } 3546 off := v_0.AuxInt 3547 ptr := v_0.Args[0] 3548 mem := v.Args[1] 3549 if !(ValAndOff(sc).canAdd(off)) { 3550 break 3551 } 3552 v.reset(Op386MOVBstoreconst) 3553 v.AuxInt = ValAndOff(sc).add(off) 3554 v.Aux = s 3555 v.AddArg(ptr) 3556 v.AddArg(mem) 3557 return true 3558 } 3559 // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 3560 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 3561 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 3562 for { 3563 sc := v.AuxInt 3564 sym1 := v.Aux 3565 _ = v.Args[1] 3566 v_0 := v.Args[0] 3567 if v_0.Op != Op386LEAL { 3568 break 3569 } 3570 off := v_0.AuxInt 3571 sym2 := v_0.Aux 3572 ptr := v_0.Args[0] 3573 mem := v.Args[1] 3574 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 3575 break 3576 } 3577 v.reset(Op386MOVBstoreconst) 3578 v.AuxInt = ValAndOff(sc).add(off) 3579 v.Aux = mergeSym(sym1, sym2) 3580 v.AddArg(ptr) 3581 v.AddArg(mem) 3582 return true 3583 } 3584 // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 3585 // cond: canMergeSym(sym1, sym2) 3586 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 3587 for { 3588 x := v.AuxInt 3589 sym1 := v.Aux 3590 _ = v.Args[1] 3591 v_0 := v.Args[0] 3592 if v_0.Op != Op386LEAL1 { 3593 break 3594 } 3595 off := v_0.AuxInt 3596 sym2 := v_0.Aux 3597 _ = v_0.Args[1] 3598 ptr := v_0.Args[0] 3599 idx := v_0.Args[1] 3600 mem := v.Args[1] 3601 if !(canMergeSym(sym1, sym2)) { 3602 break 3603 } 3604 v.reset(Op386MOVBstoreconstidx1) 3605 v.AuxInt = ValAndOff(x).add(off) 3606 v.Aux = mergeSym(sym1, sym2) 3607 v.AddArg(ptr) 3608 v.AddArg(idx) 3609 v.AddArg(mem) 3610 return true 3611 } 3612 // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) 3613 // cond: 3614 // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) 3615 for { 3616 x := v.AuxInt 3617 sym := v.Aux 3618 _ = v.Args[1] 3619 v_0 := v.Args[0] 3620 if v_0.Op != Op386ADDL { 3621 break 3622 } 3623 _ = v_0.Args[1] 3624 ptr := v_0.Args[0] 3625 idx := v_0.Args[1] 3626 mem := v.Args[1] 3627 v.reset(Op386MOVBstoreconstidx1) 3628 v.AuxInt = x 3629 v.Aux = sym 3630 v.AddArg(ptr) 3631 v.AddArg(idx) 3632 v.AddArg(mem) 3633 return true 3634 } 3635 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 3636 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3637 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 3638 for { 3639 c := v.AuxInt 3640 s := v.Aux 3641 _ = v.Args[1] 3642 p := v.Args[0] 3643 x := v.Args[1] 3644 if x.Op != Op386MOVBstoreconst { 3645 break 3646 } 3647 a := x.AuxInt 3648 if x.Aux != s { 3649 break 3650 } 3651 _ = x.Args[1] 3652 if p != x.Args[0] { 3653 break 3654 } 3655 mem := x.Args[1] 3656 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3657 break 3658 } 3659 v.reset(Op386MOVWstoreconst) 3660 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3661 v.Aux = s 3662 v.AddArg(p) 3663 v.AddArg(mem) 3664 return true 3665 } 3666 return false 3667 } 3668 func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { 3669 // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 3670 // cond: 3671 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3672 for { 3673 x := v.AuxInt 3674 sym := v.Aux 3675 _ = v.Args[2] 3676 v_0 := v.Args[0] 3677 if v_0.Op != Op386ADDLconst { 3678 break 3679 } 3680 c := v_0.AuxInt 3681 ptr := v_0.Args[0] 3682 idx := v.Args[1] 3683 mem := v.Args[2] 3684 v.reset(Op386MOVBstoreconstidx1) 3685 v.AuxInt = ValAndOff(x).add(c) 3686 v.Aux = sym 3687 v.AddArg(ptr) 3688 v.AddArg(idx) 3689 v.AddArg(mem) 3690 return true 3691 } 3692 // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 3693 // cond: 3694 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 3695 for { 3696 x := v.AuxInt 3697 sym := v.Aux 3698 _ = v.Args[2] 3699 ptr := v.Args[0] 3700 v_1 := v.Args[1] 3701 if v_1.Op != Op386ADDLconst { 3702 break 3703 } 3704 c := v_1.AuxInt 3705 idx := v_1.Args[0] 3706 mem := v.Args[2] 3707 v.reset(Op386MOVBstoreconstidx1) 3708 v.AuxInt = ValAndOff(x).add(c) 3709 v.Aux = sym 3710 v.AddArg(ptr) 3711 v.AddArg(idx) 3712 v.AddArg(mem) 3713 return true 3714 } 3715 // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) 3716 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 3717 // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) 3718 for { 3719 c := v.AuxInt 3720 s := v.Aux 3721 _ = v.Args[2] 3722 p := v.Args[0] 3723 i := v.Args[1] 3724 x := v.Args[2] 3725 if x.Op != Op386MOVBstoreconstidx1 { 3726 break 3727 } 3728 a := x.AuxInt 3729 if x.Aux != s { 3730 break 3731 } 3732 _ = x.Args[2] 3733 if p != x.Args[0] { 3734 break 3735 } 3736 if i != x.Args[1] { 3737 break 3738 } 3739 mem := x.Args[2] 3740 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 3741 break 3742 } 3743 v.reset(Op386MOVWstoreconstidx1) 3744 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 3745 v.Aux = s 3746 v.AddArg(p) 3747 v.AddArg(i) 3748 v.AddArg(mem) 3749 return true 3750 } 3751 return false 3752 } 3753 func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { 3754 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 3755 // cond: 3756 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3757 for { 3758 c := v.AuxInt 3759 sym := v.Aux 3760 _ = v.Args[3] 3761 v_0 := v.Args[0] 3762 if v_0.Op != Op386ADDLconst { 3763 break 3764 } 3765 d := v_0.AuxInt 3766 ptr := v_0.Args[0] 3767 idx := v.Args[1] 3768 val := v.Args[2] 3769 mem := v.Args[3] 3770 v.reset(Op386MOVBstoreidx1) 3771 v.AuxInt = int64(int32(c + d)) 3772 v.Aux = sym 3773 v.AddArg(ptr) 3774 v.AddArg(idx) 3775 v.AddArg(val) 3776 v.AddArg(mem) 3777 return true 3778 } 3779 // match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 3780 // cond: 3781 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3782 for { 3783 c := v.AuxInt 3784 sym := v.Aux 3785 _ = v.Args[3] 3786 idx := v.Args[0] 3787 v_1 := v.Args[1] 3788 if v_1.Op != Op386ADDLconst { 3789 break 3790 } 3791 d := v_1.AuxInt 3792 ptr := v_1.Args[0] 3793 val := v.Args[2] 3794 mem := v.Args[3] 3795 v.reset(Op386MOVBstoreidx1) 3796 v.AuxInt = int64(int32(c + d)) 3797 v.Aux = sym 3798 v.AddArg(ptr) 3799 v.AddArg(idx) 3800 v.AddArg(val) 3801 v.AddArg(mem) 3802 return true 3803 } 3804 // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 3805 // cond: 3806 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3807 for { 3808 c := v.AuxInt 3809 sym := v.Aux 3810 _ = v.Args[3] 3811 ptr := v.Args[0] 3812 v_1 := v.Args[1] 3813 if v_1.Op != Op386ADDLconst { 3814 break 3815 } 3816 d := v_1.AuxInt 3817 idx := v_1.Args[0] 3818 val := v.Args[2] 3819 mem := v.Args[3] 3820 v.reset(Op386MOVBstoreidx1) 3821 v.AuxInt = int64(int32(c + d)) 3822 v.Aux = sym 3823 v.AddArg(ptr) 3824 v.AddArg(idx) 3825 v.AddArg(val) 3826 v.AddArg(mem) 3827 return true 3828 } 3829 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 3830 // cond: 3831 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 3832 for { 3833 c := v.AuxInt 3834 sym := v.Aux 3835 _ = v.Args[3] 3836 v_0 := v.Args[0] 3837 if v_0.Op != Op386ADDLconst { 3838 break 3839 } 3840 d := v_0.AuxInt 3841 idx := v_0.Args[0] 3842 ptr := v.Args[1] 3843 val := v.Args[2] 3844 mem := v.Args[3] 3845 v.reset(Op386MOVBstoreidx1) 3846 v.AuxInt = int64(int32(c + d)) 3847 v.Aux = sym 3848 v.AddArg(ptr) 3849 v.AddArg(idx) 3850 v.AddArg(val) 3851 v.AddArg(mem) 3852 return true 3853 } 3854 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3855 // cond: x.Uses == 1 && clobber(x) 3856 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3857 for { 3858 i := v.AuxInt 3859 s := v.Aux 3860 _ = v.Args[3] 3861 p := v.Args[0] 3862 idx := v.Args[1] 3863 v_2 := v.Args[2] 3864 if v_2.Op != Op386SHRLconst { 3865 break 3866 } 3867 if v_2.AuxInt != 8 { 3868 break 3869 } 3870 w := v_2.Args[0] 3871 x := v.Args[3] 3872 if x.Op != Op386MOVBstoreidx1 { 3873 break 3874 } 3875 if x.AuxInt != i-1 { 3876 break 3877 } 3878 if x.Aux != s { 3879 break 3880 } 3881 _ = x.Args[3] 3882 if p != x.Args[0] { 3883 break 3884 } 3885 if idx != x.Args[1] { 3886 break 3887 } 3888 if w != x.Args[2] { 3889 break 3890 } 3891 mem := x.Args[3] 3892 if !(x.Uses == 1 && clobber(x)) { 3893 break 3894 } 3895 v.reset(Op386MOVWstoreidx1) 3896 v.AuxInt = i - 1 3897 v.Aux = s 3898 v.AddArg(p) 3899 v.AddArg(idx) 3900 v.AddArg(w) 3901 v.AddArg(mem) 3902 return true 3903 } 3904 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 3905 // cond: x.Uses == 1 && clobber(x) 3906 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3907 for { 3908 i := v.AuxInt 3909 s := v.Aux 3910 _ = v.Args[3] 3911 p := v.Args[0] 3912 idx := v.Args[1] 3913 v_2 := v.Args[2] 3914 if v_2.Op != Op386SHRLconst { 3915 break 3916 } 3917 if v_2.AuxInt != 8 { 3918 break 3919 } 3920 w := v_2.Args[0] 3921 x := v.Args[3] 3922 if x.Op != Op386MOVBstoreidx1 { 3923 break 3924 } 3925 if x.AuxInt != i-1 { 3926 break 3927 } 3928 if x.Aux != s { 3929 break 3930 } 3931 _ = x.Args[3] 3932 if idx != x.Args[0] { 3933 break 3934 } 3935 if p != x.Args[1] { 3936 break 3937 } 3938 if w != x.Args[2] { 3939 break 3940 } 3941 mem := x.Args[3] 3942 if !(x.Uses == 1 && clobber(x)) { 3943 break 3944 } 3945 v.reset(Op386MOVWstoreidx1) 3946 v.AuxInt = i - 1 3947 v.Aux = s 3948 v.AddArg(p) 3949 v.AddArg(idx) 3950 v.AddArg(w) 3951 v.AddArg(mem) 3952 return true 3953 } 3954 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 3955 // cond: x.Uses == 1 && clobber(x) 3956 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 3957 for { 3958 i := v.AuxInt 3959 s := v.Aux 3960 _ = v.Args[3] 3961 idx := v.Args[0] 3962 p := v.Args[1] 3963 v_2 := v.Args[2] 3964 if v_2.Op != Op386SHRLconst { 3965 break 3966 } 3967 if v_2.AuxInt != 8 { 3968 break 3969 } 3970 w := v_2.Args[0] 3971 x := v.Args[3] 3972 if x.Op != Op386MOVBstoreidx1 { 3973 break 3974 } 3975 if x.AuxInt != i-1 { 3976 break 3977 } 3978 if x.Aux != s { 3979 break 3980 } 3981 _ = x.Args[3] 3982 if p != x.Args[0] { 3983 break 3984 } 3985 if idx != x.Args[1] { 3986 break 3987 } 3988 if w != x.Args[2] { 3989 break 3990 } 3991 mem := x.Args[3] 3992 if !(x.Uses == 1 && clobber(x)) { 3993 break 3994 } 3995 v.reset(Op386MOVWstoreidx1) 3996 v.AuxInt = i - 1 3997 v.Aux = s 3998 v.AddArg(p) 3999 v.AddArg(idx) 4000 v.AddArg(w) 4001 v.AddArg(mem) 4002 return true 4003 } 4004 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 4005 // cond: x.Uses == 1 && clobber(x) 4006 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 4007 for { 4008 i := v.AuxInt 4009 s := v.Aux 4010 _ = v.Args[3] 4011 idx := v.Args[0] 4012 p := v.Args[1] 4013 v_2 := v.Args[2] 4014 if v_2.Op != Op386SHRLconst { 4015 break 4016 } 4017 if v_2.AuxInt != 8 { 4018 break 4019 } 4020 w := v_2.Args[0] 4021 x := v.Args[3] 4022 if x.Op != Op386MOVBstoreidx1 { 4023 break 4024 } 4025 if x.AuxInt != i-1 { 4026 break 4027 } 4028 if x.Aux != s { 4029 break 4030 } 4031 _ = x.Args[3] 4032 if idx != x.Args[0] { 4033 break 4034 } 4035 if p != x.Args[1] { 4036 break 4037 } 4038 if w != x.Args[2] { 4039 break 4040 } 4041 mem := x.Args[3] 4042 if !(x.Uses == 1 && clobber(x)) { 4043 break 4044 } 4045 v.reset(Op386MOVWstoreidx1) 4046 v.AuxInt = i - 1 4047 v.Aux = s 4048 v.AddArg(p) 4049 v.AddArg(idx) 4050 v.AddArg(w) 4051 v.AddArg(mem) 4052 return true 4053 } 4054 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 4055 // cond: x.Uses == 1 && clobber(x) 4056 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4057 for { 4058 i := v.AuxInt 4059 s := v.Aux 4060 _ = v.Args[3] 4061 p := v.Args[0] 4062 idx := v.Args[1] 4063 v_2 := v.Args[2] 4064 if v_2.Op != Op386SHRLconst { 4065 break 4066 } 4067 j := v_2.AuxInt 4068 w := v_2.Args[0] 4069 x := v.Args[3] 4070 if x.Op != Op386MOVBstoreidx1 { 4071 break 4072 } 4073 if x.AuxInt != i-1 { 4074 break 4075 } 4076 if x.Aux != s { 4077 break 4078 } 4079 _ = x.Args[3] 4080 if p != x.Args[0] { 4081 break 4082 } 4083 if idx != x.Args[1] { 4084 break 4085 } 4086 w0 := x.Args[2] 4087 if w0.Op != Op386SHRLconst { 4088 break 4089 } 4090 if w0.AuxInt != j-8 { 4091 break 4092 } 4093 if w != w0.Args[0] { 4094 break 4095 } 4096 mem := x.Args[3] 4097 if !(x.Uses == 1 && clobber(x)) { 4098 break 4099 } 4100 v.reset(Op386MOVWstoreidx1) 4101 v.AuxInt = i - 1 4102 v.Aux = s 4103 v.AddArg(p) 4104 v.AddArg(idx) 4105 v.AddArg(w0) 4106 v.AddArg(mem) 4107 return true 4108 } 4109 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 4110 // cond: x.Uses == 1 && clobber(x) 4111 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4112 for { 4113 i := v.AuxInt 4114 s := v.Aux 4115 _ = v.Args[3] 4116 p := v.Args[0] 4117 idx := v.Args[1] 4118 v_2 := v.Args[2] 4119 if v_2.Op != Op386SHRLconst { 4120 break 4121 } 4122 j := v_2.AuxInt 4123 w := v_2.Args[0] 4124 x := v.Args[3] 4125 if x.Op != Op386MOVBstoreidx1 { 4126 break 4127 } 4128 if x.AuxInt != i-1 { 4129 break 4130 } 4131 if x.Aux != s { 4132 break 4133 } 4134 _ = x.Args[3] 4135 if idx != x.Args[0] { 4136 break 4137 } 4138 if p != x.Args[1] { 4139 break 4140 } 4141 w0 := x.Args[2] 4142 if w0.Op != Op386SHRLconst { 4143 break 4144 } 4145 if w0.AuxInt != j-8 { 4146 break 4147 } 4148 if w != w0.Args[0] { 4149 break 4150 } 4151 mem := x.Args[3] 4152 if !(x.Uses == 1 && clobber(x)) { 4153 break 4154 } 4155 v.reset(Op386MOVWstoreidx1) 4156 v.AuxInt = i - 1 4157 v.Aux = s 4158 v.AddArg(p) 4159 v.AddArg(idx) 4160 v.AddArg(w0) 4161 v.AddArg(mem) 4162 return true 4163 } 4164 return false 4165 } 4166 func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { 4167 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 4168 // cond: x.Uses == 1 && clobber(x) 4169 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4170 for { 4171 i := v.AuxInt 4172 s := v.Aux 4173 _ = v.Args[3] 4174 idx := v.Args[0] 4175 p := v.Args[1] 4176 v_2 := v.Args[2] 4177 if v_2.Op != Op386SHRLconst { 4178 break 4179 } 4180 j := v_2.AuxInt 4181 w := v_2.Args[0] 4182 x := v.Args[3] 4183 if x.Op != Op386MOVBstoreidx1 { 4184 break 4185 } 4186 if x.AuxInt != i-1 { 4187 break 4188 } 4189 if x.Aux != s { 4190 break 4191 } 4192 _ = x.Args[3] 4193 if p != x.Args[0] { 4194 break 4195 } 4196 if idx != x.Args[1] { 4197 break 4198 } 4199 w0 := x.Args[2] 4200 if w0.Op != Op386SHRLconst { 4201 break 4202 } 4203 if w0.AuxInt != j-8 { 4204 break 4205 } 4206 if w != w0.Args[0] { 4207 break 4208 } 4209 mem := x.Args[3] 4210 if !(x.Uses == 1 && clobber(x)) { 4211 break 4212 } 4213 v.reset(Op386MOVWstoreidx1) 4214 v.AuxInt = i - 1 4215 v.Aux = s 4216 v.AddArg(p) 4217 v.AddArg(idx) 4218 v.AddArg(w0) 4219 v.AddArg(mem) 4220 return true 4221 } 4222 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 4223 // cond: x.Uses == 1 && clobber(x) 4224 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 4225 for { 4226 i := v.AuxInt 4227 s := v.Aux 4228 _ = v.Args[3] 4229 idx := v.Args[0] 4230 p := v.Args[1] 4231 v_2 := v.Args[2] 4232 if v_2.Op != Op386SHRLconst { 4233 break 4234 } 4235 j := v_2.AuxInt 4236 w := v_2.Args[0] 4237 x := v.Args[3] 4238 if x.Op != Op386MOVBstoreidx1 { 4239 break 4240 } 4241 if x.AuxInt != i-1 { 4242 break 4243 } 4244 if x.Aux != s { 4245 break 4246 } 4247 _ = x.Args[3] 4248 if idx != x.Args[0] { 4249 break 4250 } 4251 if p != x.Args[1] { 4252 break 4253 } 4254 w0 := x.Args[2] 4255 if w0.Op != Op386SHRLconst { 4256 break 4257 } 4258 if w0.AuxInt != j-8 { 4259 break 4260 } 4261 if w != w0.Args[0] { 4262 break 4263 } 4264 mem := x.Args[3] 4265 if !(x.Uses == 1 && clobber(x)) { 4266 break 4267 } 4268 v.reset(Op386MOVWstoreidx1) 4269 v.AuxInt = i - 1 4270 v.Aux = s 4271 v.AddArg(p) 4272 v.AddArg(idx) 4273 v.AddArg(w0) 4274 v.AddArg(mem) 4275 return true 4276 } 4277 return false 4278 } 4279 func rewriteValue386_Op386MOVLload_0(v *Value) bool { 4280 b := v.Block 4281 _ = b 4282 config := b.Func.Config 4283 _ = config 4284 // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) 4285 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4286 // result: x 4287 for { 4288 off := v.AuxInt 4289 sym := v.Aux 4290 _ = v.Args[1] 4291 ptr := v.Args[0] 4292 v_1 := v.Args[1] 4293 if v_1.Op != Op386MOVLstore { 4294 break 4295 } 4296 off2 := v_1.AuxInt 4297 sym2 := v_1.Aux 4298 _ = v_1.Args[2] 4299 ptr2 := v_1.Args[0] 4300 x := v_1.Args[1] 4301 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4302 break 4303 } 4304 v.reset(OpCopy) 4305 v.Type = x.Type 4306 v.AddArg(x) 4307 return true 4308 } 4309 // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) 4310 // cond: is32Bit(off1+off2) 4311 // result: (MOVLload [off1+off2] {sym} ptr mem) 4312 for { 4313 off1 := v.AuxInt 4314 sym := v.Aux 4315 _ = v.Args[1] 4316 v_0 := v.Args[0] 4317 if v_0.Op != Op386ADDLconst { 4318 break 4319 } 4320 off2 := v_0.AuxInt 4321 ptr := v_0.Args[0] 4322 mem := v.Args[1] 4323 if !(is32Bit(off1 + off2)) { 4324 break 4325 } 4326 v.reset(Op386MOVLload) 4327 v.AuxInt = off1 + off2 4328 v.Aux = sym 4329 v.AddArg(ptr) 4330 v.AddArg(mem) 4331 return true 4332 } 4333 // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 4334 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4335 // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) 4336 for { 4337 off1 := v.AuxInt 4338 sym1 := v.Aux 4339 _ = v.Args[1] 4340 v_0 := v.Args[0] 4341 if v_0.Op != Op386LEAL { 4342 break 4343 } 4344 off2 := v_0.AuxInt 4345 sym2 := v_0.Aux 4346 base := v_0.Args[0] 4347 mem := v.Args[1] 4348 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4349 break 4350 } 4351 v.reset(Op386MOVLload) 4352 v.AuxInt = off1 + off2 4353 v.Aux = mergeSym(sym1, sym2) 4354 v.AddArg(base) 4355 v.AddArg(mem) 4356 return true 4357 } 4358 // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 4359 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4360 // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4361 for { 4362 off1 := v.AuxInt 4363 sym1 := v.Aux 4364 _ = v.Args[1] 4365 v_0 := v.Args[0] 4366 if v_0.Op != Op386LEAL1 { 4367 break 4368 } 4369 off2 := v_0.AuxInt 4370 sym2 := v_0.Aux 4371 _ = v_0.Args[1] 4372 ptr := v_0.Args[0] 4373 idx := v_0.Args[1] 4374 mem := v.Args[1] 4375 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4376 break 4377 } 4378 v.reset(Op386MOVLloadidx1) 4379 v.AuxInt = off1 + off2 4380 v.Aux = mergeSym(sym1, sym2) 4381 v.AddArg(ptr) 4382 v.AddArg(idx) 4383 v.AddArg(mem) 4384 return true 4385 } 4386 // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 4387 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4388 // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 4389 for { 4390 off1 := v.AuxInt 4391 sym1 := v.Aux 4392 _ = v.Args[1] 4393 v_0 := v.Args[0] 4394 if v_0.Op != Op386LEAL4 { 4395 break 4396 } 4397 off2 := v_0.AuxInt 4398 sym2 := v_0.Aux 4399 _ = v_0.Args[1] 4400 ptr := v_0.Args[0] 4401 idx := v_0.Args[1] 4402 mem := v.Args[1] 4403 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4404 break 4405 } 4406 v.reset(Op386MOVLloadidx4) 4407 v.AuxInt = off1 + off2 4408 v.Aux = mergeSym(sym1, sym2) 4409 v.AddArg(ptr) 4410 v.AddArg(idx) 4411 v.AddArg(mem) 4412 return true 4413 } 4414 // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) 4415 // cond: ptr.Op != OpSB 4416 // result: (MOVLloadidx1 [off] {sym} ptr idx mem) 4417 for { 4418 off := v.AuxInt 4419 sym := v.Aux 4420 _ = v.Args[1] 4421 v_0 := v.Args[0] 4422 if v_0.Op != Op386ADDL { 4423 break 4424 } 4425 _ = v_0.Args[1] 4426 ptr := v_0.Args[0] 4427 idx := v_0.Args[1] 4428 mem := v.Args[1] 4429 if !(ptr.Op != OpSB) { 4430 break 4431 } 4432 v.reset(Op386MOVLloadidx1) 4433 v.AuxInt = off 4434 v.Aux = sym 4435 v.AddArg(ptr) 4436 v.AddArg(idx) 4437 v.AddArg(mem) 4438 return true 4439 } 4440 return false 4441 } 4442 func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { 4443 // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4444 // cond: 4445 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4446 for { 4447 c := v.AuxInt 4448 sym := v.Aux 4449 _ = v.Args[2] 4450 ptr := v.Args[0] 4451 v_1 := v.Args[1] 4452 if v_1.Op != Op386SHLLconst { 4453 break 4454 } 4455 if v_1.AuxInt != 2 { 4456 break 4457 } 4458 idx := v_1.Args[0] 4459 mem := v.Args[2] 4460 v.reset(Op386MOVLloadidx4) 4461 v.AuxInt = c 4462 v.Aux = sym 4463 v.AddArg(ptr) 4464 v.AddArg(idx) 4465 v.AddArg(mem) 4466 return true 4467 } 4468 // match: (MOVLloadidx1 [c] {sym} (SHLLconst [2] idx) ptr mem) 4469 // cond: 4470 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 4471 for { 4472 c := v.AuxInt 4473 sym := v.Aux 4474 _ = v.Args[2] 4475 v_0 := v.Args[0] 4476 if v_0.Op != Op386SHLLconst { 4477 break 4478 } 4479 if v_0.AuxInt != 2 { 4480 break 4481 } 4482 idx := v_0.Args[0] 4483 ptr := v.Args[1] 4484 mem := v.Args[2] 4485 v.reset(Op386MOVLloadidx4) 4486 v.AuxInt = c 4487 v.Aux = sym 4488 v.AddArg(ptr) 4489 v.AddArg(idx) 4490 v.AddArg(mem) 4491 return true 4492 } 4493 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 4494 // cond: 4495 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4496 for { 4497 c := v.AuxInt 4498 sym := v.Aux 4499 _ = v.Args[2] 4500 v_0 := v.Args[0] 4501 if v_0.Op != Op386ADDLconst { 4502 break 4503 } 4504 d := v_0.AuxInt 4505 ptr := v_0.Args[0] 4506 idx := v.Args[1] 4507 mem := v.Args[2] 4508 v.reset(Op386MOVLloadidx1) 4509 v.AuxInt = int64(int32(c + d)) 4510 v.Aux = sym 4511 v.AddArg(ptr) 4512 v.AddArg(idx) 4513 v.AddArg(mem) 4514 return true 4515 } 4516 // match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 4517 // cond: 4518 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4519 for { 4520 c := v.AuxInt 4521 sym := v.Aux 4522 _ = v.Args[2] 4523 idx := v.Args[0] 4524 v_1 := v.Args[1] 4525 if v_1.Op != Op386ADDLconst { 4526 break 4527 } 4528 d := v_1.AuxInt 4529 ptr := v_1.Args[0] 4530 mem := v.Args[2] 4531 v.reset(Op386MOVLloadidx1) 4532 v.AuxInt = int64(int32(c + d)) 4533 v.Aux = sym 4534 v.AddArg(ptr) 4535 v.AddArg(idx) 4536 v.AddArg(mem) 4537 return true 4538 } 4539 // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 4540 // cond: 4541 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4542 for { 4543 c := v.AuxInt 4544 sym := v.Aux 4545 _ = v.Args[2] 4546 ptr := v.Args[0] 4547 v_1 := v.Args[1] 4548 if v_1.Op != Op386ADDLconst { 4549 break 4550 } 4551 d := v_1.AuxInt 4552 idx := v_1.Args[0] 4553 mem := v.Args[2] 4554 v.reset(Op386MOVLloadidx1) 4555 v.AuxInt = int64(int32(c + d)) 4556 v.Aux = sym 4557 v.AddArg(ptr) 4558 v.AddArg(idx) 4559 v.AddArg(mem) 4560 return true 4561 } 4562 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 4563 // cond: 4564 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 4565 for { 4566 c := v.AuxInt 4567 sym := v.Aux 4568 _ = v.Args[2] 4569 v_0 := v.Args[0] 4570 if v_0.Op != Op386ADDLconst { 4571 break 4572 } 4573 d := v_0.AuxInt 4574 idx := v_0.Args[0] 4575 ptr := v.Args[1] 4576 mem := v.Args[2] 4577 v.reset(Op386MOVLloadidx1) 4578 v.AuxInt = int64(int32(c + d)) 4579 v.Aux = sym 4580 v.AddArg(ptr) 4581 v.AddArg(idx) 4582 v.AddArg(mem) 4583 return true 4584 } 4585 return false 4586 } 4587 func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { 4588 // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 4589 // cond: 4590 // result: (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) 4591 for { 4592 c := v.AuxInt 4593 sym := v.Aux 4594 _ = v.Args[2] 4595 v_0 := v.Args[0] 4596 if v_0.Op != Op386ADDLconst { 4597 break 4598 } 4599 d := v_0.AuxInt 4600 ptr := v_0.Args[0] 4601 idx := v.Args[1] 4602 mem := v.Args[2] 4603 v.reset(Op386MOVLloadidx4) 4604 v.AuxInt = int64(int32(c + d)) 4605 v.Aux = sym 4606 v.AddArg(ptr) 4607 v.AddArg(idx) 4608 v.AddArg(mem) 4609 return true 4610 } 4611 // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 4612 // cond: 4613 // result: (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) 4614 for { 4615 c := v.AuxInt 4616 sym := v.Aux 4617 _ = v.Args[2] 4618 ptr := v.Args[0] 4619 v_1 := v.Args[1] 4620 if v_1.Op != Op386ADDLconst { 4621 break 4622 } 4623 d := v_1.AuxInt 4624 idx := v_1.Args[0] 4625 mem := v.Args[2] 4626 v.reset(Op386MOVLloadidx4) 4627 v.AuxInt = int64(int32(c + 4*d)) 4628 v.Aux = sym 4629 v.AddArg(ptr) 4630 v.AddArg(idx) 4631 v.AddArg(mem) 4632 return true 4633 } 4634 return false 4635 } 4636 func rewriteValue386_Op386MOVLstore_0(v *Value) bool { 4637 b := v.Block 4638 _ = b 4639 config := b.Func.Config 4640 _ = config 4641 // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 4642 // cond: is32Bit(off1+off2) 4643 // result: (MOVLstore [off1+off2] {sym} ptr val mem) 4644 for { 4645 off1 := v.AuxInt 4646 sym := v.Aux 4647 _ = v.Args[2] 4648 v_0 := v.Args[0] 4649 if v_0.Op != Op386ADDLconst { 4650 break 4651 } 4652 off2 := v_0.AuxInt 4653 ptr := v_0.Args[0] 4654 val := v.Args[1] 4655 mem := v.Args[2] 4656 if !(is32Bit(off1 + off2)) { 4657 break 4658 } 4659 v.reset(Op386MOVLstore) 4660 v.AuxInt = off1 + off2 4661 v.Aux = sym 4662 v.AddArg(ptr) 4663 v.AddArg(val) 4664 v.AddArg(mem) 4665 return true 4666 } 4667 // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) 4668 // cond: validOff(off) 4669 // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 4670 for { 4671 off := v.AuxInt 4672 sym := v.Aux 4673 _ = v.Args[2] 4674 ptr := v.Args[0] 4675 v_1 := v.Args[1] 4676 if v_1.Op != Op386MOVLconst { 4677 break 4678 } 4679 c := v_1.AuxInt 4680 mem := v.Args[2] 4681 if !(validOff(off)) { 4682 break 4683 } 4684 v.reset(Op386MOVLstoreconst) 4685 v.AuxInt = makeValAndOff(int64(int32(c)), off) 4686 v.Aux = sym 4687 v.AddArg(ptr) 4688 v.AddArg(mem) 4689 return true 4690 } 4691 // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 4692 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4693 // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 4694 for { 4695 off1 := v.AuxInt 4696 sym1 := v.Aux 4697 _ = v.Args[2] 4698 v_0 := v.Args[0] 4699 if v_0.Op != Op386LEAL { 4700 break 4701 } 4702 off2 := v_0.AuxInt 4703 sym2 := v_0.Aux 4704 base := v_0.Args[0] 4705 val := v.Args[1] 4706 mem := v.Args[2] 4707 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4708 break 4709 } 4710 v.reset(Op386MOVLstore) 4711 v.AuxInt = off1 + off2 4712 v.Aux = mergeSym(sym1, sym2) 4713 v.AddArg(base) 4714 v.AddArg(val) 4715 v.AddArg(mem) 4716 return true 4717 } 4718 // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 4719 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4720 // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4721 for { 4722 off1 := v.AuxInt 4723 sym1 := v.Aux 4724 _ = v.Args[2] 4725 v_0 := v.Args[0] 4726 if v_0.Op != Op386LEAL1 { 4727 break 4728 } 4729 off2 := v_0.AuxInt 4730 sym2 := v_0.Aux 4731 _ = v_0.Args[1] 4732 ptr := v_0.Args[0] 4733 idx := v_0.Args[1] 4734 val := v.Args[1] 4735 mem := v.Args[2] 4736 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4737 break 4738 } 4739 v.reset(Op386MOVLstoreidx1) 4740 v.AuxInt = off1 + off2 4741 v.Aux = mergeSym(sym1, sym2) 4742 v.AddArg(ptr) 4743 v.AddArg(idx) 4744 v.AddArg(val) 4745 v.AddArg(mem) 4746 return true 4747 } 4748 // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 4749 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4750 // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 4751 for { 4752 off1 := v.AuxInt 4753 sym1 := v.Aux 4754 _ = v.Args[2] 4755 v_0 := v.Args[0] 4756 if v_0.Op != Op386LEAL4 { 4757 break 4758 } 4759 off2 := v_0.AuxInt 4760 sym2 := v_0.Aux 4761 _ = v_0.Args[1] 4762 ptr := v_0.Args[0] 4763 idx := v_0.Args[1] 4764 val := v.Args[1] 4765 mem := v.Args[2] 4766 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4767 break 4768 } 4769 v.reset(Op386MOVLstoreidx4) 4770 v.AuxInt = off1 + off2 4771 v.Aux = mergeSym(sym1, sym2) 4772 v.AddArg(ptr) 4773 v.AddArg(idx) 4774 v.AddArg(val) 4775 v.AddArg(mem) 4776 return true 4777 } 4778 // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) 4779 // cond: ptr.Op != OpSB 4780 // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) 4781 for { 4782 off := v.AuxInt 4783 sym := v.Aux 4784 _ = v.Args[2] 4785 v_0 := v.Args[0] 4786 if v_0.Op != Op386ADDL { 4787 break 4788 } 4789 _ = v_0.Args[1] 4790 ptr := v_0.Args[0] 4791 idx := v_0.Args[1] 4792 val := v.Args[1] 4793 mem := v.Args[2] 4794 if !(ptr.Op != OpSB) { 4795 break 4796 } 4797 v.reset(Op386MOVLstoreidx1) 4798 v.AuxInt = off 4799 v.Aux = sym 4800 v.AddArg(ptr) 4801 v.AddArg(idx) 4802 v.AddArg(val) 4803 v.AddArg(mem) 4804 return true 4805 } 4806 return false 4807 } 4808 func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { 4809 b := v.Block 4810 _ = b 4811 config := b.Func.Config 4812 _ = config 4813 // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 4814 // cond: ValAndOff(sc).canAdd(off) 4815 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 4816 for { 4817 sc := v.AuxInt 4818 s := v.Aux 4819 _ = v.Args[1] 4820 v_0 := v.Args[0] 4821 if v_0.Op != Op386ADDLconst { 4822 break 4823 } 4824 off := v_0.AuxInt 4825 ptr := v_0.Args[0] 4826 mem := v.Args[1] 4827 if !(ValAndOff(sc).canAdd(off)) { 4828 break 4829 } 4830 v.reset(Op386MOVLstoreconst) 4831 v.AuxInt = ValAndOff(sc).add(off) 4832 v.Aux = s 4833 v.AddArg(ptr) 4834 v.AddArg(mem) 4835 return true 4836 } 4837 // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 4838 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 4839 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 4840 for { 4841 sc := v.AuxInt 4842 sym1 := v.Aux 4843 _ = v.Args[1] 4844 v_0 := v.Args[0] 4845 if v_0.Op != Op386LEAL { 4846 break 4847 } 4848 off := v_0.AuxInt 4849 sym2 := v_0.Aux 4850 ptr := v_0.Args[0] 4851 mem := v.Args[1] 4852 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 4853 break 4854 } 4855 v.reset(Op386MOVLstoreconst) 4856 v.AuxInt = ValAndOff(sc).add(off) 4857 v.Aux = mergeSym(sym1, sym2) 4858 v.AddArg(ptr) 4859 v.AddArg(mem) 4860 return true 4861 } 4862 // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 4863 // cond: canMergeSym(sym1, sym2) 4864 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4865 for { 4866 x := v.AuxInt 4867 sym1 := v.Aux 4868 _ = v.Args[1] 4869 v_0 := v.Args[0] 4870 if v_0.Op != Op386LEAL1 { 4871 break 4872 } 4873 off := v_0.AuxInt 4874 sym2 := v_0.Aux 4875 _ = v_0.Args[1] 4876 ptr := v_0.Args[0] 4877 idx := v_0.Args[1] 4878 mem := v.Args[1] 4879 if !(canMergeSym(sym1, sym2)) { 4880 break 4881 } 4882 v.reset(Op386MOVLstoreconstidx1) 4883 v.AuxInt = ValAndOff(x).add(off) 4884 v.Aux = mergeSym(sym1, sym2) 4885 v.AddArg(ptr) 4886 v.AddArg(idx) 4887 v.AddArg(mem) 4888 return true 4889 } 4890 // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) 4891 // cond: canMergeSym(sym1, sym2) 4892 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 4893 for { 4894 x := v.AuxInt 4895 sym1 := v.Aux 4896 _ = v.Args[1] 4897 v_0 := v.Args[0] 4898 if v_0.Op != Op386LEAL4 { 4899 break 4900 } 4901 off := v_0.AuxInt 4902 sym2 := v_0.Aux 4903 _ = v_0.Args[1] 4904 ptr := v_0.Args[0] 4905 idx := v_0.Args[1] 4906 mem := v.Args[1] 4907 if !(canMergeSym(sym1, sym2)) { 4908 break 4909 } 4910 v.reset(Op386MOVLstoreconstidx4) 4911 v.AuxInt = ValAndOff(x).add(off) 4912 v.Aux = mergeSym(sym1, sym2) 4913 v.AddArg(ptr) 4914 v.AddArg(idx) 4915 v.AddArg(mem) 4916 return true 4917 } 4918 // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) 4919 // cond: 4920 // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) 4921 for { 4922 x := v.AuxInt 4923 sym := v.Aux 4924 _ = v.Args[1] 4925 v_0 := v.Args[0] 4926 if v_0.Op != Op386ADDL { 4927 break 4928 } 4929 _ = v_0.Args[1] 4930 ptr := v_0.Args[0] 4931 idx := v_0.Args[1] 4932 mem := v.Args[1] 4933 v.reset(Op386MOVLstoreconstidx1) 4934 v.AuxInt = x 4935 v.Aux = sym 4936 v.AddArg(ptr) 4937 v.AddArg(idx) 4938 v.AddArg(mem) 4939 return true 4940 } 4941 return false 4942 } 4943 func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { 4944 // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 4945 // cond: 4946 // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) 4947 for { 4948 c := v.AuxInt 4949 sym := v.Aux 4950 _ = v.Args[2] 4951 ptr := v.Args[0] 4952 v_1 := v.Args[1] 4953 if v_1.Op != Op386SHLLconst { 4954 break 4955 } 4956 if v_1.AuxInt != 2 { 4957 break 4958 } 4959 idx := v_1.Args[0] 4960 mem := v.Args[2] 4961 v.reset(Op386MOVLstoreconstidx4) 4962 v.AuxInt = c 4963 v.Aux = sym 4964 v.AddArg(ptr) 4965 v.AddArg(idx) 4966 v.AddArg(mem) 4967 return true 4968 } 4969 // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 4970 // cond: 4971 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4972 for { 4973 x := v.AuxInt 4974 sym := v.Aux 4975 _ = v.Args[2] 4976 v_0 := v.Args[0] 4977 if v_0.Op != Op386ADDLconst { 4978 break 4979 } 4980 c := v_0.AuxInt 4981 ptr := v_0.Args[0] 4982 idx := v.Args[1] 4983 mem := v.Args[2] 4984 v.reset(Op386MOVLstoreconstidx1) 4985 v.AuxInt = ValAndOff(x).add(c) 4986 v.Aux = sym 4987 v.AddArg(ptr) 4988 v.AddArg(idx) 4989 v.AddArg(mem) 4990 return true 4991 } 4992 // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 4993 // cond: 4994 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 4995 for { 4996 x := v.AuxInt 4997 sym := v.Aux 4998 _ = v.Args[2] 4999 ptr := v.Args[0] 5000 v_1 := v.Args[1] 5001 if v_1.Op != Op386ADDLconst { 5002 break 5003 } 5004 c := v_1.AuxInt 5005 idx := v_1.Args[0] 5006 mem := v.Args[2] 5007 v.reset(Op386MOVLstoreconstidx1) 5008 v.AuxInt = ValAndOff(x).add(c) 5009 v.Aux = sym 5010 v.AddArg(ptr) 5011 v.AddArg(idx) 5012 v.AddArg(mem) 5013 return true 5014 } 5015 return false 5016 } 5017 func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { 5018 // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) 5019 // cond: 5020 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) 5021 for { 5022 x := v.AuxInt 5023 sym := v.Aux 5024 _ = v.Args[2] 5025 v_0 := v.Args[0] 5026 if v_0.Op != Op386ADDLconst { 5027 break 5028 } 5029 c := v_0.AuxInt 5030 ptr := v_0.Args[0] 5031 idx := v.Args[1] 5032 mem := v.Args[2] 5033 v.reset(Op386MOVLstoreconstidx4) 5034 v.AuxInt = ValAndOff(x).add(c) 5035 v.Aux = sym 5036 v.AddArg(ptr) 5037 v.AddArg(idx) 5038 v.AddArg(mem) 5039 return true 5040 } 5041 // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) 5042 // cond: 5043 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) 5044 for { 5045 x := v.AuxInt 5046 sym := v.Aux 5047 _ = v.Args[2] 5048 ptr := v.Args[0] 5049 v_1 := v.Args[1] 5050 if v_1.Op != Op386ADDLconst { 5051 break 5052 } 5053 c := v_1.AuxInt 5054 idx := v_1.Args[0] 5055 mem := v.Args[2] 5056 v.reset(Op386MOVLstoreconstidx4) 5057 v.AuxInt = ValAndOff(x).add(4 * c) 5058 v.Aux = sym 5059 v.AddArg(ptr) 5060 v.AddArg(idx) 5061 v.AddArg(mem) 5062 return true 5063 } 5064 return false 5065 } 5066 func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { 5067 // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) 5068 // cond: 5069 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 5070 for { 5071 c := v.AuxInt 5072 sym := v.Aux 5073 _ = v.Args[3] 5074 ptr := v.Args[0] 5075 v_1 := v.Args[1] 5076 if v_1.Op != Op386SHLLconst { 5077 break 5078 } 5079 if v_1.AuxInt != 2 { 5080 break 5081 } 5082 idx := v_1.Args[0] 5083 val := v.Args[2] 5084 mem := v.Args[3] 5085 v.reset(Op386MOVLstoreidx4) 5086 v.AuxInt = c 5087 v.Aux = sym 5088 v.AddArg(ptr) 5089 v.AddArg(idx) 5090 v.AddArg(val) 5091 v.AddArg(mem) 5092 return true 5093 } 5094 // match: (MOVLstoreidx1 [c] {sym} (SHLLconst [2] idx) ptr val mem) 5095 // cond: 5096 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 5097 for { 5098 c := v.AuxInt 5099 sym := v.Aux 5100 _ = v.Args[3] 5101 v_0 := v.Args[0] 5102 if v_0.Op != Op386SHLLconst { 5103 break 5104 } 5105 if v_0.AuxInt != 2 { 5106 break 5107 } 5108 idx := v_0.Args[0] 5109 ptr := v.Args[1] 5110 val := v.Args[2] 5111 mem := v.Args[3] 5112 v.reset(Op386MOVLstoreidx4) 5113 v.AuxInt = c 5114 v.Aux = sym 5115 v.AddArg(ptr) 5116 v.AddArg(idx) 5117 v.AddArg(val) 5118 v.AddArg(mem) 5119 return true 5120 } 5121 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5122 // cond: 5123 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5124 for { 5125 c := v.AuxInt 5126 sym := v.Aux 5127 _ = v.Args[3] 5128 v_0 := v.Args[0] 5129 if v_0.Op != Op386ADDLconst { 5130 break 5131 } 5132 d := v_0.AuxInt 5133 ptr := v_0.Args[0] 5134 idx := v.Args[1] 5135 val := v.Args[2] 5136 mem := v.Args[3] 5137 v.reset(Op386MOVLstoreidx1) 5138 v.AuxInt = int64(int32(c + d)) 5139 v.Aux = sym 5140 v.AddArg(ptr) 5141 v.AddArg(idx) 5142 v.AddArg(val) 5143 v.AddArg(mem) 5144 return true 5145 } 5146 // match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 5147 // cond: 5148 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5149 for { 5150 c := v.AuxInt 5151 sym := v.Aux 5152 _ = v.Args[3] 5153 idx := v.Args[0] 5154 v_1 := v.Args[1] 5155 if v_1.Op != Op386ADDLconst { 5156 break 5157 } 5158 d := v_1.AuxInt 5159 ptr := v_1.Args[0] 5160 val := v.Args[2] 5161 mem := v.Args[3] 5162 v.reset(Op386MOVLstoreidx1) 5163 v.AuxInt = int64(int32(c + d)) 5164 v.Aux = sym 5165 v.AddArg(ptr) 5166 v.AddArg(idx) 5167 v.AddArg(val) 5168 v.AddArg(mem) 5169 return true 5170 } 5171 // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5172 // cond: 5173 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5174 for { 5175 c := v.AuxInt 5176 sym := v.Aux 5177 _ = v.Args[3] 5178 ptr := v.Args[0] 5179 v_1 := v.Args[1] 5180 if v_1.Op != Op386ADDLconst { 5181 break 5182 } 5183 d := v_1.AuxInt 5184 idx := v_1.Args[0] 5185 val := v.Args[2] 5186 mem := v.Args[3] 5187 v.reset(Op386MOVLstoreidx1) 5188 v.AuxInt = int64(int32(c + d)) 5189 v.Aux = sym 5190 v.AddArg(ptr) 5191 v.AddArg(idx) 5192 v.AddArg(val) 5193 v.AddArg(mem) 5194 return true 5195 } 5196 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 5197 // cond: 5198 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5199 for { 5200 c := v.AuxInt 5201 sym := v.Aux 5202 _ = v.Args[3] 5203 v_0 := v.Args[0] 5204 if v_0.Op != Op386ADDLconst { 5205 break 5206 } 5207 d := v_0.AuxInt 5208 idx := v_0.Args[0] 5209 ptr := v.Args[1] 5210 val := v.Args[2] 5211 mem := v.Args[3] 5212 v.reset(Op386MOVLstoreidx1) 5213 v.AuxInt = int64(int32(c + d)) 5214 v.Aux = sym 5215 v.AddArg(ptr) 5216 v.AddArg(idx) 5217 v.AddArg(val) 5218 v.AddArg(mem) 5219 return true 5220 } 5221 return false 5222 } 5223 func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { 5224 // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5225 // cond: 5226 // result: (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) 5227 for { 5228 c := v.AuxInt 5229 sym := v.Aux 5230 _ = v.Args[3] 5231 v_0 := v.Args[0] 5232 if v_0.Op != Op386ADDLconst { 5233 break 5234 } 5235 d := v_0.AuxInt 5236 ptr := v_0.Args[0] 5237 idx := v.Args[1] 5238 val := v.Args[2] 5239 mem := v.Args[3] 5240 v.reset(Op386MOVLstoreidx4) 5241 v.AuxInt = int64(int32(c + d)) 5242 v.Aux = sym 5243 v.AddArg(ptr) 5244 v.AddArg(idx) 5245 v.AddArg(val) 5246 v.AddArg(mem) 5247 return true 5248 } 5249 // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5250 // cond: 5251 // result: (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) 5252 for { 5253 c := v.AuxInt 5254 sym := v.Aux 5255 _ = v.Args[3] 5256 ptr := v.Args[0] 5257 v_1 := v.Args[1] 5258 if v_1.Op != Op386ADDLconst { 5259 break 5260 } 5261 d := v_1.AuxInt 5262 idx := v_1.Args[0] 5263 val := v.Args[2] 5264 mem := v.Args[3] 5265 v.reset(Op386MOVLstoreidx4) 5266 v.AuxInt = int64(int32(c + 4*d)) 5267 v.Aux = sym 5268 v.AddArg(ptr) 5269 v.AddArg(idx) 5270 v.AddArg(val) 5271 v.AddArg(mem) 5272 return true 5273 } 5274 return false 5275 } 5276 func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { 5277 b := v.Block 5278 _ = b 5279 config := b.Func.Config 5280 _ = config 5281 typ := &b.Func.Config.Types 5282 _ = typ 5283 // match: (MOVSDconst [c]) 5284 // cond: config.ctxt.Flag_shared 5285 // result: (MOVSDconst2 (MOVSDconst1 [c])) 5286 for { 5287 c := v.AuxInt 5288 if !(config.ctxt.Flag_shared) { 5289 break 5290 } 5291 v.reset(Op386MOVSDconst2) 5292 v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, typ.UInt32) 5293 v0.AuxInt = c 5294 v.AddArg(v0) 5295 return true 5296 } 5297 return false 5298 } 5299 func rewriteValue386_Op386MOVSDload_0(v *Value) bool { 5300 b := v.Block 5301 _ = b 5302 config := b.Func.Config 5303 _ = config 5304 // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) 5305 // cond: is32Bit(off1+off2) 5306 // result: (MOVSDload [off1+off2] {sym} ptr mem) 5307 for { 5308 off1 := v.AuxInt 5309 sym := v.Aux 5310 _ = v.Args[1] 5311 v_0 := v.Args[0] 5312 if v_0.Op != Op386ADDLconst { 5313 break 5314 } 5315 off2 := v_0.AuxInt 5316 ptr := v_0.Args[0] 5317 mem := v.Args[1] 5318 if !(is32Bit(off1 + off2)) { 5319 break 5320 } 5321 v.reset(Op386MOVSDload) 5322 v.AuxInt = off1 + off2 5323 v.Aux = sym 5324 v.AddArg(ptr) 5325 v.AddArg(mem) 5326 return true 5327 } 5328 // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5329 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5330 // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5331 for { 5332 off1 := v.AuxInt 5333 sym1 := v.Aux 5334 _ = v.Args[1] 5335 v_0 := v.Args[0] 5336 if v_0.Op != Op386LEAL { 5337 break 5338 } 5339 off2 := v_0.AuxInt 5340 sym2 := v_0.Aux 5341 base := v_0.Args[0] 5342 mem := v.Args[1] 5343 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5344 break 5345 } 5346 v.reset(Op386MOVSDload) 5347 v.AuxInt = off1 + off2 5348 v.Aux = mergeSym(sym1, sym2) 5349 v.AddArg(base) 5350 v.AddArg(mem) 5351 return true 5352 } 5353 // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5354 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5355 // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5356 for { 5357 off1 := v.AuxInt 5358 sym1 := v.Aux 5359 _ = v.Args[1] 5360 v_0 := v.Args[0] 5361 if v_0.Op != Op386LEAL1 { 5362 break 5363 } 5364 off2 := v_0.AuxInt 5365 sym2 := v_0.Aux 5366 _ = v_0.Args[1] 5367 ptr := v_0.Args[0] 5368 idx := v_0.Args[1] 5369 mem := v.Args[1] 5370 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5371 break 5372 } 5373 v.reset(Op386MOVSDloadidx1) 5374 v.AuxInt = off1 + off2 5375 v.Aux = mergeSym(sym1, sym2) 5376 v.AddArg(ptr) 5377 v.AddArg(idx) 5378 v.AddArg(mem) 5379 return true 5380 } 5381 // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) 5382 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5383 // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5384 for { 5385 off1 := v.AuxInt 5386 sym1 := v.Aux 5387 _ = v.Args[1] 5388 v_0 := v.Args[0] 5389 if v_0.Op != Op386LEAL8 { 5390 break 5391 } 5392 off2 := v_0.AuxInt 5393 sym2 := v_0.Aux 5394 _ = v_0.Args[1] 5395 ptr := v_0.Args[0] 5396 idx := v_0.Args[1] 5397 mem := v.Args[1] 5398 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5399 break 5400 } 5401 v.reset(Op386MOVSDloadidx8) 5402 v.AuxInt = off1 + off2 5403 v.Aux = mergeSym(sym1, sym2) 5404 v.AddArg(ptr) 5405 v.AddArg(idx) 5406 v.AddArg(mem) 5407 return true 5408 } 5409 // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) 5410 // cond: ptr.Op != OpSB 5411 // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) 5412 for { 5413 off := v.AuxInt 5414 sym := v.Aux 5415 _ = v.Args[1] 5416 v_0 := v.Args[0] 5417 if v_0.Op != Op386ADDL { 5418 break 5419 } 5420 _ = v_0.Args[1] 5421 ptr := v_0.Args[0] 5422 idx := v_0.Args[1] 5423 mem := v.Args[1] 5424 if !(ptr.Op != OpSB) { 5425 break 5426 } 5427 v.reset(Op386MOVSDloadidx1) 5428 v.AuxInt = off 5429 v.Aux = sym 5430 v.AddArg(ptr) 5431 v.AddArg(idx) 5432 v.AddArg(mem) 5433 return true 5434 } 5435 return false 5436 } 5437 func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { 5438 // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5439 // cond: 5440 // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5441 for { 5442 c := v.AuxInt 5443 sym := v.Aux 5444 _ = v.Args[2] 5445 v_0 := v.Args[0] 5446 if v_0.Op != Op386ADDLconst { 5447 break 5448 } 5449 d := v_0.AuxInt 5450 ptr := v_0.Args[0] 5451 idx := v.Args[1] 5452 mem := v.Args[2] 5453 v.reset(Op386MOVSDloadidx1) 5454 v.AuxInt = int64(int32(c + d)) 5455 v.Aux = sym 5456 v.AddArg(ptr) 5457 v.AddArg(idx) 5458 v.AddArg(mem) 5459 return true 5460 } 5461 // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5462 // cond: 5463 // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5464 for { 5465 c := v.AuxInt 5466 sym := v.Aux 5467 _ = v.Args[2] 5468 ptr := v.Args[0] 5469 v_1 := v.Args[1] 5470 if v_1.Op != Op386ADDLconst { 5471 break 5472 } 5473 d := v_1.AuxInt 5474 idx := v_1.Args[0] 5475 mem := v.Args[2] 5476 v.reset(Op386MOVSDloadidx1) 5477 v.AuxInt = int64(int32(c + d)) 5478 v.Aux = sym 5479 v.AddArg(ptr) 5480 v.AddArg(idx) 5481 v.AddArg(mem) 5482 return true 5483 } 5484 return false 5485 } 5486 func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { 5487 // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) 5488 // cond: 5489 // result: (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem) 5490 for { 5491 c := v.AuxInt 5492 sym := v.Aux 5493 _ = v.Args[2] 5494 v_0 := v.Args[0] 5495 if v_0.Op != Op386ADDLconst { 5496 break 5497 } 5498 d := v_0.AuxInt 5499 ptr := v_0.Args[0] 5500 idx := v.Args[1] 5501 mem := v.Args[2] 5502 v.reset(Op386MOVSDloadidx8) 5503 v.AuxInt = int64(int32(c + d)) 5504 v.Aux = sym 5505 v.AddArg(ptr) 5506 v.AddArg(idx) 5507 v.AddArg(mem) 5508 return true 5509 } 5510 // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) 5511 // cond: 5512 // result: (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem) 5513 for { 5514 c := v.AuxInt 5515 sym := v.Aux 5516 _ = v.Args[2] 5517 ptr := v.Args[0] 5518 v_1 := v.Args[1] 5519 if v_1.Op != Op386ADDLconst { 5520 break 5521 } 5522 d := v_1.AuxInt 5523 idx := v_1.Args[0] 5524 mem := v.Args[2] 5525 v.reset(Op386MOVSDloadidx8) 5526 v.AuxInt = int64(int32(c + 8*d)) 5527 v.Aux = sym 5528 v.AddArg(ptr) 5529 v.AddArg(idx) 5530 v.AddArg(mem) 5531 return true 5532 } 5533 return false 5534 } 5535 func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { 5536 b := v.Block 5537 _ = b 5538 config := b.Func.Config 5539 _ = config 5540 // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5541 // cond: is32Bit(off1+off2) 5542 // result: (MOVSDstore [off1+off2] {sym} ptr val mem) 5543 for { 5544 off1 := v.AuxInt 5545 sym := v.Aux 5546 _ = v.Args[2] 5547 v_0 := v.Args[0] 5548 if v_0.Op != Op386ADDLconst { 5549 break 5550 } 5551 off2 := v_0.AuxInt 5552 ptr := v_0.Args[0] 5553 val := v.Args[1] 5554 mem := v.Args[2] 5555 if !(is32Bit(off1 + off2)) { 5556 break 5557 } 5558 v.reset(Op386MOVSDstore) 5559 v.AuxInt = off1 + off2 5560 v.Aux = sym 5561 v.AddArg(ptr) 5562 v.AddArg(val) 5563 v.AddArg(mem) 5564 return true 5565 } 5566 // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5567 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5568 // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5569 for { 5570 off1 := v.AuxInt 5571 sym1 := v.Aux 5572 _ = v.Args[2] 5573 v_0 := v.Args[0] 5574 if v_0.Op != Op386LEAL { 5575 break 5576 } 5577 off2 := v_0.AuxInt 5578 sym2 := v_0.Aux 5579 base := v_0.Args[0] 5580 val := v.Args[1] 5581 mem := v.Args[2] 5582 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5583 break 5584 } 5585 v.reset(Op386MOVSDstore) 5586 v.AuxInt = off1 + off2 5587 v.Aux = mergeSym(sym1, sym2) 5588 v.AddArg(base) 5589 v.AddArg(val) 5590 v.AddArg(mem) 5591 return true 5592 } 5593 // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5594 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5595 // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5596 for { 5597 off1 := v.AuxInt 5598 sym1 := v.Aux 5599 _ = v.Args[2] 5600 v_0 := v.Args[0] 5601 if v_0.Op != Op386LEAL1 { 5602 break 5603 } 5604 off2 := v_0.AuxInt 5605 sym2 := v_0.Aux 5606 _ = v_0.Args[1] 5607 ptr := v_0.Args[0] 5608 idx := v_0.Args[1] 5609 val := v.Args[1] 5610 mem := v.Args[2] 5611 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5612 break 5613 } 5614 v.reset(Op386MOVSDstoreidx1) 5615 v.AuxInt = off1 + off2 5616 v.Aux = mergeSym(sym1, sym2) 5617 v.AddArg(ptr) 5618 v.AddArg(idx) 5619 v.AddArg(val) 5620 v.AddArg(mem) 5621 return true 5622 } 5623 // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) 5624 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5625 // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5626 for { 5627 off1 := v.AuxInt 5628 sym1 := v.Aux 5629 _ = v.Args[2] 5630 v_0 := v.Args[0] 5631 if v_0.Op != Op386LEAL8 { 5632 break 5633 } 5634 off2 := v_0.AuxInt 5635 sym2 := v_0.Aux 5636 _ = v_0.Args[1] 5637 ptr := v_0.Args[0] 5638 idx := v_0.Args[1] 5639 val := v.Args[1] 5640 mem := v.Args[2] 5641 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5642 break 5643 } 5644 v.reset(Op386MOVSDstoreidx8) 5645 v.AuxInt = off1 + off2 5646 v.Aux = mergeSym(sym1, sym2) 5647 v.AddArg(ptr) 5648 v.AddArg(idx) 5649 v.AddArg(val) 5650 v.AddArg(mem) 5651 return true 5652 } 5653 // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) 5654 // cond: ptr.Op != OpSB 5655 // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) 5656 for { 5657 off := v.AuxInt 5658 sym := v.Aux 5659 _ = v.Args[2] 5660 v_0 := v.Args[0] 5661 if v_0.Op != Op386ADDL { 5662 break 5663 } 5664 _ = v_0.Args[1] 5665 ptr := v_0.Args[0] 5666 idx := v_0.Args[1] 5667 val := v.Args[1] 5668 mem := v.Args[2] 5669 if !(ptr.Op != OpSB) { 5670 break 5671 } 5672 v.reset(Op386MOVSDstoreidx1) 5673 v.AuxInt = off 5674 v.Aux = sym 5675 v.AddArg(ptr) 5676 v.AddArg(idx) 5677 v.AddArg(val) 5678 v.AddArg(mem) 5679 return true 5680 } 5681 return false 5682 } 5683 func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { 5684 // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5685 // cond: 5686 // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5687 for { 5688 c := v.AuxInt 5689 sym := v.Aux 5690 _ = v.Args[3] 5691 v_0 := v.Args[0] 5692 if v_0.Op != Op386ADDLconst { 5693 break 5694 } 5695 d := v_0.AuxInt 5696 ptr := v_0.Args[0] 5697 idx := v.Args[1] 5698 val := v.Args[2] 5699 mem := v.Args[3] 5700 v.reset(Op386MOVSDstoreidx1) 5701 v.AuxInt = int64(int32(c + d)) 5702 v.Aux = sym 5703 v.AddArg(ptr) 5704 v.AddArg(idx) 5705 v.AddArg(val) 5706 v.AddArg(mem) 5707 return true 5708 } 5709 // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5710 // cond: 5711 // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 5712 for { 5713 c := v.AuxInt 5714 sym := v.Aux 5715 _ = v.Args[3] 5716 ptr := v.Args[0] 5717 v_1 := v.Args[1] 5718 if v_1.Op != Op386ADDLconst { 5719 break 5720 } 5721 d := v_1.AuxInt 5722 idx := v_1.Args[0] 5723 val := v.Args[2] 5724 mem := v.Args[3] 5725 v.reset(Op386MOVSDstoreidx1) 5726 v.AuxInt = int64(int32(c + d)) 5727 v.Aux = sym 5728 v.AddArg(ptr) 5729 v.AddArg(idx) 5730 v.AddArg(val) 5731 v.AddArg(mem) 5732 return true 5733 } 5734 return false 5735 } 5736 func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { 5737 // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) 5738 // cond: 5739 // result: (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem) 5740 for { 5741 c := v.AuxInt 5742 sym := v.Aux 5743 _ = v.Args[3] 5744 v_0 := v.Args[0] 5745 if v_0.Op != Op386ADDLconst { 5746 break 5747 } 5748 d := v_0.AuxInt 5749 ptr := v_0.Args[0] 5750 idx := v.Args[1] 5751 val := v.Args[2] 5752 mem := v.Args[3] 5753 v.reset(Op386MOVSDstoreidx8) 5754 v.AuxInt = int64(int32(c + d)) 5755 v.Aux = sym 5756 v.AddArg(ptr) 5757 v.AddArg(idx) 5758 v.AddArg(val) 5759 v.AddArg(mem) 5760 return true 5761 } 5762 // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) 5763 // cond: 5764 // result: (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem) 5765 for { 5766 c := v.AuxInt 5767 sym := v.Aux 5768 _ = v.Args[3] 5769 ptr := v.Args[0] 5770 v_1 := v.Args[1] 5771 if v_1.Op != Op386ADDLconst { 5772 break 5773 } 5774 d := v_1.AuxInt 5775 idx := v_1.Args[0] 5776 val := v.Args[2] 5777 mem := v.Args[3] 5778 v.reset(Op386MOVSDstoreidx8) 5779 v.AuxInt = int64(int32(c + 8*d)) 5780 v.Aux = sym 5781 v.AddArg(ptr) 5782 v.AddArg(idx) 5783 v.AddArg(val) 5784 v.AddArg(mem) 5785 return true 5786 } 5787 return false 5788 } 5789 func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { 5790 b := v.Block 5791 _ = b 5792 config := b.Func.Config 5793 _ = config 5794 typ := &b.Func.Config.Types 5795 _ = typ 5796 // match: (MOVSSconst [c]) 5797 // cond: config.ctxt.Flag_shared 5798 // result: (MOVSSconst2 (MOVSSconst1 [c])) 5799 for { 5800 c := v.AuxInt 5801 if !(config.ctxt.Flag_shared) { 5802 break 5803 } 5804 v.reset(Op386MOVSSconst2) 5805 v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, typ.UInt32) 5806 v0.AuxInt = c 5807 v.AddArg(v0) 5808 return true 5809 } 5810 return false 5811 } 5812 func rewriteValue386_Op386MOVSSload_0(v *Value) bool { 5813 b := v.Block 5814 _ = b 5815 config := b.Func.Config 5816 _ = config 5817 // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) 5818 // cond: is32Bit(off1+off2) 5819 // result: (MOVSSload [off1+off2] {sym} ptr mem) 5820 for { 5821 off1 := v.AuxInt 5822 sym := v.Aux 5823 _ = v.Args[1] 5824 v_0 := v.Args[0] 5825 if v_0.Op != Op386ADDLconst { 5826 break 5827 } 5828 off2 := v_0.AuxInt 5829 ptr := v_0.Args[0] 5830 mem := v.Args[1] 5831 if !(is32Bit(off1 + off2)) { 5832 break 5833 } 5834 v.reset(Op386MOVSSload) 5835 v.AuxInt = off1 + off2 5836 v.Aux = sym 5837 v.AddArg(ptr) 5838 v.AddArg(mem) 5839 return true 5840 } 5841 // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5842 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5843 // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5844 for { 5845 off1 := v.AuxInt 5846 sym1 := v.Aux 5847 _ = v.Args[1] 5848 v_0 := v.Args[0] 5849 if v_0.Op != Op386LEAL { 5850 break 5851 } 5852 off2 := v_0.AuxInt 5853 sym2 := v_0.Aux 5854 base := v_0.Args[0] 5855 mem := v.Args[1] 5856 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5857 break 5858 } 5859 v.reset(Op386MOVSSload) 5860 v.AuxInt = off1 + off2 5861 v.Aux = mergeSym(sym1, sym2) 5862 v.AddArg(base) 5863 v.AddArg(mem) 5864 return true 5865 } 5866 // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5867 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5868 // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5869 for { 5870 off1 := v.AuxInt 5871 sym1 := v.Aux 5872 _ = v.Args[1] 5873 v_0 := v.Args[0] 5874 if v_0.Op != Op386LEAL1 { 5875 break 5876 } 5877 off2 := v_0.AuxInt 5878 sym2 := v_0.Aux 5879 _ = v_0.Args[1] 5880 ptr := v_0.Args[0] 5881 idx := v_0.Args[1] 5882 mem := v.Args[1] 5883 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5884 break 5885 } 5886 v.reset(Op386MOVSSloadidx1) 5887 v.AuxInt = off1 + off2 5888 v.Aux = mergeSym(sym1, sym2) 5889 v.AddArg(ptr) 5890 v.AddArg(idx) 5891 v.AddArg(mem) 5892 return true 5893 } 5894 // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 5895 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5896 // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5897 for { 5898 off1 := v.AuxInt 5899 sym1 := v.Aux 5900 _ = v.Args[1] 5901 v_0 := v.Args[0] 5902 if v_0.Op != Op386LEAL4 { 5903 break 5904 } 5905 off2 := v_0.AuxInt 5906 sym2 := v_0.Aux 5907 _ = v_0.Args[1] 5908 ptr := v_0.Args[0] 5909 idx := v_0.Args[1] 5910 mem := v.Args[1] 5911 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5912 break 5913 } 5914 v.reset(Op386MOVSSloadidx4) 5915 v.AuxInt = off1 + off2 5916 v.Aux = mergeSym(sym1, sym2) 5917 v.AddArg(ptr) 5918 v.AddArg(idx) 5919 v.AddArg(mem) 5920 return true 5921 } 5922 // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) 5923 // cond: ptr.Op != OpSB 5924 // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) 5925 for { 5926 off := v.AuxInt 5927 sym := v.Aux 5928 _ = v.Args[1] 5929 v_0 := v.Args[0] 5930 if v_0.Op != Op386ADDL { 5931 break 5932 } 5933 _ = v_0.Args[1] 5934 ptr := v_0.Args[0] 5935 idx := v_0.Args[1] 5936 mem := v.Args[1] 5937 if !(ptr.Op != OpSB) { 5938 break 5939 } 5940 v.reset(Op386MOVSSloadidx1) 5941 v.AuxInt = off 5942 v.Aux = sym 5943 v.AddArg(ptr) 5944 v.AddArg(idx) 5945 v.AddArg(mem) 5946 return true 5947 } 5948 return false 5949 } 5950 func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { 5951 // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5952 // cond: 5953 // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5954 for { 5955 c := v.AuxInt 5956 sym := v.Aux 5957 _ = v.Args[2] 5958 v_0 := v.Args[0] 5959 if v_0.Op != Op386ADDLconst { 5960 break 5961 } 5962 d := v_0.AuxInt 5963 ptr := v_0.Args[0] 5964 idx := v.Args[1] 5965 mem := v.Args[2] 5966 v.reset(Op386MOVSSloadidx1) 5967 v.AuxInt = int64(int32(c + d)) 5968 v.Aux = sym 5969 v.AddArg(ptr) 5970 v.AddArg(idx) 5971 v.AddArg(mem) 5972 return true 5973 } 5974 // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5975 // cond: 5976 // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5977 for { 5978 c := v.AuxInt 5979 sym := v.Aux 5980 _ = v.Args[2] 5981 ptr := v.Args[0] 5982 v_1 := v.Args[1] 5983 if v_1.Op != Op386ADDLconst { 5984 break 5985 } 5986 d := v_1.AuxInt 5987 idx := v_1.Args[0] 5988 mem := v.Args[2] 5989 v.reset(Op386MOVSSloadidx1) 5990 v.AuxInt = int64(int32(c + d)) 5991 v.Aux = sym 5992 v.AddArg(ptr) 5993 v.AddArg(idx) 5994 v.AddArg(mem) 5995 return true 5996 } 5997 return false 5998 } 5999 func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { 6000 // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 6001 // cond: 6002 // result: (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) 6003 for { 6004 c := v.AuxInt 6005 sym := v.Aux 6006 _ = v.Args[2] 6007 v_0 := v.Args[0] 6008 if v_0.Op != Op386ADDLconst { 6009 break 6010 } 6011 d := v_0.AuxInt 6012 ptr := v_0.Args[0] 6013 idx := v.Args[1] 6014 mem := v.Args[2] 6015 v.reset(Op386MOVSSloadidx4) 6016 v.AuxInt = int64(int32(c + d)) 6017 v.Aux = sym 6018 v.AddArg(ptr) 6019 v.AddArg(idx) 6020 v.AddArg(mem) 6021 return true 6022 } 6023 // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 6024 // cond: 6025 // result: (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) 6026 for { 6027 c := v.AuxInt 6028 sym := v.Aux 6029 _ = v.Args[2] 6030 ptr := v.Args[0] 6031 v_1 := v.Args[1] 6032 if v_1.Op != Op386ADDLconst { 6033 break 6034 } 6035 d := v_1.AuxInt 6036 idx := v_1.Args[0] 6037 mem := v.Args[2] 6038 v.reset(Op386MOVSSloadidx4) 6039 v.AuxInt = int64(int32(c + 4*d)) 6040 v.Aux = sym 6041 v.AddArg(ptr) 6042 v.AddArg(idx) 6043 v.AddArg(mem) 6044 return true 6045 } 6046 return false 6047 } 6048 func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { 6049 b := v.Block 6050 _ = b 6051 config := b.Func.Config 6052 _ = config 6053 // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 6054 // cond: is32Bit(off1+off2) 6055 // result: (MOVSSstore [off1+off2] {sym} ptr val mem) 6056 for { 6057 off1 := v.AuxInt 6058 sym := v.Aux 6059 _ = v.Args[2] 6060 v_0 := v.Args[0] 6061 if v_0.Op != Op386ADDLconst { 6062 break 6063 } 6064 off2 := v_0.AuxInt 6065 ptr := v_0.Args[0] 6066 val := v.Args[1] 6067 mem := v.Args[2] 6068 if !(is32Bit(off1 + off2)) { 6069 break 6070 } 6071 v.reset(Op386MOVSSstore) 6072 v.AuxInt = off1 + off2 6073 v.Aux = sym 6074 v.AddArg(ptr) 6075 v.AddArg(val) 6076 v.AddArg(mem) 6077 return true 6078 } 6079 // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 6080 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6081 // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 6082 for { 6083 off1 := v.AuxInt 6084 sym1 := v.Aux 6085 _ = v.Args[2] 6086 v_0 := v.Args[0] 6087 if v_0.Op != Op386LEAL { 6088 break 6089 } 6090 off2 := v_0.AuxInt 6091 sym2 := v_0.Aux 6092 base := v_0.Args[0] 6093 val := v.Args[1] 6094 mem := v.Args[2] 6095 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6096 break 6097 } 6098 v.reset(Op386MOVSSstore) 6099 v.AuxInt = off1 + off2 6100 v.Aux = mergeSym(sym1, sym2) 6101 v.AddArg(base) 6102 v.AddArg(val) 6103 v.AddArg(mem) 6104 return true 6105 } 6106 // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 6107 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6108 // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6109 for { 6110 off1 := v.AuxInt 6111 sym1 := v.Aux 6112 _ = v.Args[2] 6113 v_0 := v.Args[0] 6114 if v_0.Op != Op386LEAL1 { 6115 break 6116 } 6117 off2 := v_0.AuxInt 6118 sym2 := v_0.Aux 6119 _ = v_0.Args[1] 6120 ptr := v_0.Args[0] 6121 idx := v_0.Args[1] 6122 val := v.Args[1] 6123 mem := v.Args[2] 6124 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6125 break 6126 } 6127 v.reset(Op386MOVSSstoreidx1) 6128 v.AuxInt = off1 + off2 6129 v.Aux = mergeSym(sym1, sym2) 6130 v.AddArg(ptr) 6131 v.AddArg(idx) 6132 v.AddArg(val) 6133 v.AddArg(mem) 6134 return true 6135 } 6136 // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 6137 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6138 // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6139 for { 6140 off1 := v.AuxInt 6141 sym1 := v.Aux 6142 _ = v.Args[2] 6143 v_0 := v.Args[0] 6144 if v_0.Op != Op386LEAL4 { 6145 break 6146 } 6147 off2 := v_0.AuxInt 6148 sym2 := v_0.Aux 6149 _ = v_0.Args[1] 6150 ptr := v_0.Args[0] 6151 idx := v_0.Args[1] 6152 val := v.Args[1] 6153 mem := v.Args[2] 6154 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6155 break 6156 } 6157 v.reset(Op386MOVSSstoreidx4) 6158 v.AuxInt = off1 + off2 6159 v.Aux = mergeSym(sym1, sym2) 6160 v.AddArg(ptr) 6161 v.AddArg(idx) 6162 v.AddArg(val) 6163 v.AddArg(mem) 6164 return true 6165 } 6166 // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) 6167 // cond: ptr.Op != OpSB 6168 // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) 6169 for { 6170 off := v.AuxInt 6171 sym := v.Aux 6172 _ = v.Args[2] 6173 v_0 := v.Args[0] 6174 if v_0.Op != Op386ADDL { 6175 break 6176 } 6177 _ = v_0.Args[1] 6178 ptr := v_0.Args[0] 6179 idx := v_0.Args[1] 6180 val := v.Args[1] 6181 mem := v.Args[2] 6182 if !(ptr.Op != OpSB) { 6183 break 6184 } 6185 v.reset(Op386MOVSSstoreidx1) 6186 v.AuxInt = off 6187 v.Aux = sym 6188 v.AddArg(ptr) 6189 v.AddArg(idx) 6190 v.AddArg(val) 6191 v.AddArg(mem) 6192 return true 6193 } 6194 return false 6195 } 6196 func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { 6197 // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6198 // cond: 6199 // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6200 for { 6201 c := v.AuxInt 6202 sym := v.Aux 6203 _ = v.Args[3] 6204 v_0 := v.Args[0] 6205 if v_0.Op != Op386ADDLconst { 6206 break 6207 } 6208 d := v_0.AuxInt 6209 ptr := v_0.Args[0] 6210 idx := v.Args[1] 6211 val := v.Args[2] 6212 mem := v.Args[3] 6213 v.reset(Op386MOVSSstoreidx1) 6214 v.AuxInt = int64(int32(c + d)) 6215 v.Aux = sym 6216 v.AddArg(ptr) 6217 v.AddArg(idx) 6218 v.AddArg(val) 6219 v.AddArg(mem) 6220 return true 6221 } 6222 // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6223 // cond: 6224 // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6225 for { 6226 c := v.AuxInt 6227 sym := v.Aux 6228 _ = v.Args[3] 6229 ptr := v.Args[0] 6230 v_1 := v.Args[1] 6231 if v_1.Op != Op386ADDLconst { 6232 break 6233 } 6234 d := v_1.AuxInt 6235 idx := v_1.Args[0] 6236 val := v.Args[2] 6237 mem := v.Args[3] 6238 v.reset(Op386MOVSSstoreidx1) 6239 v.AuxInt = int64(int32(c + d)) 6240 v.Aux = sym 6241 v.AddArg(ptr) 6242 v.AddArg(idx) 6243 v.AddArg(val) 6244 v.AddArg(mem) 6245 return true 6246 } 6247 return false 6248 } 6249 func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { 6250 // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6251 // cond: 6252 // result: (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) 6253 for { 6254 c := v.AuxInt 6255 sym := v.Aux 6256 _ = v.Args[3] 6257 v_0 := v.Args[0] 6258 if v_0.Op != Op386ADDLconst { 6259 break 6260 } 6261 d := v_0.AuxInt 6262 ptr := v_0.Args[0] 6263 idx := v.Args[1] 6264 val := v.Args[2] 6265 mem := v.Args[3] 6266 v.reset(Op386MOVSSstoreidx4) 6267 v.AuxInt = int64(int32(c + d)) 6268 v.Aux = sym 6269 v.AddArg(ptr) 6270 v.AddArg(idx) 6271 v.AddArg(val) 6272 v.AddArg(mem) 6273 return true 6274 } 6275 // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6276 // cond: 6277 // result: (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) 6278 for { 6279 c := v.AuxInt 6280 sym := v.Aux 6281 _ = v.Args[3] 6282 ptr := v.Args[0] 6283 v_1 := v.Args[1] 6284 if v_1.Op != Op386ADDLconst { 6285 break 6286 } 6287 d := v_1.AuxInt 6288 idx := v_1.Args[0] 6289 val := v.Args[2] 6290 mem := v.Args[3] 6291 v.reset(Op386MOVSSstoreidx4) 6292 v.AuxInt = int64(int32(c + 4*d)) 6293 v.Aux = sym 6294 v.AddArg(ptr) 6295 v.AddArg(idx) 6296 v.AddArg(val) 6297 v.AddArg(mem) 6298 return true 6299 } 6300 return false 6301 } 6302 func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { 6303 b := v.Block 6304 _ = b 6305 // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) 6306 // cond: x.Uses == 1 && clobber(x) 6307 // result: @x.Block (MOVWLSXload <v.Type> [off] {sym} ptr mem) 6308 for { 6309 x := v.Args[0] 6310 if x.Op != Op386MOVWload { 6311 break 6312 } 6313 off := x.AuxInt 6314 sym := x.Aux 6315 _ = x.Args[1] 6316 ptr := x.Args[0] 6317 mem := x.Args[1] 6318 if !(x.Uses == 1 && clobber(x)) { 6319 break 6320 } 6321 b = x.Block 6322 v0 := b.NewValue0(v.Pos, Op386MOVWLSXload, v.Type) 6323 v.reset(OpCopy) 6324 v.AddArg(v0) 6325 v0.AuxInt = off 6326 v0.Aux = sym 6327 v0.AddArg(ptr) 6328 v0.AddArg(mem) 6329 return true 6330 } 6331 // match: (MOVWLSX (ANDLconst [c] x)) 6332 // cond: c & 0x8000 == 0 6333 // result: (ANDLconst [c & 0x7fff] x) 6334 for { 6335 v_0 := v.Args[0] 6336 if v_0.Op != Op386ANDLconst { 6337 break 6338 } 6339 c := v_0.AuxInt 6340 x := v_0.Args[0] 6341 if !(c&0x8000 == 0) { 6342 break 6343 } 6344 v.reset(Op386ANDLconst) 6345 v.AuxInt = c & 0x7fff 6346 v.AddArg(x) 6347 return true 6348 } 6349 return false 6350 } 6351 func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { 6352 b := v.Block 6353 _ = b 6354 config := b.Func.Config 6355 _ = config 6356 // match: (MOVWLSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6357 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6358 // result: (MOVWLSX x) 6359 for { 6360 off := v.AuxInt 6361 sym := v.Aux 6362 _ = v.Args[1] 6363 ptr := v.Args[0] 6364 v_1 := v.Args[1] 6365 if v_1.Op != Op386MOVWstore { 6366 break 6367 } 6368 off2 := v_1.AuxInt 6369 sym2 := v_1.Aux 6370 _ = v_1.Args[2] 6371 ptr2 := v_1.Args[0] 6372 x := v_1.Args[1] 6373 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6374 break 6375 } 6376 v.reset(Op386MOVWLSX) 6377 v.AddArg(x) 6378 return true 6379 } 6380 // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6381 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6382 // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6383 for { 6384 off1 := v.AuxInt 6385 sym1 := v.Aux 6386 _ = v.Args[1] 6387 v_0 := v.Args[0] 6388 if v_0.Op != Op386LEAL { 6389 break 6390 } 6391 off2 := v_0.AuxInt 6392 sym2 := v_0.Aux 6393 base := v_0.Args[0] 6394 mem := v.Args[1] 6395 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6396 break 6397 } 6398 v.reset(Op386MOVWLSXload) 6399 v.AuxInt = off1 + off2 6400 v.Aux = mergeSym(sym1, sym2) 6401 v.AddArg(base) 6402 v.AddArg(mem) 6403 return true 6404 } 6405 return false 6406 } 6407 func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { 6408 b := v.Block 6409 _ = b 6410 // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) 6411 // cond: x.Uses == 1 && clobber(x) 6412 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 6413 for { 6414 x := v.Args[0] 6415 if x.Op != Op386MOVWload { 6416 break 6417 } 6418 off := x.AuxInt 6419 sym := x.Aux 6420 _ = x.Args[1] 6421 ptr := x.Args[0] 6422 mem := x.Args[1] 6423 if !(x.Uses == 1 && clobber(x)) { 6424 break 6425 } 6426 b = x.Block 6427 v0 := b.NewValue0(v.Pos, Op386MOVWload, v.Type) 6428 v.reset(OpCopy) 6429 v.AddArg(v0) 6430 v0.AuxInt = off 6431 v0.Aux = sym 6432 v0.AddArg(ptr) 6433 v0.AddArg(mem) 6434 return true 6435 } 6436 // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) 6437 // cond: x.Uses == 1 && clobber(x) 6438 // result: @x.Block (MOVWloadidx1 <v.Type> [off] {sym} ptr idx mem) 6439 for { 6440 x := v.Args[0] 6441 if x.Op != Op386MOVWloadidx1 { 6442 break 6443 } 6444 off := x.AuxInt 6445 sym := x.Aux 6446 _ = x.Args[2] 6447 ptr := x.Args[0] 6448 idx := x.Args[1] 6449 mem := x.Args[2] 6450 if !(x.Uses == 1 && clobber(x)) { 6451 break 6452 } 6453 b = x.Block 6454 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 6455 v.reset(OpCopy) 6456 v.AddArg(v0) 6457 v0.AuxInt = off 6458 v0.Aux = sym 6459 v0.AddArg(ptr) 6460 v0.AddArg(idx) 6461 v0.AddArg(mem) 6462 return true 6463 } 6464 // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) 6465 // cond: x.Uses == 1 && clobber(x) 6466 // result: @x.Block (MOVWloadidx2 <v.Type> [off] {sym} ptr idx mem) 6467 for { 6468 x := v.Args[0] 6469 if x.Op != Op386MOVWloadidx2 { 6470 break 6471 } 6472 off := x.AuxInt 6473 sym := x.Aux 6474 _ = x.Args[2] 6475 ptr := x.Args[0] 6476 idx := x.Args[1] 6477 mem := x.Args[2] 6478 if !(x.Uses == 1 && clobber(x)) { 6479 break 6480 } 6481 b = x.Block 6482 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) 6483 v.reset(OpCopy) 6484 v.AddArg(v0) 6485 v0.AuxInt = off 6486 v0.Aux = sym 6487 v0.AddArg(ptr) 6488 v0.AddArg(idx) 6489 v0.AddArg(mem) 6490 return true 6491 } 6492 // match: (MOVWLZX (ANDLconst [c] x)) 6493 // cond: 6494 // result: (ANDLconst [c & 0xffff] x) 6495 for { 6496 v_0 := v.Args[0] 6497 if v_0.Op != Op386ANDLconst { 6498 break 6499 } 6500 c := v_0.AuxInt 6501 x := v_0.Args[0] 6502 v.reset(Op386ANDLconst) 6503 v.AuxInt = c & 0xffff 6504 v.AddArg(x) 6505 return true 6506 } 6507 return false 6508 } 6509 func rewriteValue386_Op386MOVWload_0(v *Value) bool { 6510 b := v.Block 6511 _ = b 6512 config := b.Func.Config 6513 _ = config 6514 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6515 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6516 // result: (MOVWLZX x) 6517 for { 6518 off := v.AuxInt 6519 sym := v.Aux 6520 _ = v.Args[1] 6521 ptr := v.Args[0] 6522 v_1 := v.Args[1] 6523 if v_1.Op != Op386MOVWstore { 6524 break 6525 } 6526 off2 := v_1.AuxInt 6527 sym2 := v_1.Aux 6528 _ = v_1.Args[2] 6529 ptr2 := v_1.Args[0] 6530 x := v_1.Args[1] 6531 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6532 break 6533 } 6534 v.reset(Op386MOVWLZX) 6535 v.AddArg(x) 6536 return true 6537 } 6538 // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) 6539 // cond: is32Bit(off1+off2) 6540 // result: (MOVWload [off1+off2] {sym} ptr mem) 6541 for { 6542 off1 := v.AuxInt 6543 sym := v.Aux 6544 _ = v.Args[1] 6545 v_0 := v.Args[0] 6546 if v_0.Op != Op386ADDLconst { 6547 break 6548 } 6549 off2 := v_0.AuxInt 6550 ptr := v_0.Args[0] 6551 mem := v.Args[1] 6552 if !(is32Bit(off1 + off2)) { 6553 break 6554 } 6555 v.reset(Op386MOVWload) 6556 v.AuxInt = off1 + off2 6557 v.Aux = sym 6558 v.AddArg(ptr) 6559 v.AddArg(mem) 6560 return true 6561 } 6562 // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 6563 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6564 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 6565 for { 6566 off1 := v.AuxInt 6567 sym1 := v.Aux 6568 _ = v.Args[1] 6569 v_0 := v.Args[0] 6570 if v_0.Op != Op386LEAL { 6571 break 6572 } 6573 off2 := v_0.AuxInt 6574 sym2 := v_0.Aux 6575 base := v_0.Args[0] 6576 mem := v.Args[1] 6577 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6578 break 6579 } 6580 v.reset(Op386MOVWload) 6581 v.AuxInt = off1 + off2 6582 v.Aux = mergeSym(sym1, sym2) 6583 v.AddArg(base) 6584 v.AddArg(mem) 6585 return true 6586 } 6587 // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 6588 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6589 // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6590 for { 6591 off1 := v.AuxInt 6592 sym1 := v.Aux 6593 _ = v.Args[1] 6594 v_0 := v.Args[0] 6595 if v_0.Op != Op386LEAL1 { 6596 break 6597 } 6598 off2 := v_0.AuxInt 6599 sym2 := v_0.Aux 6600 _ = v_0.Args[1] 6601 ptr := v_0.Args[0] 6602 idx := v_0.Args[1] 6603 mem := v.Args[1] 6604 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6605 break 6606 } 6607 v.reset(Op386MOVWloadidx1) 6608 v.AuxInt = off1 + off2 6609 v.Aux = mergeSym(sym1, sym2) 6610 v.AddArg(ptr) 6611 v.AddArg(idx) 6612 v.AddArg(mem) 6613 return true 6614 } 6615 // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) 6616 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6617 // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 6618 for { 6619 off1 := v.AuxInt 6620 sym1 := v.Aux 6621 _ = v.Args[1] 6622 v_0 := v.Args[0] 6623 if v_0.Op != Op386LEAL2 { 6624 break 6625 } 6626 off2 := v_0.AuxInt 6627 sym2 := v_0.Aux 6628 _ = v_0.Args[1] 6629 ptr := v_0.Args[0] 6630 idx := v_0.Args[1] 6631 mem := v.Args[1] 6632 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 6633 break 6634 } 6635 v.reset(Op386MOVWloadidx2) 6636 v.AuxInt = off1 + off2 6637 v.Aux = mergeSym(sym1, sym2) 6638 v.AddArg(ptr) 6639 v.AddArg(idx) 6640 v.AddArg(mem) 6641 return true 6642 } 6643 // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) 6644 // cond: ptr.Op != OpSB 6645 // result: (MOVWloadidx1 [off] {sym} ptr idx mem) 6646 for { 6647 off := v.AuxInt 6648 sym := v.Aux 6649 _ = v.Args[1] 6650 v_0 := v.Args[0] 6651 if v_0.Op != Op386ADDL { 6652 break 6653 } 6654 _ = v_0.Args[1] 6655 ptr := v_0.Args[0] 6656 idx := v_0.Args[1] 6657 mem := v.Args[1] 6658 if !(ptr.Op != OpSB) { 6659 break 6660 } 6661 v.reset(Op386MOVWloadidx1) 6662 v.AuxInt = off 6663 v.Aux = sym 6664 v.AddArg(ptr) 6665 v.AddArg(idx) 6666 v.AddArg(mem) 6667 return true 6668 } 6669 return false 6670 } 6671 func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { 6672 // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 6673 // cond: 6674 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6675 for { 6676 c := v.AuxInt 6677 sym := v.Aux 6678 _ = v.Args[2] 6679 ptr := v.Args[0] 6680 v_1 := v.Args[1] 6681 if v_1.Op != Op386SHLLconst { 6682 break 6683 } 6684 if v_1.AuxInt != 1 { 6685 break 6686 } 6687 idx := v_1.Args[0] 6688 mem := v.Args[2] 6689 v.reset(Op386MOVWloadidx2) 6690 v.AuxInt = c 6691 v.Aux = sym 6692 v.AddArg(ptr) 6693 v.AddArg(idx) 6694 v.AddArg(mem) 6695 return true 6696 } 6697 // match: (MOVWloadidx1 [c] {sym} (SHLLconst [1] idx) ptr mem) 6698 // cond: 6699 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 6700 for { 6701 c := v.AuxInt 6702 sym := v.Aux 6703 _ = v.Args[2] 6704 v_0 := v.Args[0] 6705 if v_0.Op != Op386SHLLconst { 6706 break 6707 } 6708 if v_0.AuxInt != 1 { 6709 break 6710 } 6711 idx := v_0.Args[0] 6712 ptr := v.Args[1] 6713 mem := v.Args[2] 6714 v.reset(Op386MOVWloadidx2) 6715 v.AuxInt = c 6716 v.Aux = sym 6717 v.AddArg(ptr) 6718 v.AddArg(idx) 6719 v.AddArg(mem) 6720 return true 6721 } 6722 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 6723 // cond: 6724 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6725 for { 6726 c := v.AuxInt 6727 sym := v.Aux 6728 _ = v.Args[2] 6729 v_0 := v.Args[0] 6730 if v_0.Op != Op386ADDLconst { 6731 break 6732 } 6733 d := v_0.AuxInt 6734 ptr := v_0.Args[0] 6735 idx := v.Args[1] 6736 mem := v.Args[2] 6737 v.reset(Op386MOVWloadidx1) 6738 v.AuxInt = int64(int32(c + d)) 6739 v.Aux = sym 6740 v.AddArg(ptr) 6741 v.AddArg(idx) 6742 v.AddArg(mem) 6743 return true 6744 } 6745 // match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 6746 // cond: 6747 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6748 for { 6749 c := v.AuxInt 6750 sym := v.Aux 6751 _ = v.Args[2] 6752 idx := v.Args[0] 6753 v_1 := v.Args[1] 6754 if v_1.Op != Op386ADDLconst { 6755 break 6756 } 6757 d := v_1.AuxInt 6758 ptr := v_1.Args[0] 6759 mem := v.Args[2] 6760 v.reset(Op386MOVWloadidx1) 6761 v.AuxInt = int64(int32(c + d)) 6762 v.Aux = sym 6763 v.AddArg(ptr) 6764 v.AddArg(idx) 6765 v.AddArg(mem) 6766 return true 6767 } 6768 // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 6769 // cond: 6770 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6771 for { 6772 c := v.AuxInt 6773 sym := v.Aux 6774 _ = v.Args[2] 6775 ptr := v.Args[0] 6776 v_1 := v.Args[1] 6777 if v_1.Op != Op386ADDLconst { 6778 break 6779 } 6780 d := v_1.AuxInt 6781 idx := v_1.Args[0] 6782 mem := v.Args[2] 6783 v.reset(Op386MOVWloadidx1) 6784 v.AuxInt = int64(int32(c + d)) 6785 v.Aux = sym 6786 v.AddArg(ptr) 6787 v.AddArg(idx) 6788 v.AddArg(mem) 6789 return true 6790 } 6791 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 6792 // cond: 6793 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 6794 for { 6795 c := v.AuxInt 6796 sym := v.Aux 6797 _ = v.Args[2] 6798 v_0 := v.Args[0] 6799 if v_0.Op != Op386ADDLconst { 6800 break 6801 } 6802 d := v_0.AuxInt 6803 idx := v_0.Args[0] 6804 ptr := v.Args[1] 6805 mem := v.Args[2] 6806 v.reset(Op386MOVWloadidx1) 6807 v.AuxInt = int64(int32(c + d)) 6808 v.Aux = sym 6809 v.AddArg(ptr) 6810 v.AddArg(idx) 6811 v.AddArg(mem) 6812 return true 6813 } 6814 return false 6815 } 6816 func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { 6817 // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) 6818 // cond: 6819 // result: (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem) 6820 for { 6821 c := v.AuxInt 6822 sym := v.Aux 6823 _ = v.Args[2] 6824 v_0 := v.Args[0] 6825 if v_0.Op != Op386ADDLconst { 6826 break 6827 } 6828 d := v_0.AuxInt 6829 ptr := v_0.Args[0] 6830 idx := v.Args[1] 6831 mem := v.Args[2] 6832 v.reset(Op386MOVWloadidx2) 6833 v.AuxInt = int64(int32(c + d)) 6834 v.Aux = sym 6835 v.AddArg(ptr) 6836 v.AddArg(idx) 6837 v.AddArg(mem) 6838 return true 6839 } 6840 // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) 6841 // cond: 6842 // result: (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem) 6843 for { 6844 c := v.AuxInt 6845 sym := v.Aux 6846 _ = v.Args[2] 6847 ptr := v.Args[0] 6848 v_1 := v.Args[1] 6849 if v_1.Op != Op386ADDLconst { 6850 break 6851 } 6852 d := v_1.AuxInt 6853 idx := v_1.Args[0] 6854 mem := v.Args[2] 6855 v.reset(Op386MOVWloadidx2) 6856 v.AuxInt = int64(int32(c + 2*d)) 6857 v.Aux = sym 6858 v.AddArg(ptr) 6859 v.AddArg(idx) 6860 v.AddArg(mem) 6861 return true 6862 } 6863 return false 6864 } 6865 func rewriteValue386_Op386MOVWstore_0(v *Value) bool { 6866 b := v.Block 6867 _ = b 6868 config := b.Func.Config 6869 _ = config 6870 // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) 6871 // cond: 6872 // result: (MOVWstore [off] {sym} ptr x mem) 6873 for { 6874 off := v.AuxInt 6875 sym := v.Aux 6876 _ = v.Args[2] 6877 ptr := v.Args[0] 6878 v_1 := v.Args[1] 6879 if v_1.Op != Op386MOVWLSX { 6880 break 6881 } 6882 x := v_1.Args[0] 6883 mem := v.Args[2] 6884 v.reset(Op386MOVWstore) 6885 v.AuxInt = off 6886 v.Aux = sym 6887 v.AddArg(ptr) 6888 v.AddArg(x) 6889 v.AddArg(mem) 6890 return true 6891 } 6892 // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) 6893 // cond: 6894 // result: (MOVWstore [off] {sym} ptr x mem) 6895 for { 6896 off := v.AuxInt 6897 sym := v.Aux 6898 _ = v.Args[2] 6899 ptr := v.Args[0] 6900 v_1 := v.Args[1] 6901 if v_1.Op != Op386MOVWLZX { 6902 break 6903 } 6904 x := v_1.Args[0] 6905 mem := v.Args[2] 6906 v.reset(Op386MOVWstore) 6907 v.AuxInt = off 6908 v.Aux = sym 6909 v.AddArg(ptr) 6910 v.AddArg(x) 6911 v.AddArg(mem) 6912 return true 6913 } 6914 // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 6915 // cond: is32Bit(off1+off2) 6916 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6917 for { 6918 off1 := v.AuxInt 6919 sym := v.Aux 6920 _ = v.Args[2] 6921 v_0 := v.Args[0] 6922 if v_0.Op != Op386ADDLconst { 6923 break 6924 } 6925 off2 := v_0.AuxInt 6926 ptr := v_0.Args[0] 6927 val := v.Args[1] 6928 mem := v.Args[2] 6929 if !(is32Bit(off1 + off2)) { 6930 break 6931 } 6932 v.reset(Op386MOVWstore) 6933 v.AuxInt = off1 + off2 6934 v.Aux = sym 6935 v.AddArg(ptr) 6936 v.AddArg(val) 6937 v.AddArg(mem) 6938 return true 6939 } 6940 // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) 6941 // cond: validOff(off) 6942 // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 6943 for { 6944 off := v.AuxInt 6945 sym := v.Aux 6946 _ = v.Args[2] 6947 ptr := v.Args[0] 6948 v_1 := v.Args[1] 6949 if v_1.Op != Op386MOVLconst { 6950 break 6951 } 6952 c := v_1.AuxInt 6953 mem := v.Args[2] 6954 if !(validOff(off)) { 6955 break 6956 } 6957 v.reset(Op386MOVWstoreconst) 6958 v.AuxInt = makeValAndOff(int64(int16(c)), off) 6959 v.Aux = sym 6960 v.AddArg(ptr) 6961 v.AddArg(mem) 6962 return true 6963 } 6964 // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 6965 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 6966 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 6967 for { 6968 off1 := v.AuxInt 6969 sym1 := v.Aux 6970 _ = v.Args[2] 6971 v_0 := v.Args[0] 6972 if v_0.Op != Op386LEAL { 6973 break 6974 } 6975 off2 := v_0.AuxInt 6976 sym2 := v_0.Aux 6977 base := v_0.Args[0] 6978 val := v.Args[1] 6979 mem := v.Args[2] 6980 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 6981 break 6982 } 6983 v.reset(Op386MOVWstore) 6984 v.AuxInt = off1 + off2 6985 v.Aux = mergeSym(sym1, sym2) 6986 v.AddArg(base) 6987 v.AddArg(val) 6988 v.AddArg(mem) 6989 return true 6990 } 6991 // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 6992 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 6993 // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 6994 for { 6995 off1 := v.AuxInt 6996 sym1 := v.Aux 6997 _ = v.Args[2] 6998 v_0 := v.Args[0] 6999 if v_0.Op != Op386LEAL1 { 7000 break 7001 } 7002 off2 := v_0.AuxInt 7003 sym2 := v_0.Aux 7004 _ = v_0.Args[1] 7005 ptr := v_0.Args[0] 7006 idx := v_0.Args[1] 7007 val := v.Args[1] 7008 mem := v.Args[2] 7009 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7010 break 7011 } 7012 v.reset(Op386MOVWstoreidx1) 7013 v.AuxInt = off1 + off2 7014 v.Aux = mergeSym(sym1, sym2) 7015 v.AddArg(ptr) 7016 v.AddArg(idx) 7017 v.AddArg(val) 7018 v.AddArg(mem) 7019 return true 7020 } 7021 // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) 7022 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7023 // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7024 for { 7025 off1 := v.AuxInt 7026 sym1 := v.Aux 7027 _ = v.Args[2] 7028 v_0 := v.Args[0] 7029 if v_0.Op != Op386LEAL2 { 7030 break 7031 } 7032 off2 := v_0.AuxInt 7033 sym2 := v_0.Aux 7034 _ = v_0.Args[1] 7035 ptr := v_0.Args[0] 7036 idx := v_0.Args[1] 7037 val := v.Args[1] 7038 mem := v.Args[2] 7039 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7040 break 7041 } 7042 v.reset(Op386MOVWstoreidx2) 7043 v.AuxInt = off1 + off2 7044 v.Aux = mergeSym(sym1, sym2) 7045 v.AddArg(ptr) 7046 v.AddArg(idx) 7047 v.AddArg(val) 7048 v.AddArg(mem) 7049 return true 7050 } 7051 // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) 7052 // cond: ptr.Op != OpSB 7053 // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) 7054 for { 7055 off := v.AuxInt 7056 sym := v.Aux 7057 _ = v.Args[2] 7058 v_0 := v.Args[0] 7059 if v_0.Op != Op386ADDL { 7060 break 7061 } 7062 _ = v_0.Args[1] 7063 ptr := v_0.Args[0] 7064 idx := v_0.Args[1] 7065 val := v.Args[1] 7066 mem := v.Args[2] 7067 if !(ptr.Op != OpSB) { 7068 break 7069 } 7070 v.reset(Op386MOVWstoreidx1) 7071 v.AuxInt = off 7072 v.Aux = sym 7073 v.AddArg(ptr) 7074 v.AddArg(idx) 7075 v.AddArg(val) 7076 v.AddArg(mem) 7077 return true 7078 } 7079 // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) 7080 // cond: x.Uses == 1 && clobber(x) 7081 // result: (MOVLstore [i-2] {s} p w mem) 7082 for { 7083 i := v.AuxInt 7084 s := v.Aux 7085 _ = v.Args[2] 7086 p := v.Args[0] 7087 v_1 := v.Args[1] 7088 if v_1.Op != Op386SHRLconst { 7089 break 7090 } 7091 if v_1.AuxInt != 16 { 7092 break 7093 } 7094 w := v_1.Args[0] 7095 x := v.Args[2] 7096 if x.Op != Op386MOVWstore { 7097 break 7098 } 7099 if x.AuxInt != i-2 { 7100 break 7101 } 7102 if x.Aux != s { 7103 break 7104 } 7105 _ = x.Args[2] 7106 if p != x.Args[0] { 7107 break 7108 } 7109 if w != x.Args[1] { 7110 break 7111 } 7112 mem := x.Args[2] 7113 if !(x.Uses == 1 && clobber(x)) { 7114 break 7115 } 7116 v.reset(Op386MOVLstore) 7117 v.AuxInt = i - 2 7118 v.Aux = s 7119 v.AddArg(p) 7120 v.AddArg(w) 7121 v.AddArg(mem) 7122 return true 7123 } 7124 // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) 7125 // cond: x.Uses == 1 && clobber(x) 7126 // result: (MOVLstore [i-2] {s} p w0 mem) 7127 for { 7128 i := v.AuxInt 7129 s := v.Aux 7130 _ = v.Args[2] 7131 p := v.Args[0] 7132 v_1 := v.Args[1] 7133 if v_1.Op != Op386SHRLconst { 7134 break 7135 } 7136 j := v_1.AuxInt 7137 w := v_1.Args[0] 7138 x := v.Args[2] 7139 if x.Op != Op386MOVWstore { 7140 break 7141 } 7142 if x.AuxInt != i-2 { 7143 break 7144 } 7145 if x.Aux != s { 7146 break 7147 } 7148 _ = x.Args[2] 7149 if p != x.Args[0] { 7150 break 7151 } 7152 w0 := x.Args[1] 7153 if w0.Op != Op386SHRLconst { 7154 break 7155 } 7156 if w0.AuxInt != j-16 { 7157 break 7158 } 7159 if w != w0.Args[0] { 7160 break 7161 } 7162 mem := x.Args[2] 7163 if !(x.Uses == 1 && clobber(x)) { 7164 break 7165 } 7166 v.reset(Op386MOVLstore) 7167 v.AuxInt = i - 2 7168 v.Aux = s 7169 v.AddArg(p) 7170 v.AddArg(w0) 7171 v.AddArg(mem) 7172 return true 7173 } 7174 return false 7175 } 7176 func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { 7177 b := v.Block 7178 _ = b 7179 config := b.Func.Config 7180 _ = config 7181 // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 7182 // cond: ValAndOff(sc).canAdd(off) 7183 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 7184 for { 7185 sc := v.AuxInt 7186 s := v.Aux 7187 _ = v.Args[1] 7188 v_0 := v.Args[0] 7189 if v_0.Op != Op386ADDLconst { 7190 break 7191 } 7192 off := v_0.AuxInt 7193 ptr := v_0.Args[0] 7194 mem := v.Args[1] 7195 if !(ValAndOff(sc).canAdd(off)) { 7196 break 7197 } 7198 v.reset(Op386MOVWstoreconst) 7199 v.AuxInt = ValAndOff(sc).add(off) 7200 v.Aux = s 7201 v.AddArg(ptr) 7202 v.AddArg(mem) 7203 return true 7204 } 7205 // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 7206 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 7207 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 7208 for { 7209 sc := v.AuxInt 7210 sym1 := v.Aux 7211 _ = v.Args[1] 7212 v_0 := v.Args[0] 7213 if v_0.Op != Op386LEAL { 7214 break 7215 } 7216 off := v_0.AuxInt 7217 sym2 := v_0.Aux 7218 ptr := v_0.Args[0] 7219 mem := v.Args[1] 7220 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 7221 break 7222 } 7223 v.reset(Op386MOVWstoreconst) 7224 v.AuxInt = ValAndOff(sc).add(off) 7225 v.Aux = mergeSym(sym1, sym2) 7226 v.AddArg(ptr) 7227 v.AddArg(mem) 7228 return true 7229 } 7230 // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 7231 // cond: canMergeSym(sym1, sym2) 7232 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 7233 for { 7234 x := v.AuxInt 7235 sym1 := v.Aux 7236 _ = v.Args[1] 7237 v_0 := v.Args[0] 7238 if v_0.Op != Op386LEAL1 { 7239 break 7240 } 7241 off := v_0.AuxInt 7242 sym2 := v_0.Aux 7243 _ = v_0.Args[1] 7244 ptr := v_0.Args[0] 7245 idx := v_0.Args[1] 7246 mem := v.Args[1] 7247 if !(canMergeSym(sym1, sym2)) { 7248 break 7249 } 7250 v.reset(Op386MOVWstoreconstidx1) 7251 v.AuxInt = ValAndOff(x).add(off) 7252 v.Aux = mergeSym(sym1, sym2) 7253 v.AddArg(ptr) 7254 v.AddArg(idx) 7255 v.AddArg(mem) 7256 return true 7257 } 7258 // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) 7259 // cond: canMergeSym(sym1, sym2) 7260 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 7261 for { 7262 x := v.AuxInt 7263 sym1 := v.Aux 7264 _ = v.Args[1] 7265 v_0 := v.Args[0] 7266 if v_0.Op != Op386LEAL2 { 7267 break 7268 } 7269 off := v_0.AuxInt 7270 sym2 := v_0.Aux 7271 _ = v_0.Args[1] 7272 ptr := v_0.Args[0] 7273 idx := v_0.Args[1] 7274 mem := v.Args[1] 7275 if !(canMergeSym(sym1, sym2)) { 7276 break 7277 } 7278 v.reset(Op386MOVWstoreconstidx2) 7279 v.AuxInt = ValAndOff(x).add(off) 7280 v.Aux = mergeSym(sym1, sym2) 7281 v.AddArg(ptr) 7282 v.AddArg(idx) 7283 v.AddArg(mem) 7284 return true 7285 } 7286 // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) 7287 // cond: 7288 // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) 7289 for { 7290 x := v.AuxInt 7291 sym := v.Aux 7292 _ = v.Args[1] 7293 v_0 := v.Args[0] 7294 if v_0.Op != Op386ADDL { 7295 break 7296 } 7297 _ = v_0.Args[1] 7298 ptr := v_0.Args[0] 7299 idx := v_0.Args[1] 7300 mem := v.Args[1] 7301 v.reset(Op386MOVWstoreconstidx1) 7302 v.AuxInt = x 7303 v.Aux = sym 7304 v.AddArg(ptr) 7305 v.AddArg(idx) 7306 v.AddArg(mem) 7307 return true 7308 } 7309 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 7310 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7311 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 7312 for { 7313 c := v.AuxInt 7314 s := v.Aux 7315 _ = v.Args[1] 7316 p := v.Args[0] 7317 x := v.Args[1] 7318 if x.Op != Op386MOVWstoreconst { 7319 break 7320 } 7321 a := x.AuxInt 7322 if x.Aux != s { 7323 break 7324 } 7325 _ = x.Args[1] 7326 if p != x.Args[0] { 7327 break 7328 } 7329 mem := x.Args[1] 7330 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7331 break 7332 } 7333 v.reset(Op386MOVLstoreconst) 7334 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7335 v.Aux = s 7336 v.AddArg(p) 7337 v.AddArg(mem) 7338 return true 7339 } 7340 return false 7341 } 7342 func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { 7343 // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 7344 // cond: 7345 // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) 7346 for { 7347 c := v.AuxInt 7348 sym := v.Aux 7349 _ = v.Args[2] 7350 ptr := v.Args[0] 7351 v_1 := v.Args[1] 7352 if v_1.Op != Op386SHLLconst { 7353 break 7354 } 7355 if v_1.AuxInt != 1 { 7356 break 7357 } 7358 idx := v_1.Args[0] 7359 mem := v.Args[2] 7360 v.reset(Op386MOVWstoreconstidx2) 7361 v.AuxInt = c 7362 v.Aux = sym 7363 v.AddArg(ptr) 7364 v.AddArg(idx) 7365 v.AddArg(mem) 7366 return true 7367 } 7368 // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 7369 // cond: 7370 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7371 for { 7372 x := v.AuxInt 7373 sym := v.Aux 7374 _ = v.Args[2] 7375 v_0 := v.Args[0] 7376 if v_0.Op != Op386ADDLconst { 7377 break 7378 } 7379 c := v_0.AuxInt 7380 ptr := v_0.Args[0] 7381 idx := v.Args[1] 7382 mem := v.Args[2] 7383 v.reset(Op386MOVWstoreconstidx1) 7384 v.AuxInt = ValAndOff(x).add(c) 7385 v.Aux = sym 7386 v.AddArg(ptr) 7387 v.AddArg(idx) 7388 v.AddArg(mem) 7389 return true 7390 } 7391 // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 7392 // cond: 7393 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7394 for { 7395 x := v.AuxInt 7396 sym := v.Aux 7397 _ = v.Args[2] 7398 ptr := v.Args[0] 7399 v_1 := v.Args[1] 7400 if v_1.Op != Op386ADDLconst { 7401 break 7402 } 7403 c := v_1.AuxInt 7404 idx := v_1.Args[0] 7405 mem := v.Args[2] 7406 v.reset(Op386MOVWstoreconstidx1) 7407 v.AuxInt = ValAndOff(x).add(c) 7408 v.Aux = sym 7409 v.AddArg(ptr) 7410 v.AddArg(idx) 7411 v.AddArg(mem) 7412 return true 7413 } 7414 // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) 7415 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7416 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) 7417 for { 7418 c := v.AuxInt 7419 s := v.Aux 7420 _ = v.Args[2] 7421 p := v.Args[0] 7422 i := v.Args[1] 7423 x := v.Args[2] 7424 if x.Op != Op386MOVWstoreconstidx1 { 7425 break 7426 } 7427 a := x.AuxInt 7428 if x.Aux != s { 7429 break 7430 } 7431 _ = x.Args[2] 7432 if p != x.Args[0] { 7433 break 7434 } 7435 if i != x.Args[1] { 7436 break 7437 } 7438 mem := x.Args[2] 7439 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7440 break 7441 } 7442 v.reset(Op386MOVLstoreconstidx1) 7443 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7444 v.Aux = s 7445 v.AddArg(p) 7446 v.AddArg(i) 7447 v.AddArg(mem) 7448 return true 7449 } 7450 return false 7451 } 7452 func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { 7453 b := v.Block 7454 _ = b 7455 // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) 7456 // cond: 7457 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) 7458 for { 7459 x := v.AuxInt 7460 sym := v.Aux 7461 _ = v.Args[2] 7462 v_0 := v.Args[0] 7463 if v_0.Op != Op386ADDLconst { 7464 break 7465 } 7466 c := v_0.AuxInt 7467 ptr := v_0.Args[0] 7468 idx := v.Args[1] 7469 mem := v.Args[2] 7470 v.reset(Op386MOVWstoreconstidx2) 7471 v.AuxInt = ValAndOff(x).add(c) 7472 v.Aux = sym 7473 v.AddArg(ptr) 7474 v.AddArg(idx) 7475 v.AddArg(mem) 7476 return true 7477 } 7478 // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) 7479 // cond: 7480 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) 7481 for { 7482 x := v.AuxInt 7483 sym := v.Aux 7484 _ = v.Args[2] 7485 ptr := v.Args[0] 7486 v_1 := v.Args[1] 7487 if v_1.Op != Op386ADDLconst { 7488 break 7489 } 7490 c := v_1.AuxInt 7491 idx := v_1.Args[0] 7492 mem := v.Args[2] 7493 v.reset(Op386MOVWstoreconstidx2) 7494 v.AuxInt = ValAndOff(x).add(2 * c) 7495 v.Aux = sym 7496 v.AddArg(ptr) 7497 v.AddArg(idx) 7498 v.AddArg(mem) 7499 return true 7500 } 7501 // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) 7502 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 7503 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst <i.Type> [1] i) mem) 7504 for { 7505 c := v.AuxInt 7506 s := v.Aux 7507 _ = v.Args[2] 7508 p := v.Args[0] 7509 i := v.Args[1] 7510 x := v.Args[2] 7511 if x.Op != Op386MOVWstoreconstidx2 { 7512 break 7513 } 7514 a := x.AuxInt 7515 if x.Aux != s { 7516 break 7517 } 7518 _ = x.Args[2] 7519 if p != x.Args[0] { 7520 break 7521 } 7522 if i != x.Args[1] { 7523 break 7524 } 7525 mem := x.Args[2] 7526 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 7527 break 7528 } 7529 v.reset(Op386MOVLstoreconstidx1) 7530 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 7531 v.Aux = s 7532 v.AddArg(p) 7533 v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) 7534 v0.AuxInt = 1 7535 v0.AddArg(i) 7536 v.AddArg(v0) 7537 v.AddArg(mem) 7538 return true 7539 } 7540 return false 7541 } 7542 func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { 7543 // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) 7544 // cond: 7545 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7546 for { 7547 c := v.AuxInt 7548 sym := v.Aux 7549 _ = v.Args[3] 7550 ptr := v.Args[0] 7551 v_1 := v.Args[1] 7552 if v_1.Op != Op386SHLLconst { 7553 break 7554 } 7555 if v_1.AuxInt != 1 { 7556 break 7557 } 7558 idx := v_1.Args[0] 7559 val := v.Args[2] 7560 mem := v.Args[3] 7561 v.reset(Op386MOVWstoreidx2) 7562 v.AuxInt = c 7563 v.Aux = sym 7564 v.AddArg(ptr) 7565 v.AddArg(idx) 7566 v.AddArg(val) 7567 v.AddArg(mem) 7568 return true 7569 } 7570 // match: (MOVWstoreidx1 [c] {sym} (SHLLconst [1] idx) ptr val mem) 7571 // cond: 7572 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 7573 for { 7574 c := v.AuxInt 7575 sym := v.Aux 7576 _ = v.Args[3] 7577 v_0 := v.Args[0] 7578 if v_0.Op != Op386SHLLconst { 7579 break 7580 } 7581 if v_0.AuxInt != 1 { 7582 break 7583 } 7584 idx := v_0.Args[0] 7585 ptr := v.Args[1] 7586 val := v.Args[2] 7587 mem := v.Args[3] 7588 v.reset(Op386MOVWstoreidx2) 7589 v.AuxInt = c 7590 v.Aux = sym 7591 v.AddArg(ptr) 7592 v.AddArg(idx) 7593 v.AddArg(val) 7594 v.AddArg(mem) 7595 return true 7596 } 7597 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 7598 // cond: 7599 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7600 for { 7601 c := v.AuxInt 7602 sym := v.Aux 7603 _ = v.Args[3] 7604 v_0 := v.Args[0] 7605 if v_0.Op != Op386ADDLconst { 7606 break 7607 } 7608 d := v_0.AuxInt 7609 ptr := v_0.Args[0] 7610 idx := v.Args[1] 7611 val := v.Args[2] 7612 mem := v.Args[3] 7613 v.reset(Op386MOVWstoreidx1) 7614 v.AuxInt = int64(int32(c + d)) 7615 v.Aux = sym 7616 v.AddArg(ptr) 7617 v.AddArg(idx) 7618 v.AddArg(val) 7619 v.AddArg(mem) 7620 return true 7621 } 7622 // match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 7623 // cond: 7624 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7625 for { 7626 c := v.AuxInt 7627 sym := v.Aux 7628 _ = v.Args[3] 7629 idx := v.Args[0] 7630 v_1 := v.Args[1] 7631 if v_1.Op != Op386ADDLconst { 7632 break 7633 } 7634 d := v_1.AuxInt 7635 ptr := v_1.Args[0] 7636 val := v.Args[2] 7637 mem := v.Args[3] 7638 v.reset(Op386MOVWstoreidx1) 7639 v.AuxInt = int64(int32(c + d)) 7640 v.Aux = sym 7641 v.AddArg(ptr) 7642 v.AddArg(idx) 7643 v.AddArg(val) 7644 v.AddArg(mem) 7645 return true 7646 } 7647 // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 7648 // cond: 7649 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7650 for { 7651 c := v.AuxInt 7652 sym := v.Aux 7653 _ = v.Args[3] 7654 ptr := v.Args[0] 7655 v_1 := v.Args[1] 7656 if v_1.Op != Op386ADDLconst { 7657 break 7658 } 7659 d := v_1.AuxInt 7660 idx := v_1.Args[0] 7661 val := v.Args[2] 7662 mem := v.Args[3] 7663 v.reset(Op386MOVWstoreidx1) 7664 v.AuxInt = int64(int32(c + d)) 7665 v.Aux = sym 7666 v.AddArg(ptr) 7667 v.AddArg(idx) 7668 v.AddArg(val) 7669 v.AddArg(mem) 7670 return true 7671 } 7672 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 7673 // cond: 7674 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 7675 for { 7676 c := v.AuxInt 7677 sym := v.Aux 7678 _ = v.Args[3] 7679 v_0 := v.Args[0] 7680 if v_0.Op != Op386ADDLconst { 7681 break 7682 } 7683 d := v_0.AuxInt 7684 idx := v_0.Args[0] 7685 ptr := v.Args[1] 7686 val := v.Args[2] 7687 mem := v.Args[3] 7688 v.reset(Op386MOVWstoreidx1) 7689 v.AuxInt = int64(int32(c + d)) 7690 v.Aux = sym 7691 v.AddArg(ptr) 7692 v.AddArg(idx) 7693 v.AddArg(val) 7694 v.AddArg(mem) 7695 return true 7696 } 7697 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7698 // cond: x.Uses == 1 && clobber(x) 7699 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7700 for { 7701 i := v.AuxInt 7702 s := v.Aux 7703 _ = v.Args[3] 7704 p := v.Args[0] 7705 idx := v.Args[1] 7706 v_2 := v.Args[2] 7707 if v_2.Op != Op386SHRLconst { 7708 break 7709 } 7710 if v_2.AuxInt != 16 { 7711 break 7712 } 7713 w := v_2.Args[0] 7714 x := v.Args[3] 7715 if x.Op != Op386MOVWstoreidx1 { 7716 break 7717 } 7718 if x.AuxInt != i-2 { 7719 break 7720 } 7721 if x.Aux != s { 7722 break 7723 } 7724 _ = x.Args[3] 7725 if p != x.Args[0] { 7726 break 7727 } 7728 if idx != x.Args[1] { 7729 break 7730 } 7731 if w != x.Args[2] { 7732 break 7733 } 7734 mem := x.Args[3] 7735 if !(x.Uses == 1 && clobber(x)) { 7736 break 7737 } 7738 v.reset(Op386MOVLstoreidx1) 7739 v.AuxInt = i - 2 7740 v.Aux = s 7741 v.AddArg(p) 7742 v.AddArg(idx) 7743 v.AddArg(w) 7744 v.AddArg(mem) 7745 return true 7746 } 7747 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7748 // cond: x.Uses == 1 && clobber(x) 7749 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7750 for { 7751 i := v.AuxInt 7752 s := v.Aux 7753 _ = v.Args[3] 7754 p := v.Args[0] 7755 idx := v.Args[1] 7756 v_2 := v.Args[2] 7757 if v_2.Op != Op386SHRLconst { 7758 break 7759 } 7760 if v_2.AuxInt != 16 { 7761 break 7762 } 7763 w := v_2.Args[0] 7764 x := v.Args[3] 7765 if x.Op != Op386MOVWstoreidx1 { 7766 break 7767 } 7768 if x.AuxInt != i-2 { 7769 break 7770 } 7771 if x.Aux != s { 7772 break 7773 } 7774 _ = x.Args[3] 7775 if idx != x.Args[0] { 7776 break 7777 } 7778 if p != x.Args[1] { 7779 break 7780 } 7781 if w != x.Args[2] { 7782 break 7783 } 7784 mem := x.Args[3] 7785 if !(x.Uses == 1 && clobber(x)) { 7786 break 7787 } 7788 v.reset(Op386MOVLstoreidx1) 7789 v.AuxInt = i - 2 7790 v.Aux = s 7791 v.AddArg(p) 7792 v.AddArg(idx) 7793 v.AddArg(w) 7794 v.AddArg(mem) 7795 return true 7796 } 7797 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 7798 // cond: x.Uses == 1 && clobber(x) 7799 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7800 for { 7801 i := v.AuxInt 7802 s := v.Aux 7803 _ = v.Args[3] 7804 idx := v.Args[0] 7805 p := v.Args[1] 7806 v_2 := v.Args[2] 7807 if v_2.Op != Op386SHRLconst { 7808 break 7809 } 7810 if v_2.AuxInt != 16 { 7811 break 7812 } 7813 w := v_2.Args[0] 7814 x := v.Args[3] 7815 if x.Op != Op386MOVWstoreidx1 { 7816 break 7817 } 7818 if x.AuxInt != i-2 { 7819 break 7820 } 7821 if x.Aux != s { 7822 break 7823 } 7824 _ = x.Args[3] 7825 if p != x.Args[0] { 7826 break 7827 } 7828 if idx != x.Args[1] { 7829 break 7830 } 7831 if w != x.Args[2] { 7832 break 7833 } 7834 mem := x.Args[3] 7835 if !(x.Uses == 1 && clobber(x)) { 7836 break 7837 } 7838 v.reset(Op386MOVLstoreidx1) 7839 v.AuxInt = i - 2 7840 v.Aux = s 7841 v.AddArg(p) 7842 v.AddArg(idx) 7843 v.AddArg(w) 7844 v.AddArg(mem) 7845 return true 7846 } 7847 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 7848 // cond: x.Uses == 1 && clobber(x) 7849 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 7850 for { 7851 i := v.AuxInt 7852 s := v.Aux 7853 _ = v.Args[3] 7854 idx := v.Args[0] 7855 p := v.Args[1] 7856 v_2 := v.Args[2] 7857 if v_2.Op != Op386SHRLconst { 7858 break 7859 } 7860 if v_2.AuxInt != 16 { 7861 break 7862 } 7863 w := v_2.Args[0] 7864 x := v.Args[3] 7865 if x.Op != Op386MOVWstoreidx1 { 7866 break 7867 } 7868 if x.AuxInt != i-2 { 7869 break 7870 } 7871 if x.Aux != s { 7872 break 7873 } 7874 _ = x.Args[3] 7875 if idx != x.Args[0] { 7876 break 7877 } 7878 if p != x.Args[1] { 7879 break 7880 } 7881 if w != x.Args[2] { 7882 break 7883 } 7884 mem := x.Args[3] 7885 if !(x.Uses == 1 && clobber(x)) { 7886 break 7887 } 7888 v.reset(Op386MOVLstoreidx1) 7889 v.AuxInt = i - 2 7890 v.Aux = s 7891 v.AddArg(p) 7892 v.AddArg(idx) 7893 v.AddArg(w) 7894 v.AddArg(mem) 7895 return true 7896 } 7897 return false 7898 } 7899 func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { 7900 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 7901 // cond: x.Uses == 1 && clobber(x) 7902 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7903 for { 7904 i := v.AuxInt 7905 s := v.Aux 7906 _ = v.Args[3] 7907 p := v.Args[0] 7908 idx := v.Args[1] 7909 v_2 := v.Args[2] 7910 if v_2.Op != Op386SHRLconst { 7911 break 7912 } 7913 j := v_2.AuxInt 7914 w := v_2.Args[0] 7915 x := v.Args[3] 7916 if x.Op != Op386MOVWstoreidx1 { 7917 break 7918 } 7919 if x.AuxInt != i-2 { 7920 break 7921 } 7922 if x.Aux != s { 7923 break 7924 } 7925 _ = x.Args[3] 7926 if p != x.Args[0] { 7927 break 7928 } 7929 if idx != x.Args[1] { 7930 break 7931 } 7932 w0 := x.Args[2] 7933 if w0.Op != Op386SHRLconst { 7934 break 7935 } 7936 if w0.AuxInt != j-16 { 7937 break 7938 } 7939 if w != w0.Args[0] { 7940 break 7941 } 7942 mem := x.Args[3] 7943 if !(x.Uses == 1 && clobber(x)) { 7944 break 7945 } 7946 v.reset(Op386MOVLstoreidx1) 7947 v.AuxInt = i - 2 7948 v.Aux = s 7949 v.AddArg(p) 7950 v.AddArg(idx) 7951 v.AddArg(w0) 7952 v.AddArg(mem) 7953 return true 7954 } 7955 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 7956 // cond: x.Uses == 1 && clobber(x) 7957 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 7958 for { 7959 i := v.AuxInt 7960 s := v.Aux 7961 _ = v.Args[3] 7962 p := v.Args[0] 7963 idx := v.Args[1] 7964 v_2 := v.Args[2] 7965 if v_2.Op != Op386SHRLconst { 7966 break 7967 } 7968 j := v_2.AuxInt 7969 w := v_2.Args[0] 7970 x := v.Args[3] 7971 if x.Op != Op386MOVWstoreidx1 { 7972 break 7973 } 7974 if x.AuxInt != i-2 { 7975 break 7976 } 7977 if x.Aux != s { 7978 break 7979 } 7980 _ = x.Args[3] 7981 if idx != x.Args[0] { 7982 break 7983 } 7984 if p != x.Args[1] { 7985 break 7986 } 7987 w0 := x.Args[2] 7988 if w0.Op != Op386SHRLconst { 7989 break 7990 } 7991 if w0.AuxInt != j-16 { 7992 break 7993 } 7994 if w != w0.Args[0] { 7995 break 7996 } 7997 mem := x.Args[3] 7998 if !(x.Uses == 1 && clobber(x)) { 7999 break 8000 } 8001 v.reset(Op386MOVLstoreidx1) 8002 v.AuxInt = i - 2 8003 v.Aux = s 8004 v.AddArg(p) 8005 v.AddArg(idx) 8006 v.AddArg(w0) 8007 v.AddArg(mem) 8008 return true 8009 } 8010 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 8011 // cond: x.Uses == 1 && clobber(x) 8012 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 8013 for { 8014 i := v.AuxInt 8015 s := v.Aux 8016 _ = v.Args[3] 8017 idx := v.Args[0] 8018 p := v.Args[1] 8019 v_2 := v.Args[2] 8020 if v_2.Op != Op386SHRLconst { 8021 break 8022 } 8023 j := v_2.AuxInt 8024 w := v_2.Args[0] 8025 x := v.Args[3] 8026 if x.Op != Op386MOVWstoreidx1 { 8027 break 8028 } 8029 if x.AuxInt != i-2 { 8030 break 8031 } 8032 if x.Aux != s { 8033 break 8034 } 8035 _ = x.Args[3] 8036 if p != x.Args[0] { 8037 break 8038 } 8039 if idx != x.Args[1] { 8040 break 8041 } 8042 w0 := x.Args[2] 8043 if w0.Op != Op386SHRLconst { 8044 break 8045 } 8046 if w0.AuxInt != j-16 { 8047 break 8048 } 8049 if w != w0.Args[0] { 8050 break 8051 } 8052 mem := x.Args[3] 8053 if !(x.Uses == 1 && clobber(x)) { 8054 break 8055 } 8056 v.reset(Op386MOVLstoreidx1) 8057 v.AuxInt = i - 2 8058 v.Aux = s 8059 v.AddArg(p) 8060 v.AddArg(idx) 8061 v.AddArg(w0) 8062 v.AddArg(mem) 8063 return true 8064 } 8065 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 8066 // cond: x.Uses == 1 && clobber(x) 8067 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 8068 for { 8069 i := v.AuxInt 8070 s := v.Aux 8071 _ = v.Args[3] 8072 idx := v.Args[0] 8073 p := v.Args[1] 8074 v_2 := v.Args[2] 8075 if v_2.Op != Op386SHRLconst { 8076 break 8077 } 8078 j := v_2.AuxInt 8079 w := v_2.Args[0] 8080 x := v.Args[3] 8081 if x.Op != Op386MOVWstoreidx1 { 8082 break 8083 } 8084 if x.AuxInt != i-2 { 8085 break 8086 } 8087 if x.Aux != s { 8088 break 8089 } 8090 _ = x.Args[3] 8091 if idx != x.Args[0] { 8092 break 8093 } 8094 if p != x.Args[1] { 8095 break 8096 } 8097 w0 := x.Args[2] 8098 if w0.Op != Op386SHRLconst { 8099 break 8100 } 8101 if w0.AuxInt != j-16 { 8102 break 8103 } 8104 if w != w0.Args[0] { 8105 break 8106 } 8107 mem := x.Args[3] 8108 if !(x.Uses == 1 && clobber(x)) { 8109 break 8110 } 8111 v.reset(Op386MOVLstoreidx1) 8112 v.AuxInt = i - 2 8113 v.Aux = s 8114 v.AddArg(p) 8115 v.AddArg(idx) 8116 v.AddArg(w0) 8117 v.AddArg(mem) 8118 return true 8119 } 8120 return false 8121 } 8122 func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { 8123 b := v.Block 8124 _ = b 8125 // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) 8126 // cond: 8127 // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem) 8128 for { 8129 c := v.AuxInt 8130 sym := v.Aux 8131 _ = v.Args[3] 8132 v_0 := v.Args[0] 8133 if v_0.Op != Op386ADDLconst { 8134 break 8135 } 8136 d := v_0.AuxInt 8137 ptr := v_0.Args[0] 8138 idx := v.Args[1] 8139 val := v.Args[2] 8140 mem := v.Args[3] 8141 v.reset(Op386MOVWstoreidx2) 8142 v.AuxInt = int64(int32(c + d)) 8143 v.Aux = sym 8144 v.AddArg(ptr) 8145 v.AddArg(idx) 8146 v.AddArg(val) 8147 v.AddArg(mem) 8148 return true 8149 } 8150 // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) 8151 // cond: 8152 // result: (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem) 8153 for { 8154 c := v.AuxInt 8155 sym := v.Aux 8156 _ = v.Args[3] 8157 ptr := v.Args[0] 8158 v_1 := v.Args[1] 8159 if v_1.Op != Op386ADDLconst { 8160 break 8161 } 8162 d := v_1.AuxInt 8163 idx := v_1.Args[0] 8164 val := v.Args[2] 8165 mem := v.Args[3] 8166 v.reset(Op386MOVWstoreidx2) 8167 v.AuxInt = int64(int32(c + 2*d)) 8168 v.Aux = sym 8169 v.AddArg(ptr) 8170 v.AddArg(idx) 8171 v.AddArg(val) 8172 v.AddArg(mem) 8173 return true 8174 } 8175 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) 8176 // cond: x.Uses == 1 && clobber(x) 8177 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w mem) 8178 for { 8179 i := v.AuxInt 8180 s := v.Aux 8181 _ = v.Args[3] 8182 p := v.Args[0] 8183 idx := v.Args[1] 8184 v_2 := v.Args[2] 8185 if v_2.Op != Op386SHRLconst { 8186 break 8187 } 8188 if v_2.AuxInt != 16 { 8189 break 8190 } 8191 w := v_2.Args[0] 8192 x := v.Args[3] 8193 if x.Op != Op386MOVWstoreidx2 { 8194 break 8195 } 8196 if x.AuxInt != i-2 { 8197 break 8198 } 8199 if x.Aux != s { 8200 break 8201 } 8202 _ = x.Args[3] 8203 if p != x.Args[0] { 8204 break 8205 } 8206 if idx != x.Args[1] { 8207 break 8208 } 8209 if w != x.Args[2] { 8210 break 8211 } 8212 mem := x.Args[3] 8213 if !(x.Uses == 1 && clobber(x)) { 8214 break 8215 } 8216 v.reset(Op386MOVLstoreidx1) 8217 v.AuxInt = i - 2 8218 v.Aux = s 8219 v.AddArg(p) 8220 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 8221 v0.AuxInt = 1 8222 v0.AddArg(idx) 8223 v.AddArg(v0) 8224 v.AddArg(w) 8225 v.AddArg(mem) 8226 return true 8227 } 8228 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 8229 // cond: x.Uses == 1 && clobber(x) 8230 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w0 mem) 8231 for { 8232 i := v.AuxInt 8233 s := v.Aux 8234 _ = v.Args[3] 8235 p := v.Args[0] 8236 idx := v.Args[1] 8237 v_2 := v.Args[2] 8238 if v_2.Op != Op386SHRLconst { 8239 break 8240 } 8241 j := v_2.AuxInt 8242 w := v_2.Args[0] 8243 x := v.Args[3] 8244 if x.Op != Op386MOVWstoreidx2 { 8245 break 8246 } 8247 if x.AuxInt != i-2 { 8248 break 8249 } 8250 if x.Aux != s { 8251 break 8252 } 8253 _ = x.Args[3] 8254 if p != x.Args[0] { 8255 break 8256 } 8257 if idx != x.Args[1] { 8258 break 8259 } 8260 w0 := x.Args[2] 8261 if w0.Op != Op386SHRLconst { 8262 break 8263 } 8264 if w0.AuxInt != j-16 { 8265 break 8266 } 8267 if w != w0.Args[0] { 8268 break 8269 } 8270 mem := x.Args[3] 8271 if !(x.Uses == 1 && clobber(x)) { 8272 break 8273 } 8274 v.reset(Op386MOVLstoreidx1) 8275 v.AuxInt = i - 2 8276 v.Aux = s 8277 v.AddArg(p) 8278 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 8279 v0.AuxInt = 1 8280 v0.AddArg(idx) 8281 v.AddArg(v0) 8282 v.AddArg(w0) 8283 v.AddArg(mem) 8284 return true 8285 } 8286 return false 8287 } 8288 func rewriteValue386_Op386MULL_0(v *Value) bool { 8289 // match: (MULL x (MOVLconst [c])) 8290 // cond: 8291 // result: (MULLconst [c] x) 8292 for { 8293 _ = v.Args[1] 8294 x := v.Args[0] 8295 v_1 := v.Args[1] 8296 if v_1.Op != Op386MOVLconst { 8297 break 8298 } 8299 c := v_1.AuxInt 8300 v.reset(Op386MULLconst) 8301 v.AuxInt = c 8302 v.AddArg(x) 8303 return true 8304 } 8305 // match: (MULL (MOVLconst [c]) x) 8306 // cond: 8307 // result: (MULLconst [c] x) 8308 for { 8309 _ = v.Args[1] 8310 v_0 := v.Args[0] 8311 if v_0.Op != Op386MOVLconst { 8312 break 8313 } 8314 c := v_0.AuxInt 8315 x := v.Args[1] 8316 v.reset(Op386MULLconst) 8317 v.AuxInt = c 8318 v.AddArg(x) 8319 return true 8320 } 8321 return false 8322 } 8323 func rewriteValue386_Op386MULLconst_0(v *Value) bool { 8324 b := v.Block 8325 _ = b 8326 // match: (MULLconst [c] (MULLconst [d] x)) 8327 // cond: 8328 // result: (MULLconst [int64(int32(c * d))] x) 8329 for { 8330 c := v.AuxInt 8331 v_0 := v.Args[0] 8332 if v_0.Op != Op386MULLconst { 8333 break 8334 } 8335 d := v_0.AuxInt 8336 x := v_0.Args[0] 8337 v.reset(Op386MULLconst) 8338 v.AuxInt = int64(int32(c * d)) 8339 v.AddArg(x) 8340 return true 8341 } 8342 // match: (MULLconst [-1] x) 8343 // cond: 8344 // result: (NEGL x) 8345 for { 8346 if v.AuxInt != -1 { 8347 break 8348 } 8349 x := v.Args[0] 8350 v.reset(Op386NEGL) 8351 v.AddArg(x) 8352 return true 8353 } 8354 // match: (MULLconst [0] _) 8355 // cond: 8356 // result: (MOVLconst [0]) 8357 for { 8358 if v.AuxInt != 0 { 8359 break 8360 } 8361 v.reset(Op386MOVLconst) 8362 v.AuxInt = 0 8363 return true 8364 } 8365 // match: (MULLconst [1] x) 8366 // cond: 8367 // result: x 8368 for { 8369 if v.AuxInt != 1 { 8370 break 8371 } 8372 x := v.Args[0] 8373 v.reset(OpCopy) 8374 v.Type = x.Type 8375 v.AddArg(x) 8376 return true 8377 } 8378 // match: (MULLconst [3] x) 8379 // cond: 8380 // result: (LEAL2 x x) 8381 for { 8382 if v.AuxInt != 3 { 8383 break 8384 } 8385 x := v.Args[0] 8386 v.reset(Op386LEAL2) 8387 v.AddArg(x) 8388 v.AddArg(x) 8389 return true 8390 } 8391 // match: (MULLconst [5] x) 8392 // cond: 8393 // result: (LEAL4 x x) 8394 for { 8395 if v.AuxInt != 5 { 8396 break 8397 } 8398 x := v.Args[0] 8399 v.reset(Op386LEAL4) 8400 v.AddArg(x) 8401 v.AddArg(x) 8402 return true 8403 } 8404 // match: (MULLconst [7] x) 8405 // cond: 8406 // result: (LEAL8 (NEGL <v.Type> x) x) 8407 for { 8408 if v.AuxInt != 7 { 8409 break 8410 } 8411 x := v.Args[0] 8412 v.reset(Op386LEAL8) 8413 v0 := b.NewValue0(v.Pos, Op386NEGL, v.Type) 8414 v0.AddArg(x) 8415 v.AddArg(v0) 8416 v.AddArg(x) 8417 return true 8418 } 8419 // match: (MULLconst [9] x) 8420 // cond: 8421 // result: (LEAL8 x x) 8422 for { 8423 if v.AuxInt != 9 { 8424 break 8425 } 8426 x := v.Args[0] 8427 v.reset(Op386LEAL8) 8428 v.AddArg(x) 8429 v.AddArg(x) 8430 return true 8431 } 8432 // match: (MULLconst [11] x) 8433 // cond: 8434 // result: (LEAL2 x (LEAL4 <v.Type> x x)) 8435 for { 8436 if v.AuxInt != 11 { 8437 break 8438 } 8439 x := v.Args[0] 8440 v.reset(Op386LEAL2) 8441 v.AddArg(x) 8442 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8443 v0.AddArg(x) 8444 v0.AddArg(x) 8445 v.AddArg(v0) 8446 return true 8447 } 8448 // match: (MULLconst [13] x) 8449 // cond: 8450 // result: (LEAL4 x (LEAL2 <v.Type> x x)) 8451 for { 8452 if v.AuxInt != 13 { 8453 break 8454 } 8455 x := v.Args[0] 8456 v.reset(Op386LEAL4) 8457 v.AddArg(x) 8458 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8459 v0.AddArg(x) 8460 v0.AddArg(x) 8461 v.AddArg(v0) 8462 return true 8463 } 8464 return false 8465 } 8466 func rewriteValue386_Op386MULLconst_10(v *Value) bool { 8467 b := v.Block 8468 _ = b 8469 // match: (MULLconst [21] x) 8470 // cond: 8471 // result: (LEAL4 x (LEAL4 <v.Type> x x)) 8472 for { 8473 if v.AuxInt != 21 { 8474 break 8475 } 8476 x := v.Args[0] 8477 v.reset(Op386LEAL4) 8478 v.AddArg(x) 8479 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8480 v0.AddArg(x) 8481 v0.AddArg(x) 8482 v.AddArg(v0) 8483 return true 8484 } 8485 // match: (MULLconst [25] x) 8486 // cond: 8487 // result: (LEAL8 x (LEAL2 <v.Type> x x)) 8488 for { 8489 if v.AuxInt != 25 { 8490 break 8491 } 8492 x := v.Args[0] 8493 v.reset(Op386LEAL8) 8494 v.AddArg(x) 8495 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8496 v0.AddArg(x) 8497 v0.AddArg(x) 8498 v.AddArg(v0) 8499 return true 8500 } 8501 // match: (MULLconst [37] x) 8502 // cond: 8503 // result: (LEAL4 x (LEAL8 <v.Type> x x)) 8504 for { 8505 if v.AuxInt != 37 { 8506 break 8507 } 8508 x := v.Args[0] 8509 v.reset(Op386LEAL4) 8510 v.AddArg(x) 8511 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8512 v0.AddArg(x) 8513 v0.AddArg(x) 8514 v.AddArg(v0) 8515 return true 8516 } 8517 // match: (MULLconst [41] x) 8518 // cond: 8519 // result: (LEAL8 x (LEAL4 <v.Type> x x)) 8520 for { 8521 if v.AuxInt != 41 { 8522 break 8523 } 8524 x := v.Args[0] 8525 v.reset(Op386LEAL8) 8526 v.AddArg(x) 8527 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8528 v0.AddArg(x) 8529 v0.AddArg(x) 8530 v.AddArg(v0) 8531 return true 8532 } 8533 // match: (MULLconst [73] x) 8534 // cond: 8535 // result: (LEAL8 x (LEAL8 <v.Type> x x)) 8536 for { 8537 if v.AuxInt != 73 { 8538 break 8539 } 8540 x := v.Args[0] 8541 v.reset(Op386LEAL8) 8542 v.AddArg(x) 8543 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8544 v0.AddArg(x) 8545 v0.AddArg(x) 8546 v.AddArg(v0) 8547 return true 8548 } 8549 // match: (MULLconst [c] x) 8550 // cond: isPowerOfTwo(c+1) && c >= 15 8551 // result: (SUBL (SHLLconst <v.Type> [log2(c+1)] x) x) 8552 for { 8553 c := v.AuxInt 8554 x := v.Args[0] 8555 if !(isPowerOfTwo(c+1) && c >= 15) { 8556 break 8557 } 8558 v.reset(Op386SUBL) 8559 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8560 v0.AuxInt = log2(c + 1) 8561 v0.AddArg(x) 8562 v.AddArg(v0) 8563 v.AddArg(x) 8564 return true 8565 } 8566 // match: (MULLconst [c] x) 8567 // cond: isPowerOfTwo(c-1) && c >= 17 8568 // result: (LEAL1 (SHLLconst <v.Type> [log2(c-1)] x) x) 8569 for { 8570 c := v.AuxInt 8571 x := v.Args[0] 8572 if !(isPowerOfTwo(c-1) && c >= 17) { 8573 break 8574 } 8575 v.reset(Op386LEAL1) 8576 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8577 v0.AuxInt = log2(c - 1) 8578 v0.AddArg(x) 8579 v.AddArg(v0) 8580 v.AddArg(x) 8581 return true 8582 } 8583 // match: (MULLconst [c] x) 8584 // cond: isPowerOfTwo(c-2) && c >= 34 8585 // result: (LEAL2 (SHLLconst <v.Type> [log2(c-2)] x) x) 8586 for { 8587 c := v.AuxInt 8588 x := v.Args[0] 8589 if !(isPowerOfTwo(c-2) && c >= 34) { 8590 break 8591 } 8592 v.reset(Op386LEAL2) 8593 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8594 v0.AuxInt = log2(c - 2) 8595 v0.AddArg(x) 8596 v.AddArg(v0) 8597 v.AddArg(x) 8598 return true 8599 } 8600 // match: (MULLconst [c] x) 8601 // cond: isPowerOfTwo(c-4) && c >= 68 8602 // result: (LEAL4 (SHLLconst <v.Type> [log2(c-4)] x) x) 8603 for { 8604 c := v.AuxInt 8605 x := v.Args[0] 8606 if !(isPowerOfTwo(c-4) && c >= 68) { 8607 break 8608 } 8609 v.reset(Op386LEAL4) 8610 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8611 v0.AuxInt = log2(c - 4) 8612 v0.AddArg(x) 8613 v.AddArg(v0) 8614 v.AddArg(x) 8615 return true 8616 } 8617 // match: (MULLconst [c] x) 8618 // cond: isPowerOfTwo(c-8) && c >= 136 8619 // result: (LEAL8 (SHLLconst <v.Type> [log2(c-8)] x) x) 8620 for { 8621 c := v.AuxInt 8622 x := v.Args[0] 8623 if !(isPowerOfTwo(c-8) && c >= 136) { 8624 break 8625 } 8626 v.reset(Op386LEAL8) 8627 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 8628 v0.AuxInt = log2(c - 8) 8629 v0.AddArg(x) 8630 v.AddArg(v0) 8631 v.AddArg(x) 8632 return true 8633 } 8634 return false 8635 } 8636 func rewriteValue386_Op386MULLconst_20(v *Value) bool { 8637 b := v.Block 8638 _ = b 8639 // match: (MULLconst [c] x) 8640 // cond: c%3 == 0 && isPowerOfTwo(c/3) 8641 // result: (SHLLconst [log2(c/3)] (LEAL2 <v.Type> x x)) 8642 for { 8643 c := v.AuxInt 8644 x := v.Args[0] 8645 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 8646 break 8647 } 8648 v.reset(Op386SHLLconst) 8649 v.AuxInt = log2(c / 3) 8650 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 8651 v0.AddArg(x) 8652 v0.AddArg(x) 8653 v.AddArg(v0) 8654 return true 8655 } 8656 // match: (MULLconst [c] x) 8657 // cond: c%5 == 0 && isPowerOfTwo(c/5) 8658 // result: (SHLLconst [log2(c/5)] (LEAL4 <v.Type> x x)) 8659 for { 8660 c := v.AuxInt 8661 x := v.Args[0] 8662 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 8663 break 8664 } 8665 v.reset(Op386SHLLconst) 8666 v.AuxInt = log2(c / 5) 8667 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 8668 v0.AddArg(x) 8669 v0.AddArg(x) 8670 v.AddArg(v0) 8671 return true 8672 } 8673 // match: (MULLconst [c] x) 8674 // cond: c%9 == 0 && isPowerOfTwo(c/9) 8675 // result: (SHLLconst [log2(c/9)] (LEAL8 <v.Type> x x)) 8676 for { 8677 c := v.AuxInt 8678 x := v.Args[0] 8679 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 8680 break 8681 } 8682 v.reset(Op386SHLLconst) 8683 v.AuxInt = log2(c / 9) 8684 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 8685 v0.AddArg(x) 8686 v0.AddArg(x) 8687 v.AddArg(v0) 8688 return true 8689 } 8690 // match: (MULLconst [c] (MOVLconst [d])) 8691 // cond: 8692 // result: (MOVLconst [int64(int32(c*d))]) 8693 for { 8694 c := v.AuxInt 8695 v_0 := v.Args[0] 8696 if v_0.Op != Op386MOVLconst { 8697 break 8698 } 8699 d := v_0.AuxInt 8700 v.reset(Op386MOVLconst) 8701 v.AuxInt = int64(int32(c * d)) 8702 return true 8703 } 8704 return false 8705 } 8706 func rewriteValue386_Op386NEGL_0(v *Value) bool { 8707 // match: (NEGL (MOVLconst [c])) 8708 // cond: 8709 // result: (MOVLconst [int64(int32(-c))]) 8710 for { 8711 v_0 := v.Args[0] 8712 if v_0.Op != Op386MOVLconst { 8713 break 8714 } 8715 c := v_0.AuxInt 8716 v.reset(Op386MOVLconst) 8717 v.AuxInt = int64(int32(-c)) 8718 return true 8719 } 8720 return false 8721 } 8722 func rewriteValue386_Op386NOTL_0(v *Value) bool { 8723 // match: (NOTL (MOVLconst [c])) 8724 // cond: 8725 // result: (MOVLconst [^c]) 8726 for { 8727 v_0 := v.Args[0] 8728 if v_0.Op != Op386MOVLconst { 8729 break 8730 } 8731 c := v_0.AuxInt 8732 v.reset(Op386MOVLconst) 8733 v.AuxInt = ^c 8734 return true 8735 } 8736 return false 8737 } 8738 func rewriteValue386_Op386ORL_0(v *Value) bool { 8739 b := v.Block 8740 _ = b 8741 typ := &b.Func.Config.Types 8742 _ = typ 8743 // match: (ORL x (MOVLconst [c])) 8744 // cond: 8745 // result: (ORLconst [c] x) 8746 for { 8747 _ = v.Args[1] 8748 x := v.Args[0] 8749 v_1 := v.Args[1] 8750 if v_1.Op != Op386MOVLconst { 8751 break 8752 } 8753 c := v_1.AuxInt 8754 v.reset(Op386ORLconst) 8755 v.AuxInt = c 8756 v.AddArg(x) 8757 return true 8758 } 8759 // match: (ORL (MOVLconst [c]) x) 8760 // cond: 8761 // result: (ORLconst [c] x) 8762 for { 8763 _ = v.Args[1] 8764 v_0 := v.Args[0] 8765 if v_0.Op != Op386MOVLconst { 8766 break 8767 } 8768 c := v_0.AuxInt 8769 x := v.Args[1] 8770 v.reset(Op386ORLconst) 8771 v.AuxInt = c 8772 v.AddArg(x) 8773 return true 8774 } 8775 // match: (ORL (SHLLconst [c] x) (SHRLconst [d] x)) 8776 // cond: d == 32-c 8777 // result: (ROLLconst [c] x) 8778 for { 8779 _ = v.Args[1] 8780 v_0 := v.Args[0] 8781 if v_0.Op != Op386SHLLconst { 8782 break 8783 } 8784 c := v_0.AuxInt 8785 x := v_0.Args[0] 8786 v_1 := v.Args[1] 8787 if v_1.Op != Op386SHRLconst { 8788 break 8789 } 8790 d := v_1.AuxInt 8791 if x != v_1.Args[0] { 8792 break 8793 } 8794 if !(d == 32-c) { 8795 break 8796 } 8797 v.reset(Op386ROLLconst) 8798 v.AuxInt = c 8799 v.AddArg(x) 8800 return true 8801 } 8802 // match: (ORL (SHRLconst [d] x) (SHLLconst [c] x)) 8803 // cond: d == 32-c 8804 // result: (ROLLconst [c] x) 8805 for { 8806 _ = v.Args[1] 8807 v_0 := v.Args[0] 8808 if v_0.Op != Op386SHRLconst { 8809 break 8810 } 8811 d := v_0.AuxInt 8812 x := v_0.Args[0] 8813 v_1 := v.Args[1] 8814 if v_1.Op != Op386SHLLconst { 8815 break 8816 } 8817 c := v_1.AuxInt 8818 if x != v_1.Args[0] { 8819 break 8820 } 8821 if !(d == 32-c) { 8822 break 8823 } 8824 v.reset(Op386ROLLconst) 8825 v.AuxInt = c 8826 v.AddArg(x) 8827 return true 8828 } 8829 // match: (ORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 8830 // cond: c < 16 && d == 16-c && t.Size() == 2 8831 // result: (ROLWconst x [c]) 8832 for { 8833 t := v.Type 8834 _ = v.Args[1] 8835 v_0 := v.Args[0] 8836 if v_0.Op != Op386SHLLconst { 8837 break 8838 } 8839 c := v_0.AuxInt 8840 x := v_0.Args[0] 8841 v_1 := v.Args[1] 8842 if v_1.Op != Op386SHRWconst { 8843 break 8844 } 8845 d := v_1.AuxInt 8846 if x != v_1.Args[0] { 8847 break 8848 } 8849 if !(c < 16 && d == 16-c && t.Size() == 2) { 8850 break 8851 } 8852 v.reset(Op386ROLWconst) 8853 v.AuxInt = c 8854 v.AddArg(x) 8855 return true 8856 } 8857 // match: (ORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 8858 // cond: c < 16 && d == 16-c && t.Size() == 2 8859 // result: (ROLWconst x [c]) 8860 for { 8861 t := v.Type 8862 _ = v.Args[1] 8863 v_0 := v.Args[0] 8864 if v_0.Op != Op386SHRWconst { 8865 break 8866 } 8867 d := v_0.AuxInt 8868 x := v_0.Args[0] 8869 v_1 := v.Args[1] 8870 if v_1.Op != Op386SHLLconst { 8871 break 8872 } 8873 c := v_1.AuxInt 8874 if x != v_1.Args[0] { 8875 break 8876 } 8877 if !(c < 16 && d == 16-c && t.Size() == 2) { 8878 break 8879 } 8880 v.reset(Op386ROLWconst) 8881 v.AuxInt = c 8882 v.AddArg(x) 8883 return true 8884 } 8885 // match: (ORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 8886 // cond: c < 8 && d == 8-c && t.Size() == 1 8887 // result: (ROLBconst x [c]) 8888 for { 8889 t := v.Type 8890 _ = v.Args[1] 8891 v_0 := v.Args[0] 8892 if v_0.Op != Op386SHLLconst { 8893 break 8894 } 8895 c := v_0.AuxInt 8896 x := v_0.Args[0] 8897 v_1 := v.Args[1] 8898 if v_1.Op != Op386SHRBconst { 8899 break 8900 } 8901 d := v_1.AuxInt 8902 if x != v_1.Args[0] { 8903 break 8904 } 8905 if !(c < 8 && d == 8-c && t.Size() == 1) { 8906 break 8907 } 8908 v.reset(Op386ROLBconst) 8909 v.AuxInt = c 8910 v.AddArg(x) 8911 return true 8912 } 8913 // match: (ORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 8914 // cond: c < 8 && d == 8-c && t.Size() == 1 8915 // result: (ROLBconst x [c]) 8916 for { 8917 t := v.Type 8918 _ = v.Args[1] 8919 v_0 := v.Args[0] 8920 if v_0.Op != Op386SHRBconst { 8921 break 8922 } 8923 d := v_0.AuxInt 8924 x := v_0.Args[0] 8925 v_1 := v.Args[1] 8926 if v_1.Op != Op386SHLLconst { 8927 break 8928 } 8929 c := v_1.AuxInt 8930 if x != v_1.Args[0] { 8931 break 8932 } 8933 if !(c < 8 && d == 8-c && t.Size() == 1) { 8934 break 8935 } 8936 v.reset(Op386ROLBconst) 8937 v.AuxInt = c 8938 v.AddArg(x) 8939 return true 8940 } 8941 // match: (ORL x x) 8942 // cond: 8943 // result: x 8944 for { 8945 _ = v.Args[1] 8946 x := v.Args[0] 8947 if x != v.Args[1] { 8948 break 8949 } 8950 v.reset(OpCopy) 8951 v.Type = x.Type 8952 v.AddArg(x) 8953 return true 8954 } 8955 // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) 8956 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 8957 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 8958 for { 8959 _ = v.Args[1] 8960 x0 := v.Args[0] 8961 if x0.Op != Op386MOVBload { 8962 break 8963 } 8964 i0 := x0.AuxInt 8965 s := x0.Aux 8966 _ = x0.Args[1] 8967 p := x0.Args[0] 8968 mem := x0.Args[1] 8969 s0 := v.Args[1] 8970 if s0.Op != Op386SHLLconst { 8971 break 8972 } 8973 if s0.AuxInt != 8 { 8974 break 8975 } 8976 x1 := s0.Args[0] 8977 if x1.Op != Op386MOVBload { 8978 break 8979 } 8980 i1 := x1.AuxInt 8981 if x1.Aux != s { 8982 break 8983 } 8984 _ = x1.Args[1] 8985 if p != x1.Args[0] { 8986 break 8987 } 8988 if mem != x1.Args[1] { 8989 break 8990 } 8991 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 8992 break 8993 } 8994 b = mergePoint(b, x0, x1) 8995 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 8996 v.reset(OpCopy) 8997 v.AddArg(v0) 8998 v0.AuxInt = i0 8999 v0.Aux = s 9000 v0.AddArg(p) 9001 v0.AddArg(mem) 9002 return true 9003 } 9004 return false 9005 } 9006 func rewriteValue386_Op386ORL_10(v *Value) bool { 9007 b := v.Block 9008 _ = b 9009 typ := &b.Func.Config.Types 9010 _ = typ 9011 // match: (ORL s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) 9012 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9013 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 9014 for { 9015 _ = v.Args[1] 9016 s0 := v.Args[0] 9017 if s0.Op != Op386SHLLconst { 9018 break 9019 } 9020 if s0.AuxInt != 8 { 9021 break 9022 } 9023 x1 := s0.Args[0] 9024 if x1.Op != Op386MOVBload { 9025 break 9026 } 9027 i1 := x1.AuxInt 9028 s := x1.Aux 9029 _ = x1.Args[1] 9030 p := x1.Args[0] 9031 mem := x1.Args[1] 9032 x0 := v.Args[1] 9033 if x0.Op != Op386MOVBload { 9034 break 9035 } 9036 i0 := x0.AuxInt 9037 if x0.Aux != s { 9038 break 9039 } 9040 _ = x0.Args[1] 9041 if p != x0.Args[0] { 9042 break 9043 } 9044 if mem != x0.Args[1] { 9045 break 9046 } 9047 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9048 break 9049 } 9050 b = mergePoint(b, x0, x1) 9051 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 9052 v.reset(OpCopy) 9053 v.AddArg(v0) 9054 v0.AuxInt = i0 9055 v0.Aux = s 9056 v0.AddArg(p) 9057 v0.AddArg(mem) 9058 return true 9059 } 9060 // 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))) 9061 // 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) 9062 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9063 for { 9064 _ = v.Args[1] 9065 o0 := v.Args[0] 9066 if o0.Op != Op386ORL { 9067 break 9068 } 9069 _ = o0.Args[1] 9070 x0 := o0.Args[0] 9071 if x0.Op != Op386MOVWload { 9072 break 9073 } 9074 i0 := x0.AuxInt 9075 s := x0.Aux 9076 _ = x0.Args[1] 9077 p := x0.Args[0] 9078 mem := x0.Args[1] 9079 s0 := o0.Args[1] 9080 if s0.Op != Op386SHLLconst { 9081 break 9082 } 9083 if s0.AuxInt != 16 { 9084 break 9085 } 9086 x1 := s0.Args[0] 9087 if x1.Op != Op386MOVBload { 9088 break 9089 } 9090 i2 := x1.AuxInt 9091 if x1.Aux != s { 9092 break 9093 } 9094 _ = x1.Args[1] 9095 if p != x1.Args[0] { 9096 break 9097 } 9098 if mem != x1.Args[1] { 9099 break 9100 } 9101 s1 := v.Args[1] 9102 if s1.Op != Op386SHLLconst { 9103 break 9104 } 9105 if s1.AuxInt != 24 { 9106 break 9107 } 9108 x2 := s1.Args[0] 9109 if x2.Op != Op386MOVBload { 9110 break 9111 } 9112 i3 := x2.AuxInt 9113 if x2.Aux != s { 9114 break 9115 } 9116 _ = x2.Args[1] 9117 if p != x2.Args[0] { 9118 break 9119 } 9120 if mem != x2.Args[1] { 9121 break 9122 } 9123 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)) { 9124 break 9125 } 9126 b = mergePoint(b, x0, x1, x2) 9127 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9128 v.reset(OpCopy) 9129 v.AddArg(v0) 9130 v0.AuxInt = i0 9131 v0.Aux = s 9132 v0.AddArg(p) 9133 v0.AddArg(mem) 9134 return true 9135 } 9136 // 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))) 9137 // 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) 9138 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9139 for { 9140 _ = v.Args[1] 9141 o0 := v.Args[0] 9142 if o0.Op != Op386ORL { 9143 break 9144 } 9145 _ = o0.Args[1] 9146 s0 := o0.Args[0] 9147 if s0.Op != Op386SHLLconst { 9148 break 9149 } 9150 if s0.AuxInt != 16 { 9151 break 9152 } 9153 x1 := s0.Args[0] 9154 if x1.Op != Op386MOVBload { 9155 break 9156 } 9157 i2 := x1.AuxInt 9158 s := x1.Aux 9159 _ = x1.Args[1] 9160 p := x1.Args[0] 9161 mem := x1.Args[1] 9162 x0 := o0.Args[1] 9163 if x0.Op != Op386MOVWload { 9164 break 9165 } 9166 i0 := x0.AuxInt 9167 if x0.Aux != s { 9168 break 9169 } 9170 _ = x0.Args[1] 9171 if p != x0.Args[0] { 9172 break 9173 } 9174 if mem != x0.Args[1] { 9175 break 9176 } 9177 s1 := v.Args[1] 9178 if s1.Op != Op386SHLLconst { 9179 break 9180 } 9181 if s1.AuxInt != 24 { 9182 break 9183 } 9184 x2 := s1.Args[0] 9185 if x2.Op != Op386MOVBload { 9186 break 9187 } 9188 i3 := x2.AuxInt 9189 if x2.Aux != s { 9190 break 9191 } 9192 _ = x2.Args[1] 9193 if p != x2.Args[0] { 9194 break 9195 } 9196 if mem != x2.Args[1] { 9197 break 9198 } 9199 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)) { 9200 break 9201 } 9202 b = mergePoint(b, x0, x1, x2) 9203 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9204 v.reset(OpCopy) 9205 v.AddArg(v0) 9206 v0.AuxInt = i0 9207 v0.Aux = s 9208 v0.AddArg(p) 9209 v0.AddArg(mem) 9210 return true 9211 } 9212 // 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)))) 9213 // 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) 9214 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9215 for { 9216 _ = v.Args[1] 9217 s1 := v.Args[0] 9218 if s1.Op != Op386SHLLconst { 9219 break 9220 } 9221 if s1.AuxInt != 24 { 9222 break 9223 } 9224 x2 := s1.Args[0] 9225 if x2.Op != Op386MOVBload { 9226 break 9227 } 9228 i3 := x2.AuxInt 9229 s := x2.Aux 9230 _ = x2.Args[1] 9231 p := x2.Args[0] 9232 mem := x2.Args[1] 9233 o0 := v.Args[1] 9234 if o0.Op != Op386ORL { 9235 break 9236 } 9237 _ = o0.Args[1] 9238 x0 := o0.Args[0] 9239 if x0.Op != Op386MOVWload { 9240 break 9241 } 9242 i0 := x0.AuxInt 9243 if x0.Aux != s { 9244 break 9245 } 9246 _ = x0.Args[1] 9247 if p != x0.Args[0] { 9248 break 9249 } 9250 if mem != x0.Args[1] { 9251 break 9252 } 9253 s0 := o0.Args[1] 9254 if s0.Op != Op386SHLLconst { 9255 break 9256 } 9257 if s0.AuxInt != 16 { 9258 break 9259 } 9260 x1 := s0.Args[0] 9261 if x1.Op != Op386MOVBload { 9262 break 9263 } 9264 i2 := x1.AuxInt 9265 if x1.Aux != s { 9266 break 9267 } 9268 _ = x1.Args[1] 9269 if p != x1.Args[0] { 9270 break 9271 } 9272 if mem != x1.Args[1] { 9273 break 9274 } 9275 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)) { 9276 break 9277 } 9278 b = mergePoint(b, x0, x1, x2) 9279 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9280 v.reset(OpCopy) 9281 v.AddArg(v0) 9282 v0.AuxInt = i0 9283 v0.Aux = s 9284 v0.AddArg(p) 9285 v0.AddArg(mem) 9286 return true 9287 } 9288 // 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))) 9289 // 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) 9290 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 9291 for { 9292 _ = v.Args[1] 9293 s1 := v.Args[0] 9294 if s1.Op != Op386SHLLconst { 9295 break 9296 } 9297 if s1.AuxInt != 24 { 9298 break 9299 } 9300 x2 := s1.Args[0] 9301 if x2.Op != Op386MOVBload { 9302 break 9303 } 9304 i3 := x2.AuxInt 9305 s := x2.Aux 9306 _ = x2.Args[1] 9307 p := x2.Args[0] 9308 mem := x2.Args[1] 9309 o0 := v.Args[1] 9310 if o0.Op != Op386ORL { 9311 break 9312 } 9313 _ = o0.Args[1] 9314 s0 := o0.Args[0] 9315 if s0.Op != Op386SHLLconst { 9316 break 9317 } 9318 if s0.AuxInt != 16 { 9319 break 9320 } 9321 x1 := s0.Args[0] 9322 if x1.Op != Op386MOVBload { 9323 break 9324 } 9325 i2 := x1.AuxInt 9326 if x1.Aux != s { 9327 break 9328 } 9329 _ = x1.Args[1] 9330 if p != x1.Args[0] { 9331 break 9332 } 9333 if mem != x1.Args[1] { 9334 break 9335 } 9336 x0 := o0.Args[1] 9337 if x0.Op != Op386MOVWload { 9338 break 9339 } 9340 i0 := x0.AuxInt 9341 if x0.Aux != s { 9342 break 9343 } 9344 _ = x0.Args[1] 9345 if p != x0.Args[0] { 9346 break 9347 } 9348 if mem != x0.Args[1] { 9349 break 9350 } 9351 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)) { 9352 break 9353 } 9354 b = mergePoint(b, x0, x1, x2) 9355 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 9356 v.reset(OpCopy) 9357 v.AddArg(v0) 9358 v0.AuxInt = i0 9359 v0.Aux = s 9360 v0.AddArg(p) 9361 v0.AddArg(mem) 9362 return true 9363 } 9364 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 9365 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9366 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9367 for { 9368 _ = v.Args[1] 9369 x0 := v.Args[0] 9370 if x0.Op != Op386MOVBloadidx1 { 9371 break 9372 } 9373 i0 := x0.AuxInt 9374 s := x0.Aux 9375 _ = x0.Args[2] 9376 p := x0.Args[0] 9377 idx := x0.Args[1] 9378 mem := x0.Args[2] 9379 s0 := v.Args[1] 9380 if s0.Op != Op386SHLLconst { 9381 break 9382 } 9383 if s0.AuxInt != 8 { 9384 break 9385 } 9386 x1 := s0.Args[0] 9387 if x1.Op != Op386MOVBloadidx1 { 9388 break 9389 } 9390 i1 := x1.AuxInt 9391 if x1.Aux != s { 9392 break 9393 } 9394 _ = x1.Args[2] 9395 if p != x1.Args[0] { 9396 break 9397 } 9398 if idx != x1.Args[1] { 9399 break 9400 } 9401 if mem != x1.Args[2] { 9402 break 9403 } 9404 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9405 break 9406 } 9407 b = mergePoint(b, x0, x1) 9408 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9409 v.reset(OpCopy) 9410 v.AddArg(v0) 9411 v0.AuxInt = i0 9412 v0.Aux = s 9413 v0.AddArg(p) 9414 v0.AddArg(idx) 9415 v0.AddArg(mem) 9416 return true 9417 } 9418 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 9419 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9420 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9421 for { 9422 _ = v.Args[1] 9423 x0 := v.Args[0] 9424 if x0.Op != Op386MOVBloadidx1 { 9425 break 9426 } 9427 i0 := x0.AuxInt 9428 s := x0.Aux 9429 _ = x0.Args[2] 9430 idx := x0.Args[0] 9431 p := x0.Args[1] 9432 mem := x0.Args[2] 9433 s0 := v.Args[1] 9434 if s0.Op != Op386SHLLconst { 9435 break 9436 } 9437 if s0.AuxInt != 8 { 9438 break 9439 } 9440 x1 := s0.Args[0] 9441 if x1.Op != Op386MOVBloadidx1 { 9442 break 9443 } 9444 i1 := x1.AuxInt 9445 if x1.Aux != s { 9446 break 9447 } 9448 _ = x1.Args[2] 9449 if p != x1.Args[0] { 9450 break 9451 } 9452 if idx != x1.Args[1] { 9453 break 9454 } 9455 if mem != x1.Args[2] { 9456 break 9457 } 9458 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9459 break 9460 } 9461 b = mergePoint(b, x0, x1) 9462 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9463 v.reset(OpCopy) 9464 v.AddArg(v0) 9465 v0.AuxInt = i0 9466 v0.Aux = s 9467 v0.AddArg(p) 9468 v0.AddArg(idx) 9469 v0.AddArg(mem) 9470 return true 9471 } 9472 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9473 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9474 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9475 for { 9476 _ = v.Args[1] 9477 x0 := v.Args[0] 9478 if x0.Op != Op386MOVBloadidx1 { 9479 break 9480 } 9481 i0 := x0.AuxInt 9482 s := x0.Aux 9483 _ = x0.Args[2] 9484 p := x0.Args[0] 9485 idx := x0.Args[1] 9486 mem := x0.Args[2] 9487 s0 := v.Args[1] 9488 if s0.Op != Op386SHLLconst { 9489 break 9490 } 9491 if s0.AuxInt != 8 { 9492 break 9493 } 9494 x1 := s0.Args[0] 9495 if x1.Op != Op386MOVBloadidx1 { 9496 break 9497 } 9498 i1 := x1.AuxInt 9499 if x1.Aux != s { 9500 break 9501 } 9502 _ = x1.Args[2] 9503 if idx != x1.Args[0] { 9504 break 9505 } 9506 if p != x1.Args[1] { 9507 break 9508 } 9509 if mem != x1.Args[2] { 9510 break 9511 } 9512 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9513 break 9514 } 9515 b = mergePoint(b, x0, x1) 9516 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9517 v.reset(OpCopy) 9518 v.AddArg(v0) 9519 v0.AuxInt = i0 9520 v0.Aux = s 9521 v0.AddArg(p) 9522 v0.AddArg(idx) 9523 v0.AddArg(mem) 9524 return true 9525 } 9526 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 9527 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9528 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9529 for { 9530 _ = v.Args[1] 9531 x0 := v.Args[0] 9532 if x0.Op != Op386MOVBloadidx1 { 9533 break 9534 } 9535 i0 := x0.AuxInt 9536 s := x0.Aux 9537 _ = x0.Args[2] 9538 idx := x0.Args[0] 9539 p := x0.Args[1] 9540 mem := x0.Args[2] 9541 s0 := v.Args[1] 9542 if s0.Op != Op386SHLLconst { 9543 break 9544 } 9545 if s0.AuxInt != 8 { 9546 break 9547 } 9548 x1 := s0.Args[0] 9549 if x1.Op != Op386MOVBloadidx1 { 9550 break 9551 } 9552 i1 := x1.AuxInt 9553 if x1.Aux != s { 9554 break 9555 } 9556 _ = x1.Args[2] 9557 if idx != x1.Args[0] { 9558 break 9559 } 9560 if p != x1.Args[1] { 9561 break 9562 } 9563 if mem != x1.Args[2] { 9564 break 9565 } 9566 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9567 break 9568 } 9569 b = mergePoint(b, x0, x1) 9570 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9571 v.reset(OpCopy) 9572 v.AddArg(v0) 9573 v0.AuxInt = i0 9574 v0.Aux = s 9575 v0.AddArg(p) 9576 v0.AddArg(idx) 9577 v0.AddArg(mem) 9578 return true 9579 } 9580 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9581 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9582 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9583 for { 9584 _ = v.Args[1] 9585 s0 := v.Args[0] 9586 if s0.Op != Op386SHLLconst { 9587 break 9588 } 9589 if s0.AuxInt != 8 { 9590 break 9591 } 9592 x1 := s0.Args[0] 9593 if x1.Op != Op386MOVBloadidx1 { 9594 break 9595 } 9596 i1 := x1.AuxInt 9597 s := x1.Aux 9598 _ = x1.Args[2] 9599 p := x1.Args[0] 9600 idx := x1.Args[1] 9601 mem := x1.Args[2] 9602 x0 := v.Args[1] 9603 if x0.Op != Op386MOVBloadidx1 { 9604 break 9605 } 9606 i0 := x0.AuxInt 9607 if x0.Aux != s { 9608 break 9609 } 9610 _ = x0.Args[2] 9611 if p != x0.Args[0] { 9612 break 9613 } 9614 if idx != x0.Args[1] { 9615 break 9616 } 9617 if mem != x0.Args[2] { 9618 break 9619 } 9620 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9621 break 9622 } 9623 b = mergePoint(b, x0, x1) 9624 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9625 v.reset(OpCopy) 9626 v.AddArg(v0) 9627 v0.AuxInt = i0 9628 v0.Aux = s 9629 v0.AddArg(p) 9630 v0.AddArg(idx) 9631 v0.AddArg(mem) 9632 return true 9633 } 9634 return false 9635 } 9636 func rewriteValue386_Op386ORL_20(v *Value) bool { 9637 b := v.Block 9638 _ = b 9639 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 9640 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9641 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9642 for { 9643 _ = v.Args[1] 9644 s0 := v.Args[0] 9645 if s0.Op != Op386SHLLconst { 9646 break 9647 } 9648 if s0.AuxInt != 8 { 9649 break 9650 } 9651 x1 := s0.Args[0] 9652 if x1.Op != Op386MOVBloadidx1 { 9653 break 9654 } 9655 i1 := x1.AuxInt 9656 s := x1.Aux 9657 _ = x1.Args[2] 9658 idx := x1.Args[0] 9659 p := x1.Args[1] 9660 mem := x1.Args[2] 9661 x0 := v.Args[1] 9662 if x0.Op != Op386MOVBloadidx1 { 9663 break 9664 } 9665 i0 := x0.AuxInt 9666 if x0.Aux != s { 9667 break 9668 } 9669 _ = x0.Args[2] 9670 if p != x0.Args[0] { 9671 break 9672 } 9673 if idx != x0.Args[1] { 9674 break 9675 } 9676 if mem != x0.Args[2] { 9677 break 9678 } 9679 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9680 break 9681 } 9682 b = mergePoint(b, x0, x1) 9683 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9684 v.reset(OpCopy) 9685 v.AddArg(v0) 9686 v0.AuxInt = i0 9687 v0.Aux = s 9688 v0.AddArg(p) 9689 v0.AddArg(idx) 9690 v0.AddArg(mem) 9691 return true 9692 } 9693 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9694 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9695 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9696 for { 9697 _ = v.Args[1] 9698 s0 := v.Args[0] 9699 if s0.Op != Op386SHLLconst { 9700 break 9701 } 9702 if s0.AuxInt != 8 { 9703 break 9704 } 9705 x1 := s0.Args[0] 9706 if x1.Op != Op386MOVBloadidx1 { 9707 break 9708 } 9709 i1 := x1.AuxInt 9710 s := x1.Aux 9711 _ = x1.Args[2] 9712 p := x1.Args[0] 9713 idx := x1.Args[1] 9714 mem := x1.Args[2] 9715 x0 := v.Args[1] 9716 if x0.Op != Op386MOVBloadidx1 { 9717 break 9718 } 9719 i0 := x0.AuxInt 9720 if x0.Aux != s { 9721 break 9722 } 9723 _ = x0.Args[2] 9724 if idx != x0.Args[0] { 9725 break 9726 } 9727 if p != x0.Args[1] { 9728 break 9729 } 9730 if mem != x0.Args[2] { 9731 break 9732 } 9733 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9734 break 9735 } 9736 b = mergePoint(b, x0, x1) 9737 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9738 v.reset(OpCopy) 9739 v.AddArg(v0) 9740 v0.AuxInt = i0 9741 v0.Aux = s 9742 v0.AddArg(p) 9743 v0.AddArg(idx) 9744 v0.AddArg(mem) 9745 return true 9746 } 9747 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 9748 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 9749 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 9750 for { 9751 _ = v.Args[1] 9752 s0 := v.Args[0] 9753 if s0.Op != Op386SHLLconst { 9754 break 9755 } 9756 if s0.AuxInt != 8 { 9757 break 9758 } 9759 x1 := s0.Args[0] 9760 if x1.Op != Op386MOVBloadidx1 { 9761 break 9762 } 9763 i1 := x1.AuxInt 9764 s := x1.Aux 9765 _ = x1.Args[2] 9766 idx := x1.Args[0] 9767 p := x1.Args[1] 9768 mem := x1.Args[2] 9769 x0 := v.Args[1] 9770 if x0.Op != Op386MOVBloadidx1 { 9771 break 9772 } 9773 i0 := x0.AuxInt 9774 if x0.Aux != s { 9775 break 9776 } 9777 _ = x0.Args[2] 9778 if idx != x0.Args[0] { 9779 break 9780 } 9781 if p != x0.Args[1] { 9782 break 9783 } 9784 if mem != x0.Args[2] { 9785 break 9786 } 9787 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 9788 break 9789 } 9790 b = mergePoint(b, x0, x1) 9791 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 9792 v.reset(OpCopy) 9793 v.AddArg(v0) 9794 v0.AuxInt = i0 9795 v0.Aux = s 9796 v0.AddArg(p) 9797 v0.AddArg(idx) 9798 v0.AddArg(mem) 9799 return true 9800 } 9801 // 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))) 9802 // 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) 9803 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9804 for { 9805 _ = v.Args[1] 9806 o0 := v.Args[0] 9807 if o0.Op != Op386ORL { 9808 break 9809 } 9810 _ = o0.Args[1] 9811 x0 := o0.Args[0] 9812 if x0.Op != Op386MOVWloadidx1 { 9813 break 9814 } 9815 i0 := x0.AuxInt 9816 s := x0.Aux 9817 _ = x0.Args[2] 9818 p := x0.Args[0] 9819 idx := x0.Args[1] 9820 mem := x0.Args[2] 9821 s0 := o0.Args[1] 9822 if s0.Op != Op386SHLLconst { 9823 break 9824 } 9825 if s0.AuxInt != 16 { 9826 break 9827 } 9828 x1 := s0.Args[0] 9829 if x1.Op != Op386MOVBloadidx1 { 9830 break 9831 } 9832 i2 := x1.AuxInt 9833 if x1.Aux != s { 9834 break 9835 } 9836 _ = x1.Args[2] 9837 if p != x1.Args[0] { 9838 break 9839 } 9840 if idx != x1.Args[1] { 9841 break 9842 } 9843 if mem != x1.Args[2] { 9844 break 9845 } 9846 s1 := v.Args[1] 9847 if s1.Op != Op386SHLLconst { 9848 break 9849 } 9850 if s1.AuxInt != 24 { 9851 break 9852 } 9853 x2 := s1.Args[0] 9854 if x2.Op != Op386MOVBloadidx1 { 9855 break 9856 } 9857 i3 := x2.AuxInt 9858 if x2.Aux != s { 9859 break 9860 } 9861 _ = x2.Args[2] 9862 if p != x2.Args[0] { 9863 break 9864 } 9865 if idx != x2.Args[1] { 9866 break 9867 } 9868 if mem != x2.Args[2] { 9869 break 9870 } 9871 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)) { 9872 break 9873 } 9874 b = mergePoint(b, x0, x1, x2) 9875 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9876 v.reset(OpCopy) 9877 v.AddArg(v0) 9878 v0.AuxInt = i0 9879 v0.Aux = s 9880 v0.AddArg(p) 9881 v0.AddArg(idx) 9882 v0.AddArg(mem) 9883 return true 9884 } 9885 // 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))) 9886 // 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) 9887 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9888 for { 9889 _ = v.Args[1] 9890 o0 := v.Args[0] 9891 if o0.Op != Op386ORL { 9892 break 9893 } 9894 _ = o0.Args[1] 9895 x0 := o0.Args[0] 9896 if x0.Op != Op386MOVWloadidx1 { 9897 break 9898 } 9899 i0 := x0.AuxInt 9900 s := x0.Aux 9901 _ = x0.Args[2] 9902 idx := x0.Args[0] 9903 p := x0.Args[1] 9904 mem := x0.Args[2] 9905 s0 := o0.Args[1] 9906 if s0.Op != Op386SHLLconst { 9907 break 9908 } 9909 if s0.AuxInt != 16 { 9910 break 9911 } 9912 x1 := s0.Args[0] 9913 if x1.Op != Op386MOVBloadidx1 { 9914 break 9915 } 9916 i2 := x1.AuxInt 9917 if x1.Aux != s { 9918 break 9919 } 9920 _ = x1.Args[2] 9921 if p != x1.Args[0] { 9922 break 9923 } 9924 if idx != x1.Args[1] { 9925 break 9926 } 9927 if mem != x1.Args[2] { 9928 break 9929 } 9930 s1 := v.Args[1] 9931 if s1.Op != Op386SHLLconst { 9932 break 9933 } 9934 if s1.AuxInt != 24 { 9935 break 9936 } 9937 x2 := s1.Args[0] 9938 if x2.Op != Op386MOVBloadidx1 { 9939 break 9940 } 9941 i3 := x2.AuxInt 9942 if x2.Aux != s { 9943 break 9944 } 9945 _ = x2.Args[2] 9946 if p != x2.Args[0] { 9947 break 9948 } 9949 if idx != x2.Args[1] { 9950 break 9951 } 9952 if mem != x2.Args[2] { 9953 break 9954 } 9955 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)) { 9956 break 9957 } 9958 b = mergePoint(b, x0, x1, x2) 9959 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 9960 v.reset(OpCopy) 9961 v.AddArg(v0) 9962 v0.AuxInt = i0 9963 v0.Aux = s 9964 v0.AddArg(p) 9965 v0.AddArg(idx) 9966 v0.AddArg(mem) 9967 return true 9968 } 9969 // 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))) 9970 // 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) 9971 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 9972 for { 9973 _ = v.Args[1] 9974 o0 := v.Args[0] 9975 if o0.Op != Op386ORL { 9976 break 9977 } 9978 _ = o0.Args[1] 9979 x0 := o0.Args[0] 9980 if x0.Op != Op386MOVWloadidx1 { 9981 break 9982 } 9983 i0 := x0.AuxInt 9984 s := x0.Aux 9985 _ = x0.Args[2] 9986 p := x0.Args[0] 9987 idx := x0.Args[1] 9988 mem := x0.Args[2] 9989 s0 := o0.Args[1] 9990 if s0.Op != Op386SHLLconst { 9991 break 9992 } 9993 if s0.AuxInt != 16 { 9994 break 9995 } 9996 x1 := s0.Args[0] 9997 if x1.Op != Op386MOVBloadidx1 { 9998 break 9999 } 10000 i2 := x1.AuxInt 10001 if x1.Aux != s { 10002 break 10003 } 10004 _ = x1.Args[2] 10005 if idx != x1.Args[0] { 10006 break 10007 } 10008 if p != x1.Args[1] { 10009 break 10010 } 10011 if mem != x1.Args[2] { 10012 break 10013 } 10014 s1 := v.Args[1] 10015 if s1.Op != Op386SHLLconst { 10016 break 10017 } 10018 if s1.AuxInt != 24 { 10019 break 10020 } 10021 x2 := s1.Args[0] 10022 if x2.Op != Op386MOVBloadidx1 { 10023 break 10024 } 10025 i3 := x2.AuxInt 10026 if x2.Aux != s { 10027 break 10028 } 10029 _ = x2.Args[2] 10030 if p != x2.Args[0] { 10031 break 10032 } 10033 if idx != x2.Args[1] { 10034 break 10035 } 10036 if mem != x2.Args[2] { 10037 break 10038 } 10039 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)) { 10040 break 10041 } 10042 b = mergePoint(b, x0, x1, x2) 10043 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10044 v.reset(OpCopy) 10045 v.AddArg(v0) 10046 v0.AuxInt = i0 10047 v0.Aux = s 10048 v0.AddArg(p) 10049 v0.AddArg(idx) 10050 v0.AddArg(mem) 10051 return true 10052 } 10053 // 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))) 10054 // 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) 10055 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10056 for { 10057 _ = v.Args[1] 10058 o0 := v.Args[0] 10059 if o0.Op != Op386ORL { 10060 break 10061 } 10062 _ = o0.Args[1] 10063 x0 := o0.Args[0] 10064 if x0.Op != Op386MOVWloadidx1 { 10065 break 10066 } 10067 i0 := x0.AuxInt 10068 s := x0.Aux 10069 _ = x0.Args[2] 10070 idx := x0.Args[0] 10071 p := x0.Args[1] 10072 mem := x0.Args[2] 10073 s0 := o0.Args[1] 10074 if s0.Op != Op386SHLLconst { 10075 break 10076 } 10077 if s0.AuxInt != 16 { 10078 break 10079 } 10080 x1 := s0.Args[0] 10081 if x1.Op != Op386MOVBloadidx1 { 10082 break 10083 } 10084 i2 := x1.AuxInt 10085 if x1.Aux != s { 10086 break 10087 } 10088 _ = x1.Args[2] 10089 if idx != x1.Args[0] { 10090 break 10091 } 10092 if p != x1.Args[1] { 10093 break 10094 } 10095 if mem != x1.Args[2] { 10096 break 10097 } 10098 s1 := v.Args[1] 10099 if s1.Op != Op386SHLLconst { 10100 break 10101 } 10102 if s1.AuxInt != 24 { 10103 break 10104 } 10105 x2 := s1.Args[0] 10106 if x2.Op != Op386MOVBloadidx1 { 10107 break 10108 } 10109 i3 := x2.AuxInt 10110 if x2.Aux != s { 10111 break 10112 } 10113 _ = x2.Args[2] 10114 if p != x2.Args[0] { 10115 break 10116 } 10117 if idx != x2.Args[1] { 10118 break 10119 } 10120 if mem != x2.Args[2] { 10121 break 10122 } 10123 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)) { 10124 break 10125 } 10126 b = mergePoint(b, x0, x1, x2) 10127 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10128 v.reset(OpCopy) 10129 v.AddArg(v0) 10130 v0.AuxInt = i0 10131 v0.Aux = s 10132 v0.AddArg(p) 10133 v0.AddArg(idx) 10134 v0.AddArg(mem) 10135 return true 10136 } 10137 // 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))) 10138 // 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) 10139 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10140 for { 10141 _ = v.Args[1] 10142 o0 := v.Args[0] 10143 if o0.Op != Op386ORL { 10144 break 10145 } 10146 _ = o0.Args[1] 10147 s0 := o0.Args[0] 10148 if s0.Op != Op386SHLLconst { 10149 break 10150 } 10151 if s0.AuxInt != 16 { 10152 break 10153 } 10154 x1 := s0.Args[0] 10155 if x1.Op != Op386MOVBloadidx1 { 10156 break 10157 } 10158 i2 := x1.AuxInt 10159 s := x1.Aux 10160 _ = x1.Args[2] 10161 p := x1.Args[0] 10162 idx := x1.Args[1] 10163 mem := x1.Args[2] 10164 x0 := o0.Args[1] 10165 if x0.Op != Op386MOVWloadidx1 { 10166 break 10167 } 10168 i0 := x0.AuxInt 10169 if x0.Aux != s { 10170 break 10171 } 10172 _ = x0.Args[2] 10173 if p != x0.Args[0] { 10174 break 10175 } 10176 if idx != x0.Args[1] { 10177 break 10178 } 10179 if mem != x0.Args[2] { 10180 break 10181 } 10182 s1 := v.Args[1] 10183 if s1.Op != Op386SHLLconst { 10184 break 10185 } 10186 if s1.AuxInt != 24 { 10187 break 10188 } 10189 x2 := s1.Args[0] 10190 if x2.Op != Op386MOVBloadidx1 { 10191 break 10192 } 10193 i3 := x2.AuxInt 10194 if x2.Aux != s { 10195 break 10196 } 10197 _ = x2.Args[2] 10198 if p != x2.Args[0] { 10199 break 10200 } 10201 if idx != x2.Args[1] { 10202 break 10203 } 10204 if mem != x2.Args[2] { 10205 break 10206 } 10207 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)) { 10208 break 10209 } 10210 b = mergePoint(b, x0, x1, x2) 10211 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10212 v.reset(OpCopy) 10213 v.AddArg(v0) 10214 v0.AuxInt = i0 10215 v0.Aux = s 10216 v0.AddArg(p) 10217 v0.AddArg(idx) 10218 v0.AddArg(mem) 10219 return true 10220 } 10221 // 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))) 10222 // 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) 10223 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10224 for { 10225 _ = v.Args[1] 10226 o0 := v.Args[0] 10227 if o0.Op != Op386ORL { 10228 break 10229 } 10230 _ = o0.Args[1] 10231 s0 := o0.Args[0] 10232 if s0.Op != Op386SHLLconst { 10233 break 10234 } 10235 if s0.AuxInt != 16 { 10236 break 10237 } 10238 x1 := s0.Args[0] 10239 if x1.Op != Op386MOVBloadidx1 { 10240 break 10241 } 10242 i2 := x1.AuxInt 10243 s := x1.Aux 10244 _ = x1.Args[2] 10245 idx := x1.Args[0] 10246 p := x1.Args[1] 10247 mem := x1.Args[2] 10248 x0 := o0.Args[1] 10249 if x0.Op != Op386MOVWloadidx1 { 10250 break 10251 } 10252 i0 := x0.AuxInt 10253 if x0.Aux != s { 10254 break 10255 } 10256 _ = x0.Args[2] 10257 if p != x0.Args[0] { 10258 break 10259 } 10260 if idx != x0.Args[1] { 10261 break 10262 } 10263 if mem != x0.Args[2] { 10264 break 10265 } 10266 s1 := v.Args[1] 10267 if s1.Op != Op386SHLLconst { 10268 break 10269 } 10270 if s1.AuxInt != 24 { 10271 break 10272 } 10273 x2 := s1.Args[0] 10274 if x2.Op != Op386MOVBloadidx1 { 10275 break 10276 } 10277 i3 := x2.AuxInt 10278 if x2.Aux != s { 10279 break 10280 } 10281 _ = x2.Args[2] 10282 if p != x2.Args[0] { 10283 break 10284 } 10285 if idx != x2.Args[1] { 10286 break 10287 } 10288 if mem != x2.Args[2] { 10289 break 10290 } 10291 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)) { 10292 break 10293 } 10294 b = mergePoint(b, x0, x1, x2) 10295 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10296 v.reset(OpCopy) 10297 v.AddArg(v0) 10298 v0.AuxInt = i0 10299 v0.Aux = s 10300 v0.AddArg(p) 10301 v0.AddArg(idx) 10302 v0.AddArg(mem) 10303 return true 10304 } 10305 // 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))) 10306 // 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) 10307 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10308 for { 10309 _ = v.Args[1] 10310 o0 := v.Args[0] 10311 if o0.Op != Op386ORL { 10312 break 10313 } 10314 _ = o0.Args[1] 10315 s0 := o0.Args[0] 10316 if s0.Op != Op386SHLLconst { 10317 break 10318 } 10319 if s0.AuxInt != 16 { 10320 break 10321 } 10322 x1 := s0.Args[0] 10323 if x1.Op != Op386MOVBloadidx1 { 10324 break 10325 } 10326 i2 := x1.AuxInt 10327 s := x1.Aux 10328 _ = x1.Args[2] 10329 p := x1.Args[0] 10330 idx := x1.Args[1] 10331 mem := x1.Args[2] 10332 x0 := o0.Args[1] 10333 if x0.Op != Op386MOVWloadidx1 { 10334 break 10335 } 10336 i0 := x0.AuxInt 10337 if x0.Aux != s { 10338 break 10339 } 10340 _ = x0.Args[2] 10341 if idx != x0.Args[0] { 10342 break 10343 } 10344 if p != x0.Args[1] { 10345 break 10346 } 10347 if mem != x0.Args[2] { 10348 break 10349 } 10350 s1 := v.Args[1] 10351 if s1.Op != Op386SHLLconst { 10352 break 10353 } 10354 if s1.AuxInt != 24 { 10355 break 10356 } 10357 x2 := s1.Args[0] 10358 if x2.Op != Op386MOVBloadidx1 { 10359 break 10360 } 10361 i3 := x2.AuxInt 10362 if x2.Aux != s { 10363 break 10364 } 10365 _ = x2.Args[2] 10366 if p != x2.Args[0] { 10367 break 10368 } 10369 if idx != x2.Args[1] { 10370 break 10371 } 10372 if mem != x2.Args[2] { 10373 break 10374 } 10375 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)) { 10376 break 10377 } 10378 b = mergePoint(b, x0, x1, x2) 10379 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10380 v.reset(OpCopy) 10381 v.AddArg(v0) 10382 v0.AuxInt = i0 10383 v0.Aux = s 10384 v0.AddArg(p) 10385 v0.AddArg(idx) 10386 v0.AddArg(mem) 10387 return true 10388 } 10389 return false 10390 } 10391 func rewriteValue386_Op386ORL_30(v *Value) bool { 10392 b := v.Block 10393 _ = b 10394 // 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))) 10395 // 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) 10396 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10397 for { 10398 _ = v.Args[1] 10399 o0 := v.Args[0] 10400 if o0.Op != Op386ORL { 10401 break 10402 } 10403 _ = o0.Args[1] 10404 s0 := o0.Args[0] 10405 if s0.Op != Op386SHLLconst { 10406 break 10407 } 10408 if s0.AuxInt != 16 { 10409 break 10410 } 10411 x1 := s0.Args[0] 10412 if x1.Op != Op386MOVBloadidx1 { 10413 break 10414 } 10415 i2 := x1.AuxInt 10416 s := x1.Aux 10417 _ = x1.Args[2] 10418 idx := x1.Args[0] 10419 p := x1.Args[1] 10420 mem := x1.Args[2] 10421 x0 := o0.Args[1] 10422 if x0.Op != Op386MOVWloadidx1 { 10423 break 10424 } 10425 i0 := x0.AuxInt 10426 if x0.Aux != s { 10427 break 10428 } 10429 _ = x0.Args[2] 10430 if idx != x0.Args[0] { 10431 break 10432 } 10433 if p != x0.Args[1] { 10434 break 10435 } 10436 if mem != x0.Args[2] { 10437 break 10438 } 10439 s1 := v.Args[1] 10440 if s1.Op != Op386SHLLconst { 10441 break 10442 } 10443 if s1.AuxInt != 24 { 10444 break 10445 } 10446 x2 := s1.Args[0] 10447 if x2.Op != Op386MOVBloadidx1 { 10448 break 10449 } 10450 i3 := x2.AuxInt 10451 if x2.Aux != s { 10452 break 10453 } 10454 _ = x2.Args[2] 10455 if p != x2.Args[0] { 10456 break 10457 } 10458 if idx != x2.Args[1] { 10459 break 10460 } 10461 if mem != x2.Args[2] { 10462 break 10463 } 10464 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)) { 10465 break 10466 } 10467 b = mergePoint(b, x0, x1, x2) 10468 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10469 v.reset(OpCopy) 10470 v.AddArg(v0) 10471 v0.AuxInt = i0 10472 v0.Aux = s 10473 v0.AddArg(p) 10474 v0.AddArg(idx) 10475 v0.AddArg(mem) 10476 return true 10477 } 10478 // 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))) 10479 // 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) 10480 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10481 for { 10482 _ = v.Args[1] 10483 o0 := v.Args[0] 10484 if o0.Op != Op386ORL { 10485 break 10486 } 10487 _ = o0.Args[1] 10488 x0 := o0.Args[0] 10489 if x0.Op != Op386MOVWloadidx1 { 10490 break 10491 } 10492 i0 := x0.AuxInt 10493 s := x0.Aux 10494 _ = x0.Args[2] 10495 p := x0.Args[0] 10496 idx := x0.Args[1] 10497 mem := x0.Args[2] 10498 s0 := o0.Args[1] 10499 if s0.Op != Op386SHLLconst { 10500 break 10501 } 10502 if s0.AuxInt != 16 { 10503 break 10504 } 10505 x1 := s0.Args[0] 10506 if x1.Op != Op386MOVBloadidx1 { 10507 break 10508 } 10509 i2 := x1.AuxInt 10510 if x1.Aux != s { 10511 break 10512 } 10513 _ = x1.Args[2] 10514 if p != x1.Args[0] { 10515 break 10516 } 10517 if idx != x1.Args[1] { 10518 break 10519 } 10520 if mem != x1.Args[2] { 10521 break 10522 } 10523 s1 := v.Args[1] 10524 if s1.Op != Op386SHLLconst { 10525 break 10526 } 10527 if s1.AuxInt != 24 { 10528 break 10529 } 10530 x2 := s1.Args[0] 10531 if x2.Op != Op386MOVBloadidx1 { 10532 break 10533 } 10534 i3 := x2.AuxInt 10535 if x2.Aux != s { 10536 break 10537 } 10538 _ = x2.Args[2] 10539 if idx != x2.Args[0] { 10540 break 10541 } 10542 if p != x2.Args[1] { 10543 break 10544 } 10545 if mem != x2.Args[2] { 10546 break 10547 } 10548 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)) { 10549 break 10550 } 10551 b = mergePoint(b, x0, x1, x2) 10552 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10553 v.reset(OpCopy) 10554 v.AddArg(v0) 10555 v0.AuxInt = i0 10556 v0.Aux = s 10557 v0.AddArg(p) 10558 v0.AddArg(idx) 10559 v0.AddArg(mem) 10560 return true 10561 } 10562 // 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))) 10563 // 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) 10564 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10565 for { 10566 _ = v.Args[1] 10567 o0 := v.Args[0] 10568 if o0.Op != Op386ORL { 10569 break 10570 } 10571 _ = o0.Args[1] 10572 x0 := o0.Args[0] 10573 if x0.Op != Op386MOVWloadidx1 { 10574 break 10575 } 10576 i0 := x0.AuxInt 10577 s := x0.Aux 10578 _ = x0.Args[2] 10579 idx := x0.Args[0] 10580 p := x0.Args[1] 10581 mem := x0.Args[2] 10582 s0 := o0.Args[1] 10583 if s0.Op != Op386SHLLconst { 10584 break 10585 } 10586 if s0.AuxInt != 16 { 10587 break 10588 } 10589 x1 := s0.Args[0] 10590 if x1.Op != Op386MOVBloadidx1 { 10591 break 10592 } 10593 i2 := x1.AuxInt 10594 if x1.Aux != s { 10595 break 10596 } 10597 _ = x1.Args[2] 10598 if p != x1.Args[0] { 10599 break 10600 } 10601 if idx != x1.Args[1] { 10602 break 10603 } 10604 if mem != x1.Args[2] { 10605 break 10606 } 10607 s1 := v.Args[1] 10608 if s1.Op != Op386SHLLconst { 10609 break 10610 } 10611 if s1.AuxInt != 24 { 10612 break 10613 } 10614 x2 := s1.Args[0] 10615 if x2.Op != Op386MOVBloadidx1 { 10616 break 10617 } 10618 i3 := x2.AuxInt 10619 if x2.Aux != s { 10620 break 10621 } 10622 _ = x2.Args[2] 10623 if idx != x2.Args[0] { 10624 break 10625 } 10626 if p != x2.Args[1] { 10627 break 10628 } 10629 if mem != x2.Args[2] { 10630 break 10631 } 10632 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)) { 10633 break 10634 } 10635 b = mergePoint(b, x0, x1, x2) 10636 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10637 v.reset(OpCopy) 10638 v.AddArg(v0) 10639 v0.AuxInt = i0 10640 v0.Aux = s 10641 v0.AddArg(p) 10642 v0.AddArg(idx) 10643 v0.AddArg(mem) 10644 return true 10645 } 10646 // 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))) 10647 // 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) 10648 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10649 for { 10650 _ = v.Args[1] 10651 o0 := v.Args[0] 10652 if o0.Op != Op386ORL { 10653 break 10654 } 10655 _ = o0.Args[1] 10656 x0 := o0.Args[0] 10657 if x0.Op != Op386MOVWloadidx1 { 10658 break 10659 } 10660 i0 := x0.AuxInt 10661 s := x0.Aux 10662 _ = x0.Args[2] 10663 p := x0.Args[0] 10664 idx := x0.Args[1] 10665 mem := x0.Args[2] 10666 s0 := o0.Args[1] 10667 if s0.Op != Op386SHLLconst { 10668 break 10669 } 10670 if s0.AuxInt != 16 { 10671 break 10672 } 10673 x1 := s0.Args[0] 10674 if x1.Op != Op386MOVBloadidx1 { 10675 break 10676 } 10677 i2 := x1.AuxInt 10678 if x1.Aux != s { 10679 break 10680 } 10681 _ = x1.Args[2] 10682 if idx != x1.Args[0] { 10683 break 10684 } 10685 if p != x1.Args[1] { 10686 break 10687 } 10688 if mem != x1.Args[2] { 10689 break 10690 } 10691 s1 := v.Args[1] 10692 if s1.Op != Op386SHLLconst { 10693 break 10694 } 10695 if s1.AuxInt != 24 { 10696 break 10697 } 10698 x2 := s1.Args[0] 10699 if x2.Op != Op386MOVBloadidx1 { 10700 break 10701 } 10702 i3 := x2.AuxInt 10703 if x2.Aux != s { 10704 break 10705 } 10706 _ = x2.Args[2] 10707 if idx != x2.Args[0] { 10708 break 10709 } 10710 if p != x2.Args[1] { 10711 break 10712 } 10713 if mem != x2.Args[2] { 10714 break 10715 } 10716 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)) { 10717 break 10718 } 10719 b = mergePoint(b, x0, x1, x2) 10720 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10721 v.reset(OpCopy) 10722 v.AddArg(v0) 10723 v0.AuxInt = i0 10724 v0.Aux = s 10725 v0.AddArg(p) 10726 v0.AddArg(idx) 10727 v0.AddArg(mem) 10728 return true 10729 } 10730 // 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))) 10731 // 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) 10732 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10733 for { 10734 _ = v.Args[1] 10735 o0 := v.Args[0] 10736 if o0.Op != Op386ORL { 10737 break 10738 } 10739 _ = o0.Args[1] 10740 x0 := o0.Args[0] 10741 if x0.Op != Op386MOVWloadidx1 { 10742 break 10743 } 10744 i0 := x0.AuxInt 10745 s := x0.Aux 10746 _ = x0.Args[2] 10747 idx := x0.Args[0] 10748 p := x0.Args[1] 10749 mem := x0.Args[2] 10750 s0 := o0.Args[1] 10751 if s0.Op != Op386SHLLconst { 10752 break 10753 } 10754 if s0.AuxInt != 16 { 10755 break 10756 } 10757 x1 := s0.Args[0] 10758 if x1.Op != Op386MOVBloadidx1 { 10759 break 10760 } 10761 i2 := x1.AuxInt 10762 if x1.Aux != s { 10763 break 10764 } 10765 _ = x1.Args[2] 10766 if idx != x1.Args[0] { 10767 break 10768 } 10769 if p != x1.Args[1] { 10770 break 10771 } 10772 if mem != x1.Args[2] { 10773 break 10774 } 10775 s1 := v.Args[1] 10776 if s1.Op != Op386SHLLconst { 10777 break 10778 } 10779 if s1.AuxInt != 24 { 10780 break 10781 } 10782 x2 := s1.Args[0] 10783 if x2.Op != Op386MOVBloadidx1 { 10784 break 10785 } 10786 i3 := x2.AuxInt 10787 if x2.Aux != s { 10788 break 10789 } 10790 _ = x2.Args[2] 10791 if idx != x2.Args[0] { 10792 break 10793 } 10794 if p != x2.Args[1] { 10795 break 10796 } 10797 if mem != x2.Args[2] { 10798 break 10799 } 10800 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)) { 10801 break 10802 } 10803 b = mergePoint(b, x0, x1, x2) 10804 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10805 v.reset(OpCopy) 10806 v.AddArg(v0) 10807 v0.AuxInt = i0 10808 v0.Aux = s 10809 v0.AddArg(p) 10810 v0.AddArg(idx) 10811 v0.AddArg(mem) 10812 return true 10813 } 10814 // 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))) 10815 // 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) 10816 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10817 for { 10818 _ = v.Args[1] 10819 o0 := v.Args[0] 10820 if o0.Op != Op386ORL { 10821 break 10822 } 10823 _ = o0.Args[1] 10824 s0 := o0.Args[0] 10825 if s0.Op != Op386SHLLconst { 10826 break 10827 } 10828 if s0.AuxInt != 16 { 10829 break 10830 } 10831 x1 := s0.Args[0] 10832 if x1.Op != Op386MOVBloadidx1 { 10833 break 10834 } 10835 i2 := x1.AuxInt 10836 s := x1.Aux 10837 _ = x1.Args[2] 10838 p := x1.Args[0] 10839 idx := x1.Args[1] 10840 mem := x1.Args[2] 10841 x0 := o0.Args[1] 10842 if x0.Op != Op386MOVWloadidx1 { 10843 break 10844 } 10845 i0 := x0.AuxInt 10846 if x0.Aux != s { 10847 break 10848 } 10849 _ = x0.Args[2] 10850 if p != x0.Args[0] { 10851 break 10852 } 10853 if idx != x0.Args[1] { 10854 break 10855 } 10856 if mem != x0.Args[2] { 10857 break 10858 } 10859 s1 := v.Args[1] 10860 if s1.Op != Op386SHLLconst { 10861 break 10862 } 10863 if s1.AuxInt != 24 { 10864 break 10865 } 10866 x2 := s1.Args[0] 10867 if x2.Op != Op386MOVBloadidx1 { 10868 break 10869 } 10870 i3 := x2.AuxInt 10871 if x2.Aux != s { 10872 break 10873 } 10874 _ = x2.Args[2] 10875 if idx != x2.Args[0] { 10876 break 10877 } 10878 if p != x2.Args[1] { 10879 break 10880 } 10881 if mem != x2.Args[2] { 10882 break 10883 } 10884 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)) { 10885 break 10886 } 10887 b = mergePoint(b, x0, x1, x2) 10888 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10889 v.reset(OpCopy) 10890 v.AddArg(v0) 10891 v0.AuxInt = i0 10892 v0.Aux = s 10893 v0.AddArg(p) 10894 v0.AddArg(idx) 10895 v0.AddArg(mem) 10896 return true 10897 } 10898 // 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))) 10899 // 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) 10900 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10901 for { 10902 _ = v.Args[1] 10903 o0 := v.Args[0] 10904 if o0.Op != Op386ORL { 10905 break 10906 } 10907 _ = o0.Args[1] 10908 s0 := o0.Args[0] 10909 if s0.Op != Op386SHLLconst { 10910 break 10911 } 10912 if s0.AuxInt != 16 { 10913 break 10914 } 10915 x1 := s0.Args[0] 10916 if x1.Op != Op386MOVBloadidx1 { 10917 break 10918 } 10919 i2 := x1.AuxInt 10920 s := x1.Aux 10921 _ = x1.Args[2] 10922 idx := x1.Args[0] 10923 p := x1.Args[1] 10924 mem := x1.Args[2] 10925 x0 := o0.Args[1] 10926 if x0.Op != Op386MOVWloadidx1 { 10927 break 10928 } 10929 i0 := x0.AuxInt 10930 if x0.Aux != s { 10931 break 10932 } 10933 _ = x0.Args[2] 10934 if p != x0.Args[0] { 10935 break 10936 } 10937 if idx != x0.Args[1] { 10938 break 10939 } 10940 if mem != x0.Args[2] { 10941 break 10942 } 10943 s1 := v.Args[1] 10944 if s1.Op != Op386SHLLconst { 10945 break 10946 } 10947 if s1.AuxInt != 24 { 10948 break 10949 } 10950 x2 := s1.Args[0] 10951 if x2.Op != Op386MOVBloadidx1 { 10952 break 10953 } 10954 i3 := x2.AuxInt 10955 if x2.Aux != s { 10956 break 10957 } 10958 _ = x2.Args[2] 10959 if idx != x2.Args[0] { 10960 break 10961 } 10962 if p != x2.Args[1] { 10963 break 10964 } 10965 if mem != x2.Args[2] { 10966 break 10967 } 10968 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)) { 10969 break 10970 } 10971 b = mergePoint(b, x0, x1, x2) 10972 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 10973 v.reset(OpCopy) 10974 v.AddArg(v0) 10975 v0.AuxInt = i0 10976 v0.Aux = s 10977 v0.AddArg(p) 10978 v0.AddArg(idx) 10979 v0.AddArg(mem) 10980 return true 10981 } 10982 // 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))) 10983 // 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) 10984 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 10985 for { 10986 _ = v.Args[1] 10987 o0 := v.Args[0] 10988 if o0.Op != Op386ORL { 10989 break 10990 } 10991 _ = o0.Args[1] 10992 s0 := o0.Args[0] 10993 if s0.Op != Op386SHLLconst { 10994 break 10995 } 10996 if s0.AuxInt != 16 { 10997 break 10998 } 10999 x1 := s0.Args[0] 11000 if x1.Op != Op386MOVBloadidx1 { 11001 break 11002 } 11003 i2 := x1.AuxInt 11004 s := x1.Aux 11005 _ = x1.Args[2] 11006 p := x1.Args[0] 11007 idx := x1.Args[1] 11008 mem := x1.Args[2] 11009 x0 := o0.Args[1] 11010 if x0.Op != Op386MOVWloadidx1 { 11011 break 11012 } 11013 i0 := x0.AuxInt 11014 if x0.Aux != s { 11015 break 11016 } 11017 _ = x0.Args[2] 11018 if idx != x0.Args[0] { 11019 break 11020 } 11021 if p != x0.Args[1] { 11022 break 11023 } 11024 if mem != x0.Args[2] { 11025 break 11026 } 11027 s1 := v.Args[1] 11028 if s1.Op != Op386SHLLconst { 11029 break 11030 } 11031 if s1.AuxInt != 24 { 11032 break 11033 } 11034 x2 := s1.Args[0] 11035 if x2.Op != Op386MOVBloadidx1 { 11036 break 11037 } 11038 i3 := x2.AuxInt 11039 if x2.Aux != s { 11040 break 11041 } 11042 _ = x2.Args[2] 11043 if idx != x2.Args[0] { 11044 break 11045 } 11046 if p != x2.Args[1] { 11047 break 11048 } 11049 if mem != x2.Args[2] { 11050 break 11051 } 11052 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)) { 11053 break 11054 } 11055 b = mergePoint(b, x0, x1, x2) 11056 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11057 v.reset(OpCopy) 11058 v.AddArg(v0) 11059 v0.AuxInt = i0 11060 v0.Aux = s 11061 v0.AddArg(p) 11062 v0.AddArg(idx) 11063 v0.AddArg(mem) 11064 return true 11065 } 11066 // 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))) 11067 // 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) 11068 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11069 for { 11070 _ = v.Args[1] 11071 o0 := v.Args[0] 11072 if o0.Op != Op386ORL { 11073 break 11074 } 11075 _ = o0.Args[1] 11076 s0 := o0.Args[0] 11077 if s0.Op != Op386SHLLconst { 11078 break 11079 } 11080 if s0.AuxInt != 16 { 11081 break 11082 } 11083 x1 := s0.Args[0] 11084 if x1.Op != Op386MOVBloadidx1 { 11085 break 11086 } 11087 i2 := x1.AuxInt 11088 s := x1.Aux 11089 _ = x1.Args[2] 11090 idx := x1.Args[0] 11091 p := x1.Args[1] 11092 mem := x1.Args[2] 11093 x0 := o0.Args[1] 11094 if x0.Op != Op386MOVWloadidx1 { 11095 break 11096 } 11097 i0 := x0.AuxInt 11098 if x0.Aux != s { 11099 break 11100 } 11101 _ = x0.Args[2] 11102 if idx != x0.Args[0] { 11103 break 11104 } 11105 if p != x0.Args[1] { 11106 break 11107 } 11108 if mem != x0.Args[2] { 11109 break 11110 } 11111 s1 := v.Args[1] 11112 if s1.Op != Op386SHLLconst { 11113 break 11114 } 11115 if s1.AuxInt != 24 { 11116 break 11117 } 11118 x2 := s1.Args[0] 11119 if x2.Op != Op386MOVBloadidx1 { 11120 break 11121 } 11122 i3 := x2.AuxInt 11123 if x2.Aux != s { 11124 break 11125 } 11126 _ = x2.Args[2] 11127 if idx != x2.Args[0] { 11128 break 11129 } 11130 if p != x2.Args[1] { 11131 break 11132 } 11133 if mem != x2.Args[2] { 11134 break 11135 } 11136 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)) { 11137 break 11138 } 11139 b = mergePoint(b, x0, x1, x2) 11140 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11141 v.reset(OpCopy) 11142 v.AddArg(v0) 11143 v0.AuxInt = i0 11144 v0.Aux = s 11145 v0.AddArg(p) 11146 v0.AddArg(idx) 11147 v0.AddArg(mem) 11148 return true 11149 } 11150 // 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)))) 11151 // 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) 11152 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11153 for { 11154 _ = v.Args[1] 11155 s1 := v.Args[0] 11156 if s1.Op != Op386SHLLconst { 11157 break 11158 } 11159 if s1.AuxInt != 24 { 11160 break 11161 } 11162 x2 := s1.Args[0] 11163 if x2.Op != Op386MOVBloadidx1 { 11164 break 11165 } 11166 i3 := x2.AuxInt 11167 s := x2.Aux 11168 _ = x2.Args[2] 11169 p := x2.Args[0] 11170 idx := x2.Args[1] 11171 mem := x2.Args[2] 11172 o0 := v.Args[1] 11173 if o0.Op != Op386ORL { 11174 break 11175 } 11176 _ = o0.Args[1] 11177 x0 := o0.Args[0] 11178 if x0.Op != Op386MOVWloadidx1 { 11179 break 11180 } 11181 i0 := x0.AuxInt 11182 if x0.Aux != s { 11183 break 11184 } 11185 _ = x0.Args[2] 11186 if p != x0.Args[0] { 11187 break 11188 } 11189 if idx != x0.Args[1] { 11190 break 11191 } 11192 if mem != x0.Args[2] { 11193 break 11194 } 11195 s0 := o0.Args[1] 11196 if s0.Op != Op386SHLLconst { 11197 break 11198 } 11199 if s0.AuxInt != 16 { 11200 break 11201 } 11202 x1 := s0.Args[0] 11203 if x1.Op != Op386MOVBloadidx1 { 11204 break 11205 } 11206 i2 := x1.AuxInt 11207 if x1.Aux != s { 11208 break 11209 } 11210 _ = x1.Args[2] 11211 if p != x1.Args[0] { 11212 break 11213 } 11214 if idx != x1.Args[1] { 11215 break 11216 } 11217 if mem != x1.Args[2] { 11218 break 11219 } 11220 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)) { 11221 break 11222 } 11223 b = mergePoint(b, x0, x1, x2) 11224 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11225 v.reset(OpCopy) 11226 v.AddArg(v0) 11227 v0.AuxInt = i0 11228 v0.Aux = s 11229 v0.AddArg(p) 11230 v0.AddArg(idx) 11231 v0.AddArg(mem) 11232 return true 11233 } 11234 return false 11235 } 11236 func rewriteValue386_Op386ORL_40(v *Value) bool { 11237 b := v.Block 11238 _ = b 11239 // 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)))) 11240 // 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) 11241 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11242 for { 11243 _ = v.Args[1] 11244 s1 := v.Args[0] 11245 if s1.Op != Op386SHLLconst { 11246 break 11247 } 11248 if s1.AuxInt != 24 { 11249 break 11250 } 11251 x2 := s1.Args[0] 11252 if x2.Op != Op386MOVBloadidx1 { 11253 break 11254 } 11255 i3 := x2.AuxInt 11256 s := x2.Aux 11257 _ = x2.Args[2] 11258 idx := x2.Args[0] 11259 p := x2.Args[1] 11260 mem := x2.Args[2] 11261 o0 := v.Args[1] 11262 if o0.Op != Op386ORL { 11263 break 11264 } 11265 _ = o0.Args[1] 11266 x0 := o0.Args[0] 11267 if x0.Op != Op386MOVWloadidx1 { 11268 break 11269 } 11270 i0 := x0.AuxInt 11271 if x0.Aux != s { 11272 break 11273 } 11274 _ = x0.Args[2] 11275 if p != x0.Args[0] { 11276 break 11277 } 11278 if idx != x0.Args[1] { 11279 break 11280 } 11281 if mem != x0.Args[2] { 11282 break 11283 } 11284 s0 := o0.Args[1] 11285 if s0.Op != Op386SHLLconst { 11286 break 11287 } 11288 if s0.AuxInt != 16 { 11289 break 11290 } 11291 x1 := s0.Args[0] 11292 if x1.Op != Op386MOVBloadidx1 { 11293 break 11294 } 11295 i2 := x1.AuxInt 11296 if x1.Aux != s { 11297 break 11298 } 11299 _ = x1.Args[2] 11300 if p != x1.Args[0] { 11301 break 11302 } 11303 if idx != x1.Args[1] { 11304 break 11305 } 11306 if mem != x1.Args[2] { 11307 break 11308 } 11309 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)) { 11310 break 11311 } 11312 b = mergePoint(b, x0, x1, x2) 11313 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11314 v.reset(OpCopy) 11315 v.AddArg(v0) 11316 v0.AuxInt = i0 11317 v0.Aux = s 11318 v0.AddArg(p) 11319 v0.AddArg(idx) 11320 v0.AddArg(mem) 11321 return true 11322 } 11323 // 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)))) 11324 // 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) 11325 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11326 for { 11327 _ = v.Args[1] 11328 s1 := v.Args[0] 11329 if s1.Op != Op386SHLLconst { 11330 break 11331 } 11332 if s1.AuxInt != 24 { 11333 break 11334 } 11335 x2 := s1.Args[0] 11336 if x2.Op != Op386MOVBloadidx1 { 11337 break 11338 } 11339 i3 := x2.AuxInt 11340 s := x2.Aux 11341 _ = x2.Args[2] 11342 p := x2.Args[0] 11343 idx := x2.Args[1] 11344 mem := x2.Args[2] 11345 o0 := v.Args[1] 11346 if o0.Op != Op386ORL { 11347 break 11348 } 11349 _ = o0.Args[1] 11350 x0 := o0.Args[0] 11351 if x0.Op != Op386MOVWloadidx1 { 11352 break 11353 } 11354 i0 := x0.AuxInt 11355 if x0.Aux != s { 11356 break 11357 } 11358 _ = x0.Args[2] 11359 if idx != x0.Args[0] { 11360 break 11361 } 11362 if p != x0.Args[1] { 11363 break 11364 } 11365 if mem != x0.Args[2] { 11366 break 11367 } 11368 s0 := o0.Args[1] 11369 if s0.Op != Op386SHLLconst { 11370 break 11371 } 11372 if s0.AuxInt != 16 { 11373 break 11374 } 11375 x1 := s0.Args[0] 11376 if x1.Op != Op386MOVBloadidx1 { 11377 break 11378 } 11379 i2 := x1.AuxInt 11380 if x1.Aux != s { 11381 break 11382 } 11383 _ = x1.Args[2] 11384 if p != x1.Args[0] { 11385 break 11386 } 11387 if idx != x1.Args[1] { 11388 break 11389 } 11390 if mem != x1.Args[2] { 11391 break 11392 } 11393 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)) { 11394 break 11395 } 11396 b = mergePoint(b, x0, x1, x2) 11397 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11398 v.reset(OpCopy) 11399 v.AddArg(v0) 11400 v0.AuxInt = i0 11401 v0.Aux = s 11402 v0.AddArg(p) 11403 v0.AddArg(idx) 11404 v0.AddArg(mem) 11405 return true 11406 } 11407 // 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)))) 11408 // 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) 11409 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11410 for { 11411 _ = v.Args[1] 11412 s1 := v.Args[0] 11413 if s1.Op != Op386SHLLconst { 11414 break 11415 } 11416 if s1.AuxInt != 24 { 11417 break 11418 } 11419 x2 := s1.Args[0] 11420 if x2.Op != Op386MOVBloadidx1 { 11421 break 11422 } 11423 i3 := x2.AuxInt 11424 s := x2.Aux 11425 _ = x2.Args[2] 11426 idx := x2.Args[0] 11427 p := x2.Args[1] 11428 mem := x2.Args[2] 11429 o0 := v.Args[1] 11430 if o0.Op != Op386ORL { 11431 break 11432 } 11433 _ = o0.Args[1] 11434 x0 := o0.Args[0] 11435 if x0.Op != Op386MOVWloadidx1 { 11436 break 11437 } 11438 i0 := x0.AuxInt 11439 if x0.Aux != s { 11440 break 11441 } 11442 _ = x0.Args[2] 11443 if idx != x0.Args[0] { 11444 break 11445 } 11446 if p != x0.Args[1] { 11447 break 11448 } 11449 if mem != x0.Args[2] { 11450 break 11451 } 11452 s0 := o0.Args[1] 11453 if s0.Op != Op386SHLLconst { 11454 break 11455 } 11456 if s0.AuxInt != 16 { 11457 break 11458 } 11459 x1 := s0.Args[0] 11460 if x1.Op != Op386MOVBloadidx1 { 11461 break 11462 } 11463 i2 := x1.AuxInt 11464 if x1.Aux != s { 11465 break 11466 } 11467 _ = x1.Args[2] 11468 if p != x1.Args[0] { 11469 break 11470 } 11471 if idx != x1.Args[1] { 11472 break 11473 } 11474 if mem != x1.Args[2] { 11475 break 11476 } 11477 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)) { 11478 break 11479 } 11480 b = mergePoint(b, x0, x1, x2) 11481 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11482 v.reset(OpCopy) 11483 v.AddArg(v0) 11484 v0.AuxInt = i0 11485 v0.Aux = s 11486 v0.AddArg(p) 11487 v0.AddArg(idx) 11488 v0.AddArg(mem) 11489 return true 11490 } 11491 // 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)))) 11492 // 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) 11493 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11494 for { 11495 _ = v.Args[1] 11496 s1 := v.Args[0] 11497 if s1.Op != Op386SHLLconst { 11498 break 11499 } 11500 if s1.AuxInt != 24 { 11501 break 11502 } 11503 x2 := s1.Args[0] 11504 if x2.Op != Op386MOVBloadidx1 { 11505 break 11506 } 11507 i3 := x2.AuxInt 11508 s := x2.Aux 11509 _ = x2.Args[2] 11510 p := x2.Args[0] 11511 idx := x2.Args[1] 11512 mem := x2.Args[2] 11513 o0 := v.Args[1] 11514 if o0.Op != Op386ORL { 11515 break 11516 } 11517 _ = o0.Args[1] 11518 x0 := o0.Args[0] 11519 if x0.Op != Op386MOVWloadidx1 { 11520 break 11521 } 11522 i0 := x0.AuxInt 11523 if x0.Aux != s { 11524 break 11525 } 11526 _ = x0.Args[2] 11527 if p != x0.Args[0] { 11528 break 11529 } 11530 if idx != x0.Args[1] { 11531 break 11532 } 11533 if mem != x0.Args[2] { 11534 break 11535 } 11536 s0 := o0.Args[1] 11537 if s0.Op != Op386SHLLconst { 11538 break 11539 } 11540 if s0.AuxInt != 16 { 11541 break 11542 } 11543 x1 := s0.Args[0] 11544 if x1.Op != Op386MOVBloadidx1 { 11545 break 11546 } 11547 i2 := x1.AuxInt 11548 if x1.Aux != s { 11549 break 11550 } 11551 _ = x1.Args[2] 11552 if idx != x1.Args[0] { 11553 break 11554 } 11555 if p != x1.Args[1] { 11556 break 11557 } 11558 if mem != x1.Args[2] { 11559 break 11560 } 11561 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)) { 11562 break 11563 } 11564 b = mergePoint(b, x0, x1, x2) 11565 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11566 v.reset(OpCopy) 11567 v.AddArg(v0) 11568 v0.AuxInt = i0 11569 v0.Aux = s 11570 v0.AddArg(p) 11571 v0.AddArg(idx) 11572 v0.AddArg(mem) 11573 return true 11574 } 11575 // 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)))) 11576 // 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) 11577 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11578 for { 11579 _ = v.Args[1] 11580 s1 := v.Args[0] 11581 if s1.Op != Op386SHLLconst { 11582 break 11583 } 11584 if s1.AuxInt != 24 { 11585 break 11586 } 11587 x2 := s1.Args[0] 11588 if x2.Op != Op386MOVBloadidx1 { 11589 break 11590 } 11591 i3 := x2.AuxInt 11592 s := x2.Aux 11593 _ = x2.Args[2] 11594 idx := x2.Args[0] 11595 p := x2.Args[1] 11596 mem := x2.Args[2] 11597 o0 := v.Args[1] 11598 if o0.Op != Op386ORL { 11599 break 11600 } 11601 _ = o0.Args[1] 11602 x0 := o0.Args[0] 11603 if x0.Op != Op386MOVWloadidx1 { 11604 break 11605 } 11606 i0 := x0.AuxInt 11607 if x0.Aux != s { 11608 break 11609 } 11610 _ = x0.Args[2] 11611 if p != x0.Args[0] { 11612 break 11613 } 11614 if idx != x0.Args[1] { 11615 break 11616 } 11617 if mem != x0.Args[2] { 11618 break 11619 } 11620 s0 := o0.Args[1] 11621 if s0.Op != Op386SHLLconst { 11622 break 11623 } 11624 if s0.AuxInt != 16 { 11625 break 11626 } 11627 x1 := s0.Args[0] 11628 if x1.Op != Op386MOVBloadidx1 { 11629 break 11630 } 11631 i2 := x1.AuxInt 11632 if x1.Aux != s { 11633 break 11634 } 11635 _ = x1.Args[2] 11636 if idx != x1.Args[0] { 11637 break 11638 } 11639 if p != x1.Args[1] { 11640 break 11641 } 11642 if mem != x1.Args[2] { 11643 break 11644 } 11645 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)) { 11646 break 11647 } 11648 b = mergePoint(b, x0, x1, x2) 11649 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11650 v.reset(OpCopy) 11651 v.AddArg(v0) 11652 v0.AuxInt = i0 11653 v0.Aux = s 11654 v0.AddArg(p) 11655 v0.AddArg(idx) 11656 v0.AddArg(mem) 11657 return true 11658 } 11659 // 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)))) 11660 // 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) 11661 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11662 for { 11663 _ = v.Args[1] 11664 s1 := v.Args[0] 11665 if s1.Op != Op386SHLLconst { 11666 break 11667 } 11668 if s1.AuxInt != 24 { 11669 break 11670 } 11671 x2 := s1.Args[0] 11672 if x2.Op != Op386MOVBloadidx1 { 11673 break 11674 } 11675 i3 := x2.AuxInt 11676 s := x2.Aux 11677 _ = x2.Args[2] 11678 p := x2.Args[0] 11679 idx := x2.Args[1] 11680 mem := x2.Args[2] 11681 o0 := v.Args[1] 11682 if o0.Op != Op386ORL { 11683 break 11684 } 11685 _ = o0.Args[1] 11686 x0 := o0.Args[0] 11687 if x0.Op != Op386MOVWloadidx1 { 11688 break 11689 } 11690 i0 := x0.AuxInt 11691 if x0.Aux != s { 11692 break 11693 } 11694 _ = x0.Args[2] 11695 if idx != x0.Args[0] { 11696 break 11697 } 11698 if p != x0.Args[1] { 11699 break 11700 } 11701 if mem != x0.Args[2] { 11702 break 11703 } 11704 s0 := o0.Args[1] 11705 if s0.Op != Op386SHLLconst { 11706 break 11707 } 11708 if s0.AuxInt != 16 { 11709 break 11710 } 11711 x1 := s0.Args[0] 11712 if x1.Op != Op386MOVBloadidx1 { 11713 break 11714 } 11715 i2 := x1.AuxInt 11716 if x1.Aux != s { 11717 break 11718 } 11719 _ = x1.Args[2] 11720 if idx != x1.Args[0] { 11721 break 11722 } 11723 if p != x1.Args[1] { 11724 break 11725 } 11726 if mem != x1.Args[2] { 11727 break 11728 } 11729 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)) { 11730 break 11731 } 11732 b = mergePoint(b, x0, x1, x2) 11733 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11734 v.reset(OpCopy) 11735 v.AddArg(v0) 11736 v0.AuxInt = i0 11737 v0.Aux = s 11738 v0.AddArg(p) 11739 v0.AddArg(idx) 11740 v0.AddArg(mem) 11741 return true 11742 } 11743 // 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)))) 11744 // 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) 11745 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11746 for { 11747 _ = v.Args[1] 11748 s1 := v.Args[0] 11749 if s1.Op != Op386SHLLconst { 11750 break 11751 } 11752 if s1.AuxInt != 24 { 11753 break 11754 } 11755 x2 := s1.Args[0] 11756 if x2.Op != Op386MOVBloadidx1 { 11757 break 11758 } 11759 i3 := x2.AuxInt 11760 s := x2.Aux 11761 _ = x2.Args[2] 11762 idx := x2.Args[0] 11763 p := x2.Args[1] 11764 mem := x2.Args[2] 11765 o0 := v.Args[1] 11766 if o0.Op != Op386ORL { 11767 break 11768 } 11769 _ = o0.Args[1] 11770 x0 := o0.Args[0] 11771 if x0.Op != Op386MOVWloadidx1 { 11772 break 11773 } 11774 i0 := x0.AuxInt 11775 if x0.Aux != s { 11776 break 11777 } 11778 _ = x0.Args[2] 11779 if idx != x0.Args[0] { 11780 break 11781 } 11782 if p != x0.Args[1] { 11783 break 11784 } 11785 if mem != x0.Args[2] { 11786 break 11787 } 11788 s0 := o0.Args[1] 11789 if s0.Op != Op386SHLLconst { 11790 break 11791 } 11792 if s0.AuxInt != 16 { 11793 break 11794 } 11795 x1 := s0.Args[0] 11796 if x1.Op != Op386MOVBloadidx1 { 11797 break 11798 } 11799 i2 := x1.AuxInt 11800 if x1.Aux != s { 11801 break 11802 } 11803 _ = x1.Args[2] 11804 if idx != x1.Args[0] { 11805 break 11806 } 11807 if p != x1.Args[1] { 11808 break 11809 } 11810 if mem != x1.Args[2] { 11811 break 11812 } 11813 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)) { 11814 break 11815 } 11816 b = mergePoint(b, x0, x1, x2) 11817 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11818 v.reset(OpCopy) 11819 v.AddArg(v0) 11820 v0.AuxInt = i0 11821 v0.Aux = s 11822 v0.AddArg(p) 11823 v0.AddArg(idx) 11824 v0.AddArg(mem) 11825 return true 11826 } 11827 // 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))) 11828 // 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) 11829 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11830 for { 11831 _ = v.Args[1] 11832 s1 := v.Args[0] 11833 if s1.Op != Op386SHLLconst { 11834 break 11835 } 11836 if s1.AuxInt != 24 { 11837 break 11838 } 11839 x2 := s1.Args[0] 11840 if x2.Op != Op386MOVBloadidx1 { 11841 break 11842 } 11843 i3 := x2.AuxInt 11844 s := x2.Aux 11845 _ = x2.Args[2] 11846 p := x2.Args[0] 11847 idx := x2.Args[1] 11848 mem := x2.Args[2] 11849 o0 := v.Args[1] 11850 if o0.Op != Op386ORL { 11851 break 11852 } 11853 _ = o0.Args[1] 11854 s0 := o0.Args[0] 11855 if s0.Op != Op386SHLLconst { 11856 break 11857 } 11858 if s0.AuxInt != 16 { 11859 break 11860 } 11861 x1 := s0.Args[0] 11862 if x1.Op != Op386MOVBloadidx1 { 11863 break 11864 } 11865 i2 := x1.AuxInt 11866 if x1.Aux != s { 11867 break 11868 } 11869 _ = x1.Args[2] 11870 if p != x1.Args[0] { 11871 break 11872 } 11873 if idx != x1.Args[1] { 11874 break 11875 } 11876 if mem != x1.Args[2] { 11877 break 11878 } 11879 x0 := o0.Args[1] 11880 if x0.Op != Op386MOVWloadidx1 { 11881 break 11882 } 11883 i0 := x0.AuxInt 11884 if x0.Aux != s { 11885 break 11886 } 11887 _ = x0.Args[2] 11888 if p != x0.Args[0] { 11889 break 11890 } 11891 if idx != x0.Args[1] { 11892 break 11893 } 11894 if mem != x0.Args[2] { 11895 break 11896 } 11897 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)) { 11898 break 11899 } 11900 b = mergePoint(b, x0, x1, x2) 11901 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11902 v.reset(OpCopy) 11903 v.AddArg(v0) 11904 v0.AuxInt = i0 11905 v0.Aux = s 11906 v0.AddArg(p) 11907 v0.AddArg(idx) 11908 v0.AddArg(mem) 11909 return true 11910 } 11911 // 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))) 11912 // 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) 11913 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11914 for { 11915 _ = v.Args[1] 11916 s1 := v.Args[0] 11917 if s1.Op != Op386SHLLconst { 11918 break 11919 } 11920 if s1.AuxInt != 24 { 11921 break 11922 } 11923 x2 := s1.Args[0] 11924 if x2.Op != Op386MOVBloadidx1 { 11925 break 11926 } 11927 i3 := x2.AuxInt 11928 s := x2.Aux 11929 _ = x2.Args[2] 11930 idx := x2.Args[0] 11931 p := x2.Args[1] 11932 mem := x2.Args[2] 11933 o0 := v.Args[1] 11934 if o0.Op != Op386ORL { 11935 break 11936 } 11937 _ = o0.Args[1] 11938 s0 := o0.Args[0] 11939 if s0.Op != Op386SHLLconst { 11940 break 11941 } 11942 if s0.AuxInt != 16 { 11943 break 11944 } 11945 x1 := s0.Args[0] 11946 if x1.Op != Op386MOVBloadidx1 { 11947 break 11948 } 11949 i2 := x1.AuxInt 11950 if x1.Aux != s { 11951 break 11952 } 11953 _ = x1.Args[2] 11954 if p != x1.Args[0] { 11955 break 11956 } 11957 if idx != x1.Args[1] { 11958 break 11959 } 11960 if mem != x1.Args[2] { 11961 break 11962 } 11963 x0 := o0.Args[1] 11964 if x0.Op != Op386MOVWloadidx1 { 11965 break 11966 } 11967 i0 := x0.AuxInt 11968 if x0.Aux != s { 11969 break 11970 } 11971 _ = x0.Args[2] 11972 if p != x0.Args[0] { 11973 break 11974 } 11975 if idx != x0.Args[1] { 11976 break 11977 } 11978 if mem != x0.Args[2] { 11979 break 11980 } 11981 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)) { 11982 break 11983 } 11984 b = mergePoint(b, x0, x1, x2) 11985 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 11986 v.reset(OpCopy) 11987 v.AddArg(v0) 11988 v0.AuxInt = i0 11989 v0.Aux = s 11990 v0.AddArg(p) 11991 v0.AddArg(idx) 11992 v0.AddArg(mem) 11993 return true 11994 } 11995 // 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))) 11996 // 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) 11997 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 11998 for { 11999 _ = v.Args[1] 12000 s1 := v.Args[0] 12001 if s1.Op != Op386SHLLconst { 12002 break 12003 } 12004 if s1.AuxInt != 24 { 12005 break 12006 } 12007 x2 := s1.Args[0] 12008 if x2.Op != Op386MOVBloadidx1 { 12009 break 12010 } 12011 i3 := x2.AuxInt 12012 s := x2.Aux 12013 _ = x2.Args[2] 12014 p := x2.Args[0] 12015 idx := x2.Args[1] 12016 mem := x2.Args[2] 12017 o0 := v.Args[1] 12018 if o0.Op != Op386ORL { 12019 break 12020 } 12021 _ = o0.Args[1] 12022 s0 := o0.Args[0] 12023 if s0.Op != Op386SHLLconst { 12024 break 12025 } 12026 if s0.AuxInt != 16 { 12027 break 12028 } 12029 x1 := s0.Args[0] 12030 if x1.Op != Op386MOVBloadidx1 { 12031 break 12032 } 12033 i2 := x1.AuxInt 12034 if x1.Aux != s { 12035 break 12036 } 12037 _ = x1.Args[2] 12038 if idx != x1.Args[0] { 12039 break 12040 } 12041 if p != x1.Args[1] { 12042 break 12043 } 12044 if mem != x1.Args[2] { 12045 break 12046 } 12047 x0 := o0.Args[1] 12048 if x0.Op != Op386MOVWloadidx1 { 12049 break 12050 } 12051 i0 := x0.AuxInt 12052 if x0.Aux != s { 12053 break 12054 } 12055 _ = x0.Args[2] 12056 if p != x0.Args[0] { 12057 break 12058 } 12059 if idx != x0.Args[1] { 12060 break 12061 } 12062 if mem != x0.Args[2] { 12063 break 12064 } 12065 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)) { 12066 break 12067 } 12068 b = mergePoint(b, x0, x1, x2) 12069 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12070 v.reset(OpCopy) 12071 v.AddArg(v0) 12072 v0.AuxInt = i0 12073 v0.Aux = s 12074 v0.AddArg(p) 12075 v0.AddArg(idx) 12076 v0.AddArg(mem) 12077 return true 12078 } 12079 return false 12080 } 12081 func rewriteValue386_Op386ORL_50(v *Value) bool { 12082 b := v.Block 12083 _ = b 12084 // 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))) 12085 // 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) 12086 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12087 for { 12088 _ = v.Args[1] 12089 s1 := v.Args[0] 12090 if s1.Op != Op386SHLLconst { 12091 break 12092 } 12093 if s1.AuxInt != 24 { 12094 break 12095 } 12096 x2 := s1.Args[0] 12097 if x2.Op != Op386MOVBloadidx1 { 12098 break 12099 } 12100 i3 := x2.AuxInt 12101 s := x2.Aux 12102 _ = x2.Args[2] 12103 idx := x2.Args[0] 12104 p := x2.Args[1] 12105 mem := x2.Args[2] 12106 o0 := v.Args[1] 12107 if o0.Op != Op386ORL { 12108 break 12109 } 12110 _ = o0.Args[1] 12111 s0 := o0.Args[0] 12112 if s0.Op != Op386SHLLconst { 12113 break 12114 } 12115 if s0.AuxInt != 16 { 12116 break 12117 } 12118 x1 := s0.Args[0] 12119 if x1.Op != Op386MOVBloadidx1 { 12120 break 12121 } 12122 i2 := x1.AuxInt 12123 if x1.Aux != s { 12124 break 12125 } 12126 _ = x1.Args[2] 12127 if idx != x1.Args[0] { 12128 break 12129 } 12130 if p != x1.Args[1] { 12131 break 12132 } 12133 if mem != x1.Args[2] { 12134 break 12135 } 12136 x0 := o0.Args[1] 12137 if x0.Op != Op386MOVWloadidx1 { 12138 break 12139 } 12140 i0 := x0.AuxInt 12141 if x0.Aux != s { 12142 break 12143 } 12144 _ = x0.Args[2] 12145 if p != x0.Args[0] { 12146 break 12147 } 12148 if idx != x0.Args[1] { 12149 break 12150 } 12151 if mem != x0.Args[2] { 12152 break 12153 } 12154 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)) { 12155 break 12156 } 12157 b = mergePoint(b, x0, x1, x2) 12158 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12159 v.reset(OpCopy) 12160 v.AddArg(v0) 12161 v0.AuxInt = i0 12162 v0.Aux = s 12163 v0.AddArg(p) 12164 v0.AddArg(idx) 12165 v0.AddArg(mem) 12166 return true 12167 } 12168 // 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))) 12169 // 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) 12170 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12171 for { 12172 _ = v.Args[1] 12173 s1 := v.Args[0] 12174 if s1.Op != Op386SHLLconst { 12175 break 12176 } 12177 if s1.AuxInt != 24 { 12178 break 12179 } 12180 x2 := s1.Args[0] 12181 if x2.Op != Op386MOVBloadidx1 { 12182 break 12183 } 12184 i3 := x2.AuxInt 12185 s := x2.Aux 12186 _ = x2.Args[2] 12187 p := x2.Args[0] 12188 idx := x2.Args[1] 12189 mem := x2.Args[2] 12190 o0 := v.Args[1] 12191 if o0.Op != Op386ORL { 12192 break 12193 } 12194 _ = o0.Args[1] 12195 s0 := o0.Args[0] 12196 if s0.Op != Op386SHLLconst { 12197 break 12198 } 12199 if s0.AuxInt != 16 { 12200 break 12201 } 12202 x1 := s0.Args[0] 12203 if x1.Op != Op386MOVBloadidx1 { 12204 break 12205 } 12206 i2 := x1.AuxInt 12207 if x1.Aux != s { 12208 break 12209 } 12210 _ = x1.Args[2] 12211 if p != x1.Args[0] { 12212 break 12213 } 12214 if idx != x1.Args[1] { 12215 break 12216 } 12217 if mem != x1.Args[2] { 12218 break 12219 } 12220 x0 := o0.Args[1] 12221 if x0.Op != Op386MOVWloadidx1 { 12222 break 12223 } 12224 i0 := x0.AuxInt 12225 if x0.Aux != s { 12226 break 12227 } 12228 _ = x0.Args[2] 12229 if idx != x0.Args[0] { 12230 break 12231 } 12232 if p != x0.Args[1] { 12233 break 12234 } 12235 if mem != x0.Args[2] { 12236 break 12237 } 12238 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)) { 12239 break 12240 } 12241 b = mergePoint(b, x0, x1, x2) 12242 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12243 v.reset(OpCopy) 12244 v.AddArg(v0) 12245 v0.AuxInt = i0 12246 v0.Aux = s 12247 v0.AddArg(p) 12248 v0.AddArg(idx) 12249 v0.AddArg(mem) 12250 return true 12251 } 12252 // 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))) 12253 // 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) 12254 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12255 for { 12256 _ = v.Args[1] 12257 s1 := v.Args[0] 12258 if s1.Op != Op386SHLLconst { 12259 break 12260 } 12261 if s1.AuxInt != 24 { 12262 break 12263 } 12264 x2 := s1.Args[0] 12265 if x2.Op != Op386MOVBloadidx1 { 12266 break 12267 } 12268 i3 := x2.AuxInt 12269 s := x2.Aux 12270 _ = x2.Args[2] 12271 idx := x2.Args[0] 12272 p := x2.Args[1] 12273 mem := x2.Args[2] 12274 o0 := v.Args[1] 12275 if o0.Op != Op386ORL { 12276 break 12277 } 12278 _ = o0.Args[1] 12279 s0 := o0.Args[0] 12280 if s0.Op != Op386SHLLconst { 12281 break 12282 } 12283 if s0.AuxInt != 16 { 12284 break 12285 } 12286 x1 := s0.Args[0] 12287 if x1.Op != Op386MOVBloadidx1 { 12288 break 12289 } 12290 i2 := x1.AuxInt 12291 if x1.Aux != s { 12292 break 12293 } 12294 _ = x1.Args[2] 12295 if p != x1.Args[0] { 12296 break 12297 } 12298 if idx != x1.Args[1] { 12299 break 12300 } 12301 if mem != x1.Args[2] { 12302 break 12303 } 12304 x0 := o0.Args[1] 12305 if x0.Op != Op386MOVWloadidx1 { 12306 break 12307 } 12308 i0 := x0.AuxInt 12309 if x0.Aux != s { 12310 break 12311 } 12312 _ = x0.Args[2] 12313 if idx != x0.Args[0] { 12314 break 12315 } 12316 if p != x0.Args[1] { 12317 break 12318 } 12319 if mem != x0.Args[2] { 12320 break 12321 } 12322 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)) { 12323 break 12324 } 12325 b = mergePoint(b, x0, x1, x2) 12326 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12327 v.reset(OpCopy) 12328 v.AddArg(v0) 12329 v0.AuxInt = i0 12330 v0.Aux = s 12331 v0.AddArg(p) 12332 v0.AddArg(idx) 12333 v0.AddArg(mem) 12334 return true 12335 } 12336 // 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))) 12337 // 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) 12338 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12339 for { 12340 _ = v.Args[1] 12341 s1 := v.Args[0] 12342 if s1.Op != Op386SHLLconst { 12343 break 12344 } 12345 if s1.AuxInt != 24 { 12346 break 12347 } 12348 x2 := s1.Args[0] 12349 if x2.Op != Op386MOVBloadidx1 { 12350 break 12351 } 12352 i3 := x2.AuxInt 12353 s := x2.Aux 12354 _ = x2.Args[2] 12355 p := x2.Args[0] 12356 idx := x2.Args[1] 12357 mem := x2.Args[2] 12358 o0 := v.Args[1] 12359 if o0.Op != Op386ORL { 12360 break 12361 } 12362 _ = o0.Args[1] 12363 s0 := o0.Args[0] 12364 if s0.Op != Op386SHLLconst { 12365 break 12366 } 12367 if s0.AuxInt != 16 { 12368 break 12369 } 12370 x1 := s0.Args[0] 12371 if x1.Op != Op386MOVBloadidx1 { 12372 break 12373 } 12374 i2 := x1.AuxInt 12375 if x1.Aux != s { 12376 break 12377 } 12378 _ = x1.Args[2] 12379 if idx != x1.Args[0] { 12380 break 12381 } 12382 if p != x1.Args[1] { 12383 break 12384 } 12385 if mem != x1.Args[2] { 12386 break 12387 } 12388 x0 := o0.Args[1] 12389 if x0.Op != Op386MOVWloadidx1 { 12390 break 12391 } 12392 i0 := x0.AuxInt 12393 if x0.Aux != s { 12394 break 12395 } 12396 _ = x0.Args[2] 12397 if idx != x0.Args[0] { 12398 break 12399 } 12400 if p != x0.Args[1] { 12401 break 12402 } 12403 if mem != x0.Args[2] { 12404 break 12405 } 12406 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)) { 12407 break 12408 } 12409 b = mergePoint(b, x0, x1, x2) 12410 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12411 v.reset(OpCopy) 12412 v.AddArg(v0) 12413 v0.AuxInt = i0 12414 v0.Aux = s 12415 v0.AddArg(p) 12416 v0.AddArg(idx) 12417 v0.AddArg(mem) 12418 return true 12419 } 12420 // 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))) 12421 // 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) 12422 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 12423 for { 12424 _ = v.Args[1] 12425 s1 := v.Args[0] 12426 if s1.Op != Op386SHLLconst { 12427 break 12428 } 12429 if s1.AuxInt != 24 { 12430 break 12431 } 12432 x2 := s1.Args[0] 12433 if x2.Op != Op386MOVBloadidx1 { 12434 break 12435 } 12436 i3 := x2.AuxInt 12437 s := x2.Aux 12438 _ = x2.Args[2] 12439 idx := x2.Args[0] 12440 p := x2.Args[1] 12441 mem := x2.Args[2] 12442 o0 := v.Args[1] 12443 if o0.Op != Op386ORL { 12444 break 12445 } 12446 _ = o0.Args[1] 12447 s0 := o0.Args[0] 12448 if s0.Op != Op386SHLLconst { 12449 break 12450 } 12451 if s0.AuxInt != 16 { 12452 break 12453 } 12454 x1 := s0.Args[0] 12455 if x1.Op != Op386MOVBloadidx1 { 12456 break 12457 } 12458 i2 := x1.AuxInt 12459 if x1.Aux != s { 12460 break 12461 } 12462 _ = x1.Args[2] 12463 if idx != x1.Args[0] { 12464 break 12465 } 12466 if p != x1.Args[1] { 12467 break 12468 } 12469 if mem != x1.Args[2] { 12470 break 12471 } 12472 x0 := o0.Args[1] 12473 if x0.Op != Op386MOVWloadidx1 { 12474 break 12475 } 12476 i0 := x0.AuxInt 12477 if x0.Aux != s { 12478 break 12479 } 12480 _ = x0.Args[2] 12481 if idx != x0.Args[0] { 12482 break 12483 } 12484 if p != x0.Args[1] { 12485 break 12486 } 12487 if mem != x0.Args[2] { 12488 break 12489 } 12490 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)) { 12491 break 12492 } 12493 b = mergePoint(b, x0, x1, x2) 12494 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 12495 v.reset(OpCopy) 12496 v.AddArg(v0) 12497 v0.AuxInt = i0 12498 v0.Aux = s 12499 v0.AddArg(p) 12500 v0.AddArg(idx) 12501 v0.AddArg(mem) 12502 return true 12503 } 12504 return false 12505 } 12506 func rewriteValue386_Op386ORLconst_0(v *Value) bool { 12507 // match: (ORLconst [c] x) 12508 // cond: int32(c)==0 12509 // result: x 12510 for { 12511 c := v.AuxInt 12512 x := v.Args[0] 12513 if !(int32(c) == 0) { 12514 break 12515 } 12516 v.reset(OpCopy) 12517 v.Type = x.Type 12518 v.AddArg(x) 12519 return true 12520 } 12521 // match: (ORLconst [c] _) 12522 // cond: int32(c)==-1 12523 // result: (MOVLconst [-1]) 12524 for { 12525 c := v.AuxInt 12526 if !(int32(c) == -1) { 12527 break 12528 } 12529 v.reset(Op386MOVLconst) 12530 v.AuxInt = -1 12531 return true 12532 } 12533 // match: (ORLconst [c] (MOVLconst [d])) 12534 // cond: 12535 // result: (MOVLconst [c|d]) 12536 for { 12537 c := v.AuxInt 12538 v_0 := v.Args[0] 12539 if v_0.Op != Op386MOVLconst { 12540 break 12541 } 12542 d := v_0.AuxInt 12543 v.reset(Op386MOVLconst) 12544 v.AuxInt = c | d 12545 return true 12546 } 12547 return false 12548 } 12549 func rewriteValue386_Op386ROLBconst_0(v *Value) bool { 12550 // match: (ROLBconst [c] (ROLBconst [d] x)) 12551 // cond: 12552 // result: (ROLBconst [(c+d)& 7] x) 12553 for { 12554 c := v.AuxInt 12555 v_0 := v.Args[0] 12556 if v_0.Op != Op386ROLBconst { 12557 break 12558 } 12559 d := v_0.AuxInt 12560 x := v_0.Args[0] 12561 v.reset(Op386ROLBconst) 12562 v.AuxInt = (c + d) & 7 12563 v.AddArg(x) 12564 return true 12565 } 12566 // match: (ROLBconst [0] x) 12567 // cond: 12568 // result: x 12569 for { 12570 if v.AuxInt != 0 { 12571 break 12572 } 12573 x := v.Args[0] 12574 v.reset(OpCopy) 12575 v.Type = x.Type 12576 v.AddArg(x) 12577 return true 12578 } 12579 return false 12580 } 12581 func rewriteValue386_Op386ROLLconst_0(v *Value) bool { 12582 // match: (ROLLconst [c] (ROLLconst [d] x)) 12583 // cond: 12584 // result: (ROLLconst [(c+d)&31] x) 12585 for { 12586 c := v.AuxInt 12587 v_0 := v.Args[0] 12588 if v_0.Op != Op386ROLLconst { 12589 break 12590 } 12591 d := v_0.AuxInt 12592 x := v_0.Args[0] 12593 v.reset(Op386ROLLconst) 12594 v.AuxInt = (c + d) & 31 12595 v.AddArg(x) 12596 return true 12597 } 12598 // match: (ROLLconst [0] x) 12599 // cond: 12600 // result: x 12601 for { 12602 if v.AuxInt != 0 { 12603 break 12604 } 12605 x := v.Args[0] 12606 v.reset(OpCopy) 12607 v.Type = x.Type 12608 v.AddArg(x) 12609 return true 12610 } 12611 return false 12612 } 12613 func rewriteValue386_Op386ROLWconst_0(v *Value) bool { 12614 // match: (ROLWconst [c] (ROLWconst [d] x)) 12615 // cond: 12616 // result: (ROLWconst [(c+d)&15] x) 12617 for { 12618 c := v.AuxInt 12619 v_0 := v.Args[0] 12620 if v_0.Op != Op386ROLWconst { 12621 break 12622 } 12623 d := v_0.AuxInt 12624 x := v_0.Args[0] 12625 v.reset(Op386ROLWconst) 12626 v.AuxInt = (c + d) & 15 12627 v.AddArg(x) 12628 return true 12629 } 12630 // match: (ROLWconst [0] x) 12631 // cond: 12632 // result: x 12633 for { 12634 if v.AuxInt != 0 { 12635 break 12636 } 12637 x := v.Args[0] 12638 v.reset(OpCopy) 12639 v.Type = x.Type 12640 v.AddArg(x) 12641 return true 12642 } 12643 return false 12644 } 12645 func rewriteValue386_Op386SARB_0(v *Value) bool { 12646 // match: (SARB x (MOVLconst [c])) 12647 // cond: 12648 // result: (SARBconst [min(c&31,7)] x) 12649 for { 12650 _ = v.Args[1] 12651 x := v.Args[0] 12652 v_1 := v.Args[1] 12653 if v_1.Op != Op386MOVLconst { 12654 break 12655 } 12656 c := v_1.AuxInt 12657 v.reset(Op386SARBconst) 12658 v.AuxInt = min(c&31, 7) 12659 v.AddArg(x) 12660 return true 12661 } 12662 return false 12663 } 12664 func rewriteValue386_Op386SARBconst_0(v *Value) bool { 12665 // match: (SARBconst x [0]) 12666 // cond: 12667 // result: x 12668 for { 12669 if v.AuxInt != 0 { 12670 break 12671 } 12672 x := v.Args[0] 12673 v.reset(OpCopy) 12674 v.Type = x.Type 12675 v.AddArg(x) 12676 return true 12677 } 12678 // match: (SARBconst [c] (MOVLconst [d])) 12679 // cond: 12680 // result: (MOVLconst [d>>uint64(c)]) 12681 for { 12682 c := v.AuxInt 12683 v_0 := v.Args[0] 12684 if v_0.Op != Op386MOVLconst { 12685 break 12686 } 12687 d := v_0.AuxInt 12688 v.reset(Op386MOVLconst) 12689 v.AuxInt = d >> uint64(c) 12690 return true 12691 } 12692 return false 12693 } 12694 func rewriteValue386_Op386SARL_0(v *Value) bool { 12695 // match: (SARL x (MOVLconst [c])) 12696 // cond: 12697 // result: (SARLconst [c&31] x) 12698 for { 12699 _ = v.Args[1] 12700 x := v.Args[0] 12701 v_1 := v.Args[1] 12702 if v_1.Op != Op386MOVLconst { 12703 break 12704 } 12705 c := v_1.AuxInt 12706 v.reset(Op386SARLconst) 12707 v.AuxInt = c & 31 12708 v.AddArg(x) 12709 return true 12710 } 12711 // match: (SARL x (ANDLconst [31] y)) 12712 // cond: 12713 // result: (SARL x y) 12714 for { 12715 _ = v.Args[1] 12716 x := v.Args[0] 12717 v_1 := v.Args[1] 12718 if v_1.Op != Op386ANDLconst { 12719 break 12720 } 12721 if v_1.AuxInt != 31 { 12722 break 12723 } 12724 y := v_1.Args[0] 12725 v.reset(Op386SARL) 12726 v.AddArg(x) 12727 v.AddArg(y) 12728 return true 12729 } 12730 return false 12731 } 12732 func rewriteValue386_Op386SARLconst_0(v *Value) bool { 12733 // match: (SARLconst x [0]) 12734 // cond: 12735 // result: x 12736 for { 12737 if v.AuxInt != 0 { 12738 break 12739 } 12740 x := v.Args[0] 12741 v.reset(OpCopy) 12742 v.Type = x.Type 12743 v.AddArg(x) 12744 return true 12745 } 12746 // match: (SARLconst [c] (MOVLconst [d])) 12747 // cond: 12748 // result: (MOVLconst [d>>uint64(c)]) 12749 for { 12750 c := v.AuxInt 12751 v_0 := v.Args[0] 12752 if v_0.Op != Op386MOVLconst { 12753 break 12754 } 12755 d := v_0.AuxInt 12756 v.reset(Op386MOVLconst) 12757 v.AuxInt = d >> uint64(c) 12758 return true 12759 } 12760 return false 12761 } 12762 func rewriteValue386_Op386SARW_0(v *Value) bool { 12763 // match: (SARW x (MOVLconst [c])) 12764 // cond: 12765 // result: (SARWconst [min(c&31,15)] x) 12766 for { 12767 _ = v.Args[1] 12768 x := v.Args[0] 12769 v_1 := v.Args[1] 12770 if v_1.Op != Op386MOVLconst { 12771 break 12772 } 12773 c := v_1.AuxInt 12774 v.reset(Op386SARWconst) 12775 v.AuxInt = min(c&31, 15) 12776 v.AddArg(x) 12777 return true 12778 } 12779 return false 12780 } 12781 func rewriteValue386_Op386SARWconst_0(v *Value) bool { 12782 // match: (SARWconst x [0]) 12783 // cond: 12784 // result: x 12785 for { 12786 if v.AuxInt != 0 { 12787 break 12788 } 12789 x := v.Args[0] 12790 v.reset(OpCopy) 12791 v.Type = x.Type 12792 v.AddArg(x) 12793 return true 12794 } 12795 // match: (SARWconst [c] (MOVLconst [d])) 12796 // cond: 12797 // result: (MOVLconst [d>>uint64(c)]) 12798 for { 12799 c := v.AuxInt 12800 v_0 := v.Args[0] 12801 if v_0.Op != Op386MOVLconst { 12802 break 12803 } 12804 d := v_0.AuxInt 12805 v.reset(Op386MOVLconst) 12806 v.AuxInt = d >> uint64(c) 12807 return true 12808 } 12809 return false 12810 } 12811 func rewriteValue386_Op386SBBL_0(v *Value) bool { 12812 // match: (SBBL x (MOVLconst [c]) f) 12813 // cond: 12814 // result: (SBBLconst [c] x f) 12815 for { 12816 _ = v.Args[2] 12817 x := v.Args[0] 12818 v_1 := v.Args[1] 12819 if v_1.Op != Op386MOVLconst { 12820 break 12821 } 12822 c := v_1.AuxInt 12823 f := v.Args[2] 12824 v.reset(Op386SBBLconst) 12825 v.AuxInt = c 12826 v.AddArg(x) 12827 v.AddArg(f) 12828 return true 12829 } 12830 return false 12831 } 12832 func rewriteValue386_Op386SBBLcarrymask_0(v *Value) bool { 12833 // match: (SBBLcarrymask (FlagEQ)) 12834 // cond: 12835 // result: (MOVLconst [0]) 12836 for { 12837 v_0 := v.Args[0] 12838 if v_0.Op != Op386FlagEQ { 12839 break 12840 } 12841 v.reset(Op386MOVLconst) 12842 v.AuxInt = 0 12843 return true 12844 } 12845 // match: (SBBLcarrymask (FlagLT_ULT)) 12846 // cond: 12847 // result: (MOVLconst [-1]) 12848 for { 12849 v_0 := v.Args[0] 12850 if v_0.Op != Op386FlagLT_ULT { 12851 break 12852 } 12853 v.reset(Op386MOVLconst) 12854 v.AuxInt = -1 12855 return true 12856 } 12857 // match: (SBBLcarrymask (FlagLT_UGT)) 12858 // cond: 12859 // result: (MOVLconst [0]) 12860 for { 12861 v_0 := v.Args[0] 12862 if v_0.Op != Op386FlagLT_UGT { 12863 break 12864 } 12865 v.reset(Op386MOVLconst) 12866 v.AuxInt = 0 12867 return true 12868 } 12869 // match: (SBBLcarrymask (FlagGT_ULT)) 12870 // cond: 12871 // result: (MOVLconst [-1]) 12872 for { 12873 v_0 := v.Args[0] 12874 if v_0.Op != Op386FlagGT_ULT { 12875 break 12876 } 12877 v.reset(Op386MOVLconst) 12878 v.AuxInt = -1 12879 return true 12880 } 12881 // match: (SBBLcarrymask (FlagGT_UGT)) 12882 // cond: 12883 // result: (MOVLconst [0]) 12884 for { 12885 v_0 := v.Args[0] 12886 if v_0.Op != Op386FlagGT_UGT { 12887 break 12888 } 12889 v.reset(Op386MOVLconst) 12890 v.AuxInt = 0 12891 return true 12892 } 12893 return false 12894 } 12895 func rewriteValue386_Op386SETA_0(v *Value) bool { 12896 // match: (SETA (InvertFlags x)) 12897 // cond: 12898 // result: (SETB x) 12899 for { 12900 v_0 := v.Args[0] 12901 if v_0.Op != Op386InvertFlags { 12902 break 12903 } 12904 x := v_0.Args[0] 12905 v.reset(Op386SETB) 12906 v.AddArg(x) 12907 return true 12908 } 12909 // match: (SETA (FlagEQ)) 12910 // cond: 12911 // result: (MOVLconst [0]) 12912 for { 12913 v_0 := v.Args[0] 12914 if v_0.Op != Op386FlagEQ { 12915 break 12916 } 12917 v.reset(Op386MOVLconst) 12918 v.AuxInt = 0 12919 return true 12920 } 12921 // match: (SETA (FlagLT_ULT)) 12922 // cond: 12923 // result: (MOVLconst [0]) 12924 for { 12925 v_0 := v.Args[0] 12926 if v_0.Op != Op386FlagLT_ULT { 12927 break 12928 } 12929 v.reset(Op386MOVLconst) 12930 v.AuxInt = 0 12931 return true 12932 } 12933 // match: (SETA (FlagLT_UGT)) 12934 // cond: 12935 // result: (MOVLconst [1]) 12936 for { 12937 v_0 := v.Args[0] 12938 if v_0.Op != Op386FlagLT_UGT { 12939 break 12940 } 12941 v.reset(Op386MOVLconst) 12942 v.AuxInt = 1 12943 return true 12944 } 12945 // match: (SETA (FlagGT_ULT)) 12946 // cond: 12947 // result: (MOVLconst [0]) 12948 for { 12949 v_0 := v.Args[0] 12950 if v_0.Op != Op386FlagGT_ULT { 12951 break 12952 } 12953 v.reset(Op386MOVLconst) 12954 v.AuxInt = 0 12955 return true 12956 } 12957 // match: (SETA (FlagGT_UGT)) 12958 // cond: 12959 // result: (MOVLconst [1]) 12960 for { 12961 v_0 := v.Args[0] 12962 if v_0.Op != Op386FlagGT_UGT { 12963 break 12964 } 12965 v.reset(Op386MOVLconst) 12966 v.AuxInt = 1 12967 return true 12968 } 12969 return false 12970 } 12971 func rewriteValue386_Op386SETAE_0(v *Value) bool { 12972 // match: (SETAE (InvertFlags x)) 12973 // cond: 12974 // result: (SETBE x) 12975 for { 12976 v_0 := v.Args[0] 12977 if v_0.Op != Op386InvertFlags { 12978 break 12979 } 12980 x := v_0.Args[0] 12981 v.reset(Op386SETBE) 12982 v.AddArg(x) 12983 return true 12984 } 12985 // match: (SETAE (FlagEQ)) 12986 // cond: 12987 // result: (MOVLconst [1]) 12988 for { 12989 v_0 := v.Args[0] 12990 if v_0.Op != Op386FlagEQ { 12991 break 12992 } 12993 v.reset(Op386MOVLconst) 12994 v.AuxInt = 1 12995 return true 12996 } 12997 // match: (SETAE (FlagLT_ULT)) 12998 // cond: 12999 // result: (MOVLconst [0]) 13000 for { 13001 v_0 := v.Args[0] 13002 if v_0.Op != Op386FlagLT_ULT { 13003 break 13004 } 13005 v.reset(Op386MOVLconst) 13006 v.AuxInt = 0 13007 return true 13008 } 13009 // match: (SETAE (FlagLT_UGT)) 13010 // cond: 13011 // result: (MOVLconst [1]) 13012 for { 13013 v_0 := v.Args[0] 13014 if v_0.Op != Op386FlagLT_UGT { 13015 break 13016 } 13017 v.reset(Op386MOVLconst) 13018 v.AuxInt = 1 13019 return true 13020 } 13021 // match: (SETAE (FlagGT_ULT)) 13022 // cond: 13023 // result: (MOVLconst [0]) 13024 for { 13025 v_0 := v.Args[0] 13026 if v_0.Op != Op386FlagGT_ULT { 13027 break 13028 } 13029 v.reset(Op386MOVLconst) 13030 v.AuxInt = 0 13031 return true 13032 } 13033 // match: (SETAE (FlagGT_UGT)) 13034 // cond: 13035 // result: (MOVLconst [1]) 13036 for { 13037 v_0 := v.Args[0] 13038 if v_0.Op != Op386FlagGT_UGT { 13039 break 13040 } 13041 v.reset(Op386MOVLconst) 13042 v.AuxInt = 1 13043 return true 13044 } 13045 return false 13046 } 13047 func rewriteValue386_Op386SETB_0(v *Value) bool { 13048 // match: (SETB (InvertFlags x)) 13049 // cond: 13050 // result: (SETA x) 13051 for { 13052 v_0 := v.Args[0] 13053 if v_0.Op != Op386InvertFlags { 13054 break 13055 } 13056 x := v_0.Args[0] 13057 v.reset(Op386SETA) 13058 v.AddArg(x) 13059 return true 13060 } 13061 // match: (SETB (FlagEQ)) 13062 // cond: 13063 // result: (MOVLconst [0]) 13064 for { 13065 v_0 := v.Args[0] 13066 if v_0.Op != Op386FlagEQ { 13067 break 13068 } 13069 v.reset(Op386MOVLconst) 13070 v.AuxInt = 0 13071 return true 13072 } 13073 // match: (SETB (FlagLT_ULT)) 13074 // cond: 13075 // result: (MOVLconst [1]) 13076 for { 13077 v_0 := v.Args[0] 13078 if v_0.Op != Op386FlagLT_ULT { 13079 break 13080 } 13081 v.reset(Op386MOVLconst) 13082 v.AuxInt = 1 13083 return true 13084 } 13085 // match: (SETB (FlagLT_UGT)) 13086 // cond: 13087 // result: (MOVLconst [0]) 13088 for { 13089 v_0 := v.Args[0] 13090 if v_0.Op != Op386FlagLT_UGT { 13091 break 13092 } 13093 v.reset(Op386MOVLconst) 13094 v.AuxInt = 0 13095 return true 13096 } 13097 // match: (SETB (FlagGT_ULT)) 13098 // cond: 13099 // result: (MOVLconst [1]) 13100 for { 13101 v_0 := v.Args[0] 13102 if v_0.Op != Op386FlagGT_ULT { 13103 break 13104 } 13105 v.reset(Op386MOVLconst) 13106 v.AuxInt = 1 13107 return true 13108 } 13109 // match: (SETB (FlagGT_UGT)) 13110 // cond: 13111 // result: (MOVLconst [0]) 13112 for { 13113 v_0 := v.Args[0] 13114 if v_0.Op != Op386FlagGT_UGT { 13115 break 13116 } 13117 v.reset(Op386MOVLconst) 13118 v.AuxInt = 0 13119 return true 13120 } 13121 return false 13122 } 13123 func rewriteValue386_Op386SETBE_0(v *Value) bool { 13124 // match: (SETBE (InvertFlags x)) 13125 // cond: 13126 // result: (SETAE x) 13127 for { 13128 v_0 := v.Args[0] 13129 if v_0.Op != Op386InvertFlags { 13130 break 13131 } 13132 x := v_0.Args[0] 13133 v.reset(Op386SETAE) 13134 v.AddArg(x) 13135 return true 13136 } 13137 // match: (SETBE (FlagEQ)) 13138 // cond: 13139 // result: (MOVLconst [1]) 13140 for { 13141 v_0 := v.Args[0] 13142 if v_0.Op != Op386FlagEQ { 13143 break 13144 } 13145 v.reset(Op386MOVLconst) 13146 v.AuxInt = 1 13147 return true 13148 } 13149 // match: (SETBE (FlagLT_ULT)) 13150 // cond: 13151 // result: (MOVLconst [1]) 13152 for { 13153 v_0 := v.Args[0] 13154 if v_0.Op != Op386FlagLT_ULT { 13155 break 13156 } 13157 v.reset(Op386MOVLconst) 13158 v.AuxInt = 1 13159 return true 13160 } 13161 // match: (SETBE (FlagLT_UGT)) 13162 // cond: 13163 // result: (MOVLconst [0]) 13164 for { 13165 v_0 := v.Args[0] 13166 if v_0.Op != Op386FlagLT_UGT { 13167 break 13168 } 13169 v.reset(Op386MOVLconst) 13170 v.AuxInt = 0 13171 return true 13172 } 13173 // match: (SETBE (FlagGT_ULT)) 13174 // cond: 13175 // result: (MOVLconst [1]) 13176 for { 13177 v_0 := v.Args[0] 13178 if v_0.Op != Op386FlagGT_ULT { 13179 break 13180 } 13181 v.reset(Op386MOVLconst) 13182 v.AuxInt = 1 13183 return true 13184 } 13185 // match: (SETBE (FlagGT_UGT)) 13186 // cond: 13187 // result: (MOVLconst [0]) 13188 for { 13189 v_0 := v.Args[0] 13190 if v_0.Op != Op386FlagGT_UGT { 13191 break 13192 } 13193 v.reset(Op386MOVLconst) 13194 v.AuxInt = 0 13195 return true 13196 } 13197 return false 13198 } 13199 func rewriteValue386_Op386SETEQ_0(v *Value) bool { 13200 // match: (SETEQ (InvertFlags x)) 13201 // cond: 13202 // result: (SETEQ x) 13203 for { 13204 v_0 := v.Args[0] 13205 if v_0.Op != Op386InvertFlags { 13206 break 13207 } 13208 x := v_0.Args[0] 13209 v.reset(Op386SETEQ) 13210 v.AddArg(x) 13211 return true 13212 } 13213 // match: (SETEQ (FlagEQ)) 13214 // cond: 13215 // result: (MOVLconst [1]) 13216 for { 13217 v_0 := v.Args[0] 13218 if v_0.Op != Op386FlagEQ { 13219 break 13220 } 13221 v.reset(Op386MOVLconst) 13222 v.AuxInt = 1 13223 return true 13224 } 13225 // match: (SETEQ (FlagLT_ULT)) 13226 // cond: 13227 // result: (MOVLconst [0]) 13228 for { 13229 v_0 := v.Args[0] 13230 if v_0.Op != Op386FlagLT_ULT { 13231 break 13232 } 13233 v.reset(Op386MOVLconst) 13234 v.AuxInt = 0 13235 return true 13236 } 13237 // match: (SETEQ (FlagLT_UGT)) 13238 // cond: 13239 // result: (MOVLconst [0]) 13240 for { 13241 v_0 := v.Args[0] 13242 if v_0.Op != Op386FlagLT_UGT { 13243 break 13244 } 13245 v.reset(Op386MOVLconst) 13246 v.AuxInt = 0 13247 return true 13248 } 13249 // match: (SETEQ (FlagGT_ULT)) 13250 // cond: 13251 // result: (MOVLconst [0]) 13252 for { 13253 v_0 := v.Args[0] 13254 if v_0.Op != Op386FlagGT_ULT { 13255 break 13256 } 13257 v.reset(Op386MOVLconst) 13258 v.AuxInt = 0 13259 return true 13260 } 13261 // match: (SETEQ (FlagGT_UGT)) 13262 // cond: 13263 // result: (MOVLconst [0]) 13264 for { 13265 v_0 := v.Args[0] 13266 if v_0.Op != Op386FlagGT_UGT { 13267 break 13268 } 13269 v.reset(Op386MOVLconst) 13270 v.AuxInt = 0 13271 return true 13272 } 13273 return false 13274 } 13275 func rewriteValue386_Op386SETG_0(v *Value) bool { 13276 // match: (SETG (InvertFlags x)) 13277 // cond: 13278 // result: (SETL x) 13279 for { 13280 v_0 := v.Args[0] 13281 if v_0.Op != Op386InvertFlags { 13282 break 13283 } 13284 x := v_0.Args[0] 13285 v.reset(Op386SETL) 13286 v.AddArg(x) 13287 return true 13288 } 13289 // match: (SETG (FlagEQ)) 13290 // cond: 13291 // result: (MOVLconst [0]) 13292 for { 13293 v_0 := v.Args[0] 13294 if v_0.Op != Op386FlagEQ { 13295 break 13296 } 13297 v.reset(Op386MOVLconst) 13298 v.AuxInt = 0 13299 return true 13300 } 13301 // match: (SETG (FlagLT_ULT)) 13302 // cond: 13303 // result: (MOVLconst [0]) 13304 for { 13305 v_0 := v.Args[0] 13306 if v_0.Op != Op386FlagLT_ULT { 13307 break 13308 } 13309 v.reset(Op386MOVLconst) 13310 v.AuxInt = 0 13311 return true 13312 } 13313 // match: (SETG (FlagLT_UGT)) 13314 // cond: 13315 // result: (MOVLconst [0]) 13316 for { 13317 v_0 := v.Args[0] 13318 if v_0.Op != Op386FlagLT_UGT { 13319 break 13320 } 13321 v.reset(Op386MOVLconst) 13322 v.AuxInt = 0 13323 return true 13324 } 13325 // match: (SETG (FlagGT_ULT)) 13326 // cond: 13327 // result: (MOVLconst [1]) 13328 for { 13329 v_0 := v.Args[0] 13330 if v_0.Op != Op386FlagGT_ULT { 13331 break 13332 } 13333 v.reset(Op386MOVLconst) 13334 v.AuxInt = 1 13335 return true 13336 } 13337 // match: (SETG (FlagGT_UGT)) 13338 // cond: 13339 // result: (MOVLconst [1]) 13340 for { 13341 v_0 := v.Args[0] 13342 if v_0.Op != Op386FlagGT_UGT { 13343 break 13344 } 13345 v.reset(Op386MOVLconst) 13346 v.AuxInt = 1 13347 return true 13348 } 13349 return false 13350 } 13351 func rewriteValue386_Op386SETGE_0(v *Value) bool { 13352 // match: (SETGE (InvertFlags x)) 13353 // cond: 13354 // result: (SETLE x) 13355 for { 13356 v_0 := v.Args[0] 13357 if v_0.Op != Op386InvertFlags { 13358 break 13359 } 13360 x := v_0.Args[0] 13361 v.reset(Op386SETLE) 13362 v.AddArg(x) 13363 return true 13364 } 13365 // match: (SETGE (FlagEQ)) 13366 // cond: 13367 // result: (MOVLconst [1]) 13368 for { 13369 v_0 := v.Args[0] 13370 if v_0.Op != Op386FlagEQ { 13371 break 13372 } 13373 v.reset(Op386MOVLconst) 13374 v.AuxInt = 1 13375 return true 13376 } 13377 // match: (SETGE (FlagLT_ULT)) 13378 // cond: 13379 // result: (MOVLconst [0]) 13380 for { 13381 v_0 := v.Args[0] 13382 if v_0.Op != Op386FlagLT_ULT { 13383 break 13384 } 13385 v.reset(Op386MOVLconst) 13386 v.AuxInt = 0 13387 return true 13388 } 13389 // match: (SETGE (FlagLT_UGT)) 13390 // cond: 13391 // result: (MOVLconst [0]) 13392 for { 13393 v_0 := v.Args[0] 13394 if v_0.Op != Op386FlagLT_UGT { 13395 break 13396 } 13397 v.reset(Op386MOVLconst) 13398 v.AuxInt = 0 13399 return true 13400 } 13401 // match: (SETGE (FlagGT_ULT)) 13402 // cond: 13403 // result: (MOVLconst [1]) 13404 for { 13405 v_0 := v.Args[0] 13406 if v_0.Op != Op386FlagGT_ULT { 13407 break 13408 } 13409 v.reset(Op386MOVLconst) 13410 v.AuxInt = 1 13411 return true 13412 } 13413 // match: (SETGE (FlagGT_UGT)) 13414 // cond: 13415 // result: (MOVLconst [1]) 13416 for { 13417 v_0 := v.Args[0] 13418 if v_0.Op != Op386FlagGT_UGT { 13419 break 13420 } 13421 v.reset(Op386MOVLconst) 13422 v.AuxInt = 1 13423 return true 13424 } 13425 return false 13426 } 13427 func rewriteValue386_Op386SETL_0(v *Value) bool { 13428 // match: (SETL (InvertFlags x)) 13429 // cond: 13430 // result: (SETG x) 13431 for { 13432 v_0 := v.Args[0] 13433 if v_0.Op != Op386InvertFlags { 13434 break 13435 } 13436 x := v_0.Args[0] 13437 v.reset(Op386SETG) 13438 v.AddArg(x) 13439 return true 13440 } 13441 // match: (SETL (FlagEQ)) 13442 // cond: 13443 // result: (MOVLconst [0]) 13444 for { 13445 v_0 := v.Args[0] 13446 if v_0.Op != Op386FlagEQ { 13447 break 13448 } 13449 v.reset(Op386MOVLconst) 13450 v.AuxInt = 0 13451 return true 13452 } 13453 // match: (SETL (FlagLT_ULT)) 13454 // cond: 13455 // result: (MOVLconst [1]) 13456 for { 13457 v_0 := v.Args[0] 13458 if v_0.Op != Op386FlagLT_ULT { 13459 break 13460 } 13461 v.reset(Op386MOVLconst) 13462 v.AuxInt = 1 13463 return true 13464 } 13465 // match: (SETL (FlagLT_UGT)) 13466 // cond: 13467 // result: (MOVLconst [1]) 13468 for { 13469 v_0 := v.Args[0] 13470 if v_0.Op != Op386FlagLT_UGT { 13471 break 13472 } 13473 v.reset(Op386MOVLconst) 13474 v.AuxInt = 1 13475 return true 13476 } 13477 // match: (SETL (FlagGT_ULT)) 13478 // cond: 13479 // result: (MOVLconst [0]) 13480 for { 13481 v_0 := v.Args[0] 13482 if v_0.Op != Op386FlagGT_ULT { 13483 break 13484 } 13485 v.reset(Op386MOVLconst) 13486 v.AuxInt = 0 13487 return true 13488 } 13489 // match: (SETL (FlagGT_UGT)) 13490 // cond: 13491 // result: (MOVLconst [0]) 13492 for { 13493 v_0 := v.Args[0] 13494 if v_0.Op != Op386FlagGT_UGT { 13495 break 13496 } 13497 v.reset(Op386MOVLconst) 13498 v.AuxInt = 0 13499 return true 13500 } 13501 return false 13502 } 13503 func rewriteValue386_Op386SETLE_0(v *Value) bool { 13504 // match: (SETLE (InvertFlags x)) 13505 // cond: 13506 // result: (SETGE x) 13507 for { 13508 v_0 := v.Args[0] 13509 if v_0.Op != Op386InvertFlags { 13510 break 13511 } 13512 x := v_0.Args[0] 13513 v.reset(Op386SETGE) 13514 v.AddArg(x) 13515 return true 13516 } 13517 // match: (SETLE (FlagEQ)) 13518 // cond: 13519 // result: (MOVLconst [1]) 13520 for { 13521 v_0 := v.Args[0] 13522 if v_0.Op != Op386FlagEQ { 13523 break 13524 } 13525 v.reset(Op386MOVLconst) 13526 v.AuxInt = 1 13527 return true 13528 } 13529 // match: (SETLE (FlagLT_ULT)) 13530 // cond: 13531 // result: (MOVLconst [1]) 13532 for { 13533 v_0 := v.Args[0] 13534 if v_0.Op != Op386FlagLT_ULT { 13535 break 13536 } 13537 v.reset(Op386MOVLconst) 13538 v.AuxInt = 1 13539 return true 13540 } 13541 // match: (SETLE (FlagLT_UGT)) 13542 // cond: 13543 // result: (MOVLconst [1]) 13544 for { 13545 v_0 := v.Args[0] 13546 if v_0.Op != Op386FlagLT_UGT { 13547 break 13548 } 13549 v.reset(Op386MOVLconst) 13550 v.AuxInt = 1 13551 return true 13552 } 13553 // match: (SETLE (FlagGT_ULT)) 13554 // cond: 13555 // result: (MOVLconst [0]) 13556 for { 13557 v_0 := v.Args[0] 13558 if v_0.Op != Op386FlagGT_ULT { 13559 break 13560 } 13561 v.reset(Op386MOVLconst) 13562 v.AuxInt = 0 13563 return true 13564 } 13565 // match: (SETLE (FlagGT_UGT)) 13566 // cond: 13567 // result: (MOVLconst [0]) 13568 for { 13569 v_0 := v.Args[0] 13570 if v_0.Op != Op386FlagGT_UGT { 13571 break 13572 } 13573 v.reset(Op386MOVLconst) 13574 v.AuxInt = 0 13575 return true 13576 } 13577 return false 13578 } 13579 func rewriteValue386_Op386SETNE_0(v *Value) bool { 13580 // match: (SETNE (InvertFlags x)) 13581 // cond: 13582 // result: (SETNE x) 13583 for { 13584 v_0 := v.Args[0] 13585 if v_0.Op != Op386InvertFlags { 13586 break 13587 } 13588 x := v_0.Args[0] 13589 v.reset(Op386SETNE) 13590 v.AddArg(x) 13591 return true 13592 } 13593 // match: (SETNE (FlagEQ)) 13594 // cond: 13595 // result: (MOVLconst [0]) 13596 for { 13597 v_0 := v.Args[0] 13598 if v_0.Op != Op386FlagEQ { 13599 break 13600 } 13601 v.reset(Op386MOVLconst) 13602 v.AuxInt = 0 13603 return true 13604 } 13605 // match: (SETNE (FlagLT_ULT)) 13606 // cond: 13607 // result: (MOVLconst [1]) 13608 for { 13609 v_0 := v.Args[0] 13610 if v_0.Op != Op386FlagLT_ULT { 13611 break 13612 } 13613 v.reset(Op386MOVLconst) 13614 v.AuxInt = 1 13615 return true 13616 } 13617 // match: (SETNE (FlagLT_UGT)) 13618 // cond: 13619 // result: (MOVLconst [1]) 13620 for { 13621 v_0 := v.Args[0] 13622 if v_0.Op != Op386FlagLT_UGT { 13623 break 13624 } 13625 v.reset(Op386MOVLconst) 13626 v.AuxInt = 1 13627 return true 13628 } 13629 // match: (SETNE (FlagGT_ULT)) 13630 // cond: 13631 // result: (MOVLconst [1]) 13632 for { 13633 v_0 := v.Args[0] 13634 if v_0.Op != Op386FlagGT_ULT { 13635 break 13636 } 13637 v.reset(Op386MOVLconst) 13638 v.AuxInt = 1 13639 return true 13640 } 13641 // match: (SETNE (FlagGT_UGT)) 13642 // cond: 13643 // result: (MOVLconst [1]) 13644 for { 13645 v_0 := v.Args[0] 13646 if v_0.Op != Op386FlagGT_UGT { 13647 break 13648 } 13649 v.reset(Op386MOVLconst) 13650 v.AuxInt = 1 13651 return true 13652 } 13653 return false 13654 } 13655 func rewriteValue386_Op386SHLL_0(v *Value) bool { 13656 // match: (SHLL x (MOVLconst [c])) 13657 // cond: 13658 // result: (SHLLconst [c&31] x) 13659 for { 13660 _ = v.Args[1] 13661 x := v.Args[0] 13662 v_1 := v.Args[1] 13663 if v_1.Op != Op386MOVLconst { 13664 break 13665 } 13666 c := v_1.AuxInt 13667 v.reset(Op386SHLLconst) 13668 v.AuxInt = c & 31 13669 v.AddArg(x) 13670 return true 13671 } 13672 // match: (SHLL x (ANDLconst [31] y)) 13673 // cond: 13674 // result: (SHLL x y) 13675 for { 13676 _ = v.Args[1] 13677 x := v.Args[0] 13678 v_1 := v.Args[1] 13679 if v_1.Op != Op386ANDLconst { 13680 break 13681 } 13682 if v_1.AuxInt != 31 { 13683 break 13684 } 13685 y := v_1.Args[0] 13686 v.reset(Op386SHLL) 13687 v.AddArg(x) 13688 v.AddArg(y) 13689 return true 13690 } 13691 return false 13692 } 13693 func rewriteValue386_Op386SHLLconst_0(v *Value) bool { 13694 // match: (SHLLconst x [0]) 13695 // cond: 13696 // result: x 13697 for { 13698 if v.AuxInt != 0 { 13699 break 13700 } 13701 x := v.Args[0] 13702 v.reset(OpCopy) 13703 v.Type = x.Type 13704 v.AddArg(x) 13705 return true 13706 } 13707 return false 13708 } 13709 func rewriteValue386_Op386SHRB_0(v *Value) bool { 13710 // match: (SHRB x (MOVLconst [c])) 13711 // cond: c&31 < 8 13712 // result: (SHRBconst [c&31] x) 13713 for { 13714 _ = v.Args[1] 13715 x := v.Args[0] 13716 v_1 := v.Args[1] 13717 if v_1.Op != Op386MOVLconst { 13718 break 13719 } 13720 c := v_1.AuxInt 13721 if !(c&31 < 8) { 13722 break 13723 } 13724 v.reset(Op386SHRBconst) 13725 v.AuxInt = c & 31 13726 v.AddArg(x) 13727 return true 13728 } 13729 // match: (SHRB _ (MOVLconst [c])) 13730 // cond: c&31 >= 8 13731 // result: (MOVLconst [0]) 13732 for { 13733 _ = v.Args[1] 13734 v_1 := v.Args[1] 13735 if v_1.Op != Op386MOVLconst { 13736 break 13737 } 13738 c := v_1.AuxInt 13739 if !(c&31 >= 8) { 13740 break 13741 } 13742 v.reset(Op386MOVLconst) 13743 v.AuxInt = 0 13744 return true 13745 } 13746 return false 13747 } 13748 func rewriteValue386_Op386SHRBconst_0(v *Value) bool { 13749 // match: (SHRBconst x [0]) 13750 // cond: 13751 // result: x 13752 for { 13753 if v.AuxInt != 0 { 13754 break 13755 } 13756 x := v.Args[0] 13757 v.reset(OpCopy) 13758 v.Type = x.Type 13759 v.AddArg(x) 13760 return true 13761 } 13762 return false 13763 } 13764 func rewriteValue386_Op386SHRL_0(v *Value) bool { 13765 // match: (SHRL x (MOVLconst [c])) 13766 // cond: 13767 // result: (SHRLconst [c&31] x) 13768 for { 13769 _ = v.Args[1] 13770 x := v.Args[0] 13771 v_1 := v.Args[1] 13772 if v_1.Op != Op386MOVLconst { 13773 break 13774 } 13775 c := v_1.AuxInt 13776 v.reset(Op386SHRLconst) 13777 v.AuxInt = c & 31 13778 v.AddArg(x) 13779 return true 13780 } 13781 // match: (SHRL x (ANDLconst [31] y)) 13782 // cond: 13783 // result: (SHRL x y) 13784 for { 13785 _ = v.Args[1] 13786 x := v.Args[0] 13787 v_1 := v.Args[1] 13788 if v_1.Op != Op386ANDLconst { 13789 break 13790 } 13791 if v_1.AuxInt != 31 { 13792 break 13793 } 13794 y := v_1.Args[0] 13795 v.reset(Op386SHRL) 13796 v.AddArg(x) 13797 v.AddArg(y) 13798 return true 13799 } 13800 return false 13801 } 13802 func rewriteValue386_Op386SHRLconst_0(v *Value) bool { 13803 // match: (SHRLconst x [0]) 13804 // cond: 13805 // result: x 13806 for { 13807 if v.AuxInt != 0 { 13808 break 13809 } 13810 x := v.Args[0] 13811 v.reset(OpCopy) 13812 v.Type = x.Type 13813 v.AddArg(x) 13814 return true 13815 } 13816 return false 13817 } 13818 func rewriteValue386_Op386SHRW_0(v *Value) bool { 13819 // match: (SHRW x (MOVLconst [c])) 13820 // cond: c&31 < 16 13821 // result: (SHRWconst [c&31] x) 13822 for { 13823 _ = v.Args[1] 13824 x := v.Args[0] 13825 v_1 := v.Args[1] 13826 if v_1.Op != Op386MOVLconst { 13827 break 13828 } 13829 c := v_1.AuxInt 13830 if !(c&31 < 16) { 13831 break 13832 } 13833 v.reset(Op386SHRWconst) 13834 v.AuxInt = c & 31 13835 v.AddArg(x) 13836 return true 13837 } 13838 // match: (SHRW _ (MOVLconst [c])) 13839 // cond: c&31 >= 16 13840 // result: (MOVLconst [0]) 13841 for { 13842 _ = v.Args[1] 13843 v_1 := v.Args[1] 13844 if v_1.Op != Op386MOVLconst { 13845 break 13846 } 13847 c := v_1.AuxInt 13848 if !(c&31 >= 16) { 13849 break 13850 } 13851 v.reset(Op386MOVLconst) 13852 v.AuxInt = 0 13853 return true 13854 } 13855 return false 13856 } 13857 func rewriteValue386_Op386SHRWconst_0(v *Value) bool { 13858 // match: (SHRWconst x [0]) 13859 // cond: 13860 // result: x 13861 for { 13862 if v.AuxInt != 0 { 13863 break 13864 } 13865 x := v.Args[0] 13866 v.reset(OpCopy) 13867 v.Type = x.Type 13868 v.AddArg(x) 13869 return true 13870 } 13871 return false 13872 } 13873 func rewriteValue386_Op386SUBL_0(v *Value) bool { 13874 b := v.Block 13875 _ = b 13876 // match: (SUBL x (MOVLconst [c])) 13877 // cond: 13878 // result: (SUBLconst x [c]) 13879 for { 13880 _ = v.Args[1] 13881 x := v.Args[0] 13882 v_1 := v.Args[1] 13883 if v_1.Op != Op386MOVLconst { 13884 break 13885 } 13886 c := v_1.AuxInt 13887 v.reset(Op386SUBLconst) 13888 v.AuxInt = c 13889 v.AddArg(x) 13890 return true 13891 } 13892 // match: (SUBL (MOVLconst [c]) x) 13893 // cond: 13894 // result: (NEGL (SUBLconst <v.Type> x [c])) 13895 for { 13896 _ = v.Args[1] 13897 v_0 := v.Args[0] 13898 if v_0.Op != Op386MOVLconst { 13899 break 13900 } 13901 c := v_0.AuxInt 13902 x := v.Args[1] 13903 v.reset(Op386NEGL) 13904 v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) 13905 v0.AuxInt = c 13906 v0.AddArg(x) 13907 v.AddArg(v0) 13908 return true 13909 } 13910 // match: (SUBL x x) 13911 // cond: 13912 // result: (MOVLconst [0]) 13913 for { 13914 _ = v.Args[1] 13915 x := v.Args[0] 13916 if x != v.Args[1] { 13917 break 13918 } 13919 v.reset(Op386MOVLconst) 13920 v.AuxInt = 0 13921 return true 13922 } 13923 return false 13924 } 13925 func rewriteValue386_Op386SUBLcarry_0(v *Value) bool { 13926 // match: (SUBLcarry x (MOVLconst [c])) 13927 // cond: 13928 // result: (SUBLconstcarry [c] x) 13929 for { 13930 _ = v.Args[1] 13931 x := v.Args[0] 13932 v_1 := v.Args[1] 13933 if v_1.Op != Op386MOVLconst { 13934 break 13935 } 13936 c := v_1.AuxInt 13937 v.reset(Op386SUBLconstcarry) 13938 v.AuxInt = c 13939 v.AddArg(x) 13940 return true 13941 } 13942 return false 13943 } 13944 func rewriteValue386_Op386SUBLconst_0(v *Value) bool { 13945 // match: (SUBLconst [c] x) 13946 // cond: int32(c) == 0 13947 // result: x 13948 for { 13949 c := v.AuxInt 13950 x := v.Args[0] 13951 if !(int32(c) == 0) { 13952 break 13953 } 13954 v.reset(OpCopy) 13955 v.Type = x.Type 13956 v.AddArg(x) 13957 return true 13958 } 13959 // match: (SUBLconst [c] x) 13960 // cond: 13961 // result: (ADDLconst [int64(int32(-c))] x) 13962 for { 13963 c := v.AuxInt 13964 x := v.Args[0] 13965 v.reset(Op386ADDLconst) 13966 v.AuxInt = int64(int32(-c)) 13967 v.AddArg(x) 13968 return true 13969 } 13970 } 13971 func rewriteValue386_Op386XORL_0(v *Value) bool { 13972 // match: (XORL x (MOVLconst [c])) 13973 // cond: 13974 // result: (XORLconst [c] x) 13975 for { 13976 _ = v.Args[1] 13977 x := v.Args[0] 13978 v_1 := v.Args[1] 13979 if v_1.Op != Op386MOVLconst { 13980 break 13981 } 13982 c := v_1.AuxInt 13983 v.reset(Op386XORLconst) 13984 v.AuxInt = c 13985 v.AddArg(x) 13986 return true 13987 } 13988 // match: (XORL (MOVLconst [c]) x) 13989 // cond: 13990 // result: (XORLconst [c] x) 13991 for { 13992 _ = v.Args[1] 13993 v_0 := v.Args[0] 13994 if v_0.Op != Op386MOVLconst { 13995 break 13996 } 13997 c := v_0.AuxInt 13998 x := v.Args[1] 13999 v.reset(Op386XORLconst) 14000 v.AuxInt = c 14001 v.AddArg(x) 14002 return true 14003 } 14004 // match: (XORL (SHLLconst [c] x) (SHRLconst [d] x)) 14005 // cond: d == 32-c 14006 // result: (ROLLconst [c] x) 14007 for { 14008 _ = v.Args[1] 14009 v_0 := v.Args[0] 14010 if v_0.Op != Op386SHLLconst { 14011 break 14012 } 14013 c := v_0.AuxInt 14014 x := v_0.Args[0] 14015 v_1 := v.Args[1] 14016 if v_1.Op != Op386SHRLconst { 14017 break 14018 } 14019 d := v_1.AuxInt 14020 if x != v_1.Args[0] { 14021 break 14022 } 14023 if !(d == 32-c) { 14024 break 14025 } 14026 v.reset(Op386ROLLconst) 14027 v.AuxInt = c 14028 v.AddArg(x) 14029 return true 14030 } 14031 // match: (XORL (SHRLconst [d] x) (SHLLconst [c] x)) 14032 // cond: d == 32-c 14033 // result: (ROLLconst [c] x) 14034 for { 14035 _ = v.Args[1] 14036 v_0 := v.Args[0] 14037 if v_0.Op != Op386SHRLconst { 14038 break 14039 } 14040 d := v_0.AuxInt 14041 x := v_0.Args[0] 14042 v_1 := v.Args[1] 14043 if v_1.Op != Op386SHLLconst { 14044 break 14045 } 14046 c := v_1.AuxInt 14047 if x != v_1.Args[0] { 14048 break 14049 } 14050 if !(d == 32-c) { 14051 break 14052 } 14053 v.reset(Op386ROLLconst) 14054 v.AuxInt = c 14055 v.AddArg(x) 14056 return true 14057 } 14058 // match: (XORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 14059 // cond: c < 16 && d == 16-c && t.Size() == 2 14060 // result: (ROLWconst x [c]) 14061 for { 14062 t := v.Type 14063 _ = v.Args[1] 14064 v_0 := v.Args[0] 14065 if v_0.Op != Op386SHLLconst { 14066 break 14067 } 14068 c := v_0.AuxInt 14069 x := v_0.Args[0] 14070 v_1 := v.Args[1] 14071 if v_1.Op != Op386SHRWconst { 14072 break 14073 } 14074 d := v_1.AuxInt 14075 if x != v_1.Args[0] { 14076 break 14077 } 14078 if !(c < 16 && d == 16-c && t.Size() == 2) { 14079 break 14080 } 14081 v.reset(Op386ROLWconst) 14082 v.AuxInt = c 14083 v.AddArg(x) 14084 return true 14085 } 14086 // match: (XORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 14087 // cond: c < 16 && d == 16-c && t.Size() == 2 14088 // result: (ROLWconst x [c]) 14089 for { 14090 t := v.Type 14091 _ = v.Args[1] 14092 v_0 := v.Args[0] 14093 if v_0.Op != Op386SHRWconst { 14094 break 14095 } 14096 d := v_0.AuxInt 14097 x := v_0.Args[0] 14098 v_1 := v.Args[1] 14099 if v_1.Op != Op386SHLLconst { 14100 break 14101 } 14102 c := v_1.AuxInt 14103 if x != v_1.Args[0] { 14104 break 14105 } 14106 if !(c < 16 && d == 16-c && t.Size() == 2) { 14107 break 14108 } 14109 v.reset(Op386ROLWconst) 14110 v.AuxInt = c 14111 v.AddArg(x) 14112 return true 14113 } 14114 // match: (XORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 14115 // cond: c < 8 && d == 8-c && t.Size() == 1 14116 // result: (ROLBconst x [c]) 14117 for { 14118 t := v.Type 14119 _ = v.Args[1] 14120 v_0 := v.Args[0] 14121 if v_0.Op != Op386SHLLconst { 14122 break 14123 } 14124 c := v_0.AuxInt 14125 x := v_0.Args[0] 14126 v_1 := v.Args[1] 14127 if v_1.Op != Op386SHRBconst { 14128 break 14129 } 14130 d := v_1.AuxInt 14131 if x != v_1.Args[0] { 14132 break 14133 } 14134 if !(c < 8 && d == 8-c && t.Size() == 1) { 14135 break 14136 } 14137 v.reset(Op386ROLBconst) 14138 v.AuxInt = c 14139 v.AddArg(x) 14140 return true 14141 } 14142 // match: (XORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 14143 // cond: c < 8 && d == 8-c && t.Size() == 1 14144 // result: (ROLBconst x [c]) 14145 for { 14146 t := v.Type 14147 _ = v.Args[1] 14148 v_0 := v.Args[0] 14149 if v_0.Op != Op386SHRBconst { 14150 break 14151 } 14152 d := v_0.AuxInt 14153 x := v_0.Args[0] 14154 v_1 := v.Args[1] 14155 if v_1.Op != Op386SHLLconst { 14156 break 14157 } 14158 c := v_1.AuxInt 14159 if x != v_1.Args[0] { 14160 break 14161 } 14162 if !(c < 8 && d == 8-c && t.Size() == 1) { 14163 break 14164 } 14165 v.reset(Op386ROLBconst) 14166 v.AuxInt = c 14167 v.AddArg(x) 14168 return true 14169 } 14170 // match: (XORL x x) 14171 // cond: 14172 // result: (MOVLconst [0]) 14173 for { 14174 _ = v.Args[1] 14175 x := v.Args[0] 14176 if x != v.Args[1] { 14177 break 14178 } 14179 v.reset(Op386MOVLconst) 14180 v.AuxInt = 0 14181 return true 14182 } 14183 return false 14184 } 14185 func rewriteValue386_Op386XORLconst_0(v *Value) bool { 14186 // match: (XORLconst [c] (XORLconst [d] x)) 14187 // cond: 14188 // result: (XORLconst [c ^ d] x) 14189 for { 14190 c := v.AuxInt 14191 v_0 := v.Args[0] 14192 if v_0.Op != Op386XORLconst { 14193 break 14194 } 14195 d := v_0.AuxInt 14196 x := v_0.Args[0] 14197 v.reset(Op386XORLconst) 14198 v.AuxInt = c ^ d 14199 v.AddArg(x) 14200 return true 14201 } 14202 // match: (XORLconst [c] x) 14203 // cond: int32(c)==0 14204 // result: x 14205 for { 14206 c := v.AuxInt 14207 x := v.Args[0] 14208 if !(int32(c) == 0) { 14209 break 14210 } 14211 v.reset(OpCopy) 14212 v.Type = x.Type 14213 v.AddArg(x) 14214 return true 14215 } 14216 // match: (XORLconst [c] (MOVLconst [d])) 14217 // cond: 14218 // result: (MOVLconst [c^d]) 14219 for { 14220 c := v.AuxInt 14221 v_0 := v.Args[0] 14222 if v_0.Op != Op386MOVLconst { 14223 break 14224 } 14225 d := v_0.AuxInt 14226 v.reset(Op386MOVLconst) 14227 v.AuxInt = c ^ d 14228 return true 14229 } 14230 return false 14231 } 14232 func rewriteValue386_OpAdd16_0(v *Value) bool { 14233 // match: (Add16 x y) 14234 // cond: 14235 // result: (ADDL x y) 14236 for { 14237 _ = v.Args[1] 14238 x := v.Args[0] 14239 y := v.Args[1] 14240 v.reset(Op386ADDL) 14241 v.AddArg(x) 14242 v.AddArg(y) 14243 return true 14244 } 14245 } 14246 func rewriteValue386_OpAdd32_0(v *Value) bool { 14247 // match: (Add32 x y) 14248 // cond: 14249 // result: (ADDL x y) 14250 for { 14251 _ = v.Args[1] 14252 x := v.Args[0] 14253 y := v.Args[1] 14254 v.reset(Op386ADDL) 14255 v.AddArg(x) 14256 v.AddArg(y) 14257 return true 14258 } 14259 } 14260 func rewriteValue386_OpAdd32F_0(v *Value) bool { 14261 // match: (Add32F x y) 14262 // cond: 14263 // result: (ADDSS x y) 14264 for { 14265 _ = v.Args[1] 14266 x := v.Args[0] 14267 y := v.Args[1] 14268 v.reset(Op386ADDSS) 14269 v.AddArg(x) 14270 v.AddArg(y) 14271 return true 14272 } 14273 } 14274 func rewriteValue386_OpAdd32carry_0(v *Value) bool { 14275 // match: (Add32carry x y) 14276 // cond: 14277 // result: (ADDLcarry x y) 14278 for { 14279 _ = v.Args[1] 14280 x := v.Args[0] 14281 y := v.Args[1] 14282 v.reset(Op386ADDLcarry) 14283 v.AddArg(x) 14284 v.AddArg(y) 14285 return true 14286 } 14287 } 14288 func rewriteValue386_OpAdd32withcarry_0(v *Value) bool { 14289 // match: (Add32withcarry x y c) 14290 // cond: 14291 // result: (ADCL x y c) 14292 for { 14293 _ = v.Args[2] 14294 x := v.Args[0] 14295 y := v.Args[1] 14296 c := v.Args[2] 14297 v.reset(Op386ADCL) 14298 v.AddArg(x) 14299 v.AddArg(y) 14300 v.AddArg(c) 14301 return true 14302 } 14303 } 14304 func rewriteValue386_OpAdd64F_0(v *Value) bool { 14305 // match: (Add64F x y) 14306 // cond: 14307 // result: (ADDSD x y) 14308 for { 14309 _ = v.Args[1] 14310 x := v.Args[0] 14311 y := v.Args[1] 14312 v.reset(Op386ADDSD) 14313 v.AddArg(x) 14314 v.AddArg(y) 14315 return true 14316 } 14317 } 14318 func rewriteValue386_OpAdd8_0(v *Value) bool { 14319 // match: (Add8 x y) 14320 // cond: 14321 // result: (ADDL x y) 14322 for { 14323 _ = v.Args[1] 14324 x := v.Args[0] 14325 y := v.Args[1] 14326 v.reset(Op386ADDL) 14327 v.AddArg(x) 14328 v.AddArg(y) 14329 return true 14330 } 14331 } 14332 func rewriteValue386_OpAddPtr_0(v *Value) bool { 14333 // match: (AddPtr x y) 14334 // cond: 14335 // result: (ADDL x y) 14336 for { 14337 _ = v.Args[1] 14338 x := v.Args[0] 14339 y := v.Args[1] 14340 v.reset(Op386ADDL) 14341 v.AddArg(x) 14342 v.AddArg(y) 14343 return true 14344 } 14345 } 14346 func rewriteValue386_OpAddr_0(v *Value) bool { 14347 // match: (Addr {sym} base) 14348 // cond: 14349 // result: (LEAL {sym} base) 14350 for { 14351 sym := v.Aux 14352 base := v.Args[0] 14353 v.reset(Op386LEAL) 14354 v.Aux = sym 14355 v.AddArg(base) 14356 return true 14357 } 14358 } 14359 func rewriteValue386_OpAnd16_0(v *Value) bool { 14360 // match: (And16 x y) 14361 // cond: 14362 // result: (ANDL x y) 14363 for { 14364 _ = v.Args[1] 14365 x := v.Args[0] 14366 y := v.Args[1] 14367 v.reset(Op386ANDL) 14368 v.AddArg(x) 14369 v.AddArg(y) 14370 return true 14371 } 14372 } 14373 func rewriteValue386_OpAnd32_0(v *Value) bool { 14374 // match: (And32 x y) 14375 // cond: 14376 // result: (ANDL x y) 14377 for { 14378 _ = v.Args[1] 14379 x := v.Args[0] 14380 y := v.Args[1] 14381 v.reset(Op386ANDL) 14382 v.AddArg(x) 14383 v.AddArg(y) 14384 return true 14385 } 14386 } 14387 func rewriteValue386_OpAnd8_0(v *Value) bool { 14388 // match: (And8 x y) 14389 // cond: 14390 // result: (ANDL x y) 14391 for { 14392 _ = v.Args[1] 14393 x := v.Args[0] 14394 y := v.Args[1] 14395 v.reset(Op386ANDL) 14396 v.AddArg(x) 14397 v.AddArg(y) 14398 return true 14399 } 14400 } 14401 func rewriteValue386_OpAndB_0(v *Value) bool { 14402 // match: (AndB x y) 14403 // cond: 14404 // result: (ANDL x y) 14405 for { 14406 _ = v.Args[1] 14407 x := v.Args[0] 14408 y := v.Args[1] 14409 v.reset(Op386ANDL) 14410 v.AddArg(x) 14411 v.AddArg(y) 14412 return true 14413 } 14414 } 14415 func rewriteValue386_OpAvg32u_0(v *Value) bool { 14416 // match: (Avg32u x y) 14417 // cond: 14418 // result: (AVGLU x y) 14419 for { 14420 _ = v.Args[1] 14421 x := v.Args[0] 14422 y := v.Args[1] 14423 v.reset(Op386AVGLU) 14424 v.AddArg(x) 14425 v.AddArg(y) 14426 return true 14427 } 14428 } 14429 func rewriteValue386_OpBswap32_0(v *Value) bool { 14430 // match: (Bswap32 x) 14431 // cond: 14432 // result: (BSWAPL x) 14433 for { 14434 x := v.Args[0] 14435 v.reset(Op386BSWAPL) 14436 v.AddArg(x) 14437 return true 14438 } 14439 } 14440 func rewriteValue386_OpClosureCall_0(v *Value) bool { 14441 // match: (ClosureCall [argwid] entry closure mem) 14442 // cond: 14443 // result: (CALLclosure [argwid] entry closure mem) 14444 for { 14445 argwid := v.AuxInt 14446 _ = v.Args[2] 14447 entry := v.Args[0] 14448 closure := v.Args[1] 14449 mem := v.Args[2] 14450 v.reset(Op386CALLclosure) 14451 v.AuxInt = argwid 14452 v.AddArg(entry) 14453 v.AddArg(closure) 14454 v.AddArg(mem) 14455 return true 14456 } 14457 } 14458 func rewriteValue386_OpCom16_0(v *Value) bool { 14459 // match: (Com16 x) 14460 // cond: 14461 // result: (NOTL x) 14462 for { 14463 x := v.Args[0] 14464 v.reset(Op386NOTL) 14465 v.AddArg(x) 14466 return true 14467 } 14468 } 14469 func rewriteValue386_OpCom32_0(v *Value) bool { 14470 // match: (Com32 x) 14471 // cond: 14472 // result: (NOTL x) 14473 for { 14474 x := v.Args[0] 14475 v.reset(Op386NOTL) 14476 v.AddArg(x) 14477 return true 14478 } 14479 } 14480 func rewriteValue386_OpCom8_0(v *Value) bool { 14481 // match: (Com8 x) 14482 // cond: 14483 // result: (NOTL x) 14484 for { 14485 x := v.Args[0] 14486 v.reset(Op386NOTL) 14487 v.AddArg(x) 14488 return true 14489 } 14490 } 14491 func rewriteValue386_OpConst16_0(v *Value) bool { 14492 // match: (Const16 [val]) 14493 // cond: 14494 // result: (MOVLconst [val]) 14495 for { 14496 val := v.AuxInt 14497 v.reset(Op386MOVLconst) 14498 v.AuxInt = val 14499 return true 14500 } 14501 } 14502 func rewriteValue386_OpConst32_0(v *Value) bool { 14503 // match: (Const32 [val]) 14504 // cond: 14505 // result: (MOVLconst [val]) 14506 for { 14507 val := v.AuxInt 14508 v.reset(Op386MOVLconst) 14509 v.AuxInt = val 14510 return true 14511 } 14512 } 14513 func rewriteValue386_OpConst32F_0(v *Value) bool { 14514 // match: (Const32F [val]) 14515 // cond: 14516 // result: (MOVSSconst [val]) 14517 for { 14518 val := v.AuxInt 14519 v.reset(Op386MOVSSconst) 14520 v.AuxInt = val 14521 return true 14522 } 14523 } 14524 func rewriteValue386_OpConst64F_0(v *Value) bool { 14525 // match: (Const64F [val]) 14526 // cond: 14527 // result: (MOVSDconst [val]) 14528 for { 14529 val := v.AuxInt 14530 v.reset(Op386MOVSDconst) 14531 v.AuxInt = val 14532 return true 14533 } 14534 } 14535 func rewriteValue386_OpConst8_0(v *Value) bool { 14536 // match: (Const8 [val]) 14537 // cond: 14538 // result: (MOVLconst [val]) 14539 for { 14540 val := v.AuxInt 14541 v.reset(Op386MOVLconst) 14542 v.AuxInt = val 14543 return true 14544 } 14545 } 14546 func rewriteValue386_OpConstBool_0(v *Value) bool { 14547 // match: (ConstBool [b]) 14548 // cond: 14549 // result: (MOVLconst [b]) 14550 for { 14551 b := v.AuxInt 14552 v.reset(Op386MOVLconst) 14553 v.AuxInt = b 14554 return true 14555 } 14556 } 14557 func rewriteValue386_OpConstNil_0(v *Value) bool { 14558 // match: (ConstNil) 14559 // cond: 14560 // result: (MOVLconst [0]) 14561 for { 14562 v.reset(Op386MOVLconst) 14563 v.AuxInt = 0 14564 return true 14565 } 14566 } 14567 func rewriteValue386_OpConvert_0(v *Value) bool { 14568 // match: (Convert <t> x mem) 14569 // cond: 14570 // result: (MOVLconvert <t> x mem) 14571 for { 14572 t := v.Type 14573 _ = v.Args[1] 14574 x := v.Args[0] 14575 mem := v.Args[1] 14576 v.reset(Op386MOVLconvert) 14577 v.Type = t 14578 v.AddArg(x) 14579 v.AddArg(mem) 14580 return true 14581 } 14582 } 14583 func rewriteValue386_OpCvt32Fto32_0(v *Value) bool { 14584 // match: (Cvt32Fto32 x) 14585 // cond: 14586 // result: (CVTTSS2SL x) 14587 for { 14588 x := v.Args[0] 14589 v.reset(Op386CVTTSS2SL) 14590 v.AddArg(x) 14591 return true 14592 } 14593 } 14594 func rewriteValue386_OpCvt32Fto64F_0(v *Value) bool { 14595 // match: (Cvt32Fto64F x) 14596 // cond: 14597 // result: (CVTSS2SD x) 14598 for { 14599 x := v.Args[0] 14600 v.reset(Op386CVTSS2SD) 14601 v.AddArg(x) 14602 return true 14603 } 14604 } 14605 func rewriteValue386_OpCvt32to32F_0(v *Value) bool { 14606 // match: (Cvt32to32F x) 14607 // cond: 14608 // result: (CVTSL2SS x) 14609 for { 14610 x := v.Args[0] 14611 v.reset(Op386CVTSL2SS) 14612 v.AddArg(x) 14613 return true 14614 } 14615 } 14616 func rewriteValue386_OpCvt32to64F_0(v *Value) bool { 14617 // match: (Cvt32to64F x) 14618 // cond: 14619 // result: (CVTSL2SD x) 14620 for { 14621 x := v.Args[0] 14622 v.reset(Op386CVTSL2SD) 14623 v.AddArg(x) 14624 return true 14625 } 14626 } 14627 func rewriteValue386_OpCvt64Fto32_0(v *Value) bool { 14628 // match: (Cvt64Fto32 x) 14629 // cond: 14630 // result: (CVTTSD2SL x) 14631 for { 14632 x := v.Args[0] 14633 v.reset(Op386CVTTSD2SL) 14634 v.AddArg(x) 14635 return true 14636 } 14637 } 14638 func rewriteValue386_OpCvt64Fto32F_0(v *Value) bool { 14639 // match: (Cvt64Fto32F x) 14640 // cond: 14641 // result: (CVTSD2SS x) 14642 for { 14643 x := v.Args[0] 14644 v.reset(Op386CVTSD2SS) 14645 v.AddArg(x) 14646 return true 14647 } 14648 } 14649 func rewriteValue386_OpDiv16_0(v *Value) bool { 14650 // match: (Div16 x y) 14651 // cond: 14652 // result: (DIVW x y) 14653 for { 14654 _ = v.Args[1] 14655 x := v.Args[0] 14656 y := v.Args[1] 14657 v.reset(Op386DIVW) 14658 v.AddArg(x) 14659 v.AddArg(y) 14660 return true 14661 } 14662 } 14663 func rewriteValue386_OpDiv16u_0(v *Value) bool { 14664 // match: (Div16u x y) 14665 // cond: 14666 // result: (DIVWU x y) 14667 for { 14668 _ = v.Args[1] 14669 x := v.Args[0] 14670 y := v.Args[1] 14671 v.reset(Op386DIVWU) 14672 v.AddArg(x) 14673 v.AddArg(y) 14674 return true 14675 } 14676 } 14677 func rewriteValue386_OpDiv32_0(v *Value) bool { 14678 // match: (Div32 x y) 14679 // cond: 14680 // result: (DIVL x y) 14681 for { 14682 _ = v.Args[1] 14683 x := v.Args[0] 14684 y := v.Args[1] 14685 v.reset(Op386DIVL) 14686 v.AddArg(x) 14687 v.AddArg(y) 14688 return true 14689 } 14690 } 14691 func rewriteValue386_OpDiv32F_0(v *Value) bool { 14692 // match: (Div32F x y) 14693 // cond: 14694 // result: (DIVSS x y) 14695 for { 14696 _ = v.Args[1] 14697 x := v.Args[0] 14698 y := v.Args[1] 14699 v.reset(Op386DIVSS) 14700 v.AddArg(x) 14701 v.AddArg(y) 14702 return true 14703 } 14704 } 14705 func rewriteValue386_OpDiv32u_0(v *Value) bool { 14706 // match: (Div32u x y) 14707 // cond: 14708 // result: (DIVLU x y) 14709 for { 14710 _ = v.Args[1] 14711 x := v.Args[0] 14712 y := v.Args[1] 14713 v.reset(Op386DIVLU) 14714 v.AddArg(x) 14715 v.AddArg(y) 14716 return true 14717 } 14718 } 14719 func rewriteValue386_OpDiv64F_0(v *Value) bool { 14720 // match: (Div64F x y) 14721 // cond: 14722 // result: (DIVSD x y) 14723 for { 14724 _ = v.Args[1] 14725 x := v.Args[0] 14726 y := v.Args[1] 14727 v.reset(Op386DIVSD) 14728 v.AddArg(x) 14729 v.AddArg(y) 14730 return true 14731 } 14732 } 14733 func rewriteValue386_OpDiv8_0(v *Value) bool { 14734 b := v.Block 14735 _ = b 14736 typ := &b.Func.Config.Types 14737 _ = typ 14738 // match: (Div8 x y) 14739 // cond: 14740 // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) 14741 for { 14742 _ = v.Args[1] 14743 x := v.Args[0] 14744 y := v.Args[1] 14745 v.reset(Op386DIVW) 14746 v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 14747 v0.AddArg(x) 14748 v.AddArg(v0) 14749 v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 14750 v1.AddArg(y) 14751 v.AddArg(v1) 14752 return true 14753 } 14754 } 14755 func rewriteValue386_OpDiv8u_0(v *Value) bool { 14756 b := v.Block 14757 _ = b 14758 typ := &b.Func.Config.Types 14759 _ = typ 14760 // match: (Div8u x y) 14761 // cond: 14762 // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 14763 for { 14764 _ = v.Args[1] 14765 x := v.Args[0] 14766 y := v.Args[1] 14767 v.reset(Op386DIVWU) 14768 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 14769 v0.AddArg(x) 14770 v.AddArg(v0) 14771 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 14772 v1.AddArg(y) 14773 v.AddArg(v1) 14774 return true 14775 } 14776 } 14777 func rewriteValue386_OpEq16_0(v *Value) bool { 14778 b := v.Block 14779 _ = b 14780 // match: (Eq16 x y) 14781 // cond: 14782 // result: (SETEQ (CMPW x y)) 14783 for { 14784 _ = v.Args[1] 14785 x := v.Args[0] 14786 y := v.Args[1] 14787 v.reset(Op386SETEQ) 14788 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 14789 v0.AddArg(x) 14790 v0.AddArg(y) 14791 v.AddArg(v0) 14792 return true 14793 } 14794 } 14795 func rewriteValue386_OpEq32_0(v *Value) bool { 14796 b := v.Block 14797 _ = b 14798 // match: (Eq32 x y) 14799 // cond: 14800 // result: (SETEQ (CMPL x y)) 14801 for { 14802 _ = v.Args[1] 14803 x := v.Args[0] 14804 y := v.Args[1] 14805 v.reset(Op386SETEQ) 14806 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14807 v0.AddArg(x) 14808 v0.AddArg(y) 14809 v.AddArg(v0) 14810 return true 14811 } 14812 } 14813 func rewriteValue386_OpEq32F_0(v *Value) bool { 14814 b := v.Block 14815 _ = b 14816 // match: (Eq32F x y) 14817 // cond: 14818 // result: (SETEQF (UCOMISS x y)) 14819 for { 14820 _ = v.Args[1] 14821 x := v.Args[0] 14822 y := v.Args[1] 14823 v.reset(Op386SETEQF) 14824 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 14825 v0.AddArg(x) 14826 v0.AddArg(y) 14827 v.AddArg(v0) 14828 return true 14829 } 14830 } 14831 func rewriteValue386_OpEq64F_0(v *Value) bool { 14832 b := v.Block 14833 _ = b 14834 // match: (Eq64F x y) 14835 // cond: 14836 // result: (SETEQF (UCOMISD x y)) 14837 for { 14838 _ = v.Args[1] 14839 x := v.Args[0] 14840 y := v.Args[1] 14841 v.reset(Op386SETEQF) 14842 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 14843 v0.AddArg(x) 14844 v0.AddArg(y) 14845 v.AddArg(v0) 14846 return true 14847 } 14848 } 14849 func rewriteValue386_OpEq8_0(v *Value) bool { 14850 b := v.Block 14851 _ = b 14852 // match: (Eq8 x y) 14853 // cond: 14854 // result: (SETEQ (CMPB x y)) 14855 for { 14856 _ = v.Args[1] 14857 x := v.Args[0] 14858 y := v.Args[1] 14859 v.reset(Op386SETEQ) 14860 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 14861 v0.AddArg(x) 14862 v0.AddArg(y) 14863 v.AddArg(v0) 14864 return true 14865 } 14866 } 14867 func rewriteValue386_OpEqB_0(v *Value) bool { 14868 b := v.Block 14869 _ = b 14870 // match: (EqB x y) 14871 // cond: 14872 // result: (SETEQ (CMPB x y)) 14873 for { 14874 _ = v.Args[1] 14875 x := v.Args[0] 14876 y := v.Args[1] 14877 v.reset(Op386SETEQ) 14878 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 14879 v0.AddArg(x) 14880 v0.AddArg(y) 14881 v.AddArg(v0) 14882 return true 14883 } 14884 } 14885 func rewriteValue386_OpEqPtr_0(v *Value) bool { 14886 b := v.Block 14887 _ = b 14888 // match: (EqPtr x y) 14889 // cond: 14890 // result: (SETEQ (CMPL x y)) 14891 for { 14892 _ = v.Args[1] 14893 x := v.Args[0] 14894 y := v.Args[1] 14895 v.reset(Op386SETEQ) 14896 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14897 v0.AddArg(x) 14898 v0.AddArg(y) 14899 v.AddArg(v0) 14900 return true 14901 } 14902 } 14903 func rewriteValue386_OpGeq16_0(v *Value) bool { 14904 b := v.Block 14905 _ = b 14906 // match: (Geq16 x y) 14907 // cond: 14908 // result: (SETGE (CMPW x y)) 14909 for { 14910 _ = v.Args[1] 14911 x := v.Args[0] 14912 y := v.Args[1] 14913 v.reset(Op386SETGE) 14914 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 14915 v0.AddArg(x) 14916 v0.AddArg(y) 14917 v.AddArg(v0) 14918 return true 14919 } 14920 } 14921 func rewriteValue386_OpGeq16U_0(v *Value) bool { 14922 b := v.Block 14923 _ = b 14924 // match: (Geq16U x y) 14925 // cond: 14926 // result: (SETAE (CMPW x y)) 14927 for { 14928 _ = v.Args[1] 14929 x := v.Args[0] 14930 y := v.Args[1] 14931 v.reset(Op386SETAE) 14932 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 14933 v0.AddArg(x) 14934 v0.AddArg(y) 14935 v.AddArg(v0) 14936 return true 14937 } 14938 } 14939 func rewriteValue386_OpGeq32_0(v *Value) bool { 14940 b := v.Block 14941 _ = b 14942 // match: (Geq32 x y) 14943 // cond: 14944 // result: (SETGE (CMPL x y)) 14945 for { 14946 _ = v.Args[1] 14947 x := v.Args[0] 14948 y := v.Args[1] 14949 v.reset(Op386SETGE) 14950 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14951 v0.AddArg(x) 14952 v0.AddArg(y) 14953 v.AddArg(v0) 14954 return true 14955 } 14956 } 14957 func rewriteValue386_OpGeq32F_0(v *Value) bool { 14958 b := v.Block 14959 _ = b 14960 // match: (Geq32F x y) 14961 // cond: 14962 // result: (SETGEF (UCOMISS x y)) 14963 for { 14964 _ = v.Args[1] 14965 x := v.Args[0] 14966 y := v.Args[1] 14967 v.reset(Op386SETGEF) 14968 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 14969 v0.AddArg(x) 14970 v0.AddArg(y) 14971 v.AddArg(v0) 14972 return true 14973 } 14974 } 14975 func rewriteValue386_OpGeq32U_0(v *Value) bool { 14976 b := v.Block 14977 _ = b 14978 // match: (Geq32U x y) 14979 // cond: 14980 // result: (SETAE (CMPL x y)) 14981 for { 14982 _ = v.Args[1] 14983 x := v.Args[0] 14984 y := v.Args[1] 14985 v.reset(Op386SETAE) 14986 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 14987 v0.AddArg(x) 14988 v0.AddArg(y) 14989 v.AddArg(v0) 14990 return true 14991 } 14992 } 14993 func rewriteValue386_OpGeq64F_0(v *Value) bool { 14994 b := v.Block 14995 _ = b 14996 // match: (Geq64F x y) 14997 // cond: 14998 // result: (SETGEF (UCOMISD x y)) 14999 for { 15000 _ = v.Args[1] 15001 x := v.Args[0] 15002 y := v.Args[1] 15003 v.reset(Op386SETGEF) 15004 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15005 v0.AddArg(x) 15006 v0.AddArg(y) 15007 v.AddArg(v0) 15008 return true 15009 } 15010 } 15011 func rewriteValue386_OpGeq8_0(v *Value) bool { 15012 b := v.Block 15013 _ = b 15014 // match: (Geq8 x y) 15015 // cond: 15016 // result: (SETGE (CMPB x y)) 15017 for { 15018 _ = v.Args[1] 15019 x := v.Args[0] 15020 y := v.Args[1] 15021 v.reset(Op386SETGE) 15022 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15023 v0.AddArg(x) 15024 v0.AddArg(y) 15025 v.AddArg(v0) 15026 return true 15027 } 15028 } 15029 func rewriteValue386_OpGeq8U_0(v *Value) bool { 15030 b := v.Block 15031 _ = b 15032 // match: (Geq8U x y) 15033 // cond: 15034 // result: (SETAE (CMPB x y)) 15035 for { 15036 _ = v.Args[1] 15037 x := v.Args[0] 15038 y := v.Args[1] 15039 v.reset(Op386SETAE) 15040 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15041 v0.AddArg(x) 15042 v0.AddArg(y) 15043 v.AddArg(v0) 15044 return true 15045 } 15046 } 15047 func rewriteValue386_OpGetCallerPC_0(v *Value) bool { 15048 // match: (GetCallerPC) 15049 // cond: 15050 // result: (LoweredGetCallerPC) 15051 for { 15052 v.reset(Op386LoweredGetCallerPC) 15053 return true 15054 } 15055 } 15056 func rewriteValue386_OpGetCallerSP_0(v *Value) bool { 15057 // match: (GetCallerSP) 15058 // cond: 15059 // result: (LoweredGetCallerSP) 15060 for { 15061 v.reset(Op386LoweredGetCallerSP) 15062 return true 15063 } 15064 } 15065 func rewriteValue386_OpGetClosurePtr_0(v *Value) bool { 15066 // match: (GetClosurePtr) 15067 // cond: 15068 // result: (LoweredGetClosurePtr) 15069 for { 15070 v.reset(Op386LoweredGetClosurePtr) 15071 return true 15072 } 15073 } 15074 func rewriteValue386_OpGetG_0(v *Value) bool { 15075 // match: (GetG mem) 15076 // cond: 15077 // result: (LoweredGetG mem) 15078 for { 15079 mem := v.Args[0] 15080 v.reset(Op386LoweredGetG) 15081 v.AddArg(mem) 15082 return true 15083 } 15084 } 15085 func rewriteValue386_OpGreater16_0(v *Value) bool { 15086 b := v.Block 15087 _ = b 15088 // match: (Greater16 x y) 15089 // cond: 15090 // result: (SETG (CMPW x y)) 15091 for { 15092 _ = v.Args[1] 15093 x := v.Args[0] 15094 y := v.Args[1] 15095 v.reset(Op386SETG) 15096 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15097 v0.AddArg(x) 15098 v0.AddArg(y) 15099 v.AddArg(v0) 15100 return true 15101 } 15102 } 15103 func rewriteValue386_OpGreater16U_0(v *Value) bool { 15104 b := v.Block 15105 _ = b 15106 // match: (Greater16U x y) 15107 // cond: 15108 // result: (SETA (CMPW x y)) 15109 for { 15110 _ = v.Args[1] 15111 x := v.Args[0] 15112 y := v.Args[1] 15113 v.reset(Op386SETA) 15114 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15115 v0.AddArg(x) 15116 v0.AddArg(y) 15117 v.AddArg(v0) 15118 return true 15119 } 15120 } 15121 func rewriteValue386_OpGreater32_0(v *Value) bool { 15122 b := v.Block 15123 _ = b 15124 // match: (Greater32 x y) 15125 // cond: 15126 // result: (SETG (CMPL x y)) 15127 for { 15128 _ = v.Args[1] 15129 x := v.Args[0] 15130 y := v.Args[1] 15131 v.reset(Op386SETG) 15132 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15133 v0.AddArg(x) 15134 v0.AddArg(y) 15135 v.AddArg(v0) 15136 return true 15137 } 15138 } 15139 func rewriteValue386_OpGreater32F_0(v *Value) bool { 15140 b := v.Block 15141 _ = b 15142 // match: (Greater32F x y) 15143 // cond: 15144 // result: (SETGF (UCOMISS x y)) 15145 for { 15146 _ = v.Args[1] 15147 x := v.Args[0] 15148 y := v.Args[1] 15149 v.reset(Op386SETGF) 15150 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 15151 v0.AddArg(x) 15152 v0.AddArg(y) 15153 v.AddArg(v0) 15154 return true 15155 } 15156 } 15157 func rewriteValue386_OpGreater32U_0(v *Value) bool { 15158 b := v.Block 15159 _ = b 15160 // match: (Greater32U x y) 15161 // cond: 15162 // result: (SETA (CMPL x y)) 15163 for { 15164 _ = v.Args[1] 15165 x := v.Args[0] 15166 y := v.Args[1] 15167 v.reset(Op386SETA) 15168 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15169 v0.AddArg(x) 15170 v0.AddArg(y) 15171 v.AddArg(v0) 15172 return true 15173 } 15174 } 15175 func rewriteValue386_OpGreater64F_0(v *Value) bool { 15176 b := v.Block 15177 _ = b 15178 // match: (Greater64F x y) 15179 // cond: 15180 // result: (SETGF (UCOMISD x y)) 15181 for { 15182 _ = v.Args[1] 15183 x := v.Args[0] 15184 y := v.Args[1] 15185 v.reset(Op386SETGF) 15186 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15187 v0.AddArg(x) 15188 v0.AddArg(y) 15189 v.AddArg(v0) 15190 return true 15191 } 15192 } 15193 func rewriteValue386_OpGreater8_0(v *Value) bool { 15194 b := v.Block 15195 _ = b 15196 // match: (Greater8 x y) 15197 // cond: 15198 // result: (SETG (CMPB x y)) 15199 for { 15200 _ = v.Args[1] 15201 x := v.Args[0] 15202 y := v.Args[1] 15203 v.reset(Op386SETG) 15204 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15205 v0.AddArg(x) 15206 v0.AddArg(y) 15207 v.AddArg(v0) 15208 return true 15209 } 15210 } 15211 func rewriteValue386_OpGreater8U_0(v *Value) bool { 15212 b := v.Block 15213 _ = b 15214 // match: (Greater8U x y) 15215 // cond: 15216 // result: (SETA (CMPB x y)) 15217 for { 15218 _ = v.Args[1] 15219 x := v.Args[0] 15220 y := v.Args[1] 15221 v.reset(Op386SETA) 15222 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15223 v0.AddArg(x) 15224 v0.AddArg(y) 15225 v.AddArg(v0) 15226 return true 15227 } 15228 } 15229 func rewriteValue386_OpHmul32_0(v *Value) bool { 15230 // match: (Hmul32 x y) 15231 // cond: 15232 // result: (HMULL x y) 15233 for { 15234 _ = v.Args[1] 15235 x := v.Args[0] 15236 y := v.Args[1] 15237 v.reset(Op386HMULL) 15238 v.AddArg(x) 15239 v.AddArg(y) 15240 return true 15241 } 15242 } 15243 func rewriteValue386_OpHmul32u_0(v *Value) bool { 15244 // match: (Hmul32u x y) 15245 // cond: 15246 // result: (HMULLU x y) 15247 for { 15248 _ = v.Args[1] 15249 x := v.Args[0] 15250 y := v.Args[1] 15251 v.reset(Op386HMULLU) 15252 v.AddArg(x) 15253 v.AddArg(y) 15254 return true 15255 } 15256 } 15257 func rewriteValue386_OpInterCall_0(v *Value) bool { 15258 // match: (InterCall [argwid] entry mem) 15259 // cond: 15260 // result: (CALLinter [argwid] entry mem) 15261 for { 15262 argwid := v.AuxInt 15263 _ = v.Args[1] 15264 entry := v.Args[0] 15265 mem := v.Args[1] 15266 v.reset(Op386CALLinter) 15267 v.AuxInt = argwid 15268 v.AddArg(entry) 15269 v.AddArg(mem) 15270 return true 15271 } 15272 } 15273 func rewriteValue386_OpIsInBounds_0(v *Value) bool { 15274 b := v.Block 15275 _ = b 15276 // match: (IsInBounds idx len) 15277 // cond: 15278 // result: (SETB (CMPL idx len)) 15279 for { 15280 _ = v.Args[1] 15281 idx := v.Args[0] 15282 len := v.Args[1] 15283 v.reset(Op386SETB) 15284 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15285 v0.AddArg(idx) 15286 v0.AddArg(len) 15287 v.AddArg(v0) 15288 return true 15289 } 15290 } 15291 func rewriteValue386_OpIsNonNil_0(v *Value) bool { 15292 b := v.Block 15293 _ = b 15294 // match: (IsNonNil p) 15295 // cond: 15296 // result: (SETNE (TESTL p p)) 15297 for { 15298 p := v.Args[0] 15299 v.reset(Op386SETNE) 15300 v0 := b.NewValue0(v.Pos, Op386TESTL, types.TypeFlags) 15301 v0.AddArg(p) 15302 v0.AddArg(p) 15303 v.AddArg(v0) 15304 return true 15305 } 15306 } 15307 func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { 15308 b := v.Block 15309 _ = b 15310 // match: (IsSliceInBounds idx len) 15311 // cond: 15312 // result: (SETBE (CMPL idx len)) 15313 for { 15314 _ = v.Args[1] 15315 idx := v.Args[0] 15316 len := v.Args[1] 15317 v.reset(Op386SETBE) 15318 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15319 v0.AddArg(idx) 15320 v0.AddArg(len) 15321 v.AddArg(v0) 15322 return true 15323 } 15324 } 15325 func rewriteValue386_OpLeq16_0(v *Value) bool { 15326 b := v.Block 15327 _ = b 15328 // match: (Leq16 x y) 15329 // cond: 15330 // result: (SETLE (CMPW x y)) 15331 for { 15332 _ = v.Args[1] 15333 x := v.Args[0] 15334 y := v.Args[1] 15335 v.reset(Op386SETLE) 15336 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15337 v0.AddArg(x) 15338 v0.AddArg(y) 15339 v.AddArg(v0) 15340 return true 15341 } 15342 } 15343 func rewriteValue386_OpLeq16U_0(v *Value) bool { 15344 b := v.Block 15345 _ = b 15346 // match: (Leq16U x y) 15347 // cond: 15348 // result: (SETBE (CMPW x y)) 15349 for { 15350 _ = v.Args[1] 15351 x := v.Args[0] 15352 y := v.Args[1] 15353 v.reset(Op386SETBE) 15354 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15355 v0.AddArg(x) 15356 v0.AddArg(y) 15357 v.AddArg(v0) 15358 return true 15359 } 15360 } 15361 func rewriteValue386_OpLeq32_0(v *Value) bool { 15362 b := v.Block 15363 _ = b 15364 // match: (Leq32 x y) 15365 // cond: 15366 // result: (SETLE (CMPL x y)) 15367 for { 15368 _ = v.Args[1] 15369 x := v.Args[0] 15370 y := v.Args[1] 15371 v.reset(Op386SETLE) 15372 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15373 v0.AddArg(x) 15374 v0.AddArg(y) 15375 v.AddArg(v0) 15376 return true 15377 } 15378 } 15379 func rewriteValue386_OpLeq32F_0(v *Value) bool { 15380 b := v.Block 15381 _ = b 15382 // match: (Leq32F x y) 15383 // cond: 15384 // result: (SETGEF (UCOMISS y x)) 15385 for { 15386 _ = v.Args[1] 15387 x := v.Args[0] 15388 y := v.Args[1] 15389 v.reset(Op386SETGEF) 15390 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 15391 v0.AddArg(y) 15392 v0.AddArg(x) 15393 v.AddArg(v0) 15394 return true 15395 } 15396 } 15397 func rewriteValue386_OpLeq32U_0(v *Value) bool { 15398 b := v.Block 15399 _ = b 15400 // match: (Leq32U x y) 15401 // cond: 15402 // result: (SETBE (CMPL x y)) 15403 for { 15404 _ = v.Args[1] 15405 x := v.Args[0] 15406 y := v.Args[1] 15407 v.reset(Op386SETBE) 15408 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15409 v0.AddArg(x) 15410 v0.AddArg(y) 15411 v.AddArg(v0) 15412 return true 15413 } 15414 } 15415 func rewriteValue386_OpLeq64F_0(v *Value) bool { 15416 b := v.Block 15417 _ = b 15418 // match: (Leq64F x y) 15419 // cond: 15420 // result: (SETGEF (UCOMISD y x)) 15421 for { 15422 _ = v.Args[1] 15423 x := v.Args[0] 15424 y := v.Args[1] 15425 v.reset(Op386SETGEF) 15426 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15427 v0.AddArg(y) 15428 v0.AddArg(x) 15429 v.AddArg(v0) 15430 return true 15431 } 15432 } 15433 func rewriteValue386_OpLeq8_0(v *Value) bool { 15434 b := v.Block 15435 _ = b 15436 // match: (Leq8 x y) 15437 // cond: 15438 // result: (SETLE (CMPB x y)) 15439 for { 15440 _ = v.Args[1] 15441 x := v.Args[0] 15442 y := v.Args[1] 15443 v.reset(Op386SETLE) 15444 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15445 v0.AddArg(x) 15446 v0.AddArg(y) 15447 v.AddArg(v0) 15448 return true 15449 } 15450 } 15451 func rewriteValue386_OpLeq8U_0(v *Value) bool { 15452 b := v.Block 15453 _ = b 15454 // match: (Leq8U x y) 15455 // cond: 15456 // result: (SETBE (CMPB x y)) 15457 for { 15458 _ = v.Args[1] 15459 x := v.Args[0] 15460 y := v.Args[1] 15461 v.reset(Op386SETBE) 15462 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15463 v0.AddArg(x) 15464 v0.AddArg(y) 15465 v.AddArg(v0) 15466 return true 15467 } 15468 } 15469 func rewriteValue386_OpLess16_0(v *Value) bool { 15470 b := v.Block 15471 _ = b 15472 // match: (Less16 x y) 15473 // cond: 15474 // result: (SETL (CMPW x y)) 15475 for { 15476 _ = v.Args[1] 15477 x := v.Args[0] 15478 y := v.Args[1] 15479 v.reset(Op386SETL) 15480 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15481 v0.AddArg(x) 15482 v0.AddArg(y) 15483 v.AddArg(v0) 15484 return true 15485 } 15486 } 15487 func rewriteValue386_OpLess16U_0(v *Value) bool { 15488 b := v.Block 15489 _ = b 15490 // match: (Less16U x y) 15491 // cond: 15492 // result: (SETB (CMPW x y)) 15493 for { 15494 _ = v.Args[1] 15495 x := v.Args[0] 15496 y := v.Args[1] 15497 v.reset(Op386SETB) 15498 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 15499 v0.AddArg(x) 15500 v0.AddArg(y) 15501 v.AddArg(v0) 15502 return true 15503 } 15504 } 15505 func rewriteValue386_OpLess32_0(v *Value) bool { 15506 b := v.Block 15507 _ = b 15508 // match: (Less32 x y) 15509 // cond: 15510 // result: (SETL (CMPL x y)) 15511 for { 15512 _ = v.Args[1] 15513 x := v.Args[0] 15514 y := v.Args[1] 15515 v.reset(Op386SETL) 15516 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15517 v0.AddArg(x) 15518 v0.AddArg(y) 15519 v.AddArg(v0) 15520 return true 15521 } 15522 } 15523 func rewriteValue386_OpLess32F_0(v *Value) bool { 15524 b := v.Block 15525 _ = b 15526 // match: (Less32F x y) 15527 // cond: 15528 // result: (SETGF (UCOMISS y x)) 15529 for { 15530 _ = v.Args[1] 15531 x := v.Args[0] 15532 y := v.Args[1] 15533 v.reset(Op386SETGF) 15534 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 15535 v0.AddArg(y) 15536 v0.AddArg(x) 15537 v.AddArg(v0) 15538 return true 15539 } 15540 } 15541 func rewriteValue386_OpLess32U_0(v *Value) bool { 15542 b := v.Block 15543 _ = b 15544 // match: (Less32U x y) 15545 // cond: 15546 // result: (SETB (CMPL x y)) 15547 for { 15548 _ = v.Args[1] 15549 x := v.Args[0] 15550 y := v.Args[1] 15551 v.reset(Op386SETB) 15552 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 15553 v0.AddArg(x) 15554 v0.AddArg(y) 15555 v.AddArg(v0) 15556 return true 15557 } 15558 } 15559 func rewriteValue386_OpLess64F_0(v *Value) bool { 15560 b := v.Block 15561 _ = b 15562 // match: (Less64F x y) 15563 // cond: 15564 // result: (SETGF (UCOMISD y x)) 15565 for { 15566 _ = v.Args[1] 15567 x := v.Args[0] 15568 y := v.Args[1] 15569 v.reset(Op386SETGF) 15570 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 15571 v0.AddArg(y) 15572 v0.AddArg(x) 15573 v.AddArg(v0) 15574 return true 15575 } 15576 } 15577 func rewriteValue386_OpLess8_0(v *Value) bool { 15578 b := v.Block 15579 _ = b 15580 // match: (Less8 x y) 15581 // cond: 15582 // result: (SETL (CMPB x y)) 15583 for { 15584 _ = v.Args[1] 15585 x := v.Args[0] 15586 y := v.Args[1] 15587 v.reset(Op386SETL) 15588 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15589 v0.AddArg(x) 15590 v0.AddArg(y) 15591 v.AddArg(v0) 15592 return true 15593 } 15594 } 15595 func rewriteValue386_OpLess8U_0(v *Value) bool { 15596 b := v.Block 15597 _ = b 15598 // match: (Less8U x y) 15599 // cond: 15600 // result: (SETB (CMPB x y)) 15601 for { 15602 _ = v.Args[1] 15603 x := v.Args[0] 15604 y := v.Args[1] 15605 v.reset(Op386SETB) 15606 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 15607 v0.AddArg(x) 15608 v0.AddArg(y) 15609 v.AddArg(v0) 15610 return true 15611 } 15612 } 15613 func rewriteValue386_OpLoad_0(v *Value) bool { 15614 // match: (Load <t> ptr mem) 15615 // cond: (is32BitInt(t) || isPtr(t)) 15616 // result: (MOVLload ptr mem) 15617 for { 15618 t := v.Type 15619 _ = v.Args[1] 15620 ptr := v.Args[0] 15621 mem := v.Args[1] 15622 if !(is32BitInt(t) || isPtr(t)) { 15623 break 15624 } 15625 v.reset(Op386MOVLload) 15626 v.AddArg(ptr) 15627 v.AddArg(mem) 15628 return true 15629 } 15630 // match: (Load <t> ptr mem) 15631 // cond: is16BitInt(t) 15632 // result: (MOVWload ptr mem) 15633 for { 15634 t := v.Type 15635 _ = v.Args[1] 15636 ptr := v.Args[0] 15637 mem := v.Args[1] 15638 if !(is16BitInt(t)) { 15639 break 15640 } 15641 v.reset(Op386MOVWload) 15642 v.AddArg(ptr) 15643 v.AddArg(mem) 15644 return true 15645 } 15646 // match: (Load <t> ptr mem) 15647 // cond: (t.IsBoolean() || is8BitInt(t)) 15648 // result: (MOVBload ptr mem) 15649 for { 15650 t := v.Type 15651 _ = v.Args[1] 15652 ptr := v.Args[0] 15653 mem := v.Args[1] 15654 if !(t.IsBoolean() || is8BitInt(t)) { 15655 break 15656 } 15657 v.reset(Op386MOVBload) 15658 v.AddArg(ptr) 15659 v.AddArg(mem) 15660 return true 15661 } 15662 // match: (Load <t> ptr mem) 15663 // cond: is32BitFloat(t) 15664 // result: (MOVSSload ptr mem) 15665 for { 15666 t := v.Type 15667 _ = v.Args[1] 15668 ptr := v.Args[0] 15669 mem := v.Args[1] 15670 if !(is32BitFloat(t)) { 15671 break 15672 } 15673 v.reset(Op386MOVSSload) 15674 v.AddArg(ptr) 15675 v.AddArg(mem) 15676 return true 15677 } 15678 // match: (Load <t> ptr mem) 15679 // cond: is64BitFloat(t) 15680 // result: (MOVSDload ptr mem) 15681 for { 15682 t := v.Type 15683 _ = v.Args[1] 15684 ptr := v.Args[0] 15685 mem := v.Args[1] 15686 if !(is64BitFloat(t)) { 15687 break 15688 } 15689 v.reset(Op386MOVSDload) 15690 v.AddArg(ptr) 15691 v.AddArg(mem) 15692 return true 15693 } 15694 return false 15695 } 15696 func rewriteValue386_OpLsh16x16_0(v *Value) bool { 15697 b := v.Block 15698 _ = b 15699 // match: (Lsh16x16 <t> x y) 15700 // cond: 15701 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15702 for { 15703 t := v.Type 15704 _ = v.Args[1] 15705 x := v.Args[0] 15706 y := v.Args[1] 15707 v.reset(Op386ANDL) 15708 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15709 v0.AddArg(x) 15710 v0.AddArg(y) 15711 v.AddArg(v0) 15712 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15713 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 15714 v2.AuxInt = 32 15715 v2.AddArg(y) 15716 v1.AddArg(v2) 15717 v.AddArg(v1) 15718 return true 15719 } 15720 } 15721 func rewriteValue386_OpLsh16x32_0(v *Value) bool { 15722 b := v.Block 15723 _ = b 15724 // match: (Lsh16x32 <t> x y) 15725 // cond: 15726 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15727 for { 15728 t := v.Type 15729 _ = v.Args[1] 15730 x := v.Args[0] 15731 y := v.Args[1] 15732 v.reset(Op386ANDL) 15733 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15734 v0.AddArg(x) 15735 v0.AddArg(y) 15736 v.AddArg(v0) 15737 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15738 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 15739 v2.AuxInt = 32 15740 v2.AddArg(y) 15741 v1.AddArg(v2) 15742 v.AddArg(v1) 15743 return true 15744 } 15745 } 15746 func rewriteValue386_OpLsh16x64_0(v *Value) bool { 15747 // match: (Lsh16x64 x (Const64 [c])) 15748 // cond: uint64(c) < 16 15749 // result: (SHLLconst x [c]) 15750 for { 15751 _ = v.Args[1] 15752 x := v.Args[0] 15753 v_1 := v.Args[1] 15754 if v_1.Op != OpConst64 { 15755 break 15756 } 15757 c := v_1.AuxInt 15758 if !(uint64(c) < 16) { 15759 break 15760 } 15761 v.reset(Op386SHLLconst) 15762 v.AuxInt = c 15763 v.AddArg(x) 15764 return true 15765 } 15766 // match: (Lsh16x64 _ (Const64 [c])) 15767 // cond: uint64(c) >= 16 15768 // result: (Const16 [0]) 15769 for { 15770 _ = v.Args[1] 15771 v_1 := v.Args[1] 15772 if v_1.Op != OpConst64 { 15773 break 15774 } 15775 c := v_1.AuxInt 15776 if !(uint64(c) >= 16) { 15777 break 15778 } 15779 v.reset(OpConst16) 15780 v.AuxInt = 0 15781 return true 15782 } 15783 return false 15784 } 15785 func rewriteValue386_OpLsh16x8_0(v *Value) bool { 15786 b := v.Block 15787 _ = b 15788 // match: (Lsh16x8 <t> x y) 15789 // cond: 15790 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15791 for { 15792 t := v.Type 15793 _ = v.Args[1] 15794 x := v.Args[0] 15795 y := v.Args[1] 15796 v.reset(Op386ANDL) 15797 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15798 v0.AddArg(x) 15799 v0.AddArg(y) 15800 v.AddArg(v0) 15801 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15802 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 15803 v2.AuxInt = 32 15804 v2.AddArg(y) 15805 v1.AddArg(v2) 15806 v.AddArg(v1) 15807 return true 15808 } 15809 } 15810 func rewriteValue386_OpLsh32x16_0(v *Value) bool { 15811 b := v.Block 15812 _ = b 15813 // match: (Lsh32x16 <t> x y) 15814 // cond: 15815 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15816 for { 15817 t := v.Type 15818 _ = v.Args[1] 15819 x := v.Args[0] 15820 y := v.Args[1] 15821 v.reset(Op386ANDL) 15822 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15823 v0.AddArg(x) 15824 v0.AddArg(y) 15825 v.AddArg(v0) 15826 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15827 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 15828 v2.AuxInt = 32 15829 v2.AddArg(y) 15830 v1.AddArg(v2) 15831 v.AddArg(v1) 15832 return true 15833 } 15834 } 15835 func rewriteValue386_OpLsh32x32_0(v *Value) bool { 15836 b := v.Block 15837 _ = b 15838 // match: (Lsh32x32 <t> x y) 15839 // cond: 15840 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15841 for { 15842 t := v.Type 15843 _ = v.Args[1] 15844 x := v.Args[0] 15845 y := v.Args[1] 15846 v.reset(Op386ANDL) 15847 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15848 v0.AddArg(x) 15849 v0.AddArg(y) 15850 v.AddArg(v0) 15851 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15852 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 15853 v2.AuxInt = 32 15854 v2.AddArg(y) 15855 v1.AddArg(v2) 15856 v.AddArg(v1) 15857 return true 15858 } 15859 } 15860 func rewriteValue386_OpLsh32x64_0(v *Value) bool { 15861 // match: (Lsh32x64 x (Const64 [c])) 15862 // cond: uint64(c) < 32 15863 // result: (SHLLconst x [c]) 15864 for { 15865 _ = v.Args[1] 15866 x := v.Args[0] 15867 v_1 := v.Args[1] 15868 if v_1.Op != OpConst64 { 15869 break 15870 } 15871 c := v_1.AuxInt 15872 if !(uint64(c) < 32) { 15873 break 15874 } 15875 v.reset(Op386SHLLconst) 15876 v.AuxInt = c 15877 v.AddArg(x) 15878 return true 15879 } 15880 // match: (Lsh32x64 _ (Const64 [c])) 15881 // cond: uint64(c) >= 32 15882 // result: (Const32 [0]) 15883 for { 15884 _ = v.Args[1] 15885 v_1 := v.Args[1] 15886 if v_1.Op != OpConst64 { 15887 break 15888 } 15889 c := v_1.AuxInt 15890 if !(uint64(c) >= 32) { 15891 break 15892 } 15893 v.reset(OpConst32) 15894 v.AuxInt = 0 15895 return true 15896 } 15897 return false 15898 } 15899 func rewriteValue386_OpLsh32x8_0(v *Value) bool { 15900 b := v.Block 15901 _ = b 15902 // match: (Lsh32x8 <t> x y) 15903 // cond: 15904 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 15905 for { 15906 t := v.Type 15907 _ = v.Args[1] 15908 x := v.Args[0] 15909 y := v.Args[1] 15910 v.reset(Op386ANDL) 15911 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15912 v0.AddArg(x) 15913 v0.AddArg(y) 15914 v.AddArg(v0) 15915 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15916 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 15917 v2.AuxInt = 32 15918 v2.AddArg(y) 15919 v1.AddArg(v2) 15920 v.AddArg(v1) 15921 return true 15922 } 15923 } 15924 func rewriteValue386_OpLsh8x16_0(v *Value) bool { 15925 b := v.Block 15926 _ = b 15927 // match: (Lsh8x16 <t> x y) 15928 // cond: 15929 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 15930 for { 15931 t := v.Type 15932 _ = v.Args[1] 15933 x := v.Args[0] 15934 y := v.Args[1] 15935 v.reset(Op386ANDL) 15936 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15937 v0.AddArg(x) 15938 v0.AddArg(y) 15939 v.AddArg(v0) 15940 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15941 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 15942 v2.AuxInt = 32 15943 v2.AddArg(y) 15944 v1.AddArg(v2) 15945 v.AddArg(v1) 15946 return true 15947 } 15948 } 15949 func rewriteValue386_OpLsh8x32_0(v *Value) bool { 15950 b := v.Block 15951 _ = b 15952 // match: (Lsh8x32 <t> x y) 15953 // cond: 15954 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 15955 for { 15956 t := v.Type 15957 _ = v.Args[1] 15958 x := v.Args[0] 15959 y := v.Args[1] 15960 v.reset(Op386ANDL) 15961 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 15962 v0.AddArg(x) 15963 v0.AddArg(y) 15964 v.AddArg(v0) 15965 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 15966 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 15967 v2.AuxInt = 32 15968 v2.AddArg(y) 15969 v1.AddArg(v2) 15970 v.AddArg(v1) 15971 return true 15972 } 15973 } 15974 func rewriteValue386_OpLsh8x64_0(v *Value) bool { 15975 // match: (Lsh8x64 x (Const64 [c])) 15976 // cond: uint64(c) < 8 15977 // result: (SHLLconst x [c]) 15978 for { 15979 _ = v.Args[1] 15980 x := v.Args[0] 15981 v_1 := v.Args[1] 15982 if v_1.Op != OpConst64 { 15983 break 15984 } 15985 c := v_1.AuxInt 15986 if !(uint64(c) < 8) { 15987 break 15988 } 15989 v.reset(Op386SHLLconst) 15990 v.AuxInt = c 15991 v.AddArg(x) 15992 return true 15993 } 15994 // match: (Lsh8x64 _ (Const64 [c])) 15995 // cond: uint64(c) >= 8 15996 // result: (Const8 [0]) 15997 for { 15998 _ = v.Args[1] 15999 v_1 := v.Args[1] 16000 if v_1.Op != OpConst64 { 16001 break 16002 } 16003 c := v_1.AuxInt 16004 if !(uint64(c) >= 8) { 16005 break 16006 } 16007 v.reset(OpConst8) 16008 v.AuxInt = 0 16009 return true 16010 } 16011 return false 16012 } 16013 func rewriteValue386_OpLsh8x8_0(v *Value) bool { 16014 b := v.Block 16015 _ = b 16016 // match: (Lsh8x8 <t> x y) 16017 // cond: 16018 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 16019 for { 16020 t := v.Type 16021 _ = v.Args[1] 16022 x := v.Args[0] 16023 y := v.Args[1] 16024 v.reset(Op386ANDL) 16025 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 16026 v0.AddArg(x) 16027 v0.AddArg(y) 16028 v.AddArg(v0) 16029 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16030 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 16031 v2.AuxInt = 32 16032 v2.AddArg(y) 16033 v1.AddArg(v2) 16034 v.AddArg(v1) 16035 return true 16036 } 16037 } 16038 func rewriteValue386_OpMod16_0(v *Value) bool { 16039 // match: (Mod16 x y) 16040 // cond: 16041 // result: (MODW x y) 16042 for { 16043 _ = v.Args[1] 16044 x := v.Args[0] 16045 y := v.Args[1] 16046 v.reset(Op386MODW) 16047 v.AddArg(x) 16048 v.AddArg(y) 16049 return true 16050 } 16051 } 16052 func rewriteValue386_OpMod16u_0(v *Value) bool { 16053 // match: (Mod16u x y) 16054 // cond: 16055 // result: (MODWU x y) 16056 for { 16057 _ = v.Args[1] 16058 x := v.Args[0] 16059 y := v.Args[1] 16060 v.reset(Op386MODWU) 16061 v.AddArg(x) 16062 v.AddArg(y) 16063 return true 16064 } 16065 } 16066 func rewriteValue386_OpMod32_0(v *Value) bool { 16067 // match: (Mod32 x y) 16068 // cond: 16069 // result: (MODL x y) 16070 for { 16071 _ = v.Args[1] 16072 x := v.Args[0] 16073 y := v.Args[1] 16074 v.reset(Op386MODL) 16075 v.AddArg(x) 16076 v.AddArg(y) 16077 return true 16078 } 16079 } 16080 func rewriteValue386_OpMod32u_0(v *Value) bool { 16081 // match: (Mod32u x y) 16082 // cond: 16083 // result: (MODLU x y) 16084 for { 16085 _ = v.Args[1] 16086 x := v.Args[0] 16087 y := v.Args[1] 16088 v.reset(Op386MODLU) 16089 v.AddArg(x) 16090 v.AddArg(y) 16091 return true 16092 } 16093 } 16094 func rewriteValue386_OpMod8_0(v *Value) bool { 16095 b := v.Block 16096 _ = b 16097 typ := &b.Func.Config.Types 16098 _ = typ 16099 // match: (Mod8 x y) 16100 // cond: 16101 // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) 16102 for { 16103 _ = v.Args[1] 16104 x := v.Args[0] 16105 y := v.Args[1] 16106 v.reset(Op386MODW) 16107 v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 16108 v0.AddArg(x) 16109 v.AddArg(v0) 16110 v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 16111 v1.AddArg(y) 16112 v.AddArg(v1) 16113 return true 16114 } 16115 } 16116 func rewriteValue386_OpMod8u_0(v *Value) bool { 16117 b := v.Block 16118 _ = b 16119 typ := &b.Func.Config.Types 16120 _ = typ 16121 // match: (Mod8u x y) 16122 // cond: 16123 // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 16124 for { 16125 _ = v.Args[1] 16126 x := v.Args[0] 16127 y := v.Args[1] 16128 v.reset(Op386MODWU) 16129 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 16130 v0.AddArg(x) 16131 v.AddArg(v0) 16132 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 16133 v1.AddArg(y) 16134 v.AddArg(v1) 16135 return true 16136 } 16137 } 16138 func rewriteValue386_OpMove_0(v *Value) bool { 16139 b := v.Block 16140 _ = b 16141 typ := &b.Func.Config.Types 16142 _ = typ 16143 // match: (Move [0] _ _ mem) 16144 // cond: 16145 // result: mem 16146 for { 16147 if v.AuxInt != 0 { 16148 break 16149 } 16150 _ = v.Args[2] 16151 mem := v.Args[2] 16152 v.reset(OpCopy) 16153 v.Type = mem.Type 16154 v.AddArg(mem) 16155 return true 16156 } 16157 // match: (Move [1] dst src mem) 16158 // cond: 16159 // result: (MOVBstore dst (MOVBload src mem) mem) 16160 for { 16161 if v.AuxInt != 1 { 16162 break 16163 } 16164 _ = v.Args[2] 16165 dst := v.Args[0] 16166 src := v.Args[1] 16167 mem := v.Args[2] 16168 v.reset(Op386MOVBstore) 16169 v.AddArg(dst) 16170 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 16171 v0.AddArg(src) 16172 v0.AddArg(mem) 16173 v.AddArg(v0) 16174 v.AddArg(mem) 16175 return true 16176 } 16177 // match: (Move [2] dst src mem) 16178 // cond: 16179 // result: (MOVWstore dst (MOVWload src mem) mem) 16180 for { 16181 if v.AuxInt != 2 { 16182 break 16183 } 16184 _ = v.Args[2] 16185 dst := v.Args[0] 16186 src := v.Args[1] 16187 mem := v.Args[2] 16188 v.reset(Op386MOVWstore) 16189 v.AddArg(dst) 16190 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 16191 v0.AddArg(src) 16192 v0.AddArg(mem) 16193 v.AddArg(v0) 16194 v.AddArg(mem) 16195 return true 16196 } 16197 // match: (Move [4] dst src mem) 16198 // cond: 16199 // result: (MOVLstore dst (MOVLload src mem) mem) 16200 for { 16201 if v.AuxInt != 4 { 16202 break 16203 } 16204 _ = v.Args[2] 16205 dst := v.Args[0] 16206 src := v.Args[1] 16207 mem := v.Args[2] 16208 v.reset(Op386MOVLstore) 16209 v.AddArg(dst) 16210 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16211 v0.AddArg(src) 16212 v0.AddArg(mem) 16213 v.AddArg(v0) 16214 v.AddArg(mem) 16215 return true 16216 } 16217 // match: (Move [3] dst src mem) 16218 // cond: 16219 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) 16220 for { 16221 if v.AuxInt != 3 { 16222 break 16223 } 16224 _ = v.Args[2] 16225 dst := v.Args[0] 16226 src := v.Args[1] 16227 mem := v.Args[2] 16228 v.reset(Op386MOVBstore) 16229 v.AuxInt = 2 16230 v.AddArg(dst) 16231 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 16232 v0.AuxInt = 2 16233 v0.AddArg(src) 16234 v0.AddArg(mem) 16235 v.AddArg(v0) 16236 v1 := b.NewValue0(v.Pos, Op386MOVWstore, types.TypeMem) 16237 v1.AddArg(dst) 16238 v2 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 16239 v2.AddArg(src) 16240 v2.AddArg(mem) 16241 v1.AddArg(v2) 16242 v1.AddArg(mem) 16243 v.AddArg(v1) 16244 return true 16245 } 16246 // match: (Move [5] dst src mem) 16247 // cond: 16248 // result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16249 for { 16250 if v.AuxInt != 5 { 16251 break 16252 } 16253 _ = v.Args[2] 16254 dst := v.Args[0] 16255 src := v.Args[1] 16256 mem := v.Args[2] 16257 v.reset(Op386MOVBstore) 16258 v.AuxInt = 4 16259 v.AddArg(dst) 16260 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 16261 v0.AuxInt = 4 16262 v0.AddArg(src) 16263 v0.AddArg(mem) 16264 v.AddArg(v0) 16265 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16266 v1.AddArg(dst) 16267 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16268 v2.AddArg(src) 16269 v2.AddArg(mem) 16270 v1.AddArg(v2) 16271 v1.AddArg(mem) 16272 v.AddArg(v1) 16273 return true 16274 } 16275 // match: (Move [6] dst src mem) 16276 // cond: 16277 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16278 for { 16279 if v.AuxInt != 6 { 16280 break 16281 } 16282 _ = v.Args[2] 16283 dst := v.Args[0] 16284 src := v.Args[1] 16285 mem := v.Args[2] 16286 v.reset(Op386MOVWstore) 16287 v.AuxInt = 4 16288 v.AddArg(dst) 16289 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 16290 v0.AuxInt = 4 16291 v0.AddArg(src) 16292 v0.AddArg(mem) 16293 v.AddArg(v0) 16294 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16295 v1.AddArg(dst) 16296 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16297 v2.AddArg(src) 16298 v2.AddArg(mem) 16299 v1.AddArg(v2) 16300 v1.AddArg(mem) 16301 v.AddArg(v1) 16302 return true 16303 } 16304 // match: (Move [7] dst src mem) 16305 // cond: 16306 // result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16307 for { 16308 if v.AuxInt != 7 { 16309 break 16310 } 16311 _ = v.Args[2] 16312 dst := v.Args[0] 16313 src := v.Args[1] 16314 mem := v.Args[2] 16315 v.reset(Op386MOVLstore) 16316 v.AuxInt = 3 16317 v.AddArg(dst) 16318 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16319 v0.AuxInt = 3 16320 v0.AddArg(src) 16321 v0.AddArg(mem) 16322 v.AddArg(v0) 16323 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16324 v1.AddArg(dst) 16325 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16326 v2.AddArg(src) 16327 v2.AddArg(mem) 16328 v1.AddArg(v2) 16329 v1.AddArg(mem) 16330 v.AddArg(v1) 16331 return true 16332 } 16333 // match: (Move [8] dst src mem) 16334 // cond: 16335 // result: (MOVLstore [4] dst (MOVLload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 16336 for { 16337 if v.AuxInt != 8 { 16338 break 16339 } 16340 _ = v.Args[2] 16341 dst := v.Args[0] 16342 src := v.Args[1] 16343 mem := v.Args[2] 16344 v.reset(Op386MOVLstore) 16345 v.AuxInt = 4 16346 v.AddArg(dst) 16347 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16348 v0.AuxInt = 4 16349 v0.AddArg(src) 16350 v0.AddArg(mem) 16351 v.AddArg(v0) 16352 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16353 v1.AddArg(dst) 16354 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16355 v2.AddArg(src) 16356 v2.AddArg(mem) 16357 v1.AddArg(v2) 16358 v1.AddArg(mem) 16359 v.AddArg(v1) 16360 return true 16361 } 16362 // match: (Move [s] dst src mem) 16363 // cond: s > 8 && s%4 != 0 16364 // result: (Move [s-s%4] (ADDLconst <dst.Type> dst [s%4]) (ADDLconst <src.Type> src [s%4]) (MOVLstore dst (MOVLload src mem) mem)) 16365 for { 16366 s := v.AuxInt 16367 _ = v.Args[2] 16368 dst := v.Args[0] 16369 src := v.Args[1] 16370 mem := v.Args[2] 16371 if !(s > 8 && s%4 != 0) { 16372 break 16373 } 16374 v.reset(OpMove) 16375 v.AuxInt = s - s%4 16376 v0 := b.NewValue0(v.Pos, Op386ADDLconst, dst.Type) 16377 v0.AuxInt = s % 4 16378 v0.AddArg(dst) 16379 v.AddArg(v0) 16380 v1 := b.NewValue0(v.Pos, Op386ADDLconst, src.Type) 16381 v1.AuxInt = s % 4 16382 v1.AddArg(src) 16383 v.AddArg(v1) 16384 v2 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 16385 v2.AddArg(dst) 16386 v3 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 16387 v3.AddArg(src) 16388 v3.AddArg(mem) 16389 v2.AddArg(v3) 16390 v2.AddArg(mem) 16391 v.AddArg(v2) 16392 return true 16393 } 16394 return false 16395 } 16396 func rewriteValue386_OpMove_10(v *Value) bool { 16397 b := v.Block 16398 _ = b 16399 config := b.Func.Config 16400 _ = config 16401 typ := &b.Func.Config.Types 16402 _ = typ 16403 // match: (Move [s] dst src mem) 16404 // cond: s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 16405 // result: (DUFFCOPY [10*(128-s/4)] dst src mem) 16406 for { 16407 s := v.AuxInt 16408 _ = v.Args[2] 16409 dst := v.Args[0] 16410 src := v.Args[1] 16411 mem := v.Args[2] 16412 if !(s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 16413 break 16414 } 16415 v.reset(Op386DUFFCOPY) 16416 v.AuxInt = 10 * (128 - s/4) 16417 v.AddArg(dst) 16418 v.AddArg(src) 16419 v.AddArg(mem) 16420 return true 16421 } 16422 // match: (Move [s] dst src mem) 16423 // cond: (s > 4*128 || config.noDuffDevice) && s%4 == 0 16424 // result: (REPMOVSL dst src (MOVLconst [s/4]) mem) 16425 for { 16426 s := v.AuxInt 16427 _ = v.Args[2] 16428 dst := v.Args[0] 16429 src := v.Args[1] 16430 mem := v.Args[2] 16431 if !((s > 4*128 || config.noDuffDevice) && s%4 == 0) { 16432 break 16433 } 16434 v.reset(Op386REPMOVSL) 16435 v.AddArg(dst) 16436 v.AddArg(src) 16437 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 16438 v0.AuxInt = s / 4 16439 v.AddArg(v0) 16440 v.AddArg(mem) 16441 return true 16442 } 16443 return false 16444 } 16445 func rewriteValue386_OpMul16_0(v *Value) bool { 16446 // match: (Mul16 x y) 16447 // cond: 16448 // result: (MULL x y) 16449 for { 16450 _ = v.Args[1] 16451 x := v.Args[0] 16452 y := v.Args[1] 16453 v.reset(Op386MULL) 16454 v.AddArg(x) 16455 v.AddArg(y) 16456 return true 16457 } 16458 } 16459 func rewriteValue386_OpMul32_0(v *Value) bool { 16460 // match: (Mul32 x y) 16461 // cond: 16462 // result: (MULL x y) 16463 for { 16464 _ = v.Args[1] 16465 x := v.Args[0] 16466 y := v.Args[1] 16467 v.reset(Op386MULL) 16468 v.AddArg(x) 16469 v.AddArg(y) 16470 return true 16471 } 16472 } 16473 func rewriteValue386_OpMul32F_0(v *Value) bool { 16474 // match: (Mul32F x y) 16475 // cond: 16476 // result: (MULSS x y) 16477 for { 16478 _ = v.Args[1] 16479 x := v.Args[0] 16480 y := v.Args[1] 16481 v.reset(Op386MULSS) 16482 v.AddArg(x) 16483 v.AddArg(y) 16484 return true 16485 } 16486 } 16487 func rewriteValue386_OpMul32uhilo_0(v *Value) bool { 16488 // match: (Mul32uhilo x y) 16489 // cond: 16490 // result: (MULLQU x y) 16491 for { 16492 _ = v.Args[1] 16493 x := v.Args[0] 16494 y := v.Args[1] 16495 v.reset(Op386MULLQU) 16496 v.AddArg(x) 16497 v.AddArg(y) 16498 return true 16499 } 16500 } 16501 func rewriteValue386_OpMul64F_0(v *Value) bool { 16502 // match: (Mul64F x y) 16503 // cond: 16504 // result: (MULSD x y) 16505 for { 16506 _ = v.Args[1] 16507 x := v.Args[0] 16508 y := v.Args[1] 16509 v.reset(Op386MULSD) 16510 v.AddArg(x) 16511 v.AddArg(y) 16512 return true 16513 } 16514 } 16515 func rewriteValue386_OpMul8_0(v *Value) bool { 16516 // match: (Mul8 x y) 16517 // cond: 16518 // result: (MULL x y) 16519 for { 16520 _ = v.Args[1] 16521 x := v.Args[0] 16522 y := v.Args[1] 16523 v.reset(Op386MULL) 16524 v.AddArg(x) 16525 v.AddArg(y) 16526 return true 16527 } 16528 } 16529 func rewriteValue386_OpNeg16_0(v *Value) bool { 16530 // match: (Neg16 x) 16531 // cond: 16532 // result: (NEGL x) 16533 for { 16534 x := v.Args[0] 16535 v.reset(Op386NEGL) 16536 v.AddArg(x) 16537 return true 16538 } 16539 } 16540 func rewriteValue386_OpNeg32_0(v *Value) bool { 16541 // match: (Neg32 x) 16542 // cond: 16543 // result: (NEGL x) 16544 for { 16545 x := v.Args[0] 16546 v.reset(Op386NEGL) 16547 v.AddArg(x) 16548 return true 16549 } 16550 } 16551 func rewriteValue386_OpNeg32F_0(v *Value) bool { 16552 b := v.Block 16553 _ = b 16554 config := b.Func.Config 16555 _ = config 16556 typ := &b.Func.Config.Types 16557 _ = typ 16558 // match: (Neg32F x) 16559 // cond: !config.use387 16560 // result: (PXOR x (MOVSSconst <typ.Float32> [f2i(math.Copysign(0, -1))])) 16561 for { 16562 x := v.Args[0] 16563 if !(!config.use387) { 16564 break 16565 } 16566 v.reset(Op386PXOR) 16567 v.AddArg(x) 16568 v0 := b.NewValue0(v.Pos, Op386MOVSSconst, typ.Float32) 16569 v0.AuxInt = f2i(math.Copysign(0, -1)) 16570 v.AddArg(v0) 16571 return true 16572 } 16573 // match: (Neg32F x) 16574 // cond: config.use387 16575 // result: (FCHS x) 16576 for { 16577 x := v.Args[0] 16578 if !(config.use387) { 16579 break 16580 } 16581 v.reset(Op386FCHS) 16582 v.AddArg(x) 16583 return true 16584 } 16585 return false 16586 } 16587 func rewriteValue386_OpNeg64F_0(v *Value) bool { 16588 b := v.Block 16589 _ = b 16590 config := b.Func.Config 16591 _ = config 16592 typ := &b.Func.Config.Types 16593 _ = typ 16594 // match: (Neg64F x) 16595 // cond: !config.use387 16596 // result: (PXOR x (MOVSDconst <typ.Float64> [f2i(math.Copysign(0, -1))])) 16597 for { 16598 x := v.Args[0] 16599 if !(!config.use387) { 16600 break 16601 } 16602 v.reset(Op386PXOR) 16603 v.AddArg(x) 16604 v0 := b.NewValue0(v.Pos, Op386MOVSDconst, typ.Float64) 16605 v0.AuxInt = f2i(math.Copysign(0, -1)) 16606 v.AddArg(v0) 16607 return true 16608 } 16609 // match: (Neg64F x) 16610 // cond: config.use387 16611 // result: (FCHS x) 16612 for { 16613 x := v.Args[0] 16614 if !(config.use387) { 16615 break 16616 } 16617 v.reset(Op386FCHS) 16618 v.AddArg(x) 16619 return true 16620 } 16621 return false 16622 } 16623 func rewriteValue386_OpNeg8_0(v *Value) bool { 16624 // match: (Neg8 x) 16625 // cond: 16626 // result: (NEGL x) 16627 for { 16628 x := v.Args[0] 16629 v.reset(Op386NEGL) 16630 v.AddArg(x) 16631 return true 16632 } 16633 } 16634 func rewriteValue386_OpNeq16_0(v *Value) bool { 16635 b := v.Block 16636 _ = b 16637 // match: (Neq16 x y) 16638 // cond: 16639 // result: (SETNE (CMPW x y)) 16640 for { 16641 _ = v.Args[1] 16642 x := v.Args[0] 16643 y := v.Args[1] 16644 v.reset(Op386SETNE) 16645 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 16646 v0.AddArg(x) 16647 v0.AddArg(y) 16648 v.AddArg(v0) 16649 return true 16650 } 16651 } 16652 func rewriteValue386_OpNeq32_0(v *Value) bool { 16653 b := v.Block 16654 _ = b 16655 // match: (Neq32 x y) 16656 // cond: 16657 // result: (SETNE (CMPL x y)) 16658 for { 16659 _ = v.Args[1] 16660 x := v.Args[0] 16661 y := v.Args[1] 16662 v.reset(Op386SETNE) 16663 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 16664 v0.AddArg(x) 16665 v0.AddArg(y) 16666 v.AddArg(v0) 16667 return true 16668 } 16669 } 16670 func rewriteValue386_OpNeq32F_0(v *Value) bool { 16671 b := v.Block 16672 _ = b 16673 // match: (Neq32F x y) 16674 // cond: 16675 // result: (SETNEF (UCOMISS x y)) 16676 for { 16677 _ = v.Args[1] 16678 x := v.Args[0] 16679 y := v.Args[1] 16680 v.reset(Op386SETNEF) 16681 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 16682 v0.AddArg(x) 16683 v0.AddArg(y) 16684 v.AddArg(v0) 16685 return true 16686 } 16687 } 16688 func rewriteValue386_OpNeq64F_0(v *Value) bool { 16689 b := v.Block 16690 _ = b 16691 // match: (Neq64F x y) 16692 // cond: 16693 // result: (SETNEF (UCOMISD x y)) 16694 for { 16695 _ = v.Args[1] 16696 x := v.Args[0] 16697 y := v.Args[1] 16698 v.reset(Op386SETNEF) 16699 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 16700 v0.AddArg(x) 16701 v0.AddArg(y) 16702 v.AddArg(v0) 16703 return true 16704 } 16705 } 16706 func rewriteValue386_OpNeq8_0(v *Value) bool { 16707 b := v.Block 16708 _ = b 16709 // match: (Neq8 x y) 16710 // cond: 16711 // result: (SETNE (CMPB x y)) 16712 for { 16713 _ = v.Args[1] 16714 x := v.Args[0] 16715 y := v.Args[1] 16716 v.reset(Op386SETNE) 16717 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 16718 v0.AddArg(x) 16719 v0.AddArg(y) 16720 v.AddArg(v0) 16721 return true 16722 } 16723 } 16724 func rewriteValue386_OpNeqB_0(v *Value) bool { 16725 b := v.Block 16726 _ = b 16727 // match: (NeqB x y) 16728 // cond: 16729 // result: (SETNE (CMPB x y)) 16730 for { 16731 _ = v.Args[1] 16732 x := v.Args[0] 16733 y := v.Args[1] 16734 v.reset(Op386SETNE) 16735 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 16736 v0.AddArg(x) 16737 v0.AddArg(y) 16738 v.AddArg(v0) 16739 return true 16740 } 16741 } 16742 func rewriteValue386_OpNeqPtr_0(v *Value) bool { 16743 b := v.Block 16744 _ = b 16745 // match: (NeqPtr x y) 16746 // cond: 16747 // result: (SETNE (CMPL x y)) 16748 for { 16749 _ = v.Args[1] 16750 x := v.Args[0] 16751 y := v.Args[1] 16752 v.reset(Op386SETNE) 16753 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 16754 v0.AddArg(x) 16755 v0.AddArg(y) 16756 v.AddArg(v0) 16757 return true 16758 } 16759 } 16760 func rewriteValue386_OpNilCheck_0(v *Value) bool { 16761 // match: (NilCheck ptr mem) 16762 // cond: 16763 // result: (LoweredNilCheck ptr mem) 16764 for { 16765 _ = v.Args[1] 16766 ptr := v.Args[0] 16767 mem := v.Args[1] 16768 v.reset(Op386LoweredNilCheck) 16769 v.AddArg(ptr) 16770 v.AddArg(mem) 16771 return true 16772 } 16773 } 16774 func rewriteValue386_OpNot_0(v *Value) bool { 16775 // match: (Not x) 16776 // cond: 16777 // result: (XORLconst [1] x) 16778 for { 16779 x := v.Args[0] 16780 v.reset(Op386XORLconst) 16781 v.AuxInt = 1 16782 v.AddArg(x) 16783 return true 16784 } 16785 } 16786 func rewriteValue386_OpOffPtr_0(v *Value) bool { 16787 // match: (OffPtr [off] ptr) 16788 // cond: 16789 // result: (ADDLconst [off] ptr) 16790 for { 16791 off := v.AuxInt 16792 ptr := v.Args[0] 16793 v.reset(Op386ADDLconst) 16794 v.AuxInt = off 16795 v.AddArg(ptr) 16796 return true 16797 } 16798 } 16799 func rewriteValue386_OpOr16_0(v *Value) bool { 16800 // match: (Or16 x y) 16801 // cond: 16802 // result: (ORL x y) 16803 for { 16804 _ = v.Args[1] 16805 x := v.Args[0] 16806 y := v.Args[1] 16807 v.reset(Op386ORL) 16808 v.AddArg(x) 16809 v.AddArg(y) 16810 return true 16811 } 16812 } 16813 func rewriteValue386_OpOr32_0(v *Value) bool { 16814 // match: (Or32 x y) 16815 // cond: 16816 // result: (ORL x y) 16817 for { 16818 _ = v.Args[1] 16819 x := v.Args[0] 16820 y := v.Args[1] 16821 v.reset(Op386ORL) 16822 v.AddArg(x) 16823 v.AddArg(y) 16824 return true 16825 } 16826 } 16827 func rewriteValue386_OpOr8_0(v *Value) bool { 16828 // match: (Or8 x y) 16829 // cond: 16830 // result: (ORL x y) 16831 for { 16832 _ = v.Args[1] 16833 x := v.Args[0] 16834 y := v.Args[1] 16835 v.reset(Op386ORL) 16836 v.AddArg(x) 16837 v.AddArg(y) 16838 return true 16839 } 16840 } 16841 func rewriteValue386_OpOrB_0(v *Value) bool { 16842 // match: (OrB x y) 16843 // cond: 16844 // result: (ORL x y) 16845 for { 16846 _ = v.Args[1] 16847 x := v.Args[0] 16848 y := v.Args[1] 16849 v.reset(Op386ORL) 16850 v.AddArg(x) 16851 v.AddArg(y) 16852 return true 16853 } 16854 } 16855 func rewriteValue386_OpRound32F_0(v *Value) bool { 16856 // match: (Round32F x) 16857 // cond: 16858 // result: x 16859 for { 16860 x := v.Args[0] 16861 v.reset(OpCopy) 16862 v.Type = x.Type 16863 v.AddArg(x) 16864 return true 16865 } 16866 } 16867 func rewriteValue386_OpRound64F_0(v *Value) bool { 16868 // match: (Round64F x) 16869 // cond: 16870 // result: x 16871 for { 16872 x := v.Args[0] 16873 v.reset(OpCopy) 16874 v.Type = x.Type 16875 v.AddArg(x) 16876 return true 16877 } 16878 } 16879 func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { 16880 b := v.Block 16881 _ = b 16882 // match: (Rsh16Ux16 <t> x y) 16883 // cond: 16884 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16]))) 16885 for { 16886 t := v.Type 16887 _ = v.Args[1] 16888 x := v.Args[0] 16889 y := v.Args[1] 16890 v.reset(Op386ANDL) 16891 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16892 v0.AddArg(x) 16893 v0.AddArg(y) 16894 v.AddArg(v0) 16895 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16896 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 16897 v2.AuxInt = 16 16898 v2.AddArg(y) 16899 v1.AddArg(v2) 16900 v.AddArg(v1) 16901 return true 16902 } 16903 } 16904 func rewriteValue386_OpRsh16Ux32_0(v *Value) bool { 16905 b := v.Block 16906 _ = b 16907 // match: (Rsh16Ux32 <t> x y) 16908 // cond: 16909 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16]))) 16910 for { 16911 t := v.Type 16912 _ = v.Args[1] 16913 x := v.Args[0] 16914 y := v.Args[1] 16915 v.reset(Op386ANDL) 16916 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16917 v0.AddArg(x) 16918 v0.AddArg(y) 16919 v.AddArg(v0) 16920 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16921 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 16922 v2.AuxInt = 16 16923 v2.AddArg(y) 16924 v1.AddArg(v2) 16925 v.AddArg(v1) 16926 return true 16927 } 16928 } 16929 func rewriteValue386_OpRsh16Ux64_0(v *Value) bool { 16930 // match: (Rsh16Ux64 x (Const64 [c])) 16931 // cond: uint64(c) < 16 16932 // result: (SHRWconst x [c]) 16933 for { 16934 _ = v.Args[1] 16935 x := v.Args[0] 16936 v_1 := v.Args[1] 16937 if v_1.Op != OpConst64 { 16938 break 16939 } 16940 c := v_1.AuxInt 16941 if !(uint64(c) < 16) { 16942 break 16943 } 16944 v.reset(Op386SHRWconst) 16945 v.AuxInt = c 16946 v.AddArg(x) 16947 return true 16948 } 16949 // match: (Rsh16Ux64 _ (Const64 [c])) 16950 // cond: uint64(c) >= 16 16951 // result: (Const16 [0]) 16952 for { 16953 _ = v.Args[1] 16954 v_1 := v.Args[1] 16955 if v_1.Op != OpConst64 { 16956 break 16957 } 16958 c := v_1.AuxInt 16959 if !(uint64(c) >= 16) { 16960 break 16961 } 16962 v.reset(OpConst16) 16963 v.AuxInt = 0 16964 return true 16965 } 16966 return false 16967 } 16968 func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { 16969 b := v.Block 16970 _ = b 16971 // match: (Rsh16Ux8 <t> x y) 16972 // cond: 16973 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16]))) 16974 for { 16975 t := v.Type 16976 _ = v.Args[1] 16977 x := v.Args[0] 16978 y := v.Args[1] 16979 v.reset(Op386ANDL) 16980 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 16981 v0.AddArg(x) 16982 v0.AddArg(y) 16983 v.AddArg(v0) 16984 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 16985 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 16986 v2.AuxInt = 16 16987 v2.AddArg(y) 16988 v1.AddArg(v2) 16989 v.AddArg(v1) 16990 return true 16991 } 16992 } 16993 func rewriteValue386_OpRsh16x16_0(v *Value) bool { 16994 b := v.Block 16995 _ = b 16996 // match: (Rsh16x16 <t> x y) 16997 // cond: 16998 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16]))))) 16999 for { 17000 t := v.Type 17001 _ = v.Args[1] 17002 x := v.Args[0] 17003 y := v.Args[1] 17004 v.reset(Op386SARW) 17005 v.Type = t 17006 v.AddArg(x) 17007 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17008 v0.AddArg(y) 17009 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17010 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17011 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17012 v3.AuxInt = 16 17013 v3.AddArg(y) 17014 v2.AddArg(v3) 17015 v1.AddArg(v2) 17016 v0.AddArg(v1) 17017 v.AddArg(v0) 17018 return true 17019 } 17020 } 17021 func rewriteValue386_OpRsh16x32_0(v *Value) bool { 17022 b := v.Block 17023 _ = b 17024 // match: (Rsh16x32 <t> x y) 17025 // cond: 17026 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16]))))) 17027 for { 17028 t := v.Type 17029 _ = v.Args[1] 17030 x := v.Args[0] 17031 y := v.Args[1] 17032 v.reset(Op386SARW) 17033 v.Type = t 17034 v.AddArg(x) 17035 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17036 v0.AddArg(y) 17037 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17038 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17039 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17040 v3.AuxInt = 16 17041 v3.AddArg(y) 17042 v2.AddArg(v3) 17043 v1.AddArg(v2) 17044 v0.AddArg(v1) 17045 v.AddArg(v0) 17046 return true 17047 } 17048 } 17049 func rewriteValue386_OpRsh16x64_0(v *Value) bool { 17050 // match: (Rsh16x64 x (Const64 [c])) 17051 // cond: uint64(c) < 16 17052 // result: (SARWconst x [c]) 17053 for { 17054 _ = v.Args[1] 17055 x := v.Args[0] 17056 v_1 := v.Args[1] 17057 if v_1.Op != OpConst64 { 17058 break 17059 } 17060 c := v_1.AuxInt 17061 if !(uint64(c) < 16) { 17062 break 17063 } 17064 v.reset(Op386SARWconst) 17065 v.AuxInt = c 17066 v.AddArg(x) 17067 return true 17068 } 17069 // match: (Rsh16x64 x (Const64 [c])) 17070 // cond: uint64(c) >= 16 17071 // result: (SARWconst x [15]) 17072 for { 17073 _ = v.Args[1] 17074 x := v.Args[0] 17075 v_1 := v.Args[1] 17076 if v_1.Op != OpConst64 { 17077 break 17078 } 17079 c := v_1.AuxInt 17080 if !(uint64(c) >= 16) { 17081 break 17082 } 17083 v.reset(Op386SARWconst) 17084 v.AuxInt = 15 17085 v.AddArg(x) 17086 return true 17087 } 17088 return false 17089 } 17090 func rewriteValue386_OpRsh16x8_0(v *Value) bool { 17091 b := v.Block 17092 _ = b 17093 // match: (Rsh16x8 <t> x y) 17094 // cond: 17095 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16]))))) 17096 for { 17097 t := v.Type 17098 _ = v.Args[1] 17099 x := v.Args[0] 17100 y := v.Args[1] 17101 v.reset(Op386SARW) 17102 v.Type = t 17103 v.AddArg(x) 17104 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17105 v0.AddArg(y) 17106 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17107 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17108 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17109 v3.AuxInt = 16 17110 v3.AddArg(y) 17111 v2.AddArg(v3) 17112 v1.AddArg(v2) 17113 v0.AddArg(v1) 17114 v.AddArg(v0) 17115 return true 17116 } 17117 } 17118 func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { 17119 b := v.Block 17120 _ = b 17121 // match: (Rsh32Ux16 <t> x y) 17122 // cond: 17123 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 17124 for { 17125 t := v.Type 17126 _ = v.Args[1] 17127 x := v.Args[0] 17128 y := v.Args[1] 17129 v.reset(Op386ANDL) 17130 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 17131 v0.AddArg(x) 17132 v0.AddArg(y) 17133 v.AddArg(v0) 17134 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17135 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17136 v2.AuxInt = 32 17137 v2.AddArg(y) 17138 v1.AddArg(v2) 17139 v.AddArg(v1) 17140 return true 17141 } 17142 } 17143 func rewriteValue386_OpRsh32Ux32_0(v *Value) bool { 17144 b := v.Block 17145 _ = b 17146 // match: (Rsh32Ux32 <t> x y) 17147 // cond: 17148 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 17149 for { 17150 t := v.Type 17151 _ = v.Args[1] 17152 x := v.Args[0] 17153 y := v.Args[1] 17154 v.reset(Op386ANDL) 17155 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 17156 v0.AddArg(x) 17157 v0.AddArg(y) 17158 v.AddArg(v0) 17159 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17160 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17161 v2.AuxInt = 32 17162 v2.AddArg(y) 17163 v1.AddArg(v2) 17164 v.AddArg(v1) 17165 return true 17166 } 17167 } 17168 func rewriteValue386_OpRsh32Ux64_0(v *Value) bool { 17169 // match: (Rsh32Ux64 x (Const64 [c])) 17170 // cond: uint64(c) < 32 17171 // result: (SHRLconst x [c]) 17172 for { 17173 _ = v.Args[1] 17174 x := v.Args[0] 17175 v_1 := v.Args[1] 17176 if v_1.Op != OpConst64 { 17177 break 17178 } 17179 c := v_1.AuxInt 17180 if !(uint64(c) < 32) { 17181 break 17182 } 17183 v.reset(Op386SHRLconst) 17184 v.AuxInt = c 17185 v.AddArg(x) 17186 return true 17187 } 17188 // match: (Rsh32Ux64 _ (Const64 [c])) 17189 // cond: uint64(c) >= 32 17190 // result: (Const32 [0]) 17191 for { 17192 _ = v.Args[1] 17193 v_1 := v.Args[1] 17194 if v_1.Op != OpConst64 { 17195 break 17196 } 17197 c := v_1.AuxInt 17198 if !(uint64(c) >= 32) { 17199 break 17200 } 17201 v.reset(OpConst32) 17202 v.AuxInt = 0 17203 return true 17204 } 17205 return false 17206 } 17207 func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { 17208 b := v.Block 17209 _ = b 17210 // match: (Rsh32Ux8 <t> x y) 17211 // cond: 17212 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 17213 for { 17214 t := v.Type 17215 _ = v.Args[1] 17216 x := v.Args[0] 17217 y := v.Args[1] 17218 v.reset(Op386ANDL) 17219 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 17220 v0.AddArg(x) 17221 v0.AddArg(y) 17222 v.AddArg(v0) 17223 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17224 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17225 v2.AuxInt = 32 17226 v2.AddArg(y) 17227 v1.AddArg(v2) 17228 v.AddArg(v1) 17229 return true 17230 } 17231 } 17232 func rewriteValue386_OpRsh32x16_0(v *Value) bool { 17233 b := v.Block 17234 _ = b 17235 // match: (Rsh32x16 <t> x y) 17236 // cond: 17237 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32]))))) 17238 for { 17239 t := v.Type 17240 _ = v.Args[1] 17241 x := v.Args[0] 17242 y := v.Args[1] 17243 v.reset(Op386SARL) 17244 v.Type = t 17245 v.AddArg(x) 17246 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17247 v0.AddArg(y) 17248 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17249 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17250 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17251 v3.AuxInt = 32 17252 v3.AddArg(y) 17253 v2.AddArg(v3) 17254 v1.AddArg(v2) 17255 v0.AddArg(v1) 17256 v.AddArg(v0) 17257 return true 17258 } 17259 } 17260 func rewriteValue386_OpRsh32x32_0(v *Value) bool { 17261 b := v.Block 17262 _ = b 17263 // match: (Rsh32x32 <t> x y) 17264 // cond: 17265 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32]))))) 17266 for { 17267 t := v.Type 17268 _ = v.Args[1] 17269 x := v.Args[0] 17270 y := v.Args[1] 17271 v.reset(Op386SARL) 17272 v.Type = t 17273 v.AddArg(x) 17274 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17275 v0.AddArg(y) 17276 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17277 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17278 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17279 v3.AuxInt = 32 17280 v3.AddArg(y) 17281 v2.AddArg(v3) 17282 v1.AddArg(v2) 17283 v0.AddArg(v1) 17284 v.AddArg(v0) 17285 return true 17286 } 17287 } 17288 func rewriteValue386_OpRsh32x64_0(v *Value) bool { 17289 // match: (Rsh32x64 x (Const64 [c])) 17290 // cond: uint64(c) < 32 17291 // result: (SARLconst x [c]) 17292 for { 17293 _ = v.Args[1] 17294 x := v.Args[0] 17295 v_1 := v.Args[1] 17296 if v_1.Op != OpConst64 { 17297 break 17298 } 17299 c := v_1.AuxInt 17300 if !(uint64(c) < 32) { 17301 break 17302 } 17303 v.reset(Op386SARLconst) 17304 v.AuxInt = c 17305 v.AddArg(x) 17306 return true 17307 } 17308 // match: (Rsh32x64 x (Const64 [c])) 17309 // cond: uint64(c) >= 32 17310 // result: (SARLconst x [31]) 17311 for { 17312 _ = v.Args[1] 17313 x := v.Args[0] 17314 v_1 := v.Args[1] 17315 if v_1.Op != OpConst64 { 17316 break 17317 } 17318 c := v_1.AuxInt 17319 if !(uint64(c) >= 32) { 17320 break 17321 } 17322 v.reset(Op386SARLconst) 17323 v.AuxInt = 31 17324 v.AddArg(x) 17325 return true 17326 } 17327 return false 17328 } 17329 func rewriteValue386_OpRsh32x8_0(v *Value) bool { 17330 b := v.Block 17331 _ = b 17332 // match: (Rsh32x8 <t> x y) 17333 // cond: 17334 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32]))))) 17335 for { 17336 t := v.Type 17337 _ = v.Args[1] 17338 x := v.Args[0] 17339 y := v.Args[1] 17340 v.reset(Op386SARL) 17341 v.Type = t 17342 v.AddArg(x) 17343 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17344 v0.AddArg(y) 17345 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17346 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17347 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17348 v3.AuxInt = 32 17349 v3.AddArg(y) 17350 v2.AddArg(v3) 17351 v1.AddArg(v2) 17352 v0.AddArg(v1) 17353 v.AddArg(v0) 17354 return true 17355 } 17356 } 17357 func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { 17358 b := v.Block 17359 _ = b 17360 // match: (Rsh8Ux16 <t> x y) 17361 // cond: 17362 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8]))) 17363 for { 17364 t := v.Type 17365 _ = v.Args[1] 17366 x := v.Args[0] 17367 y := v.Args[1] 17368 v.reset(Op386ANDL) 17369 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 17370 v0.AddArg(x) 17371 v0.AddArg(y) 17372 v.AddArg(v0) 17373 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17374 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17375 v2.AuxInt = 8 17376 v2.AddArg(y) 17377 v1.AddArg(v2) 17378 v.AddArg(v1) 17379 return true 17380 } 17381 } 17382 func rewriteValue386_OpRsh8Ux32_0(v *Value) bool { 17383 b := v.Block 17384 _ = b 17385 // match: (Rsh8Ux32 <t> x y) 17386 // cond: 17387 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8]))) 17388 for { 17389 t := v.Type 17390 _ = v.Args[1] 17391 x := v.Args[0] 17392 y := v.Args[1] 17393 v.reset(Op386ANDL) 17394 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 17395 v0.AddArg(x) 17396 v0.AddArg(y) 17397 v.AddArg(v0) 17398 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17399 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17400 v2.AuxInt = 8 17401 v2.AddArg(y) 17402 v1.AddArg(v2) 17403 v.AddArg(v1) 17404 return true 17405 } 17406 } 17407 func rewriteValue386_OpRsh8Ux64_0(v *Value) bool { 17408 // match: (Rsh8Ux64 x (Const64 [c])) 17409 // cond: uint64(c) < 8 17410 // result: (SHRBconst x [c]) 17411 for { 17412 _ = v.Args[1] 17413 x := v.Args[0] 17414 v_1 := v.Args[1] 17415 if v_1.Op != OpConst64 { 17416 break 17417 } 17418 c := v_1.AuxInt 17419 if !(uint64(c) < 8) { 17420 break 17421 } 17422 v.reset(Op386SHRBconst) 17423 v.AuxInt = c 17424 v.AddArg(x) 17425 return true 17426 } 17427 // match: (Rsh8Ux64 _ (Const64 [c])) 17428 // cond: uint64(c) >= 8 17429 // result: (Const8 [0]) 17430 for { 17431 _ = v.Args[1] 17432 v_1 := v.Args[1] 17433 if v_1.Op != OpConst64 { 17434 break 17435 } 17436 c := v_1.AuxInt 17437 if !(uint64(c) >= 8) { 17438 break 17439 } 17440 v.reset(OpConst8) 17441 v.AuxInt = 0 17442 return true 17443 } 17444 return false 17445 } 17446 func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { 17447 b := v.Block 17448 _ = b 17449 // match: (Rsh8Ux8 <t> x y) 17450 // cond: 17451 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8]))) 17452 for { 17453 t := v.Type 17454 _ = v.Args[1] 17455 x := v.Args[0] 17456 y := v.Args[1] 17457 v.reset(Op386ANDL) 17458 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 17459 v0.AddArg(x) 17460 v0.AddArg(y) 17461 v.AddArg(v0) 17462 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 17463 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17464 v2.AuxInt = 8 17465 v2.AddArg(y) 17466 v1.AddArg(v2) 17467 v.AddArg(v1) 17468 return true 17469 } 17470 } 17471 func rewriteValue386_OpRsh8x16_0(v *Value) bool { 17472 b := v.Block 17473 _ = b 17474 // match: (Rsh8x16 <t> x y) 17475 // cond: 17476 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8]))))) 17477 for { 17478 t := v.Type 17479 _ = v.Args[1] 17480 x := v.Args[0] 17481 y := v.Args[1] 17482 v.reset(Op386SARB) 17483 v.Type = t 17484 v.AddArg(x) 17485 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17486 v0.AddArg(y) 17487 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17488 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17489 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 17490 v3.AuxInt = 8 17491 v3.AddArg(y) 17492 v2.AddArg(v3) 17493 v1.AddArg(v2) 17494 v0.AddArg(v1) 17495 v.AddArg(v0) 17496 return true 17497 } 17498 } 17499 func rewriteValue386_OpRsh8x32_0(v *Value) bool { 17500 b := v.Block 17501 _ = b 17502 // match: (Rsh8x32 <t> x y) 17503 // cond: 17504 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8]))))) 17505 for { 17506 t := v.Type 17507 _ = v.Args[1] 17508 x := v.Args[0] 17509 y := v.Args[1] 17510 v.reset(Op386SARB) 17511 v.Type = t 17512 v.AddArg(x) 17513 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17514 v0.AddArg(y) 17515 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17516 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17517 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 17518 v3.AuxInt = 8 17519 v3.AddArg(y) 17520 v2.AddArg(v3) 17521 v1.AddArg(v2) 17522 v0.AddArg(v1) 17523 v.AddArg(v0) 17524 return true 17525 } 17526 } 17527 func rewriteValue386_OpRsh8x64_0(v *Value) bool { 17528 // match: (Rsh8x64 x (Const64 [c])) 17529 // cond: uint64(c) < 8 17530 // result: (SARBconst x [c]) 17531 for { 17532 _ = v.Args[1] 17533 x := v.Args[0] 17534 v_1 := v.Args[1] 17535 if v_1.Op != OpConst64 { 17536 break 17537 } 17538 c := v_1.AuxInt 17539 if !(uint64(c) < 8) { 17540 break 17541 } 17542 v.reset(Op386SARBconst) 17543 v.AuxInt = c 17544 v.AddArg(x) 17545 return true 17546 } 17547 // match: (Rsh8x64 x (Const64 [c])) 17548 // cond: uint64(c) >= 8 17549 // result: (SARBconst x [7]) 17550 for { 17551 _ = v.Args[1] 17552 x := v.Args[0] 17553 v_1 := v.Args[1] 17554 if v_1.Op != OpConst64 { 17555 break 17556 } 17557 c := v_1.AuxInt 17558 if !(uint64(c) >= 8) { 17559 break 17560 } 17561 v.reset(Op386SARBconst) 17562 v.AuxInt = 7 17563 v.AddArg(x) 17564 return true 17565 } 17566 return false 17567 } 17568 func rewriteValue386_OpRsh8x8_0(v *Value) bool { 17569 b := v.Block 17570 _ = b 17571 // match: (Rsh8x8 <t> x y) 17572 // cond: 17573 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8]))))) 17574 for { 17575 t := v.Type 17576 _ = v.Args[1] 17577 x := v.Args[0] 17578 y := v.Args[1] 17579 v.reset(Op386SARB) 17580 v.Type = t 17581 v.AddArg(x) 17582 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 17583 v0.AddArg(y) 17584 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 17585 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 17586 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 17587 v3.AuxInt = 8 17588 v3.AddArg(y) 17589 v2.AddArg(v3) 17590 v1.AddArg(v2) 17591 v0.AddArg(v1) 17592 v.AddArg(v0) 17593 return true 17594 } 17595 } 17596 func rewriteValue386_OpSignExt16to32_0(v *Value) bool { 17597 // match: (SignExt16to32 x) 17598 // cond: 17599 // result: (MOVWLSX x) 17600 for { 17601 x := v.Args[0] 17602 v.reset(Op386MOVWLSX) 17603 v.AddArg(x) 17604 return true 17605 } 17606 } 17607 func rewriteValue386_OpSignExt8to16_0(v *Value) bool { 17608 // match: (SignExt8to16 x) 17609 // cond: 17610 // result: (MOVBLSX x) 17611 for { 17612 x := v.Args[0] 17613 v.reset(Op386MOVBLSX) 17614 v.AddArg(x) 17615 return true 17616 } 17617 } 17618 func rewriteValue386_OpSignExt8to32_0(v *Value) bool { 17619 // match: (SignExt8to32 x) 17620 // cond: 17621 // result: (MOVBLSX x) 17622 for { 17623 x := v.Args[0] 17624 v.reset(Op386MOVBLSX) 17625 v.AddArg(x) 17626 return true 17627 } 17628 } 17629 func rewriteValue386_OpSignmask_0(v *Value) bool { 17630 // match: (Signmask x) 17631 // cond: 17632 // result: (SARLconst x [31]) 17633 for { 17634 x := v.Args[0] 17635 v.reset(Op386SARLconst) 17636 v.AuxInt = 31 17637 v.AddArg(x) 17638 return true 17639 } 17640 } 17641 func rewriteValue386_OpSlicemask_0(v *Value) bool { 17642 b := v.Block 17643 _ = b 17644 // match: (Slicemask <t> x) 17645 // cond: 17646 // result: (SARLconst (NEGL <t> x) [31]) 17647 for { 17648 t := v.Type 17649 x := v.Args[0] 17650 v.reset(Op386SARLconst) 17651 v.AuxInt = 31 17652 v0 := b.NewValue0(v.Pos, Op386NEGL, t) 17653 v0.AddArg(x) 17654 v.AddArg(v0) 17655 return true 17656 } 17657 } 17658 func rewriteValue386_OpSqrt_0(v *Value) bool { 17659 // match: (Sqrt x) 17660 // cond: 17661 // result: (SQRTSD x) 17662 for { 17663 x := v.Args[0] 17664 v.reset(Op386SQRTSD) 17665 v.AddArg(x) 17666 return true 17667 } 17668 } 17669 func rewriteValue386_OpStaticCall_0(v *Value) bool { 17670 // match: (StaticCall [argwid] {target} mem) 17671 // cond: 17672 // result: (CALLstatic [argwid] {target} mem) 17673 for { 17674 argwid := v.AuxInt 17675 target := v.Aux 17676 mem := v.Args[0] 17677 v.reset(Op386CALLstatic) 17678 v.AuxInt = argwid 17679 v.Aux = target 17680 v.AddArg(mem) 17681 return true 17682 } 17683 } 17684 func rewriteValue386_OpStore_0(v *Value) bool { 17685 // match: (Store {t} ptr val mem) 17686 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 17687 // result: (MOVSDstore ptr val mem) 17688 for { 17689 t := v.Aux 17690 _ = v.Args[2] 17691 ptr := v.Args[0] 17692 val := v.Args[1] 17693 mem := v.Args[2] 17694 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 17695 break 17696 } 17697 v.reset(Op386MOVSDstore) 17698 v.AddArg(ptr) 17699 v.AddArg(val) 17700 v.AddArg(mem) 17701 return true 17702 } 17703 // match: (Store {t} ptr val mem) 17704 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 17705 // result: (MOVSSstore ptr val mem) 17706 for { 17707 t := v.Aux 17708 _ = v.Args[2] 17709 ptr := v.Args[0] 17710 val := v.Args[1] 17711 mem := v.Args[2] 17712 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 17713 break 17714 } 17715 v.reset(Op386MOVSSstore) 17716 v.AddArg(ptr) 17717 v.AddArg(val) 17718 v.AddArg(mem) 17719 return true 17720 } 17721 // match: (Store {t} ptr val mem) 17722 // cond: t.(*types.Type).Size() == 4 17723 // result: (MOVLstore ptr val mem) 17724 for { 17725 t := v.Aux 17726 _ = v.Args[2] 17727 ptr := v.Args[0] 17728 val := v.Args[1] 17729 mem := v.Args[2] 17730 if !(t.(*types.Type).Size() == 4) { 17731 break 17732 } 17733 v.reset(Op386MOVLstore) 17734 v.AddArg(ptr) 17735 v.AddArg(val) 17736 v.AddArg(mem) 17737 return true 17738 } 17739 // match: (Store {t} ptr val mem) 17740 // cond: t.(*types.Type).Size() == 2 17741 // result: (MOVWstore ptr val mem) 17742 for { 17743 t := v.Aux 17744 _ = v.Args[2] 17745 ptr := v.Args[0] 17746 val := v.Args[1] 17747 mem := v.Args[2] 17748 if !(t.(*types.Type).Size() == 2) { 17749 break 17750 } 17751 v.reset(Op386MOVWstore) 17752 v.AddArg(ptr) 17753 v.AddArg(val) 17754 v.AddArg(mem) 17755 return true 17756 } 17757 // match: (Store {t} ptr val mem) 17758 // cond: t.(*types.Type).Size() == 1 17759 // result: (MOVBstore ptr val mem) 17760 for { 17761 t := v.Aux 17762 _ = v.Args[2] 17763 ptr := v.Args[0] 17764 val := v.Args[1] 17765 mem := v.Args[2] 17766 if !(t.(*types.Type).Size() == 1) { 17767 break 17768 } 17769 v.reset(Op386MOVBstore) 17770 v.AddArg(ptr) 17771 v.AddArg(val) 17772 v.AddArg(mem) 17773 return true 17774 } 17775 return false 17776 } 17777 func rewriteValue386_OpSub16_0(v *Value) bool { 17778 // match: (Sub16 x y) 17779 // cond: 17780 // result: (SUBL x y) 17781 for { 17782 _ = v.Args[1] 17783 x := v.Args[0] 17784 y := v.Args[1] 17785 v.reset(Op386SUBL) 17786 v.AddArg(x) 17787 v.AddArg(y) 17788 return true 17789 } 17790 } 17791 func rewriteValue386_OpSub32_0(v *Value) bool { 17792 // match: (Sub32 x y) 17793 // cond: 17794 // result: (SUBL x y) 17795 for { 17796 _ = v.Args[1] 17797 x := v.Args[0] 17798 y := v.Args[1] 17799 v.reset(Op386SUBL) 17800 v.AddArg(x) 17801 v.AddArg(y) 17802 return true 17803 } 17804 } 17805 func rewriteValue386_OpSub32F_0(v *Value) bool { 17806 // match: (Sub32F x y) 17807 // cond: 17808 // result: (SUBSS x y) 17809 for { 17810 _ = v.Args[1] 17811 x := v.Args[0] 17812 y := v.Args[1] 17813 v.reset(Op386SUBSS) 17814 v.AddArg(x) 17815 v.AddArg(y) 17816 return true 17817 } 17818 } 17819 func rewriteValue386_OpSub32carry_0(v *Value) bool { 17820 // match: (Sub32carry x y) 17821 // cond: 17822 // result: (SUBLcarry x y) 17823 for { 17824 _ = v.Args[1] 17825 x := v.Args[0] 17826 y := v.Args[1] 17827 v.reset(Op386SUBLcarry) 17828 v.AddArg(x) 17829 v.AddArg(y) 17830 return true 17831 } 17832 } 17833 func rewriteValue386_OpSub32withcarry_0(v *Value) bool { 17834 // match: (Sub32withcarry x y c) 17835 // cond: 17836 // result: (SBBL x y c) 17837 for { 17838 _ = v.Args[2] 17839 x := v.Args[0] 17840 y := v.Args[1] 17841 c := v.Args[2] 17842 v.reset(Op386SBBL) 17843 v.AddArg(x) 17844 v.AddArg(y) 17845 v.AddArg(c) 17846 return true 17847 } 17848 } 17849 func rewriteValue386_OpSub64F_0(v *Value) bool { 17850 // match: (Sub64F x y) 17851 // cond: 17852 // result: (SUBSD x y) 17853 for { 17854 _ = v.Args[1] 17855 x := v.Args[0] 17856 y := v.Args[1] 17857 v.reset(Op386SUBSD) 17858 v.AddArg(x) 17859 v.AddArg(y) 17860 return true 17861 } 17862 } 17863 func rewriteValue386_OpSub8_0(v *Value) bool { 17864 // match: (Sub8 x y) 17865 // cond: 17866 // result: (SUBL x y) 17867 for { 17868 _ = v.Args[1] 17869 x := v.Args[0] 17870 y := v.Args[1] 17871 v.reset(Op386SUBL) 17872 v.AddArg(x) 17873 v.AddArg(y) 17874 return true 17875 } 17876 } 17877 func rewriteValue386_OpSubPtr_0(v *Value) bool { 17878 // match: (SubPtr x y) 17879 // cond: 17880 // result: (SUBL x y) 17881 for { 17882 _ = v.Args[1] 17883 x := v.Args[0] 17884 y := v.Args[1] 17885 v.reset(Op386SUBL) 17886 v.AddArg(x) 17887 v.AddArg(y) 17888 return true 17889 } 17890 } 17891 func rewriteValue386_OpTrunc16to8_0(v *Value) bool { 17892 // match: (Trunc16to8 x) 17893 // cond: 17894 // result: x 17895 for { 17896 x := v.Args[0] 17897 v.reset(OpCopy) 17898 v.Type = x.Type 17899 v.AddArg(x) 17900 return true 17901 } 17902 } 17903 func rewriteValue386_OpTrunc32to16_0(v *Value) bool { 17904 // match: (Trunc32to16 x) 17905 // cond: 17906 // result: x 17907 for { 17908 x := v.Args[0] 17909 v.reset(OpCopy) 17910 v.Type = x.Type 17911 v.AddArg(x) 17912 return true 17913 } 17914 } 17915 func rewriteValue386_OpTrunc32to8_0(v *Value) bool { 17916 // match: (Trunc32to8 x) 17917 // cond: 17918 // result: x 17919 for { 17920 x := v.Args[0] 17921 v.reset(OpCopy) 17922 v.Type = x.Type 17923 v.AddArg(x) 17924 return true 17925 } 17926 } 17927 func rewriteValue386_OpWB_0(v *Value) bool { 17928 // match: (WB {fn} destptr srcptr mem) 17929 // cond: 17930 // result: (LoweredWB {fn} destptr srcptr mem) 17931 for { 17932 fn := v.Aux 17933 _ = v.Args[2] 17934 destptr := v.Args[0] 17935 srcptr := v.Args[1] 17936 mem := v.Args[2] 17937 v.reset(Op386LoweredWB) 17938 v.Aux = fn 17939 v.AddArg(destptr) 17940 v.AddArg(srcptr) 17941 v.AddArg(mem) 17942 return true 17943 } 17944 } 17945 func rewriteValue386_OpXor16_0(v *Value) bool { 17946 // match: (Xor16 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_OpXor32_0(v *Value) bool { 17960 // match: (Xor32 x y) 17961 // cond: 17962 // result: (XORL x y) 17963 for { 17964 _ = v.Args[1] 17965 x := v.Args[0] 17966 y := v.Args[1] 17967 v.reset(Op386XORL) 17968 v.AddArg(x) 17969 v.AddArg(y) 17970 return true 17971 } 17972 } 17973 func rewriteValue386_OpXor8_0(v *Value) bool { 17974 // match: (Xor8 x y) 17975 // cond: 17976 // result: (XORL x y) 17977 for { 17978 _ = v.Args[1] 17979 x := v.Args[0] 17980 y := v.Args[1] 17981 v.reset(Op386XORL) 17982 v.AddArg(x) 17983 v.AddArg(y) 17984 return true 17985 } 17986 } 17987 func rewriteValue386_OpZero_0(v *Value) bool { 17988 b := v.Block 17989 _ = b 17990 typ := &b.Func.Config.Types 17991 _ = typ 17992 // match: (Zero [0] _ mem) 17993 // cond: 17994 // result: mem 17995 for { 17996 if v.AuxInt != 0 { 17997 break 17998 } 17999 _ = v.Args[1] 18000 mem := v.Args[1] 18001 v.reset(OpCopy) 18002 v.Type = mem.Type 18003 v.AddArg(mem) 18004 return true 18005 } 18006 // match: (Zero [1] destptr mem) 18007 // cond: 18008 // result: (MOVBstoreconst [0] destptr mem) 18009 for { 18010 if v.AuxInt != 1 { 18011 break 18012 } 18013 _ = v.Args[1] 18014 destptr := v.Args[0] 18015 mem := v.Args[1] 18016 v.reset(Op386MOVBstoreconst) 18017 v.AuxInt = 0 18018 v.AddArg(destptr) 18019 v.AddArg(mem) 18020 return true 18021 } 18022 // match: (Zero [2] destptr mem) 18023 // cond: 18024 // result: (MOVWstoreconst [0] destptr mem) 18025 for { 18026 if v.AuxInt != 2 { 18027 break 18028 } 18029 _ = v.Args[1] 18030 destptr := v.Args[0] 18031 mem := v.Args[1] 18032 v.reset(Op386MOVWstoreconst) 18033 v.AuxInt = 0 18034 v.AddArg(destptr) 18035 v.AddArg(mem) 18036 return true 18037 } 18038 // match: (Zero [4] destptr mem) 18039 // cond: 18040 // result: (MOVLstoreconst [0] destptr mem) 18041 for { 18042 if v.AuxInt != 4 { 18043 break 18044 } 18045 _ = v.Args[1] 18046 destptr := v.Args[0] 18047 mem := v.Args[1] 18048 v.reset(Op386MOVLstoreconst) 18049 v.AuxInt = 0 18050 v.AddArg(destptr) 18051 v.AddArg(mem) 18052 return true 18053 } 18054 // match: (Zero [3] destptr mem) 18055 // cond: 18056 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVWstoreconst [0] destptr mem)) 18057 for { 18058 if v.AuxInt != 3 { 18059 break 18060 } 18061 _ = v.Args[1] 18062 destptr := v.Args[0] 18063 mem := v.Args[1] 18064 v.reset(Op386MOVBstoreconst) 18065 v.AuxInt = makeValAndOff(0, 2) 18066 v.AddArg(destptr) 18067 v0 := b.NewValue0(v.Pos, Op386MOVWstoreconst, types.TypeMem) 18068 v0.AuxInt = 0 18069 v0.AddArg(destptr) 18070 v0.AddArg(mem) 18071 v.AddArg(v0) 18072 return true 18073 } 18074 // match: (Zero [5] destptr mem) 18075 // cond: 18076 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 18077 for { 18078 if v.AuxInt != 5 { 18079 break 18080 } 18081 _ = v.Args[1] 18082 destptr := v.Args[0] 18083 mem := v.Args[1] 18084 v.reset(Op386MOVBstoreconst) 18085 v.AuxInt = makeValAndOff(0, 4) 18086 v.AddArg(destptr) 18087 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18088 v0.AuxInt = 0 18089 v0.AddArg(destptr) 18090 v0.AddArg(mem) 18091 v.AddArg(v0) 18092 return true 18093 } 18094 // match: (Zero [6] destptr mem) 18095 // cond: 18096 // result: (MOVWstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 18097 for { 18098 if v.AuxInt != 6 { 18099 break 18100 } 18101 _ = v.Args[1] 18102 destptr := v.Args[0] 18103 mem := v.Args[1] 18104 v.reset(Op386MOVWstoreconst) 18105 v.AuxInt = makeValAndOff(0, 4) 18106 v.AddArg(destptr) 18107 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18108 v0.AuxInt = 0 18109 v0.AddArg(destptr) 18110 v0.AddArg(mem) 18111 v.AddArg(v0) 18112 return true 18113 } 18114 // match: (Zero [7] destptr mem) 18115 // cond: 18116 // result: (MOVLstoreconst [makeValAndOff(0,3)] destptr (MOVLstoreconst [0] destptr mem)) 18117 for { 18118 if v.AuxInt != 7 { 18119 break 18120 } 18121 _ = v.Args[1] 18122 destptr := v.Args[0] 18123 mem := v.Args[1] 18124 v.reset(Op386MOVLstoreconst) 18125 v.AuxInt = makeValAndOff(0, 3) 18126 v.AddArg(destptr) 18127 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18128 v0.AuxInt = 0 18129 v0.AddArg(destptr) 18130 v0.AddArg(mem) 18131 v.AddArg(v0) 18132 return true 18133 } 18134 // match: (Zero [s] destptr mem) 18135 // cond: s%4 != 0 && s > 4 18136 // result: (Zero [s-s%4] (ADDLconst destptr [s%4]) (MOVLstoreconst [0] destptr mem)) 18137 for { 18138 s := v.AuxInt 18139 _ = v.Args[1] 18140 destptr := v.Args[0] 18141 mem := v.Args[1] 18142 if !(s%4 != 0 && s > 4) { 18143 break 18144 } 18145 v.reset(OpZero) 18146 v.AuxInt = s - s%4 18147 v0 := b.NewValue0(v.Pos, Op386ADDLconst, typ.UInt32) 18148 v0.AuxInt = s % 4 18149 v0.AddArg(destptr) 18150 v.AddArg(v0) 18151 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18152 v1.AuxInt = 0 18153 v1.AddArg(destptr) 18154 v1.AddArg(mem) 18155 v.AddArg(v1) 18156 return true 18157 } 18158 // match: (Zero [8] destptr mem) 18159 // cond: 18160 // result: (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 18161 for { 18162 if v.AuxInt != 8 { 18163 break 18164 } 18165 _ = v.Args[1] 18166 destptr := v.Args[0] 18167 mem := v.Args[1] 18168 v.reset(Op386MOVLstoreconst) 18169 v.AuxInt = makeValAndOff(0, 4) 18170 v.AddArg(destptr) 18171 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18172 v0.AuxInt = 0 18173 v0.AddArg(destptr) 18174 v0.AddArg(mem) 18175 v.AddArg(v0) 18176 return true 18177 } 18178 return false 18179 } 18180 func rewriteValue386_OpZero_10(v *Value) bool { 18181 b := v.Block 18182 _ = b 18183 config := b.Func.Config 18184 _ = config 18185 typ := &b.Func.Config.Types 18186 _ = typ 18187 // match: (Zero [12] destptr mem) 18188 // cond: 18189 // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) 18190 for { 18191 if v.AuxInt != 12 { 18192 break 18193 } 18194 _ = v.Args[1] 18195 destptr := v.Args[0] 18196 mem := v.Args[1] 18197 v.reset(Op386MOVLstoreconst) 18198 v.AuxInt = makeValAndOff(0, 8) 18199 v.AddArg(destptr) 18200 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18201 v0.AuxInt = makeValAndOff(0, 4) 18202 v0.AddArg(destptr) 18203 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18204 v1.AuxInt = 0 18205 v1.AddArg(destptr) 18206 v1.AddArg(mem) 18207 v0.AddArg(v1) 18208 v.AddArg(v0) 18209 return true 18210 } 18211 // match: (Zero [16] destptr mem) 18212 // cond: 18213 // result: (MOVLstoreconst [makeValAndOff(0,12)] destptr (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)))) 18214 for { 18215 if v.AuxInt != 16 { 18216 break 18217 } 18218 _ = v.Args[1] 18219 destptr := v.Args[0] 18220 mem := v.Args[1] 18221 v.reset(Op386MOVLstoreconst) 18222 v.AuxInt = makeValAndOff(0, 12) 18223 v.AddArg(destptr) 18224 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18225 v0.AuxInt = makeValAndOff(0, 8) 18226 v0.AddArg(destptr) 18227 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18228 v1.AuxInt = makeValAndOff(0, 4) 18229 v1.AddArg(destptr) 18230 v2 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 18231 v2.AuxInt = 0 18232 v2.AddArg(destptr) 18233 v2.AddArg(mem) 18234 v1.AddArg(v2) 18235 v0.AddArg(v1) 18236 v.AddArg(v0) 18237 return true 18238 } 18239 // match: (Zero [s] destptr mem) 18240 // cond: s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 18241 // result: (DUFFZERO [1*(128-s/4)] destptr (MOVLconst [0]) mem) 18242 for { 18243 s := v.AuxInt 18244 _ = v.Args[1] 18245 destptr := v.Args[0] 18246 mem := v.Args[1] 18247 if !(s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 18248 break 18249 } 18250 v.reset(Op386DUFFZERO) 18251 v.AuxInt = 1 * (128 - s/4) 18252 v.AddArg(destptr) 18253 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 18254 v0.AuxInt = 0 18255 v.AddArg(v0) 18256 v.AddArg(mem) 18257 return true 18258 } 18259 // match: (Zero [s] destptr mem) 18260 // cond: (s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0 18261 // result: (REPSTOSL destptr (MOVLconst [s/4]) (MOVLconst [0]) mem) 18262 for { 18263 s := v.AuxInt 18264 _ = v.Args[1] 18265 destptr := v.Args[0] 18266 mem := v.Args[1] 18267 if !((s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0) { 18268 break 18269 } 18270 v.reset(Op386REPSTOSL) 18271 v.AddArg(destptr) 18272 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 18273 v0.AuxInt = s / 4 18274 v.AddArg(v0) 18275 v1 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 18276 v1.AuxInt = 0 18277 v.AddArg(v1) 18278 v.AddArg(mem) 18279 return true 18280 } 18281 return false 18282 } 18283 func rewriteValue386_OpZeroExt16to32_0(v *Value) bool { 18284 // match: (ZeroExt16to32 x) 18285 // cond: 18286 // result: (MOVWLZX x) 18287 for { 18288 x := v.Args[0] 18289 v.reset(Op386MOVWLZX) 18290 v.AddArg(x) 18291 return true 18292 } 18293 } 18294 func rewriteValue386_OpZeroExt8to16_0(v *Value) bool { 18295 // match: (ZeroExt8to16 x) 18296 // cond: 18297 // result: (MOVBLZX x) 18298 for { 18299 x := v.Args[0] 18300 v.reset(Op386MOVBLZX) 18301 v.AddArg(x) 18302 return true 18303 } 18304 } 18305 func rewriteValue386_OpZeroExt8to32_0(v *Value) bool { 18306 // match: (ZeroExt8to32 x) 18307 // cond: 18308 // result: (MOVBLZX x) 18309 for { 18310 x := v.Args[0] 18311 v.reset(Op386MOVBLZX) 18312 v.AddArg(x) 18313 return true 18314 } 18315 } 18316 func rewriteValue386_OpZeromask_0(v *Value) bool { 18317 b := v.Block 18318 _ = b 18319 // match: (Zeromask <t> x) 18320 // cond: 18321 // result: (XORLconst [-1] (SBBLcarrymask <t> (CMPLconst x [1]))) 18322 for { 18323 t := v.Type 18324 x := v.Args[0] 18325 v.reset(Op386XORLconst) 18326 v.AuxInt = -1 18327 v0 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 18328 v1 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 18329 v1.AuxInt = 1 18330 v1.AddArg(x) 18331 v0.AddArg(v1) 18332 v.AddArg(v0) 18333 return true 18334 } 18335 } 18336 func rewriteBlock386(b *Block) bool { 18337 config := b.Func.Config 18338 _ = config 18339 fe := b.Func.fe 18340 _ = fe 18341 typ := &config.Types 18342 _ = typ 18343 switch b.Kind { 18344 case Block386EQ: 18345 // match: (EQ (InvertFlags cmp) yes no) 18346 // cond: 18347 // result: (EQ cmp yes no) 18348 for { 18349 v := b.Control 18350 if v.Op != Op386InvertFlags { 18351 break 18352 } 18353 cmp := v.Args[0] 18354 b.Kind = Block386EQ 18355 b.SetControl(cmp) 18356 b.Aux = nil 18357 return true 18358 } 18359 // match: (EQ (FlagEQ) yes no) 18360 // cond: 18361 // result: (First nil yes no) 18362 for { 18363 v := b.Control 18364 if v.Op != Op386FlagEQ { 18365 break 18366 } 18367 b.Kind = BlockFirst 18368 b.SetControl(nil) 18369 b.Aux = nil 18370 return true 18371 } 18372 // match: (EQ (FlagLT_ULT) yes no) 18373 // cond: 18374 // result: (First nil no yes) 18375 for { 18376 v := b.Control 18377 if v.Op != Op386FlagLT_ULT { 18378 break 18379 } 18380 b.Kind = BlockFirst 18381 b.SetControl(nil) 18382 b.Aux = nil 18383 b.swapSuccessors() 18384 return true 18385 } 18386 // match: (EQ (FlagLT_UGT) yes no) 18387 // cond: 18388 // result: (First nil no yes) 18389 for { 18390 v := b.Control 18391 if v.Op != Op386FlagLT_UGT { 18392 break 18393 } 18394 b.Kind = BlockFirst 18395 b.SetControl(nil) 18396 b.Aux = nil 18397 b.swapSuccessors() 18398 return true 18399 } 18400 // match: (EQ (FlagGT_ULT) yes no) 18401 // cond: 18402 // result: (First nil no yes) 18403 for { 18404 v := b.Control 18405 if v.Op != Op386FlagGT_ULT { 18406 break 18407 } 18408 b.Kind = BlockFirst 18409 b.SetControl(nil) 18410 b.Aux = nil 18411 b.swapSuccessors() 18412 return true 18413 } 18414 // match: (EQ (FlagGT_UGT) yes no) 18415 // cond: 18416 // result: (First nil no yes) 18417 for { 18418 v := b.Control 18419 if v.Op != Op386FlagGT_UGT { 18420 break 18421 } 18422 b.Kind = BlockFirst 18423 b.SetControl(nil) 18424 b.Aux = nil 18425 b.swapSuccessors() 18426 return true 18427 } 18428 case Block386GE: 18429 // match: (GE (InvertFlags cmp) yes no) 18430 // cond: 18431 // result: (LE cmp yes no) 18432 for { 18433 v := b.Control 18434 if v.Op != Op386InvertFlags { 18435 break 18436 } 18437 cmp := v.Args[0] 18438 b.Kind = Block386LE 18439 b.SetControl(cmp) 18440 b.Aux = nil 18441 return true 18442 } 18443 // match: (GE (FlagEQ) yes no) 18444 // cond: 18445 // result: (First nil yes no) 18446 for { 18447 v := b.Control 18448 if v.Op != Op386FlagEQ { 18449 break 18450 } 18451 b.Kind = BlockFirst 18452 b.SetControl(nil) 18453 b.Aux = nil 18454 return true 18455 } 18456 // match: (GE (FlagLT_ULT) yes no) 18457 // cond: 18458 // result: (First nil no yes) 18459 for { 18460 v := b.Control 18461 if v.Op != Op386FlagLT_ULT { 18462 break 18463 } 18464 b.Kind = BlockFirst 18465 b.SetControl(nil) 18466 b.Aux = nil 18467 b.swapSuccessors() 18468 return true 18469 } 18470 // match: (GE (FlagLT_UGT) yes no) 18471 // cond: 18472 // result: (First nil no yes) 18473 for { 18474 v := b.Control 18475 if v.Op != Op386FlagLT_UGT { 18476 break 18477 } 18478 b.Kind = BlockFirst 18479 b.SetControl(nil) 18480 b.Aux = nil 18481 b.swapSuccessors() 18482 return true 18483 } 18484 // match: (GE (FlagGT_ULT) yes no) 18485 // cond: 18486 // result: (First nil yes no) 18487 for { 18488 v := b.Control 18489 if v.Op != Op386FlagGT_ULT { 18490 break 18491 } 18492 b.Kind = BlockFirst 18493 b.SetControl(nil) 18494 b.Aux = nil 18495 return true 18496 } 18497 // match: (GE (FlagGT_UGT) yes no) 18498 // cond: 18499 // result: (First nil yes no) 18500 for { 18501 v := b.Control 18502 if v.Op != Op386FlagGT_UGT { 18503 break 18504 } 18505 b.Kind = BlockFirst 18506 b.SetControl(nil) 18507 b.Aux = nil 18508 return true 18509 } 18510 case Block386GT: 18511 // match: (GT (InvertFlags cmp) yes no) 18512 // cond: 18513 // result: (LT cmp yes no) 18514 for { 18515 v := b.Control 18516 if v.Op != Op386InvertFlags { 18517 break 18518 } 18519 cmp := v.Args[0] 18520 b.Kind = Block386LT 18521 b.SetControl(cmp) 18522 b.Aux = nil 18523 return true 18524 } 18525 // match: (GT (FlagEQ) yes no) 18526 // cond: 18527 // result: (First nil no yes) 18528 for { 18529 v := b.Control 18530 if v.Op != Op386FlagEQ { 18531 break 18532 } 18533 b.Kind = BlockFirst 18534 b.SetControl(nil) 18535 b.Aux = nil 18536 b.swapSuccessors() 18537 return true 18538 } 18539 // match: (GT (FlagLT_ULT) yes no) 18540 // cond: 18541 // result: (First nil no yes) 18542 for { 18543 v := b.Control 18544 if v.Op != Op386FlagLT_ULT { 18545 break 18546 } 18547 b.Kind = BlockFirst 18548 b.SetControl(nil) 18549 b.Aux = nil 18550 b.swapSuccessors() 18551 return true 18552 } 18553 // match: (GT (FlagLT_UGT) yes no) 18554 // cond: 18555 // result: (First nil no yes) 18556 for { 18557 v := b.Control 18558 if v.Op != Op386FlagLT_UGT { 18559 break 18560 } 18561 b.Kind = BlockFirst 18562 b.SetControl(nil) 18563 b.Aux = nil 18564 b.swapSuccessors() 18565 return true 18566 } 18567 // match: (GT (FlagGT_ULT) yes no) 18568 // cond: 18569 // result: (First nil yes no) 18570 for { 18571 v := b.Control 18572 if v.Op != Op386FlagGT_ULT { 18573 break 18574 } 18575 b.Kind = BlockFirst 18576 b.SetControl(nil) 18577 b.Aux = nil 18578 return true 18579 } 18580 // match: (GT (FlagGT_UGT) yes no) 18581 // cond: 18582 // result: (First nil yes no) 18583 for { 18584 v := b.Control 18585 if v.Op != Op386FlagGT_UGT { 18586 break 18587 } 18588 b.Kind = BlockFirst 18589 b.SetControl(nil) 18590 b.Aux = nil 18591 return true 18592 } 18593 case BlockIf: 18594 // match: (If (SETL cmp) yes no) 18595 // cond: 18596 // result: (LT cmp yes no) 18597 for { 18598 v := b.Control 18599 if v.Op != Op386SETL { 18600 break 18601 } 18602 cmp := v.Args[0] 18603 b.Kind = Block386LT 18604 b.SetControl(cmp) 18605 b.Aux = nil 18606 return true 18607 } 18608 // match: (If (SETLE cmp) yes no) 18609 // cond: 18610 // result: (LE cmp yes no) 18611 for { 18612 v := b.Control 18613 if v.Op != Op386SETLE { 18614 break 18615 } 18616 cmp := v.Args[0] 18617 b.Kind = Block386LE 18618 b.SetControl(cmp) 18619 b.Aux = nil 18620 return true 18621 } 18622 // match: (If (SETG cmp) yes no) 18623 // cond: 18624 // result: (GT cmp yes no) 18625 for { 18626 v := b.Control 18627 if v.Op != Op386SETG { 18628 break 18629 } 18630 cmp := v.Args[0] 18631 b.Kind = Block386GT 18632 b.SetControl(cmp) 18633 b.Aux = nil 18634 return true 18635 } 18636 // match: (If (SETGE cmp) yes no) 18637 // cond: 18638 // result: (GE cmp yes no) 18639 for { 18640 v := b.Control 18641 if v.Op != Op386SETGE { 18642 break 18643 } 18644 cmp := v.Args[0] 18645 b.Kind = Block386GE 18646 b.SetControl(cmp) 18647 b.Aux = nil 18648 return true 18649 } 18650 // match: (If (SETEQ cmp) yes no) 18651 // cond: 18652 // result: (EQ cmp yes no) 18653 for { 18654 v := b.Control 18655 if v.Op != Op386SETEQ { 18656 break 18657 } 18658 cmp := v.Args[0] 18659 b.Kind = Block386EQ 18660 b.SetControl(cmp) 18661 b.Aux = nil 18662 return true 18663 } 18664 // match: (If (SETNE cmp) yes no) 18665 // cond: 18666 // result: (NE cmp yes no) 18667 for { 18668 v := b.Control 18669 if v.Op != Op386SETNE { 18670 break 18671 } 18672 cmp := v.Args[0] 18673 b.Kind = Block386NE 18674 b.SetControl(cmp) 18675 b.Aux = nil 18676 return true 18677 } 18678 // match: (If (SETB cmp) yes no) 18679 // cond: 18680 // result: (ULT cmp yes no) 18681 for { 18682 v := b.Control 18683 if v.Op != Op386SETB { 18684 break 18685 } 18686 cmp := v.Args[0] 18687 b.Kind = Block386ULT 18688 b.SetControl(cmp) 18689 b.Aux = nil 18690 return true 18691 } 18692 // match: (If (SETBE cmp) yes no) 18693 // cond: 18694 // result: (ULE cmp yes no) 18695 for { 18696 v := b.Control 18697 if v.Op != Op386SETBE { 18698 break 18699 } 18700 cmp := v.Args[0] 18701 b.Kind = Block386ULE 18702 b.SetControl(cmp) 18703 b.Aux = nil 18704 return true 18705 } 18706 // match: (If (SETA cmp) yes no) 18707 // cond: 18708 // result: (UGT cmp yes no) 18709 for { 18710 v := b.Control 18711 if v.Op != Op386SETA { 18712 break 18713 } 18714 cmp := v.Args[0] 18715 b.Kind = Block386UGT 18716 b.SetControl(cmp) 18717 b.Aux = nil 18718 return true 18719 } 18720 // match: (If (SETAE cmp) yes no) 18721 // cond: 18722 // result: (UGE cmp yes no) 18723 for { 18724 v := b.Control 18725 if v.Op != Op386SETAE { 18726 break 18727 } 18728 cmp := v.Args[0] 18729 b.Kind = Block386UGE 18730 b.SetControl(cmp) 18731 b.Aux = nil 18732 return true 18733 } 18734 // match: (If (SETGF cmp) yes no) 18735 // cond: 18736 // result: (UGT cmp yes no) 18737 for { 18738 v := b.Control 18739 if v.Op != Op386SETGF { 18740 break 18741 } 18742 cmp := v.Args[0] 18743 b.Kind = Block386UGT 18744 b.SetControl(cmp) 18745 b.Aux = nil 18746 return true 18747 } 18748 // match: (If (SETGEF cmp) yes no) 18749 // cond: 18750 // result: (UGE cmp yes no) 18751 for { 18752 v := b.Control 18753 if v.Op != Op386SETGEF { 18754 break 18755 } 18756 cmp := v.Args[0] 18757 b.Kind = Block386UGE 18758 b.SetControl(cmp) 18759 b.Aux = nil 18760 return true 18761 } 18762 // match: (If (SETEQF cmp) yes no) 18763 // cond: 18764 // result: (EQF cmp yes no) 18765 for { 18766 v := b.Control 18767 if v.Op != Op386SETEQF { 18768 break 18769 } 18770 cmp := v.Args[0] 18771 b.Kind = Block386EQF 18772 b.SetControl(cmp) 18773 b.Aux = nil 18774 return true 18775 } 18776 // match: (If (SETNEF cmp) yes no) 18777 // cond: 18778 // result: (NEF cmp yes no) 18779 for { 18780 v := b.Control 18781 if v.Op != Op386SETNEF { 18782 break 18783 } 18784 cmp := v.Args[0] 18785 b.Kind = Block386NEF 18786 b.SetControl(cmp) 18787 b.Aux = nil 18788 return true 18789 } 18790 // match: (If cond yes no) 18791 // cond: 18792 // result: (NE (TESTB cond cond) yes no) 18793 for { 18794 v := b.Control 18795 _ = v 18796 cond := b.Control 18797 b.Kind = Block386NE 18798 v0 := b.NewValue0(v.Pos, Op386TESTB, types.TypeFlags) 18799 v0.AddArg(cond) 18800 v0.AddArg(cond) 18801 b.SetControl(v0) 18802 b.Aux = nil 18803 return true 18804 } 18805 case Block386LE: 18806 // match: (LE (InvertFlags cmp) yes no) 18807 // cond: 18808 // result: (GE cmp yes no) 18809 for { 18810 v := b.Control 18811 if v.Op != Op386InvertFlags { 18812 break 18813 } 18814 cmp := v.Args[0] 18815 b.Kind = Block386GE 18816 b.SetControl(cmp) 18817 b.Aux = nil 18818 return true 18819 } 18820 // match: (LE (FlagEQ) yes no) 18821 // cond: 18822 // result: (First nil yes no) 18823 for { 18824 v := b.Control 18825 if v.Op != Op386FlagEQ { 18826 break 18827 } 18828 b.Kind = BlockFirst 18829 b.SetControl(nil) 18830 b.Aux = nil 18831 return true 18832 } 18833 // match: (LE (FlagLT_ULT) yes no) 18834 // cond: 18835 // result: (First nil yes no) 18836 for { 18837 v := b.Control 18838 if v.Op != Op386FlagLT_ULT { 18839 break 18840 } 18841 b.Kind = BlockFirst 18842 b.SetControl(nil) 18843 b.Aux = nil 18844 return true 18845 } 18846 // match: (LE (FlagLT_UGT) yes no) 18847 // cond: 18848 // result: (First nil yes no) 18849 for { 18850 v := b.Control 18851 if v.Op != Op386FlagLT_UGT { 18852 break 18853 } 18854 b.Kind = BlockFirst 18855 b.SetControl(nil) 18856 b.Aux = nil 18857 return true 18858 } 18859 // match: (LE (FlagGT_ULT) yes no) 18860 // cond: 18861 // result: (First nil no yes) 18862 for { 18863 v := b.Control 18864 if v.Op != Op386FlagGT_ULT { 18865 break 18866 } 18867 b.Kind = BlockFirst 18868 b.SetControl(nil) 18869 b.Aux = nil 18870 b.swapSuccessors() 18871 return true 18872 } 18873 // match: (LE (FlagGT_UGT) yes no) 18874 // cond: 18875 // result: (First nil no yes) 18876 for { 18877 v := b.Control 18878 if v.Op != Op386FlagGT_UGT { 18879 break 18880 } 18881 b.Kind = BlockFirst 18882 b.SetControl(nil) 18883 b.Aux = nil 18884 b.swapSuccessors() 18885 return true 18886 } 18887 case Block386LT: 18888 // match: (LT (InvertFlags cmp) yes no) 18889 // cond: 18890 // result: (GT cmp yes no) 18891 for { 18892 v := b.Control 18893 if v.Op != Op386InvertFlags { 18894 break 18895 } 18896 cmp := v.Args[0] 18897 b.Kind = Block386GT 18898 b.SetControl(cmp) 18899 b.Aux = nil 18900 return true 18901 } 18902 // match: (LT (FlagEQ) yes no) 18903 // cond: 18904 // result: (First nil no yes) 18905 for { 18906 v := b.Control 18907 if v.Op != Op386FlagEQ { 18908 break 18909 } 18910 b.Kind = BlockFirst 18911 b.SetControl(nil) 18912 b.Aux = nil 18913 b.swapSuccessors() 18914 return true 18915 } 18916 // match: (LT (FlagLT_ULT) yes no) 18917 // cond: 18918 // result: (First nil yes no) 18919 for { 18920 v := b.Control 18921 if v.Op != Op386FlagLT_ULT { 18922 break 18923 } 18924 b.Kind = BlockFirst 18925 b.SetControl(nil) 18926 b.Aux = nil 18927 return true 18928 } 18929 // match: (LT (FlagLT_UGT) yes no) 18930 // cond: 18931 // result: (First nil yes no) 18932 for { 18933 v := b.Control 18934 if v.Op != Op386FlagLT_UGT { 18935 break 18936 } 18937 b.Kind = BlockFirst 18938 b.SetControl(nil) 18939 b.Aux = nil 18940 return true 18941 } 18942 // match: (LT (FlagGT_ULT) yes no) 18943 // cond: 18944 // result: (First nil no yes) 18945 for { 18946 v := b.Control 18947 if v.Op != Op386FlagGT_ULT { 18948 break 18949 } 18950 b.Kind = BlockFirst 18951 b.SetControl(nil) 18952 b.Aux = nil 18953 b.swapSuccessors() 18954 return true 18955 } 18956 // match: (LT (FlagGT_UGT) yes no) 18957 // cond: 18958 // result: (First nil no yes) 18959 for { 18960 v := b.Control 18961 if v.Op != Op386FlagGT_UGT { 18962 break 18963 } 18964 b.Kind = BlockFirst 18965 b.SetControl(nil) 18966 b.Aux = nil 18967 b.swapSuccessors() 18968 return true 18969 } 18970 case Block386NE: 18971 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18972 // cond: 18973 // result: (LT cmp yes no) 18974 for { 18975 v := b.Control 18976 if v.Op != Op386TESTB { 18977 break 18978 } 18979 _ = v.Args[1] 18980 v_0 := v.Args[0] 18981 if v_0.Op != Op386SETL { 18982 break 18983 } 18984 cmp := v_0.Args[0] 18985 v_1 := v.Args[1] 18986 if v_1.Op != Op386SETL { 18987 break 18988 } 18989 if cmp != v_1.Args[0] { 18990 break 18991 } 18992 b.Kind = Block386LT 18993 b.SetControl(cmp) 18994 b.Aux = nil 18995 return true 18996 } 18997 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 18998 // cond: 18999 // result: (LT cmp yes no) 19000 for { 19001 v := b.Control 19002 if v.Op != Op386TESTB { 19003 break 19004 } 19005 _ = v.Args[1] 19006 v_0 := v.Args[0] 19007 if v_0.Op != Op386SETL { 19008 break 19009 } 19010 cmp := v_0.Args[0] 19011 v_1 := v.Args[1] 19012 if v_1.Op != Op386SETL { 19013 break 19014 } 19015 if cmp != v_1.Args[0] { 19016 break 19017 } 19018 b.Kind = Block386LT 19019 b.SetControl(cmp) 19020 b.Aux = nil 19021 return true 19022 } 19023 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 19024 // cond: 19025 // result: (LE 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 != Op386SETLE { 19034 break 19035 } 19036 cmp := v_0.Args[0] 19037 v_1 := v.Args[1] 19038 if v_1.Op != Op386SETLE { 19039 break 19040 } 19041 if cmp != v_1.Args[0] { 19042 break 19043 } 19044 b.Kind = Block386LE 19045 b.SetControl(cmp) 19046 b.Aux = nil 19047 return true 19048 } 19049 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 19050 // cond: 19051 // result: (LE cmp yes no) 19052 for { 19053 v := b.Control 19054 if v.Op != Op386TESTB { 19055 break 19056 } 19057 _ = v.Args[1] 19058 v_0 := v.Args[0] 19059 if v_0.Op != Op386SETLE { 19060 break 19061 } 19062 cmp := v_0.Args[0] 19063 v_1 := v.Args[1] 19064 if v_1.Op != Op386SETLE { 19065 break 19066 } 19067 if cmp != v_1.Args[0] { 19068 break 19069 } 19070 b.Kind = Block386LE 19071 b.SetControl(cmp) 19072 b.Aux = nil 19073 return true 19074 } 19075 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 19076 // cond: 19077 // result: (GT cmp yes no) 19078 for { 19079 v := b.Control 19080 if v.Op != Op386TESTB { 19081 break 19082 } 19083 _ = v.Args[1] 19084 v_0 := v.Args[0] 19085 if v_0.Op != Op386SETG { 19086 break 19087 } 19088 cmp := v_0.Args[0] 19089 v_1 := v.Args[1] 19090 if v_1.Op != Op386SETG { 19091 break 19092 } 19093 if cmp != v_1.Args[0] { 19094 break 19095 } 19096 b.Kind = Block386GT 19097 b.SetControl(cmp) 19098 b.Aux = nil 19099 return true 19100 } 19101 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 19102 // cond: 19103 // result: (GT cmp yes no) 19104 for { 19105 v := b.Control 19106 if v.Op != Op386TESTB { 19107 break 19108 } 19109 _ = v.Args[1] 19110 v_0 := v.Args[0] 19111 if v_0.Op != Op386SETG { 19112 break 19113 } 19114 cmp := v_0.Args[0] 19115 v_1 := v.Args[1] 19116 if v_1.Op != Op386SETG { 19117 break 19118 } 19119 if cmp != v_1.Args[0] { 19120 break 19121 } 19122 b.Kind = Block386GT 19123 b.SetControl(cmp) 19124 b.Aux = nil 19125 return true 19126 } 19127 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 19128 // cond: 19129 // result: (GE cmp yes no) 19130 for { 19131 v := b.Control 19132 if v.Op != Op386TESTB { 19133 break 19134 } 19135 _ = v.Args[1] 19136 v_0 := v.Args[0] 19137 if v_0.Op != Op386SETGE { 19138 break 19139 } 19140 cmp := v_0.Args[0] 19141 v_1 := v.Args[1] 19142 if v_1.Op != Op386SETGE { 19143 break 19144 } 19145 if cmp != v_1.Args[0] { 19146 break 19147 } 19148 b.Kind = Block386GE 19149 b.SetControl(cmp) 19150 b.Aux = nil 19151 return true 19152 } 19153 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 19154 // cond: 19155 // result: (GE cmp yes no) 19156 for { 19157 v := b.Control 19158 if v.Op != Op386TESTB { 19159 break 19160 } 19161 _ = v.Args[1] 19162 v_0 := v.Args[0] 19163 if v_0.Op != Op386SETGE { 19164 break 19165 } 19166 cmp := v_0.Args[0] 19167 v_1 := v.Args[1] 19168 if v_1.Op != Op386SETGE { 19169 break 19170 } 19171 if cmp != v_1.Args[0] { 19172 break 19173 } 19174 b.Kind = Block386GE 19175 b.SetControl(cmp) 19176 b.Aux = nil 19177 return true 19178 } 19179 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 19180 // cond: 19181 // result: (EQ cmp yes no) 19182 for { 19183 v := b.Control 19184 if v.Op != Op386TESTB { 19185 break 19186 } 19187 _ = v.Args[1] 19188 v_0 := v.Args[0] 19189 if v_0.Op != Op386SETEQ { 19190 break 19191 } 19192 cmp := v_0.Args[0] 19193 v_1 := v.Args[1] 19194 if v_1.Op != Op386SETEQ { 19195 break 19196 } 19197 if cmp != v_1.Args[0] { 19198 break 19199 } 19200 b.Kind = Block386EQ 19201 b.SetControl(cmp) 19202 b.Aux = nil 19203 return true 19204 } 19205 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 19206 // cond: 19207 // result: (EQ cmp yes no) 19208 for { 19209 v := b.Control 19210 if v.Op != Op386TESTB { 19211 break 19212 } 19213 _ = v.Args[1] 19214 v_0 := v.Args[0] 19215 if v_0.Op != Op386SETEQ { 19216 break 19217 } 19218 cmp := v_0.Args[0] 19219 v_1 := v.Args[1] 19220 if v_1.Op != Op386SETEQ { 19221 break 19222 } 19223 if cmp != v_1.Args[0] { 19224 break 19225 } 19226 b.Kind = Block386EQ 19227 b.SetControl(cmp) 19228 b.Aux = nil 19229 return true 19230 } 19231 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 19232 // cond: 19233 // result: (NE cmp yes no) 19234 for { 19235 v := b.Control 19236 if v.Op != Op386TESTB { 19237 break 19238 } 19239 _ = v.Args[1] 19240 v_0 := v.Args[0] 19241 if v_0.Op != Op386SETNE { 19242 break 19243 } 19244 cmp := v_0.Args[0] 19245 v_1 := v.Args[1] 19246 if v_1.Op != Op386SETNE { 19247 break 19248 } 19249 if cmp != v_1.Args[0] { 19250 break 19251 } 19252 b.Kind = Block386NE 19253 b.SetControl(cmp) 19254 b.Aux = nil 19255 return true 19256 } 19257 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 19258 // cond: 19259 // result: (NE cmp yes no) 19260 for { 19261 v := b.Control 19262 if v.Op != Op386TESTB { 19263 break 19264 } 19265 _ = v.Args[1] 19266 v_0 := v.Args[0] 19267 if v_0.Op != Op386SETNE { 19268 break 19269 } 19270 cmp := v_0.Args[0] 19271 v_1 := v.Args[1] 19272 if v_1.Op != Op386SETNE { 19273 break 19274 } 19275 if cmp != v_1.Args[0] { 19276 break 19277 } 19278 b.Kind = Block386NE 19279 b.SetControl(cmp) 19280 b.Aux = nil 19281 return true 19282 } 19283 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 19284 // cond: 19285 // result: (ULT cmp yes no) 19286 for { 19287 v := b.Control 19288 if v.Op != Op386TESTB { 19289 break 19290 } 19291 _ = v.Args[1] 19292 v_0 := v.Args[0] 19293 if v_0.Op != Op386SETB { 19294 break 19295 } 19296 cmp := v_0.Args[0] 19297 v_1 := v.Args[1] 19298 if v_1.Op != Op386SETB { 19299 break 19300 } 19301 if cmp != v_1.Args[0] { 19302 break 19303 } 19304 b.Kind = Block386ULT 19305 b.SetControl(cmp) 19306 b.Aux = nil 19307 return true 19308 } 19309 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 19310 // cond: 19311 // result: (ULT cmp yes no) 19312 for { 19313 v := b.Control 19314 if v.Op != Op386TESTB { 19315 break 19316 } 19317 _ = v.Args[1] 19318 v_0 := v.Args[0] 19319 if v_0.Op != Op386SETB { 19320 break 19321 } 19322 cmp := v_0.Args[0] 19323 v_1 := v.Args[1] 19324 if v_1.Op != Op386SETB { 19325 break 19326 } 19327 if cmp != v_1.Args[0] { 19328 break 19329 } 19330 b.Kind = Block386ULT 19331 b.SetControl(cmp) 19332 b.Aux = nil 19333 return true 19334 } 19335 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 19336 // cond: 19337 // result: (ULE cmp yes no) 19338 for { 19339 v := b.Control 19340 if v.Op != Op386TESTB { 19341 break 19342 } 19343 _ = v.Args[1] 19344 v_0 := v.Args[0] 19345 if v_0.Op != Op386SETBE { 19346 break 19347 } 19348 cmp := v_0.Args[0] 19349 v_1 := v.Args[1] 19350 if v_1.Op != Op386SETBE { 19351 break 19352 } 19353 if cmp != v_1.Args[0] { 19354 break 19355 } 19356 b.Kind = Block386ULE 19357 b.SetControl(cmp) 19358 b.Aux = nil 19359 return true 19360 } 19361 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 19362 // cond: 19363 // result: (ULE cmp yes no) 19364 for { 19365 v := b.Control 19366 if v.Op != Op386TESTB { 19367 break 19368 } 19369 _ = v.Args[1] 19370 v_0 := v.Args[0] 19371 if v_0.Op != Op386SETBE { 19372 break 19373 } 19374 cmp := v_0.Args[0] 19375 v_1 := v.Args[1] 19376 if v_1.Op != Op386SETBE { 19377 break 19378 } 19379 if cmp != v_1.Args[0] { 19380 break 19381 } 19382 b.Kind = Block386ULE 19383 b.SetControl(cmp) 19384 b.Aux = nil 19385 return true 19386 } 19387 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 19388 // cond: 19389 // result: (UGT cmp yes no) 19390 for { 19391 v := b.Control 19392 if v.Op != Op386TESTB { 19393 break 19394 } 19395 _ = v.Args[1] 19396 v_0 := v.Args[0] 19397 if v_0.Op != Op386SETA { 19398 break 19399 } 19400 cmp := v_0.Args[0] 19401 v_1 := v.Args[1] 19402 if v_1.Op != Op386SETA { 19403 break 19404 } 19405 if cmp != v_1.Args[0] { 19406 break 19407 } 19408 b.Kind = Block386UGT 19409 b.SetControl(cmp) 19410 b.Aux = nil 19411 return true 19412 } 19413 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 19414 // cond: 19415 // result: (UGT cmp yes no) 19416 for { 19417 v := b.Control 19418 if v.Op != Op386TESTB { 19419 break 19420 } 19421 _ = v.Args[1] 19422 v_0 := v.Args[0] 19423 if v_0.Op != Op386SETA { 19424 break 19425 } 19426 cmp := v_0.Args[0] 19427 v_1 := v.Args[1] 19428 if v_1.Op != Op386SETA { 19429 break 19430 } 19431 if cmp != v_1.Args[0] { 19432 break 19433 } 19434 b.Kind = Block386UGT 19435 b.SetControl(cmp) 19436 b.Aux = nil 19437 return true 19438 } 19439 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 19440 // cond: 19441 // result: (UGE cmp yes no) 19442 for { 19443 v := b.Control 19444 if v.Op != Op386TESTB { 19445 break 19446 } 19447 _ = v.Args[1] 19448 v_0 := v.Args[0] 19449 if v_0.Op != Op386SETAE { 19450 break 19451 } 19452 cmp := v_0.Args[0] 19453 v_1 := v.Args[1] 19454 if v_1.Op != Op386SETAE { 19455 break 19456 } 19457 if cmp != v_1.Args[0] { 19458 break 19459 } 19460 b.Kind = Block386UGE 19461 b.SetControl(cmp) 19462 b.Aux = nil 19463 return true 19464 } 19465 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 19466 // cond: 19467 // result: (UGE cmp yes no) 19468 for { 19469 v := b.Control 19470 if v.Op != Op386TESTB { 19471 break 19472 } 19473 _ = v.Args[1] 19474 v_0 := v.Args[0] 19475 if v_0.Op != Op386SETAE { 19476 break 19477 } 19478 cmp := v_0.Args[0] 19479 v_1 := v.Args[1] 19480 if v_1.Op != Op386SETAE { 19481 break 19482 } 19483 if cmp != v_1.Args[0] { 19484 break 19485 } 19486 b.Kind = Block386UGE 19487 b.SetControl(cmp) 19488 b.Aux = nil 19489 return true 19490 } 19491 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 19492 // cond: 19493 // result: (UGT cmp yes no) 19494 for { 19495 v := b.Control 19496 if v.Op != Op386TESTB { 19497 break 19498 } 19499 _ = v.Args[1] 19500 v_0 := v.Args[0] 19501 if v_0.Op != Op386SETGF { 19502 break 19503 } 19504 cmp := v_0.Args[0] 19505 v_1 := v.Args[1] 19506 if v_1.Op != Op386SETGF { 19507 break 19508 } 19509 if cmp != v_1.Args[0] { 19510 break 19511 } 19512 b.Kind = Block386UGT 19513 b.SetControl(cmp) 19514 b.Aux = nil 19515 return true 19516 } 19517 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 19518 // cond: 19519 // result: (UGT cmp yes no) 19520 for { 19521 v := b.Control 19522 if v.Op != Op386TESTB { 19523 break 19524 } 19525 _ = v.Args[1] 19526 v_0 := v.Args[0] 19527 if v_0.Op != Op386SETGF { 19528 break 19529 } 19530 cmp := v_0.Args[0] 19531 v_1 := v.Args[1] 19532 if v_1.Op != Op386SETGF { 19533 break 19534 } 19535 if cmp != v_1.Args[0] { 19536 break 19537 } 19538 b.Kind = Block386UGT 19539 b.SetControl(cmp) 19540 b.Aux = nil 19541 return true 19542 } 19543 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 19544 // cond: 19545 // result: (UGE cmp yes no) 19546 for { 19547 v := b.Control 19548 if v.Op != Op386TESTB { 19549 break 19550 } 19551 _ = v.Args[1] 19552 v_0 := v.Args[0] 19553 if v_0.Op != Op386SETGEF { 19554 break 19555 } 19556 cmp := v_0.Args[0] 19557 v_1 := v.Args[1] 19558 if v_1.Op != Op386SETGEF { 19559 break 19560 } 19561 if cmp != v_1.Args[0] { 19562 break 19563 } 19564 b.Kind = Block386UGE 19565 b.SetControl(cmp) 19566 b.Aux = nil 19567 return true 19568 } 19569 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 19570 // cond: 19571 // result: (UGE cmp yes no) 19572 for { 19573 v := b.Control 19574 if v.Op != Op386TESTB { 19575 break 19576 } 19577 _ = v.Args[1] 19578 v_0 := v.Args[0] 19579 if v_0.Op != Op386SETGEF { 19580 break 19581 } 19582 cmp := v_0.Args[0] 19583 v_1 := v.Args[1] 19584 if v_1.Op != Op386SETGEF { 19585 break 19586 } 19587 if cmp != v_1.Args[0] { 19588 break 19589 } 19590 b.Kind = Block386UGE 19591 b.SetControl(cmp) 19592 b.Aux = nil 19593 return true 19594 } 19595 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 19596 // cond: 19597 // result: (EQF cmp yes no) 19598 for { 19599 v := b.Control 19600 if v.Op != Op386TESTB { 19601 break 19602 } 19603 _ = v.Args[1] 19604 v_0 := v.Args[0] 19605 if v_0.Op != Op386SETEQF { 19606 break 19607 } 19608 cmp := v_0.Args[0] 19609 v_1 := v.Args[1] 19610 if v_1.Op != Op386SETEQF { 19611 break 19612 } 19613 if cmp != v_1.Args[0] { 19614 break 19615 } 19616 b.Kind = Block386EQF 19617 b.SetControl(cmp) 19618 b.Aux = nil 19619 return true 19620 } 19621 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 19622 // cond: 19623 // result: (EQF cmp yes no) 19624 for { 19625 v := b.Control 19626 if v.Op != Op386TESTB { 19627 break 19628 } 19629 _ = v.Args[1] 19630 v_0 := v.Args[0] 19631 if v_0.Op != Op386SETEQF { 19632 break 19633 } 19634 cmp := v_0.Args[0] 19635 v_1 := v.Args[1] 19636 if v_1.Op != Op386SETEQF { 19637 break 19638 } 19639 if cmp != v_1.Args[0] { 19640 break 19641 } 19642 b.Kind = Block386EQF 19643 b.SetControl(cmp) 19644 b.Aux = nil 19645 return true 19646 } 19647 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 19648 // cond: 19649 // result: (NEF cmp yes no) 19650 for { 19651 v := b.Control 19652 if v.Op != Op386TESTB { 19653 break 19654 } 19655 _ = v.Args[1] 19656 v_0 := v.Args[0] 19657 if v_0.Op != Op386SETNEF { 19658 break 19659 } 19660 cmp := v_0.Args[0] 19661 v_1 := v.Args[1] 19662 if v_1.Op != Op386SETNEF { 19663 break 19664 } 19665 if cmp != v_1.Args[0] { 19666 break 19667 } 19668 b.Kind = Block386NEF 19669 b.SetControl(cmp) 19670 b.Aux = nil 19671 return true 19672 } 19673 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 19674 // cond: 19675 // result: (NEF cmp yes no) 19676 for { 19677 v := b.Control 19678 if v.Op != Op386TESTB { 19679 break 19680 } 19681 _ = v.Args[1] 19682 v_0 := v.Args[0] 19683 if v_0.Op != Op386SETNEF { 19684 break 19685 } 19686 cmp := v_0.Args[0] 19687 v_1 := v.Args[1] 19688 if v_1.Op != Op386SETNEF { 19689 break 19690 } 19691 if cmp != v_1.Args[0] { 19692 break 19693 } 19694 b.Kind = Block386NEF 19695 b.SetControl(cmp) 19696 b.Aux = nil 19697 return true 19698 } 19699 // match: (NE (InvertFlags cmp) yes no) 19700 // cond: 19701 // result: (NE cmp yes no) 19702 for { 19703 v := b.Control 19704 if v.Op != Op386InvertFlags { 19705 break 19706 } 19707 cmp := v.Args[0] 19708 b.Kind = Block386NE 19709 b.SetControl(cmp) 19710 b.Aux = nil 19711 return true 19712 } 19713 // match: (NE (FlagEQ) yes no) 19714 // cond: 19715 // result: (First nil no yes) 19716 for { 19717 v := b.Control 19718 if v.Op != Op386FlagEQ { 19719 break 19720 } 19721 b.Kind = BlockFirst 19722 b.SetControl(nil) 19723 b.Aux = nil 19724 b.swapSuccessors() 19725 return true 19726 } 19727 // match: (NE (FlagLT_ULT) yes no) 19728 // cond: 19729 // result: (First nil yes no) 19730 for { 19731 v := b.Control 19732 if v.Op != Op386FlagLT_ULT { 19733 break 19734 } 19735 b.Kind = BlockFirst 19736 b.SetControl(nil) 19737 b.Aux = nil 19738 return true 19739 } 19740 // match: (NE (FlagLT_UGT) yes no) 19741 // cond: 19742 // result: (First nil yes no) 19743 for { 19744 v := b.Control 19745 if v.Op != Op386FlagLT_UGT { 19746 break 19747 } 19748 b.Kind = BlockFirst 19749 b.SetControl(nil) 19750 b.Aux = nil 19751 return true 19752 } 19753 // match: (NE (FlagGT_ULT) yes no) 19754 // cond: 19755 // result: (First nil yes no) 19756 for { 19757 v := b.Control 19758 if v.Op != Op386FlagGT_ULT { 19759 break 19760 } 19761 b.Kind = BlockFirst 19762 b.SetControl(nil) 19763 b.Aux = nil 19764 return true 19765 } 19766 // match: (NE (FlagGT_UGT) yes no) 19767 // cond: 19768 // result: (First nil yes no) 19769 for { 19770 v := b.Control 19771 if v.Op != Op386FlagGT_UGT { 19772 break 19773 } 19774 b.Kind = BlockFirst 19775 b.SetControl(nil) 19776 b.Aux = nil 19777 return true 19778 } 19779 case Block386UGE: 19780 // match: (UGE (InvertFlags cmp) yes no) 19781 // cond: 19782 // result: (ULE cmp yes no) 19783 for { 19784 v := b.Control 19785 if v.Op != Op386InvertFlags { 19786 break 19787 } 19788 cmp := v.Args[0] 19789 b.Kind = Block386ULE 19790 b.SetControl(cmp) 19791 b.Aux = nil 19792 return true 19793 } 19794 // match: (UGE (FlagEQ) yes no) 19795 // cond: 19796 // result: (First nil yes no) 19797 for { 19798 v := b.Control 19799 if v.Op != Op386FlagEQ { 19800 break 19801 } 19802 b.Kind = BlockFirst 19803 b.SetControl(nil) 19804 b.Aux = nil 19805 return true 19806 } 19807 // match: (UGE (FlagLT_ULT) yes no) 19808 // cond: 19809 // result: (First nil no yes) 19810 for { 19811 v := b.Control 19812 if v.Op != Op386FlagLT_ULT { 19813 break 19814 } 19815 b.Kind = BlockFirst 19816 b.SetControl(nil) 19817 b.Aux = nil 19818 b.swapSuccessors() 19819 return true 19820 } 19821 // match: (UGE (FlagLT_UGT) yes no) 19822 // cond: 19823 // result: (First nil yes no) 19824 for { 19825 v := b.Control 19826 if v.Op != Op386FlagLT_UGT { 19827 break 19828 } 19829 b.Kind = BlockFirst 19830 b.SetControl(nil) 19831 b.Aux = nil 19832 return true 19833 } 19834 // match: (UGE (FlagGT_ULT) yes no) 19835 // cond: 19836 // result: (First nil no yes) 19837 for { 19838 v := b.Control 19839 if v.Op != Op386FlagGT_ULT { 19840 break 19841 } 19842 b.Kind = BlockFirst 19843 b.SetControl(nil) 19844 b.Aux = nil 19845 b.swapSuccessors() 19846 return true 19847 } 19848 // match: (UGE (FlagGT_UGT) yes no) 19849 // cond: 19850 // result: (First nil yes no) 19851 for { 19852 v := b.Control 19853 if v.Op != Op386FlagGT_UGT { 19854 break 19855 } 19856 b.Kind = BlockFirst 19857 b.SetControl(nil) 19858 b.Aux = nil 19859 return true 19860 } 19861 case Block386UGT: 19862 // match: (UGT (InvertFlags cmp) yes no) 19863 // cond: 19864 // result: (ULT cmp yes no) 19865 for { 19866 v := b.Control 19867 if v.Op != Op386InvertFlags { 19868 break 19869 } 19870 cmp := v.Args[0] 19871 b.Kind = Block386ULT 19872 b.SetControl(cmp) 19873 b.Aux = nil 19874 return true 19875 } 19876 // match: (UGT (FlagEQ) yes no) 19877 // cond: 19878 // result: (First nil no yes) 19879 for { 19880 v := b.Control 19881 if v.Op != Op386FlagEQ { 19882 break 19883 } 19884 b.Kind = BlockFirst 19885 b.SetControl(nil) 19886 b.Aux = nil 19887 b.swapSuccessors() 19888 return true 19889 } 19890 // match: (UGT (FlagLT_ULT) yes no) 19891 // cond: 19892 // result: (First nil no yes) 19893 for { 19894 v := b.Control 19895 if v.Op != Op386FlagLT_ULT { 19896 break 19897 } 19898 b.Kind = BlockFirst 19899 b.SetControl(nil) 19900 b.Aux = nil 19901 b.swapSuccessors() 19902 return true 19903 } 19904 // match: (UGT (FlagLT_UGT) yes no) 19905 // cond: 19906 // result: (First nil yes no) 19907 for { 19908 v := b.Control 19909 if v.Op != Op386FlagLT_UGT { 19910 break 19911 } 19912 b.Kind = BlockFirst 19913 b.SetControl(nil) 19914 b.Aux = nil 19915 return true 19916 } 19917 // match: (UGT (FlagGT_ULT) yes no) 19918 // cond: 19919 // result: (First nil no yes) 19920 for { 19921 v := b.Control 19922 if v.Op != Op386FlagGT_ULT { 19923 break 19924 } 19925 b.Kind = BlockFirst 19926 b.SetControl(nil) 19927 b.Aux = nil 19928 b.swapSuccessors() 19929 return true 19930 } 19931 // match: (UGT (FlagGT_UGT) yes no) 19932 // cond: 19933 // result: (First nil yes no) 19934 for { 19935 v := b.Control 19936 if v.Op != Op386FlagGT_UGT { 19937 break 19938 } 19939 b.Kind = BlockFirst 19940 b.SetControl(nil) 19941 b.Aux = nil 19942 return true 19943 } 19944 case Block386ULE: 19945 // match: (ULE (InvertFlags cmp) yes no) 19946 // cond: 19947 // result: (UGE cmp yes no) 19948 for { 19949 v := b.Control 19950 if v.Op != Op386InvertFlags { 19951 break 19952 } 19953 cmp := v.Args[0] 19954 b.Kind = Block386UGE 19955 b.SetControl(cmp) 19956 b.Aux = nil 19957 return true 19958 } 19959 // match: (ULE (FlagEQ) yes no) 19960 // cond: 19961 // result: (First nil yes no) 19962 for { 19963 v := b.Control 19964 if v.Op != Op386FlagEQ { 19965 break 19966 } 19967 b.Kind = BlockFirst 19968 b.SetControl(nil) 19969 b.Aux = nil 19970 return true 19971 } 19972 // match: (ULE (FlagLT_ULT) yes no) 19973 // cond: 19974 // result: (First nil yes no) 19975 for { 19976 v := b.Control 19977 if v.Op != Op386FlagLT_ULT { 19978 break 19979 } 19980 b.Kind = BlockFirst 19981 b.SetControl(nil) 19982 b.Aux = nil 19983 return true 19984 } 19985 // match: (ULE (FlagLT_UGT) yes no) 19986 // cond: 19987 // result: (First nil no yes) 19988 for { 19989 v := b.Control 19990 if v.Op != Op386FlagLT_UGT { 19991 break 19992 } 19993 b.Kind = BlockFirst 19994 b.SetControl(nil) 19995 b.Aux = nil 19996 b.swapSuccessors() 19997 return true 19998 } 19999 // match: (ULE (FlagGT_ULT) yes no) 20000 // cond: 20001 // result: (First nil yes no) 20002 for { 20003 v := b.Control 20004 if v.Op != Op386FlagGT_ULT { 20005 break 20006 } 20007 b.Kind = BlockFirst 20008 b.SetControl(nil) 20009 b.Aux = nil 20010 return true 20011 } 20012 // match: (ULE (FlagGT_UGT) yes no) 20013 // cond: 20014 // result: (First nil no yes) 20015 for { 20016 v := b.Control 20017 if v.Op != Op386FlagGT_UGT { 20018 break 20019 } 20020 b.Kind = BlockFirst 20021 b.SetControl(nil) 20022 b.Aux = nil 20023 b.swapSuccessors() 20024 return true 20025 } 20026 case Block386ULT: 20027 // match: (ULT (InvertFlags cmp) yes no) 20028 // cond: 20029 // result: (UGT cmp yes no) 20030 for { 20031 v := b.Control 20032 if v.Op != Op386InvertFlags { 20033 break 20034 } 20035 cmp := v.Args[0] 20036 b.Kind = Block386UGT 20037 b.SetControl(cmp) 20038 b.Aux = nil 20039 return true 20040 } 20041 // match: (ULT (FlagEQ) yes no) 20042 // cond: 20043 // result: (First nil no yes) 20044 for { 20045 v := b.Control 20046 if v.Op != Op386FlagEQ { 20047 break 20048 } 20049 b.Kind = BlockFirst 20050 b.SetControl(nil) 20051 b.Aux = nil 20052 b.swapSuccessors() 20053 return true 20054 } 20055 // match: (ULT (FlagLT_ULT) yes no) 20056 // cond: 20057 // result: (First nil yes no) 20058 for { 20059 v := b.Control 20060 if v.Op != Op386FlagLT_ULT { 20061 break 20062 } 20063 b.Kind = BlockFirst 20064 b.SetControl(nil) 20065 b.Aux = nil 20066 return true 20067 } 20068 // match: (ULT (FlagLT_UGT) yes no) 20069 // cond: 20070 // result: (First nil no yes) 20071 for { 20072 v := b.Control 20073 if v.Op != Op386FlagLT_UGT { 20074 break 20075 } 20076 b.Kind = BlockFirst 20077 b.SetControl(nil) 20078 b.Aux = nil 20079 b.swapSuccessors() 20080 return true 20081 } 20082 // match: (ULT (FlagGT_ULT) yes no) 20083 // cond: 20084 // result: (First nil yes no) 20085 for { 20086 v := b.Control 20087 if v.Op != Op386FlagGT_ULT { 20088 break 20089 } 20090 b.Kind = BlockFirst 20091 b.SetControl(nil) 20092 b.Aux = nil 20093 return true 20094 } 20095 // match: (ULT (FlagGT_UGT) yes no) 20096 // cond: 20097 // result: (First nil no yes) 20098 for { 20099 v := b.Control 20100 if v.Op != Op386FlagGT_UGT { 20101 break 20102 } 20103 b.Kind = BlockFirst 20104 b.SetControl(nil) 20105 b.Aux = nil 20106 b.swapSuccessors() 20107 return true 20108 } 20109 } 20110 return false 20111 }