github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/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 Op386ADDLconstmodify: 27 return rewriteValue386_Op386ADDLconstmodify_0(v) 28 case Op386ADDLconstmodifyidx4: 29 return rewriteValue386_Op386ADDLconstmodifyidx4_0(v) 30 case Op386ADDLload: 31 return rewriteValue386_Op386ADDLload_0(v) 32 case Op386ADDLloadidx4: 33 return rewriteValue386_Op386ADDLloadidx4_0(v) 34 case Op386ADDLmodify: 35 return rewriteValue386_Op386ADDLmodify_0(v) 36 case Op386ADDLmodifyidx4: 37 return rewriteValue386_Op386ADDLmodifyidx4_0(v) 38 case Op386ADDSD: 39 return rewriteValue386_Op386ADDSD_0(v) 40 case Op386ADDSDload: 41 return rewriteValue386_Op386ADDSDload_0(v) 42 case Op386ADDSS: 43 return rewriteValue386_Op386ADDSS_0(v) 44 case Op386ADDSSload: 45 return rewriteValue386_Op386ADDSSload_0(v) 46 case Op386ANDL: 47 return rewriteValue386_Op386ANDL_0(v) 48 case Op386ANDLconst: 49 return rewriteValue386_Op386ANDLconst_0(v) 50 case Op386ANDLconstmodify: 51 return rewriteValue386_Op386ANDLconstmodify_0(v) 52 case Op386ANDLconstmodifyidx4: 53 return rewriteValue386_Op386ANDLconstmodifyidx4_0(v) 54 case Op386ANDLload: 55 return rewriteValue386_Op386ANDLload_0(v) 56 case Op386ANDLloadidx4: 57 return rewriteValue386_Op386ANDLloadidx4_0(v) 58 case Op386ANDLmodify: 59 return rewriteValue386_Op386ANDLmodify_0(v) 60 case Op386ANDLmodifyidx4: 61 return rewriteValue386_Op386ANDLmodifyidx4_0(v) 62 case Op386CMPB: 63 return rewriteValue386_Op386CMPB_0(v) 64 case Op386CMPBconst: 65 return rewriteValue386_Op386CMPBconst_0(v) 66 case Op386CMPBload: 67 return rewriteValue386_Op386CMPBload_0(v) 68 case Op386CMPL: 69 return rewriteValue386_Op386CMPL_0(v) 70 case Op386CMPLconst: 71 return rewriteValue386_Op386CMPLconst_0(v) || rewriteValue386_Op386CMPLconst_10(v) 72 case Op386CMPLload: 73 return rewriteValue386_Op386CMPLload_0(v) 74 case Op386CMPW: 75 return rewriteValue386_Op386CMPW_0(v) 76 case Op386CMPWconst: 77 return rewriteValue386_Op386CMPWconst_0(v) 78 case Op386CMPWload: 79 return rewriteValue386_Op386CMPWload_0(v) 80 case Op386DIVSD: 81 return rewriteValue386_Op386DIVSD_0(v) 82 case Op386DIVSDload: 83 return rewriteValue386_Op386DIVSDload_0(v) 84 case Op386DIVSS: 85 return rewriteValue386_Op386DIVSS_0(v) 86 case Op386DIVSSload: 87 return rewriteValue386_Op386DIVSSload_0(v) 88 case Op386LEAL: 89 return rewriteValue386_Op386LEAL_0(v) 90 case Op386LEAL1: 91 return rewriteValue386_Op386LEAL1_0(v) 92 case Op386LEAL2: 93 return rewriteValue386_Op386LEAL2_0(v) 94 case Op386LEAL4: 95 return rewriteValue386_Op386LEAL4_0(v) 96 case Op386LEAL8: 97 return rewriteValue386_Op386LEAL8_0(v) 98 case Op386MOVBLSX: 99 return rewriteValue386_Op386MOVBLSX_0(v) 100 case Op386MOVBLSXload: 101 return rewriteValue386_Op386MOVBLSXload_0(v) 102 case Op386MOVBLZX: 103 return rewriteValue386_Op386MOVBLZX_0(v) 104 case Op386MOVBload: 105 return rewriteValue386_Op386MOVBload_0(v) 106 case Op386MOVBloadidx1: 107 return rewriteValue386_Op386MOVBloadidx1_0(v) 108 case Op386MOVBstore: 109 return rewriteValue386_Op386MOVBstore_0(v) || rewriteValue386_Op386MOVBstore_10(v) 110 case Op386MOVBstoreconst: 111 return rewriteValue386_Op386MOVBstoreconst_0(v) 112 case Op386MOVBstoreconstidx1: 113 return rewriteValue386_Op386MOVBstoreconstidx1_0(v) 114 case Op386MOVBstoreidx1: 115 return rewriteValue386_Op386MOVBstoreidx1_0(v) || rewriteValue386_Op386MOVBstoreidx1_10(v) || rewriteValue386_Op386MOVBstoreidx1_20(v) 116 case Op386MOVLload: 117 return rewriteValue386_Op386MOVLload_0(v) 118 case Op386MOVLloadidx1: 119 return rewriteValue386_Op386MOVLloadidx1_0(v) 120 case Op386MOVLloadidx4: 121 return rewriteValue386_Op386MOVLloadidx4_0(v) 122 case Op386MOVLstore: 123 return rewriteValue386_Op386MOVLstore_0(v) || rewriteValue386_Op386MOVLstore_10(v) || rewriteValue386_Op386MOVLstore_20(v) 124 case Op386MOVLstoreconst: 125 return rewriteValue386_Op386MOVLstoreconst_0(v) 126 case Op386MOVLstoreconstidx1: 127 return rewriteValue386_Op386MOVLstoreconstidx1_0(v) 128 case Op386MOVLstoreconstidx4: 129 return rewriteValue386_Op386MOVLstoreconstidx4_0(v) 130 case Op386MOVLstoreidx1: 131 return rewriteValue386_Op386MOVLstoreidx1_0(v) 132 case Op386MOVLstoreidx4: 133 return rewriteValue386_Op386MOVLstoreidx4_0(v) || rewriteValue386_Op386MOVLstoreidx4_10(v) 134 case Op386MOVSDconst: 135 return rewriteValue386_Op386MOVSDconst_0(v) 136 case Op386MOVSDload: 137 return rewriteValue386_Op386MOVSDload_0(v) 138 case Op386MOVSDloadidx1: 139 return rewriteValue386_Op386MOVSDloadidx1_0(v) 140 case Op386MOVSDloadidx8: 141 return rewriteValue386_Op386MOVSDloadidx8_0(v) 142 case Op386MOVSDstore: 143 return rewriteValue386_Op386MOVSDstore_0(v) 144 case Op386MOVSDstoreidx1: 145 return rewriteValue386_Op386MOVSDstoreidx1_0(v) 146 case Op386MOVSDstoreidx8: 147 return rewriteValue386_Op386MOVSDstoreidx8_0(v) 148 case Op386MOVSSconst: 149 return rewriteValue386_Op386MOVSSconst_0(v) 150 case Op386MOVSSload: 151 return rewriteValue386_Op386MOVSSload_0(v) 152 case Op386MOVSSloadidx1: 153 return rewriteValue386_Op386MOVSSloadidx1_0(v) 154 case Op386MOVSSloadidx4: 155 return rewriteValue386_Op386MOVSSloadidx4_0(v) 156 case Op386MOVSSstore: 157 return rewriteValue386_Op386MOVSSstore_0(v) 158 case Op386MOVSSstoreidx1: 159 return rewriteValue386_Op386MOVSSstoreidx1_0(v) 160 case Op386MOVSSstoreidx4: 161 return rewriteValue386_Op386MOVSSstoreidx4_0(v) 162 case Op386MOVWLSX: 163 return rewriteValue386_Op386MOVWLSX_0(v) 164 case Op386MOVWLSXload: 165 return rewriteValue386_Op386MOVWLSXload_0(v) 166 case Op386MOVWLZX: 167 return rewriteValue386_Op386MOVWLZX_0(v) 168 case Op386MOVWload: 169 return rewriteValue386_Op386MOVWload_0(v) 170 case Op386MOVWloadidx1: 171 return rewriteValue386_Op386MOVWloadidx1_0(v) 172 case Op386MOVWloadidx2: 173 return rewriteValue386_Op386MOVWloadidx2_0(v) 174 case Op386MOVWstore: 175 return rewriteValue386_Op386MOVWstore_0(v) 176 case Op386MOVWstoreconst: 177 return rewriteValue386_Op386MOVWstoreconst_0(v) 178 case Op386MOVWstoreconstidx1: 179 return rewriteValue386_Op386MOVWstoreconstidx1_0(v) 180 case Op386MOVWstoreconstidx2: 181 return rewriteValue386_Op386MOVWstoreconstidx2_0(v) 182 case Op386MOVWstoreidx1: 183 return rewriteValue386_Op386MOVWstoreidx1_0(v) || rewriteValue386_Op386MOVWstoreidx1_10(v) 184 case Op386MOVWstoreidx2: 185 return rewriteValue386_Op386MOVWstoreidx2_0(v) 186 case Op386MULL: 187 return rewriteValue386_Op386MULL_0(v) 188 case Op386MULLconst: 189 return rewriteValue386_Op386MULLconst_0(v) || rewriteValue386_Op386MULLconst_10(v) || rewriteValue386_Op386MULLconst_20(v) || rewriteValue386_Op386MULLconst_30(v) 190 case Op386MULLload: 191 return rewriteValue386_Op386MULLload_0(v) 192 case Op386MULLloadidx4: 193 return rewriteValue386_Op386MULLloadidx4_0(v) 194 case Op386MULSD: 195 return rewriteValue386_Op386MULSD_0(v) 196 case Op386MULSDload: 197 return rewriteValue386_Op386MULSDload_0(v) 198 case Op386MULSS: 199 return rewriteValue386_Op386MULSS_0(v) 200 case Op386MULSSload: 201 return rewriteValue386_Op386MULSSload_0(v) 202 case Op386NEGL: 203 return rewriteValue386_Op386NEGL_0(v) 204 case Op386NOTL: 205 return rewriteValue386_Op386NOTL_0(v) 206 case Op386ORL: 207 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) 208 case Op386ORLconst: 209 return rewriteValue386_Op386ORLconst_0(v) 210 case Op386ORLconstmodify: 211 return rewriteValue386_Op386ORLconstmodify_0(v) 212 case Op386ORLconstmodifyidx4: 213 return rewriteValue386_Op386ORLconstmodifyidx4_0(v) 214 case Op386ORLload: 215 return rewriteValue386_Op386ORLload_0(v) 216 case Op386ORLloadidx4: 217 return rewriteValue386_Op386ORLloadidx4_0(v) 218 case Op386ORLmodify: 219 return rewriteValue386_Op386ORLmodify_0(v) 220 case Op386ORLmodifyidx4: 221 return rewriteValue386_Op386ORLmodifyidx4_0(v) 222 case Op386ROLBconst: 223 return rewriteValue386_Op386ROLBconst_0(v) 224 case Op386ROLLconst: 225 return rewriteValue386_Op386ROLLconst_0(v) 226 case Op386ROLWconst: 227 return rewriteValue386_Op386ROLWconst_0(v) 228 case Op386SARB: 229 return rewriteValue386_Op386SARB_0(v) 230 case Op386SARBconst: 231 return rewriteValue386_Op386SARBconst_0(v) 232 case Op386SARL: 233 return rewriteValue386_Op386SARL_0(v) 234 case Op386SARLconst: 235 return rewriteValue386_Op386SARLconst_0(v) 236 case Op386SARW: 237 return rewriteValue386_Op386SARW_0(v) 238 case Op386SARWconst: 239 return rewriteValue386_Op386SARWconst_0(v) 240 case Op386SBBL: 241 return rewriteValue386_Op386SBBL_0(v) 242 case Op386SBBLcarrymask: 243 return rewriteValue386_Op386SBBLcarrymask_0(v) 244 case Op386SETA: 245 return rewriteValue386_Op386SETA_0(v) 246 case Op386SETAE: 247 return rewriteValue386_Op386SETAE_0(v) 248 case Op386SETB: 249 return rewriteValue386_Op386SETB_0(v) 250 case Op386SETBE: 251 return rewriteValue386_Op386SETBE_0(v) 252 case Op386SETEQ: 253 return rewriteValue386_Op386SETEQ_0(v) 254 case Op386SETG: 255 return rewriteValue386_Op386SETG_0(v) 256 case Op386SETGE: 257 return rewriteValue386_Op386SETGE_0(v) 258 case Op386SETL: 259 return rewriteValue386_Op386SETL_0(v) 260 case Op386SETLE: 261 return rewriteValue386_Op386SETLE_0(v) 262 case Op386SETNE: 263 return rewriteValue386_Op386SETNE_0(v) 264 case Op386SHLL: 265 return rewriteValue386_Op386SHLL_0(v) 266 case Op386SHLLconst: 267 return rewriteValue386_Op386SHLLconst_0(v) 268 case Op386SHRB: 269 return rewriteValue386_Op386SHRB_0(v) 270 case Op386SHRBconst: 271 return rewriteValue386_Op386SHRBconst_0(v) 272 case Op386SHRL: 273 return rewriteValue386_Op386SHRL_0(v) 274 case Op386SHRLconst: 275 return rewriteValue386_Op386SHRLconst_0(v) 276 case Op386SHRW: 277 return rewriteValue386_Op386SHRW_0(v) 278 case Op386SHRWconst: 279 return rewriteValue386_Op386SHRWconst_0(v) 280 case Op386SUBL: 281 return rewriteValue386_Op386SUBL_0(v) 282 case Op386SUBLcarry: 283 return rewriteValue386_Op386SUBLcarry_0(v) 284 case Op386SUBLconst: 285 return rewriteValue386_Op386SUBLconst_0(v) 286 case Op386SUBLload: 287 return rewriteValue386_Op386SUBLload_0(v) 288 case Op386SUBLloadidx4: 289 return rewriteValue386_Op386SUBLloadidx4_0(v) 290 case Op386SUBLmodify: 291 return rewriteValue386_Op386SUBLmodify_0(v) 292 case Op386SUBLmodifyidx4: 293 return rewriteValue386_Op386SUBLmodifyidx4_0(v) 294 case Op386SUBSD: 295 return rewriteValue386_Op386SUBSD_0(v) 296 case Op386SUBSDload: 297 return rewriteValue386_Op386SUBSDload_0(v) 298 case Op386SUBSS: 299 return rewriteValue386_Op386SUBSS_0(v) 300 case Op386SUBSSload: 301 return rewriteValue386_Op386SUBSSload_0(v) 302 case Op386XORL: 303 return rewriteValue386_Op386XORL_0(v) || rewriteValue386_Op386XORL_10(v) 304 case Op386XORLconst: 305 return rewriteValue386_Op386XORLconst_0(v) 306 case Op386XORLconstmodify: 307 return rewriteValue386_Op386XORLconstmodify_0(v) 308 case Op386XORLconstmodifyidx4: 309 return rewriteValue386_Op386XORLconstmodifyidx4_0(v) 310 case Op386XORLload: 311 return rewriteValue386_Op386XORLload_0(v) 312 case Op386XORLloadidx4: 313 return rewriteValue386_Op386XORLloadidx4_0(v) 314 case Op386XORLmodify: 315 return rewriteValue386_Op386XORLmodify_0(v) 316 case Op386XORLmodifyidx4: 317 return rewriteValue386_Op386XORLmodifyidx4_0(v) 318 case OpAdd16: 319 return rewriteValue386_OpAdd16_0(v) 320 case OpAdd32: 321 return rewriteValue386_OpAdd32_0(v) 322 case OpAdd32F: 323 return rewriteValue386_OpAdd32F_0(v) 324 case OpAdd32carry: 325 return rewriteValue386_OpAdd32carry_0(v) 326 case OpAdd32withcarry: 327 return rewriteValue386_OpAdd32withcarry_0(v) 328 case OpAdd64F: 329 return rewriteValue386_OpAdd64F_0(v) 330 case OpAdd8: 331 return rewriteValue386_OpAdd8_0(v) 332 case OpAddPtr: 333 return rewriteValue386_OpAddPtr_0(v) 334 case OpAddr: 335 return rewriteValue386_OpAddr_0(v) 336 case OpAnd16: 337 return rewriteValue386_OpAnd16_0(v) 338 case OpAnd32: 339 return rewriteValue386_OpAnd32_0(v) 340 case OpAnd8: 341 return rewriteValue386_OpAnd8_0(v) 342 case OpAndB: 343 return rewriteValue386_OpAndB_0(v) 344 case OpAvg32u: 345 return rewriteValue386_OpAvg32u_0(v) 346 case OpBswap32: 347 return rewriteValue386_OpBswap32_0(v) 348 case OpClosureCall: 349 return rewriteValue386_OpClosureCall_0(v) 350 case OpCom16: 351 return rewriteValue386_OpCom16_0(v) 352 case OpCom32: 353 return rewriteValue386_OpCom32_0(v) 354 case OpCom8: 355 return rewriteValue386_OpCom8_0(v) 356 case OpConst16: 357 return rewriteValue386_OpConst16_0(v) 358 case OpConst32: 359 return rewriteValue386_OpConst32_0(v) 360 case OpConst32F: 361 return rewriteValue386_OpConst32F_0(v) 362 case OpConst64F: 363 return rewriteValue386_OpConst64F_0(v) 364 case OpConst8: 365 return rewriteValue386_OpConst8_0(v) 366 case OpConstBool: 367 return rewriteValue386_OpConstBool_0(v) 368 case OpConstNil: 369 return rewriteValue386_OpConstNil_0(v) 370 case OpCvt32Fto32: 371 return rewriteValue386_OpCvt32Fto32_0(v) 372 case OpCvt32Fto64F: 373 return rewriteValue386_OpCvt32Fto64F_0(v) 374 case OpCvt32to32F: 375 return rewriteValue386_OpCvt32to32F_0(v) 376 case OpCvt32to64F: 377 return rewriteValue386_OpCvt32to64F_0(v) 378 case OpCvt64Fto32: 379 return rewriteValue386_OpCvt64Fto32_0(v) 380 case OpCvt64Fto32F: 381 return rewriteValue386_OpCvt64Fto32F_0(v) 382 case OpDiv16: 383 return rewriteValue386_OpDiv16_0(v) 384 case OpDiv16u: 385 return rewriteValue386_OpDiv16u_0(v) 386 case OpDiv32: 387 return rewriteValue386_OpDiv32_0(v) 388 case OpDiv32F: 389 return rewriteValue386_OpDiv32F_0(v) 390 case OpDiv32u: 391 return rewriteValue386_OpDiv32u_0(v) 392 case OpDiv64F: 393 return rewriteValue386_OpDiv64F_0(v) 394 case OpDiv8: 395 return rewriteValue386_OpDiv8_0(v) 396 case OpDiv8u: 397 return rewriteValue386_OpDiv8u_0(v) 398 case OpEq16: 399 return rewriteValue386_OpEq16_0(v) 400 case OpEq32: 401 return rewriteValue386_OpEq32_0(v) 402 case OpEq32F: 403 return rewriteValue386_OpEq32F_0(v) 404 case OpEq64F: 405 return rewriteValue386_OpEq64F_0(v) 406 case OpEq8: 407 return rewriteValue386_OpEq8_0(v) 408 case OpEqB: 409 return rewriteValue386_OpEqB_0(v) 410 case OpEqPtr: 411 return rewriteValue386_OpEqPtr_0(v) 412 case OpGeq16: 413 return rewriteValue386_OpGeq16_0(v) 414 case OpGeq16U: 415 return rewriteValue386_OpGeq16U_0(v) 416 case OpGeq32: 417 return rewriteValue386_OpGeq32_0(v) 418 case OpGeq32F: 419 return rewriteValue386_OpGeq32F_0(v) 420 case OpGeq32U: 421 return rewriteValue386_OpGeq32U_0(v) 422 case OpGeq64F: 423 return rewriteValue386_OpGeq64F_0(v) 424 case OpGeq8: 425 return rewriteValue386_OpGeq8_0(v) 426 case OpGeq8U: 427 return rewriteValue386_OpGeq8U_0(v) 428 case OpGetCallerPC: 429 return rewriteValue386_OpGetCallerPC_0(v) 430 case OpGetCallerSP: 431 return rewriteValue386_OpGetCallerSP_0(v) 432 case OpGetClosurePtr: 433 return rewriteValue386_OpGetClosurePtr_0(v) 434 case OpGetG: 435 return rewriteValue386_OpGetG_0(v) 436 case OpGreater16: 437 return rewriteValue386_OpGreater16_0(v) 438 case OpGreater16U: 439 return rewriteValue386_OpGreater16U_0(v) 440 case OpGreater32: 441 return rewriteValue386_OpGreater32_0(v) 442 case OpGreater32F: 443 return rewriteValue386_OpGreater32F_0(v) 444 case OpGreater32U: 445 return rewriteValue386_OpGreater32U_0(v) 446 case OpGreater64F: 447 return rewriteValue386_OpGreater64F_0(v) 448 case OpGreater8: 449 return rewriteValue386_OpGreater8_0(v) 450 case OpGreater8U: 451 return rewriteValue386_OpGreater8U_0(v) 452 case OpHmul32: 453 return rewriteValue386_OpHmul32_0(v) 454 case OpHmul32u: 455 return rewriteValue386_OpHmul32u_0(v) 456 case OpInterCall: 457 return rewriteValue386_OpInterCall_0(v) 458 case OpIsInBounds: 459 return rewriteValue386_OpIsInBounds_0(v) 460 case OpIsNonNil: 461 return rewriteValue386_OpIsNonNil_0(v) 462 case OpIsSliceInBounds: 463 return rewriteValue386_OpIsSliceInBounds_0(v) 464 case OpLeq16: 465 return rewriteValue386_OpLeq16_0(v) 466 case OpLeq16U: 467 return rewriteValue386_OpLeq16U_0(v) 468 case OpLeq32: 469 return rewriteValue386_OpLeq32_0(v) 470 case OpLeq32F: 471 return rewriteValue386_OpLeq32F_0(v) 472 case OpLeq32U: 473 return rewriteValue386_OpLeq32U_0(v) 474 case OpLeq64F: 475 return rewriteValue386_OpLeq64F_0(v) 476 case OpLeq8: 477 return rewriteValue386_OpLeq8_0(v) 478 case OpLeq8U: 479 return rewriteValue386_OpLeq8U_0(v) 480 case OpLess16: 481 return rewriteValue386_OpLess16_0(v) 482 case OpLess16U: 483 return rewriteValue386_OpLess16U_0(v) 484 case OpLess32: 485 return rewriteValue386_OpLess32_0(v) 486 case OpLess32F: 487 return rewriteValue386_OpLess32F_0(v) 488 case OpLess32U: 489 return rewriteValue386_OpLess32U_0(v) 490 case OpLess64F: 491 return rewriteValue386_OpLess64F_0(v) 492 case OpLess8: 493 return rewriteValue386_OpLess8_0(v) 494 case OpLess8U: 495 return rewriteValue386_OpLess8U_0(v) 496 case OpLoad: 497 return rewriteValue386_OpLoad_0(v) 498 case OpLocalAddr: 499 return rewriteValue386_OpLocalAddr_0(v) 500 case OpLsh16x16: 501 return rewriteValue386_OpLsh16x16_0(v) 502 case OpLsh16x32: 503 return rewriteValue386_OpLsh16x32_0(v) 504 case OpLsh16x64: 505 return rewriteValue386_OpLsh16x64_0(v) 506 case OpLsh16x8: 507 return rewriteValue386_OpLsh16x8_0(v) 508 case OpLsh32x16: 509 return rewriteValue386_OpLsh32x16_0(v) 510 case OpLsh32x32: 511 return rewriteValue386_OpLsh32x32_0(v) 512 case OpLsh32x64: 513 return rewriteValue386_OpLsh32x64_0(v) 514 case OpLsh32x8: 515 return rewriteValue386_OpLsh32x8_0(v) 516 case OpLsh8x16: 517 return rewriteValue386_OpLsh8x16_0(v) 518 case OpLsh8x32: 519 return rewriteValue386_OpLsh8x32_0(v) 520 case OpLsh8x64: 521 return rewriteValue386_OpLsh8x64_0(v) 522 case OpLsh8x8: 523 return rewriteValue386_OpLsh8x8_0(v) 524 case OpMod16: 525 return rewriteValue386_OpMod16_0(v) 526 case OpMod16u: 527 return rewriteValue386_OpMod16u_0(v) 528 case OpMod32: 529 return rewriteValue386_OpMod32_0(v) 530 case OpMod32u: 531 return rewriteValue386_OpMod32u_0(v) 532 case OpMod8: 533 return rewriteValue386_OpMod8_0(v) 534 case OpMod8u: 535 return rewriteValue386_OpMod8u_0(v) 536 case OpMove: 537 return rewriteValue386_OpMove_0(v) || rewriteValue386_OpMove_10(v) 538 case OpMul16: 539 return rewriteValue386_OpMul16_0(v) 540 case OpMul32: 541 return rewriteValue386_OpMul32_0(v) 542 case OpMul32F: 543 return rewriteValue386_OpMul32F_0(v) 544 case OpMul32uhilo: 545 return rewriteValue386_OpMul32uhilo_0(v) 546 case OpMul64F: 547 return rewriteValue386_OpMul64F_0(v) 548 case OpMul8: 549 return rewriteValue386_OpMul8_0(v) 550 case OpNeg16: 551 return rewriteValue386_OpNeg16_0(v) 552 case OpNeg32: 553 return rewriteValue386_OpNeg32_0(v) 554 case OpNeg32F: 555 return rewriteValue386_OpNeg32F_0(v) 556 case OpNeg64F: 557 return rewriteValue386_OpNeg64F_0(v) 558 case OpNeg8: 559 return rewriteValue386_OpNeg8_0(v) 560 case OpNeq16: 561 return rewriteValue386_OpNeq16_0(v) 562 case OpNeq32: 563 return rewriteValue386_OpNeq32_0(v) 564 case OpNeq32F: 565 return rewriteValue386_OpNeq32F_0(v) 566 case OpNeq64F: 567 return rewriteValue386_OpNeq64F_0(v) 568 case OpNeq8: 569 return rewriteValue386_OpNeq8_0(v) 570 case OpNeqB: 571 return rewriteValue386_OpNeqB_0(v) 572 case OpNeqPtr: 573 return rewriteValue386_OpNeqPtr_0(v) 574 case OpNilCheck: 575 return rewriteValue386_OpNilCheck_0(v) 576 case OpNot: 577 return rewriteValue386_OpNot_0(v) 578 case OpOffPtr: 579 return rewriteValue386_OpOffPtr_0(v) 580 case OpOr16: 581 return rewriteValue386_OpOr16_0(v) 582 case OpOr32: 583 return rewriteValue386_OpOr32_0(v) 584 case OpOr8: 585 return rewriteValue386_OpOr8_0(v) 586 case OpOrB: 587 return rewriteValue386_OpOrB_0(v) 588 case OpRound32F: 589 return rewriteValue386_OpRound32F_0(v) 590 case OpRound64F: 591 return rewriteValue386_OpRound64F_0(v) 592 case OpRsh16Ux16: 593 return rewriteValue386_OpRsh16Ux16_0(v) 594 case OpRsh16Ux32: 595 return rewriteValue386_OpRsh16Ux32_0(v) 596 case OpRsh16Ux64: 597 return rewriteValue386_OpRsh16Ux64_0(v) 598 case OpRsh16Ux8: 599 return rewriteValue386_OpRsh16Ux8_0(v) 600 case OpRsh16x16: 601 return rewriteValue386_OpRsh16x16_0(v) 602 case OpRsh16x32: 603 return rewriteValue386_OpRsh16x32_0(v) 604 case OpRsh16x64: 605 return rewriteValue386_OpRsh16x64_0(v) 606 case OpRsh16x8: 607 return rewriteValue386_OpRsh16x8_0(v) 608 case OpRsh32Ux16: 609 return rewriteValue386_OpRsh32Ux16_0(v) 610 case OpRsh32Ux32: 611 return rewriteValue386_OpRsh32Ux32_0(v) 612 case OpRsh32Ux64: 613 return rewriteValue386_OpRsh32Ux64_0(v) 614 case OpRsh32Ux8: 615 return rewriteValue386_OpRsh32Ux8_0(v) 616 case OpRsh32x16: 617 return rewriteValue386_OpRsh32x16_0(v) 618 case OpRsh32x32: 619 return rewriteValue386_OpRsh32x32_0(v) 620 case OpRsh32x64: 621 return rewriteValue386_OpRsh32x64_0(v) 622 case OpRsh32x8: 623 return rewriteValue386_OpRsh32x8_0(v) 624 case OpRsh8Ux16: 625 return rewriteValue386_OpRsh8Ux16_0(v) 626 case OpRsh8Ux32: 627 return rewriteValue386_OpRsh8Ux32_0(v) 628 case OpRsh8Ux64: 629 return rewriteValue386_OpRsh8Ux64_0(v) 630 case OpRsh8Ux8: 631 return rewriteValue386_OpRsh8Ux8_0(v) 632 case OpRsh8x16: 633 return rewriteValue386_OpRsh8x16_0(v) 634 case OpRsh8x32: 635 return rewriteValue386_OpRsh8x32_0(v) 636 case OpRsh8x64: 637 return rewriteValue386_OpRsh8x64_0(v) 638 case OpRsh8x8: 639 return rewriteValue386_OpRsh8x8_0(v) 640 case OpSelect0: 641 return rewriteValue386_OpSelect0_0(v) 642 case OpSelect1: 643 return rewriteValue386_OpSelect1_0(v) 644 case OpSignExt16to32: 645 return rewriteValue386_OpSignExt16to32_0(v) 646 case OpSignExt8to16: 647 return rewriteValue386_OpSignExt8to16_0(v) 648 case OpSignExt8to32: 649 return rewriteValue386_OpSignExt8to32_0(v) 650 case OpSignmask: 651 return rewriteValue386_OpSignmask_0(v) 652 case OpSlicemask: 653 return rewriteValue386_OpSlicemask_0(v) 654 case OpSqrt: 655 return rewriteValue386_OpSqrt_0(v) 656 case OpStaticCall: 657 return rewriteValue386_OpStaticCall_0(v) 658 case OpStore: 659 return rewriteValue386_OpStore_0(v) 660 case OpSub16: 661 return rewriteValue386_OpSub16_0(v) 662 case OpSub32: 663 return rewriteValue386_OpSub32_0(v) 664 case OpSub32F: 665 return rewriteValue386_OpSub32F_0(v) 666 case OpSub32carry: 667 return rewriteValue386_OpSub32carry_0(v) 668 case OpSub32withcarry: 669 return rewriteValue386_OpSub32withcarry_0(v) 670 case OpSub64F: 671 return rewriteValue386_OpSub64F_0(v) 672 case OpSub8: 673 return rewriteValue386_OpSub8_0(v) 674 case OpSubPtr: 675 return rewriteValue386_OpSubPtr_0(v) 676 case OpTrunc16to8: 677 return rewriteValue386_OpTrunc16to8_0(v) 678 case OpTrunc32to16: 679 return rewriteValue386_OpTrunc32to16_0(v) 680 case OpTrunc32to8: 681 return rewriteValue386_OpTrunc32to8_0(v) 682 case OpWB: 683 return rewriteValue386_OpWB_0(v) 684 case OpXor16: 685 return rewriteValue386_OpXor16_0(v) 686 case OpXor32: 687 return rewriteValue386_OpXor32_0(v) 688 case OpXor8: 689 return rewriteValue386_OpXor8_0(v) 690 case OpZero: 691 return rewriteValue386_OpZero_0(v) || rewriteValue386_OpZero_10(v) 692 case OpZeroExt16to32: 693 return rewriteValue386_OpZeroExt16to32_0(v) 694 case OpZeroExt8to16: 695 return rewriteValue386_OpZeroExt8to16_0(v) 696 case OpZeroExt8to32: 697 return rewriteValue386_OpZeroExt8to32_0(v) 698 case OpZeromask: 699 return rewriteValue386_OpZeromask_0(v) 700 } 701 return false 702 } 703 func rewriteValue386_Op386ADCL_0(v *Value) bool { 704 // match: (ADCL x (MOVLconst [c]) f) 705 // cond: 706 // result: (ADCLconst [c] x f) 707 for { 708 _ = v.Args[2] 709 x := v.Args[0] 710 v_1 := v.Args[1] 711 if v_1.Op != Op386MOVLconst { 712 break 713 } 714 c := v_1.AuxInt 715 f := v.Args[2] 716 v.reset(Op386ADCLconst) 717 v.AuxInt = c 718 v.AddArg(x) 719 v.AddArg(f) 720 return true 721 } 722 // match: (ADCL (MOVLconst [c]) x f) 723 // cond: 724 // result: (ADCLconst [c] x f) 725 for { 726 _ = v.Args[2] 727 v_0 := v.Args[0] 728 if v_0.Op != Op386MOVLconst { 729 break 730 } 731 c := v_0.AuxInt 732 x := v.Args[1] 733 f := v.Args[2] 734 v.reset(Op386ADCLconst) 735 v.AuxInt = c 736 v.AddArg(x) 737 v.AddArg(f) 738 return true 739 } 740 // match: (ADCL (MOVLconst [c]) x f) 741 // cond: 742 // result: (ADCLconst [c] x f) 743 for { 744 _ = v.Args[2] 745 v_0 := v.Args[0] 746 if v_0.Op != Op386MOVLconst { 747 break 748 } 749 c := v_0.AuxInt 750 x := v.Args[1] 751 f := v.Args[2] 752 v.reset(Op386ADCLconst) 753 v.AuxInt = c 754 v.AddArg(x) 755 v.AddArg(f) 756 return true 757 } 758 // match: (ADCL x (MOVLconst [c]) f) 759 // cond: 760 // result: (ADCLconst [c] x f) 761 for { 762 _ = v.Args[2] 763 x := v.Args[0] 764 v_1 := v.Args[1] 765 if v_1.Op != Op386MOVLconst { 766 break 767 } 768 c := v_1.AuxInt 769 f := v.Args[2] 770 v.reset(Op386ADCLconst) 771 v.AuxInt = c 772 v.AddArg(x) 773 v.AddArg(f) 774 return true 775 } 776 return false 777 } 778 func rewriteValue386_Op386ADDL_0(v *Value) bool { 779 // match: (ADDL x (MOVLconst [c])) 780 // cond: 781 // result: (ADDLconst [c] x) 782 for { 783 _ = v.Args[1] 784 x := v.Args[0] 785 v_1 := v.Args[1] 786 if v_1.Op != Op386MOVLconst { 787 break 788 } 789 c := v_1.AuxInt 790 v.reset(Op386ADDLconst) 791 v.AuxInt = c 792 v.AddArg(x) 793 return true 794 } 795 // match: (ADDL (MOVLconst [c]) x) 796 // cond: 797 // result: (ADDLconst [c] x) 798 for { 799 _ = v.Args[1] 800 v_0 := v.Args[0] 801 if v_0.Op != Op386MOVLconst { 802 break 803 } 804 c := v_0.AuxInt 805 x := v.Args[1] 806 v.reset(Op386ADDLconst) 807 v.AuxInt = c 808 v.AddArg(x) 809 return true 810 } 811 // match: (ADDL (SHLLconst [c] x) (SHRLconst [d] x)) 812 // cond: d == 32-c 813 // result: (ROLLconst [c] x) 814 for { 815 _ = v.Args[1] 816 v_0 := v.Args[0] 817 if v_0.Op != Op386SHLLconst { 818 break 819 } 820 c := v_0.AuxInt 821 x := v_0.Args[0] 822 v_1 := v.Args[1] 823 if v_1.Op != Op386SHRLconst { 824 break 825 } 826 d := v_1.AuxInt 827 if x != v_1.Args[0] { 828 break 829 } 830 if !(d == 32-c) { 831 break 832 } 833 v.reset(Op386ROLLconst) 834 v.AuxInt = c 835 v.AddArg(x) 836 return true 837 } 838 // match: (ADDL (SHRLconst [d] x) (SHLLconst [c] x)) 839 // cond: d == 32-c 840 // result: (ROLLconst [c] x) 841 for { 842 _ = v.Args[1] 843 v_0 := v.Args[0] 844 if v_0.Op != Op386SHRLconst { 845 break 846 } 847 d := v_0.AuxInt 848 x := v_0.Args[0] 849 v_1 := v.Args[1] 850 if v_1.Op != Op386SHLLconst { 851 break 852 } 853 c := v_1.AuxInt 854 if x != v_1.Args[0] { 855 break 856 } 857 if !(d == 32-c) { 858 break 859 } 860 v.reset(Op386ROLLconst) 861 v.AuxInt = c 862 v.AddArg(x) 863 return true 864 } 865 // match: (ADDL <t> (SHLLconst x [c]) (SHRWconst x [d])) 866 // cond: c < 16 && d == 16-c && t.Size() == 2 867 // result: (ROLWconst x [c]) 868 for { 869 t := v.Type 870 _ = v.Args[1] 871 v_0 := v.Args[0] 872 if v_0.Op != Op386SHLLconst { 873 break 874 } 875 c := v_0.AuxInt 876 x := v_0.Args[0] 877 v_1 := v.Args[1] 878 if v_1.Op != Op386SHRWconst { 879 break 880 } 881 d := v_1.AuxInt 882 if x != v_1.Args[0] { 883 break 884 } 885 if !(c < 16 && d == 16-c && t.Size() == 2) { 886 break 887 } 888 v.reset(Op386ROLWconst) 889 v.AuxInt = c 890 v.AddArg(x) 891 return true 892 } 893 // match: (ADDL <t> (SHRWconst x [d]) (SHLLconst x [c])) 894 // cond: c < 16 && d == 16-c && t.Size() == 2 895 // result: (ROLWconst x [c]) 896 for { 897 t := v.Type 898 _ = v.Args[1] 899 v_0 := v.Args[0] 900 if v_0.Op != Op386SHRWconst { 901 break 902 } 903 d := v_0.AuxInt 904 x := v_0.Args[0] 905 v_1 := v.Args[1] 906 if v_1.Op != Op386SHLLconst { 907 break 908 } 909 c := v_1.AuxInt 910 if x != v_1.Args[0] { 911 break 912 } 913 if !(c < 16 && d == 16-c && t.Size() == 2) { 914 break 915 } 916 v.reset(Op386ROLWconst) 917 v.AuxInt = c 918 v.AddArg(x) 919 return true 920 } 921 // match: (ADDL <t> (SHLLconst x [c]) (SHRBconst x [d])) 922 // cond: c < 8 && d == 8-c && t.Size() == 1 923 // result: (ROLBconst x [c]) 924 for { 925 t := v.Type 926 _ = v.Args[1] 927 v_0 := v.Args[0] 928 if v_0.Op != Op386SHLLconst { 929 break 930 } 931 c := v_0.AuxInt 932 x := v_0.Args[0] 933 v_1 := v.Args[1] 934 if v_1.Op != Op386SHRBconst { 935 break 936 } 937 d := v_1.AuxInt 938 if x != v_1.Args[0] { 939 break 940 } 941 if !(c < 8 && d == 8-c && t.Size() == 1) { 942 break 943 } 944 v.reset(Op386ROLBconst) 945 v.AuxInt = c 946 v.AddArg(x) 947 return true 948 } 949 // match: (ADDL <t> (SHRBconst x [d]) (SHLLconst x [c])) 950 // cond: c < 8 && d == 8-c && t.Size() == 1 951 // result: (ROLBconst x [c]) 952 for { 953 t := v.Type 954 _ = v.Args[1] 955 v_0 := v.Args[0] 956 if v_0.Op != Op386SHRBconst { 957 break 958 } 959 d := v_0.AuxInt 960 x := v_0.Args[0] 961 v_1 := v.Args[1] 962 if v_1.Op != Op386SHLLconst { 963 break 964 } 965 c := v_1.AuxInt 966 if x != v_1.Args[0] { 967 break 968 } 969 if !(c < 8 && d == 8-c && t.Size() == 1) { 970 break 971 } 972 v.reset(Op386ROLBconst) 973 v.AuxInt = c 974 v.AddArg(x) 975 return true 976 } 977 // match: (ADDL x (SHLLconst [3] y)) 978 // cond: 979 // result: (LEAL8 x y) 980 for { 981 _ = v.Args[1] 982 x := v.Args[0] 983 v_1 := v.Args[1] 984 if v_1.Op != Op386SHLLconst { 985 break 986 } 987 if v_1.AuxInt != 3 { 988 break 989 } 990 y := v_1.Args[0] 991 v.reset(Op386LEAL8) 992 v.AddArg(x) 993 v.AddArg(y) 994 return true 995 } 996 // match: (ADDL (SHLLconst [3] y) x) 997 // cond: 998 // result: (LEAL8 x y) 999 for { 1000 _ = v.Args[1] 1001 v_0 := v.Args[0] 1002 if v_0.Op != Op386SHLLconst { 1003 break 1004 } 1005 if v_0.AuxInt != 3 { 1006 break 1007 } 1008 y := v_0.Args[0] 1009 x := v.Args[1] 1010 v.reset(Op386LEAL8) 1011 v.AddArg(x) 1012 v.AddArg(y) 1013 return true 1014 } 1015 return false 1016 } 1017 func rewriteValue386_Op386ADDL_10(v *Value) bool { 1018 // match: (ADDL x (SHLLconst [2] y)) 1019 // cond: 1020 // result: (LEAL4 x y) 1021 for { 1022 _ = v.Args[1] 1023 x := v.Args[0] 1024 v_1 := v.Args[1] 1025 if v_1.Op != Op386SHLLconst { 1026 break 1027 } 1028 if v_1.AuxInt != 2 { 1029 break 1030 } 1031 y := v_1.Args[0] 1032 v.reset(Op386LEAL4) 1033 v.AddArg(x) 1034 v.AddArg(y) 1035 return true 1036 } 1037 // match: (ADDL (SHLLconst [2] y) x) 1038 // cond: 1039 // result: (LEAL4 x y) 1040 for { 1041 _ = v.Args[1] 1042 v_0 := v.Args[0] 1043 if v_0.Op != Op386SHLLconst { 1044 break 1045 } 1046 if v_0.AuxInt != 2 { 1047 break 1048 } 1049 y := v_0.Args[0] 1050 x := v.Args[1] 1051 v.reset(Op386LEAL4) 1052 v.AddArg(x) 1053 v.AddArg(y) 1054 return true 1055 } 1056 // match: (ADDL x (SHLLconst [1] y)) 1057 // cond: 1058 // result: (LEAL2 x y) 1059 for { 1060 _ = v.Args[1] 1061 x := v.Args[0] 1062 v_1 := v.Args[1] 1063 if v_1.Op != Op386SHLLconst { 1064 break 1065 } 1066 if v_1.AuxInt != 1 { 1067 break 1068 } 1069 y := v_1.Args[0] 1070 v.reset(Op386LEAL2) 1071 v.AddArg(x) 1072 v.AddArg(y) 1073 return true 1074 } 1075 // match: (ADDL (SHLLconst [1] y) x) 1076 // cond: 1077 // result: (LEAL2 x y) 1078 for { 1079 _ = v.Args[1] 1080 v_0 := v.Args[0] 1081 if v_0.Op != Op386SHLLconst { 1082 break 1083 } 1084 if v_0.AuxInt != 1 { 1085 break 1086 } 1087 y := v_0.Args[0] 1088 x := v.Args[1] 1089 v.reset(Op386LEAL2) 1090 v.AddArg(x) 1091 v.AddArg(y) 1092 return true 1093 } 1094 // match: (ADDL x (ADDL y y)) 1095 // cond: 1096 // result: (LEAL2 x y) 1097 for { 1098 _ = v.Args[1] 1099 x := v.Args[0] 1100 v_1 := v.Args[1] 1101 if v_1.Op != Op386ADDL { 1102 break 1103 } 1104 _ = v_1.Args[1] 1105 y := v_1.Args[0] 1106 if y != v_1.Args[1] { 1107 break 1108 } 1109 v.reset(Op386LEAL2) 1110 v.AddArg(x) 1111 v.AddArg(y) 1112 return true 1113 } 1114 // match: (ADDL (ADDL y y) x) 1115 // cond: 1116 // result: (LEAL2 x y) 1117 for { 1118 _ = v.Args[1] 1119 v_0 := v.Args[0] 1120 if v_0.Op != Op386ADDL { 1121 break 1122 } 1123 _ = v_0.Args[1] 1124 y := v_0.Args[0] 1125 if y != v_0.Args[1] { 1126 break 1127 } 1128 x := v.Args[1] 1129 v.reset(Op386LEAL2) 1130 v.AddArg(x) 1131 v.AddArg(y) 1132 return true 1133 } 1134 // match: (ADDL x (ADDL x y)) 1135 // cond: 1136 // result: (LEAL2 y x) 1137 for { 1138 _ = v.Args[1] 1139 x := v.Args[0] 1140 v_1 := v.Args[1] 1141 if v_1.Op != Op386ADDL { 1142 break 1143 } 1144 _ = v_1.Args[1] 1145 if x != v_1.Args[0] { 1146 break 1147 } 1148 y := v_1.Args[1] 1149 v.reset(Op386LEAL2) 1150 v.AddArg(y) 1151 v.AddArg(x) 1152 return true 1153 } 1154 // match: (ADDL x (ADDL y x)) 1155 // cond: 1156 // result: (LEAL2 y x) 1157 for { 1158 _ = v.Args[1] 1159 x := v.Args[0] 1160 v_1 := v.Args[1] 1161 if v_1.Op != Op386ADDL { 1162 break 1163 } 1164 _ = v_1.Args[1] 1165 y := v_1.Args[0] 1166 if x != v_1.Args[1] { 1167 break 1168 } 1169 v.reset(Op386LEAL2) 1170 v.AddArg(y) 1171 v.AddArg(x) 1172 return true 1173 } 1174 // match: (ADDL (ADDL x y) x) 1175 // cond: 1176 // result: (LEAL2 y x) 1177 for { 1178 _ = v.Args[1] 1179 v_0 := v.Args[0] 1180 if v_0.Op != Op386ADDL { 1181 break 1182 } 1183 _ = v_0.Args[1] 1184 x := v_0.Args[0] 1185 y := v_0.Args[1] 1186 if x != v.Args[1] { 1187 break 1188 } 1189 v.reset(Op386LEAL2) 1190 v.AddArg(y) 1191 v.AddArg(x) 1192 return true 1193 } 1194 // match: (ADDL (ADDL y x) x) 1195 // cond: 1196 // result: (LEAL2 y x) 1197 for { 1198 _ = v.Args[1] 1199 v_0 := v.Args[0] 1200 if v_0.Op != Op386ADDL { 1201 break 1202 } 1203 _ = v_0.Args[1] 1204 y := v_0.Args[0] 1205 x := v_0.Args[1] 1206 if x != v.Args[1] { 1207 break 1208 } 1209 v.reset(Op386LEAL2) 1210 v.AddArg(y) 1211 v.AddArg(x) 1212 return true 1213 } 1214 return false 1215 } 1216 func rewriteValue386_Op386ADDL_20(v *Value) bool { 1217 // match: (ADDL (ADDLconst [c] x) y) 1218 // cond: 1219 // result: (LEAL1 [c] x y) 1220 for { 1221 _ = v.Args[1] 1222 v_0 := v.Args[0] 1223 if v_0.Op != Op386ADDLconst { 1224 break 1225 } 1226 c := v_0.AuxInt 1227 x := v_0.Args[0] 1228 y := v.Args[1] 1229 v.reset(Op386LEAL1) 1230 v.AuxInt = c 1231 v.AddArg(x) 1232 v.AddArg(y) 1233 return true 1234 } 1235 // match: (ADDL y (ADDLconst [c] x)) 1236 // cond: 1237 // result: (LEAL1 [c] x y) 1238 for { 1239 _ = v.Args[1] 1240 y := v.Args[0] 1241 v_1 := v.Args[1] 1242 if v_1.Op != Op386ADDLconst { 1243 break 1244 } 1245 c := v_1.AuxInt 1246 x := v_1.Args[0] 1247 v.reset(Op386LEAL1) 1248 v.AuxInt = c 1249 v.AddArg(x) 1250 v.AddArg(y) 1251 return true 1252 } 1253 // match: (ADDL x (LEAL [c] {s} y)) 1254 // cond: x.Op != OpSB && y.Op != OpSB 1255 // result: (LEAL1 [c] {s} x y) 1256 for { 1257 _ = v.Args[1] 1258 x := v.Args[0] 1259 v_1 := v.Args[1] 1260 if v_1.Op != Op386LEAL { 1261 break 1262 } 1263 c := v_1.AuxInt 1264 s := v_1.Aux 1265 y := v_1.Args[0] 1266 if !(x.Op != OpSB && y.Op != OpSB) { 1267 break 1268 } 1269 v.reset(Op386LEAL1) 1270 v.AuxInt = c 1271 v.Aux = s 1272 v.AddArg(x) 1273 v.AddArg(y) 1274 return true 1275 } 1276 // match: (ADDL (LEAL [c] {s} y) x) 1277 // cond: x.Op != OpSB && y.Op != OpSB 1278 // result: (LEAL1 [c] {s} x y) 1279 for { 1280 _ = v.Args[1] 1281 v_0 := v.Args[0] 1282 if v_0.Op != Op386LEAL { 1283 break 1284 } 1285 c := v_0.AuxInt 1286 s := v_0.Aux 1287 y := v_0.Args[0] 1288 x := v.Args[1] 1289 if !(x.Op != OpSB && y.Op != OpSB) { 1290 break 1291 } 1292 v.reset(Op386LEAL1) 1293 v.AuxInt = c 1294 v.Aux = s 1295 v.AddArg(x) 1296 v.AddArg(y) 1297 return true 1298 } 1299 // match: (ADDL x l:(MOVLload [off] {sym} ptr mem)) 1300 // cond: canMergeLoad(v, l, x) && clobber(l) 1301 // result: (ADDLload x [off] {sym} ptr mem) 1302 for { 1303 _ = v.Args[1] 1304 x := v.Args[0] 1305 l := v.Args[1] 1306 if l.Op != Op386MOVLload { 1307 break 1308 } 1309 off := l.AuxInt 1310 sym := l.Aux 1311 _ = l.Args[1] 1312 ptr := l.Args[0] 1313 mem := l.Args[1] 1314 if !(canMergeLoad(v, l, x) && clobber(l)) { 1315 break 1316 } 1317 v.reset(Op386ADDLload) 1318 v.AuxInt = off 1319 v.Aux = sym 1320 v.AddArg(x) 1321 v.AddArg(ptr) 1322 v.AddArg(mem) 1323 return true 1324 } 1325 // match: (ADDL l:(MOVLload [off] {sym} ptr mem) x) 1326 // cond: canMergeLoad(v, l, x) && clobber(l) 1327 // result: (ADDLload x [off] {sym} ptr mem) 1328 for { 1329 _ = v.Args[1] 1330 l := v.Args[0] 1331 if l.Op != Op386MOVLload { 1332 break 1333 } 1334 off := l.AuxInt 1335 sym := l.Aux 1336 _ = l.Args[1] 1337 ptr := l.Args[0] 1338 mem := l.Args[1] 1339 x := v.Args[1] 1340 if !(canMergeLoad(v, l, x) && clobber(l)) { 1341 break 1342 } 1343 v.reset(Op386ADDLload) 1344 v.AuxInt = off 1345 v.Aux = sym 1346 v.AddArg(x) 1347 v.AddArg(ptr) 1348 v.AddArg(mem) 1349 return true 1350 } 1351 // match: (ADDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) 1352 // cond: canMergeLoad(v, l, x) && clobber(l) 1353 // result: (ADDLloadidx4 x [off] {sym} ptr idx mem) 1354 for { 1355 _ = v.Args[1] 1356 x := v.Args[0] 1357 l := v.Args[1] 1358 if l.Op != Op386MOVLloadidx4 { 1359 break 1360 } 1361 off := l.AuxInt 1362 sym := l.Aux 1363 _ = l.Args[2] 1364 ptr := l.Args[0] 1365 idx := l.Args[1] 1366 mem := l.Args[2] 1367 if !(canMergeLoad(v, l, x) && clobber(l)) { 1368 break 1369 } 1370 v.reset(Op386ADDLloadidx4) 1371 v.AuxInt = off 1372 v.Aux = sym 1373 v.AddArg(x) 1374 v.AddArg(ptr) 1375 v.AddArg(idx) 1376 v.AddArg(mem) 1377 return true 1378 } 1379 // match: (ADDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) 1380 // cond: canMergeLoad(v, l, x) && clobber(l) 1381 // result: (ADDLloadidx4 x [off] {sym} ptr idx mem) 1382 for { 1383 _ = v.Args[1] 1384 l := v.Args[0] 1385 if l.Op != Op386MOVLloadidx4 { 1386 break 1387 } 1388 off := l.AuxInt 1389 sym := l.Aux 1390 _ = l.Args[2] 1391 ptr := l.Args[0] 1392 idx := l.Args[1] 1393 mem := l.Args[2] 1394 x := v.Args[1] 1395 if !(canMergeLoad(v, l, x) && clobber(l)) { 1396 break 1397 } 1398 v.reset(Op386ADDLloadidx4) 1399 v.AuxInt = off 1400 v.Aux = sym 1401 v.AddArg(x) 1402 v.AddArg(ptr) 1403 v.AddArg(idx) 1404 v.AddArg(mem) 1405 return true 1406 } 1407 // match: (ADDL x (NEGL y)) 1408 // cond: 1409 // result: (SUBL x y) 1410 for { 1411 _ = v.Args[1] 1412 x := v.Args[0] 1413 v_1 := v.Args[1] 1414 if v_1.Op != Op386NEGL { 1415 break 1416 } 1417 y := v_1.Args[0] 1418 v.reset(Op386SUBL) 1419 v.AddArg(x) 1420 v.AddArg(y) 1421 return true 1422 } 1423 // match: (ADDL (NEGL y) x) 1424 // cond: 1425 // result: (SUBL x y) 1426 for { 1427 _ = v.Args[1] 1428 v_0 := v.Args[0] 1429 if v_0.Op != Op386NEGL { 1430 break 1431 } 1432 y := v_0.Args[0] 1433 x := v.Args[1] 1434 v.reset(Op386SUBL) 1435 v.AddArg(x) 1436 v.AddArg(y) 1437 return true 1438 } 1439 return false 1440 } 1441 func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { 1442 // match: (ADDLcarry x (MOVLconst [c])) 1443 // cond: 1444 // result: (ADDLconstcarry [c] x) 1445 for { 1446 _ = v.Args[1] 1447 x := v.Args[0] 1448 v_1 := v.Args[1] 1449 if v_1.Op != Op386MOVLconst { 1450 break 1451 } 1452 c := v_1.AuxInt 1453 v.reset(Op386ADDLconstcarry) 1454 v.AuxInt = c 1455 v.AddArg(x) 1456 return true 1457 } 1458 // match: (ADDLcarry (MOVLconst [c]) x) 1459 // cond: 1460 // result: (ADDLconstcarry [c] x) 1461 for { 1462 _ = v.Args[1] 1463 v_0 := v.Args[0] 1464 if v_0.Op != Op386MOVLconst { 1465 break 1466 } 1467 c := v_0.AuxInt 1468 x := v.Args[1] 1469 v.reset(Op386ADDLconstcarry) 1470 v.AuxInt = c 1471 v.AddArg(x) 1472 return true 1473 } 1474 return false 1475 } 1476 func rewriteValue386_Op386ADDLconst_0(v *Value) bool { 1477 // match: (ADDLconst [c] (ADDL x y)) 1478 // cond: 1479 // result: (LEAL1 [c] x y) 1480 for { 1481 c := v.AuxInt 1482 v_0 := v.Args[0] 1483 if v_0.Op != Op386ADDL { 1484 break 1485 } 1486 _ = v_0.Args[1] 1487 x := v_0.Args[0] 1488 y := v_0.Args[1] 1489 v.reset(Op386LEAL1) 1490 v.AuxInt = c 1491 v.AddArg(x) 1492 v.AddArg(y) 1493 return true 1494 } 1495 // match: (ADDLconst [c] (LEAL [d] {s} x)) 1496 // cond: is32Bit(c+d) 1497 // result: (LEAL [c+d] {s} x) 1498 for { 1499 c := v.AuxInt 1500 v_0 := v.Args[0] 1501 if v_0.Op != Op386LEAL { 1502 break 1503 } 1504 d := v_0.AuxInt 1505 s := v_0.Aux 1506 x := v_0.Args[0] 1507 if !(is32Bit(c + d)) { 1508 break 1509 } 1510 v.reset(Op386LEAL) 1511 v.AuxInt = c + d 1512 v.Aux = s 1513 v.AddArg(x) 1514 return true 1515 } 1516 // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) 1517 // cond: is32Bit(c+d) 1518 // result: (LEAL1 [c+d] {s} x y) 1519 for { 1520 c := v.AuxInt 1521 v_0 := v.Args[0] 1522 if v_0.Op != Op386LEAL1 { 1523 break 1524 } 1525 d := v_0.AuxInt 1526 s := v_0.Aux 1527 _ = v_0.Args[1] 1528 x := v_0.Args[0] 1529 y := v_0.Args[1] 1530 if !(is32Bit(c + d)) { 1531 break 1532 } 1533 v.reset(Op386LEAL1) 1534 v.AuxInt = c + d 1535 v.Aux = s 1536 v.AddArg(x) 1537 v.AddArg(y) 1538 return true 1539 } 1540 // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) 1541 // cond: is32Bit(c+d) 1542 // result: (LEAL2 [c+d] {s} x y) 1543 for { 1544 c := v.AuxInt 1545 v_0 := v.Args[0] 1546 if v_0.Op != Op386LEAL2 { 1547 break 1548 } 1549 d := v_0.AuxInt 1550 s := v_0.Aux 1551 _ = v_0.Args[1] 1552 x := v_0.Args[0] 1553 y := v_0.Args[1] 1554 if !(is32Bit(c + d)) { 1555 break 1556 } 1557 v.reset(Op386LEAL2) 1558 v.AuxInt = c + d 1559 v.Aux = s 1560 v.AddArg(x) 1561 v.AddArg(y) 1562 return true 1563 } 1564 // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) 1565 // cond: is32Bit(c+d) 1566 // result: (LEAL4 [c+d] {s} x y) 1567 for { 1568 c := v.AuxInt 1569 v_0 := v.Args[0] 1570 if v_0.Op != Op386LEAL4 { 1571 break 1572 } 1573 d := v_0.AuxInt 1574 s := v_0.Aux 1575 _ = v_0.Args[1] 1576 x := v_0.Args[0] 1577 y := v_0.Args[1] 1578 if !(is32Bit(c + d)) { 1579 break 1580 } 1581 v.reset(Op386LEAL4) 1582 v.AuxInt = c + d 1583 v.Aux = s 1584 v.AddArg(x) 1585 v.AddArg(y) 1586 return true 1587 } 1588 // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) 1589 // cond: is32Bit(c+d) 1590 // result: (LEAL8 [c+d] {s} x y) 1591 for { 1592 c := v.AuxInt 1593 v_0 := v.Args[0] 1594 if v_0.Op != Op386LEAL8 { 1595 break 1596 } 1597 d := v_0.AuxInt 1598 s := v_0.Aux 1599 _ = v_0.Args[1] 1600 x := v_0.Args[0] 1601 y := v_0.Args[1] 1602 if !(is32Bit(c + d)) { 1603 break 1604 } 1605 v.reset(Op386LEAL8) 1606 v.AuxInt = c + d 1607 v.Aux = s 1608 v.AddArg(x) 1609 v.AddArg(y) 1610 return true 1611 } 1612 // match: (ADDLconst [c] x) 1613 // cond: int32(c)==0 1614 // result: x 1615 for { 1616 c := v.AuxInt 1617 x := v.Args[0] 1618 if !(int32(c) == 0) { 1619 break 1620 } 1621 v.reset(OpCopy) 1622 v.Type = x.Type 1623 v.AddArg(x) 1624 return true 1625 } 1626 // match: (ADDLconst [c] (MOVLconst [d])) 1627 // cond: 1628 // result: (MOVLconst [int64(int32(c+d))]) 1629 for { 1630 c := v.AuxInt 1631 v_0 := v.Args[0] 1632 if v_0.Op != Op386MOVLconst { 1633 break 1634 } 1635 d := v_0.AuxInt 1636 v.reset(Op386MOVLconst) 1637 v.AuxInt = int64(int32(c + d)) 1638 return true 1639 } 1640 // match: (ADDLconst [c] (ADDLconst [d] x)) 1641 // cond: 1642 // result: (ADDLconst [int64(int32(c+d))] x) 1643 for { 1644 c := v.AuxInt 1645 v_0 := v.Args[0] 1646 if v_0.Op != Op386ADDLconst { 1647 break 1648 } 1649 d := v_0.AuxInt 1650 x := v_0.Args[0] 1651 v.reset(Op386ADDLconst) 1652 v.AuxInt = int64(int32(c + d)) 1653 v.AddArg(x) 1654 return true 1655 } 1656 return false 1657 } 1658 func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { 1659 b := v.Block 1660 _ = b 1661 config := b.Func.Config 1662 _ = config 1663 // match: (ADDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) 1664 // cond: ValAndOff(valoff1).canAdd(off2) 1665 // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) 1666 for { 1667 valoff1 := v.AuxInt 1668 sym := v.Aux 1669 _ = v.Args[1] 1670 v_0 := v.Args[0] 1671 if v_0.Op != Op386ADDLconst { 1672 break 1673 } 1674 off2 := v_0.AuxInt 1675 base := v_0.Args[0] 1676 mem := v.Args[1] 1677 if !(ValAndOff(valoff1).canAdd(off2)) { 1678 break 1679 } 1680 v.reset(Op386ADDLconstmodify) 1681 v.AuxInt = ValAndOff(valoff1).add(off2) 1682 v.Aux = sym 1683 v.AddArg(base) 1684 v.AddArg(mem) 1685 return true 1686 } 1687 // match: (ADDLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) 1688 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 1689 // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) 1690 for { 1691 valoff1 := v.AuxInt 1692 sym1 := v.Aux 1693 _ = v.Args[1] 1694 v_0 := v.Args[0] 1695 if v_0.Op != Op386LEAL { 1696 break 1697 } 1698 off2 := v_0.AuxInt 1699 sym2 := v_0.Aux 1700 base := v_0.Args[0] 1701 mem := v.Args[1] 1702 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 1703 break 1704 } 1705 v.reset(Op386ADDLconstmodify) 1706 v.AuxInt = ValAndOff(valoff1).add(off2) 1707 v.Aux = mergeSym(sym1, sym2) 1708 v.AddArg(base) 1709 v.AddArg(mem) 1710 return true 1711 } 1712 return false 1713 } 1714 func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { 1715 b := v.Block 1716 _ = b 1717 config := b.Func.Config 1718 _ = config 1719 // match: (ADDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) 1720 // cond: ValAndOff(valoff1).canAdd(off2) 1721 // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) 1722 for { 1723 valoff1 := v.AuxInt 1724 sym := v.Aux 1725 _ = v.Args[2] 1726 v_0 := v.Args[0] 1727 if v_0.Op != Op386ADDLconst { 1728 break 1729 } 1730 off2 := v_0.AuxInt 1731 base := v_0.Args[0] 1732 idx := v.Args[1] 1733 mem := v.Args[2] 1734 if !(ValAndOff(valoff1).canAdd(off2)) { 1735 break 1736 } 1737 v.reset(Op386ADDLconstmodifyidx4) 1738 v.AuxInt = ValAndOff(valoff1).add(off2) 1739 v.Aux = sym 1740 v.AddArg(base) 1741 v.AddArg(idx) 1742 v.AddArg(mem) 1743 return true 1744 } 1745 // match: (ADDLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) 1746 // cond: ValAndOff(valoff1).canAdd(off2*4) 1747 // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) 1748 for { 1749 valoff1 := v.AuxInt 1750 sym := v.Aux 1751 _ = v.Args[2] 1752 base := v.Args[0] 1753 v_1 := v.Args[1] 1754 if v_1.Op != Op386ADDLconst { 1755 break 1756 } 1757 off2 := v_1.AuxInt 1758 idx := v_1.Args[0] 1759 mem := v.Args[2] 1760 if !(ValAndOff(valoff1).canAdd(off2 * 4)) { 1761 break 1762 } 1763 v.reset(Op386ADDLconstmodifyidx4) 1764 v.AuxInt = ValAndOff(valoff1).add(off2 * 4) 1765 v.Aux = sym 1766 v.AddArg(base) 1767 v.AddArg(idx) 1768 v.AddArg(mem) 1769 return true 1770 } 1771 // match: (ADDLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) 1772 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 1773 // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) 1774 for { 1775 valoff1 := v.AuxInt 1776 sym1 := v.Aux 1777 _ = v.Args[2] 1778 v_0 := v.Args[0] 1779 if v_0.Op != Op386LEAL { 1780 break 1781 } 1782 off2 := v_0.AuxInt 1783 sym2 := v_0.Aux 1784 base := v_0.Args[0] 1785 idx := v.Args[1] 1786 mem := v.Args[2] 1787 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 1788 break 1789 } 1790 v.reset(Op386ADDLconstmodifyidx4) 1791 v.AuxInt = ValAndOff(valoff1).add(off2) 1792 v.Aux = mergeSym(sym1, sym2) 1793 v.AddArg(base) 1794 v.AddArg(idx) 1795 v.AddArg(mem) 1796 return true 1797 } 1798 return false 1799 } 1800 func rewriteValue386_Op386ADDLload_0(v *Value) bool { 1801 b := v.Block 1802 _ = b 1803 config := b.Func.Config 1804 _ = config 1805 // match: (ADDLload [off1] {sym} val (ADDLconst [off2] base) mem) 1806 // cond: is32Bit(off1+off2) 1807 // result: (ADDLload [off1+off2] {sym} val base mem) 1808 for { 1809 off1 := v.AuxInt 1810 sym := v.Aux 1811 _ = v.Args[2] 1812 val := v.Args[0] 1813 v_1 := v.Args[1] 1814 if v_1.Op != Op386ADDLconst { 1815 break 1816 } 1817 off2 := v_1.AuxInt 1818 base := v_1.Args[0] 1819 mem := v.Args[2] 1820 if !(is32Bit(off1 + off2)) { 1821 break 1822 } 1823 v.reset(Op386ADDLload) 1824 v.AuxInt = off1 + off2 1825 v.Aux = sym 1826 v.AddArg(val) 1827 v.AddArg(base) 1828 v.AddArg(mem) 1829 return true 1830 } 1831 // match: (ADDLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 1832 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 1833 // result: (ADDLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 1834 for { 1835 off1 := v.AuxInt 1836 sym1 := v.Aux 1837 _ = v.Args[2] 1838 val := v.Args[0] 1839 v_1 := v.Args[1] 1840 if v_1.Op != Op386LEAL { 1841 break 1842 } 1843 off2 := v_1.AuxInt 1844 sym2 := v_1.Aux 1845 base := v_1.Args[0] 1846 mem := v.Args[2] 1847 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 1848 break 1849 } 1850 v.reset(Op386ADDLload) 1851 v.AuxInt = off1 + off2 1852 v.Aux = mergeSym(sym1, sym2) 1853 v.AddArg(val) 1854 v.AddArg(base) 1855 v.AddArg(mem) 1856 return true 1857 } 1858 // match: (ADDLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) 1859 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 1860 // result: (ADDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) 1861 for { 1862 off1 := v.AuxInt 1863 sym1 := v.Aux 1864 _ = v.Args[2] 1865 val := v.Args[0] 1866 v_1 := v.Args[1] 1867 if v_1.Op != Op386LEAL4 { 1868 break 1869 } 1870 off2 := v_1.AuxInt 1871 sym2 := v_1.Aux 1872 _ = v_1.Args[1] 1873 ptr := v_1.Args[0] 1874 idx := v_1.Args[1] 1875 mem := v.Args[2] 1876 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 1877 break 1878 } 1879 v.reset(Op386ADDLloadidx4) 1880 v.AuxInt = off1 + off2 1881 v.Aux = mergeSym(sym1, sym2) 1882 v.AddArg(val) 1883 v.AddArg(ptr) 1884 v.AddArg(idx) 1885 v.AddArg(mem) 1886 return true 1887 } 1888 return false 1889 } 1890 func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { 1891 b := v.Block 1892 _ = b 1893 config := b.Func.Config 1894 _ = config 1895 // match: (ADDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) 1896 // cond: is32Bit(off1+off2) 1897 // result: (ADDLloadidx4 [off1+off2] {sym} val base idx mem) 1898 for { 1899 off1 := v.AuxInt 1900 sym := v.Aux 1901 _ = v.Args[3] 1902 val := v.Args[0] 1903 v_1 := v.Args[1] 1904 if v_1.Op != Op386ADDLconst { 1905 break 1906 } 1907 off2 := v_1.AuxInt 1908 base := v_1.Args[0] 1909 idx := v.Args[2] 1910 mem := v.Args[3] 1911 if !(is32Bit(off1 + off2)) { 1912 break 1913 } 1914 v.reset(Op386ADDLloadidx4) 1915 v.AuxInt = off1 + off2 1916 v.Aux = sym 1917 v.AddArg(val) 1918 v.AddArg(base) 1919 v.AddArg(idx) 1920 v.AddArg(mem) 1921 return true 1922 } 1923 // match: (ADDLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) 1924 // cond: is32Bit(off1+off2*4) 1925 // result: (ADDLloadidx4 [off1+off2*4] {sym} val base idx mem) 1926 for { 1927 off1 := v.AuxInt 1928 sym := v.Aux 1929 _ = v.Args[3] 1930 val := v.Args[0] 1931 base := v.Args[1] 1932 v_2 := v.Args[2] 1933 if v_2.Op != Op386ADDLconst { 1934 break 1935 } 1936 off2 := v_2.AuxInt 1937 idx := v_2.Args[0] 1938 mem := v.Args[3] 1939 if !(is32Bit(off1 + off2*4)) { 1940 break 1941 } 1942 v.reset(Op386ADDLloadidx4) 1943 v.AuxInt = off1 + off2*4 1944 v.Aux = sym 1945 v.AddArg(val) 1946 v.AddArg(base) 1947 v.AddArg(idx) 1948 v.AddArg(mem) 1949 return true 1950 } 1951 // match: (ADDLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) 1952 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 1953 // result: (ADDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) 1954 for { 1955 off1 := v.AuxInt 1956 sym1 := v.Aux 1957 _ = v.Args[3] 1958 val := v.Args[0] 1959 v_1 := v.Args[1] 1960 if v_1.Op != Op386LEAL { 1961 break 1962 } 1963 off2 := v_1.AuxInt 1964 sym2 := v_1.Aux 1965 base := v_1.Args[0] 1966 idx := v.Args[2] 1967 mem := v.Args[3] 1968 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 1969 break 1970 } 1971 v.reset(Op386ADDLloadidx4) 1972 v.AuxInt = off1 + off2 1973 v.Aux = mergeSym(sym1, sym2) 1974 v.AddArg(val) 1975 v.AddArg(base) 1976 v.AddArg(idx) 1977 v.AddArg(mem) 1978 return true 1979 } 1980 return false 1981 } 1982 func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { 1983 b := v.Block 1984 _ = b 1985 config := b.Func.Config 1986 _ = config 1987 // match: (ADDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) 1988 // cond: is32Bit(off1+off2) 1989 // result: (ADDLmodify [off1+off2] {sym} base val mem) 1990 for { 1991 off1 := v.AuxInt 1992 sym := v.Aux 1993 _ = v.Args[2] 1994 v_0 := v.Args[0] 1995 if v_0.Op != Op386ADDLconst { 1996 break 1997 } 1998 off2 := v_0.AuxInt 1999 base := v_0.Args[0] 2000 val := v.Args[1] 2001 mem := v.Args[2] 2002 if !(is32Bit(off1 + off2)) { 2003 break 2004 } 2005 v.reset(Op386ADDLmodify) 2006 v.AuxInt = off1 + off2 2007 v.Aux = sym 2008 v.AddArg(base) 2009 v.AddArg(val) 2010 v.AddArg(mem) 2011 return true 2012 } 2013 // match: (ADDLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 2014 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2015 // result: (ADDLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) 2016 for { 2017 off1 := v.AuxInt 2018 sym1 := v.Aux 2019 _ = v.Args[2] 2020 v_0 := v.Args[0] 2021 if v_0.Op != Op386LEAL { 2022 break 2023 } 2024 off2 := v_0.AuxInt 2025 sym2 := v_0.Aux 2026 base := v_0.Args[0] 2027 val := v.Args[1] 2028 mem := v.Args[2] 2029 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2030 break 2031 } 2032 v.reset(Op386ADDLmodify) 2033 v.AuxInt = off1 + off2 2034 v.Aux = mergeSym(sym1, sym2) 2035 v.AddArg(base) 2036 v.AddArg(val) 2037 v.AddArg(mem) 2038 return true 2039 } 2040 return false 2041 } 2042 func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { 2043 b := v.Block 2044 _ = b 2045 config := b.Func.Config 2046 _ = config 2047 // match: (ADDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) 2048 // cond: is32Bit(off1+off2) 2049 // result: (ADDLmodifyidx4 [off1+off2] {sym} base idx val mem) 2050 for { 2051 off1 := v.AuxInt 2052 sym := v.Aux 2053 _ = v.Args[3] 2054 v_0 := v.Args[0] 2055 if v_0.Op != Op386ADDLconst { 2056 break 2057 } 2058 off2 := v_0.AuxInt 2059 base := v_0.Args[0] 2060 idx := v.Args[1] 2061 val := v.Args[2] 2062 mem := v.Args[3] 2063 if !(is32Bit(off1 + off2)) { 2064 break 2065 } 2066 v.reset(Op386ADDLmodifyidx4) 2067 v.AuxInt = off1 + off2 2068 v.Aux = sym 2069 v.AddArg(base) 2070 v.AddArg(idx) 2071 v.AddArg(val) 2072 v.AddArg(mem) 2073 return true 2074 } 2075 // match: (ADDLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) 2076 // cond: is32Bit(off1+off2*4) 2077 // result: (ADDLmodifyidx4 [off1+off2*4] {sym} base idx val mem) 2078 for { 2079 off1 := v.AuxInt 2080 sym := v.Aux 2081 _ = v.Args[3] 2082 base := v.Args[0] 2083 v_1 := v.Args[1] 2084 if v_1.Op != Op386ADDLconst { 2085 break 2086 } 2087 off2 := v_1.AuxInt 2088 idx := v_1.Args[0] 2089 val := v.Args[2] 2090 mem := v.Args[3] 2091 if !(is32Bit(off1 + off2*4)) { 2092 break 2093 } 2094 v.reset(Op386ADDLmodifyidx4) 2095 v.AuxInt = off1 + off2*4 2096 v.Aux = sym 2097 v.AddArg(base) 2098 v.AddArg(idx) 2099 v.AddArg(val) 2100 v.AddArg(mem) 2101 return true 2102 } 2103 // match: (ADDLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) 2104 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2105 // result: (ADDLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) 2106 for { 2107 off1 := v.AuxInt 2108 sym1 := v.Aux 2109 _ = v.Args[3] 2110 v_0 := v.Args[0] 2111 if v_0.Op != Op386LEAL { 2112 break 2113 } 2114 off2 := v_0.AuxInt 2115 sym2 := v_0.Aux 2116 base := v_0.Args[0] 2117 idx := v.Args[1] 2118 val := v.Args[2] 2119 mem := v.Args[3] 2120 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2121 break 2122 } 2123 v.reset(Op386ADDLmodifyidx4) 2124 v.AuxInt = off1 + off2 2125 v.Aux = mergeSym(sym1, sym2) 2126 v.AddArg(base) 2127 v.AddArg(idx) 2128 v.AddArg(val) 2129 v.AddArg(mem) 2130 return true 2131 } 2132 // match: (ADDLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) 2133 // cond: validValAndOff(c,off) 2134 // result: (ADDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 2135 for { 2136 off := v.AuxInt 2137 sym := v.Aux 2138 _ = v.Args[3] 2139 ptr := v.Args[0] 2140 idx := v.Args[1] 2141 v_2 := v.Args[2] 2142 if v_2.Op != Op386MOVLconst { 2143 break 2144 } 2145 c := v_2.AuxInt 2146 mem := v.Args[3] 2147 if !(validValAndOff(c, off)) { 2148 break 2149 } 2150 v.reset(Op386ADDLconstmodifyidx4) 2151 v.AuxInt = makeValAndOff(c, off) 2152 v.Aux = sym 2153 v.AddArg(ptr) 2154 v.AddArg(idx) 2155 v.AddArg(mem) 2156 return true 2157 } 2158 return false 2159 } 2160 func rewriteValue386_Op386ADDSD_0(v *Value) bool { 2161 b := v.Block 2162 _ = b 2163 config := b.Func.Config 2164 _ = config 2165 // match: (ADDSD x l:(MOVSDload [off] {sym} ptr mem)) 2166 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 2167 // result: (ADDSDload x [off] {sym} ptr mem) 2168 for { 2169 _ = v.Args[1] 2170 x := v.Args[0] 2171 l := v.Args[1] 2172 if l.Op != Op386MOVSDload { 2173 break 2174 } 2175 off := l.AuxInt 2176 sym := l.Aux 2177 _ = l.Args[1] 2178 ptr := l.Args[0] 2179 mem := l.Args[1] 2180 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 2181 break 2182 } 2183 v.reset(Op386ADDSDload) 2184 v.AuxInt = off 2185 v.Aux = sym 2186 v.AddArg(x) 2187 v.AddArg(ptr) 2188 v.AddArg(mem) 2189 return true 2190 } 2191 // match: (ADDSD l:(MOVSDload [off] {sym} ptr mem) x) 2192 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 2193 // result: (ADDSDload x [off] {sym} ptr mem) 2194 for { 2195 _ = v.Args[1] 2196 l := v.Args[0] 2197 if l.Op != Op386MOVSDload { 2198 break 2199 } 2200 off := l.AuxInt 2201 sym := l.Aux 2202 _ = l.Args[1] 2203 ptr := l.Args[0] 2204 mem := l.Args[1] 2205 x := v.Args[1] 2206 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 2207 break 2208 } 2209 v.reset(Op386ADDSDload) 2210 v.AuxInt = off 2211 v.Aux = sym 2212 v.AddArg(x) 2213 v.AddArg(ptr) 2214 v.AddArg(mem) 2215 return true 2216 } 2217 return false 2218 } 2219 func rewriteValue386_Op386ADDSDload_0(v *Value) bool { 2220 b := v.Block 2221 _ = b 2222 config := b.Func.Config 2223 _ = config 2224 // match: (ADDSDload [off1] {sym} val (ADDLconst [off2] base) mem) 2225 // cond: is32Bit(off1+off2) 2226 // result: (ADDSDload [off1+off2] {sym} val base mem) 2227 for { 2228 off1 := v.AuxInt 2229 sym := v.Aux 2230 _ = v.Args[2] 2231 val := v.Args[0] 2232 v_1 := v.Args[1] 2233 if v_1.Op != Op386ADDLconst { 2234 break 2235 } 2236 off2 := v_1.AuxInt 2237 base := v_1.Args[0] 2238 mem := v.Args[2] 2239 if !(is32Bit(off1 + off2)) { 2240 break 2241 } 2242 v.reset(Op386ADDSDload) 2243 v.AuxInt = off1 + off2 2244 v.Aux = sym 2245 v.AddArg(val) 2246 v.AddArg(base) 2247 v.AddArg(mem) 2248 return true 2249 } 2250 // match: (ADDSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 2251 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2252 // result: (ADDSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 2253 for { 2254 off1 := v.AuxInt 2255 sym1 := v.Aux 2256 _ = v.Args[2] 2257 val := v.Args[0] 2258 v_1 := v.Args[1] 2259 if v_1.Op != Op386LEAL { 2260 break 2261 } 2262 off2 := v_1.AuxInt 2263 sym2 := v_1.Aux 2264 base := v_1.Args[0] 2265 mem := v.Args[2] 2266 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2267 break 2268 } 2269 v.reset(Op386ADDSDload) 2270 v.AuxInt = off1 + off2 2271 v.Aux = mergeSym(sym1, sym2) 2272 v.AddArg(val) 2273 v.AddArg(base) 2274 v.AddArg(mem) 2275 return true 2276 } 2277 return false 2278 } 2279 func rewriteValue386_Op386ADDSS_0(v *Value) bool { 2280 b := v.Block 2281 _ = b 2282 config := b.Func.Config 2283 _ = config 2284 // match: (ADDSS x l:(MOVSSload [off] {sym} ptr mem)) 2285 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 2286 // result: (ADDSSload x [off] {sym} ptr mem) 2287 for { 2288 _ = v.Args[1] 2289 x := v.Args[0] 2290 l := v.Args[1] 2291 if l.Op != Op386MOVSSload { 2292 break 2293 } 2294 off := l.AuxInt 2295 sym := l.Aux 2296 _ = l.Args[1] 2297 ptr := l.Args[0] 2298 mem := l.Args[1] 2299 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 2300 break 2301 } 2302 v.reset(Op386ADDSSload) 2303 v.AuxInt = off 2304 v.Aux = sym 2305 v.AddArg(x) 2306 v.AddArg(ptr) 2307 v.AddArg(mem) 2308 return true 2309 } 2310 // match: (ADDSS l:(MOVSSload [off] {sym} ptr mem) x) 2311 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 2312 // result: (ADDSSload x [off] {sym} ptr mem) 2313 for { 2314 _ = v.Args[1] 2315 l := v.Args[0] 2316 if l.Op != Op386MOVSSload { 2317 break 2318 } 2319 off := l.AuxInt 2320 sym := l.Aux 2321 _ = l.Args[1] 2322 ptr := l.Args[0] 2323 mem := l.Args[1] 2324 x := v.Args[1] 2325 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 2326 break 2327 } 2328 v.reset(Op386ADDSSload) 2329 v.AuxInt = off 2330 v.Aux = sym 2331 v.AddArg(x) 2332 v.AddArg(ptr) 2333 v.AddArg(mem) 2334 return true 2335 } 2336 return false 2337 } 2338 func rewriteValue386_Op386ADDSSload_0(v *Value) bool { 2339 b := v.Block 2340 _ = b 2341 config := b.Func.Config 2342 _ = config 2343 // match: (ADDSSload [off1] {sym} val (ADDLconst [off2] base) mem) 2344 // cond: is32Bit(off1+off2) 2345 // result: (ADDSSload [off1+off2] {sym} val base mem) 2346 for { 2347 off1 := v.AuxInt 2348 sym := v.Aux 2349 _ = v.Args[2] 2350 val := v.Args[0] 2351 v_1 := v.Args[1] 2352 if v_1.Op != Op386ADDLconst { 2353 break 2354 } 2355 off2 := v_1.AuxInt 2356 base := v_1.Args[0] 2357 mem := v.Args[2] 2358 if !(is32Bit(off1 + off2)) { 2359 break 2360 } 2361 v.reset(Op386ADDSSload) 2362 v.AuxInt = off1 + off2 2363 v.Aux = sym 2364 v.AddArg(val) 2365 v.AddArg(base) 2366 v.AddArg(mem) 2367 return true 2368 } 2369 // match: (ADDSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 2370 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2371 // result: (ADDSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 2372 for { 2373 off1 := v.AuxInt 2374 sym1 := v.Aux 2375 _ = v.Args[2] 2376 val := v.Args[0] 2377 v_1 := v.Args[1] 2378 if v_1.Op != Op386LEAL { 2379 break 2380 } 2381 off2 := v_1.AuxInt 2382 sym2 := v_1.Aux 2383 base := v_1.Args[0] 2384 mem := v.Args[2] 2385 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2386 break 2387 } 2388 v.reset(Op386ADDSSload) 2389 v.AuxInt = off1 + off2 2390 v.Aux = mergeSym(sym1, sym2) 2391 v.AddArg(val) 2392 v.AddArg(base) 2393 v.AddArg(mem) 2394 return true 2395 } 2396 return false 2397 } 2398 func rewriteValue386_Op386ANDL_0(v *Value) bool { 2399 // match: (ANDL x (MOVLconst [c])) 2400 // cond: 2401 // result: (ANDLconst [c] x) 2402 for { 2403 _ = v.Args[1] 2404 x := v.Args[0] 2405 v_1 := v.Args[1] 2406 if v_1.Op != Op386MOVLconst { 2407 break 2408 } 2409 c := v_1.AuxInt 2410 v.reset(Op386ANDLconst) 2411 v.AuxInt = c 2412 v.AddArg(x) 2413 return true 2414 } 2415 // match: (ANDL (MOVLconst [c]) x) 2416 // cond: 2417 // result: (ANDLconst [c] x) 2418 for { 2419 _ = v.Args[1] 2420 v_0 := v.Args[0] 2421 if v_0.Op != Op386MOVLconst { 2422 break 2423 } 2424 c := v_0.AuxInt 2425 x := v.Args[1] 2426 v.reset(Op386ANDLconst) 2427 v.AuxInt = c 2428 v.AddArg(x) 2429 return true 2430 } 2431 // match: (ANDL x l:(MOVLload [off] {sym} ptr mem)) 2432 // cond: canMergeLoad(v, l, x) && clobber(l) 2433 // result: (ANDLload x [off] {sym} ptr mem) 2434 for { 2435 _ = v.Args[1] 2436 x := v.Args[0] 2437 l := v.Args[1] 2438 if l.Op != Op386MOVLload { 2439 break 2440 } 2441 off := l.AuxInt 2442 sym := l.Aux 2443 _ = l.Args[1] 2444 ptr := l.Args[0] 2445 mem := l.Args[1] 2446 if !(canMergeLoad(v, l, x) && clobber(l)) { 2447 break 2448 } 2449 v.reset(Op386ANDLload) 2450 v.AuxInt = off 2451 v.Aux = sym 2452 v.AddArg(x) 2453 v.AddArg(ptr) 2454 v.AddArg(mem) 2455 return true 2456 } 2457 // match: (ANDL l:(MOVLload [off] {sym} ptr mem) x) 2458 // cond: canMergeLoad(v, l, x) && clobber(l) 2459 // result: (ANDLload x [off] {sym} ptr mem) 2460 for { 2461 _ = v.Args[1] 2462 l := v.Args[0] 2463 if l.Op != Op386MOVLload { 2464 break 2465 } 2466 off := l.AuxInt 2467 sym := l.Aux 2468 _ = l.Args[1] 2469 ptr := l.Args[0] 2470 mem := l.Args[1] 2471 x := v.Args[1] 2472 if !(canMergeLoad(v, l, x) && clobber(l)) { 2473 break 2474 } 2475 v.reset(Op386ANDLload) 2476 v.AuxInt = off 2477 v.Aux = sym 2478 v.AddArg(x) 2479 v.AddArg(ptr) 2480 v.AddArg(mem) 2481 return true 2482 } 2483 // match: (ANDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) 2484 // cond: canMergeLoad(v, l, x) && clobber(l) 2485 // result: (ANDLloadidx4 x [off] {sym} ptr idx mem) 2486 for { 2487 _ = v.Args[1] 2488 x := v.Args[0] 2489 l := v.Args[1] 2490 if l.Op != Op386MOVLloadidx4 { 2491 break 2492 } 2493 off := l.AuxInt 2494 sym := l.Aux 2495 _ = l.Args[2] 2496 ptr := l.Args[0] 2497 idx := l.Args[1] 2498 mem := l.Args[2] 2499 if !(canMergeLoad(v, l, x) && clobber(l)) { 2500 break 2501 } 2502 v.reset(Op386ANDLloadidx4) 2503 v.AuxInt = off 2504 v.Aux = sym 2505 v.AddArg(x) 2506 v.AddArg(ptr) 2507 v.AddArg(idx) 2508 v.AddArg(mem) 2509 return true 2510 } 2511 // match: (ANDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) 2512 // cond: canMergeLoad(v, l, x) && clobber(l) 2513 // result: (ANDLloadidx4 x [off] {sym} ptr idx mem) 2514 for { 2515 _ = v.Args[1] 2516 l := v.Args[0] 2517 if l.Op != Op386MOVLloadidx4 { 2518 break 2519 } 2520 off := l.AuxInt 2521 sym := l.Aux 2522 _ = l.Args[2] 2523 ptr := l.Args[0] 2524 idx := l.Args[1] 2525 mem := l.Args[2] 2526 x := v.Args[1] 2527 if !(canMergeLoad(v, l, x) && clobber(l)) { 2528 break 2529 } 2530 v.reset(Op386ANDLloadidx4) 2531 v.AuxInt = off 2532 v.Aux = sym 2533 v.AddArg(x) 2534 v.AddArg(ptr) 2535 v.AddArg(idx) 2536 v.AddArg(mem) 2537 return true 2538 } 2539 // match: (ANDL x x) 2540 // cond: 2541 // result: x 2542 for { 2543 _ = v.Args[1] 2544 x := v.Args[0] 2545 if x != v.Args[1] { 2546 break 2547 } 2548 v.reset(OpCopy) 2549 v.Type = x.Type 2550 v.AddArg(x) 2551 return true 2552 } 2553 return false 2554 } 2555 func rewriteValue386_Op386ANDLconst_0(v *Value) bool { 2556 // match: (ANDLconst [c] (ANDLconst [d] x)) 2557 // cond: 2558 // result: (ANDLconst [c & d] x) 2559 for { 2560 c := v.AuxInt 2561 v_0 := v.Args[0] 2562 if v_0.Op != Op386ANDLconst { 2563 break 2564 } 2565 d := v_0.AuxInt 2566 x := v_0.Args[0] 2567 v.reset(Op386ANDLconst) 2568 v.AuxInt = c & d 2569 v.AddArg(x) 2570 return true 2571 } 2572 // match: (ANDLconst [c] _) 2573 // cond: int32(c)==0 2574 // result: (MOVLconst [0]) 2575 for { 2576 c := v.AuxInt 2577 if !(int32(c) == 0) { 2578 break 2579 } 2580 v.reset(Op386MOVLconst) 2581 v.AuxInt = 0 2582 return true 2583 } 2584 // match: (ANDLconst [c] x) 2585 // cond: int32(c)==-1 2586 // result: x 2587 for { 2588 c := v.AuxInt 2589 x := v.Args[0] 2590 if !(int32(c) == -1) { 2591 break 2592 } 2593 v.reset(OpCopy) 2594 v.Type = x.Type 2595 v.AddArg(x) 2596 return true 2597 } 2598 // match: (ANDLconst [c] (MOVLconst [d])) 2599 // cond: 2600 // result: (MOVLconst [c&d]) 2601 for { 2602 c := v.AuxInt 2603 v_0 := v.Args[0] 2604 if v_0.Op != Op386MOVLconst { 2605 break 2606 } 2607 d := v_0.AuxInt 2608 v.reset(Op386MOVLconst) 2609 v.AuxInt = c & d 2610 return true 2611 } 2612 return false 2613 } 2614 func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { 2615 b := v.Block 2616 _ = b 2617 config := b.Func.Config 2618 _ = config 2619 // match: (ANDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) 2620 // cond: ValAndOff(valoff1).canAdd(off2) 2621 // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) 2622 for { 2623 valoff1 := v.AuxInt 2624 sym := v.Aux 2625 _ = v.Args[1] 2626 v_0 := v.Args[0] 2627 if v_0.Op != Op386ADDLconst { 2628 break 2629 } 2630 off2 := v_0.AuxInt 2631 base := v_0.Args[0] 2632 mem := v.Args[1] 2633 if !(ValAndOff(valoff1).canAdd(off2)) { 2634 break 2635 } 2636 v.reset(Op386ANDLconstmodify) 2637 v.AuxInt = ValAndOff(valoff1).add(off2) 2638 v.Aux = sym 2639 v.AddArg(base) 2640 v.AddArg(mem) 2641 return true 2642 } 2643 // match: (ANDLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) 2644 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2645 // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) 2646 for { 2647 valoff1 := v.AuxInt 2648 sym1 := v.Aux 2649 _ = v.Args[1] 2650 v_0 := v.Args[0] 2651 if v_0.Op != Op386LEAL { 2652 break 2653 } 2654 off2 := v_0.AuxInt 2655 sym2 := v_0.Aux 2656 base := v_0.Args[0] 2657 mem := v.Args[1] 2658 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2659 break 2660 } 2661 v.reset(Op386ANDLconstmodify) 2662 v.AuxInt = ValAndOff(valoff1).add(off2) 2663 v.Aux = mergeSym(sym1, sym2) 2664 v.AddArg(base) 2665 v.AddArg(mem) 2666 return true 2667 } 2668 return false 2669 } 2670 func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { 2671 b := v.Block 2672 _ = b 2673 config := b.Func.Config 2674 _ = config 2675 // match: (ANDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) 2676 // cond: ValAndOff(valoff1).canAdd(off2) 2677 // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) 2678 for { 2679 valoff1 := v.AuxInt 2680 sym := v.Aux 2681 _ = v.Args[2] 2682 v_0 := v.Args[0] 2683 if v_0.Op != Op386ADDLconst { 2684 break 2685 } 2686 off2 := v_0.AuxInt 2687 base := v_0.Args[0] 2688 idx := v.Args[1] 2689 mem := v.Args[2] 2690 if !(ValAndOff(valoff1).canAdd(off2)) { 2691 break 2692 } 2693 v.reset(Op386ANDLconstmodifyidx4) 2694 v.AuxInt = ValAndOff(valoff1).add(off2) 2695 v.Aux = sym 2696 v.AddArg(base) 2697 v.AddArg(idx) 2698 v.AddArg(mem) 2699 return true 2700 } 2701 // match: (ANDLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) 2702 // cond: ValAndOff(valoff1).canAdd(off2*4) 2703 // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) 2704 for { 2705 valoff1 := v.AuxInt 2706 sym := v.Aux 2707 _ = v.Args[2] 2708 base := v.Args[0] 2709 v_1 := v.Args[1] 2710 if v_1.Op != Op386ADDLconst { 2711 break 2712 } 2713 off2 := v_1.AuxInt 2714 idx := v_1.Args[0] 2715 mem := v.Args[2] 2716 if !(ValAndOff(valoff1).canAdd(off2 * 4)) { 2717 break 2718 } 2719 v.reset(Op386ANDLconstmodifyidx4) 2720 v.AuxInt = ValAndOff(valoff1).add(off2 * 4) 2721 v.Aux = sym 2722 v.AddArg(base) 2723 v.AddArg(idx) 2724 v.AddArg(mem) 2725 return true 2726 } 2727 // match: (ANDLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) 2728 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2729 // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) 2730 for { 2731 valoff1 := v.AuxInt 2732 sym1 := v.Aux 2733 _ = v.Args[2] 2734 v_0 := v.Args[0] 2735 if v_0.Op != Op386LEAL { 2736 break 2737 } 2738 off2 := v_0.AuxInt 2739 sym2 := v_0.Aux 2740 base := v_0.Args[0] 2741 idx := v.Args[1] 2742 mem := v.Args[2] 2743 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2744 break 2745 } 2746 v.reset(Op386ANDLconstmodifyidx4) 2747 v.AuxInt = ValAndOff(valoff1).add(off2) 2748 v.Aux = mergeSym(sym1, sym2) 2749 v.AddArg(base) 2750 v.AddArg(idx) 2751 v.AddArg(mem) 2752 return true 2753 } 2754 return false 2755 } 2756 func rewriteValue386_Op386ANDLload_0(v *Value) bool { 2757 b := v.Block 2758 _ = b 2759 config := b.Func.Config 2760 _ = config 2761 // match: (ANDLload [off1] {sym} val (ADDLconst [off2] base) mem) 2762 // cond: is32Bit(off1+off2) 2763 // result: (ANDLload [off1+off2] {sym} val base mem) 2764 for { 2765 off1 := v.AuxInt 2766 sym := v.Aux 2767 _ = v.Args[2] 2768 val := v.Args[0] 2769 v_1 := v.Args[1] 2770 if v_1.Op != Op386ADDLconst { 2771 break 2772 } 2773 off2 := v_1.AuxInt 2774 base := v_1.Args[0] 2775 mem := v.Args[2] 2776 if !(is32Bit(off1 + off2)) { 2777 break 2778 } 2779 v.reset(Op386ANDLload) 2780 v.AuxInt = off1 + off2 2781 v.Aux = sym 2782 v.AddArg(val) 2783 v.AddArg(base) 2784 v.AddArg(mem) 2785 return true 2786 } 2787 // match: (ANDLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 2788 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2789 // result: (ANDLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 2790 for { 2791 off1 := v.AuxInt 2792 sym1 := v.Aux 2793 _ = v.Args[2] 2794 val := v.Args[0] 2795 v_1 := v.Args[1] 2796 if v_1.Op != Op386LEAL { 2797 break 2798 } 2799 off2 := v_1.AuxInt 2800 sym2 := v_1.Aux 2801 base := v_1.Args[0] 2802 mem := v.Args[2] 2803 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2804 break 2805 } 2806 v.reset(Op386ANDLload) 2807 v.AuxInt = off1 + off2 2808 v.Aux = mergeSym(sym1, sym2) 2809 v.AddArg(val) 2810 v.AddArg(base) 2811 v.AddArg(mem) 2812 return true 2813 } 2814 // match: (ANDLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) 2815 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 2816 // result: (ANDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) 2817 for { 2818 off1 := v.AuxInt 2819 sym1 := v.Aux 2820 _ = v.Args[2] 2821 val := v.Args[0] 2822 v_1 := v.Args[1] 2823 if v_1.Op != Op386LEAL4 { 2824 break 2825 } 2826 off2 := v_1.AuxInt 2827 sym2 := v_1.Aux 2828 _ = v_1.Args[1] 2829 ptr := v_1.Args[0] 2830 idx := v_1.Args[1] 2831 mem := v.Args[2] 2832 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 2833 break 2834 } 2835 v.reset(Op386ANDLloadidx4) 2836 v.AuxInt = off1 + off2 2837 v.Aux = mergeSym(sym1, sym2) 2838 v.AddArg(val) 2839 v.AddArg(ptr) 2840 v.AddArg(idx) 2841 v.AddArg(mem) 2842 return true 2843 } 2844 return false 2845 } 2846 func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { 2847 b := v.Block 2848 _ = b 2849 config := b.Func.Config 2850 _ = config 2851 // match: (ANDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) 2852 // cond: is32Bit(off1+off2) 2853 // result: (ANDLloadidx4 [off1+off2] {sym} val base idx mem) 2854 for { 2855 off1 := v.AuxInt 2856 sym := v.Aux 2857 _ = v.Args[3] 2858 val := v.Args[0] 2859 v_1 := v.Args[1] 2860 if v_1.Op != Op386ADDLconst { 2861 break 2862 } 2863 off2 := v_1.AuxInt 2864 base := v_1.Args[0] 2865 idx := v.Args[2] 2866 mem := v.Args[3] 2867 if !(is32Bit(off1 + off2)) { 2868 break 2869 } 2870 v.reset(Op386ANDLloadidx4) 2871 v.AuxInt = off1 + off2 2872 v.Aux = sym 2873 v.AddArg(val) 2874 v.AddArg(base) 2875 v.AddArg(idx) 2876 v.AddArg(mem) 2877 return true 2878 } 2879 // match: (ANDLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) 2880 // cond: is32Bit(off1+off2*4) 2881 // result: (ANDLloadidx4 [off1+off2*4] {sym} val base idx mem) 2882 for { 2883 off1 := v.AuxInt 2884 sym := v.Aux 2885 _ = v.Args[3] 2886 val := v.Args[0] 2887 base := v.Args[1] 2888 v_2 := v.Args[2] 2889 if v_2.Op != Op386ADDLconst { 2890 break 2891 } 2892 off2 := v_2.AuxInt 2893 idx := v_2.Args[0] 2894 mem := v.Args[3] 2895 if !(is32Bit(off1 + off2*4)) { 2896 break 2897 } 2898 v.reset(Op386ANDLloadidx4) 2899 v.AuxInt = off1 + off2*4 2900 v.Aux = sym 2901 v.AddArg(val) 2902 v.AddArg(base) 2903 v.AddArg(idx) 2904 v.AddArg(mem) 2905 return true 2906 } 2907 // match: (ANDLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) 2908 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2909 // result: (ANDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) 2910 for { 2911 off1 := v.AuxInt 2912 sym1 := v.Aux 2913 _ = v.Args[3] 2914 val := v.Args[0] 2915 v_1 := v.Args[1] 2916 if v_1.Op != Op386LEAL { 2917 break 2918 } 2919 off2 := v_1.AuxInt 2920 sym2 := v_1.Aux 2921 base := v_1.Args[0] 2922 idx := v.Args[2] 2923 mem := v.Args[3] 2924 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2925 break 2926 } 2927 v.reset(Op386ANDLloadidx4) 2928 v.AuxInt = off1 + off2 2929 v.Aux = mergeSym(sym1, sym2) 2930 v.AddArg(val) 2931 v.AddArg(base) 2932 v.AddArg(idx) 2933 v.AddArg(mem) 2934 return true 2935 } 2936 return false 2937 } 2938 func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { 2939 b := v.Block 2940 _ = b 2941 config := b.Func.Config 2942 _ = config 2943 // match: (ANDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) 2944 // cond: is32Bit(off1+off2) 2945 // result: (ANDLmodify [off1+off2] {sym} base val mem) 2946 for { 2947 off1 := v.AuxInt 2948 sym := v.Aux 2949 _ = v.Args[2] 2950 v_0 := v.Args[0] 2951 if v_0.Op != Op386ADDLconst { 2952 break 2953 } 2954 off2 := v_0.AuxInt 2955 base := v_0.Args[0] 2956 val := v.Args[1] 2957 mem := v.Args[2] 2958 if !(is32Bit(off1 + off2)) { 2959 break 2960 } 2961 v.reset(Op386ANDLmodify) 2962 v.AuxInt = off1 + off2 2963 v.Aux = sym 2964 v.AddArg(base) 2965 v.AddArg(val) 2966 v.AddArg(mem) 2967 return true 2968 } 2969 // match: (ANDLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 2970 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 2971 // result: (ANDLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) 2972 for { 2973 off1 := v.AuxInt 2974 sym1 := v.Aux 2975 _ = v.Args[2] 2976 v_0 := v.Args[0] 2977 if v_0.Op != Op386LEAL { 2978 break 2979 } 2980 off2 := v_0.AuxInt 2981 sym2 := v_0.Aux 2982 base := v_0.Args[0] 2983 val := v.Args[1] 2984 mem := v.Args[2] 2985 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 2986 break 2987 } 2988 v.reset(Op386ANDLmodify) 2989 v.AuxInt = off1 + off2 2990 v.Aux = mergeSym(sym1, sym2) 2991 v.AddArg(base) 2992 v.AddArg(val) 2993 v.AddArg(mem) 2994 return true 2995 } 2996 return false 2997 } 2998 func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { 2999 b := v.Block 3000 _ = b 3001 config := b.Func.Config 3002 _ = config 3003 // match: (ANDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) 3004 // cond: is32Bit(off1+off2) 3005 // result: (ANDLmodifyidx4 [off1+off2] {sym} base idx val mem) 3006 for { 3007 off1 := v.AuxInt 3008 sym := v.Aux 3009 _ = v.Args[3] 3010 v_0 := v.Args[0] 3011 if v_0.Op != Op386ADDLconst { 3012 break 3013 } 3014 off2 := v_0.AuxInt 3015 base := v_0.Args[0] 3016 idx := v.Args[1] 3017 val := v.Args[2] 3018 mem := v.Args[3] 3019 if !(is32Bit(off1 + off2)) { 3020 break 3021 } 3022 v.reset(Op386ANDLmodifyidx4) 3023 v.AuxInt = off1 + off2 3024 v.Aux = sym 3025 v.AddArg(base) 3026 v.AddArg(idx) 3027 v.AddArg(val) 3028 v.AddArg(mem) 3029 return true 3030 } 3031 // match: (ANDLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) 3032 // cond: is32Bit(off1+off2*4) 3033 // result: (ANDLmodifyidx4 [off1+off2*4] {sym} base idx val mem) 3034 for { 3035 off1 := v.AuxInt 3036 sym := v.Aux 3037 _ = v.Args[3] 3038 base := v.Args[0] 3039 v_1 := v.Args[1] 3040 if v_1.Op != Op386ADDLconst { 3041 break 3042 } 3043 off2 := v_1.AuxInt 3044 idx := v_1.Args[0] 3045 val := v.Args[2] 3046 mem := v.Args[3] 3047 if !(is32Bit(off1 + off2*4)) { 3048 break 3049 } 3050 v.reset(Op386ANDLmodifyidx4) 3051 v.AuxInt = off1 + off2*4 3052 v.Aux = sym 3053 v.AddArg(base) 3054 v.AddArg(idx) 3055 v.AddArg(val) 3056 v.AddArg(mem) 3057 return true 3058 } 3059 // match: (ANDLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) 3060 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 3061 // result: (ANDLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) 3062 for { 3063 off1 := v.AuxInt 3064 sym1 := v.Aux 3065 _ = v.Args[3] 3066 v_0 := v.Args[0] 3067 if v_0.Op != Op386LEAL { 3068 break 3069 } 3070 off2 := v_0.AuxInt 3071 sym2 := v_0.Aux 3072 base := v_0.Args[0] 3073 idx := v.Args[1] 3074 val := v.Args[2] 3075 mem := v.Args[3] 3076 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 3077 break 3078 } 3079 v.reset(Op386ANDLmodifyidx4) 3080 v.AuxInt = off1 + off2 3081 v.Aux = mergeSym(sym1, sym2) 3082 v.AddArg(base) 3083 v.AddArg(idx) 3084 v.AddArg(val) 3085 v.AddArg(mem) 3086 return true 3087 } 3088 // match: (ANDLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) 3089 // cond: validValAndOff(c,off) 3090 // result: (ANDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 3091 for { 3092 off := v.AuxInt 3093 sym := v.Aux 3094 _ = v.Args[3] 3095 ptr := v.Args[0] 3096 idx := v.Args[1] 3097 v_2 := v.Args[2] 3098 if v_2.Op != Op386MOVLconst { 3099 break 3100 } 3101 c := v_2.AuxInt 3102 mem := v.Args[3] 3103 if !(validValAndOff(c, off)) { 3104 break 3105 } 3106 v.reset(Op386ANDLconstmodifyidx4) 3107 v.AuxInt = makeValAndOff(c, off) 3108 v.Aux = sym 3109 v.AddArg(ptr) 3110 v.AddArg(idx) 3111 v.AddArg(mem) 3112 return true 3113 } 3114 return false 3115 } 3116 func rewriteValue386_Op386CMPB_0(v *Value) bool { 3117 b := v.Block 3118 _ = b 3119 // match: (CMPB x (MOVLconst [c])) 3120 // cond: 3121 // result: (CMPBconst x [int64(int8(c))]) 3122 for { 3123 _ = v.Args[1] 3124 x := v.Args[0] 3125 v_1 := v.Args[1] 3126 if v_1.Op != Op386MOVLconst { 3127 break 3128 } 3129 c := v_1.AuxInt 3130 v.reset(Op386CMPBconst) 3131 v.AuxInt = int64(int8(c)) 3132 v.AddArg(x) 3133 return true 3134 } 3135 // match: (CMPB (MOVLconst [c]) x) 3136 // cond: 3137 // result: (InvertFlags (CMPBconst x [int64(int8(c))])) 3138 for { 3139 _ = v.Args[1] 3140 v_0 := v.Args[0] 3141 if v_0.Op != Op386MOVLconst { 3142 break 3143 } 3144 c := v_0.AuxInt 3145 x := v.Args[1] 3146 v.reset(Op386InvertFlags) 3147 v0 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 3148 v0.AuxInt = int64(int8(c)) 3149 v0.AddArg(x) 3150 v.AddArg(v0) 3151 return true 3152 } 3153 // match: (CMPB l:(MOVBload {sym} [off] ptr mem) x) 3154 // cond: canMergeLoad(v, l, x) && clobber(l) 3155 // result: (CMPBload {sym} [off] ptr x mem) 3156 for { 3157 _ = v.Args[1] 3158 l := v.Args[0] 3159 if l.Op != Op386MOVBload { 3160 break 3161 } 3162 off := l.AuxInt 3163 sym := l.Aux 3164 _ = l.Args[1] 3165 ptr := l.Args[0] 3166 mem := l.Args[1] 3167 x := v.Args[1] 3168 if !(canMergeLoad(v, l, x) && clobber(l)) { 3169 break 3170 } 3171 v.reset(Op386CMPBload) 3172 v.AuxInt = off 3173 v.Aux = sym 3174 v.AddArg(ptr) 3175 v.AddArg(x) 3176 v.AddArg(mem) 3177 return true 3178 } 3179 // match: (CMPB x l:(MOVBload {sym} [off] ptr mem)) 3180 // cond: canMergeLoad(v, l, x) && clobber(l) 3181 // result: (InvertFlags (CMPBload {sym} [off] ptr x mem)) 3182 for { 3183 _ = v.Args[1] 3184 x := v.Args[0] 3185 l := v.Args[1] 3186 if l.Op != Op386MOVBload { 3187 break 3188 } 3189 off := l.AuxInt 3190 sym := l.Aux 3191 _ = l.Args[1] 3192 ptr := l.Args[0] 3193 mem := l.Args[1] 3194 if !(canMergeLoad(v, l, x) && clobber(l)) { 3195 break 3196 } 3197 v.reset(Op386InvertFlags) 3198 v0 := b.NewValue0(v.Pos, Op386CMPBload, types.TypeFlags) 3199 v0.AuxInt = off 3200 v0.Aux = sym 3201 v0.AddArg(ptr) 3202 v0.AddArg(x) 3203 v0.AddArg(mem) 3204 v.AddArg(v0) 3205 return true 3206 } 3207 return false 3208 } 3209 func rewriteValue386_Op386CMPBconst_0(v *Value) bool { 3210 b := v.Block 3211 _ = b 3212 // match: (CMPBconst (MOVLconst [x]) [y]) 3213 // cond: int8(x)==int8(y) 3214 // result: (FlagEQ) 3215 for { 3216 y := v.AuxInt 3217 v_0 := v.Args[0] 3218 if v_0.Op != Op386MOVLconst { 3219 break 3220 } 3221 x := v_0.AuxInt 3222 if !(int8(x) == int8(y)) { 3223 break 3224 } 3225 v.reset(Op386FlagEQ) 3226 return true 3227 } 3228 // match: (CMPBconst (MOVLconst [x]) [y]) 3229 // cond: int8(x)<int8(y) && uint8(x)<uint8(y) 3230 // result: (FlagLT_ULT) 3231 for { 3232 y := v.AuxInt 3233 v_0 := v.Args[0] 3234 if v_0.Op != Op386MOVLconst { 3235 break 3236 } 3237 x := v_0.AuxInt 3238 if !(int8(x) < int8(y) && uint8(x) < uint8(y)) { 3239 break 3240 } 3241 v.reset(Op386FlagLT_ULT) 3242 return true 3243 } 3244 // match: (CMPBconst (MOVLconst [x]) [y]) 3245 // cond: int8(x)<int8(y) && uint8(x)>uint8(y) 3246 // result: (FlagLT_UGT) 3247 for { 3248 y := v.AuxInt 3249 v_0 := v.Args[0] 3250 if v_0.Op != Op386MOVLconst { 3251 break 3252 } 3253 x := v_0.AuxInt 3254 if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { 3255 break 3256 } 3257 v.reset(Op386FlagLT_UGT) 3258 return true 3259 } 3260 // match: (CMPBconst (MOVLconst [x]) [y]) 3261 // cond: int8(x)>int8(y) && uint8(x)<uint8(y) 3262 // result: (FlagGT_ULT) 3263 for { 3264 y := v.AuxInt 3265 v_0 := v.Args[0] 3266 if v_0.Op != Op386MOVLconst { 3267 break 3268 } 3269 x := v_0.AuxInt 3270 if !(int8(x) > int8(y) && uint8(x) < uint8(y)) { 3271 break 3272 } 3273 v.reset(Op386FlagGT_ULT) 3274 return true 3275 } 3276 // match: (CMPBconst (MOVLconst [x]) [y]) 3277 // cond: int8(x)>int8(y) && uint8(x)>uint8(y) 3278 // result: (FlagGT_UGT) 3279 for { 3280 y := v.AuxInt 3281 v_0 := v.Args[0] 3282 if v_0.Op != Op386MOVLconst { 3283 break 3284 } 3285 x := v_0.AuxInt 3286 if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { 3287 break 3288 } 3289 v.reset(Op386FlagGT_UGT) 3290 return true 3291 } 3292 // match: (CMPBconst (ANDLconst _ [m]) [n]) 3293 // cond: 0 <= int8(m) && int8(m) < int8(n) 3294 // result: (FlagLT_ULT) 3295 for { 3296 n := v.AuxInt 3297 v_0 := v.Args[0] 3298 if v_0.Op != Op386ANDLconst { 3299 break 3300 } 3301 m := v_0.AuxInt 3302 if !(0 <= int8(m) && int8(m) < int8(n)) { 3303 break 3304 } 3305 v.reset(Op386FlagLT_ULT) 3306 return true 3307 } 3308 // match: (CMPBconst l:(ANDL x y) [0]) 3309 // cond: l.Uses==1 3310 // result: (TESTB x y) 3311 for { 3312 if v.AuxInt != 0 { 3313 break 3314 } 3315 l := v.Args[0] 3316 if l.Op != Op386ANDL { 3317 break 3318 } 3319 _ = l.Args[1] 3320 x := l.Args[0] 3321 y := l.Args[1] 3322 if !(l.Uses == 1) { 3323 break 3324 } 3325 v.reset(Op386TESTB) 3326 v.AddArg(x) 3327 v.AddArg(y) 3328 return true 3329 } 3330 // match: (CMPBconst l:(ANDLconst [c] x) [0]) 3331 // cond: l.Uses==1 3332 // result: (TESTBconst [int64(int8(c))] x) 3333 for { 3334 if v.AuxInt != 0 { 3335 break 3336 } 3337 l := v.Args[0] 3338 if l.Op != Op386ANDLconst { 3339 break 3340 } 3341 c := l.AuxInt 3342 x := l.Args[0] 3343 if !(l.Uses == 1) { 3344 break 3345 } 3346 v.reset(Op386TESTBconst) 3347 v.AuxInt = int64(int8(c)) 3348 v.AddArg(x) 3349 return true 3350 } 3351 // match: (CMPBconst x [0]) 3352 // cond: 3353 // result: (TESTB x x) 3354 for { 3355 if v.AuxInt != 0 { 3356 break 3357 } 3358 x := v.Args[0] 3359 v.reset(Op386TESTB) 3360 v.AddArg(x) 3361 v.AddArg(x) 3362 return true 3363 } 3364 // match: (CMPBconst l:(MOVBload {sym} [off] ptr mem) [c]) 3365 // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) 3366 // result: @l.Block (CMPBconstload {sym} [makeValAndOff(c,off)] ptr mem) 3367 for { 3368 c := v.AuxInt 3369 l := v.Args[0] 3370 if l.Op != Op386MOVBload { 3371 break 3372 } 3373 off := l.AuxInt 3374 sym := l.Aux 3375 _ = l.Args[1] 3376 ptr := l.Args[0] 3377 mem := l.Args[1] 3378 if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { 3379 break 3380 } 3381 b = l.Block 3382 v0 := b.NewValue0(v.Pos, Op386CMPBconstload, types.TypeFlags) 3383 v.reset(OpCopy) 3384 v.AddArg(v0) 3385 v0.AuxInt = makeValAndOff(c, off) 3386 v0.Aux = sym 3387 v0.AddArg(ptr) 3388 v0.AddArg(mem) 3389 return true 3390 } 3391 return false 3392 } 3393 func rewriteValue386_Op386CMPBload_0(v *Value) bool { 3394 // match: (CMPBload {sym} [off] ptr (MOVLconst [c]) mem) 3395 // cond: validValAndOff(int64(int8(c)),off) 3396 // result: (CMPBconstload {sym} [makeValAndOff(int64(int8(c)),off)] ptr mem) 3397 for { 3398 off := v.AuxInt 3399 sym := v.Aux 3400 _ = v.Args[2] 3401 ptr := v.Args[0] 3402 v_1 := v.Args[1] 3403 if v_1.Op != Op386MOVLconst { 3404 break 3405 } 3406 c := v_1.AuxInt 3407 mem := v.Args[2] 3408 if !(validValAndOff(int64(int8(c)), off)) { 3409 break 3410 } 3411 v.reset(Op386CMPBconstload) 3412 v.AuxInt = makeValAndOff(int64(int8(c)), off) 3413 v.Aux = sym 3414 v.AddArg(ptr) 3415 v.AddArg(mem) 3416 return true 3417 } 3418 return false 3419 } 3420 func rewriteValue386_Op386CMPL_0(v *Value) bool { 3421 b := v.Block 3422 _ = b 3423 // match: (CMPL x (MOVLconst [c])) 3424 // cond: 3425 // result: (CMPLconst x [c]) 3426 for { 3427 _ = v.Args[1] 3428 x := v.Args[0] 3429 v_1 := v.Args[1] 3430 if v_1.Op != Op386MOVLconst { 3431 break 3432 } 3433 c := v_1.AuxInt 3434 v.reset(Op386CMPLconst) 3435 v.AuxInt = c 3436 v.AddArg(x) 3437 return true 3438 } 3439 // match: (CMPL (MOVLconst [c]) x) 3440 // cond: 3441 // result: (InvertFlags (CMPLconst x [c])) 3442 for { 3443 _ = v.Args[1] 3444 v_0 := v.Args[0] 3445 if v_0.Op != Op386MOVLconst { 3446 break 3447 } 3448 c := v_0.AuxInt 3449 x := v.Args[1] 3450 v.reset(Op386InvertFlags) 3451 v0 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 3452 v0.AuxInt = c 3453 v0.AddArg(x) 3454 v.AddArg(v0) 3455 return true 3456 } 3457 // match: (CMPL l:(MOVLload {sym} [off] ptr mem) x) 3458 // cond: canMergeLoad(v, l, x) && clobber(l) 3459 // result: (CMPLload {sym} [off] ptr x mem) 3460 for { 3461 _ = v.Args[1] 3462 l := v.Args[0] 3463 if l.Op != Op386MOVLload { 3464 break 3465 } 3466 off := l.AuxInt 3467 sym := l.Aux 3468 _ = l.Args[1] 3469 ptr := l.Args[0] 3470 mem := l.Args[1] 3471 x := v.Args[1] 3472 if !(canMergeLoad(v, l, x) && clobber(l)) { 3473 break 3474 } 3475 v.reset(Op386CMPLload) 3476 v.AuxInt = off 3477 v.Aux = sym 3478 v.AddArg(ptr) 3479 v.AddArg(x) 3480 v.AddArg(mem) 3481 return true 3482 } 3483 // match: (CMPL x l:(MOVLload {sym} [off] ptr mem)) 3484 // cond: canMergeLoad(v, l, x) && clobber(l) 3485 // result: (InvertFlags (CMPLload {sym} [off] ptr x mem)) 3486 for { 3487 _ = v.Args[1] 3488 x := v.Args[0] 3489 l := v.Args[1] 3490 if l.Op != Op386MOVLload { 3491 break 3492 } 3493 off := l.AuxInt 3494 sym := l.Aux 3495 _ = l.Args[1] 3496 ptr := l.Args[0] 3497 mem := l.Args[1] 3498 if !(canMergeLoad(v, l, x) && clobber(l)) { 3499 break 3500 } 3501 v.reset(Op386InvertFlags) 3502 v0 := b.NewValue0(v.Pos, Op386CMPLload, types.TypeFlags) 3503 v0.AuxInt = off 3504 v0.Aux = sym 3505 v0.AddArg(ptr) 3506 v0.AddArg(x) 3507 v0.AddArg(mem) 3508 v.AddArg(v0) 3509 return true 3510 } 3511 return false 3512 } 3513 func rewriteValue386_Op386CMPLconst_0(v *Value) bool { 3514 // match: (CMPLconst (MOVLconst [x]) [y]) 3515 // cond: int32(x)==int32(y) 3516 // result: (FlagEQ) 3517 for { 3518 y := v.AuxInt 3519 v_0 := v.Args[0] 3520 if v_0.Op != Op386MOVLconst { 3521 break 3522 } 3523 x := v_0.AuxInt 3524 if !(int32(x) == int32(y)) { 3525 break 3526 } 3527 v.reset(Op386FlagEQ) 3528 return true 3529 } 3530 // match: (CMPLconst (MOVLconst [x]) [y]) 3531 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 3532 // result: (FlagLT_ULT) 3533 for { 3534 y := v.AuxInt 3535 v_0 := v.Args[0] 3536 if v_0.Op != Op386MOVLconst { 3537 break 3538 } 3539 x := v_0.AuxInt 3540 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 3541 break 3542 } 3543 v.reset(Op386FlagLT_ULT) 3544 return true 3545 } 3546 // match: (CMPLconst (MOVLconst [x]) [y]) 3547 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 3548 // result: (FlagLT_UGT) 3549 for { 3550 y := v.AuxInt 3551 v_0 := v.Args[0] 3552 if v_0.Op != Op386MOVLconst { 3553 break 3554 } 3555 x := v_0.AuxInt 3556 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 3557 break 3558 } 3559 v.reset(Op386FlagLT_UGT) 3560 return true 3561 } 3562 // match: (CMPLconst (MOVLconst [x]) [y]) 3563 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 3564 // result: (FlagGT_ULT) 3565 for { 3566 y := v.AuxInt 3567 v_0 := v.Args[0] 3568 if v_0.Op != Op386MOVLconst { 3569 break 3570 } 3571 x := v_0.AuxInt 3572 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 3573 break 3574 } 3575 v.reset(Op386FlagGT_ULT) 3576 return true 3577 } 3578 // match: (CMPLconst (MOVLconst [x]) [y]) 3579 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 3580 // result: (FlagGT_UGT) 3581 for { 3582 y := v.AuxInt 3583 v_0 := v.Args[0] 3584 if v_0.Op != Op386MOVLconst { 3585 break 3586 } 3587 x := v_0.AuxInt 3588 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 3589 break 3590 } 3591 v.reset(Op386FlagGT_UGT) 3592 return true 3593 } 3594 // match: (CMPLconst (SHRLconst _ [c]) [n]) 3595 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 3596 // result: (FlagLT_ULT) 3597 for { 3598 n := v.AuxInt 3599 v_0 := v.Args[0] 3600 if v_0.Op != Op386SHRLconst { 3601 break 3602 } 3603 c := v_0.AuxInt 3604 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 3605 break 3606 } 3607 v.reset(Op386FlagLT_ULT) 3608 return true 3609 } 3610 // match: (CMPLconst (ANDLconst _ [m]) [n]) 3611 // cond: 0 <= int32(m) && int32(m) < int32(n) 3612 // result: (FlagLT_ULT) 3613 for { 3614 n := v.AuxInt 3615 v_0 := v.Args[0] 3616 if v_0.Op != Op386ANDLconst { 3617 break 3618 } 3619 m := v_0.AuxInt 3620 if !(0 <= int32(m) && int32(m) < int32(n)) { 3621 break 3622 } 3623 v.reset(Op386FlagLT_ULT) 3624 return true 3625 } 3626 // match: (CMPLconst l:(ANDL x y) [0]) 3627 // cond: l.Uses==1 3628 // result: (TESTL x y) 3629 for { 3630 if v.AuxInt != 0 { 3631 break 3632 } 3633 l := v.Args[0] 3634 if l.Op != Op386ANDL { 3635 break 3636 } 3637 _ = l.Args[1] 3638 x := l.Args[0] 3639 y := l.Args[1] 3640 if !(l.Uses == 1) { 3641 break 3642 } 3643 v.reset(Op386TESTL) 3644 v.AddArg(x) 3645 v.AddArg(y) 3646 return true 3647 } 3648 // match: (CMPLconst l:(ANDLconst [c] x) [0]) 3649 // cond: l.Uses==1 3650 // result: (TESTLconst [c] x) 3651 for { 3652 if v.AuxInt != 0 { 3653 break 3654 } 3655 l := v.Args[0] 3656 if l.Op != Op386ANDLconst { 3657 break 3658 } 3659 c := l.AuxInt 3660 x := l.Args[0] 3661 if !(l.Uses == 1) { 3662 break 3663 } 3664 v.reset(Op386TESTLconst) 3665 v.AuxInt = c 3666 v.AddArg(x) 3667 return true 3668 } 3669 // match: (CMPLconst x [0]) 3670 // cond: 3671 // result: (TESTL x x) 3672 for { 3673 if v.AuxInt != 0 { 3674 break 3675 } 3676 x := v.Args[0] 3677 v.reset(Op386TESTL) 3678 v.AddArg(x) 3679 v.AddArg(x) 3680 return true 3681 } 3682 return false 3683 } 3684 func rewriteValue386_Op386CMPLconst_10(v *Value) bool { 3685 b := v.Block 3686 _ = b 3687 // match: (CMPLconst l:(MOVLload {sym} [off] ptr mem) [c]) 3688 // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) 3689 // result: @l.Block (CMPLconstload {sym} [makeValAndOff(c,off)] ptr mem) 3690 for { 3691 c := v.AuxInt 3692 l := v.Args[0] 3693 if l.Op != Op386MOVLload { 3694 break 3695 } 3696 off := l.AuxInt 3697 sym := l.Aux 3698 _ = l.Args[1] 3699 ptr := l.Args[0] 3700 mem := l.Args[1] 3701 if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { 3702 break 3703 } 3704 b = l.Block 3705 v0 := b.NewValue0(v.Pos, Op386CMPLconstload, types.TypeFlags) 3706 v.reset(OpCopy) 3707 v.AddArg(v0) 3708 v0.AuxInt = makeValAndOff(c, off) 3709 v0.Aux = sym 3710 v0.AddArg(ptr) 3711 v0.AddArg(mem) 3712 return true 3713 } 3714 return false 3715 } 3716 func rewriteValue386_Op386CMPLload_0(v *Value) bool { 3717 // match: (CMPLload {sym} [off] ptr (MOVLconst [c]) mem) 3718 // cond: validValAndOff(int64(int32(c)),off) 3719 // result: (CMPLconstload {sym} [makeValAndOff(int64(int32(c)),off)] ptr mem) 3720 for { 3721 off := v.AuxInt 3722 sym := v.Aux 3723 _ = v.Args[2] 3724 ptr := v.Args[0] 3725 v_1 := v.Args[1] 3726 if v_1.Op != Op386MOVLconst { 3727 break 3728 } 3729 c := v_1.AuxInt 3730 mem := v.Args[2] 3731 if !(validValAndOff(int64(int32(c)), off)) { 3732 break 3733 } 3734 v.reset(Op386CMPLconstload) 3735 v.AuxInt = makeValAndOff(int64(int32(c)), off) 3736 v.Aux = sym 3737 v.AddArg(ptr) 3738 v.AddArg(mem) 3739 return true 3740 } 3741 return false 3742 } 3743 func rewriteValue386_Op386CMPW_0(v *Value) bool { 3744 b := v.Block 3745 _ = b 3746 // match: (CMPW x (MOVLconst [c])) 3747 // cond: 3748 // result: (CMPWconst x [int64(int16(c))]) 3749 for { 3750 _ = v.Args[1] 3751 x := v.Args[0] 3752 v_1 := v.Args[1] 3753 if v_1.Op != Op386MOVLconst { 3754 break 3755 } 3756 c := v_1.AuxInt 3757 v.reset(Op386CMPWconst) 3758 v.AuxInt = int64(int16(c)) 3759 v.AddArg(x) 3760 return true 3761 } 3762 // match: (CMPW (MOVLconst [c]) x) 3763 // cond: 3764 // result: (InvertFlags (CMPWconst x [int64(int16(c))])) 3765 for { 3766 _ = v.Args[1] 3767 v_0 := v.Args[0] 3768 if v_0.Op != Op386MOVLconst { 3769 break 3770 } 3771 c := v_0.AuxInt 3772 x := v.Args[1] 3773 v.reset(Op386InvertFlags) 3774 v0 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 3775 v0.AuxInt = int64(int16(c)) 3776 v0.AddArg(x) 3777 v.AddArg(v0) 3778 return true 3779 } 3780 // match: (CMPW l:(MOVWload {sym} [off] ptr mem) x) 3781 // cond: canMergeLoad(v, l, x) && clobber(l) 3782 // result: (CMPWload {sym} [off] ptr x mem) 3783 for { 3784 _ = v.Args[1] 3785 l := v.Args[0] 3786 if l.Op != Op386MOVWload { 3787 break 3788 } 3789 off := l.AuxInt 3790 sym := l.Aux 3791 _ = l.Args[1] 3792 ptr := l.Args[0] 3793 mem := l.Args[1] 3794 x := v.Args[1] 3795 if !(canMergeLoad(v, l, x) && clobber(l)) { 3796 break 3797 } 3798 v.reset(Op386CMPWload) 3799 v.AuxInt = off 3800 v.Aux = sym 3801 v.AddArg(ptr) 3802 v.AddArg(x) 3803 v.AddArg(mem) 3804 return true 3805 } 3806 // match: (CMPW x l:(MOVWload {sym} [off] ptr mem)) 3807 // cond: canMergeLoad(v, l, x) && clobber(l) 3808 // result: (InvertFlags (CMPWload {sym} [off] ptr x mem)) 3809 for { 3810 _ = v.Args[1] 3811 x := v.Args[0] 3812 l := v.Args[1] 3813 if l.Op != Op386MOVWload { 3814 break 3815 } 3816 off := l.AuxInt 3817 sym := l.Aux 3818 _ = l.Args[1] 3819 ptr := l.Args[0] 3820 mem := l.Args[1] 3821 if !(canMergeLoad(v, l, x) && clobber(l)) { 3822 break 3823 } 3824 v.reset(Op386InvertFlags) 3825 v0 := b.NewValue0(v.Pos, Op386CMPWload, types.TypeFlags) 3826 v0.AuxInt = off 3827 v0.Aux = sym 3828 v0.AddArg(ptr) 3829 v0.AddArg(x) 3830 v0.AddArg(mem) 3831 v.AddArg(v0) 3832 return true 3833 } 3834 return false 3835 } 3836 func rewriteValue386_Op386CMPWconst_0(v *Value) bool { 3837 b := v.Block 3838 _ = b 3839 // match: (CMPWconst (MOVLconst [x]) [y]) 3840 // cond: int16(x)==int16(y) 3841 // result: (FlagEQ) 3842 for { 3843 y := v.AuxInt 3844 v_0 := v.Args[0] 3845 if v_0.Op != Op386MOVLconst { 3846 break 3847 } 3848 x := v_0.AuxInt 3849 if !(int16(x) == int16(y)) { 3850 break 3851 } 3852 v.reset(Op386FlagEQ) 3853 return true 3854 } 3855 // match: (CMPWconst (MOVLconst [x]) [y]) 3856 // cond: int16(x)<int16(y) && uint16(x)<uint16(y) 3857 // result: (FlagLT_ULT) 3858 for { 3859 y := v.AuxInt 3860 v_0 := v.Args[0] 3861 if v_0.Op != Op386MOVLconst { 3862 break 3863 } 3864 x := v_0.AuxInt 3865 if !(int16(x) < int16(y) && uint16(x) < uint16(y)) { 3866 break 3867 } 3868 v.reset(Op386FlagLT_ULT) 3869 return true 3870 } 3871 // match: (CMPWconst (MOVLconst [x]) [y]) 3872 // cond: int16(x)<int16(y) && uint16(x)>uint16(y) 3873 // result: (FlagLT_UGT) 3874 for { 3875 y := v.AuxInt 3876 v_0 := v.Args[0] 3877 if v_0.Op != Op386MOVLconst { 3878 break 3879 } 3880 x := v_0.AuxInt 3881 if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { 3882 break 3883 } 3884 v.reset(Op386FlagLT_UGT) 3885 return true 3886 } 3887 // match: (CMPWconst (MOVLconst [x]) [y]) 3888 // cond: int16(x)>int16(y) && uint16(x)<uint16(y) 3889 // result: (FlagGT_ULT) 3890 for { 3891 y := v.AuxInt 3892 v_0 := v.Args[0] 3893 if v_0.Op != Op386MOVLconst { 3894 break 3895 } 3896 x := v_0.AuxInt 3897 if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { 3898 break 3899 } 3900 v.reset(Op386FlagGT_ULT) 3901 return true 3902 } 3903 // match: (CMPWconst (MOVLconst [x]) [y]) 3904 // cond: int16(x)>int16(y) && uint16(x)>uint16(y) 3905 // result: (FlagGT_UGT) 3906 for { 3907 y := v.AuxInt 3908 v_0 := v.Args[0] 3909 if v_0.Op != Op386MOVLconst { 3910 break 3911 } 3912 x := v_0.AuxInt 3913 if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { 3914 break 3915 } 3916 v.reset(Op386FlagGT_UGT) 3917 return true 3918 } 3919 // match: (CMPWconst (ANDLconst _ [m]) [n]) 3920 // cond: 0 <= int16(m) && int16(m) < int16(n) 3921 // result: (FlagLT_ULT) 3922 for { 3923 n := v.AuxInt 3924 v_0 := v.Args[0] 3925 if v_0.Op != Op386ANDLconst { 3926 break 3927 } 3928 m := v_0.AuxInt 3929 if !(0 <= int16(m) && int16(m) < int16(n)) { 3930 break 3931 } 3932 v.reset(Op386FlagLT_ULT) 3933 return true 3934 } 3935 // match: (CMPWconst l:(ANDL x y) [0]) 3936 // cond: l.Uses==1 3937 // result: (TESTW x y) 3938 for { 3939 if v.AuxInt != 0 { 3940 break 3941 } 3942 l := v.Args[0] 3943 if l.Op != Op386ANDL { 3944 break 3945 } 3946 _ = l.Args[1] 3947 x := l.Args[0] 3948 y := l.Args[1] 3949 if !(l.Uses == 1) { 3950 break 3951 } 3952 v.reset(Op386TESTW) 3953 v.AddArg(x) 3954 v.AddArg(y) 3955 return true 3956 } 3957 // match: (CMPWconst l:(ANDLconst [c] x) [0]) 3958 // cond: l.Uses==1 3959 // result: (TESTWconst [int64(int16(c))] x) 3960 for { 3961 if v.AuxInt != 0 { 3962 break 3963 } 3964 l := v.Args[0] 3965 if l.Op != Op386ANDLconst { 3966 break 3967 } 3968 c := l.AuxInt 3969 x := l.Args[0] 3970 if !(l.Uses == 1) { 3971 break 3972 } 3973 v.reset(Op386TESTWconst) 3974 v.AuxInt = int64(int16(c)) 3975 v.AddArg(x) 3976 return true 3977 } 3978 // match: (CMPWconst x [0]) 3979 // cond: 3980 // result: (TESTW x x) 3981 for { 3982 if v.AuxInt != 0 { 3983 break 3984 } 3985 x := v.Args[0] 3986 v.reset(Op386TESTW) 3987 v.AddArg(x) 3988 v.AddArg(x) 3989 return true 3990 } 3991 // match: (CMPWconst l:(MOVWload {sym} [off] ptr mem) [c]) 3992 // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) 3993 // result: @l.Block (CMPWconstload {sym} [makeValAndOff(c,off)] ptr mem) 3994 for { 3995 c := v.AuxInt 3996 l := v.Args[0] 3997 if l.Op != Op386MOVWload { 3998 break 3999 } 4000 off := l.AuxInt 4001 sym := l.Aux 4002 _ = l.Args[1] 4003 ptr := l.Args[0] 4004 mem := l.Args[1] 4005 if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { 4006 break 4007 } 4008 b = l.Block 4009 v0 := b.NewValue0(v.Pos, Op386CMPWconstload, types.TypeFlags) 4010 v.reset(OpCopy) 4011 v.AddArg(v0) 4012 v0.AuxInt = makeValAndOff(c, off) 4013 v0.Aux = sym 4014 v0.AddArg(ptr) 4015 v0.AddArg(mem) 4016 return true 4017 } 4018 return false 4019 } 4020 func rewriteValue386_Op386CMPWload_0(v *Value) bool { 4021 // match: (CMPWload {sym} [off] ptr (MOVLconst [c]) mem) 4022 // cond: validValAndOff(int64(int16(c)),off) 4023 // result: (CMPWconstload {sym} [makeValAndOff(int64(int16(c)),off)] ptr mem) 4024 for { 4025 off := v.AuxInt 4026 sym := v.Aux 4027 _ = v.Args[2] 4028 ptr := v.Args[0] 4029 v_1 := v.Args[1] 4030 if v_1.Op != Op386MOVLconst { 4031 break 4032 } 4033 c := v_1.AuxInt 4034 mem := v.Args[2] 4035 if !(validValAndOff(int64(int16(c)), off)) { 4036 break 4037 } 4038 v.reset(Op386CMPWconstload) 4039 v.AuxInt = makeValAndOff(int64(int16(c)), off) 4040 v.Aux = sym 4041 v.AddArg(ptr) 4042 v.AddArg(mem) 4043 return true 4044 } 4045 return false 4046 } 4047 func rewriteValue386_Op386DIVSD_0(v *Value) bool { 4048 b := v.Block 4049 _ = b 4050 config := b.Func.Config 4051 _ = config 4052 // match: (DIVSD x l:(MOVSDload [off] {sym} ptr mem)) 4053 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 4054 // result: (DIVSDload x [off] {sym} ptr mem) 4055 for { 4056 _ = v.Args[1] 4057 x := v.Args[0] 4058 l := v.Args[1] 4059 if l.Op != Op386MOVSDload { 4060 break 4061 } 4062 off := l.AuxInt 4063 sym := l.Aux 4064 _ = l.Args[1] 4065 ptr := l.Args[0] 4066 mem := l.Args[1] 4067 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 4068 break 4069 } 4070 v.reset(Op386DIVSDload) 4071 v.AuxInt = off 4072 v.Aux = sym 4073 v.AddArg(x) 4074 v.AddArg(ptr) 4075 v.AddArg(mem) 4076 return true 4077 } 4078 return false 4079 } 4080 func rewriteValue386_Op386DIVSDload_0(v *Value) bool { 4081 b := v.Block 4082 _ = b 4083 config := b.Func.Config 4084 _ = config 4085 // match: (DIVSDload [off1] {sym} val (ADDLconst [off2] base) mem) 4086 // cond: is32Bit(off1+off2) 4087 // result: (DIVSDload [off1+off2] {sym} val base mem) 4088 for { 4089 off1 := v.AuxInt 4090 sym := v.Aux 4091 _ = v.Args[2] 4092 val := v.Args[0] 4093 v_1 := v.Args[1] 4094 if v_1.Op != Op386ADDLconst { 4095 break 4096 } 4097 off2 := v_1.AuxInt 4098 base := v_1.Args[0] 4099 mem := v.Args[2] 4100 if !(is32Bit(off1 + off2)) { 4101 break 4102 } 4103 v.reset(Op386DIVSDload) 4104 v.AuxInt = off1 + off2 4105 v.Aux = sym 4106 v.AddArg(val) 4107 v.AddArg(base) 4108 v.AddArg(mem) 4109 return true 4110 } 4111 // match: (DIVSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 4112 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4113 // result: (DIVSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 4114 for { 4115 off1 := v.AuxInt 4116 sym1 := v.Aux 4117 _ = v.Args[2] 4118 val := v.Args[0] 4119 v_1 := v.Args[1] 4120 if v_1.Op != Op386LEAL { 4121 break 4122 } 4123 off2 := v_1.AuxInt 4124 sym2 := v_1.Aux 4125 base := v_1.Args[0] 4126 mem := v.Args[2] 4127 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4128 break 4129 } 4130 v.reset(Op386DIVSDload) 4131 v.AuxInt = off1 + off2 4132 v.Aux = mergeSym(sym1, sym2) 4133 v.AddArg(val) 4134 v.AddArg(base) 4135 v.AddArg(mem) 4136 return true 4137 } 4138 return false 4139 } 4140 func rewriteValue386_Op386DIVSS_0(v *Value) bool { 4141 b := v.Block 4142 _ = b 4143 config := b.Func.Config 4144 _ = config 4145 // match: (DIVSS x l:(MOVSSload [off] {sym} ptr mem)) 4146 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 4147 // result: (DIVSSload x [off] {sym} ptr mem) 4148 for { 4149 _ = v.Args[1] 4150 x := v.Args[0] 4151 l := v.Args[1] 4152 if l.Op != Op386MOVSSload { 4153 break 4154 } 4155 off := l.AuxInt 4156 sym := l.Aux 4157 _ = l.Args[1] 4158 ptr := l.Args[0] 4159 mem := l.Args[1] 4160 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 4161 break 4162 } 4163 v.reset(Op386DIVSSload) 4164 v.AuxInt = off 4165 v.Aux = sym 4166 v.AddArg(x) 4167 v.AddArg(ptr) 4168 v.AddArg(mem) 4169 return true 4170 } 4171 return false 4172 } 4173 func rewriteValue386_Op386DIVSSload_0(v *Value) bool { 4174 b := v.Block 4175 _ = b 4176 config := b.Func.Config 4177 _ = config 4178 // match: (DIVSSload [off1] {sym} val (ADDLconst [off2] base) mem) 4179 // cond: is32Bit(off1+off2) 4180 // result: (DIVSSload [off1+off2] {sym} val base mem) 4181 for { 4182 off1 := v.AuxInt 4183 sym := v.Aux 4184 _ = v.Args[2] 4185 val := v.Args[0] 4186 v_1 := v.Args[1] 4187 if v_1.Op != Op386ADDLconst { 4188 break 4189 } 4190 off2 := v_1.AuxInt 4191 base := v_1.Args[0] 4192 mem := v.Args[2] 4193 if !(is32Bit(off1 + off2)) { 4194 break 4195 } 4196 v.reset(Op386DIVSSload) 4197 v.AuxInt = off1 + off2 4198 v.Aux = sym 4199 v.AddArg(val) 4200 v.AddArg(base) 4201 v.AddArg(mem) 4202 return true 4203 } 4204 // match: (DIVSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 4205 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 4206 // result: (DIVSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 4207 for { 4208 off1 := v.AuxInt 4209 sym1 := v.Aux 4210 _ = v.Args[2] 4211 val := v.Args[0] 4212 v_1 := v.Args[1] 4213 if v_1.Op != Op386LEAL { 4214 break 4215 } 4216 off2 := v_1.AuxInt 4217 sym2 := v_1.Aux 4218 base := v_1.Args[0] 4219 mem := v.Args[2] 4220 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 4221 break 4222 } 4223 v.reset(Op386DIVSSload) 4224 v.AuxInt = off1 + off2 4225 v.Aux = mergeSym(sym1, sym2) 4226 v.AddArg(val) 4227 v.AddArg(base) 4228 v.AddArg(mem) 4229 return true 4230 } 4231 return false 4232 } 4233 func rewriteValue386_Op386LEAL_0(v *Value) bool { 4234 // match: (LEAL [c] {s} (ADDLconst [d] x)) 4235 // cond: is32Bit(c+d) 4236 // result: (LEAL [c+d] {s} x) 4237 for { 4238 c := v.AuxInt 4239 s := v.Aux 4240 v_0 := v.Args[0] 4241 if v_0.Op != Op386ADDLconst { 4242 break 4243 } 4244 d := v_0.AuxInt 4245 x := v_0.Args[0] 4246 if !(is32Bit(c + d)) { 4247 break 4248 } 4249 v.reset(Op386LEAL) 4250 v.AuxInt = c + d 4251 v.Aux = s 4252 v.AddArg(x) 4253 return true 4254 } 4255 // match: (LEAL [c] {s} (ADDL x y)) 4256 // cond: x.Op != OpSB && y.Op != OpSB 4257 // result: (LEAL1 [c] {s} x y) 4258 for { 4259 c := v.AuxInt 4260 s := v.Aux 4261 v_0 := v.Args[0] 4262 if v_0.Op != Op386ADDL { 4263 break 4264 } 4265 _ = v_0.Args[1] 4266 x := v_0.Args[0] 4267 y := v_0.Args[1] 4268 if !(x.Op != OpSB && y.Op != OpSB) { 4269 break 4270 } 4271 v.reset(Op386LEAL1) 4272 v.AuxInt = c 4273 v.Aux = s 4274 v.AddArg(x) 4275 v.AddArg(y) 4276 return true 4277 } 4278 // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) 4279 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4280 // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) 4281 for { 4282 off1 := v.AuxInt 4283 sym1 := v.Aux 4284 v_0 := v.Args[0] 4285 if v_0.Op != Op386LEAL { 4286 break 4287 } 4288 off2 := v_0.AuxInt 4289 sym2 := v_0.Aux 4290 x := v_0.Args[0] 4291 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4292 break 4293 } 4294 v.reset(Op386LEAL) 4295 v.AuxInt = off1 + off2 4296 v.Aux = mergeSym(sym1, sym2) 4297 v.AddArg(x) 4298 return true 4299 } 4300 // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) 4301 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4302 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 4303 for { 4304 off1 := v.AuxInt 4305 sym1 := v.Aux 4306 v_0 := v.Args[0] 4307 if v_0.Op != Op386LEAL1 { 4308 break 4309 } 4310 off2 := v_0.AuxInt 4311 sym2 := v_0.Aux 4312 _ = v_0.Args[1] 4313 x := v_0.Args[0] 4314 y := v_0.Args[1] 4315 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4316 break 4317 } 4318 v.reset(Op386LEAL1) 4319 v.AuxInt = off1 + off2 4320 v.Aux = mergeSym(sym1, sym2) 4321 v.AddArg(x) 4322 v.AddArg(y) 4323 return true 4324 } 4325 // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) 4326 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4327 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 4328 for { 4329 off1 := v.AuxInt 4330 sym1 := v.Aux 4331 v_0 := v.Args[0] 4332 if v_0.Op != Op386LEAL2 { 4333 break 4334 } 4335 off2 := v_0.AuxInt 4336 sym2 := v_0.Aux 4337 _ = v_0.Args[1] 4338 x := v_0.Args[0] 4339 y := v_0.Args[1] 4340 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4341 break 4342 } 4343 v.reset(Op386LEAL2) 4344 v.AuxInt = off1 + off2 4345 v.Aux = mergeSym(sym1, sym2) 4346 v.AddArg(x) 4347 v.AddArg(y) 4348 return true 4349 } 4350 // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) 4351 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4352 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 4353 for { 4354 off1 := v.AuxInt 4355 sym1 := v.Aux 4356 v_0 := v.Args[0] 4357 if v_0.Op != Op386LEAL4 { 4358 break 4359 } 4360 off2 := v_0.AuxInt 4361 sym2 := v_0.Aux 4362 _ = v_0.Args[1] 4363 x := v_0.Args[0] 4364 y := v_0.Args[1] 4365 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4366 break 4367 } 4368 v.reset(Op386LEAL4) 4369 v.AuxInt = off1 + off2 4370 v.Aux = mergeSym(sym1, sym2) 4371 v.AddArg(x) 4372 v.AddArg(y) 4373 return true 4374 } 4375 // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) 4376 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 4377 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 4378 for { 4379 off1 := v.AuxInt 4380 sym1 := v.Aux 4381 v_0 := v.Args[0] 4382 if v_0.Op != Op386LEAL8 { 4383 break 4384 } 4385 off2 := v_0.AuxInt 4386 sym2 := v_0.Aux 4387 _ = v_0.Args[1] 4388 x := v_0.Args[0] 4389 y := v_0.Args[1] 4390 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 4391 break 4392 } 4393 v.reset(Op386LEAL8) 4394 v.AuxInt = off1 + off2 4395 v.Aux = mergeSym(sym1, sym2) 4396 v.AddArg(x) 4397 v.AddArg(y) 4398 return true 4399 } 4400 return false 4401 } 4402 func rewriteValue386_Op386LEAL1_0(v *Value) bool { 4403 // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) 4404 // cond: is32Bit(c+d) && x.Op != OpSB 4405 // result: (LEAL1 [c+d] {s} x y) 4406 for { 4407 c := v.AuxInt 4408 s := v.Aux 4409 _ = v.Args[1] 4410 v_0 := v.Args[0] 4411 if v_0.Op != Op386ADDLconst { 4412 break 4413 } 4414 d := v_0.AuxInt 4415 x := v_0.Args[0] 4416 y := v.Args[1] 4417 if !(is32Bit(c+d) && x.Op != OpSB) { 4418 break 4419 } 4420 v.reset(Op386LEAL1) 4421 v.AuxInt = c + d 4422 v.Aux = s 4423 v.AddArg(x) 4424 v.AddArg(y) 4425 return true 4426 } 4427 // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) 4428 // cond: is32Bit(c+d) && x.Op != OpSB 4429 // result: (LEAL1 [c+d] {s} x y) 4430 for { 4431 c := v.AuxInt 4432 s := v.Aux 4433 _ = v.Args[1] 4434 y := v.Args[0] 4435 v_1 := v.Args[1] 4436 if v_1.Op != Op386ADDLconst { 4437 break 4438 } 4439 d := v_1.AuxInt 4440 x := v_1.Args[0] 4441 if !(is32Bit(c+d) && x.Op != OpSB) { 4442 break 4443 } 4444 v.reset(Op386LEAL1) 4445 v.AuxInt = c + d 4446 v.Aux = s 4447 v.AddArg(x) 4448 v.AddArg(y) 4449 return true 4450 } 4451 // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) 4452 // cond: 4453 // result: (LEAL2 [c] {s} x y) 4454 for { 4455 c := v.AuxInt 4456 s := v.Aux 4457 _ = v.Args[1] 4458 x := v.Args[0] 4459 v_1 := v.Args[1] 4460 if v_1.Op != Op386SHLLconst { 4461 break 4462 } 4463 if v_1.AuxInt != 1 { 4464 break 4465 } 4466 y := v_1.Args[0] 4467 v.reset(Op386LEAL2) 4468 v.AuxInt = c 4469 v.Aux = s 4470 v.AddArg(x) 4471 v.AddArg(y) 4472 return true 4473 } 4474 // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) 4475 // cond: 4476 // result: (LEAL2 [c] {s} x y) 4477 for { 4478 c := v.AuxInt 4479 s := v.Aux 4480 _ = v.Args[1] 4481 v_0 := v.Args[0] 4482 if v_0.Op != Op386SHLLconst { 4483 break 4484 } 4485 if v_0.AuxInt != 1 { 4486 break 4487 } 4488 y := v_0.Args[0] 4489 x := v.Args[1] 4490 v.reset(Op386LEAL2) 4491 v.AuxInt = c 4492 v.Aux = s 4493 v.AddArg(x) 4494 v.AddArg(y) 4495 return true 4496 } 4497 // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) 4498 // cond: 4499 // result: (LEAL4 [c] {s} x y) 4500 for { 4501 c := v.AuxInt 4502 s := v.Aux 4503 _ = v.Args[1] 4504 x := v.Args[0] 4505 v_1 := v.Args[1] 4506 if v_1.Op != Op386SHLLconst { 4507 break 4508 } 4509 if v_1.AuxInt != 2 { 4510 break 4511 } 4512 y := v_1.Args[0] 4513 v.reset(Op386LEAL4) 4514 v.AuxInt = c 4515 v.Aux = s 4516 v.AddArg(x) 4517 v.AddArg(y) 4518 return true 4519 } 4520 // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) 4521 // cond: 4522 // result: (LEAL4 [c] {s} x y) 4523 for { 4524 c := v.AuxInt 4525 s := v.Aux 4526 _ = v.Args[1] 4527 v_0 := v.Args[0] 4528 if v_0.Op != Op386SHLLconst { 4529 break 4530 } 4531 if v_0.AuxInt != 2 { 4532 break 4533 } 4534 y := v_0.Args[0] 4535 x := v.Args[1] 4536 v.reset(Op386LEAL4) 4537 v.AuxInt = c 4538 v.Aux = s 4539 v.AddArg(x) 4540 v.AddArg(y) 4541 return true 4542 } 4543 // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) 4544 // cond: 4545 // result: (LEAL8 [c] {s} x y) 4546 for { 4547 c := v.AuxInt 4548 s := v.Aux 4549 _ = v.Args[1] 4550 x := v.Args[0] 4551 v_1 := v.Args[1] 4552 if v_1.Op != Op386SHLLconst { 4553 break 4554 } 4555 if v_1.AuxInt != 3 { 4556 break 4557 } 4558 y := v_1.Args[0] 4559 v.reset(Op386LEAL8) 4560 v.AuxInt = c 4561 v.Aux = s 4562 v.AddArg(x) 4563 v.AddArg(y) 4564 return true 4565 } 4566 // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) 4567 // cond: 4568 // result: (LEAL8 [c] {s} x y) 4569 for { 4570 c := v.AuxInt 4571 s := v.Aux 4572 _ = v.Args[1] 4573 v_0 := v.Args[0] 4574 if v_0.Op != Op386SHLLconst { 4575 break 4576 } 4577 if v_0.AuxInt != 3 { 4578 break 4579 } 4580 y := v_0.Args[0] 4581 x := v.Args[1] 4582 v.reset(Op386LEAL8) 4583 v.AuxInt = c 4584 v.Aux = s 4585 v.AddArg(x) 4586 v.AddArg(y) 4587 return true 4588 } 4589 // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) 4590 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 4591 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 4592 for { 4593 off1 := v.AuxInt 4594 sym1 := v.Aux 4595 _ = v.Args[1] 4596 v_0 := v.Args[0] 4597 if v_0.Op != Op386LEAL { 4598 break 4599 } 4600 off2 := v_0.AuxInt 4601 sym2 := v_0.Aux 4602 x := v_0.Args[0] 4603 y := v.Args[1] 4604 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 4605 break 4606 } 4607 v.reset(Op386LEAL1) 4608 v.AuxInt = off1 + off2 4609 v.Aux = mergeSym(sym1, sym2) 4610 v.AddArg(x) 4611 v.AddArg(y) 4612 return true 4613 } 4614 // match: (LEAL1 [off1] {sym1} y (LEAL [off2] {sym2} x)) 4615 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 4616 // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) 4617 for { 4618 off1 := v.AuxInt 4619 sym1 := v.Aux 4620 _ = v.Args[1] 4621 y := v.Args[0] 4622 v_1 := v.Args[1] 4623 if v_1.Op != Op386LEAL { 4624 break 4625 } 4626 off2 := v_1.AuxInt 4627 sym2 := v_1.Aux 4628 x := v_1.Args[0] 4629 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 4630 break 4631 } 4632 v.reset(Op386LEAL1) 4633 v.AuxInt = off1 + off2 4634 v.Aux = mergeSym(sym1, sym2) 4635 v.AddArg(x) 4636 v.AddArg(y) 4637 return true 4638 } 4639 return false 4640 } 4641 func rewriteValue386_Op386LEAL2_0(v *Value) bool { 4642 // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) 4643 // cond: is32Bit(c+d) && x.Op != OpSB 4644 // result: (LEAL2 [c+d] {s} x y) 4645 for { 4646 c := v.AuxInt 4647 s := v.Aux 4648 _ = v.Args[1] 4649 v_0 := v.Args[0] 4650 if v_0.Op != Op386ADDLconst { 4651 break 4652 } 4653 d := v_0.AuxInt 4654 x := v_0.Args[0] 4655 y := v.Args[1] 4656 if !(is32Bit(c+d) && x.Op != OpSB) { 4657 break 4658 } 4659 v.reset(Op386LEAL2) 4660 v.AuxInt = c + d 4661 v.Aux = s 4662 v.AddArg(x) 4663 v.AddArg(y) 4664 return true 4665 } 4666 // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) 4667 // cond: is32Bit(c+2*d) && y.Op != OpSB 4668 // result: (LEAL2 [c+2*d] {s} x y) 4669 for { 4670 c := v.AuxInt 4671 s := v.Aux 4672 _ = v.Args[1] 4673 x := v.Args[0] 4674 v_1 := v.Args[1] 4675 if v_1.Op != Op386ADDLconst { 4676 break 4677 } 4678 d := v_1.AuxInt 4679 y := v_1.Args[0] 4680 if !(is32Bit(c+2*d) && y.Op != OpSB) { 4681 break 4682 } 4683 v.reset(Op386LEAL2) 4684 v.AuxInt = c + 2*d 4685 v.Aux = s 4686 v.AddArg(x) 4687 v.AddArg(y) 4688 return true 4689 } 4690 // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) 4691 // cond: 4692 // result: (LEAL4 [c] {s} x y) 4693 for { 4694 c := v.AuxInt 4695 s := v.Aux 4696 _ = v.Args[1] 4697 x := v.Args[0] 4698 v_1 := v.Args[1] 4699 if v_1.Op != Op386SHLLconst { 4700 break 4701 } 4702 if v_1.AuxInt != 1 { 4703 break 4704 } 4705 y := v_1.Args[0] 4706 v.reset(Op386LEAL4) 4707 v.AuxInt = c 4708 v.Aux = s 4709 v.AddArg(x) 4710 v.AddArg(y) 4711 return true 4712 } 4713 // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) 4714 // cond: 4715 // result: (LEAL8 [c] {s} x y) 4716 for { 4717 c := v.AuxInt 4718 s := v.Aux 4719 _ = v.Args[1] 4720 x := v.Args[0] 4721 v_1 := v.Args[1] 4722 if v_1.Op != Op386SHLLconst { 4723 break 4724 } 4725 if v_1.AuxInt != 2 { 4726 break 4727 } 4728 y := v_1.Args[0] 4729 v.reset(Op386LEAL8) 4730 v.AuxInt = c 4731 v.Aux = s 4732 v.AddArg(x) 4733 v.AddArg(y) 4734 return true 4735 } 4736 // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) 4737 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 4738 // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) 4739 for { 4740 off1 := v.AuxInt 4741 sym1 := v.Aux 4742 _ = v.Args[1] 4743 v_0 := v.Args[0] 4744 if v_0.Op != Op386LEAL { 4745 break 4746 } 4747 off2 := v_0.AuxInt 4748 sym2 := v_0.Aux 4749 x := v_0.Args[0] 4750 y := v.Args[1] 4751 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 4752 break 4753 } 4754 v.reset(Op386LEAL2) 4755 v.AuxInt = off1 + off2 4756 v.Aux = mergeSym(sym1, sym2) 4757 v.AddArg(x) 4758 v.AddArg(y) 4759 return true 4760 } 4761 return false 4762 } 4763 func rewriteValue386_Op386LEAL4_0(v *Value) bool { 4764 // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) 4765 // cond: is32Bit(c+d) && x.Op != OpSB 4766 // result: (LEAL4 [c+d] {s} x y) 4767 for { 4768 c := v.AuxInt 4769 s := v.Aux 4770 _ = v.Args[1] 4771 v_0 := v.Args[0] 4772 if v_0.Op != Op386ADDLconst { 4773 break 4774 } 4775 d := v_0.AuxInt 4776 x := v_0.Args[0] 4777 y := v.Args[1] 4778 if !(is32Bit(c+d) && x.Op != OpSB) { 4779 break 4780 } 4781 v.reset(Op386LEAL4) 4782 v.AuxInt = c + d 4783 v.Aux = s 4784 v.AddArg(x) 4785 v.AddArg(y) 4786 return true 4787 } 4788 // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) 4789 // cond: is32Bit(c+4*d) && y.Op != OpSB 4790 // result: (LEAL4 [c+4*d] {s} x y) 4791 for { 4792 c := v.AuxInt 4793 s := v.Aux 4794 _ = v.Args[1] 4795 x := v.Args[0] 4796 v_1 := v.Args[1] 4797 if v_1.Op != Op386ADDLconst { 4798 break 4799 } 4800 d := v_1.AuxInt 4801 y := v_1.Args[0] 4802 if !(is32Bit(c+4*d) && y.Op != OpSB) { 4803 break 4804 } 4805 v.reset(Op386LEAL4) 4806 v.AuxInt = c + 4*d 4807 v.Aux = s 4808 v.AddArg(x) 4809 v.AddArg(y) 4810 return true 4811 } 4812 // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) 4813 // cond: 4814 // result: (LEAL8 [c] {s} x y) 4815 for { 4816 c := v.AuxInt 4817 s := v.Aux 4818 _ = v.Args[1] 4819 x := v.Args[0] 4820 v_1 := v.Args[1] 4821 if v_1.Op != Op386SHLLconst { 4822 break 4823 } 4824 if v_1.AuxInt != 1 { 4825 break 4826 } 4827 y := v_1.Args[0] 4828 v.reset(Op386LEAL8) 4829 v.AuxInt = c 4830 v.Aux = s 4831 v.AddArg(x) 4832 v.AddArg(y) 4833 return true 4834 } 4835 // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) 4836 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 4837 // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) 4838 for { 4839 off1 := v.AuxInt 4840 sym1 := v.Aux 4841 _ = v.Args[1] 4842 v_0 := v.Args[0] 4843 if v_0.Op != Op386LEAL { 4844 break 4845 } 4846 off2 := v_0.AuxInt 4847 sym2 := v_0.Aux 4848 x := v_0.Args[0] 4849 y := v.Args[1] 4850 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 4851 break 4852 } 4853 v.reset(Op386LEAL4) 4854 v.AuxInt = off1 + off2 4855 v.Aux = mergeSym(sym1, sym2) 4856 v.AddArg(x) 4857 v.AddArg(y) 4858 return true 4859 } 4860 return false 4861 } 4862 func rewriteValue386_Op386LEAL8_0(v *Value) bool { 4863 // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) 4864 // cond: is32Bit(c+d) && x.Op != OpSB 4865 // result: (LEAL8 [c+d] {s} x y) 4866 for { 4867 c := v.AuxInt 4868 s := v.Aux 4869 _ = v.Args[1] 4870 v_0 := v.Args[0] 4871 if v_0.Op != Op386ADDLconst { 4872 break 4873 } 4874 d := v_0.AuxInt 4875 x := v_0.Args[0] 4876 y := v.Args[1] 4877 if !(is32Bit(c+d) && x.Op != OpSB) { 4878 break 4879 } 4880 v.reset(Op386LEAL8) 4881 v.AuxInt = c + d 4882 v.Aux = s 4883 v.AddArg(x) 4884 v.AddArg(y) 4885 return true 4886 } 4887 // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) 4888 // cond: is32Bit(c+8*d) && y.Op != OpSB 4889 // result: (LEAL8 [c+8*d] {s} x y) 4890 for { 4891 c := v.AuxInt 4892 s := v.Aux 4893 _ = v.Args[1] 4894 x := v.Args[0] 4895 v_1 := v.Args[1] 4896 if v_1.Op != Op386ADDLconst { 4897 break 4898 } 4899 d := v_1.AuxInt 4900 y := v_1.Args[0] 4901 if !(is32Bit(c+8*d) && y.Op != OpSB) { 4902 break 4903 } 4904 v.reset(Op386LEAL8) 4905 v.AuxInt = c + 8*d 4906 v.Aux = s 4907 v.AddArg(x) 4908 v.AddArg(y) 4909 return true 4910 } 4911 // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) 4912 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 4913 // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) 4914 for { 4915 off1 := v.AuxInt 4916 sym1 := v.Aux 4917 _ = v.Args[1] 4918 v_0 := v.Args[0] 4919 if v_0.Op != Op386LEAL { 4920 break 4921 } 4922 off2 := v_0.AuxInt 4923 sym2 := v_0.Aux 4924 x := v_0.Args[0] 4925 y := v.Args[1] 4926 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 4927 break 4928 } 4929 v.reset(Op386LEAL8) 4930 v.AuxInt = off1 + off2 4931 v.Aux = mergeSym(sym1, sym2) 4932 v.AddArg(x) 4933 v.AddArg(y) 4934 return true 4935 } 4936 return false 4937 } 4938 func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { 4939 b := v.Block 4940 _ = b 4941 // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) 4942 // cond: x.Uses == 1 && clobber(x) 4943 // result: @x.Block (MOVBLSXload <v.Type> [off] {sym} ptr mem) 4944 for { 4945 x := v.Args[0] 4946 if x.Op != Op386MOVBload { 4947 break 4948 } 4949 off := x.AuxInt 4950 sym := x.Aux 4951 _ = x.Args[1] 4952 ptr := x.Args[0] 4953 mem := x.Args[1] 4954 if !(x.Uses == 1 && clobber(x)) { 4955 break 4956 } 4957 b = x.Block 4958 v0 := b.NewValue0(v.Pos, Op386MOVBLSXload, v.Type) 4959 v.reset(OpCopy) 4960 v.AddArg(v0) 4961 v0.AuxInt = off 4962 v0.Aux = sym 4963 v0.AddArg(ptr) 4964 v0.AddArg(mem) 4965 return true 4966 } 4967 // match: (MOVBLSX (ANDLconst [c] x)) 4968 // cond: c & 0x80 == 0 4969 // result: (ANDLconst [c & 0x7f] x) 4970 for { 4971 v_0 := v.Args[0] 4972 if v_0.Op != Op386ANDLconst { 4973 break 4974 } 4975 c := v_0.AuxInt 4976 x := v_0.Args[0] 4977 if !(c&0x80 == 0) { 4978 break 4979 } 4980 v.reset(Op386ANDLconst) 4981 v.AuxInt = c & 0x7f 4982 v.AddArg(x) 4983 return true 4984 } 4985 return false 4986 } 4987 func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { 4988 b := v.Block 4989 _ = b 4990 config := b.Func.Config 4991 _ = config 4992 // match: (MOVBLSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 4993 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4994 // result: (MOVBLSX x) 4995 for { 4996 off := v.AuxInt 4997 sym := v.Aux 4998 _ = v.Args[1] 4999 ptr := v.Args[0] 5000 v_1 := v.Args[1] 5001 if v_1.Op != Op386MOVBstore { 5002 break 5003 } 5004 off2 := v_1.AuxInt 5005 sym2 := v_1.Aux 5006 _ = v_1.Args[2] 5007 ptr2 := v_1.Args[0] 5008 x := v_1.Args[1] 5009 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5010 break 5011 } 5012 v.reset(Op386MOVBLSX) 5013 v.AddArg(x) 5014 return true 5015 } 5016 // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5017 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5018 // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5019 for { 5020 off1 := v.AuxInt 5021 sym1 := v.Aux 5022 _ = v.Args[1] 5023 v_0 := v.Args[0] 5024 if v_0.Op != Op386LEAL { 5025 break 5026 } 5027 off2 := v_0.AuxInt 5028 sym2 := v_0.Aux 5029 base := v_0.Args[0] 5030 mem := v.Args[1] 5031 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5032 break 5033 } 5034 v.reset(Op386MOVBLSXload) 5035 v.AuxInt = off1 + off2 5036 v.Aux = mergeSym(sym1, sym2) 5037 v.AddArg(base) 5038 v.AddArg(mem) 5039 return true 5040 } 5041 return false 5042 } 5043 func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { 5044 b := v.Block 5045 _ = b 5046 // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) 5047 // cond: x.Uses == 1 && clobber(x) 5048 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 5049 for { 5050 x := v.Args[0] 5051 if x.Op != Op386MOVBload { 5052 break 5053 } 5054 off := x.AuxInt 5055 sym := x.Aux 5056 _ = x.Args[1] 5057 ptr := x.Args[0] 5058 mem := x.Args[1] 5059 if !(x.Uses == 1 && clobber(x)) { 5060 break 5061 } 5062 b = x.Block 5063 v0 := b.NewValue0(v.Pos, Op386MOVBload, v.Type) 5064 v.reset(OpCopy) 5065 v.AddArg(v0) 5066 v0.AuxInt = off 5067 v0.Aux = sym 5068 v0.AddArg(ptr) 5069 v0.AddArg(mem) 5070 return true 5071 } 5072 // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) 5073 // cond: x.Uses == 1 && clobber(x) 5074 // result: @x.Block (MOVBloadidx1 <v.Type> [off] {sym} ptr idx mem) 5075 for { 5076 x := v.Args[0] 5077 if x.Op != Op386MOVBloadidx1 { 5078 break 5079 } 5080 off := x.AuxInt 5081 sym := x.Aux 5082 _ = x.Args[2] 5083 ptr := x.Args[0] 5084 idx := x.Args[1] 5085 mem := x.Args[2] 5086 if !(x.Uses == 1 && clobber(x)) { 5087 break 5088 } 5089 b = x.Block 5090 v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) 5091 v.reset(OpCopy) 5092 v.AddArg(v0) 5093 v0.AuxInt = off 5094 v0.Aux = sym 5095 v0.AddArg(ptr) 5096 v0.AddArg(idx) 5097 v0.AddArg(mem) 5098 return true 5099 } 5100 // match: (MOVBLZX (ANDLconst [c] x)) 5101 // cond: 5102 // result: (ANDLconst [c & 0xff] x) 5103 for { 5104 v_0 := v.Args[0] 5105 if v_0.Op != Op386ANDLconst { 5106 break 5107 } 5108 c := v_0.AuxInt 5109 x := v_0.Args[0] 5110 v.reset(Op386ANDLconst) 5111 v.AuxInt = c & 0xff 5112 v.AddArg(x) 5113 return true 5114 } 5115 return false 5116 } 5117 func rewriteValue386_Op386MOVBload_0(v *Value) bool { 5118 b := v.Block 5119 _ = b 5120 config := b.Func.Config 5121 _ = config 5122 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5123 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5124 // result: (MOVBLZX x) 5125 for { 5126 off := v.AuxInt 5127 sym := v.Aux 5128 _ = v.Args[1] 5129 ptr := v.Args[0] 5130 v_1 := v.Args[1] 5131 if v_1.Op != Op386MOVBstore { 5132 break 5133 } 5134 off2 := v_1.AuxInt 5135 sym2 := v_1.Aux 5136 _ = v_1.Args[2] 5137 ptr2 := v_1.Args[0] 5138 x := v_1.Args[1] 5139 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5140 break 5141 } 5142 v.reset(Op386MOVBLZX) 5143 v.AddArg(x) 5144 return true 5145 } 5146 // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) 5147 // cond: is32Bit(off1+off2) 5148 // result: (MOVBload [off1+off2] {sym} ptr mem) 5149 for { 5150 off1 := v.AuxInt 5151 sym := v.Aux 5152 _ = v.Args[1] 5153 v_0 := v.Args[0] 5154 if v_0.Op != Op386ADDLconst { 5155 break 5156 } 5157 off2 := v_0.AuxInt 5158 ptr := v_0.Args[0] 5159 mem := v.Args[1] 5160 if !(is32Bit(off1 + off2)) { 5161 break 5162 } 5163 v.reset(Op386MOVBload) 5164 v.AuxInt = off1 + off2 5165 v.Aux = sym 5166 v.AddArg(ptr) 5167 v.AddArg(mem) 5168 return true 5169 } 5170 // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 5171 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5172 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 5173 for { 5174 off1 := v.AuxInt 5175 sym1 := v.Aux 5176 _ = v.Args[1] 5177 v_0 := v.Args[0] 5178 if v_0.Op != Op386LEAL { 5179 break 5180 } 5181 off2 := v_0.AuxInt 5182 sym2 := v_0.Aux 5183 base := v_0.Args[0] 5184 mem := v.Args[1] 5185 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5186 break 5187 } 5188 v.reset(Op386MOVBload) 5189 v.AuxInt = off1 + off2 5190 v.Aux = mergeSym(sym1, sym2) 5191 v.AddArg(base) 5192 v.AddArg(mem) 5193 return true 5194 } 5195 // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 5196 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5197 // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 5198 for { 5199 off1 := v.AuxInt 5200 sym1 := v.Aux 5201 _ = v.Args[1] 5202 v_0 := v.Args[0] 5203 if v_0.Op != Op386LEAL1 { 5204 break 5205 } 5206 off2 := v_0.AuxInt 5207 sym2 := v_0.Aux 5208 _ = v_0.Args[1] 5209 ptr := v_0.Args[0] 5210 idx := v_0.Args[1] 5211 mem := v.Args[1] 5212 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5213 break 5214 } 5215 v.reset(Op386MOVBloadidx1) 5216 v.AuxInt = off1 + off2 5217 v.Aux = mergeSym(sym1, sym2) 5218 v.AddArg(ptr) 5219 v.AddArg(idx) 5220 v.AddArg(mem) 5221 return true 5222 } 5223 // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) 5224 // cond: ptr.Op != OpSB 5225 // result: (MOVBloadidx1 [off] {sym} ptr idx mem) 5226 for { 5227 off := v.AuxInt 5228 sym := v.Aux 5229 _ = v.Args[1] 5230 v_0 := v.Args[0] 5231 if v_0.Op != Op386ADDL { 5232 break 5233 } 5234 _ = v_0.Args[1] 5235 ptr := v_0.Args[0] 5236 idx := v_0.Args[1] 5237 mem := v.Args[1] 5238 if !(ptr.Op != OpSB) { 5239 break 5240 } 5241 v.reset(Op386MOVBloadidx1) 5242 v.AuxInt = off 5243 v.Aux = sym 5244 v.AddArg(ptr) 5245 v.AddArg(idx) 5246 v.AddArg(mem) 5247 return true 5248 } 5249 // match: (MOVBload [off] {sym} (SB) _) 5250 // cond: symIsRO(sym) 5251 // result: (MOVLconst [int64(read8(sym, off))]) 5252 for { 5253 off := v.AuxInt 5254 sym := v.Aux 5255 _ = v.Args[1] 5256 v_0 := v.Args[0] 5257 if v_0.Op != OpSB { 5258 break 5259 } 5260 if !(symIsRO(sym)) { 5261 break 5262 } 5263 v.reset(Op386MOVLconst) 5264 v.AuxInt = int64(read8(sym, off)) 5265 return true 5266 } 5267 return false 5268 } 5269 func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { 5270 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 5271 // cond: 5272 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5273 for { 5274 c := v.AuxInt 5275 sym := v.Aux 5276 _ = v.Args[2] 5277 v_0 := v.Args[0] 5278 if v_0.Op != Op386ADDLconst { 5279 break 5280 } 5281 d := v_0.AuxInt 5282 ptr := v_0.Args[0] 5283 idx := v.Args[1] 5284 mem := v.Args[2] 5285 v.reset(Op386MOVBloadidx1) 5286 v.AuxInt = int64(int32(c + d)) 5287 v.Aux = sym 5288 v.AddArg(ptr) 5289 v.AddArg(idx) 5290 v.AddArg(mem) 5291 return true 5292 } 5293 // match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 5294 // cond: 5295 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5296 for { 5297 c := v.AuxInt 5298 sym := v.Aux 5299 _ = v.Args[2] 5300 idx := v.Args[0] 5301 v_1 := v.Args[1] 5302 if v_1.Op != Op386ADDLconst { 5303 break 5304 } 5305 d := v_1.AuxInt 5306 ptr := v_1.Args[0] 5307 mem := v.Args[2] 5308 v.reset(Op386MOVBloadidx1) 5309 v.AuxInt = int64(int32(c + d)) 5310 v.Aux = sym 5311 v.AddArg(ptr) 5312 v.AddArg(idx) 5313 v.AddArg(mem) 5314 return true 5315 } 5316 // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 5317 // cond: 5318 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5319 for { 5320 c := v.AuxInt 5321 sym := v.Aux 5322 _ = v.Args[2] 5323 ptr := v.Args[0] 5324 v_1 := v.Args[1] 5325 if v_1.Op != Op386ADDLconst { 5326 break 5327 } 5328 d := v_1.AuxInt 5329 idx := v_1.Args[0] 5330 mem := v.Args[2] 5331 v.reset(Op386MOVBloadidx1) 5332 v.AuxInt = int64(int32(c + d)) 5333 v.Aux = sym 5334 v.AddArg(ptr) 5335 v.AddArg(idx) 5336 v.AddArg(mem) 5337 return true 5338 } 5339 // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 5340 // cond: 5341 // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 5342 for { 5343 c := v.AuxInt 5344 sym := v.Aux 5345 _ = v.Args[2] 5346 v_0 := v.Args[0] 5347 if v_0.Op != Op386ADDLconst { 5348 break 5349 } 5350 d := v_0.AuxInt 5351 idx := v_0.Args[0] 5352 ptr := v.Args[1] 5353 mem := v.Args[2] 5354 v.reset(Op386MOVBloadidx1) 5355 v.AuxInt = int64(int32(c + d)) 5356 v.Aux = sym 5357 v.AddArg(ptr) 5358 v.AddArg(idx) 5359 v.AddArg(mem) 5360 return true 5361 } 5362 return false 5363 } 5364 func rewriteValue386_Op386MOVBstore_0(v *Value) bool { 5365 b := v.Block 5366 _ = b 5367 config := b.Func.Config 5368 _ = config 5369 // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) 5370 // cond: 5371 // result: (MOVBstore [off] {sym} ptr x mem) 5372 for { 5373 off := v.AuxInt 5374 sym := v.Aux 5375 _ = v.Args[2] 5376 ptr := v.Args[0] 5377 v_1 := v.Args[1] 5378 if v_1.Op != Op386MOVBLSX { 5379 break 5380 } 5381 x := v_1.Args[0] 5382 mem := v.Args[2] 5383 v.reset(Op386MOVBstore) 5384 v.AuxInt = off 5385 v.Aux = sym 5386 v.AddArg(ptr) 5387 v.AddArg(x) 5388 v.AddArg(mem) 5389 return true 5390 } 5391 // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) 5392 // cond: 5393 // result: (MOVBstore [off] {sym} ptr x mem) 5394 for { 5395 off := v.AuxInt 5396 sym := v.Aux 5397 _ = v.Args[2] 5398 ptr := v.Args[0] 5399 v_1 := v.Args[1] 5400 if v_1.Op != Op386MOVBLZX { 5401 break 5402 } 5403 x := v_1.Args[0] 5404 mem := v.Args[2] 5405 v.reset(Op386MOVBstore) 5406 v.AuxInt = off 5407 v.Aux = sym 5408 v.AddArg(ptr) 5409 v.AddArg(x) 5410 v.AddArg(mem) 5411 return true 5412 } 5413 // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 5414 // cond: is32Bit(off1+off2) 5415 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 5416 for { 5417 off1 := v.AuxInt 5418 sym := v.Aux 5419 _ = v.Args[2] 5420 v_0 := v.Args[0] 5421 if v_0.Op != Op386ADDLconst { 5422 break 5423 } 5424 off2 := v_0.AuxInt 5425 ptr := v_0.Args[0] 5426 val := v.Args[1] 5427 mem := v.Args[2] 5428 if !(is32Bit(off1 + off2)) { 5429 break 5430 } 5431 v.reset(Op386MOVBstore) 5432 v.AuxInt = off1 + off2 5433 v.Aux = sym 5434 v.AddArg(ptr) 5435 v.AddArg(val) 5436 v.AddArg(mem) 5437 return true 5438 } 5439 // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) 5440 // cond: validOff(off) 5441 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 5442 for { 5443 off := v.AuxInt 5444 sym := v.Aux 5445 _ = v.Args[2] 5446 ptr := v.Args[0] 5447 v_1 := v.Args[1] 5448 if v_1.Op != Op386MOVLconst { 5449 break 5450 } 5451 c := v_1.AuxInt 5452 mem := v.Args[2] 5453 if !(validOff(off)) { 5454 break 5455 } 5456 v.reset(Op386MOVBstoreconst) 5457 v.AuxInt = makeValAndOff(int64(int8(c)), off) 5458 v.Aux = sym 5459 v.AddArg(ptr) 5460 v.AddArg(mem) 5461 return true 5462 } 5463 // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 5464 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 5465 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 5466 for { 5467 off1 := v.AuxInt 5468 sym1 := v.Aux 5469 _ = v.Args[2] 5470 v_0 := v.Args[0] 5471 if v_0.Op != Op386LEAL { 5472 break 5473 } 5474 off2 := v_0.AuxInt 5475 sym2 := v_0.Aux 5476 base := v_0.Args[0] 5477 val := v.Args[1] 5478 mem := v.Args[2] 5479 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 5480 break 5481 } 5482 v.reset(Op386MOVBstore) 5483 v.AuxInt = off1 + off2 5484 v.Aux = mergeSym(sym1, sym2) 5485 v.AddArg(base) 5486 v.AddArg(val) 5487 v.AddArg(mem) 5488 return true 5489 } 5490 // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 5491 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 5492 // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 5493 for { 5494 off1 := v.AuxInt 5495 sym1 := v.Aux 5496 _ = v.Args[2] 5497 v_0 := v.Args[0] 5498 if v_0.Op != Op386LEAL1 { 5499 break 5500 } 5501 off2 := v_0.AuxInt 5502 sym2 := v_0.Aux 5503 _ = v_0.Args[1] 5504 ptr := v_0.Args[0] 5505 idx := v_0.Args[1] 5506 val := v.Args[1] 5507 mem := v.Args[2] 5508 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 5509 break 5510 } 5511 v.reset(Op386MOVBstoreidx1) 5512 v.AuxInt = off1 + off2 5513 v.Aux = mergeSym(sym1, sym2) 5514 v.AddArg(ptr) 5515 v.AddArg(idx) 5516 v.AddArg(val) 5517 v.AddArg(mem) 5518 return true 5519 } 5520 // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) 5521 // cond: ptr.Op != OpSB 5522 // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) 5523 for { 5524 off := v.AuxInt 5525 sym := v.Aux 5526 _ = v.Args[2] 5527 v_0 := v.Args[0] 5528 if v_0.Op != Op386ADDL { 5529 break 5530 } 5531 _ = v_0.Args[1] 5532 ptr := v_0.Args[0] 5533 idx := v_0.Args[1] 5534 val := v.Args[1] 5535 mem := v.Args[2] 5536 if !(ptr.Op != OpSB) { 5537 break 5538 } 5539 v.reset(Op386MOVBstoreidx1) 5540 v.AuxInt = off 5541 v.Aux = sym 5542 v.AddArg(ptr) 5543 v.AddArg(idx) 5544 v.AddArg(val) 5545 v.AddArg(mem) 5546 return true 5547 } 5548 // match: (MOVBstore [i] {s} p (SHRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 5549 // cond: x.Uses == 1 && clobber(x) 5550 // result: (MOVWstore [i-1] {s} p w mem) 5551 for { 5552 i := v.AuxInt 5553 s := v.Aux 5554 _ = v.Args[2] 5555 p := v.Args[0] 5556 v_1 := v.Args[1] 5557 if v_1.Op != Op386SHRWconst { 5558 break 5559 } 5560 if v_1.AuxInt != 8 { 5561 break 5562 } 5563 w := v_1.Args[0] 5564 x := v.Args[2] 5565 if x.Op != Op386MOVBstore { 5566 break 5567 } 5568 if x.AuxInt != i-1 { 5569 break 5570 } 5571 if x.Aux != s { 5572 break 5573 } 5574 _ = x.Args[2] 5575 if p != x.Args[0] { 5576 break 5577 } 5578 if w != x.Args[1] { 5579 break 5580 } 5581 mem := x.Args[2] 5582 if !(x.Uses == 1 && clobber(x)) { 5583 break 5584 } 5585 v.reset(Op386MOVWstore) 5586 v.AuxInt = i - 1 5587 v.Aux = s 5588 v.AddArg(p) 5589 v.AddArg(w) 5590 v.AddArg(mem) 5591 return true 5592 } 5593 // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 5594 // cond: x.Uses == 1 && clobber(x) 5595 // result: (MOVWstore [i-1] {s} p w mem) 5596 for { 5597 i := v.AuxInt 5598 s := v.Aux 5599 _ = v.Args[2] 5600 p := v.Args[0] 5601 v_1 := v.Args[1] 5602 if v_1.Op != Op386SHRLconst { 5603 break 5604 } 5605 if v_1.AuxInt != 8 { 5606 break 5607 } 5608 w := v_1.Args[0] 5609 x := v.Args[2] 5610 if x.Op != Op386MOVBstore { 5611 break 5612 } 5613 if x.AuxInt != i-1 { 5614 break 5615 } 5616 if x.Aux != s { 5617 break 5618 } 5619 _ = x.Args[2] 5620 if p != x.Args[0] { 5621 break 5622 } 5623 if w != x.Args[1] { 5624 break 5625 } 5626 mem := x.Args[2] 5627 if !(x.Uses == 1 && clobber(x)) { 5628 break 5629 } 5630 v.reset(Op386MOVWstore) 5631 v.AuxInt = i - 1 5632 v.Aux = s 5633 v.AddArg(p) 5634 v.AddArg(w) 5635 v.AddArg(mem) 5636 return true 5637 } 5638 // match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRWconst [8] w) mem)) 5639 // cond: x.Uses == 1 && clobber(x) 5640 // result: (MOVWstore [i] {s} p w mem) 5641 for { 5642 i := v.AuxInt 5643 s := v.Aux 5644 _ = v.Args[2] 5645 p := v.Args[0] 5646 w := v.Args[1] 5647 x := v.Args[2] 5648 if x.Op != Op386MOVBstore { 5649 break 5650 } 5651 if x.AuxInt != i+1 { 5652 break 5653 } 5654 if x.Aux != s { 5655 break 5656 } 5657 _ = x.Args[2] 5658 if p != x.Args[0] { 5659 break 5660 } 5661 x_1 := x.Args[1] 5662 if x_1.Op != Op386SHRWconst { 5663 break 5664 } 5665 if x_1.AuxInt != 8 { 5666 break 5667 } 5668 if w != x_1.Args[0] { 5669 break 5670 } 5671 mem := x.Args[2] 5672 if !(x.Uses == 1 && clobber(x)) { 5673 break 5674 } 5675 v.reset(Op386MOVWstore) 5676 v.AuxInt = i 5677 v.Aux = s 5678 v.AddArg(p) 5679 v.AddArg(w) 5680 v.AddArg(mem) 5681 return true 5682 } 5683 return false 5684 } 5685 func rewriteValue386_Op386MOVBstore_10(v *Value) bool { 5686 // match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRLconst [8] w) mem)) 5687 // cond: x.Uses == 1 && clobber(x) 5688 // result: (MOVWstore [i] {s} p w mem) 5689 for { 5690 i := v.AuxInt 5691 s := v.Aux 5692 _ = v.Args[2] 5693 p := v.Args[0] 5694 w := v.Args[1] 5695 x := v.Args[2] 5696 if x.Op != Op386MOVBstore { 5697 break 5698 } 5699 if x.AuxInt != i+1 { 5700 break 5701 } 5702 if x.Aux != s { 5703 break 5704 } 5705 _ = x.Args[2] 5706 if p != x.Args[0] { 5707 break 5708 } 5709 x_1 := x.Args[1] 5710 if x_1.Op != Op386SHRLconst { 5711 break 5712 } 5713 if x_1.AuxInt != 8 { 5714 break 5715 } 5716 if w != x_1.Args[0] { 5717 break 5718 } 5719 mem := x.Args[2] 5720 if !(x.Uses == 1 && clobber(x)) { 5721 break 5722 } 5723 v.reset(Op386MOVWstore) 5724 v.AuxInt = i 5725 v.Aux = s 5726 v.AddArg(p) 5727 v.AddArg(w) 5728 v.AddArg(mem) 5729 return true 5730 } 5731 // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) 5732 // cond: x.Uses == 1 && clobber(x) 5733 // result: (MOVWstore [i-1] {s} p w0 mem) 5734 for { 5735 i := v.AuxInt 5736 s := v.Aux 5737 _ = v.Args[2] 5738 p := v.Args[0] 5739 v_1 := v.Args[1] 5740 if v_1.Op != Op386SHRLconst { 5741 break 5742 } 5743 j := v_1.AuxInt 5744 w := v_1.Args[0] 5745 x := v.Args[2] 5746 if x.Op != Op386MOVBstore { 5747 break 5748 } 5749 if x.AuxInt != i-1 { 5750 break 5751 } 5752 if x.Aux != s { 5753 break 5754 } 5755 _ = x.Args[2] 5756 if p != x.Args[0] { 5757 break 5758 } 5759 w0 := x.Args[1] 5760 if w0.Op != Op386SHRLconst { 5761 break 5762 } 5763 if w0.AuxInt != j-8 { 5764 break 5765 } 5766 if w != w0.Args[0] { 5767 break 5768 } 5769 mem := x.Args[2] 5770 if !(x.Uses == 1 && clobber(x)) { 5771 break 5772 } 5773 v.reset(Op386MOVWstore) 5774 v.AuxInt = i - 1 5775 v.Aux = s 5776 v.AddArg(p) 5777 v.AddArg(w0) 5778 v.AddArg(mem) 5779 return true 5780 } 5781 return false 5782 } 5783 func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { 5784 b := v.Block 5785 _ = b 5786 config := b.Func.Config 5787 _ = config 5788 // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 5789 // cond: ValAndOff(sc).canAdd(off) 5790 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 5791 for { 5792 sc := v.AuxInt 5793 s := v.Aux 5794 _ = v.Args[1] 5795 v_0 := v.Args[0] 5796 if v_0.Op != Op386ADDLconst { 5797 break 5798 } 5799 off := v_0.AuxInt 5800 ptr := v_0.Args[0] 5801 mem := v.Args[1] 5802 if !(ValAndOff(sc).canAdd(off)) { 5803 break 5804 } 5805 v.reset(Op386MOVBstoreconst) 5806 v.AuxInt = ValAndOff(sc).add(off) 5807 v.Aux = s 5808 v.AddArg(ptr) 5809 v.AddArg(mem) 5810 return true 5811 } 5812 // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 5813 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 5814 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 5815 for { 5816 sc := v.AuxInt 5817 sym1 := v.Aux 5818 _ = v.Args[1] 5819 v_0 := v.Args[0] 5820 if v_0.Op != Op386LEAL { 5821 break 5822 } 5823 off := v_0.AuxInt 5824 sym2 := v_0.Aux 5825 ptr := v_0.Args[0] 5826 mem := v.Args[1] 5827 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 5828 break 5829 } 5830 v.reset(Op386MOVBstoreconst) 5831 v.AuxInt = ValAndOff(sc).add(off) 5832 v.Aux = mergeSym(sym1, sym2) 5833 v.AddArg(ptr) 5834 v.AddArg(mem) 5835 return true 5836 } 5837 // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 5838 // cond: canMergeSym(sym1, sym2) 5839 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 5840 for { 5841 x := v.AuxInt 5842 sym1 := v.Aux 5843 _ = v.Args[1] 5844 v_0 := v.Args[0] 5845 if v_0.Op != Op386LEAL1 { 5846 break 5847 } 5848 off := v_0.AuxInt 5849 sym2 := v_0.Aux 5850 _ = v_0.Args[1] 5851 ptr := v_0.Args[0] 5852 idx := v_0.Args[1] 5853 mem := v.Args[1] 5854 if !(canMergeSym(sym1, sym2)) { 5855 break 5856 } 5857 v.reset(Op386MOVBstoreconstidx1) 5858 v.AuxInt = ValAndOff(x).add(off) 5859 v.Aux = mergeSym(sym1, sym2) 5860 v.AddArg(ptr) 5861 v.AddArg(idx) 5862 v.AddArg(mem) 5863 return true 5864 } 5865 // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) 5866 // cond: 5867 // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) 5868 for { 5869 x := v.AuxInt 5870 sym := v.Aux 5871 _ = v.Args[1] 5872 v_0 := v.Args[0] 5873 if v_0.Op != Op386ADDL { 5874 break 5875 } 5876 _ = v_0.Args[1] 5877 ptr := v_0.Args[0] 5878 idx := v_0.Args[1] 5879 mem := v.Args[1] 5880 v.reset(Op386MOVBstoreconstidx1) 5881 v.AuxInt = x 5882 v.Aux = sym 5883 v.AddArg(ptr) 5884 v.AddArg(idx) 5885 v.AddArg(mem) 5886 return true 5887 } 5888 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 5889 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 5890 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 5891 for { 5892 c := v.AuxInt 5893 s := v.Aux 5894 _ = v.Args[1] 5895 p := v.Args[0] 5896 x := v.Args[1] 5897 if x.Op != Op386MOVBstoreconst { 5898 break 5899 } 5900 a := x.AuxInt 5901 if x.Aux != s { 5902 break 5903 } 5904 _ = x.Args[1] 5905 if p != x.Args[0] { 5906 break 5907 } 5908 mem := x.Args[1] 5909 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 5910 break 5911 } 5912 v.reset(Op386MOVWstoreconst) 5913 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 5914 v.Aux = s 5915 v.AddArg(p) 5916 v.AddArg(mem) 5917 return true 5918 } 5919 // match: (MOVBstoreconst [a] {s} p x:(MOVBstoreconst [c] {s} p mem)) 5920 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 5921 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) 5922 for { 5923 a := v.AuxInt 5924 s := v.Aux 5925 _ = v.Args[1] 5926 p := v.Args[0] 5927 x := v.Args[1] 5928 if x.Op != Op386MOVBstoreconst { 5929 break 5930 } 5931 c := x.AuxInt 5932 if x.Aux != s { 5933 break 5934 } 5935 _ = x.Args[1] 5936 if p != x.Args[0] { 5937 break 5938 } 5939 mem := x.Args[1] 5940 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 5941 break 5942 } 5943 v.reset(Op386MOVWstoreconst) 5944 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 5945 v.Aux = s 5946 v.AddArg(p) 5947 v.AddArg(mem) 5948 return true 5949 } 5950 return false 5951 } 5952 func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { 5953 // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 5954 // cond: 5955 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 5956 for { 5957 x := v.AuxInt 5958 sym := v.Aux 5959 _ = v.Args[2] 5960 v_0 := v.Args[0] 5961 if v_0.Op != Op386ADDLconst { 5962 break 5963 } 5964 c := v_0.AuxInt 5965 ptr := v_0.Args[0] 5966 idx := v.Args[1] 5967 mem := v.Args[2] 5968 v.reset(Op386MOVBstoreconstidx1) 5969 v.AuxInt = ValAndOff(x).add(c) 5970 v.Aux = sym 5971 v.AddArg(ptr) 5972 v.AddArg(idx) 5973 v.AddArg(mem) 5974 return true 5975 } 5976 // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 5977 // cond: 5978 // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 5979 for { 5980 x := v.AuxInt 5981 sym := v.Aux 5982 _ = v.Args[2] 5983 ptr := v.Args[0] 5984 v_1 := v.Args[1] 5985 if v_1.Op != Op386ADDLconst { 5986 break 5987 } 5988 c := v_1.AuxInt 5989 idx := v_1.Args[0] 5990 mem := v.Args[2] 5991 v.reset(Op386MOVBstoreconstidx1) 5992 v.AuxInt = ValAndOff(x).add(c) 5993 v.Aux = sym 5994 v.AddArg(ptr) 5995 v.AddArg(idx) 5996 v.AddArg(mem) 5997 return true 5998 } 5999 // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) 6000 // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 6001 // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) 6002 for { 6003 c := v.AuxInt 6004 s := v.Aux 6005 _ = v.Args[2] 6006 p := v.Args[0] 6007 i := v.Args[1] 6008 x := v.Args[2] 6009 if x.Op != Op386MOVBstoreconstidx1 { 6010 break 6011 } 6012 a := x.AuxInt 6013 if x.Aux != s { 6014 break 6015 } 6016 _ = x.Args[2] 6017 if p != x.Args[0] { 6018 break 6019 } 6020 if i != x.Args[1] { 6021 break 6022 } 6023 mem := x.Args[2] 6024 if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 6025 break 6026 } 6027 v.reset(Op386MOVWstoreconstidx1) 6028 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) 6029 v.Aux = s 6030 v.AddArg(p) 6031 v.AddArg(i) 6032 v.AddArg(mem) 6033 return true 6034 } 6035 return false 6036 } 6037 func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { 6038 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 6039 // cond: 6040 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6041 for { 6042 c := v.AuxInt 6043 sym := v.Aux 6044 _ = v.Args[3] 6045 v_0 := v.Args[0] 6046 if v_0.Op != Op386ADDLconst { 6047 break 6048 } 6049 d := v_0.AuxInt 6050 ptr := v_0.Args[0] 6051 idx := v.Args[1] 6052 val := v.Args[2] 6053 mem := v.Args[3] 6054 v.reset(Op386MOVBstoreidx1) 6055 v.AuxInt = int64(int32(c + d)) 6056 v.Aux = sym 6057 v.AddArg(ptr) 6058 v.AddArg(idx) 6059 v.AddArg(val) 6060 v.AddArg(mem) 6061 return true 6062 } 6063 // match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 6064 // cond: 6065 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6066 for { 6067 c := v.AuxInt 6068 sym := v.Aux 6069 _ = v.Args[3] 6070 idx := v.Args[0] 6071 v_1 := v.Args[1] 6072 if v_1.Op != Op386ADDLconst { 6073 break 6074 } 6075 d := v_1.AuxInt 6076 ptr := v_1.Args[0] 6077 val := v.Args[2] 6078 mem := v.Args[3] 6079 v.reset(Op386MOVBstoreidx1) 6080 v.AuxInt = int64(int32(c + d)) 6081 v.Aux = sym 6082 v.AddArg(ptr) 6083 v.AddArg(idx) 6084 v.AddArg(val) 6085 v.AddArg(mem) 6086 return true 6087 } 6088 // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 6089 // cond: 6090 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6091 for { 6092 c := v.AuxInt 6093 sym := v.Aux 6094 _ = v.Args[3] 6095 ptr := v.Args[0] 6096 v_1 := v.Args[1] 6097 if v_1.Op != Op386ADDLconst { 6098 break 6099 } 6100 d := v_1.AuxInt 6101 idx := v_1.Args[0] 6102 val := v.Args[2] 6103 mem := v.Args[3] 6104 v.reset(Op386MOVBstoreidx1) 6105 v.AuxInt = int64(int32(c + d)) 6106 v.Aux = sym 6107 v.AddArg(ptr) 6108 v.AddArg(idx) 6109 v.AddArg(val) 6110 v.AddArg(mem) 6111 return true 6112 } 6113 // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 6114 // cond: 6115 // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 6116 for { 6117 c := v.AuxInt 6118 sym := v.Aux 6119 _ = v.Args[3] 6120 v_0 := v.Args[0] 6121 if v_0.Op != Op386ADDLconst { 6122 break 6123 } 6124 d := v_0.AuxInt 6125 idx := v_0.Args[0] 6126 ptr := v.Args[1] 6127 val := v.Args[2] 6128 mem := v.Args[3] 6129 v.reset(Op386MOVBstoreidx1) 6130 v.AuxInt = int64(int32(c + d)) 6131 v.Aux = sym 6132 v.AddArg(ptr) 6133 v.AddArg(idx) 6134 v.AddArg(val) 6135 v.AddArg(mem) 6136 return true 6137 } 6138 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 6139 // cond: x.Uses == 1 && clobber(x) 6140 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6141 for { 6142 i := v.AuxInt 6143 s := v.Aux 6144 _ = v.Args[3] 6145 p := v.Args[0] 6146 idx := v.Args[1] 6147 v_2 := v.Args[2] 6148 if v_2.Op != Op386SHRLconst { 6149 break 6150 } 6151 if v_2.AuxInt != 8 { 6152 break 6153 } 6154 w := v_2.Args[0] 6155 x := v.Args[3] 6156 if x.Op != Op386MOVBstoreidx1 { 6157 break 6158 } 6159 if x.AuxInt != i-1 { 6160 break 6161 } 6162 if x.Aux != s { 6163 break 6164 } 6165 _ = x.Args[3] 6166 if p != x.Args[0] { 6167 break 6168 } 6169 if idx != x.Args[1] { 6170 break 6171 } 6172 if w != x.Args[2] { 6173 break 6174 } 6175 mem := x.Args[3] 6176 if !(x.Uses == 1 && clobber(x)) { 6177 break 6178 } 6179 v.reset(Op386MOVWstoreidx1) 6180 v.AuxInt = i - 1 6181 v.Aux = s 6182 v.AddArg(p) 6183 v.AddArg(idx) 6184 v.AddArg(w) 6185 v.AddArg(mem) 6186 return true 6187 } 6188 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 6189 // cond: x.Uses == 1 && clobber(x) 6190 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6191 for { 6192 i := v.AuxInt 6193 s := v.Aux 6194 _ = v.Args[3] 6195 p := v.Args[0] 6196 idx := v.Args[1] 6197 v_2 := v.Args[2] 6198 if v_2.Op != Op386SHRLconst { 6199 break 6200 } 6201 if v_2.AuxInt != 8 { 6202 break 6203 } 6204 w := v_2.Args[0] 6205 x := v.Args[3] 6206 if x.Op != Op386MOVBstoreidx1 { 6207 break 6208 } 6209 if x.AuxInt != i-1 { 6210 break 6211 } 6212 if x.Aux != s { 6213 break 6214 } 6215 _ = x.Args[3] 6216 if idx != x.Args[0] { 6217 break 6218 } 6219 if p != x.Args[1] { 6220 break 6221 } 6222 if w != x.Args[2] { 6223 break 6224 } 6225 mem := x.Args[3] 6226 if !(x.Uses == 1 && clobber(x)) { 6227 break 6228 } 6229 v.reset(Op386MOVWstoreidx1) 6230 v.AuxInt = i - 1 6231 v.Aux = s 6232 v.AddArg(p) 6233 v.AddArg(idx) 6234 v.AddArg(w) 6235 v.AddArg(mem) 6236 return true 6237 } 6238 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 6239 // cond: x.Uses == 1 && clobber(x) 6240 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6241 for { 6242 i := v.AuxInt 6243 s := v.Aux 6244 _ = v.Args[3] 6245 idx := v.Args[0] 6246 p := v.Args[1] 6247 v_2 := v.Args[2] 6248 if v_2.Op != Op386SHRLconst { 6249 break 6250 } 6251 if v_2.AuxInt != 8 { 6252 break 6253 } 6254 w := v_2.Args[0] 6255 x := v.Args[3] 6256 if x.Op != Op386MOVBstoreidx1 { 6257 break 6258 } 6259 if x.AuxInt != i-1 { 6260 break 6261 } 6262 if x.Aux != s { 6263 break 6264 } 6265 _ = x.Args[3] 6266 if p != x.Args[0] { 6267 break 6268 } 6269 if idx != x.Args[1] { 6270 break 6271 } 6272 if w != x.Args[2] { 6273 break 6274 } 6275 mem := x.Args[3] 6276 if !(x.Uses == 1 && clobber(x)) { 6277 break 6278 } 6279 v.reset(Op386MOVWstoreidx1) 6280 v.AuxInt = i - 1 6281 v.Aux = s 6282 v.AddArg(p) 6283 v.AddArg(idx) 6284 v.AddArg(w) 6285 v.AddArg(mem) 6286 return true 6287 } 6288 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 6289 // cond: x.Uses == 1 && clobber(x) 6290 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6291 for { 6292 i := v.AuxInt 6293 s := v.Aux 6294 _ = v.Args[3] 6295 idx := v.Args[0] 6296 p := v.Args[1] 6297 v_2 := v.Args[2] 6298 if v_2.Op != Op386SHRLconst { 6299 break 6300 } 6301 if v_2.AuxInt != 8 { 6302 break 6303 } 6304 w := v_2.Args[0] 6305 x := v.Args[3] 6306 if x.Op != Op386MOVBstoreidx1 { 6307 break 6308 } 6309 if x.AuxInt != i-1 { 6310 break 6311 } 6312 if x.Aux != s { 6313 break 6314 } 6315 _ = x.Args[3] 6316 if idx != x.Args[0] { 6317 break 6318 } 6319 if p != x.Args[1] { 6320 break 6321 } 6322 if w != x.Args[2] { 6323 break 6324 } 6325 mem := x.Args[3] 6326 if !(x.Uses == 1 && clobber(x)) { 6327 break 6328 } 6329 v.reset(Op386MOVWstoreidx1) 6330 v.AuxInt = i - 1 6331 v.Aux = s 6332 v.AddArg(p) 6333 v.AddArg(idx) 6334 v.AddArg(w) 6335 v.AddArg(mem) 6336 return true 6337 } 6338 // match: (MOVBstoreidx1 [i] {s} p idx (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 6339 // cond: x.Uses == 1 && clobber(x) 6340 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6341 for { 6342 i := v.AuxInt 6343 s := v.Aux 6344 _ = v.Args[3] 6345 p := v.Args[0] 6346 idx := v.Args[1] 6347 v_2 := v.Args[2] 6348 if v_2.Op != Op386SHRWconst { 6349 break 6350 } 6351 if v_2.AuxInt != 8 { 6352 break 6353 } 6354 w := v_2.Args[0] 6355 x := v.Args[3] 6356 if x.Op != Op386MOVBstoreidx1 { 6357 break 6358 } 6359 if x.AuxInt != i-1 { 6360 break 6361 } 6362 if x.Aux != s { 6363 break 6364 } 6365 _ = x.Args[3] 6366 if p != x.Args[0] { 6367 break 6368 } 6369 if idx != x.Args[1] { 6370 break 6371 } 6372 if w != x.Args[2] { 6373 break 6374 } 6375 mem := x.Args[3] 6376 if !(x.Uses == 1 && clobber(x)) { 6377 break 6378 } 6379 v.reset(Op386MOVWstoreidx1) 6380 v.AuxInt = i - 1 6381 v.Aux = s 6382 v.AddArg(p) 6383 v.AddArg(idx) 6384 v.AddArg(w) 6385 v.AddArg(mem) 6386 return true 6387 } 6388 // match: (MOVBstoreidx1 [i] {s} p idx (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 6389 // cond: x.Uses == 1 && clobber(x) 6390 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6391 for { 6392 i := v.AuxInt 6393 s := v.Aux 6394 _ = v.Args[3] 6395 p := v.Args[0] 6396 idx := v.Args[1] 6397 v_2 := v.Args[2] 6398 if v_2.Op != Op386SHRWconst { 6399 break 6400 } 6401 if v_2.AuxInt != 8 { 6402 break 6403 } 6404 w := v_2.Args[0] 6405 x := v.Args[3] 6406 if x.Op != Op386MOVBstoreidx1 { 6407 break 6408 } 6409 if x.AuxInt != i-1 { 6410 break 6411 } 6412 if x.Aux != s { 6413 break 6414 } 6415 _ = x.Args[3] 6416 if idx != x.Args[0] { 6417 break 6418 } 6419 if p != x.Args[1] { 6420 break 6421 } 6422 if w != x.Args[2] { 6423 break 6424 } 6425 mem := x.Args[3] 6426 if !(x.Uses == 1 && clobber(x)) { 6427 break 6428 } 6429 v.reset(Op386MOVWstoreidx1) 6430 v.AuxInt = i - 1 6431 v.Aux = s 6432 v.AddArg(p) 6433 v.AddArg(idx) 6434 v.AddArg(w) 6435 v.AddArg(mem) 6436 return true 6437 } 6438 return false 6439 } 6440 func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { 6441 // match: (MOVBstoreidx1 [i] {s} idx p (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) 6442 // cond: x.Uses == 1 && clobber(x) 6443 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6444 for { 6445 i := v.AuxInt 6446 s := v.Aux 6447 _ = v.Args[3] 6448 idx := v.Args[0] 6449 p := v.Args[1] 6450 v_2 := v.Args[2] 6451 if v_2.Op != Op386SHRWconst { 6452 break 6453 } 6454 if v_2.AuxInt != 8 { 6455 break 6456 } 6457 w := v_2.Args[0] 6458 x := v.Args[3] 6459 if x.Op != Op386MOVBstoreidx1 { 6460 break 6461 } 6462 if x.AuxInt != i-1 { 6463 break 6464 } 6465 if x.Aux != s { 6466 break 6467 } 6468 _ = x.Args[3] 6469 if p != x.Args[0] { 6470 break 6471 } 6472 if idx != x.Args[1] { 6473 break 6474 } 6475 if w != x.Args[2] { 6476 break 6477 } 6478 mem := x.Args[3] 6479 if !(x.Uses == 1 && clobber(x)) { 6480 break 6481 } 6482 v.reset(Op386MOVWstoreidx1) 6483 v.AuxInt = i - 1 6484 v.Aux = s 6485 v.AddArg(p) 6486 v.AddArg(idx) 6487 v.AddArg(w) 6488 v.AddArg(mem) 6489 return true 6490 } 6491 // match: (MOVBstoreidx1 [i] {s} idx p (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) 6492 // cond: x.Uses == 1 && clobber(x) 6493 // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) 6494 for { 6495 i := v.AuxInt 6496 s := v.Aux 6497 _ = v.Args[3] 6498 idx := v.Args[0] 6499 p := v.Args[1] 6500 v_2 := v.Args[2] 6501 if v_2.Op != Op386SHRWconst { 6502 break 6503 } 6504 if v_2.AuxInt != 8 { 6505 break 6506 } 6507 w := v_2.Args[0] 6508 x := v.Args[3] 6509 if x.Op != Op386MOVBstoreidx1 { 6510 break 6511 } 6512 if x.AuxInt != i-1 { 6513 break 6514 } 6515 if x.Aux != s { 6516 break 6517 } 6518 _ = x.Args[3] 6519 if idx != x.Args[0] { 6520 break 6521 } 6522 if p != x.Args[1] { 6523 break 6524 } 6525 if w != x.Args[2] { 6526 break 6527 } 6528 mem := x.Args[3] 6529 if !(x.Uses == 1 && clobber(x)) { 6530 break 6531 } 6532 v.reset(Op386MOVWstoreidx1) 6533 v.AuxInt = i - 1 6534 v.Aux = s 6535 v.AddArg(p) 6536 v.AddArg(idx) 6537 v.AddArg(w) 6538 v.AddArg(mem) 6539 return true 6540 } 6541 // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRLconst [8] w) mem)) 6542 // cond: x.Uses == 1 && clobber(x) 6543 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6544 for { 6545 i := v.AuxInt 6546 s := v.Aux 6547 _ = v.Args[3] 6548 p := v.Args[0] 6549 idx := v.Args[1] 6550 w := v.Args[2] 6551 x := v.Args[3] 6552 if x.Op != Op386MOVBstoreidx1 { 6553 break 6554 } 6555 if x.AuxInt != i+1 { 6556 break 6557 } 6558 if x.Aux != s { 6559 break 6560 } 6561 _ = x.Args[3] 6562 if p != x.Args[0] { 6563 break 6564 } 6565 if idx != x.Args[1] { 6566 break 6567 } 6568 x_2 := x.Args[2] 6569 if x_2.Op != Op386SHRLconst { 6570 break 6571 } 6572 if x_2.AuxInt != 8 { 6573 break 6574 } 6575 if w != x_2.Args[0] { 6576 break 6577 } 6578 mem := x.Args[3] 6579 if !(x.Uses == 1 && clobber(x)) { 6580 break 6581 } 6582 v.reset(Op386MOVWstoreidx1) 6583 v.AuxInt = i 6584 v.Aux = s 6585 v.AddArg(p) 6586 v.AddArg(idx) 6587 v.AddArg(w) 6588 v.AddArg(mem) 6589 return true 6590 } 6591 // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRLconst [8] w) mem)) 6592 // cond: x.Uses == 1 && clobber(x) 6593 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6594 for { 6595 i := v.AuxInt 6596 s := v.Aux 6597 _ = v.Args[3] 6598 p := v.Args[0] 6599 idx := v.Args[1] 6600 w := v.Args[2] 6601 x := v.Args[3] 6602 if x.Op != Op386MOVBstoreidx1 { 6603 break 6604 } 6605 if x.AuxInt != i+1 { 6606 break 6607 } 6608 if x.Aux != s { 6609 break 6610 } 6611 _ = x.Args[3] 6612 if idx != x.Args[0] { 6613 break 6614 } 6615 if p != x.Args[1] { 6616 break 6617 } 6618 x_2 := x.Args[2] 6619 if x_2.Op != Op386SHRLconst { 6620 break 6621 } 6622 if x_2.AuxInt != 8 { 6623 break 6624 } 6625 if w != x_2.Args[0] { 6626 break 6627 } 6628 mem := x.Args[3] 6629 if !(x.Uses == 1 && clobber(x)) { 6630 break 6631 } 6632 v.reset(Op386MOVWstoreidx1) 6633 v.AuxInt = i 6634 v.Aux = s 6635 v.AddArg(p) 6636 v.AddArg(idx) 6637 v.AddArg(w) 6638 v.AddArg(mem) 6639 return true 6640 } 6641 // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRLconst [8] w) mem)) 6642 // cond: x.Uses == 1 && clobber(x) 6643 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6644 for { 6645 i := v.AuxInt 6646 s := v.Aux 6647 _ = v.Args[3] 6648 idx := v.Args[0] 6649 p := v.Args[1] 6650 w := v.Args[2] 6651 x := v.Args[3] 6652 if x.Op != Op386MOVBstoreidx1 { 6653 break 6654 } 6655 if x.AuxInt != i+1 { 6656 break 6657 } 6658 if x.Aux != s { 6659 break 6660 } 6661 _ = x.Args[3] 6662 if p != x.Args[0] { 6663 break 6664 } 6665 if idx != x.Args[1] { 6666 break 6667 } 6668 x_2 := x.Args[2] 6669 if x_2.Op != Op386SHRLconst { 6670 break 6671 } 6672 if x_2.AuxInt != 8 { 6673 break 6674 } 6675 if w != x_2.Args[0] { 6676 break 6677 } 6678 mem := x.Args[3] 6679 if !(x.Uses == 1 && clobber(x)) { 6680 break 6681 } 6682 v.reset(Op386MOVWstoreidx1) 6683 v.AuxInt = i 6684 v.Aux = s 6685 v.AddArg(p) 6686 v.AddArg(idx) 6687 v.AddArg(w) 6688 v.AddArg(mem) 6689 return true 6690 } 6691 // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRLconst [8] w) mem)) 6692 // cond: x.Uses == 1 && clobber(x) 6693 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6694 for { 6695 i := v.AuxInt 6696 s := v.Aux 6697 _ = v.Args[3] 6698 idx := v.Args[0] 6699 p := v.Args[1] 6700 w := v.Args[2] 6701 x := v.Args[3] 6702 if x.Op != Op386MOVBstoreidx1 { 6703 break 6704 } 6705 if x.AuxInt != i+1 { 6706 break 6707 } 6708 if x.Aux != s { 6709 break 6710 } 6711 _ = x.Args[3] 6712 if idx != x.Args[0] { 6713 break 6714 } 6715 if p != x.Args[1] { 6716 break 6717 } 6718 x_2 := x.Args[2] 6719 if x_2.Op != Op386SHRLconst { 6720 break 6721 } 6722 if x_2.AuxInt != 8 { 6723 break 6724 } 6725 if w != x_2.Args[0] { 6726 break 6727 } 6728 mem := x.Args[3] 6729 if !(x.Uses == 1 && clobber(x)) { 6730 break 6731 } 6732 v.reset(Op386MOVWstoreidx1) 6733 v.AuxInt = i 6734 v.Aux = s 6735 v.AddArg(p) 6736 v.AddArg(idx) 6737 v.AddArg(w) 6738 v.AddArg(mem) 6739 return true 6740 } 6741 // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRWconst [8] w) mem)) 6742 // cond: x.Uses == 1 && clobber(x) 6743 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6744 for { 6745 i := v.AuxInt 6746 s := v.Aux 6747 _ = v.Args[3] 6748 p := v.Args[0] 6749 idx := v.Args[1] 6750 w := v.Args[2] 6751 x := v.Args[3] 6752 if x.Op != Op386MOVBstoreidx1 { 6753 break 6754 } 6755 if x.AuxInt != i+1 { 6756 break 6757 } 6758 if x.Aux != s { 6759 break 6760 } 6761 _ = x.Args[3] 6762 if p != x.Args[0] { 6763 break 6764 } 6765 if idx != x.Args[1] { 6766 break 6767 } 6768 x_2 := x.Args[2] 6769 if x_2.Op != Op386SHRWconst { 6770 break 6771 } 6772 if x_2.AuxInt != 8 { 6773 break 6774 } 6775 if w != x_2.Args[0] { 6776 break 6777 } 6778 mem := x.Args[3] 6779 if !(x.Uses == 1 && clobber(x)) { 6780 break 6781 } 6782 v.reset(Op386MOVWstoreidx1) 6783 v.AuxInt = i 6784 v.Aux = s 6785 v.AddArg(p) 6786 v.AddArg(idx) 6787 v.AddArg(w) 6788 v.AddArg(mem) 6789 return true 6790 } 6791 // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRWconst [8] w) mem)) 6792 // cond: x.Uses == 1 && clobber(x) 6793 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6794 for { 6795 i := v.AuxInt 6796 s := v.Aux 6797 _ = v.Args[3] 6798 p := v.Args[0] 6799 idx := v.Args[1] 6800 w := v.Args[2] 6801 x := v.Args[3] 6802 if x.Op != Op386MOVBstoreidx1 { 6803 break 6804 } 6805 if x.AuxInt != i+1 { 6806 break 6807 } 6808 if x.Aux != s { 6809 break 6810 } 6811 _ = x.Args[3] 6812 if idx != x.Args[0] { 6813 break 6814 } 6815 if p != x.Args[1] { 6816 break 6817 } 6818 x_2 := x.Args[2] 6819 if x_2.Op != Op386SHRWconst { 6820 break 6821 } 6822 if x_2.AuxInt != 8 { 6823 break 6824 } 6825 if w != x_2.Args[0] { 6826 break 6827 } 6828 mem := x.Args[3] 6829 if !(x.Uses == 1 && clobber(x)) { 6830 break 6831 } 6832 v.reset(Op386MOVWstoreidx1) 6833 v.AuxInt = i 6834 v.Aux = s 6835 v.AddArg(p) 6836 v.AddArg(idx) 6837 v.AddArg(w) 6838 v.AddArg(mem) 6839 return true 6840 } 6841 // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRWconst [8] w) mem)) 6842 // cond: x.Uses == 1 && clobber(x) 6843 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6844 for { 6845 i := v.AuxInt 6846 s := v.Aux 6847 _ = v.Args[3] 6848 idx := v.Args[0] 6849 p := v.Args[1] 6850 w := v.Args[2] 6851 x := v.Args[3] 6852 if x.Op != Op386MOVBstoreidx1 { 6853 break 6854 } 6855 if x.AuxInt != i+1 { 6856 break 6857 } 6858 if x.Aux != s { 6859 break 6860 } 6861 _ = x.Args[3] 6862 if p != x.Args[0] { 6863 break 6864 } 6865 if idx != x.Args[1] { 6866 break 6867 } 6868 x_2 := x.Args[2] 6869 if x_2.Op != Op386SHRWconst { 6870 break 6871 } 6872 if x_2.AuxInt != 8 { 6873 break 6874 } 6875 if w != x_2.Args[0] { 6876 break 6877 } 6878 mem := x.Args[3] 6879 if !(x.Uses == 1 && clobber(x)) { 6880 break 6881 } 6882 v.reset(Op386MOVWstoreidx1) 6883 v.AuxInt = i 6884 v.Aux = s 6885 v.AddArg(p) 6886 v.AddArg(idx) 6887 v.AddArg(w) 6888 v.AddArg(mem) 6889 return true 6890 } 6891 // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRWconst [8] w) mem)) 6892 // cond: x.Uses == 1 && clobber(x) 6893 // result: (MOVWstoreidx1 [i] {s} p idx w mem) 6894 for { 6895 i := v.AuxInt 6896 s := v.Aux 6897 _ = v.Args[3] 6898 idx := v.Args[0] 6899 p := v.Args[1] 6900 w := v.Args[2] 6901 x := v.Args[3] 6902 if x.Op != Op386MOVBstoreidx1 { 6903 break 6904 } 6905 if x.AuxInt != i+1 { 6906 break 6907 } 6908 if x.Aux != s { 6909 break 6910 } 6911 _ = x.Args[3] 6912 if idx != x.Args[0] { 6913 break 6914 } 6915 if p != x.Args[1] { 6916 break 6917 } 6918 x_2 := x.Args[2] 6919 if x_2.Op != Op386SHRWconst { 6920 break 6921 } 6922 if x_2.AuxInt != 8 { 6923 break 6924 } 6925 if w != x_2.Args[0] { 6926 break 6927 } 6928 mem := x.Args[3] 6929 if !(x.Uses == 1 && clobber(x)) { 6930 break 6931 } 6932 v.reset(Op386MOVWstoreidx1) 6933 v.AuxInt = i 6934 v.Aux = s 6935 v.AddArg(p) 6936 v.AddArg(idx) 6937 v.AddArg(w) 6938 v.AddArg(mem) 6939 return true 6940 } 6941 return false 6942 } 6943 func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { 6944 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 6945 // cond: x.Uses == 1 && clobber(x) 6946 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 6947 for { 6948 i := v.AuxInt 6949 s := v.Aux 6950 _ = v.Args[3] 6951 p := v.Args[0] 6952 idx := v.Args[1] 6953 v_2 := v.Args[2] 6954 if v_2.Op != Op386SHRLconst { 6955 break 6956 } 6957 j := v_2.AuxInt 6958 w := v_2.Args[0] 6959 x := v.Args[3] 6960 if x.Op != Op386MOVBstoreidx1 { 6961 break 6962 } 6963 if x.AuxInt != i-1 { 6964 break 6965 } 6966 if x.Aux != s { 6967 break 6968 } 6969 _ = x.Args[3] 6970 if p != x.Args[0] { 6971 break 6972 } 6973 if idx != x.Args[1] { 6974 break 6975 } 6976 w0 := x.Args[2] 6977 if w0.Op != Op386SHRLconst { 6978 break 6979 } 6980 if w0.AuxInt != j-8 { 6981 break 6982 } 6983 if w != w0.Args[0] { 6984 break 6985 } 6986 mem := x.Args[3] 6987 if !(x.Uses == 1 && clobber(x)) { 6988 break 6989 } 6990 v.reset(Op386MOVWstoreidx1) 6991 v.AuxInt = i - 1 6992 v.Aux = s 6993 v.AddArg(p) 6994 v.AddArg(idx) 6995 v.AddArg(w0) 6996 v.AddArg(mem) 6997 return true 6998 } 6999 // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 7000 // cond: x.Uses == 1 && clobber(x) 7001 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 7002 for { 7003 i := v.AuxInt 7004 s := v.Aux 7005 _ = v.Args[3] 7006 p := v.Args[0] 7007 idx := v.Args[1] 7008 v_2 := v.Args[2] 7009 if v_2.Op != Op386SHRLconst { 7010 break 7011 } 7012 j := v_2.AuxInt 7013 w := v_2.Args[0] 7014 x := v.Args[3] 7015 if x.Op != Op386MOVBstoreidx1 { 7016 break 7017 } 7018 if x.AuxInt != i-1 { 7019 break 7020 } 7021 if x.Aux != s { 7022 break 7023 } 7024 _ = x.Args[3] 7025 if idx != x.Args[0] { 7026 break 7027 } 7028 if p != x.Args[1] { 7029 break 7030 } 7031 w0 := x.Args[2] 7032 if w0.Op != Op386SHRLconst { 7033 break 7034 } 7035 if w0.AuxInt != j-8 { 7036 break 7037 } 7038 if w != w0.Args[0] { 7039 break 7040 } 7041 mem := x.Args[3] 7042 if !(x.Uses == 1 && clobber(x)) { 7043 break 7044 } 7045 v.reset(Op386MOVWstoreidx1) 7046 v.AuxInt = i - 1 7047 v.Aux = s 7048 v.AddArg(p) 7049 v.AddArg(idx) 7050 v.AddArg(w0) 7051 v.AddArg(mem) 7052 return true 7053 } 7054 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) 7055 // cond: x.Uses == 1 && clobber(x) 7056 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 7057 for { 7058 i := v.AuxInt 7059 s := v.Aux 7060 _ = v.Args[3] 7061 idx := v.Args[0] 7062 p := v.Args[1] 7063 v_2 := v.Args[2] 7064 if v_2.Op != Op386SHRLconst { 7065 break 7066 } 7067 j := v_2.AuxInt 7068 w := v_2.Args[0] 7069 x := v.Args[3] 7070 if x.Op != Op386MOVBstoreidx1 { 7071 break 7072 } 7073 if x.AuxInt != i-1 { 7074 break 7075 } 7076 if x.Aux != s { 7077 break 7078 } 7079 _ = x.Args[3] 7080 if p != x.Args[0] { 7081 break 7082 } 7083 if idx != x.Args[1] { 7084 break 7085 } 7086 w0 := x.Args[2] 7087 if w0.Op != Op386SHRLconst { 7088 break 7089 } 7090 if w0.AuxInt != j-8 { 7091 break 7092 } 7093 if w != w0.Args[0] { 7094 break 7095 } 7096 mem := x.Args[3] 7097 if !(x.Uses == 1 && clobber(x)) { 7098 break 7099 } 7100 v.reset(Op386MOVWstoreidx1) 7101 v.AuxInt = i - 1 7102 v.Aux = s 7103 v.AddArg(p) 7104 v.AddArg(idx) 7105 v.AddArg(w0) 7106 v.AddArg(mem) 7107 return true 7108 } 7109 // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) 7110 // cond: x.Uses == 1 && clobber(x) 7111 // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) 7112 for { 7113 i := v.AuxInt 7114 s := v.Aux 7115 _ = v.Args[3] 7116 idx := v.Args[0] 7117 p := v.Args[1] 7118 v_2 := v.Args[2] 7119 if v_2.Op != Op386SHRLconst { 7120 break 7121 } 7122 j := v_2.AuxInt 7123 w := v_2.Args[0] 7124 x := v.Args[3] 7125 if x.Op != Op386MOVBstoreidx1 { 7126 break 7127 } 7128 if x.AuxInt != i-1 { 7129 break 7130 } 7131 if x.Aux != s { 7132 break 7133 } 7134 _ = x.Args[3] 7135 if idx != x.Args[0] { 7136 break 7137 } 7138 if p != x.Args[1] { 7139 break 7140 } 7141 w0 := x.Args[2] 7142 if w0.Op != Op386SHRLconst { 7143 break 7144 } 7145 if w0.AuxInt != j-8 { 7146 break 7147 } 7148 if w != w0.Args[0] { 7149 break 7150 } 7151 mem := x.Args[3] 7152 if !(x.Uses == 1 && clobber(x)) { 7153 break 7154 } 7155 v.reset(Op386MOVWstoreidx1) 7156 v.AuxInt = i - 1 7157 v.Aux = s 7158 v.AddArg(p) 7159 v.AddArg(idx) 7160 v.AddArg(w0) 7161 v.AddArg(mem) 7162 return true 7163 } 7164 return false 7165 } 7166 func rewriteValue386_Op386MOVLload_0(v *Value) bool { 7167 b := v.Block 7168 _ = b 7169 config := b.Func.Config 7170 _ = config 7171 // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) 7172 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7173 // result: x 7174 for { 7175 off := v.AuxInt 7176 sym := v.Aux 7177 _ = v.Args[1] 7178 ptr := v.Args[0] 7179 v_1 := v.Args[1] 7180 if v_1.Op != Op386MOVLstore { 7181 break 7182 } 7183 off2 := v_1.AuxInt 7184 sym2 := v_1.Aux 7185 _ = v_1.Args[2] 7186 ptr2 := v_1.Args[0] 7187 x := v_1.Args[1] 7188 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7189 break 7190 } 7191 v.reset(OpCopy) 7192 v.Type = x.Type 7193 v.AddArg(x) 7194 return true 7195 } 7196 // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) 7197 // cond: is32Bit(off1+off2) 7198 // result: (MOVLload [off1+off2] {sym} ptr mem) 7199 for { 7200 off1 := v.AuxInt 7201 sym := v.Aux 7202 _ = v.Args[1] 7203 v_0 := v.Args[0] 7204 if v_0.Op != Op386ADDLconst { 7205 break 7206 } 7207 off2 := v_0.AuxInt 7208 ptr := v_0.Args[0] 7209 mem := v.Args[1] 7210 if !(is32Bit(off1 + off2)) { 7211 break 7212 } 7213 v.reset(Op386MOVLload) 7214 v.AuxInt = off1 + off2 7215 v.Aux = sym 7216 v.AddArg(ptr) 7217 v.AddArg(mem) 7218 return true 7219 } 7220 // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 7221 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 7222 // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) 7223 for { 7224 off1 := v.AuxInt 7225 sym1 := v.Aux 7226 _ = v.Args[1] 7227 v_0 := v.Args[0] 7228 if v_0.Op != Op386LEAL { 7229 break 7230 } 7231 off2 := v_0.AuxInt 7232 sym2 := v_0.Aux 7233 base := v_0.Args[0] 7234 mem := v.Args[1] 7235 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 7236 break 7237 } 7238 v.reset(Op386MOVLload) 7239 v.AuxInt = off1 + off2 7240 v.Aux = mergeSym(sym1, sym2) 7241 v.AddArg(base) 7242 v.AddArg(mem) 7243 return true 7244 } 7245 // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 7246 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7247 // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7248 for { 7249 off1 := v.AuxInt 7250 sym1 := v.Aux 7251 _ = v.Args[1] 7252 v_0 := v.Args[0] 7253 if v_0.Op != Op386LEAL1 { 7254 break 7255 } 7256 off2 := v_0.AuxInt 7257 sym2 := v_0.Aux 7258 _ = v_0.Args[1] 7259 ptr := v_0.Args[0] 7260 idx := v_0.Args[1] 7261 mem := v.Args[1] 7262 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7263 break 7264 } 7265 v.reset(Op386MOVLloadidx1) 7266 v.AuxInt = off1 + off2 7267 v.Aux = mergeSym(sym1, sym2) 7268 v.AddArg(ptr) 7269 v.AddArg(idx) 7270 v.AddArg(mem) 7271 return true 7272 } 7273 // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 7274 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7275 // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7276 for { 7277 off1 := v.AuxInt 7278 sym1 := v.Aux 7279 _ = v.Args[1] 7280 v_0 := v.Args[0] 7281 if v_0.Op != Op386LEAL4 { 7282 break 7283 } 7284 off2 := v_0.AuxInt 7285 sym2 := v_0.Aux 7286 _ = v_0.Args[1] 7287 ptr := v_0.Args[0] 7288 idx := v_0.Args[1] 7289 mem := v.Args[1] 7290 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7291 break 7292 } 7293 v.reset(Op386MOVLloadidx4) 7294 v.AuxInt = off1 + off2 7295 v.Aux = mergeSym(sym1, sym2) 7296 v.AddArg(ptr) 7297 v.AddArg(idx) 7298 v.AddArg(mem) 7299 return true 7300 } 7301 // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) 7302 // cond: ptr.Op != OpSB 7303 // result: (MOVLloadidx1 [off] {sym} ptr idx mem) 7304 for { 7305 off := v.AuxInt 7306 sym := v.Aux 7307 _ = v.Args[1] 7308 v_0 := v.Args[0] 7309 if v_0.Op != Op386ADDL { 7310 break 7311 } 7312 _ = v_0.Args[1] 7313 ptr := v_0.Args[0] 7314 idx := v_0.Args[1] 7315 mem := v.Args[1] 7316 if !(ptr.Op != OpSB) { 7317 break 7318 } 7319 v.reset(Op386MOVLloadidx1) 7320 v.AuxInt = off 7321 v.Aux = sym 7322 v.AddArg(ptr) 7323 v.AddArg(idx) 7324 v.AddArg(mem) 7325 return true 7326 } 7327 // match: (MOVLload [off] {sym} (SB) _) 7328 // cond: symIsRO(sym) 7329 // result: (MOVLconst [int64(int32(read32(sym, off, config.BigEndian)))]) 7330 for { 7331 off := v.AuxInt 7332 sym := v.Aux 7333 _ = v.Args[1] 7334 v_0 := v.Args[0] 7335 if v_0.Op != OpSB { 7336 break 7337 } 7338 if !(symIsRO(sym)) { 7339 break 7340 } 7341 v.reset(Op386MOVLconst) 7342 v.AuxInt = int64(int32(read32(sym, off, config.BigEndian))) 7343 return true 7344 } 7345 return false 7346 } 7347 func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { 7348 // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 7349 // cond: 7350 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 7351 for { 7352 c := v.AuxInt 7353 sym := v.Aux 7354 _ = v.Args[2] 7355 ptr := v.Args[0] 7356 v_1 := v.Args[1] 7357 if v_1.Op != Op386SHLLconst { 7358 break 7359 } 7360 if v_1.AuxInt != 2 { 7361 break 7362 } 7363 idx := v_1.Args[0] 7364 mem := v.Args[2] 7365 v.reset(Op386MOVLloadidx4) 7366 v.AuxInt = c 7367 v.Aux = sym 7368 v.AddArg(ptr) 7369 v.AddArg(idx) 7370 v.AddArg(mem) 7371 return true 7372 } 7373 // match: (MOVLloadidx1 [c] {sym} (SHLLconst [2] idx) ptr mem) 7374 // cond: 7375 // result: (MOVLloadidx4 [c] {sym} ptr idx mem) 7376 for { 7377 c := v.AuxInt 7378 sym := v.Aux 7379 _ = v.Args[2] 7380 v_0 := v.Args[0] 7381 if v_0.Op != Op386SHLLconst { 7382 break 7383 } 7384 if v_0.AuxInt != 2 { 7385 break 7386 } 7387 idx := v_0.Args[0] 7388 ptr := v.Args[1] 7389 mem := v.Args[2] 7390 v.reset(Op386MOVLloadidx4) 7391 v.AuxInt = c 7392 v.Aux = sym 7393 v.AddArg(ptr) 7394 v.AddArg(idx) 7395 v.AddArg(mem) 7396 return true 7397 } 7398 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 7399 // cond: 7400 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 7401 for { 7402 c := v.AuxInt 7403 sym := v.Aux 7404 _ = v.Args[2] 7405 v_0 := v.Args[0] 7406 if v_0.Op != Op386ADDLconst { 7407 break 7408 } 7409 d := v_0.AuxInt 7410 ptr := v_0.Args[0] 7411 idx := v.Args[1] 7412 mem := v.Args[2] 7413 v.reset(Op386MOVLloadidx1) 7414 v.AuxInt = int64(int32(c + d)) 7415 v.Aux = sym 7416 v.AddArg(ptr) 7417 v.AddArg(idx) 7418 v.AddArg(mem) 7419 return true 7420 } 7421 // match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 7422 // cond: 7423 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 7424 for { 7425 c := v.AuxInt 7426 sym := v.Aux 7427 _ = v.Args[2] 7428 idx := v.Args[0] 7429 v_1 := v.Args[1] 7430 if v_1.Op != Op386ADDLconst { 7431 break 7432 } 7433 d := v_1.AuxInt 7434 ptr := v_1.Args[0] 7435 mem := v.Args[2] 7436 v.reset(Op386MOVLloadidx1) 7437 v.AuxInt = int64(int32(c + d)) 7438 v.Aux = sym 7439 v.AddArg(ptr) 7440 v.AddArg(idx) 7441 v.AddArg(mem) 7442 return true 7443 } 7444 // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 7445 // cond: 7446 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 7447 for { 7448 c := v.AuxInt 7449 sym := v.Aux 7450 _ = v.Args[2] 7451 ptr := v.Args[0] 7452 v_1 := v.Args[1] 7453 if v_1.Op != Op386ADDLconst { 7454 break 7455 } 7456 d := v_1.AuxInt 7457 idx := v_1.Args[0] 7458 mem := v.Args[2] 7459 v.reset(Op386MOVLloadidx1) 7460 v.AuxInt = int64(int32(c + d)) 7461 v.Aux = sym 7462 v.AddArg(ptr) 7463 v.AddArg(idx) 7464 v.AddArg(mem) 7465 return true 7466 } 7467 // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 7468 // cond: 7469 // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 7470 for { 7471 c := v.AuxInt 7472 sym := v.Aux 7473 _ = v.Args[2] 7474 v_0 := v.Args[0] 7475 if v_0.Op != Op386ADDLconst { 7476 break 7477 } 7478 d := v_0.AuxInt 7479 idx := v_0.Args[0] 7480 ptr := v.Args[1] 7481 mem := v.Args[2] 7482 v.reset(Op386MOVLloadidx1) 7483 v.AuxInt = int64(int32(c + d)) 7484 v.Aux = sym 7485 v.AddArg(ptr) 7486 v.AddArg(idx) 7487 v.AddArg(mem) 7488 return true 7489 } 7490 return false 7491 } 7492 func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { 7493 // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 7494 // cond: 7495 // result: (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) 7496 for { 7497 c := v.AuxInt 7498 sym := v.Aux 7499 _ = v.Args[2] 7500 v_0 := v.Args[0] 7501 if v_0.Op != Op386ADDLconst { 7502 break 7503 } 7504 d := v_0.AuxInt 7505 ptr := v_0.Args[0] 7506 idx := v.Args[1] 7507 mem := v.Args[2] 7508 v.reset(Op386MOVLloadidx4) 7509 v.AuxInt = int64(int32(c + d)) 7510 v.Aux = sym 7511 v.AddArg(ptr) 7512 v.AddArg(idx) 7513 v.AddArg(mem) 7514 return true 7515 } 7516 // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 7517 // cond: 7518 // result: (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) 7519 for { 7520 c := v.AuxInt 7521 sym := v.Aux 7522 _ = v.Args[2] 7523 ptr := v.Args[0] 7524 v_1 := v.Args[1] 7525 if v_1.Op != Op386ADDLconst { 7526 break 7527 } 7528 d := v_1.AuxInt 7529 idx := v_1.Args[0] 7530 mem := v.Args[2] 7531 v.reset(Op386MOVLloadidx4) 7532 v.AuxInt = int64(int32(c + 4*d)) 7533 v.Aux = sym 7534 v.AddArg(ptr) 7535 v.AddArg(idx) 7536 v.AddArg(mem) 7537 return true 7538 } 7539 return false 7540 } 7541 func rewriteValue386_Op386MOVLstore_0(v *Value) bool { 7542 b := v.Block 7543 _ = b 7544 config := b.Func.Config 7545 _ = config 7546 // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 7547 // cond: is32Bit(off1+off2) 7548 // result: (MOVLstore [off1+off2] {sym} ptr val mem) 7549 for { 7550 off1 := v.AuxInt 7551 sym := v.Aux 7552 _ = v.Args[2] 7553 v_0 := v.Args[0] 7554 if v_0.Op != Op386ADDLconst { 7555 break 7556 } 7557 off2 := v_0.AuxInt 7558 ptr := v_0.Args[0] 7559 val := v.Args[1] 7560 mem := v.Args[2] 7561 if !(is32Bit(off1 + off2)) { 7562 break 7563 } 7564 v.reset(Op386MOVLstore) 7565 v.AuxInt = off1 + off2 7566 v.Aux = sym 7567 v.AddArg(ptr) 7568 v.AddArg(val) 7569 v.AddArg(mem) 7570 return true 7571 } 7572 // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) 7573 // cond: validOff(off) 7574 // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 7575 for { 7576 off := v.AuxInt 7577 sym := v.Aux 7578 _ = v.Args[2] 7579 ptr := v.Args[0] 7580 v_1 := v.Args[1] 7581 if v_1.Op != Op386MOVLconst { 7582 break 7583 } 7584 c := v_1.AuxInt 7585 mem := v.Args[2] 7586 if !(validOff(off)) { 7587 break 7588 } 7589 v.reset(Op386MOVLstoreconst) 7590 v.AuxInt = makeValAndOff(int64(int32(c)), off) 7591 v.Aux = sym 7592 v.AddArg(ptr) 7593 v.AddArg(mem) 7594 return true 7595 } 7596 // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 7597 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 7598 // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 7599 for { 7600 off1 := v.AuxInt 7601 sym1 := v.Aux 7602 _ = v.Args[2] 7603 v_0 := v.Args[0] 7604 if v_0.Op != Op386LEAL { 7605 break 7606 } 7607 off2 := v_0.AuxInt 7608 sym2 := v_0.Aux 7609 base := v_0.Args[0] 7610 val := v.Args[1] 7611 mem := v.Args[2] 7612 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 7613 break 7614 } 7615 v.reset(Op386MOVLstore) 7616 v.AuxInt = off1 + off2 7617 v.Aux = mergeSym(sym1, sym2) 7618 v.AddArg(base) 7619 v.AddArg(val) 7620 v.AddArg(mem) 7621 return true 7622 } 7623 // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 7624 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7625 // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7626 for { 7627 off1 := v.AuxInt 7628 sym1 := v.Aux 7629 _ = v.Args[2] 7630 v_0 := v.Args[0] 7631 if v_0.Op != Op386LEAL1 { 7632 break 7633 } 7634 off2 := v_0.AuxInt 7635 sym2 := v_0.Aux 7636 _ = v_0.Args[1] 7637 ptr := v_0.Args[0] 7638 idx := v_0.Args[1] 7639 val := v.Args[1] 7640 mem := v.Args[2] 7641 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7642 break 7643 } 7644 v.reset(Op386MOVLstoreidx1) 7645 v.AuxInt = off1 + off2 7646 v.Aux = mergeSym(sym1, sym2) 7647 v.AddArg(ptr) 7648 v.AddArg(idx) 7649 v.AddArg(val) 7650 v.AddArg(mem) 7651 return true 7652 } 7653 // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 7654 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7655 // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7656 for { 7657 off1 := v.AuxInt 7658 sym1 := v.Aux 7659 _ = v.Args[2] 7660 v_0 := v.Args[0] 7661 if v_0.Op != Op386LEAL4 { 7662 break 7663 } 7664 off2 := v_0.AuxInt 7665 sym2 := v_0.Aux 7666 _ = v_0.Args[1] 7667 ptr := v_0.Args[0] 7668 idx := v_0.Args[1] 7669 val := v.Args[1] 7670 mem := v.Args[2] 7671 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7672 break 7673 } 7674 v.reset(Op386MOVLstoreidx4) 7675 v.AuxInt = off1 + off2 7676 v.Aux = mergeSym(sym1, sym2) 7677 v.AddArg(ptr) 7678 v.AddArg(idx) 7679 v.AddArg(val) 7680 v.AddArg(mem) 7681 return true 7682 } 7683 // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) 7684 // cond: ptr.Op != OpSB 7685 // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) 7686 for { 7687 off := v.AuxInt 7688 sym := v.Aux 7689 _ = v.Args[2] 7690 v_0 := v.Args[0] 7691 if v_0.Op != Op386ADDL { 7692 break 7693 } 7694 _ = v_0.Args[1] 7695 ptr := v_0.Args[0] 7696 idx := v_0.Args[1] 7697 val := v.Args[1] 7698 mem := v.Args[2] 7699 if !(ptr.Op != OpSB) { 7700 break 7701 } 7702 v.reset(Op386MOVLstoreidx1) 7703 v.AuxInt = off 7704 v.Aux = sym 7705 v.AddArg(ptr) 7706 v.AddArg(idx) 7707 v.AddArg(val) 7708 v.AddArg(mem) 7709 return true 7710 } 7711 // match: (MOVLstore {sym} [off] ptr y:(ADDLload x [off] {sym} ptr mem) mem) 7712 // cond: y.Uses==1 && clobber(y) 7713 // result: (ADDLmodify [off] {sym} ptr x mem) 7714 for { 7715 off := v.AuxInt 7716 sym := v.Aux 7717 _ = v.Args[2] 7718 ptr := v.Args[0] 7719 y := v.Args[1] 7720 if y.Op != Op386ADDLload { 7721 break 7722 } 7723 if y.AuxInt != off { 7724 break 7725 } 7726 if y.Aux != sym { 7727 break 7728 } 7729 _ = y.Args[2] 7730 x := y.Args[0] 7731 if ptr != y.Args[1] { 7732 break 7733 } 7734 mem := y.Args[2] 7735 if mem != v.Args[2] { 7736 break 7737 } 7738 if !(y.Uses == 1 && clobber(y)) { 7739 break 7740 } 7741 v.reset(Op386ADDLmodify) 7742 v.AuxInt = off 7743 v.Aux = sym 7744 v.AddArg(ptr) 7745 v.AddArg(x) 7746 v.AddArg(mem) 7747 return true 7748 } 7749 // match: (MOVLstore {sym} [off] ptr y:(ANDLload x [off] {sym} ptr mem) mem) 7750 // cond: y.Uses==1 && clobber(y) 7751 // result: (ANDLmodify [off] {sym} ptr x mem) 7752 for { 7753 off := v.AuxInt 7754 sym := v.Aux 7755 _ = v.Args[2] 7756 ptr := v.Args[0] 7757 y := v.Args[1] 7758 if y.Op != Op386ANDLload { 7759 break 7760 } 7761 if y.AuxInt != off { 7762 break 7763 } 7764 if y.Aux != sym { 7765 break 7766 } 7767 _ = y.Args[2] 7768 x := y.Args[0] 7769 if ptr != y.Args[1] { 7770 break 7771 } 7772 mem := y.Args[2] 7773 if mem != v.Args[2] { 7774 break 7775 } 7776 if !(y.Uses == 1 && clobber(y)) { 7777 break 7778 } 7779 v.reset(Op386ANDLmodify) 7780 v.AuxInt = off 7781 v.Aux = sym 7782 v.AddArg(ptr) 7783 v.AddArg(x) 7784 v.AddArg(mem) 7785 return true 7786 } 7787 // match: (MOVLstore {sym} [off] ptr y:(ORLload x [off] {sym} ptr mem) mem) 7788 // cond: y.Uses==1 && clobber(y) 7789 // result: (ORLmodify [off] {sym} ptr x mem) 7790 for { 7791 off := v.AuxInt 7792 sym := v.Aux 7793 _ = v.Args[2] 7794 ptr := v.Args[0] 7795 y := v.Args[1] 7796 if y.Op != Op386ORLload { 7797 break 7798 } 7799 if y.AuxInt != off { 7800 break 7801 } 7802 if y.Aux != sym { 7803 break 7804 } 7805 _ = y.Args[2] 7806 x := y.Args[0] 7807 if ptr != y.Args[1] { 7808 break 7809 } 7810 mem := y.Args[2] 7811 if mem != v.Args[2] { 7812 break 7813 } 7814 if !(y.Uses == 1 && clobber(y)) { 7815 break 7816 } 7817 v.reset(Op386ORLmodify) 7818 v.AuxInt = off 7819 v.Aux = sym 7820 v.AddArg(ptr) 7821 v.AddArg(x) 7822 v.AddArg(mem) 7823 return true 7824 } 7825 // match: (MOVLstore {sym} [off] ptr y:(XORLload x [off] {sym} ptr mem) mem) 7826 // cond: y.Uses==1 && clobber(y) 7827 // result: (XORLmodify [off] {sym} ptr x mem) 7828 for { 7829 off := v.AuxInt 7830 sym := v.Aux 7831 _ = v.Args[2] 7832 ptr := v.Args[0] 7833 y := v.Args[1] 7834 if y.Op != Op386XORLload { 7835 break 7836 } 7837 if y.AuxInt != off { 7838 break 7839 } 7840 if y.Aux != sym { 7841 break 7842 } 7843 _ = y.Args[2] 7844 x := y.Args[0] 7845 if ptr != y.Args[1] { 7846 break 7847 } 7848 mem := y.Args[2] 7849 if mem != v.Args[2] { 7850 break 7851 } 7852 if !(y.Uses == 1 && clobber(y)) { 7853 break 7854 } 7855 v.reset(Op386XORLmodify) 7856 v.AuxInt = off 7857 v.Aux = sym 7858 v.AddArg(ptr) 7859 v.AddArg(x) 7860 v.AddArg(mem) 7861 return true 7862 } 7863 return false 7864 } 7865 func rewriteValue386_Op386MOVLstore_10(v *Value) bool { 7866 // match: (MOVLstore {sym} [off] ptr y:(ADDL l:(MOVLload [off] {sym} ptr mem) x) mem) 7867 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 7868 // result: (ADDLmodify [off] {sym} ptr x mem) 7869 for { 7870 off := v.AuxInt 7871 sym := v.Aux 7872 _ = v.Args[2] 7873 ptr := v.Args[0] 7874 y := v.Args[1] 7875 if y.Op != Op386ADDL { 7876 break 7877 } 7878 _ = y.Args[1] 7879 l := y.Args[0] 7880 if l.Op != Op386MOVLload { 7881 break 7882 } 7883 if l.AuxInt != off { 7884 break 7885 } 7886 if l.Aux != sym { 7887 break 7888 } 7889 _ = l.Args[1] 7890 if ptr != l.Args[0] { 7891 break 7892 } 7893 mem := l.Args[1] 7894 x := y.Args[1] 7895 if mem != v.Args[2] { 7896 break 7897 } 7898 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 7899 break 7900 } 7901 v.reset(Op386ADDLmodify) 7902 v.AuxInt = off 7903 v.Aux = sym 7904 v.AddArg(ptr) 7905 v.AddArg(x) 7906 v.AddArg(mem) 7907 return true 7908 } 7909 // match: (MOVLstore {sym} [off] ptr y:(ADDL x l:(MOVLload [off] {sym} ptr mem)) mem) 7910 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 7911 // result: (ADDLmodify [off] {sym} ptr x mem) 7912 for { 7913 off := v.AuxInt 7914 sym := v.Aux 7915 _ = v.Args[2] 7916 ptr := v.Args[0] 7917 y := v.Args[1] 7918 if y.Op != Op386ADDL { 7919 break 7920 } 7921 _ = y.Args[1] 7922 x := y.Args[0] 7923 l := y.Args[1] 7924 if l.Op != Op386MOVLload { 7925 break 7926 } 7927 if l.AuxInt != off { 7928 break 7929 } 7930 if l.Aux != sym { 7931 break 7932 } 7933 _ = l.Args[1] 7934 if ptr != l.Args[0] { 7935 break 7936 } 7937 mem := l.Args[1] 7938 if mem != v.Args[2] { 7939 break 7940 } 7941 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 7942 break 7943 } 7944 v.reset(Op386ADDLmodify) 7945 v.AuxInt = off 7946 v.Aux = sym 7947 v.AddArg(ptr) 7948 v.AddArg(x) 7949 v.AddArg(mem) 7950 return true 7951 } 7952 // match: (MOVLstore {sym} [off] ptr y:(SUBL l:(MOVLload [off] {sym} ptr mem) x) mem) 7953 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 7954 // result: (SUBLmodify [off] {sym} ptr x mem) 7955 for { 7956 off := v.AuxInt 7957 sym := v.Aux 7958 _ = v.Args[2] 7959 ptr := v.Args[0] 7960 y := v.Args[1] 7961 if y.Op != Op386SUBL { 7962 break 7963 } 7964 _ = y.Args[1] 7965 l := y.Args[0] 7966 if l.Op != Op386MOVLload { 7967 break 7968 } 7969 if l.AuxInt != off { 7970 break 7971 } 7972 if l.Aux != sym { 7973 break 7974 } 7975 _ = l.Args[1] 7976 if ptr != l.Args[0] { 7977 break 7978 } 7979 mem := l.Args[1] 7980 x := y.Args[1] 7981 if mem != v.Args[2] { 7982 break 7983 } 7984 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 7985 break 7986 } 7987 v.reset(Op386SUBLmodify) 7988 v.AuxInt = off 7989 v.Aux = sym 7990 v.AddArg(ptr) 7991 v.AddArg(x) 7992 v.AddArg(mem) 7993 return true 7994 } 7995 // match: (MOVLstore {sym} [off] ptr y:(ANDL l:(MOVLload [off] {sym} ptr mem) x) mem) 7996 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 7997 // result: (ANDLmodify [off] {sym} ptr x mem) 7998 for { 7999 off := v.AuxInt 8000 sym := v.Aux 8001 _ = v.Args[2] 8002 ptr := v.Args[0] 8003 y := v.Args[1] 8004 if y.Op != Op386ANDL { 8005 break 8006 } 8007 _ = y.Args[1] 8008 l := y.Args[0] 8009 if l.Op != Op386MOVLload { 8010 break 8011 } 8012 if l.AuxInt != off { 8013 break 8014 } 8015 if l.Aux != sym { 8016 break 8017 } 8018 _ = l.Args[1] 8019 if ptr != l.Args[0] { 8020 break 8021 } 8022 mem := l.Args[1] 8023 x := y.Args[1] 8024 if mem != v.Args[2] { 8025 break 8026 } 8027 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 8028 break 8029 } 8030 v.reset(Op386ANDLmodify) 8031 v.AuxInt = off 8032 v.Aux = sym 8033 v.AddArg(ptr) 8034 v.AddArg(x) 8035 v.AddArg(mem) 8036 return true 8037 } 8038 // match: (MOVLstore {sym} [off] ptr y:(ANDL x l:(MOVLload [off] {sym} ptr mem)) mem) 8039 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 8040 // result: (ANDLmodify [off] {sym} ptr x mem) 8041 for { 8042 off := v.AuxInt 8043 sym := v.Aux 8044 _ = v.Args[2] 8045 ptr := v.Args[0] 8046 y := v.Args[1] 8047 if y.Op != Op386ANDL { 8048 break 8049 } 8050 _ = y.Args[1] 8051 x := y.Args[0] 8052 l := y.Args[1] 8053 if l.Op != Op386MOVLload { 8054 break 8055 } 8056 if l.AuxInt != off { 8057 break 8058 } 8059 if l.Aux != sym { 8060 break 8061 } 8062 _ = l.Args[1] 8063 if ptr != l.Args[0] { 8064 break 8065 } 8066 mem := l.Args[1] 8067 if mem != v.Args[2] { 8068 break 8069 } 8070 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 8071 break 8072 } 8073 v.reset(Op386ANDLmodify) 8074 v.AuxInt = off 8075 v.Aux = sym 8076 v.AddArg(ptr) 8077 v.AddArg(x) 8078 v.AddArg(mem) 8079 return true 8080 } 8081 // match: (MOVLstore {sym} [off] ptr y:(ORL l:(MOVLload [off] {sym} ptr mem) x) mem) 8082 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 8083 // result: (ORLmodify [off] {sym} ptr x mem) 8084 for { 8085 off := v.AuxInt 8086 sym := v.Aux 8087 _ = v.Args[2] 8088 ptr := v.Args[0] 8089 y := v.Args[1] 8090 if y.Op != Op386ORL { 8091 break 8092 } 8093 _ = y.Args[1] 8094 l := y.Args[0] 8095 if l.Op != Op386MOVLload { 8096 break 8097 } 8098 if l.AuxInt != off { 8099 break 8100 } 8101 if l.Aux != sym { 8102 break 8103 } 8104 _ = l.Args[1] 8105 if ptr != l.Args[0] { 8106 break 8107 } 8108 mem := l.Args[1] 8109 x := y.Args[1] 8110 if mem != v.Args[2] { 8111 break 8112 } 8113 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 8114 break 8115 } 8116 v.reset(Op386ORLmodify) 8117 v.AuxInt = off 8118 v.Aux = sym 8119 v.AddArg(ptr) 8120 v.AddArg(x) 8121 v.AddArg(mem) 8122 return true 8123 } 8124 // match: (MOVLstore {sym} [off] ptr y:(ORL x l:(MOVLload [off] {sym} ptr mem)) mem) 8125 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 8126 // result: (ORLmodify [off] {sym} ptr x mem) 8127 for { 8128 off := v.AuxInt 8129 sym := v.Aux 8130 _ = v.Args[2] 8131 ptr := v.Args[0] 8132 y := v.Args[1] 8133 if y.Op != Op386ORL { 8134 break 8135 } 8136 _ = y.Args[1] 8137 x := y.Args[0] 8138 l := y.Args[1] 8139 if l.Op != Op386MOVLload { 8140 break 8141 } 8142 if l.AuxInt != off { 8143 break 8144 } 8145 if l.Aux != sym { 8146 break 8147 } 8148 _ = l.Args[1] 8149 if ptr != l.Args[0] { 8150 break 8151 } 8152 mem := l.Args[1] 8153 if mem != v.Args[2] { 8154 break 8155 } 8156 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 8157 break 8158 } 8159 v.reset(Op386ORLmodify) 8160 v.AuxInt = off 8161 v.Aux = sym 8162 v.AddArg(ptr) 8163 v.AddArg(x) 8164 v.AddArg(mem) 8165 return true 8166 } 8167 // match: (MOVLstore {sym} [off] ptr y:(XORL l:(MOVLload [off] {sym} ptr mem) x) mem) 8168 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 8169 // result: (XORLmodify [off] {sym} ptr x mem) 8170 for { 8171 off := v.AuxInt 8172 sym := v.Aux 8173 _ = v.Args[2] 8174 ptr := v.Args[0] 8175 y := v.Args[1] 8176 if y.Op != Op386XORL { 8177 break 8178 } 8179 _ = y.Args[1] 8180 l := y.Args[0] 8181 if l.Op != Op386MOVLload { 8182 break 8183 } 8184 if l.AuxInt != off { 8185 break 8186 } 8187 if l.Aux != sym { 8188 break 8189 } 8190 _ = l.Args[1] 8191 if ptr != l.Args[0] { 8192 break 8193 } 8194 mem := l.Args[1] 8195 x := y.Args[1] 8196 if mem != v.Args[2] { 8197 break 8198 } 8199 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 8200 break 8201 } 8202 v.reset(Op386XORLmodify) 8203 v.AuxInt = off 8204 v.Aux = sym 8205 v.AddArg(ptr) 8206 v.AddArg(x) 8207 v.AddArg(mem) 8208 return true 8209 } 8210 // match: (MOVLstore {sym} [off] ptr y:(XORL x l:(MOVLload [off] {sym} ptr mem)) mem) 8211 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 8212 // result: (XORLmodify [off] {sym} ptr x mem) 8213 for { 8214 off := v.AuxInt 8215 sym := v.Aux 8216 _ = v.Args[2] 8217 ptr := v.Args[0] 8218 y := v.Args[1] 8219 if y.Op != Op386XORL { 8220 break 8221 } 8222 _ = y.Args[1] 8223 x := y.Args[0] 8224 l := y.Args[1] 8225 if l.Op != Op386MOVLload { 8226 break 8227 } 8228 if l.AuxInt != off { 8229 break 8230 } 8231 if l.Aux != sym { 8232 break 8233 } 8234 _ = l.Args[1] 8235 if ptr != l.Args[0] { 8236 break 8237 } 8238 mem := l.Args[1] 8239 if mem != v.Args[2] { 8240 break 8241 } 8242 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 8243 break 8244 } 8245 v.reset(Op386XORLmodify) 8246 v.AuxInt = off 8247 v.Aux = sym 8248 v.AddArg(ptr) 8249 v.AddArg(x) 8250 v.AddArg(mem) 8251 return true 8252 } 8253 // match: (MOVLstore {sym} [off] ptr y:(ADDLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) 8254 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 8255 // result: (ADDLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) 8256 for { 8257 off := v.AuxInt 8258 sym := v.Aux 8259 _ = v.Args[2] 8260 ptr := v.Args[0] 8261 y := v.Args[1] 8262 if y.Op != Op386ADDLconst { 8263 break 8264 } 8265 c := y.AuxInt 8266 l := y.Args[0] 8267 if l.Op != Op386MOVLload { 8268 break 8269 } 8270 if l.AuxInt != off { 8271 break 8272 } 8273 if l.Aux != sym { 8274 break 8275 } 8276 _ = l.Args[1] 8277 if ptr != l.Args[0] { 8278 break 8279 } 8280 mem := l.Args[1] 8281 if mem != v.Args[2] { 8282 break 8283 } 8284 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 8285 break 8286 } 8287 v.reset(Op386ADDLconstmodify) 8288 v.AuxInt = makeValAndOff(c, off) 8289 v.Aux = sym 8290 v.AddArg(ptr) 8291 v.AddArg(mem) 8292 return true 8293 } 8294 return false 8295 } 8296 func rewriteValue386_Op386MOVLstore_20(v *Value) bool { 8297 // match: (MOVLstore {sym} [off] ptr y:(ANDLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) 8298 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 8299 // result: (ANDLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) 8300 for { 8301 off := v.AuxInt 8302 sym := v.Aux 8303 _ = v.Args[2] 8304 ptr := v.Args[0] 8305 y := v.Args[1] 8306 if y.Op != Op386ANDLconst { 8307 break 8308 } 8309 c := y.AuxInt 8310 l := y.Args[0] 8311 if l.Op != Op386MOVLload { 8312 break 8313 } 8314 if l.AuxInt != off { 8315 break 8316 } 8317 if l.Aux != sym { 8318 break 8319 } 8320 _ = l.Args[1] 8321 if ptr != l.Args[0] { 8322 break 8323 } 8324 mem := l.Args[1] 8325 if mem != v.Args[2] { 8326 break 8327 } 8328 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 8329 break 8330 } 8331 v.reset(Op386ANDLconstmodify) 8332 v.AuxInt = makeValAndOff(c, off) 8333 v.Aux = sym 8334 v.AddArg(ptr) 8335 v.AddArg(mem) 8336 return true 8337 } 8338 // match: (MOVLstore {sym} [off] ptr y:(ORLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) 8339 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 8340 // result: (ORLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) 8341 for { 8342 off := v.AuxInt 8343 sym := v.Aux 8344 _ = v.Args[2] 8345 ptr := v.Args[0] 8346 y := v.Args[1] 8347 if y.Op != Op386ORLconst { 8348 break 8349 } 8350 c := y.AuxInt 8351 l := y.Args[0] 8352 if l.Op != Op386MOVLload { 8353 break 8354 } 8355 if l.AuxInt != off { 8356 break 8357 } 8358 if l.Aux != sym { 8359 break 8360 } 8361 _ = l.Args[1] 8362 if ptr != l.Args[0] { 8363 break 8364 } 8365 mem := l.Args[1] 8366 if mem != v.Args[2] { 8367 break 8368 } 8369 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 8370 break 8371 } 8372 v.reset(Op386ORLconstmodify) 8373 v.AuxInt = makeValAndOff(c, off) 8374 v.Aux = sym 8375 v.AddArg(ptr) 8376 v.AddArg(mem) 8377 return true 8378 } 8379 // match: (MOVLstore {sym} [off] ptr y:(XORLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) 8380 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 8381 // result: (XORLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) 8382 for { 8383 off := v.AuxInt 8384 sym := v.Aux 8385 _ = v.Args[2] 8386 ptr := v.Args[0] 8387 y := v.Args[1] 8388 if y.Op != Op386XORLconst { 8389 break 8390 } 8391 c := y.AuxInt 8392 l := y.Args[0] 8393 if l.Op != Op386MOVLload { 8394 break 8395 } 8396 if l.AuxInt != off { 8397 break 8398 } 8399 if l.Aux != sym { 8400 break 8401 } 8402 _ = l.Args[1] 8403 if ptr != l.Args[0] { 8404 break 8405 } 8406 mem := l.Args[1] 8407 if mem != v.Args[2] { 8408 break 8409 } 8410 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 8411 break 8412 } 8413 v.reset(Op386XORLconstmodify) 8414 v.AuxInt = makeValAndOff(c, off) 8415 v.Aux = sym 8416 v.AddArg(ptr) 8417 v.AddArg(mem) 8418 return true 8419 } 8420 return false 8421 } 8422 func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { 8423 b := v.Block 8424 _ = b 8425 config := b.Func.Config 8426 _ = config 8427 // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 8428 // cond: ValAndOff(sc).canAdd(off) 8429 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 8430 for { 8431 sc := v.AuxInt 8432 s := v.Aux 8433 _ = v.Args[1] 8434 v_0 := v.Args[0] 8435 if v_0.Op != Op386ADDLconst { 8436 break 8437 } 8438 off := v_0.AuxInt 8439 ptr := v_0.Args[0] 8440 mem := v.Args[1] 8441 if !(ValAndOff(sc).canAdd(off)) { 8442 break 8443 } 8444 v.reset(Op386MOVLstoreconst) 8445 v.AuxInt = ValAndOff(sc).add(off) 8446 v.Aux = s 8447 v.AddArg(ptr) 8448 v.AddArg(mem) 8449 return true 8450 } 8451 // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 8452 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 8453 // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 8454 for { 8455 sc := v.AuxInt 8456 sym1 := v.Aux 8457 _ = v.Args[1] 8458 v_0 := v.Args[0] 8459 if v_0.Op != Op386LEAL { 8460 break 8461 } 8462 off := v_0.AuxInt 8463 sym2 := v_0.Aux 8464 ptr := v_0.Args[0] 8465 mem := v.Args[1] 8466 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 8467 break 8468 } 8469 v.reset(Op386MOVLstoreconst) 8470 v.AuxInt = ValAndOff(sc).add(off) 8471 v.Aux = mergeSym(sym1, sym2) 8472 v.AddArg(ptr) 8473 v.AddArg(mem) 8474 return true 8475 } 8476 // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 8477 // cond: canMergeSym(sym1, sym2) 8478 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 8479 for { 8480 x := v.AuxInt 8481 sym1 := v.Aux 8482 _ = v.Args[1] 8483 v_0 := v.Args[0] 8484 if v_0.Op != Op386LEAL1 { 8485 break 8486 } 8487 off := v_0.AuxInt 8488 sym2 := v_0.Aux 8489 _ = v_0.Args[1] 8490 ptr := v_0.Args[0] 8491 idx := v_0.Args[1] 8492 mem := v.Args[1] 8493 if !(canMergeSym(sym1, sym2)) { 8494 break 8495 } 8496 v.reset(Op386MOVLstoreconstidx1) 8497 v.AuxInt = ValAndOff(x).add(off) 8498 v.Aux = mergeSym(sym1, sym2) 8499 v.AddArg(ptr) 8500 v.AddArg(idx) 8501 v.AddArg(mem) 8502 return true 8503 } 8504 // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) 8505 // cond: canMergeSym(sym1, sym2) 8506 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 8507 for { 8508 x := v.AuxInt 8509 sym1 := v.Aux 8510 _ = v.Args[1] 8511 v_0 := v.Args[0] 8512 if v_0.Op != Op386LEAL4 { 8513 break 8514 } 8515 off := v_0.AuxInt 8516 sym2 := v_0.Aux 8517 _ = v_0.Args[1] 8518 ptr := v_0.Args[0] 8519 idx := v_0.Args[1] 8520 mem := v.Args[1] 8521 if !(canMergeSym(sym1, sym2)) { 8522 break 8523 } 8524 v.reset(Op386MOVLstoreconstidx4) 8525 v.AuxInt = ValAndOff(x).add(off) 8526 v.Aux = mergeSym(sym1, sym2) 8527 v.AddArg(ptr) 8528 v.AddArg(idx) 8529 v.AddArg(mem) 8530 return true 8531 } 8532 // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) 8533 // cond: 8534 // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) 8535 for { 8536 x := v.AuxInt 8537 sym := v.Aux 8538 _ = v.Args[1] 8539 v_0 := v.Args[0] 8540 if v_0.Op != Op386ADDL { 8541 break 8542 } 8543 _ = v_0.Args[1] 8544 ptr := v_0.Args[0] 8545 idx := v_0.Args[1] 8546 mem := v.Args[1] 8547 v.reset(Op386MOVLstoreconstidx1) 8548 v.AuxInt = x 8549 v.Aux = sym 8550 v.AddArg(ptr) 8551 v.AddArg(idx) 8552 v.AddArg(mem) 8553 return true 8554 } 8555 return false 8556 } 8557 func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { 8558 // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) 8559 // cond: 8560 // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) 8561 for { 8562 c := v.AuxInt 8563 sym := v.Aux 8564 _ = v.Args[2] 8565 ptr := v.Args[0] 8566 v_1 := v.Args[1] 8567 if v_1.Op != Op386SHLLconst { 8568 break 8569 } 8570 if v_1.AuxInt != 2 { 8571 break 8572 } 8573 idx := v_1.Args[0] 8574 mem := v.Args[2] 8575 v.reset(Op386MOVLstoreconstidx4) 8576 v.AuxInt = c 8577 v.Aux = sym 8578 v.AddArg(ptr) 8579 v.AddArg(idx) 8580 v.AddArg(mem) 8581 return true 8582 } 8583 // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 8584 // cond: 8585 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 8586 for { 8587 x := v.AuxInt 8588 sym := v.Aux 8589 _ = v.Args[2] 8590 v_0 := v.Args[0] 8591 if v_0.Op != Op386ADDLconst { 8592 break 8593 } 8594 c := v_0.AuxInt 8595 ptr := v_0.Args[0] 8596 idx := v.Args[1] 8597 mem := v.Args[2] 8598 v.reset(Op386MOVLstoreconstidx1) 8599 v.AuxInt = ValAndOff(x).add(c) 8600 v.Aux = sym 8601 v.AddArg(ptr) 8602 v.AddArg(idx) 8603 v.AddArg(mem) 8604 return true 8605 } 8606 // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 8607 // cond: 8608 // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 8609 for { 8610 x := v.AuxInt 8611 sym := v.Aux 8612 _ = v.Args[2] 8613 ptr := v.Args[0] 8614 v_1 := v.Args[1] 8615 if v_1.Op != Op386ADDLconst { 8616 break 8617 } 8618 c := v_1.AuxInt 8619 idx := v_1.Args[0] 8620 mem := v.Args[2] 8621 v.reset(Op386MOVLstoreconstidx1) 8622 v.AuxInt = ValAndOff(x).add(c) 8623 v.Aux = sym 8624 v.AddArg(ptr) 8625 v.AddArg(idx) 8626 v.AddArg(mem) 8627 return true 8628 } 8629 return false 8630 } 8631 func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { 8632 // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) 8633 // cond: 8634 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) 8635 for { 8636 x := v.AuxInt 8637 sym := v.Aux 8638 _ = v.Args[2] 8639 v_0 := v.Args[0] 8640 if v_0.Op != Op386ADDLconst { 8641 break 8642 } 8643 c := v_0.AuxInt 8644 ptr := v_0.Args[0] 8645 idx := v.Args[1] 8646 mem := v.Args[2] 8647 v.reset(Op386MOVLstoreconstidx4) 8648 v.AuxInt = ValAndOff(x).add(c) 8649 v.Aux = sym 8650 v.AddArg(ptr) 8651 v.AddArg(idx) 8652 v.AddArg(mem) 8653 return true 8654 } 8655 // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) 8656 // cond: 8657 // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) 8658 for { 8659 x := v.AuxInt 8660 sym := v.Aux 8661 _ = v.Args[2] 8662 ptr := v.Args[0] 8663 v_1 := v.Args[1] 8664 if v_1.Op != Op386ADDLconst { 8665 break 8666 } 8667 c := v_1.AuxInt 8668 idx := v_1.Args[0] 8669 mem := v.Args[2] 8670 v.reset(Op386MOVLstoreconstidx4) 8671 v.AuxInt = ValAndOff(x).add(4 * c) 8672 v.Aux = sym 8673 v.AddArg(ptr) 8674 v.AddArg(idx) 8675 v.AddArg(mem) 8676 return true 8677 } 8678 return false 8679 } 8680 func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { 8681 // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) 8682 // cond: 8683 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 8684 for { 8685 c := v.AuxInt 8686 sym := v.Aux 8687 _ = v.Args[3] 8688 ptr := v.Args[0] 8689 v_1 := v.Args[1] 8690 if v_1.Op != Op386SHLLconst { 8691 break 8692 } 8693 if v_1.AuxInt != 2 { 8694 break 8695 } 8696 idx := v_1.Args[0] 8697 val := v.Args[2] 8698 mem := v.Args[3] 8699 v.reset(Op386MOVLstoreidx4) 8700 v.AuxInt = c 8701 v.Aux = sym 8702 v.AddArg(ptr) 8703 v.AddArg(idx) 8704 v.AddArg(val) 8705 v.AddArg(mem) 8706 return true 8707 } 8708 // match: (MOVLstoreidx1 [c] {sym} (SHLLconst [2] idx) ptr val mem) 8709 // cond: 8710 // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) 8711 for { 8712 c := v.AuxInt 8713 sym := v.Aux 8714 _ = v.Args[3] 8715 v_0 := v.Args[0] 8716 if v_0.Op != Op386SHLLconst { 8717 break 8718 } 8719 if v_0.AuxInt != 2 { 8720 break 8721 } 8722 idx := v_0.Args[0] 8723 ptr := v.Args[1] 8724 val := v.Args[2] 8725 mem := v.Args[3] 8726 v.reset(Op386MOVLstoreidx4) 8727 v.AuxInt = c 8728 v.Aux = sym 8729 v.AddArg(ptr) 8730 v.AddArg(idx) 8731 v.AddArg(val) 8732 v.AddArg(mem) 8733 return true 8734 } 8735 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 8736 // cond: 8737 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 8738 for { 8739 c := v.AuxInt 8740 sym := v.Aux 8741 _ = v.Args[3] 8742 v_0 := v.Args[0] 8743 if v_0.Op != Op386ADDLconst { 8744 break 8745 } 8746 d := v_0.AuxInt 8747 ptr := v_0.Args[0] 8748 idx := v.Args[1] 8749 val := v.Args[2] 8750 mem := v.Args[3] 8751 v.reset(Op386MOVLstoreidx1) 8752 v.AuxInt = int64(int32(c + d)) 8753 v.Aux = sym 8754 v.AddArg(ptr) 8755 v.AddArg(idx) 8756 v.AddArg(val) 8757 v.AddArg(mem) 8758 return true 8759 } 8760 // match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 8761 // cond: 8762 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 8763 for { 8764 c := v.AuxInt 8765 sym := v.Aux 8766 _ = v.Args[3] 8767 idx := v.Args[0] 8768 v_1 := v.Args[1] 8769 if v_1.Op != Op386ADDLconst { 8770 break 8771 } 8772 d := v_1.AuxInt 8773 ptr := v_1.Args[0] 8774 val := v.Args[2] 8775 mem := v.Args[3] 8776 v.reset(Op386MOVLstoreidx1) 8777 v.AuxInt = int64(int32(c + d)) 8778 v.Aux = sym 8779 v.AddArg(ptr) 8780 v.AddArg(idx) 8781 v.AddArg(val) 8782 v.AddArg(mem) 8783 return true 8784 } 8785 // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 8786 // cond: 8787 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 8788 for { 8789 c := v.AuxInt 8790 sym := v.Aux 8791 _ = v.Args[3] 8792 ptr := v.Args[0] 8793 v_1 := v.Args[1] 8794 if v_1.Op != Op386ADDLconst { 8795 break 8796 } 8797 d := v_1.AuxInt 8798 idx := v_1.Args[0] 8799 val := v.Args[2] 8800 mem := v.Args[3] 8801 v.reset(Op386MOVLstoreidx1) 8802 v.AuxInt = int64(int32(c + d)) 8803 v.Aux = sym 8804 v.AddArg(ptr) 8805 v.AddArg(idx) 8806 v.AddArg(val) 8807 v.AddArg(mem) 8808 return true 8809 } 8810 // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 8811 // cond: 8812 // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 8813 for { 8814 c := v.AuxInt 8815 sym := v.Aux 8816 _ = v.Args[3] 8817 v_0 := v.Args[0] 8818 if v_0.Op != Op386ADDLconst { 8819 break 8820 } 8821 d := v_0.AuxInt 8822 idx := v_0.Args[0] 8823 ptr := v.Args[1] 8824 val := v.Args[2] 8825 mem := v.Args[3] 8826 v.reset(Op386MOVLstoreidx1) 8827 v.AuxInt = int64(int32(c + d)) 8828 v.Aux = sym 8829 v.AddArg(ptr) 8830 v.AddArg(idx) 8831 v.AddArg(val) 8832 v.AddArg(mem) 8833 return true 8834 } 8835 return false 8836 } 8837 func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { 8838 // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 8839 // cond: 8840 // result: (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) 8841 for { 8842 c := v.AuxInt 8843 sym := v.Aux 8844 _ = v.Args[3] 8845 v_0 := v.Args[0] 8846 if v_0.Op != Op386ADDLconst { 8847 break 8848 } 8849 d := v_0.AuxInt 8850 ptr := v_0.Args[0] 8851 idx := v.Args[1] 8852 val := v.Args[2] 8853 mem := v.Args[3] 8854 v.reset(Op386MOVLstoreidx4) 8855 v.AuxInt = int64(int32(c + d)) 8856 v.Aux = sym 8857 v.AddArg(ptr) 8858 v.AddArg(idx) 8859 v.AddArg(val) 8860 v.AddArg(mem) 8861 return true 8862 } 8863 // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 8864 // cond: 8865 // result: (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) 8866 for { 8867 c := v.AuxInt 8868 sym := v.Aux 8869 _ = v.Args[3] 8870 ptr := v.Args[0] 8871 v_1 := v.Args[1] 8872 if v_1.Op != Op386ADDLconst { 8873 break 8874 } 8875 d := v_1.AuxInt 8876 idx := v_1.Args[0] 8877 val := v.Args[2] 8878 mem := v.Args[3] 8879 v.reset(Op386MOVLstoreidx4) 8880 v.AuxInt = int64(int32(c + 4*d)) 8881 v.Aux = sym 8882 v.AddArg(ptr) 8883 v.AddArg(idx) 8884 v.AddArg(val) 8885 v.AddArg(mem) 8886 return true 8887 } 8888 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDLloadidx4 x [off] {sym} ptr idx mem) mem) 8889 // cond: y.Uses==1 && clobber(y) 8890 // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) 8891 for { 8892 off := v.AuxInt 8893 sym := v.Aux 8894 _ = v.Args[3] 8895 ptr := v.Args[0] 8896 idx := v.Args[1] 8897 y := v.Args[2] 8898 if y.Op != Op386ADDLloadidx4 { 8899 break 8900 } 8901 if y.AuxInt != off { 8902 break 8903 } 8904 if y.Aux != sym { 8905 break 8906 } 8907 _ = y.Args[3] 8908 x := y.Args[0] 8909 if ptr != y.Args[1] { 8910 break 8911 } 8912 if idx != y.Args[2] { 8913 break 8914 } 8915 mem := y.Args[3] 8916 if mem != v.Args[3] { 8917 break 8918 } 8919 if !(y.Uses == 1 && clobber(y)) { 8920 break 8921 } 8922 v.reset(Op386ADDLmodifyidx4) 8923 v.AuxInt = off 8924 v.Aux = sym 8925 v.AddArg(ptr) 8926 v.AddArg(idx) 8927 v.AddArg(x) 8928 v.AddArg(mem) 8929 return true 8930 } 8931 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDLloadidx4 x [off] {sym} ptr idx mem) mem) 8932 // cond: y.Uses==1 && clobber(y) 8933 // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) 8934 for { 8935 off := v.AuxInt 8936 sym := v.Aux 8937 _ = v.Args[3] 8938 ptr := v.Args[0] 8939 idx := v.Args[1] 8940 y := v.Args[2] 8941 if y.Op != Op386ANDLloadidx4 { 8942 break 8943 } 8944 if y.AuxInt != off { 8945 break 8946 } 8947 if y.Aux != sym { 8948 break 8949 } 8950 _ = y.Args[3] 8951 x := y.Args[0] 8952 if ptr != y.Args[1] { 8953 break 8954 } 8955 if idx != y.Args[2] { 8956 break 8957 } 8958 mem := y.Args[3] 8959 if mem != v.Args[3] { 8960 break 8961 } 8962 if !(y.Uses == 1 && clobber(y)) { 8963 break 8964 } 8965 v.reset(Op386ANDLmodifyidx4) 8966 v.AuxInt = off 8967 v.Aux = sym 8968 v.AddArg(ptr) 8969 v.AddArg(idx) 8970 v.AddArg(x) 8971 v.AddArg(mem) 8972 return true 8973 } 8974 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORLloadidx4 x [off] {sym} ptr idx mem) mem) 8975 // cond: y.Uses==1 && clobber(y) 8976 // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) 8977 for { 8978 off := v.AuxInt 8979 sym := v.Aux 8980 _ = v.Args[3] 8981 ptr := v.Args[0] 8982 idx := v.Args[1] 8983 y := v.Args[2] 8984 if y.Op != Op386ORLloadidx4 { 8985 break 8986 } 8987 if y.AuxInt != off { 8988 break 8989 } 8990 if y.Aux != sym { 8991 break 8992 } 8993 _ = y.Args[3] 8994 x := y.Args[0] 8995 if ptr != y.Args[1] { 8996 break 8997 } 8998 if idx != y.Args[2] { 8999 break 9000 } 9001 mem := y.Args[3] 9002 if mem != v.Args[3] { 9003 break 9004 } 9005 if !(y.Uses == 1 && clobber(y)) { 9006 break 9007 } 9008 v.reset(Op386ORLmodifyidx4) 9009 v.AuxInt = off 9010 v.Aux = sym 9011 v.AddArg(ptr) 9012 v.AddArg(idx) 9013 v.AddArg(x) 9014 v.AddArg(mem) 9015 return true 9016 } 9017 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORLloadidx4 x [off] {sym} ptr idx mem) mem) 9018 // cond: y.Uses==1 && clobber(y) 9019 // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) 9020 for { 9021 off := v.AuxInt 9022 sym := v.Aux 9023 _ = v.Args[3] 9024 ptr := v.Args[0] 9025 idx := v.Args[1] 9026 y := v.Args[2] 9027 if y.Op != Op386XORLloadidx4 { 9028 break 9029 } 9030 if y.AuxInt != off { 9031 break 9032 } 9033 if y.Aux != sym { 9034 break 9035 } 9036 _ = y.Args[3] 9037 x := y.Args[0] 9038 if ptr != y.Args[1] { 9039 break 9040 } 9041 if idx != y.Args[2] { 9042 break 9043 } 9044 mem := y.Args[3] 9045 if mem != v.Args[3] { 9046 break 9047 } 9048 if !(y.Uses == 1 && clobber(y)) { 9049 break 9050 } 9051 v.reset(Op386XORLmodifyidx4) 9052 v.AuxInt = off 9053 v.Aux = sym 9054 v.AddArg(ptr) 9055 v.AddArg(idx) 9056 v.AddArg(x) 9057 v.AddArg(mem) 9058 return true 9059 } 9060 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) 9061 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9062 // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) 9063 for { 9064 off := v.AuxInt 9065 sym := v.Aux 9066 _ = v.Args[3] 9067 ptr := v.Args[0] 9068 idx := v.Args[1] 9069 y := v.Args[2] 9070 if y.Op != Op386ADDL { 9071 break 9072 } 9073 _ = y.Args[1] 9074 l := y.Args[0] 9075 if l.Op != Op386MOVLloadidx4 { 9076 break 9077 } 9078 if l.AuxInt != off { 9079 break 9080 } 9081 if l.Aux != sym { 9082 break 9083 } 9084 _ = l.Args[2] 9085 if ptr != l.Args[0] { 9086 break 9087 } 9088 if idx != l.Args[1] { 9089 break 9090 } 9091 mem := l.Args[2] 9092 x := y.Args[1] 9093 if mem != v.Args[3] { 9094 break 9095 } 9096 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9097 break 9098 } 9099 v.reset(Op386ADDLmodifyidx4) 9100 v.AuxInt = off 9101 v.Aux = sym 9102 v.AddArg(ptr) 9103 v.AddArg(idx) 9104 v.AddArg(x) 9105 v.AddArg(mem) 9106 return true 9107 } 9108 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9109 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9110 // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) 9111 for { 9112 off := v.AuxInt 9113 sym := v.Aux 9114 _ = v.Args[3] 9115 ptr := v.Args[0] 9116 idx := v.Args[1] 9117 y := v.Args[2] 9118 if y.Op != Op386ADDL { 9119 break 9120 } 9121 _ = y.Args[1] 9122 x := y.Args[0] 9123 l := y.Args[1] 9124 if l.Op != Op386MOVLloadidx4 { 9125 break 9126 } 9127 if l.AuxInt != off { 9128 break 9129 } 9130 if l.Aux != sym { 9131 break 9132 } 9133 _ = l.Args[2] 9134 if ptr != l.Args[0] { 9135 break 9136 } 9137 if idx != l.Args[1] { 9138 break 9139 } 9140 mem := l.Args[2] 9141 if mem != v.Args[3] { 9142 break 9143 } 9144 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9145 break 9146 } 9147 v.reset(Op386ADDLmodifyidx4) 9148 v.AuxInt = off 9149 v.Aux = sym 9150 v.AddArg(ptr) 9151 v.AddArg(idx) 9152 v.AddArg(x) 9153 v.AddArg(mem) 9154 return true 9155 } 9156 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(SUBL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) 9157 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9158 // result: (SUBLmodifyidx4 [off] {sym} ptr idx x mem) 9159 for { 9160 off := v.AuxInt 9161 sym := v.Aux 9162 _ = v.Args[3] 9163 ptr := v.Args[0] 9164 idx := v.Args[1] 9165 y := v.Args[2] 9166 if y.Op != Op386SUBL { 9167 break 9168 } 9169 _ = y.Args[1] 9170 l := y.Args[0] 9171 if l.Op != Op386MOVLloadidx4 { 9172 break 9173 } 9174 if l.AuxInt != off { 9175 break 9176 } 9177 if l.Aux != sym { 9178 break 9179 } 9180 _ = l.Args[2] 9181 if ptr != l.Args[0] { 9182 break 9183 } 9184 if idx != l.Args[1] { 9185 break 9186 } 9187 mem := l.Args[2] 9188 x := y.Args[1] 9189 if mem != v.Args[3] { 9190 break 9191 } 9192 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9193 break 9194 } 9195 v.reset(Op386SUBLmodifyidx4) 9196 v.AuxInt = off 9197 v.Aux = sym 9198 v.AddArg(ptr) 9199 v.AddArg(idx) 9200 v.AddArg(x) 9201 v.AddArg(mem) 9202 return true 9203 } 9204 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) 9205 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9206 // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) 9207 for { 9208 off := v.AuxInt 9209 sym := v.Aux 9210 _ = v.Args[3] 9211 ptr := v.Args[0] 9212 idx := v.Args[1] 9213 y := v.Args[2] 9214 if y.Op != Op386ANDL { 9215 break 9216 } 9217 _ = y.Args[1] 9218 l := y.Args[0] 9219 if l.Op != Op386MOVLloadidx4 { 9220 break 9221 } 9222 if l.AuxInt != off { 9223 break 9224 } 9225 if l.Aux != sym { 9226 break 9227 } 9228 _ = l.Args[2] 9229 if ptr != l.Args[0] { 9230 break 9231 } 9232 if idx != l.Args[1] { 9233 break 9234 } 9235 mem := l.Args[2] 9236 x := y.Args[1] 9237 if mem != v.Args[3] { 9238 break 9239 } 9240 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9241 break 9242 } 9243 v.reset(Op386ANDLmodifyidx4) 9244 v.AuxInt = off 9245 v.Aux = sym 9246 v.AddArg(ptr) 9247 v.AddArg(idx) 9248 v.AddArg(x) 9249 v.AddArg(mem) 9250 return true 9251 } 9252 return false 9253 } 9254 func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { 9255 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9256 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9257 // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) 9258 for { 9259 off := v.AuxInt 9260 sym := v.Aux 9261 _ = v.Args[3] 9262 ptr := v.Args[0] 9263 idx := v.Args[1] 9264 y := v.Args[2] 9265 if y.Op != Op386ANDL { 9266 break 9267 } 9268 _ = y.Args[1] 9269 x := y.Args[0] 9270 l := y.Args[1] 9271 if l.Op != Op386MOVLloadidx4 { 9272 break 9273 } 9274 if l.AuxInt != off { 9275 break 9276 } 9277 if l.Aux != sym { 9278 break 9279 } 9280 _ = l.Args[2] 9281 if ptr != l.Args[0] { 9282 break 9283 } 9284 if idx != l.Args[1] { 9285 break 9286 } 9287 mem := l.Args[2] 9288 if mem != v.Args[3] { 9289 break 9290 } 9291 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9292 break 9293 } 9294 v.reset(Op386ANDLmodifyidx4) 9295 v.AuxInt = off 9296 v.Aux = sym 9297 v.AddArg(ptr) 9298 v.AddArg(idx) 9299 v.AddArg(x) 9300 v.AddArg(mem) 9301 return true 9302 } 9303 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) 9304 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9305 // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) 9306 for { 9307 off := v.AuxInt 9308 sym := v.Aux 9309 _ = v.Args[3] 9310 ptr := v.Args[0] 9311 idx := v.Args[1] 9312 y := v.Args[2] 9313 if y.Op != Op386ORL { 9314 break 9315 } 9316 _ = y.Args[1] 9317 l := y.Args[0] 9318 if l.Op != Op386MOVLloadidx4 { 9319 break 9320 } 9321 if l.AuxInt != off { 9322 break 9323 } 9324 if l.Aux != sym { 9325 break 9326 } 9327 _ = l.Args[2] 9328 if ptr != l.Args[0] { 9329 break 9330 } 9331 if idx != l.Args[1] { 9332 break 9333 } 9334 mem := l.Args[2] 9335 x := y.Args[1] 9336 if mem != v.Args[3] { 9337 break 9338 } 9339 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9340 break 9341 } 9342 v.reset(Op386ORLmodifyidx4) 9343 v.AuxInt = off 9344 v.Aux = sym 9345 v.AddArg(ptr) 9346 v.AddArg(idx) 9347 v.AddArg(x) 9348 v.AddArg(mem) 9349 return true 9350 } 9351 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9352 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9353 // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) 9354 for { 9355 off := v.AuxInt 9356 sym := v.Aux 9357 _ = v.Args[3] 9358 ptr := v.Args[0] 9359 idx := v.Args[1] 9360 y := v.Args[2] 9361 if y.Op != Op386ORL { 9362 break 9363 } 9364 _ = y.Args[1] 9365 x := y.Args[0] 9366 l := y.Args[1] 9367 if l.Op != Op386MOVLloadidx4 { 9368 break 9369 } 9370 if l.AuxInt != off { 9371 break 9372 } 9373 if l.Aux != sym { 9374 break 9375 } 9376 _ = l.Args[2] 9377 if ptr != l.Args[0] { 9378 break 9379 } 9380 if idx != l.Args[1] { 9381 break 9382 } 9383 mem := l.Args[2] 9384 if mem != v.Args[3] { 9385 break 9386 } 9387 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9388 break 9389 } 9390 v.reset(Op386ORLmodifyidx4) 9391 v.AuxInt = off 9392 v.Aux = sym 9393 v.AddArg(ptr) 9394 v.AddArg(idx) 9395 v.AddArg(x) 9396 v.AddArg(mem) 9397 return true 9398 } 9399 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) 9400 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9401 // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) 9402 for { 9403 off := v.AuxInt 9404 sym := v.Aux 9405 _ = v.Args[3] 9406 ptr := v.Args[0] 9407 idx := v.Args[1] 9408 y := v.Args[2] 9409 if y.Op != Op386XORL { 9410 break 9411 } 9412 _ = y.Args[1] 9413 l := y.Args[0] 9414 if l.Op != Op386MOVLloadidx4 { 9415 break 9416 } 9417 if l.AuxInt != off { 9418 break 9419 } 9420 if l.Aux != sym { 9421 break 9422 } 9423 _ = l.Args[2] 9424 if ptr != l.Args[0] { 9425 break 9426 } 9427 if idx != l.Args[1] { 9428 break 9429 } 9430 mem := l.Args[2] 9431 x := y.Args[1] 9432 if mem != v.Args[3] { 9433 break 9434 } 9435 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9436 break 9437 } 9438 v.reset(Op386XORLmodifyidx4) 9439 v.AuxInt = off 9440 v.Aux = sym 9441 v.AddArg(ptr) 9442 v.AddArg(idx) 9443 v.AddArg(x) 9444 v.AddArg(mem) 9445 return true 9446 } 9447 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9448 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) 9449 // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) 9450 for { 9451 off := v.AuxInt 9452 sym := v.Aux 9453 _ = v.Args[3] 9454 ptr := v.Args[0] 9455 idx := v.Args[1] 9456 y := v.Args[2] 9457 if y.Op != Op386XORL { 9458 break 9459 } 9460 _ = y.Args[1] 9461 x := y.Args[0] 9462 l := y.Args[1] 9463 if l.Op != Op386MOVLloadidx4 { 9464 break 9465 } 9466 if l.AuxInt != off { 9467 break 9468 } 9469 if l.Aux != sym { 9470 break 9471 } 9472 _ = l.Args[2] 9473 if ptr != l.Args[0] { 9474 break 9475 } 9476 if idx != l.Args[1] { 9477 break 9478 } 9479 mem := l.Args[2] 9480 if mem != v.Args[3] { 9481 break 9482 } 9483 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { 9484 break 9485 } 9486 v.reset(Op386XORLmodifyidx4) 9487 v.AuxInt = off 9488 v.Aux = sym 9489 v.AddArg(ptr) 9490 v.AddArg(idx) 9491 v.AddArg(x) 9492 v.AddArg(mem) 9493 return true 9494 } 9495 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9496 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 9497 // result: (ADDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 9498 for { 9499 off := v.AuxInt 9500 sym := v.Aux 9501 _ = v.Args[3] 9502 ptr := v.Args[0] 9503 idx := v.Args[1] 9504 y := v.Args[2] 9505 if y.Op != Op386ADDLconst { 9506 break 9507 } 9508 c := y.AuxInt 9509 l := y.Args[0] 9510 if l.Op != Op386MOVLloadidx4 { 9511 break 9512 } 9513 if l.AuxInt != off { 9514 break 9515 } 9516 if l.Aux != sym { 9517 break 9518 } 9519 _ = l.Args[2] 9520 if ptr != l.Args[0] { 9521 break 9522 } 9523 if idx != l.Args[1] { 9524 break 9525 } 9526 mem := l.Args[2] 9527 if mem != v.Args[3] { 9528 break 9529 } 9530 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 9531 break 9532 } 9533 v.reset(Op386ADDLconstmodifyidx4) 9534 v.AuxInt = makeValAndOff(c, off) 9535 v.Aux = sym 9536 v.AddArg(ptr) 9537 v.AddArg(idx) 9538 v.AddArg(mem) 9539 return true 9540 } 9541 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9542 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 9543 // result: (ANDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 9544 for { 9545 off := v.AuxInt 9546 sym := v.Aux 9547 _ = v.Args[3] 9548 ptr := v.Args[0] 9549 idx := v.Args[1] 9550 y := v.Args[2] 9551 if y.Op != Op386ANDLconst { 9552 break 9553 } 9554 c := y.AuxInt 9555 l := y.Args[0] 9556 if l.Op != Op386MOVLloadidx4 { 9557 break 9558 } 9559 if l.AuxInt != off { 9560 break 9561 } 9562 if l.Aux != sym { 9563 break 9564 } 9565 _ = l.Args[2] 9566 if ptr != l.Args[0] { 9567 break 9568 } 9569 if idx != l.Args[1] { 9570 break 9571 } 9572 mem := l.Args[2] 9573 if mem != v.Args[3] { 9574 break 9575 } 9576 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 9577 break 9578 } 9579 v.reset(Op386ANDLconstmodifyidx4) 9580 v.AuxInt = makeValAndOff(c, off) 9581 v.Aux = sym 9582 v.AddArg(ptr) 9583 v.AddArg(idx) 9584 v.AddArg(mem) 9585 return true 9586 } 9587 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9588 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 9589 // result: (ORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 9590 for { 9591 off := v.AuxInt 9592 sym := v.Aux 9593 _ = v.Args[3] 9594 ptr := v.Args[0] 9595 idx := v.Args[1] 9596 y := v.Args[2] 9597 if y.Op != Op386ORLconst { 9598 break 9599 } 9600 c := y.AuxInt 9601 l := y.Args[0] 9602 if l.Op != Op386MOVLloadidx4 { 9603 break 9604 } 9605 if l.AuxInt != off { 9606 break 9607 } 9608 if l.Aux != sym { 9609 break 9610 } 9611 _ = l.Args[2] 9612 if ptr != l.Args[0] { 9613 break 9614 } 9615 if idx != l.Args[1] { 9616 break 9617 } 9618 mem := l.Args[2] 9619 if mem != v.Args[3] { 9620 break 9621 } 9622 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 9623 break 9624 } 9625 v.reset(Op386ORLconstmodifyidx4) 9626 v.AuxInt = makeValAndOff(c, off) 9627 v.Aux = sym 9628 v.AddArg(ptr) 9629 v.AddArg(idx) 9630 v.AddArg(mem) 9631 return true 9632 } 9633 // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) 9634 // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) 9635 // result: (XORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 9636 for { 9637 off := v.AuxInt 9638 sym := v.Aux 9639 _ = v.Args[3] 9640 ptr := v.Args[0] 9641 idx := v.Args[1] 9642 y := v.Args[2] 9643 if y.Op != Op386XORLconst { 9644 break 9645 } 9646 c := y.AuxInt 9647 l := y.Args[0] 9648 if l.Op != Op386MOVLloadidx4 { 9649 break 9650 } 9651 if l.AuxInt != off { 9652 break 9653 } 9654 if l.Aux != sym { 9655 break 9656 } 9657 _ = l.Args[2] 9658 if ptr != l.Args[0] { 9659 break 9660 } 9661 if idx != l.Args[1] { 9662 break 9663 } 9664 mem := l.Args[2] 9665 if mem != v.Args[3] { 9666 break 9667 } 9668 if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { 9669 break 9670 } 9671 v.reset(Op386XORLconstmodifyidx4) 9672 v.AuxInt = makeValAndOff(c, off) 9673 v.Aux = sym 9674 v.AddArg(ptr) 9675 v.AddArg(idx) 9676 v.AddArg(mem) 9677 return true 9678 } 9679 return false 9680 } 9681 func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { 9682 b := v.Block 9683 _ = b 9684 config := b.Func.Config 9685 _ = config 9686 typ := &b.Func.Config.Types 9687 _ = typ 9688 // match: (MOVSDconst [c]) 9689 // cond: config.ctxt.Flag_shared 9690 // result: (MOVSDconst2 (MOVSDconst1 [c])) 9691 for { 9692 c := v.AuxInt 9693 if !(config.ctxt.Flag_shared) { 9694 break 9695 } 9696 v.reset(Op386MOVSDconst2) 9697 v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, typ.UInt32) 9698 v0.AuxInt = c 9699 v.AddArg(v0) 9700 return true 9701 } 9702 return false 9703 } 9704 func rewriteValue386_Op386MOVSDload_0(v *Value) bool { 9705 b := v.Block 9706 _ = b 9707 config := b.Func.Config 9708 _ = config 9709 // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) 9710 // cond: is32Bit(off1+off2) 9711 // result: (MOVSDload [off1+off2] {sym} ptr mem) 9712 for { 9713 off1 := v.AuxInt 9714 sym := v.Aux 9715 _ = v.Args[1] 9716 v_0 := v.Args[0] 9717 if v_0.Op != Op386ADDLconst { 9718 break 9719 } 9720 off2 := v_0.AuxInt 9721 ptr := v_0.Args[0] 9722 mem := v.Args[1] 9723 if !(is32Bit(off1 + off2)) { 9724 break 9725 } 9726 v.reset(Op386MOVSDload) 9727 v.AuxInt = off1 + off2 9728 v.Aux = sym 9729 v.AddArg(ptr) 9730 v.AddArg(mem) 9731 return true 9732 } 9733 // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 9734 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 9735 // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 9736 for { 9737 off1 := v.AuxInt 9738 sym1 := v.Aux 9739 _ = v.Args[1] 9740 v_0 := v.Args[0] 9741 if v_0.Op != Op386LEAL { 9742 break 9743 } 9744 off2 := v_0.AuxInt 9745 sym2 := v_0.Aux 9746 base := v_0.Args[0] 9747 mem := v.Args[1] 9748 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 9749 break 9750 } 9751 v.reset(Op386MOVSDload) 9752 v.AuxInt = off1 + off2 9753 v.Aux = mergeSym(sym1, sym2) 9754 v.AddArg(base) 9755 v.AddArg(mem) 9756 return true 9757 } 9758 // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 9759 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9760 // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 9761 for { 9762 off1 := v.AuxInt 9763 sym1 := v.Aux 9764 _ = v.Args[1] 9765 v_0 := v.Args[0] 9766 if v_0.Op != Op386LEAL1 { 9767 break 9768 } 9769 off2 := v_0.AuxInt 9770 sym2 := v_0.Aux 9771 _ = v_0.Args[1] 9772 ptr := v_0.Args[0] 9773 idx := v_0.Args[1] 9774 mem := v.Args[1] 9775 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9776 break 9777 } 9778 v.reset(Op386MOVSDloadidx1) 9779 v.AuxInt = off1 + off2 9780 v.Aux = mergeSym(sym1, sym2) 9781 v.AddArg(ptr) 9782 v.AddArg(idx) 9783 v.AddArg(mem) 9784 return true 9785 } 9786 // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) 9787 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9788 // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 9789 for { 9790 off1 := v.AuxInt 9791 sym1 := v.Aux 9792 _ = v.Args[1] 9793 v_0 := v.Args[0] 9794 if v_0.Op != Op386LEAL8 { 9795 break 9796 } 9797 off2 := v_0.AuxInt 9798 sym2 := v_0.Aux 9799 _ = v_0.Args[1] 9800 ptr := v_0.Args[0] 9801 idx := v_0.Args[1] 9802 mem := v.Args[1] 9803 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9804 break 9805 } 9806 v.reset(Op386MOVSDloadidx8) 9807 v.AuxInt = off1 + off2 9808 v.Aux = mergeSym(sym1, sym2) 9809 v.AddArg(ptr) 9810 v.AddArg(idx) 9811 v.AddArg(mem) 9812 return true 9813 } 9814 // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) 9815 // cond: ptr.Op != OpSB 9816 // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) 9817 for { 9818 off := v.AuxInt 9819 sym := v.Aux 9820 _ = v.Args[1] 9821 v_0 := v.Args[0] 9822 if v_0.Op != Op386ADDL { 9823 break 9824 } 9825 _ = v_0.Args[1] 9826 ptr := v_0.Args[0] 9827 idx := v_0.Args[1] 9828 mem := v.Args[1] 9829 if !(ptr.Op != OpSB) { 9830 break 9831 } 9832 v.reset(Op386MOVSDloadidx1) 9833 v.AuxInt = off 9834 v.Aux = sym 9835 v.AddArg(ptr) 9836 v.AddArg(idx) 9837 v.AddArg(mem) 9838 return true 9839 } 9840 return false 9841 } 9842 func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { 9843 // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 9844 // cond: 9845 // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 9846 for { 9847 c := v.AuxInt 9848 sym := v.Aux 9849 _ = v.Args[2] 9850 v_0 := v.Args[0] 9851 if v_0.Op != Op386ADDLconst { 9852 break 9853 } 9854 d := v_0.AuxInt 9855 ptr := v_0.Args[0] 9856 idx := v.Args[1] 9857 mem := v.Args[2] 9858 v.reset(Op386MOVSDloadidx1) 9859 v.AuxInt = int64(int32(c + d)) 9860 v.Aux = sym 9861 v.AddArg(ptr) 9862 v.AddArg(idx) 9863 v.AddArg(mem) 9864 return true 9865 } 9866 // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 9867 // cond: 9868 // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 9869 for { 9870 c := v.AuxInt 9871 sym := v.Aux 9872 _ = v.Args[2] 9873 ptr := v.Args[0] 9874 v_1 := v.Args[1] 9875 if v_1.Op != Op386ADDLconst { 9876 break 9877 } 9878 d := v_1.AuxInt 9879 idx := v_1.Args[0] 9880 mem := v.Args[2] 9881 v.reset(Op386MOVSDloadidx1) 9882 v.AuxInt = int64(int32(c + d)) 9883 v.Aux = sym 9884 v.AddArg(ptr) 9885 v.AddArg(idx) 9886 v.AddArg(mem) 9887 return true 9888 } 9889 return false 9890 } 9891 func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { 9892 // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) 9893 // cond: 9894 // result: (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem) 9895 for { 9896 c := v.AuxInt 9897 sym := v.Aux 9898 _ = v.Args[2] 9899 v_0 := v.Args[0] 9900 if v_0.Op != Op386ADDLconst { 9901 break 9902 } 9903 d := v_0.AuxInt 9904 ptr := v_0.Args[0] 9905 idx := v.Args[1] 9906 mem := v.Args[2] 9907 v.reset(Op386MOVSDloadidx8) 9908 v.AuxInt = int64(int32(c + d)) 9909 v.Aux = sym 9910 v.AddArg(ptr) 9911 v.AddArg(idx) 9912 v.AddArg(mem) 9913 return true 9914 } 9915 // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) 9916 // cond: 9917 // result: (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem) 9918 for { 9919 c := v.AuxInt 9920 sym := v.Aux 9921 _ = v.Args[2] 9922 ptr := v.Args[0] 9923 v_1 := v.Args[1] 9924 if v_1.Op != Op386ADDLconst { 9925 break 9926 } 9927 d := v_1.AuxInt 9928 idx := v_1.Args[0] 9929 mem := v.Args[2] 9930 v.reset(Op386MOVSDloadidx8) 9931 v.AuxInt = int64(int32(c + 8*d)) 9932 v.Aux = sym 9933 v.AddArg(ptr) 9934 v.AddArg(idx) 9935 v.AddArg(mem) 9936 return true 9937 } 9938 return false 9939 } 9940 func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { 9941 b := v.Block 9942 _ = b 9943 config := b.Func.Config 9944 _ = config 9945 // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 9946 // cond: is32Bit(off1+off2) 9947 // result: (MOVSDstore [off1+off2] {sym} ptr val mem) 9948 for { 9949 off1 := v.AuxInt 9950 sym := v.Aux 9951 _ = v.Args[2] 9952 v_0 := v.Args[0] 9953 if v_0.Op != Op386ADDLconst { 9954 break 9955 } 9956 off2 := v_0.AuxInt 9957 ptr := v_0.Args[0] 9958 val := v.Args[1] 9959 mem := v.Args[2] 9960 if !(is32Bit(off1 + off2)) { 9961 break 9962 } 9963 v.reset(Op386MOVSDstore) 9964 v.AuxInt = off1 + off2 9965 v.Aux = sym 9966 v.AddArg(ptr) 9967 v.AddArg(val) 9968 v.AddArg(mem) 9969 return true 9970 } 9971 // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 9972 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 9973 // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9974 for { 9975 off1 := v.AuxInt 9976 sym1 := v.Aux 9977 _ = v.Args[2] 9978 v_0 := v.Args[0] 9979 if v_0.Op != Op386LEAL { 9980 break 9981 } 9982 off2 := v_0.AuxInt 9983 sym2 := v_0.Aux 9984 base := v_0.Args[0] 9985 val := v.Args[1] 9986 mem := v.Args[2] 9987 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 9988 break 9989 } 9990 v.reset(Op386MOVSDstore) 9991 v.AuxInt = off1 + off2 9992 v.Aux = mergeSym(sym1, sym2) 9993 v.AddArg(base) 9994 v.AddArg(val) 9995 v.AddArg(mem) 9996 return true 9997 } 9998 // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 9999 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10000 // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10001 for { 10002 off1 := v.AuxInt 10003 sym1 := v.Aux 10004 _ = v.Args[2] 10005 v_0 := v.Args[0] 10006 if v_0.Op != Op386LEAL1 { 10007 break 10008 } 10009 off2 := v_0.AuxInt 10010 sym2 := v_0.Aux 10011 _ = v_0.Args[1] 10012 ptr := v_0.Args[0] 10013 idx := v_0.Args[1] 10014 val := v.Args[1] 10015 mem := v.Args[2] 10016 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10017 break 10018 } 10019 v.reset(Op386MOVSDstoreidx1) 10020 v.AuxInt = off1 + off2 10021 v.Aux = mergeSym(sym1, sym2) 10022 v.AddArg(ptr) 10023 v.AddArg(idx) 10024 v.AddArg(val) 10025 v.AddArg(mem) 10026 return true 10027 } 10028 // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) 10029 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10030 // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10031 for { 10032 off1 := v.AuxInt 10033 sym1 := v.Aux 10034 _ = v.Args[2] 10035 v_0 := v.Args[0] 10036 if v_0.Op != Op386LEAL8 { 10037 break 10038 } 10039 off2 := v_0.AuxInt 10040 sym2 := v_0.Aux 10041 _ = v_0.Args[1] 10042 ptr := v_0.Args[0] 10043 idx := v_0.Args[1] 10044 val := v.Args[1] 10045 mem := v.Args[2] 10046 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10047 break 10048 } 10049 v.reset(Op386MOVSDstoreidx8) 10050 v.AuxInt = off1 + off2 10051 v.Aux = mergeSym(sym1, sym2) 10052 v.AddArg(ptr) 10053 v.AddArg(idx) 10054 v.AddArg(val) 10055 v.AddArg(mem) 10056 return true 10057 } 10058 // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) 10059 // cond: ptr.Op != OpSB 10060 // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) 10061 for { 10062 off := v.AuxInt 10063 sym := v.Aux 10064 _ = v.Args[2] 10065 v_0 := v.Args[0] 10066 if v_0.Op != Op386ADDL { 10067 break 10068 } 10069 _ = v_0.Args[1] 10070 ptr := v_0.Args[0] 10071 idx := v_0.Args[1] 10072 val := v.Args[1] 10073 mem := v.Args[2] 10074 if !(ptr.Op != OpSB) { 10075 break 10076 } 10077 v.reset(Op386MOVSDstoreidx1) 10078 v.AuxInt = off 10079 v.Aux = sym 10080 v.AddArg(ptr) 10081 v.AddArg(idx) 10082 v.AddArg(val) 10083 v.AddArg(mem) 10084 return true 10085 } 10086 return false 10087 } 10088 func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { 10089 // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 10090 // cond: 10091 // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 10092 for { 10093 c := v.AuxInt 10094 sym := v.Aux 10095 _ = v.Args[3] 10096 v_0 := v.Args[0] 10097 if v_0.Op != Op386ADDLconst { 10098 break 10099 } 10100 d := v_0.AuxInt 10101 ptr := v_0.Args[0] 10102 idx := v.Args[1] 10103 val := v.Args[2] 10104 mem := v.Args[3] 10105 v.reset(Op386MOVSDstoreidx1) 10106 v.AuxInt = int64(int32(c + d)) 10107 v.Aux = sym 10108 v.AddArg(ptr) 10109 v.AddArg(idx) 10110 v.AddArg(val) 10111 v.AddArg(mem) 10112 return true 10113 } 10114 // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 10115 // cond: 10116 // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 10117 for { 10118 c := v.AuxInt 10119 sym := v.Aux 10120 _ = v.Args[3] 10121 ptr := v.Args[0] 10122 v_1 := v.Args[1] 10123 if v_1.Op != Op386ADDLconst { 10124 break 10125 } 10126 d := v_1.AuxInt 10127 idx := v_1.Args[0] 10128 val := v.Args[2] 10129 mem := v.Args[3] 10130 v.reset(Op386MOVSDstoreidx1) 10131 v.AuxInt = int64(int32(c + d)) 10132 v.Aux = sym 10133 v.AddArg(ptr) 10134 v.AddArg(idx) 10135 v.AddArg(val) 10136 v.AddArg(mem) 10137 return true 10138 } 10139 return false 10140 } 10141 func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { 10142 // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) 10143 // cond: 10144 // result: (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem) 10145 for { 10146 c := v.AuxInt 10147 sym := v.Aux 10148 _ = v.Args[3] 10149 v_0 := v.Args[0] 10150 if v_0.Op != Op386ADDLconst { 10151 break 10152 } 10153 d := v_0.AuxInt 10154 ptr := v_0.Args[0] 10155 idx := v.Args[1] 10156 val := v.Args[2] 10157 mem := v.Args[3] 10158 v.reset(Op386MOVSDstoreidx8) 10159 v.AuxInt = int64(int32(c + d)) 10160 v.Aux = sym 10161 v.AddArg(ptr) 10162 v.AddArg(idx) 10163 v.AddArg(val) 10164 v.AddArg(mem) 10165 return true 10166 } 10167 // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) 10168 // cond: 10169 // result: (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem) 10170 for { 10171 c := v.AuxInt 10172 sym := v.Aux 10173 _ = v.Args[3] 10174 ptr := v.Args[0] 10175 v_1 := v.Args[1] 10176 if v_1.Op != Op386ADDLconst { 10177 break 10178 } 10179 d := v_1.AuxInt 10180 idx := v_1.Args[0] 10181 val := v.Args[2] 10182 mem := v.Args[3] 10183 v.reset(Op386MOVSDstoreidx8) 10184 v.AuxInt = int64(int32(c + 8*d)) 10185 v.Aux = sym 10186 v.AddArg(ptr) 10187 v.AddArg(idx) 10188 v.AddArg(val) 10189 v.AddArg(mem) 10190 return true 10191 } 10192 return false 10193 } 10194 func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { 10195 b := v.Block 10196 _ = b 10197 config := b.Func.Config 10198 _ = config 10199 typ := &b.Func.Config.Types 10200 _ = typ 10201 // match: (MOVSSconst [c]) 10202 // cond: config.ctxt.Flag_shared 10203 // result: (MOVSSconst2 (MOVSSconst1 [c])) 10204 for { 10205 c := v.AuxInt 10206 if !(config.ctxt.Flag_shared) { 10207 break 10208 } 10209 v.reset(Op386MOVSSconst2) 10210 v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, typ.UInt32) 10211 v0.AuxInt = c 10212 v.AddArg(v0) 10213 return true 10214 } 10215 return false 10216 } 10217 func rewriteValue386_Op386MOVSSload_0(v *Value) bool { 10218 b := v.Block 10219 _ = b 10220 config := b.Func.Config 10221 _ = config 10222 // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) 10223 // cond: is32Bit(off1+off2) 10224 // result: (MOVSSload [off1+off2] {sym} ptr mem) 10225 for { 10226 off1 := v.AuxInt 10227 sym := v.Aux 10228 _ = v.Args[1] 10229 v_0 := v.Args[0] 10230 if v_0.Op != Op386ADDLconst { 10231 break 10232 } 10233 off2 := v_0.AuxInt 10234 ptr := v_0.Args[0] 10235 mem := v.Args[1] 10236 if !(is32Bit(off1 + off2)) { 10237 break 10238 } 10239 v.reset(Op386MOVSSload) 10240 v.AuxInt = off1 + off2 10241 v.Aux = sym 10242 v.AddArg(ptr) 10243 v.AddArg(mem) 10244 return true 10245 } 10246 // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 10247 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 10248 // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10249 for { 10250 off1 := v.AuxInt 10251 sym1 := v.Aux 10252 _ = v.Args[1] 10253 v_0 := v.Args[0] 10254 if v_0.Op != Op386LEAL { 10255 break 10256 } 10257 off2 := v_0.AuxInt 10258 sym2 := v_0.Aux 10259 base := v_0.Args[0] 10260 mem := v.Args[1] 10261 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 10262 break 10263 } 10264 v.reset(Op386MOVSSload) 10265 v.AuxInt = off1 + off2 10266 v.Aux = mergeSym(sym1, sym2) 10267 v.AddArg(base) 10268 v.AddArg(mem) 10269 return true 10270 } 10271 // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 10272 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10273 // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10274 for { 10275 off1 := v.AuxInt 10276 sym1 := v.Aux 10277 _ = v.Args[1] 10278 v_0 := v.Args[0] 10279 if v_0.Op != Op386LEAL1 { 10280 break 10281 } 10282 off2 := v_0.AuxInt 10283 sym2 := v_0.Aux 10284 _ = v_0.Args[1] 10285 ptr := v_0.Args[0] 10286 idx := v_0.Args[1] 10287 mem := v.Args[1] 10288 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10289 break 10290 } 10291 v.reset(Op386MOVSSloadidx1) 10292 v.AuxInt = off1 + off2 10293 v.Aux = mergeSym(sym1, sym2) 10294 v.AddArg(ptr) 10295 v.AddArg(idx) 10296 v.AddArg(mem) 10297 return true 10298 } 10299 // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) 10300 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10301 // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10302 for { 10303 off1 := v.AuxInt 10304 sym1 := v.Aux 10305 _ = v.Args[1] 10306 v_0 := v.Args[0] 10307 if v_0.Op != Op386LEAL4 { 10308 break 10309 } 10310 off2 := v_0.AuxInt 10311 sym2 := v_0.Aux 10312 _ = v_0.Args[1] 10313 ptr := v_0.Args[0] 10314 idx := v_0.Args[1] 10315 mem := v.Args[1] 10316 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10317 break 10318 } 10319 v.reset(Op386MOVSSloadidx4) 10320 v.AuxInt = off1 + off2 10321 v.Aux = mergeSym(sym1, sym2) 10322 v.AddArg(ptr) 10323 v.AddArg(idx) 10324 v.AddArg(mem) 10325 return true 10326 } 10327 // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) 10328 // cond: ptr.Op != OpSB 10329 // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) 10330 for { 10331 off := v.AuxInt 10332 sym := v.Aux 10333 _ = v.Args[1] 10334 v_0 := v.Args[0] 10335 if v_0.Op != Op386ADDL { 10336 break 10337 } 10338 _ = v_0.Args[1] 10339 ptr := v_0.Args[0] 10340 idx := v_0.Args[1] 10341 mem := v.Args[1] 10342 if !(ptr.Op != OpSB) { 10343 break 10344 } 10345 v.reset(Op386MOVSSloadidx1) 10346 v.AuxInt = off 10347 v.Aux = sym 10348 v.AddArg(ptr) 10349 v.AddArg(idx) 10350 v.AddArg(mem) 10351 return true 10352 } 10353 return false 10354 } 10355 func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { 10356 // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 10357 // cond: 10358 // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 10359 for { 10360 c := v.AuxInt 10361 sym := v.Aux 10362 _ = v.Args[2] 10363 v_0 := v.Args[0] 10364 if v_0.Op != Op386ADDLconst { 10365 break 10366 } 10367 d := v_0.AuxInt 10368 ptr := v_0.Args[0] 10369 idx := v.Args[1] 10370 mem := v.Args[2] 10371 v.reset(Op386MOVSSloadidx1) 10372 v.AuxInt = int64(int32(c + d)) 10373 v.Aux = sym 10374 v.AddArg(ptr) 10375 v.AddArg(idx) 10376 v.AddArg(mem) 10377 return true 10378 } 10379 // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 10380 // cond: 10381 // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 10382 for { 10383 c := v.AuxInt 10384 sym := v.Aux 10385 _ = v.Args[2] 10386 ptr := v.Args[0] 10387 v_1 := v.Args[1] 10388 if v_1.Op != Op386ADDLconst { 10389 break 10390 } 10391 d := v_1.AuxInt 10392 idx := v_1.Args[0] 10393 mem := v.Args[2] 10394 v.reset(Op386MOVSSloadidx1) 10395 v.AuxInt = int64(int32(c + d)) 10396 v.Aux = sym 10397 v.AddArg(ptr) 10398 v.AddArg(idx) 10399 v.AddArg(mem) 10400 return true 10401 } 10402 return false 10403 } 10404 func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { 10405 // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) 10406 // cond: 10407 // result: (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) 10408 for { 10409 c := v.AuxInt 10410 sym := v.Aux 10411 _ = v.Args[2] 10412 v_0 := v.Args[0] 10413 if v_0.Op != Op386ADDLconst { 10414 break 10415 } 10416 d := v_0.AuxInt 10417 ptr := v_0.Args[0] 10418 idx := v.Args[1] 10419 mem := v.Args[2] 10420 v.reset(Op386MOVSSloadidx4) 10421 v.AuxInt = int64(int32(c + d)) 10422 v.Aux = sym 10423 v.AddArg(ptr) 10424 v.AddArg(idx) 10425 v.AddArg(mem) 10426 return true 10427 } 10428 // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) 10429 // cond: 10430 // result: (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) 10431 for { 10432 c := v.AuxInt 10433 sym := v.Aux 10434 _ = v.Args[2] 10435 ptr := v.Args[0] 10436 v_1 := v.Args[1] 10437 if v_1.Op != Op386ADDLconst { 10438 break 10439 } 10440 d := v_1.AuxInt 10441 idx := v_1.Args[0] 10442 mem := v.Args[2] 10443 v.reset(Op386MOVSSloadidx4) 10444 v.AuxInt = int64(int32(c + 4*d)) 10445 v.Aux = sym 10446 v.AddArg(ptr) 10447 v.AddArg(idx) 10448 v.AddArg(mem) 10449 return true 10450 } 10451 return false 10452 } 10453 func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { 10454 b := v.Block 10455 _ = b 10456 config := b.Func.Config 10457 _ = config 10458 // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 10459 // cond: is32Bit(off1+off2) 10460 // result: (MOVSSstore [off1+off2] {sym} ptr val mem) 10461 for { 10462 off1 := v.AuxInt 10463 sym := v.Aux 10464 _ = v.Args[2] 10465 v_0 := v.Args[0] 10466 if v_0.Op != Op386ADDLconst { 10467 break 10468 } 10469 off2 := v_0.AuxInt 10470 ptr := v_0.Args[0] 10471 val := v.Args[1] 10472 mem := v.Args[2] 10473 if !(is32Bit(off1 + off2)) { 10474 break 10475 } 10476 v.reset(Op386MOVSSstore) 10477 v.AuxInt = off1 + off2 10478 v.Aux = sym 10479 v.AddArg(ptr) 10480 v.AddArg(val) 10481 v.AddArg(mem) 10482 return true 10483 } 10484 // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 10485 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 10486 // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10487 for { 10488 off1 := v.AuxInt 10489 sym1 := v.Aux 10490 _ = v.Args[2] 10491 v_0 := v.Args[0] 10492 if v_0.Op != Op386LEAL { 10493 break 10494 } 10495 off2 := v_0.AuxInt 10496 sym2 := v_0.Aux 10497 base := v_0.Args[0] 10498 val := v.Args[1] 10499 mem := v.Args[2] 10500 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 10501 break 10502 } 10503 v.reset(Op386MOVSSstore) 10504 v.AuxInt = off1 + off2 10505 v.Aux = mergeSym(sym1, sym2) 10506 v.AddArg(base) 10507 v.AddArg(val) 10508 v.AddArg(mem) 10509 return true 10510 } 10511 // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 10512 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10513 // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10514 for { 10515 off1 := v.AuxInt 10516 sym1 := v.Aux 10517 _ = v.Args[2] 10518 v_0 := v.Args[0] 10519 if v_0.Op != Op386LEAL1 { 10520 break 10521 } 10522 off2 := v_0.AuxInt 10523 sym2 := v_0.Aux 10524 _ = v_0.Args[1] 10525 ptr := v_0.Args[0] 10526 idx := v_0.Args[1] 10527 val := v.Args[1] 10528 mem := v.Args[2] 10529 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10530 break 10531 } 10532 v.reset(Op386MOVSSstoreidx1) 10533 v.AuxInt = off1 + off2 10534 v.Aux = mergeSym(sym1, sym2) 10535 v.AddArg(ptr) 10536 v.AddArg(idx) 10537 v.AddArg(val) 10538 v.AddArg(mem) 10539 return true 10540 } 10541 // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) 10542 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10543 // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10544 for { 10545 off1 := v.AuxInt 10546 sym1 := v.Aux 10547 _ = v.Args[2] 10548 v_0 := v.Args[0] 10549 if v_0.Op != Op386LEAL4 { 10550 break 10551 } 10552 off2 := v_0.AuxInt 10553 sym2 := v_0.Aux 10554 _ = v_0.Args[1] 10555 ptr := v_0.Args[0] 10556 idx := v_0.Args[1] 10557 val := v.Args[1] 10558 mem := v.Args[2] 10559 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10560 break 10561 } 10562 v.reset(Op386MOVSSstoreidx4) 10563 v.AuxInt = off1 + off2 10564 v.Aux = mergeSym(sym1, sym2) 10565 v.AddArg(ptr) 10566 v.AddArg(idx) 10567 v.AddArg(val) 10568 v.AddArg(mem) 10569 return true 10570 } 10571 // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) 10572 // cond: ptr.Op != OpSB 10573 // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) 10574 for { 10575 off := v.AuxInt 10576 sym := v.Aux 10577 _ = v.Args[2] 10578 v_0 := v.Args[0] 10579 if v_0.Op != Op386ADDL { 10580 break 10581 } 10582 _ = v_0.Args[1] 10583 ptr := v_0.Args[0] 10584 idx := v_0.Args[1] 10585 val := v.Args[1] 10586 mem := v.Args[2] 10587 if !(ptr.Op != OpSB) { 10588 break 10589 } 10590 v.reset(Op386MOVSSstoreidx1) 10591 v.AuxInt = off 10592 v.Aux = sym 10593 v.AddArg(ptr) 10594 v.AddArg(idx) 10595 v.AddArg(val) 10596 v.AddArg(mem) 10597 return true 10598 } 10599 return false 10600 } 10601 func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { 10602 // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 10603 // cond: 10604 // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 10605 for { 10606 c := v.AuxInt 10607 sym := v.Aux 10608 _ = v.Args[3] 10609 v_0 := v.Args[0] 10610 if v_0.Op != Op386ADDLconst { 10611 break 10612 } 10613 d := v_0.AuxInt 10614 ptr := v_0.Args[0] 10615 idx := v.Args[1] 10616 val := v.Args[2] 10617 mem := v.Args[3] 10618 v.reset(Op386MOVSSstoreidx1) 10619 v.AuxInt = int64(int32(c + d)) 10620 v.Aux = sym 10621 v.AddArg(ptr) 10622 v.AddArg(idx) 10623 v.AddArg(val) 10624 v.AddArg(mem) 10625 return true 10626 } 10627 // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 10628 // cond: 10629 // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 10630 for { 10631 c := v.AuxInt 10632 sym := v.Aux 10633 _ = v.Args[3] 10634 ptr := v.Args[0] 10635 v_1 := v.Args[1] 10636 if v_1.Op != Op386ADDLconst { 10637 break 10638 } 10639 d := v_1.AuxInt 10640 idx := v_1.Args[0] 10641 val := v.Args[2] 10642 mem := v.Args[3] 10643 v.reset(Op386MOVSSstoreidx1) 10644 v.AuxInt = int64(int32(c + d)) 10645 v.Aux = sym 10646 v.AddArg(ptr) 10647 v.AddArg(idx) 10648 v.AddArg(val) 10649 v.AddArg(mem) 10650 return true 10651 } 10652 return false 10653 } 10654 func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { 10655 // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) 10656 // cond: 10657 // result: (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) 10658 for { 10659 c := v.AuxInt 10660 sym := v.Aux 10661 _ = v.Args[3] 10662 v_0 := v.Args[0] 10663 if v_0.Op != Op386ADDLconst { 10664 break 10665 } 10666 d := v_0.AuxInt 10667 ptr := v_0.Args[0] 10668 idx := v.Args[1] 10669 val := v.Args[2] 10670 mem := v.Args[3] 10671 v.reset(Op386MOVSSstoreidx4) 10672 v.AuxInt = int64(int32(c + d)) 10673 v.Aux = sym 10674 v.AddArg(ptr) 10675 v.AddArg(idx) 10676 v.AddArg(val) 10677 v.AddArg(mem) 10678 return true 10679 } 10680 // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) 10681 // cond: 10682 // result: (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) 10683 for { 10684 c := v.AuxInt 10685 sym := v.Aux 10686 _ = v.Args[3] 10687 ptr := v.Args[0] 10688 v_1 := v.Args[1] 10689 if v_1.Op != Op386ADDLconst { 10690 break 10691 } 10692 d := v_1.AuxInt 10693 idx := v_1.Args[0] 10694 val := v.Args[2] 10695 mem := v.Args[3] 10696 v.reset(Op386MOVSSstoreidx4) 10697 v.AuxInt = int64(int32(c + 4*d)) 10698 v.Aux = sym 10699 v.AddArg(ptr) 10700 v.AddArg(idx) 10701 v.AddArg(val) 10702 v.AddArg(mem) 10703 return true 10704 } 10705 return false 10706 } 10707 func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { 10708 b := v.Block 10709 _ = b 10710 // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) 10711 // cond: x.Uses == 1 && clobber(x) 10712 // result: @x.Block (MOVWLSXload <v.Type> [off] {sym} ptr mem) 10713 for { 10714 x := v.Args[0] 10715 if x.Op != Op386MOVWload { 10716 break 10717 } 10718 off := x.AuxInt 10719 sym := x.Aux 10720 _ = x.Args[1] 10721 ptr := x.Args[0] 10722 mem := x.Args[1] 10723 if !(x.Uses == 1 && clobber(x)) { 10724 break 10725 } 10726 b = x.Block 10727 v0 := b.NewValue0(v.Pos, Op386MOVWLSXload, v.Type) 10728 v.reset(OpCopy) 10729 v.AddArg(v0) 10730 v0.AuxInt = off 10731 v0.Aux = sym 10732 v0.AddArg(ptr) 10733 v0.AddArg(mem) 10734 return true 10735 } 10736 // match: (MOVWLSX (ANDLconst [c] x)) 10737 // cond: c & 0x8000 == 0 10738 // result: (ANDLconst [c & 0x7fff] x) 10739 for { 10740 v_0 := v.Args[0] 10741 if v_0.Op != Op386ANDLconst { 10742 break 10743 } 10744 c := v_0.AuxInt 10745 x := v_0.Args[0] 10746 if !(c&0x8000 == 0) { 10747 break 10748 } 10749 v.reset(Op386ANDLconst) 10750 v.AuxInt = c & 0x7fff 10751 v.AddArg(x) 10752 return true 10753 } 10754 return false 10755 } 10756 func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { 10757 b := v.Block 10758 _ = b 10759 config := b.Func.Config 10760 _ = config 10761 // match: (MOVWLSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 10762 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 10763 // result: (MOVWLSX x) 10764 for { 10765 off := v.AuxInt 10766 sym := v.Aux 10767 _ = v.Args[1] 10768 ptr := v.Args[0] 10769 v_1 := v.Args[1] 10770 if v_1.Op != Op386MOVWstore { 10771 break 10772 } 10773 off2 := v_1.AuxInt 10774 sym2 := v_1.Aux 10775 _ = v_1.Args[2] 10776 ptr2 := v_1.Args[0] 10777 x := v_1.Args[1] 10778 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 10779 break 10780 } 10781 v.reset(Op386MOVWLSX) 10782 v.AddArg(x) 10783 return true 10784 } 10785 // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 10786 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 10787 // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10788 for { 10789 off1 := v.AuxInt 10790 sym1 := v.Aux 10791 _ = v.Args[1] 10792 v_0 := v.Args[0] 10793 if v_0.Op != Op386LEAL { 10794 break 10795 } 10796 off2 := v_0.AuxInt 10797 sym2 := v_0.Aux 10798 base := v_0.Args[0] 10799 mem := v.Args[1] 10800 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 10801 break 10802 } 10803 v.reset(Op386MOVWLSXload) 10804 v.AuxInt = off1 + off2 10805 v.Aux = mergeSym(sym1, sym2) 10806 v.AddArg(base) 10807 v.AddArg(mem) 10808 return true 10809 } 10810 return false 10811 } 10812 func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { 10813 b := v.Block 10814 _ = b 10815 // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) 10816 // cond: x.Uses == 1 && clobber(x) 10817 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 10818 for { 10819 x := v.Args[0] 10820 if x.Op != Op386MOVWload { 10821 break 10822 } 10823 off := x.AuxInt 10824 sym := x.Aux 10825 _ = x.Args[1] 10826 ptr := x.Args[0] 10827 mem := x.Args[1] 10828 if !(x.Uses == 1 && clobber(x)) { 10829 break 10830 } 10831 b = x.Block 10832 v0 := b.NewValue0(v.Pos, Op386MOVWload, v.Type) 10833 v.reset(OpCopy) 10834 v.AddArg(v0) 10835 v0.AuxInt = off 10836 v0.Aux = sym 10837 v0.AddArg(ptr) 10838 v0.AddArg(mem) 10839 return true 10840 } 10841 // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) 10842 // cond: x.Uses == 1 && clobber(x) 10843 // result: @x.Block (MOVWloadidx1 <v.Type> [off] {sym} ptr idx mem) 10844 for { 10845 x := v.Args[0] 10846 if x.Op != Op386MOVWloadidx1 { 10847 break 10848 } 10849 off := x.AuxInt 10850 sym := x.Aux 10851 _ = x.Args[2] 10852 ptr := x.Args[0] 10853 idx := x.Args[1] 10854 mem := x.Args[2] 10855 if !(x.Uses == 1 && clobber(x)) { 10856 break 10857 } 10858 b = x.Block 10859 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 10860 v.reset(OpCopy) 10861 v.AddArg(v0) 10862 v0.AuxInt = off 10863 v0.Aux = sym 10864 v0.AddArg(ptr) 10865 v0.AddArg(idx) 10866 v0.AddArg(mem) 10867 return true 10868 } 10869 // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) 10870 // cond: x.Uses == 1 && clobber(x) 10871 // result: @x.Block (MOVWloadidx2 <v.Type> [off] {sym} ptr idx mem) 10872 for { 10873 x := v.Args[0] 10874 if x.Op != Op386MOVWloadidx2 { 10875 break 10876 } 10877 off := x.AuxInt 10878 sym := x.Aux 10879 _ = x.Args[2] 10880 ptr := x.Args[0] 10881 idx := x.Args[1] 10882 mem := x.Args[2] 10883 if !(x.Uses == 1 && clobber(x)) { 10884 break 10885 } 10886 b = x.Block 10887 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) 10888 v.reset(OpCopy) 10889 v.AddArg(v0) 10890 v0.AuxInt = off 10891 v0.Aux = sym 10892 v0.AddArg(ptr) 10893 v0.AddArg(idx) 10894 v0.AddArg(mem) 10895 return true 10896 } 10897 // match: (MOVWLZX (ANDLconst [c] x)) 10898 // cond: 10899 // result: (ANDLconst [c & 0xffff] x) 10900 for { 10901 v_0 := v.Args[0] 10902 if v_0.Op != Op386ANDLconst { 10903 break 10904 } 10905 c := v_0.AuxInt 10906 x := v_0.Args[0] 10907 v.reset(Op386ANDLconst) 10908 v.AuxInt = c & 0xffff 10909 v.AddArg(x) 10910 return true 10911 } 10912 return false 10913 } 10914 func rewriteValue386_Op386MOVWload_0(v *Value) bool { 10915 b := v.Block 10916 _ = b 10917 config := b.Func.Config 10918 _ = config 10919 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 10920 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 10921 // result: (MOVWLZX x) 10922 for { 10923 off := v.AuxInt 10924 sym := v.Aux 10925 _ = v.Args[1] 10926 ptr := v.Args[0] 10927 v_1 := v.Args[1] 10928 if v_1.Op != Op386MOVWstore { 10929 break 10930 } 10931 off2 := v_1.AuxInt 10932 sym2 := v_1.Aux 10933 _ = v_1.Args[2] 10934 ptr2 := v_1.Args[0] 10935 x := v_1.Args[1] 10936 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 10937 break 10938 } 10939 v.reset(Op386MOVWLZX) 10940 v.AddArg(x) 10941 return true 10942 } 10943 // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) 10944 // cond: is32Bit(off1+off2) 10945 // result: (MOVWload [off1+off2] {sym} ptr mem) 10946 for { 10947 off1 := v.AuxInt 10948 sym := v.Aux 10949 _ = v.Args[1] 10950 v_0 := v.Args[0] 10951 if v_0.Op != Op386ADDLconst { 10952 break 10953 } 10954 off2 := v_0.AuxInt 10955 ptr := v_0.Args[0] 10956 mem := v.Args[1] 10957 if !(is32Bit(off1 + off2)) { 10958 break 10959 } 10960 v.reset(Op386MOVWload) 10961 v.AuxInt = off1 + off2 10962 v.Aux = sym 10963 v.AddArg(ptr) 10964 v.AddArg(mem) 10965 return true 10966 } 10967 // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) 10968 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 10969 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10970 for { 10971 off1 := v.AuxInt 10972 sym1 := v.Aux 10973 _ = v.Args[1] 10974 v_0 := v.Args[0] 10975 if v_0.Op != Op386LEAL { 10976 break 10977 } 10978 off2 := v_0.AuxInt 10979 sym2 := v_0.Aux 10980 base := v_0.Args[0] 10981 mem := v.Args[1] 10982 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 10983 break 10984 } 10985 v.reset(Op386MOVWload) 10986 v.AuxInt = off1 + off2 10987 v.Aux = mergeSym(sym1, sym2) 10988 v.AddArg(base) 10989 v.AddArg(mem) 10990 return true 10991 } 10992 // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) 10993 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10994 // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10995 for { 10996 off1 := v.AuxInt 10997 sym1 := v.Aux 10998 _ = v.Args[1] 10999 v_0 := v.Args[0] 11000 if v_0.Op != Op386LEAL1 { 11001 break 11002 } 11003 off2 := v_0.AuxInt 11004 sym2 := v_0.Aux 11005 _ = v_0.Args[1] 11006 ptr := v_0.Args[0] 11007 idx := v_0.Args[1] 11008 mem := v.Args[1] 11009 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11010 break 11011 } 11012 v.reset(Op386MOVWloadidx1) 11013 v.AuxInt = off1 + off2 11014 v.Aux = mergeSym(sym1, sym2) 11015 v.AddArg(ptr) 11016 v.AddArg(idx) 11017 v.AddArg(mem) 11018 return true 11019 } 11020 // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) 11021 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11022 // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11023 for { 11024 off1 := v.AuxInt 11025 sym1 := v.Aux 11026 _ = v.Args[1] 11027 v_0 := v.Args[0] 11028 if v_0.Op != Op386LEAL2 { 11029 break 11030 } 11031 off2 := v_0.AuxInt 11032 sym2 := v_0.Aux 11033 _ = v_0.Args[1] 11034 ptr := v_0.Args[0] 11035 idx := v_0.Args[1] 11036 mem := v.Args[1] 11037 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11038 break 11039 } 11040 v.reset(Op386MOVWloadidx2) 11041 v.AuxInt = off1 + off2 11042 v.Aux = mergeSym(sym1, sym2) 11043 v.AddArg(ptr) 11044 v.AddArg(idx) 11045 v.AddArg(mem) 11046 return true 11047 } 11048 // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) 11049 // cond: ptr.Op != OpSB 11050 // result: (MOVWloadidx1 [off] {sym} ptr idx mem) 11051 for { 11052 off := v.AuxInt 11053 sym := v.Aux 11054 _ = v.Args[1] 11055 v_0 := v.Args[0] 11056 if v_0.Op != Op386ADDL { 11057 break 11058 } 11059 _ = v_0.Args[1] 11060 ptr := v_0.Args[0] 11061 idx := v_0.Args[1] 11062 mem := v.Args[1] 11063 if !(ptr.Op != OpSB) { 11064 break 11065 } 11066 v.reset(Op386MOVWloadidx1) 11067 v.AuxInt = off 11068 v.Aux = sym 11069 v.AddArg(ptr) 11070 v.AddArg(idx) 11071 v.AddArg(mem) 11072 return true 11073 } 11074 // match: (MOVWload [off] {sym} (SB) _) 11075 // cond: symIsRO(sym) 11076 // result: (MOVLconst [int64(read16(sym, off, config.BigEndian))]) 11077 for { 11078 off := v.AuxInt 11079 sym := v.Aux 11080 _ = v.Args[1] 11081 v_0 := v.Args[0] 11082 if v_0.Op != OpSB { 11083 break 11084 } 11085 if !(symIsRO(sym)) { 11086 break 11087 } 11088 v.reset(Op386MOVLconst) 11089 v.AuxInt = int64(read16(sym, off, config.BigEndian)) 11090 return true 11091 } 11092 return false 11093 } 11094 func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { 11095 // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 11096 // cond: 11097 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 11098 for { 11099 c := v.AuxInt 11100 sym := v.Aux 11101 _ = v.Args[2] 11102 ptr := v.Args[0] 11103 v_1 := v.Args[1] 11104 if v_1.Op != Op386SHLLconst { 11105 break 11106 } 11107 if v_1.AuxInt != 1 { 11108 break 11109 } 11110 idx := v_1.Args[0] 11111 mem := v.Args[2] 11112 v.reset(Op386MOVWloadidx2) 11113 v.AuxInt = c 11114 v.Aux = sym 11115 v.AddArg(ptr) 11116 v.AddArg(idx) 11117 v.AddArg(mem) 11118 return true 11119 } 11120 // match: (MOVWloadidx1 [c] {sym} (SHLLconst [1] idx) ptr mem) 11121 // cond: 11122 // result: (MOVWloadidx2 [c] {sym} ptr idx mem) 11123 for { 11124 c := v.AuxInt 11125 sym := v.Aux 11126 _ = v.Args[2] 11127 v_0 := v.Args[0] 11128 if v_0.Op != Op386SHLLconst { 11129 break 11130 } 11131 if v_0.AuxInt != 1 { 11132 break 11133 } 11134 idx := v_0.Args[0] 11135 ptr := v.Args[1] 11136 mem := v.Args[2] 11137 v.reset(Op386MOVWloadidx2) 11138 v.AuxInt = c 11139 v.Aux = sym 11140 v.AddArg(ptr) 11141 v.AddArg(idx) 11142 v.AddArg(mem) 11143 return true 11144 } 11145 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) 11146 // cond: 11147 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 11148 for { 11149 c := v.AuxInt 11150 sym := v.Aux 11151 _ = v.Args[2] 11152 v_0 := v.Args[0] 11153 if v_0.Op != Op386ADDLconst { 11154 break 11155 } 11156 d := v_0.AuxInt 11157 ptr := v_0.Args[0] 11158 idx := v.Args[1] 11159 mem := v.Args[2] 11160 v.reset(Op386MOVWloadidx1) 11161 v.AuxInt = int64(int32(c + d)) 11162 v.Aux = sym 11163 v.AddArg(ptr) 11164 v.AddArg(idx) 11165 v.AddArg(mem) 11166 return true 11167 } 11168 // match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) 11169 // cond: 11170 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 11171 for { 11172 c := v.AuxInt 11173 sym := v.Aux 11174 _ = v.Args[2] 11175 idx := v.Args[0] 11176 v_1 := v.Args[1] 11177 if v_1.Op != Op386ADDLconst { 11178 break 11179 } 11180 d := v_1.AuxInt 11181 ptr := v_1.Args[0] 11182 mem := v.Args[2] 11183 v.reset(Op386MOVWloadidx1) 11184 v.AuxInt = int64(int32(c + d)) 11185 v.Aux = sym 11186 v.AddArg(ptr) 11187 v.AddArg(idx) 11188 v.AddArg(mem) 11189 return true 11190 } 11191 // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) 11192 // cond: 11193 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 11194 for { 11195 c := v.AuxInt 11196 sym := v.Aux 11197 _ = v.Args[2] 11198 ptr := v.Args[0] 11199 v_1 := v.Args[1] 11200 if v_1.Op != Op386ADDLconst { 11201 break 11202 } 11203 d := v_1.AuxInt 11204 idx := v_1.Args[0] 11205 mem := v.Args[2] 11206 v.reset(Op386MOVWloadidx1) 11207 v.AuxInt = int64(int32(c + d)) 11208 v.Aux = sym 11209 v.AddArg(ptr) 11210 v.AddArg(idx) 11211 v.AddArg(mem) 11212 return true 11213 } 11214 // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) 11215 // cond: 11216 // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) 11217 for { 11218 c := v.AuxInt 11219 sym := v.Aux 11220 _ = v.Args[2] 11221 v_0 := v.Args[0] 11222 if v_0.Op != Op386ADDLconst { 11223 break 11224 } 11225 d := v_0.AuxInt 11226 idx := v_0.Args[0] 11227 ptr := v.Args[1] 11228 mem := v.Args[2] 11229 v.reset(Op386MOVWloadidx1) 11230 v.AuxInt = int64(int32(c + d)) 11231 v.Aux = sym 11232 v.AddArg(ptr) 11233 v.AddArg(idx) 11234 v.AddArg(mem) 11235 return true 11236 } 11237 return false 11238 } 11239 func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { 11240 // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) 11241 // cond: 11242 // result: (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem) 11243 for { 11244 c := v.AuxInt 11245 sym := v.Aux 11246 _ = v.Args[2] 11247 v_0 := v.Args[0] 11248 if v_0.Op != Op386ADDLconst { 11249 break 11250 } 11251 d := v_0.AuxInt 11252 ptr := v_0.Args[0] 11253 idx := v.Args[1] 11254 mem := v.Args[2] 11255 v.reset(Op386MOVWloadidx2) 11256 v.AuxInt = int64(int32(c + d)) 11257 v.Aux = sym 11258 v.AddArg(ptr) 11259 v.AddArg(idx) 11260 v.AddArg(mem) 11261 return true 11262 } 11263 // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) 11264 // cond: 11265 // result: (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem) 11266 for { 11267 c := v.AuxInt 11268 sym := v.Aux 11269 _ = v.Args[2] 11270 ptr := v.Args[0] 11271 v_1 := v.Args[1] 11272 if v_1.Op != Op386ADDLconst { 11273 break 11274 } 11275 d := v_1.AuxInt 11276 idx := v_1.Args[0] 11277 mem := v.Args[2] 11278 v.reset(Op386MOVWloadidx2) 11279 v.AuxInt = int64(int32(c + 2*d)) 11280 v.Aux = sym 11281 v.AddArg(ptr) 11282 v.AddArg(idx) 11283 v.AddArg(mem) 11284 return true 11285 } 11286 return false 11287 } 11288 func rewriteValue386_Op386MOVWstore_0(v *Value) bool { 11289 b := v.Block 11290 _ = b 11291 config := b.Func.Config 11292 _ = config 11293 // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) 11294 // cond: 11295 // result: (MOVWstore [off] {sym} ptr x mem) 11296 for { 11297 off := v.AuxInt 11298 sym := v.Aux 11299 _ = v.Args[2] 11300 ptr := v.Args[0] 11301 v_1 := v.Args[1] 11302 if v_1.Op != Op386MOVWLSX { 11303 break 11304 } 11305 x := v_1.Args[0] 11306 mem := v.Args[2] 11307 v.reset(Op386MOVWstore) 11308 v.AuxInt = off 11309 v.Aux = sym 11310 v.AddArg(ptr) 11311 v.AddArg(x) 11312 v.AddArg(mem) 11313 return true 11314 } 11315 // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) 11316 // cond: 11317 // result: (MOVWstore [off] {sym} ptr x mem) 11318 for { 11319 off := v.AuxInt 11320 sym := v.Aux 11321 _ = v.Args[2] 11322 ptr := v.Args[0] 11323 v_1 := v.Args[1] 11324 if v_1.Op != Op386MOVWLZX { 11325 break 11326 } 11327 x := v_1.Args[0] 11328 mem := v.Args[2] 11329 v.reset(Op386MOVWstore) 11330 v.AuxInt = off 11331 v.Aux = sym 11332 v.AddArg(ptr) 11333 v.AddArg(x) 11334 v.AddArg(mem) 11335 return true 11336 } 11337 // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) 11338 // cond: is32Bit(off1+off2) 11339 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 11340 for { 11341 off1 := v.AuxInt 11342 sym := v.Aux 11343 _ = v.Args[2] 11344 v_0 := v.Args[0] 11345 if v_0.Op != Op386ADDLconst { 11346 break 11347 } 11348 off2 := v_0.AuxInt 11349 ptr := v_0.Args[0] 11350 val := v.Args[1] 11351 mem := v.Args[2] 11352 if !(is32Bit(off1 + off2)) { 11353 break 11354 } 11355 v.reset(Op386MOVWstore) 11356 v.AuxInt = off1 + off2 11357 v.Aux = sym 11358 v.AddArg(ptr) 11359 v.AddArg(val) 11360 v.AddArg(mem) 11361 return true 11362 } 11363 // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) 11364 // cond: validOff(off) 11365 // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 11366 for { 11367 off := v.AuxInt 11368 sym := v.Aux 11369 _ = v.Args[2] 11370 ptr := v.Args[0] 11371 v_1 := v.Args[1] 11372 if v_1.Op != Op386MOVLconst { 11373 break 11374 } 11375 c := v_1.AuxInt 11376 mem := v.Args[2] 11377 if !(validOff(off)) { 11378 break 11379 } 11380 v.reset(Op386MOVWstoreconst) 11381 v.AuxInt = makeValAndOff(int64(int16(c)), off) 11382 v.Aux = sym 11383 v.AddArg(ptr) 11384 v.AddArg(mem) 11385 return true 11386 } 11387 // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 11388 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 11389 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 11390 for { 11391 off1 := v.AuxInt 11392 sym1 := v.Aux 11393 _ = v.Args[2] 11394 v_0 := v.Args[0] 11395 if v_0.Op != Op386LEAL { 11396 break 11397 } 11398 off2 := v_0.AuxInt 11399 sym2 := v_0.Aux 11400 base := v_0.Args[0] 11401 val := v.Args[1] 11402 mem := v.Args[2] 11403 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 11404 break 11405 } 11406 v.reset(Op386MOVWstore) 11407 v.AuxInt = off1 + off2 11408 v.Aux = mergeSym(sym1, sym2) 11409 v.AddArg(base) 11410 v.AddArg(val) 11411 v.AddArg(mem) 11412 return true 11413 } 11414 // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) 11415 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11416 // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 11417 for { 11418 off1 := v.AuxInt 11419 sym1 := v.Aux 11420 _ = v.Args[2] 11421 v_0 := v.Args[0] 11422 if v_0.Op != Op386LEAL1 { 11423 break 11424 } 11425 off2 := v_0.AuxInt 11426 sym2 := v_0.Aux 11427 _ = v_0.Args[1] 11428 ptr := v_0.Args[0] 11429 idx := v_0.Args[1] 11430 val := v.Args[1] 11431 mem := v.Args[2] 11432 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11433 break 11434 } 11435 v.reset(Op386MOVWstoreidx1) 11436 v.AuxInt = off1 + off2 11437 v.Aux = mergeSym(sym1, sym2) 11438 v.AddArg(ptr) 11439 v.AddArg(idx) 11440 v.AddArg(val) 11441 v.AddArg(mem) 11442 return true 11443 } 11444 // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) 11445 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11446 // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 11447 for { 11448 off1 := v.AuxInt 11449 sym1 := v.Aux 11450 _ = v.Args[2] 11451 v_0 := v.Args[0] 11452 if v_0.Op != Op386LEAL2 { 11453 break 11454 } 11455 off2 := v_0.AuxInt 11456 sym2 := v_0.Aux 11457 _ = v_0.Args[1] 11458 ptr := v_0.Args[0] 11459 idx := v_0.Args[1] 11460 val := v.Args[1] 11461 mem := v.Args[2] 11462 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11463 break 11464 } 11465 v.reset(Op386MOVWstoreidx2) 11466 v.AuxInt = off1 + off2 11467 v.Aux = mergeSym(sym1, sym2) 11468 v.AddArg(ptr) 11469 v.AddArg(idx) 11470 v.AddArg(val) 11471 v.AddArg(mem) 11472 return true 11473 } 11474 // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) 11475 // cond: ptr.Op != OpSB 11476 // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) 11477 for { 11478 off := v.AuxInt 11479 sym := v.Aux 11480 _ = v.Args[2] 11481 v_0 := v.Args[0] 11482 if v_0.Op != Op386ADDL { 11483 break 11484 } 11485 _ = v_0.Args[1] 11486 ptr := v_0.Args[0] 11487 idx := v_0.Args[1] 11488 val := v.Args[1] 11489 mem := v.Args[2] 11490 if !(ptr.Op != OpSB) { 11491 break 11492 } 11493 v.reset(Op386MOVWstoreidx1) 11494 v.AuxInt = off 11495 v.Aux = sym 11496 v.AddArg(ptr) 11497 v.AddArg(idx) 11498 v.AddArg(val) 11499 v.AddArg(mem) 11500 return true 11501 } 11502 // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) 11503 // cond: x.Uses == 1 && clobber(x) 11504 // result: (MOVLstore [i-2] {s} p w mem) 11505 for { 11506 i := v.AuxInt 11507 s := v.Aux 11508 _ = v.Args[2] 11509 p := v.Args[0] 11510 v_1 := v.Args[1] 11511 if v_1.Op != Op386SHRLconst { 11512 break 11513 } 11514 if v_1.AuxInt != 16 { 11515 break 11516 } 11517 w := v_1.Args[0] 11518 x := v.Args[2] 11519 if x.Op != Op386MOVWstore { 11520 break 11521 } 11522 if x.AuxInt != i-2 { 11523 break 11524 } 11525 if x.Aux != s { 11526 break 11527 } 11528 _ = x.Args[2] 11529 if p != x.Args[0] { 11530 break 11531 } 11532 if w != x.Args[1] { 11533 break 11534 } 11535 mem := x.Args[2] 11536 if !(x.Uses == 1 && clobber(x)) { 11537 break 11538 } 11539 v.reset(Op386MOVLstore) 11540 v.AuxInt = i - 2 11541 v.Aux = s 11542 v.AddArg(p) 11543 v.AddArg(w) 11544 v.AddArg(mem) 11545 return true 11546 } 11547 // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) 11548 // cond: x.Uses == 1 && clobber(x) 11549 // result: (MOVLstore [i-2] {s} p w0 mem) 11550 for { 11551 i := v.AuxInt 11552 s := v.Aux 11553 _ = v.Args[2] 11554 p := v.Args[0] 11555 v_1 := v.Args[1] 11556 if v_1.Op != Op386SHRLconst { 11557 break 11558 } 11559 j := v_1.AuxInt 11560 w := v_1.Args[0] 11561 x := v.Args[2] 11562 if x.Op != Op386MOVWstore { 11563 break 11564 } 11565 if x.AuxInt != i-2 { 11566 break 11567 } 11568 if x.Aux != s { 11569 break 11570 } 11571 _ = x.Args[2] 11572 if p != x.Args[0] { 11573 break 11574 } 11575 w0 := x.Args[1] 11576 if w0.Op != Op386SHRLconst { 11577 break 11578 } 11579 if w0.AuxInt != j-16 { 11580 break 11581 } 11582 if w != w0.Args[0] { 11583 break 11584 } 11585 mem := x.Args[2] 11586 if !(x.Uses == 1 && clobber(x)) { 11587 break 11588 } 11589 v.reset(Op386MOVLstore) 11590 v.AuxInt = i - 2 11591 v.Aux = s 11592 v.AddArg(p) 11593 v.AddArg(w0) 11594 v.AddArg(mem) 11595 return true 11596 } 11597 return false 11598 } 11599 func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { 11600 b := v.Block 11601 _ = b 11602 config := b.Func.Config 11603 _ = config 11604 // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) 11605 // cond: ValAndOff(sc).canAdd(off) 11606 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 11607 for { 11608 sc := v.AuxInt 11609 s := v.Aux 11610 _ = v.Args[1] 11611 v_0 := v.Args[0] 11612 if v_0.Op != Op386ADDLconst { 11613 break 11614 } 11615 off := v_0.AuxInt 11616 ptr := v_0.Args[0] 11617 mem := v.Args[1] 11618 if !(ValAndOff(sc).canAdd(off)) { 11619 break 11620 } 11621 v.reset(Op386MOVWstoreconst) 11622 v.AuxInt = ValAndOff(sc).add(off) 11623 v.Aux = s 11624 v.AddArg(ptr) 11625 v.AddArg(mem) 11626 return true 11627 } 11628 // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) 11629 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) 11630 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 11631 for { 11632 sc := v.AuxInt 11633 sym1 := v.Aux 11634 _ = v.Args[1] 11635 v_0 := v.Args[0] 11636 if v_0.Op != Op386LEAL { 11637 break 11638 } 11639 off := v_0.AuxInt 11640 sym2 := v_0.Aux 11641 ptr := v_0.Args[0] 11642 mem := v.Args[1] 11643 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { 11644 break 11645 } 11646 v.reset(Op386MOVWstoreconst) 11647 v.AuxInt = ValAndOff(sc).add(off) 11648 v.Aux = mergeSym(sym1, sym2) 11649 v.AddArg(ptr) 11650 v.AddArg(mem) 11651 return true 11652 } 11653 // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) 11654 // cond: canMergeSym(sym1, sym2) 11655 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 11656 for { 11657 x := v.AuxInt 11658 sym1 := v.Aux 11659 _ = v.Args[1] 11660 v_0 := v.Args[0] 11661 if v_0.Op != Op386LEAL1 { 11662 break 11663 } 11664 off := v_0.AuxInt 11665 sym2 := v_0.Aux 11666 _ = v_0.Args[1] 11667 ptr := v_0.Args[0] 11668 idx := v_0.Args[1] 11669 mem := v.Args[1] 11670 if !(canMergeSym(sym1, sym2)) { 11671 break 11672 } 11673 v.reset(Op386MOVWstoreconstidx1) 11674 v.AuxInt = ValAndOff(x).add(off) 11675 v.Aux = mergeSym(sym1, sym2) 11676 v.AddArg(ptr) 11677 v.AddArg(idx) 11678 v.AddArg(mem) 11679 return true 11680 } 11681 // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) 11682 // cond: canMergeSym(sym1, sym2) 11683 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) 11684 for { 11685 x := v.AuxInt 11686 sym1 := v.Aux 11687 _ = v.Args[1] 11688 v_0 := v.Args[0] 11689 if v_0.Op != Op386LEAL2 { 11690 break 11691 } 11692 off := v_0.AuxInt 11693 sym2 := v_0.Aux 11694 _ = v_0.Args[1] 11695 ptr := v_0.Args[0] 11696 idx := v_0.Args[1] 11697 mem := v.Args[1] 11698 if !(canMergeSym(sym1, sym2)) { 11699 break 11700 } 11701 v.reset(Op386MOVWstoreconstidx2) 11702 v.AuxInt = ValAndOff(x).add(off) 11703 v.Aux = mergeSym(sym1, sym2) 11704 v.AddArg(ptr) 11705 v.AddArg(idx) 11706 v.AddArg(mem) 11707 return true 11708 } 11709 // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) 11710 // cond: 11711 // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) 11712 for { 11713 x := v.AuxInt 11714 sym := v.Aux 11715 _ = v.Args[1] 11716 v_0 := v.Args[0] 11717 if v_0.Op != Op386ADDL { 11718 break 11719 } 11720 _ = v_0.Args[1] 11721 ptr := v_0.Args[0] 11722 idx := v_0.Args[1] 11723 mem := v.Args[1] 11724 v.reset(Op386MOVWstoreconstidx1) 11725 v.AuxInt = x 11726 v.Aux = sym 11727 v.AddArg(ptr) 11728 v.AddArg(idx) 11729 v.AddArg(mem) 11730 return true 11731 } 11732 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 11733 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 11734 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 11735 for { 11736 c := v.AuxInt 11737 s := v.Aux 11738 _ = v.Args[1] 11739 p := v.Args[0] 11740 x := v.Args[1] 11741 if x.Op != Op386MOVWstoreconst { 11742 break 11743 } 11744 a := x.AuxInt 11745 if x.Aux != s { 11746 break 11747 } 11748 _ = x.Args[1] 11749 if p != x.Args[0] { 11750 break 11751 } 11752 mem := x.Args[1] 11753 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 11754 break 11755 } 11756 v.reset(Op386MOVLstoreconst) 11757 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 11758 v.Aux = s 11759 v.AddArg(p) 11760 v.AddArg(mem) 11761 return true 11762 } 11763 // match: (MOVWstoreconst [a] {s} p x:(MOVWstoreconst [c] {s} p mem)) 11764 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 11765 // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) 11766 for { 11767 a := v.AuxInt 11768 s := v.Aux 11769 _ = v.Args[1] 11770 p := v.Args[0] 11771 x := v.Args[1] 11772 if x.Op != Op386MOVWstoreconst { 11773 break 11774 } 11775 c := x.AuxInt 11776 if x.Aux != s { 11777 break 11778 } 11779 _ = x.Args[1] 11780 if p != x.Args[0] { 11781 break 11782 } 11783 mem := x.Args[1] 11784 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 11785 break 11786 } 11787 v.reset(Op386MOVLstoreconst) 11788 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 11789 v.Aux = s 11790 v.AddArg(p) 11791 v.AddArg(mem) 11792 return true 11793 } 11794 return false 11795 } 11796 func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { 11797 // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) 11798 // cond: 11799 // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) 11800 for { 11801 c := v.AuxInt 11802 sym := v.Aux 11803 _ = v.Args[2] 11804 ptr := v.Args[0] 11805 v_1 := v.Args[1] 11806 if v_1.Op != Op386SHLLconst { 11807 break 11808 } 11809 if v_1.AuxInt != 1 { 11810 break 11811 } 11812 idx := v_1.Args[0] 11813 mem := v.Args[2] 11814 v.reset(Op386MOVWstoreconstidx2) 11815 v.AuxInt = c 11816 v.Aux = sym 11817 v.AddArg(ptr) 11818 v.AddArg(idx) 11819 v.AddArg(mem) 11820 return true 11821 } 11822 // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) 11823 // cond: 11824 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 11825 for { 11826 x := v.AuxInt 11827 sym := v.Aux 11828 _ = v.Args[2] 11829 v_0 := v.Args[0] 11830 if v_0.Op != Op386ADDLconst { 11831 break 11832 } 11833 c := v_0.AuxInt 11834 ptr := v_0.Args[0] 11835 idx := v.Args[1] 11836 mem := v.Args[2] 11837 v.reset(Op386MOVWstoreconstidx1) 11838 v.AuxInt = ValAndOff(x).add(c) 11839 v.Aux = sym 11840 v.AddArg(ptr) 11841 v.AddArg(idx) 11842 v.AddArg(mem) 11843 return true 11844 } 11845 // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) 11846 // cond: 11847 // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) 11848 for { 11849 x := v.AuxInt 11850 sym := v.Aux 11851 _ = v.Args[2] 11852 ptr := v.Args[0] 11853 v_1 := v.Args[1] 11854 if v_1.Op != Op386ADDLconst { 11855 break 11856 } 11857 c := v_1.AuxInt 11858 idx := v_1.Args[0] 11859 mem := v.Args[2] 11860 v.reset(Op386MOVWstoreconstidx1) 11861 v.AuxInt = ValAndOff(x).add(c) 11862 v.Aux = sym 11863 v.AddArg(ptr) 11864 v.AddArg(idx) 11865 v.AddArg(mem) 11866 return true 11867 } 11868 // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) 11869 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 11870 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) 11871 for { 11872 c := v.AuxInt 11873 s := v.Aux 11874 _ = v.Args[2] 11875 p := v.Args[0] 11876 i := v.Args[1] 11877 x := v.Args[2] 11878 if x.Op != Op386MOVWstoreconstidx1 { 11879 break 11880 } 11881 a := x.AuxInt 11882 if x.Aux != s { 11883 break 11884 } 11885 _ = x.Args[2] 11886 if p != x.Args[0] { 11887 break 11888 } 11889 if i != x.Args[1] { 11890 break 11891 } 11892 mem := x.Args[2] 11893 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 11894 break 11895 } 11896 v.reset(Op386MOVLstoreconstidx1) 11897 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 11898 v.Aux = s 11899 v.AddArg(p) 11900 v.AddArg(i) 11901 v.AddArg(mem) 11902 return true 11903 } 11904 return false 11905 } 11906 func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { 11907 b := v.Block 11908 _ = b 11909 // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) 11910 // cond: 11911 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) 11912 for { 11913 x := v.AuxInt 11914 sym := v.Aux 11915 _ = v.Args[2] 11916 v_0 := v.Args[0] 11917 if v_0.Op != Op386ADDLconst { 11918 break 11919 } 11920 c := v_0.AuxInt 11921 ptr := v_0.Args[0] 11922 idx := v.Args[1] 11923 mem := v.Args[2] 11924 v.reset(Op386MOVWstoreconstidx2) 11925 v.AuxInt = ValAndOff(x).add(c) 11926 v.Aux = sym 11927 v.AddArg(ptr) 11928 v.AddArg(idx) 11929 v.AddArg(mem) 11930 return true 11931 } 11932 // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) 11933 // cond: 11934 // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) 11935 for { 11936 x := v.AuxInt 11937 sym := v.Aux 11938 _ = v.Args[2] 11939 ptr := v.Args[0] 11940 v_1 := v.Args[1] 11941 if v_1.Op != Op386ADDLconst { 11942 break 11943 } 11944 c := v_1.AuxInt 11945 idx := v_1.Args[0] 11946 mem := v.Args[2] 11947 v.reset(Op386MOVWstoreconstidx2) 11948 v.AuxInt = ValAndOff(x).add(2 * c) 11949 v.Aux = sym 11950 v.AddArg(ptr) 11951 v.AddArg(idx) 11952 v.AddArg(mem) 11953 return true 11954 } 11955 // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) 11956 // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 11957 // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst <i.Type> [1] i) mem) 11958 for { 11959 c := v.AuxInt 11960 s := v.Aux 11961 _ = v.Args[2] 11962 p := v.Args[0] 11963 i := v.Args[1] 11964 x := v.Args[2] 11965 if x.Op != Op386MOVWstoreconstidx2 { 11966 break 11967 } 11968 a := x.AuxInt 11969 if x.Aux != s { 11970 break 11971 } 11972 _ = x.Args[2] 11973 if p != x.Args[0] { 11974 break 11975 } 11976 if i != x.Args[1] { 11977 break 11978 } 11979 mem := x.Args[2] 11980 if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 11981 break 11982 } 11983 v.reset(Op386MOVLstoreconstidx1) 11984 v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) 11985 v.Aux = s 11986 v.AddArg(p) 11987 v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) 11988 v0.AuxInt = 1 11989 v0.AddArg(i) 11990 v.AddArg(v0) 11991 v.AddArg(mem) 11992 return true 11993 } 11994 return false 11995 } 11996 func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { 11997 // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) 11998 // cond: 11999 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 12000 for { 12001 c := v.AuxInt 12002 sym := v.Aux 12003 _ = v.Args[3] 12004 ptr := v.Args[0] 12005 v_1 := v.Args[1] 12006 if v_1.Op != Op386SHLLconst { 12007 break 12008 } 12009 if v_1.AuxInt != 1 { 12010 break 12011 } 12012 idx := v_1.Args[0] 12013 val := v.Args[2] 12014 mem := v.Args[3] 12015 v.reset(Op386MOVWstoreidx2) 12016 v.AuxInt = c 12017 v.Aux = sym 12018 v.AddArg(ptr) 12019 v.AddArg(idx) 12020 v.AddArg(val) 12021 v.AddArg(mem) 12022 return true 12023 } 12024 // match: (MOVWstoreidx1 [c] {sym} (SHLLconst [1] idx) ptr val mem) 12025 // cond: 12026 // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) 12027 for { 12028 c := v.AuxInt 12029 sym := v.Aux 12030 _ = v.Args[3] 12031 v_0 := v.Args[0] 12032 if v_0.Op != Op386SHLLconst { 12033 break 12034 } 12035 if v_0.AuxInt != 1 { 12036 break 12037 } 12038 idx := v_0.Args[0] 12039 ptr := v.Args[1] 12040 val := v.Args[2] 12041 mem := v.Args[3] 12042 v.reset(Op386MOVWstoreidx2) 12043 v.AuxInt = c 12044 v.Aux = sym 12045 v.AddArg(ptr) 12046 v.AddArg(idx) 12047 v.AddArg(val) 12048 v.AddArg(mem) 12049 return true 12050 } 12051 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) 12052 // cond: 12053 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 12054 for { 12055 c := v.AuxInt 12056 sym := v.Aux 12057 _ = v.Args[3] 12058 v_0 := v.Args[0] 12059 if v_0.Op != Op386ADDLconst { 12060 break 12061 } 12062 d := v_0.AuxInt 12063 ptr := v_0.Args[0] 12064 idx := v.Args[1] 12065 val := v.Args[2] 12066 mem := v.Args[3] 12067 v.reset(Op386MOVWstoreidx1) 12068 v.AuxInt = int64(int32(c + d)) 12069 v.Aux = sym 12070 v.AddArg(ptr) 12071 v.AddArg(idx) 12072 v.AddArg(val) 12073 v.AddArg(mem) 12074 return true 12075 } 12076 // match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) 12077 // cond: 12078 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 12079 for { 12080 c := v.AuxInt 12081 sym := v.Aux 12082 _ = v.Args[3] 12083 idx := v.Args[0] 12084 v_1 := v.Args[1] 12085 if v_1.Op != Op386ADDLconst { 12086 break 12087 } 12088 d := v_1.AuxInt 12089 ptr := v_1.Args[0] 12090 val := v.Args[2] 12091 mem := v.Args[3] 12092 v.reset(Op386MOVWstoreidx1) 12093 v.AuxInt = int64(int32(c + d)) 12094 v.Aux = sym 12095 v.AddArg(ptr) 12096 v.AddArg(idx) 12097 v.AddArg(val) 12098 v.AddArg(mem) 12099 return true 12100 } 12101 // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) 12102 // cond: 12103 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 12104 for { 12105 c := v.AuxInt 12106 sym := v.Aux 12107 _ = v.Args[3] 12108 ptr := v.Args[0] 12109 v_1 := v.Args[1] 12110 if v_1.Op != Op386ADDLconst { 12111 break 12112 } 12113 d := v_1.AuxInt 12114 idx := v_1.Args[0] 12115 val := v.Args[2] 12116 mem := v.Args[3] 12117 v.reset(Op386MOVWstoreidx1) 12118 v.AuxInt = int64(int32(c + d)) 12119 v.Aux = sym 12120 v.AddArg(ptr) 12121 v.AddArg(idx) 12122 v.AddArg(val) 12123 v.AddArg(mem) 12124 return true 12125 } 12126 // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) 12127 // cond: 12128 // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) 12129 for { 12130 c := v.AuxInt 12131 sym := v.Aux 12132 _ = v.Args[3] 12133 v_0 := v.Args[0] 12134 if v_0.Op != Op386ADDLconst { 12135 break 12136 } 12137 d := v_0.AuxInt 12138 idx := v_0.Args[0] 12139 ptr := v.Args[1] 12140 val := v.Args[2] 12141 mem := v.Args[3] 12142 v.reset(Op386MOVWstoreidx1) 12143 v.AuxInt = int64(int32(c + d)) 12144 v.Aux = sym 12145 v.AddArg(ptr) 12146 v.AddArg(idx) 12147 v.AddArg(val) 12148 v.AddArg(mem) 12149 return true 12150 } 12151 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 12152 // cond: x.Uses == 1 && clobber(x) 12153 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 12154 for { 12155 i := v.AuxInt 12156 s := v.Aux 12157 _ = v.Args[3] 12158 p := v.Args[0] 12159 idx := v.Args[1] 12160 v_2 := v.Args[2] 12161 if v_2.Op != Op386SHRLconst { 12162 break 12163 } 12164 if v_2.AuxInt != 16 { 12165 break 12166 } 12167 w := v_2.Args[0] 12168 x := v.Args[3] 12169 if x.Op != Op386MOVWstoreidx1 { 12170 break 12171 } 12172 if x.AuxInt != i-2 { 12173 break 12174 } 12175 if x.Aux != s { 12176 break 12177 } 12178 _ = x.Args[3] 12179 if p != x.Args[0] { 12180 break 12181 } 12182 if idx != x.Args[1] { 12183 break 12184 } 12185 if w != x.Args[2] { 12186 break 12187 } 12188 mem := x.Args[3] 12189 if !(x.Uses == 1 && clobber(x)) { 12190 break 12191 } 12192 v.reset(Op386MOVLstoreidx1) 12193 v.AuxInt = i - 2 12194 v.Aux = s 12195 v.AddArg(p) 12196 v.AddArg(idx) 12197 v.AddArg(w) 12198 v.AddArg(mem) 12199 return true 12200 } 12201 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 12202 // cond: x.Uses == 1 && clobber(x) 12203 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 12204 for { 12205 i := v.AuxInt 12206 s := v.Aux 12207 _ = v.Args[3] 12208 p := v.Args[0] 12209 idx := v.Args[1] 12210 v_2 := v.Args[2] 12211 if v_2.Op != Op386SHRLconst { 12212 break 12213 } 12214 if v_2.AuxInt != 16 { 12215 break 12216 } 12217 w := v_2.Args[0] 12218 x := v.Args[3] 12219 if x.Op != Op386MOVWstoreidx1 { 12220 break 12221 } 12222 if x.AuxInt != i-2 { 12223 break 12224 } 12225 if x.Aux != s { 12226 break 12227 } 12228 _ = x.Args[3] 12229 if idx != x.Args[0] { 12230 break 12231 } 12232 if p != x.Args[1] { 12233 break 12234 } 12235 if w != x.Args[2] { 12236 break 12237 } 12238 mem := x.Args[3] 12239 if !(x.Uses == 1 && clobber(x)) { 12240 break 12241 } 12242 v.reset(Op386MOVLstoreidx1) 12243 v.AuxInt = i - 2 12244 v.Aux = s 12245 v.AddArg(p) 12246 v.AddArg(idx) 12247 v.AddArg(w) 12248 v.AddArg(mem) 12249 return true 12250 } 12251 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) 12252 // cond: x.Uses == 1 && clobber(x) 12253 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 12254 for { 12255 i := v.AuxInt 12256 s := v.Aux 12257 _ = v.Args[3] 12258 idx := v.Args[0] 12259 p := v.Args[1] 12260 v_2 := v.Args[2] 12261 if v_2.Op != Op386SHRLconst { 12262 break 12263 } 12264 if v_2.AuxInt != 16 { 12265 break 12266 } 12267 w := v_2.Args[0] 12268 x := v.Args[3] 12269 if x.Op != Op386MOVWstoreidx1 { 12270 break 12271 } 12272 if x.AuxInt != i-2 { 12273 break 12274 } 12275 if x.Aux != s { 12276 break 12277 } 12278 _ = x.Args[3] 12279 if p != x.Args[0] { 12280 break 12281 } 12282 if idx != x.Args[1] { 12283 break 12284 } 12285 if w != x.Args[2] { 12286 break 12287 } 12288 mem := x.Args[3] 12289 if !(x.Uses == 1 && clobber(x)) { 12290 break 12291 } 12292 v.reset(Op386MOVLstoreidx1) 12293 v.AuxInt = i - 2 12294 v.Aux = s 12295 v.AddArg(p) 12296 v.AddArg(idx) 12297 v.AddArg(w) 12298 v.AddArg(mem) 12299 return true 12300 } 12301 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) 12302 // cond: x.Uses == 1 && clobber(x) 12303 // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) 12304 for { 12305 i := v.AuxInt 12306 s := v.Aux 12307 _ = v.Args[3] 12308 idx := v.Args[0] 12309 p := v.Args[1] 12310 v_2 := v.Args[2] 12311 if v_2.Op != Op386SHRLconst { 12312 break 12313 } 12314 if v_2.AuxInt != 16 { 12315 break 12316 } 12317 w := v_2.Args[0] 12318 x := v.Args[3] 12319 if x.Op != Op386MOVWstoreidx1 { 12320 break 12321 } 12322 if x.AuxInt != i-2 { 12323 break 12324 } 12325 if x.Aux != s { 12326 break 12327 } 12328 _ = x.Args[3] 12329 if idx != x.Args[0] { 12330 break 12331 } 12332 if p != x.Args[1] { 12333 break 12334 } 12335 if w != x.Args[2] { 12336 break 12337 } 12338 mem := x.Args[3] 12339 if !(x.Uses == 1 && clobber(x)) { 12340 break 12341 } 12342 v.reset(Op386MOVLstoreidx1) 12343 v.AuxInt = i - 2 12344 v.Aux = s 12345 v.AddArg(p) 12346 v.AddArg(idx) 12347 v.AddArg(w) 12348 v.AddArg(mem) 12349 return true 12350 } 12351 return false 12352 } 12353 func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { 12354 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 12355 // cond: x.Uses == 1 && clobber(x) 12356 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 12357 for { 12358 i := v.AuxInt 12359 s := v.Aux 12360 _ = v.Args[3] 12361 p := v.Args[0] 12362 idx := v.Args[1] 12363 v_2 := v.Args[2] 12364 if v_2.Op != Op386SHRLconst { 12365 break 12366 } 12367 j := v_2.AuxInt 12368 w := v_2.Args[0] 12369 x := v.Args[3] 12370 if x.Op != Op386MOVWstoreidx1 { 12371 break 12372 } 12373 if x.AuxInt != i-2 { 12374 break 12375 } 12376 if x.Aux != s { 12377 break 12378 } 12379 _ = x.Args[3] 12380 if p != x.Args[0] { 12381 break 12382 } 12383 if idx != x.Args[1] { 12384 break 12385 } 12386 w0 := x.Args[2] 12387 if w0.Op != Op386SHRLconst { 12388 break 12389 } 12390 if w0.AuxInt != j-16 { 12391 break 12392 } 12393 if w != w0.Args[0] { 12394 break 12395 } 12396 mem := x.Args[3] 12397 if !(x.Uses == 1 && clobber(x)) { 12398 break 12399 } 12400 v.reset(Op386MOVLstoreidx1) 12401 v.AuxInt = i - 2 12402 v.Aux = s 12403 v.AddArg(p) 12404 v.AddArg(idx) 12405 v.AddArg(w0) 12406 v.AddArg(mem) 12407 return true 12408 } 12409 // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 12410 // cond: x.Uses == 1 && clobber(x) 12411 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 12412 for { 12413 i := v.AuxInt 12414 s := v.Aux 12415 _ = v.Args[3] 12416 p := v.Args[0] 12417 idx := v.Args[1] 12418 v_2 := v.Args[2] 12419 if v_2.Op != Op386SHRLconst { 12420 break 12421 } 12422 j := v_2.AuxInt 12423 w := v_2.Args[0] 12424 x := v.Args[3] 12425 if x.Op != Op386MOVWstoreidx1 { 12426 break 12427 } 12428 if x.AuxInt != i-2 { 12429 break 12430 } 12431 if x.Aux != s { 12432 break 12433 } 12434 _ = x.Args[3] 12435 if idx != x.Args[0] { 12436 break 12437 } 12438 if p != x.Args[1] { 12439 break 12440 } 12441 w0 := x.Args[2] 12442 if w0.Op != Op386SHRLconst { 12443 break 12444 } 12445 if w0.AuxInt != j-16 { 12446 break 12447 } 12448 if w != w0.Args[0] { 12449 break 12450 } 12451 mem := x.Args[3] 12452 if !(x.Uses == 1 && clobber(x)) { 12453 break 12454 } 12455 v.reset(Op386MOVLstoreidx1) 12456 v.AuxInt = i - 2 12457 v.Aux = s 12458 v.AddArg(p) 12459 v.AddArg(idx) 12460 v.AddArg(w0) 12461 v.AddArg(mem) 12462 return true 12463 } 12464 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 12465 // cond: x.Uses == 1 && clobber(x) 12466 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 12467 for { 12468 i := v.AuxInt 12469 s := v.Aux 12470 _ = v.Args[3] 12471 idx := v.Args[0] 12472 p := v.Args[1] 12473 v_2 := v.Args[2] 12474 if v_2.Op != Op386SHRLconst { 12475 break 12476 } 12477 j := v_2.AuxInt 12478 w := v_2.Args[0] 12479 x := v.Args[3] 12480 if x.Op != Op386MOVWstoreidx1 { 12481 break 12482 } 12483 if x.AuxInt != i-2 { 12484 break 12485 } 12486 if x.Aux != s { 12487 break 12488 } 12489 _ = x.Args[3] 12490 if p != x.Args[0] { 12491 break 12492 } 12493 if idx != x.Args[1] { 12494 break 12495 } 12496 w0 := x.Args[2] 12497 if w0.Op != Op386SHRLconst { 12498 break 12499 } 12500 if w0.AuxInt != j-16 { 12501 break 12502 } 12503 if w != w0.Args[0] { 12504 break 12505 } 12506 mem := x.Args[3] 12507 if !(x.Uses == 1 && clobber(x)) { 12508 break 12509 } 12510 v.reset(Op386MOVLstoreidx1) 12511 v.AuxInt = i - 2 12512 v.Aux = s 12513 v.AddArg(p) 12514 v.AddArg(idx) 12515 v.AddArg(w0) 12516 v.AddArg(mem) 12517 return true 12518 } 12519 // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) 12520 // cond: x.Uses == 1 && clobber(x) 12521 // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) 12522 for { 12523 i := v.AuxInt 12524 s := v.Aux 12525 _ = v.Args[3] 12526 idx := v.Args[0] 12527 p := v.Args[1] 12528 v_2 := v.Args[2] 12529 if v_2.Op != Op386SHRLconst { 12530 break 12531 } 12532 j := v_2.AuxInt 12533 w := v_2.Args[0] 12534 x := v.Args[3] 12535 if x.Op != Op386MOVWstoreidx1 { 12536 break 12537 } 12538 if x.AuxInt != i-2 { 12539 break 12540 } 12541 if x.Aux != s { 12542 break 12543 } 12544 _ = x.Args[3] 12545 if idx != x.Args[0] { 12546 break 12547 } 12548 if p != x.Args[1] { 12549 break 12550 } 12551 w0 := x.Args[2] 12552 if w0.Op != Op386SHRLconst { 12553 break 12554 } 12555 if w0.AuxInt != j-16 { 12556 break 12557 } 12558 if w != w0.Args[0] { 12559 break 12560 } 12561 mem := x.Args[3] 12562 if !(x.Uses == 1 && clobber(x)) { 12563 break 12564 } 12565 v.reset(Op386MOVLstoreidx1) 12566 v.AuxInt = i - 2 12567 v.Aux = s 12568 v.AddArg(p) 12569 v.AddArg(idx) 12570 v.AddArg(w0) 12571 v.AddArg(mem) 12572 return true 12573 } 12574 return false 12575 } 12576 func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { 12577 b := v.Block 12578 _ = b 12579 // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) 12580 // cond: 12581 // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem) 12582 for { 12583 c := v.AuxInt 12584 sym := v.Aux 12585 _ = v.Args[3] 12586 v_0 := v.Args[0] 12587 if v_0.Op != Op386ADDLconst { 12588 break 12589 } 12590 d := v_0.AuxInt 12591 ptr := v_0.Args[0] 12592 idx := v.Args[1] 12593 val := v.Args[2] 12594 mem := v.Args[3] 12595 v.reset(Op386MOVWstoreidx2) 12596 v.AuxInt = int64(int32(c + d)) 12597 v.Aux = sym 12598 v.AddArg(ptr) 12599 v.AddArg(idx) 12600 v.AddArg(val) 12601 v.AddArg(mem) 12602 return true 12603 } 12604 // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) 12605 // cond: 12606 // result: (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem) 12607 for { 12608 c := v.AuxInt 12609 sym := v.Aux 12610 _ = v.Args[3] 12611 ptr := v.Args[0] 12612 v_1 := v.Args[1] 12613 if v_1.Op != Op386ADDLconst { 12614 break 12615 } 12616 d := v_1.AuxInt 12617 idx := v_1.Args[0] 12618 val := v.Args[2] 12619 mem := v.Args[3] 12620 v.reset(Op386MOVWstoreidx2) 12621 v.AuxInt = int64(int32(c + 2*d)) 12622 v.Aux = sym 12623 v.AddArg(ptr) 12624 v.AddArg(idx) 12625 v.AddArg(val) 12626 v.AddArg(mem) 12627 return true 12628 } 12629 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) 12630 // cond: x.Uses == 1 && clobber(x) 12631 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w mem) 12632 for { 12633 i := v.AuxInt 12634 s := v.Aux 12635 _ = v.Args[3] 12636 p := v.Args[0] 12637 idx := v.Args[1] 12638 v_2 := v.Args[2] 12639 if v_2.Op != Op386SHRLconst { 12640 break 12641 } 12642 if v_2.AuxInt != 16 { 12643 break 12644 } 12645 w := v_2.Args[0] 12646 x := v.Args[3] 12647 if x.Op != Op386MOVWstoreidx2 { 12648 break 12649 } 12650 if x.AuxInt != i-2 { 12651 break 12652 } 12653 if x.Aux != s { 12654 break 12655 } 12656 _ = x.Args[3] 12657 if p != x.Args[0] { 12658 break 12659 } 12660 if idx != x.Args[1] { 12661 break 12662 } 12663 if w != x.Args[2] { 12664 break 12665 } 12666 mem := x.Args[3] 12667 if !(x.Uses == 1 && clobber(x)) { 12668 break 12669 } 12670 v.reset(Op386MOVLstoreidx1) 12671 v.AuxInt = i - 2 12672 v.Aux = s 12673 v.AddArg(p) 12674 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 12675 v0.AuxInt = 1 12676 v0.AddArg(idx) 12677 v.AddArg(v0) 12678 v.AddArg(w) 12679 v.AddArg(mem) 12680 return true 12681 } 12682 // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) 12683 // cond: x.Uses == 1 && clobber(x) 12684 // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst <idx.Type> [1] idx) w0 mem) 12685 for { 12686 i := v.AuxInt 12687 s := v.Aux 12688 _ = v.Args[3] 12689 p := v.Args[0] 12690 idx := v.Args[1] 12691 v_2 := v.Args[2] 12692 if v_2.Op != Op386SHRLconst { 12693 break 12694 } 12695 j := v_2.AuxInt 12696 w := v_2.Args[0] 12697 x := v.Args[3] 12698 if x.Op != Op386MOVWstoreidx2 { 12699 break 12700 } 12701 if x.AuxInt != i-2 { 12702 break 12703 } 12704 if x.Aux != s { 12705 break 12706 } 12707 _ = x.Args[3] 12708 if p != x.Args[0] { 12709 break 12710 } 12711 if idx != x.Args[1] { 12712 break 12713 } 12714 w0 := x.Args[2] 12715 if w0.Op != Op386SHRLconst { 12716 break 12717 } 12718 if w0.AuxInt != j-16 { 12719 break 12720 } 12721 if w != w0.Args[0] { 12722 break 12723 } 12724 mem := x.Args[3] 12725 if !(x.Uses == 1 && clobber(x)) { 12726 break 12727 } 12728 v.reset(Op386MOVLstoreidx1) 12729 v.AuxInt = i - 2 12730 v.Aux = s 12731 v.AddArg(p) 12732 v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) 12733 v0.AuxInt = 1 12734 v0.AddArg(idx) 12735 v.AddArg(v0) 12736 v.AddArg(w0) 12737 v.AddArg(mem) 12738 return true 12739 } 12740 return false 12741 } 12742 func rewriteValue386_Op386MULL_0(v *Value) bool { 12743 // match: (MULL x (MOVLconst [c])) 12744 // cond: 12745 // result: (MULLconst [c] x) 12746 for { 12747 _ = v.Args[1] 12748 x := v.Args[0] 12749 v_1 := v.Args[1] 12750 if v_1.Op != Op386MOVLconst { 12751 break 12752 } 12753 c := v_1.AuxInt 12754 v.reset(Op386MULLconst) 12755 v.AuxInt = c 12756 v.AddArg(x) 12757 return true 12758 } 12759 // match: (MULL (MOVLconst [c]) x) 12760 // cond: 12761 // result: (MULLconst [c] x) 12762 for { 12763 _ = v.Args[1] 12764 v_0 := v.Args[0] 12765 if v_0.Op != Op386MOVLconst { 12766 break 12767 } 12768 c := v_0.AuxInt 12769 x := v.Args[1] 12770 v.reset(Op386MULLconst) 12771 v.AuxInt = c 12772 v.AddArg(x) 12773 return true 12774 } 12775 // match: (MULL x l:(MOVLload [off] {sym} ptr mem)) 12776 // cond: canMergeLoad(v, l, x) && clobber(l) 12777 // result: (MULLload x [off] {sym} ptr mem) 12778 for { 12779 _ = v.Args[1] 12780 x := v.Args[0] 12781 l := v.Args[1] 12782 if l.Op != Op386MOVLload { 12783 break 12784 } 12785 off := l.AuxInt 12786 sym := l.Aux 12787 _ = l.Args[1] 12788 ptr := l.Args[0] 12789 mem := l.Args[1] 12790 if !(canMergeLoad(v, l, x) && clobber(l)) { 12791 break 12792 } 12793 v.reset(Op386MULLload) 12794 v.AuxInt = off 12795 v.Aux = sym 12796 v.AddArg(x) 12797 v.AddArg(ptr) 12798 v.AddArg(mem) 12799 return true 12800 } 12801 // match: (MULL l:(MOVLload [off] {sym} ptr mem) x) 12802 // cond: canMergeLoad(v, l, x) && clobber(l) 12803 // result: (MULLload x [off] {sym} ptr mem) 12804 for { 12805 _ = v.Args[1] 12806 l := v.Args[0] 12807 if l.Op != Op386MOVLload { 12808 break 12809 } 12810 off := l.AuxInt 12811 sym := l.Aux 12812 _ = l.Args[1] 12813 ptr := l.Args[0] 12814 mem := l.Args[1] 12815 x := v.Args[1] 12816 if !(canMergeLoad(v, l, x) && clobber(l)) { 12817 break 12818 } 12819 v.reset(Op386MULLload) 12820 v.AuxInt = off 12821 v.Aux = sym 12822 v.AddArg(x) 12823 v.AddArg(ptr) 12824 v.AddArg(mem) 12825 return true 12826 } 12827 // match: (MULL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) 12828 // cond: canMergeLoad(v, l, x) && clobber(l) 12829 // result: (MULLloadidx4 x [off] {sym} ptr idx mem) 12830 for { 12831 _ = v.Args[1] 12832 x := v.Args[0] 12833 l := v.Args[1] 12834 if l.Op != Op386MOVLloadidx4 { 12835 break 12836 } 12837 off := l.AuxInt 12838 sym := l.Aux 12839 _ = l.Args[2] 12840 ptr := l.Args[0] 12841 idx := l.Args[1] 12842 mem := l.Args[2] 12843 if !(canMergeLoad(v, l, x) && clobber(l)) { 12844 break 12845 } 12846 v.reset(Op386MULLloadidx4) 12847 v.AuxInt = off 12848 v.Aux = sym 12849 v.AddArg(x) 12850 v.AddArg(ptr) 12851 v.AddArg(idx) 12852 v.AddArg(mem) 12853 return true 12854 } 12855 // match: (MULL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) 12856 // cond: canMergeLoad(v, l, x) && clobber(l) 12857 // result: (MULLloadidx4 x [off] {sym} ptr idx mem) 12858 for { 12859 _ = v.Args[1] 12860 l := v.Args[0] 12861 if l.Op != Op386MOVLloadidx4 { 12862 break 12863 } 12864 off := l.AuxInt 12865 sym := l.Aux 12866 _ = l.Args[2] 12867 ptr := l.Args[0] 12868 idx := l.Args[1] 12869 mem := l.Args[2] 12870 x := v.Args[1] 12871 if !(canMergeLoad(v, l, x) && clobber(l)) { 12872 break 12873 } 12874 v.reset(Op386MULLloadidx4) 12875 v.AuxInt = off 12876 v.Aux = sym 12877 v.AddArg(x) 12878 v.AddArg(ptr) 12879 v.AddArg(idx) 12880 v.AddArg(mem) 12881 return true 12882 } 12883 return false 12884 } 12885 func rewriteValue386_Op386MULLconst_0(v *Value) bool { 12886 b := v.Block 12887 _ = b 12888 // match: (MULLconst [c] (MULLconst [d] x)) 12889 // cond: 12890 // result: (MULLconst [int64(int32(c * d))] x) 12891 for { 12892 c := v.AuxInt 12893 v_0 := v.Args[0] 12894 if v_0.Op != Op386MULLconst { 12895 break 12896 } 12897 d := v_0.AuxInt 12898 x := v_0.Args[0] 12899 v.reset(Op386MULLconst) 12900 v.AuxInt = int64(int32(c * d)) 12901 v.AddArg(x) 12902 return true 12903 } 12904 // match: (MULLconst [-9] x) 12905 // cond: 12906 // result: (NEGL (LEAL8 <v.Type> x x)) 12907 for { 12908 if v.AuxInt != -9 { 12909 break 12910 } 12911 x := v.Args[0] 12912 v.reset(Op386NEGL) 12913 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 12914 v0.AddArg(x) 12915 v0.AddArg(x) 12916 v.AddArg(v0) 12917 return true 12918 } 12919 // match: (MULLconst [-5] x) 12920 // cond: 12921 // result: (NEGL (LEAL4 <v.Type> x x)) 12922 for { 12923 if v.AuxInt != -5 { 12924 break 12925 } 12926 x := v.Args[0] 12927 v.reset(Op386NEGL) 12928 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 12929 v0.AddArg(x) 12930 v0.AddArg(x) 12931 v.AddArg(v0) 12932 return true 12933 } 12934 // match: (MULLconst [-3] x) 12935 // cond: 12936 // result: (NEGL (LEAL2 <v.Type> x x)) 12937 for { 12938 if v.AuxInt != -3 { 12939 break 12940 } 12941 x := v.Args[0] 12942 v.reset(Op386NEGL) 12943 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 12944 v0.AddArg(x) 12945 v0.AddArg(x) 12946 v.AddArg(v0) 12947 return true 12948 } 12949 // match: (MULLconst [-1] x) 12950 // cond: 12951 // result: (NEGL x) 12952 for { 12953 if v.AuxInt != -1 { 12954 break 12955 } 12956 x := v.Args[0] 12957 v.reset(Op386NEGL) 12958 v.AddArg(x) 12959 return true 12960 } 12961 // match: (MULLconst [0] _) 12962 // cond: 12963 // result: (MOVLconst [0]) 12964 for { 12965 if v.AuxInt != 0 { 12966 break 12967 } 12968 v.reset(Op386MOVLconst) 12969 v.AuxInt = 0 12970 return true 12971 } 12972 // match: (MULLconst [1] x) 12973 // cond: 12974 // result: x 12975 for { 12976 if v.AuxInt != 1 { 12977 break 12978 } 12979 x := v.Args[0] 12980 v.reset(OpCopy) 12981 v.Type = x.Type 12982 v.AddArg(x) 12983 return true 12984 } 12985 // match: (MULLconst [3] x) 12986 // cond: 12987 // result: (LEAL2 x x) 12988 for { 12989 if v.AuxInt != 3 { 12990 break 12991 } 12992 x := v.Args[0] 12993 v.reset(Op386LEAL2) 12994 v.AddArg(x) 12995 v.AddArg(x) 12996 return true 12997 } 12998 // match: (MULLconst [5] x) 12999 // cond: 13000 // result: (LEAL4 x x) 13001 for { 13002 if v.AuxInt != 5 { 13003 break 13004 } 13005 x := v.Args[0] 13006 v.reset(Op386LEAL4) 13007 v.AddArg(x) 13008 v.AddArg(x) 13009 return true 13010 } 13011 // match: (MULLconst [7] x) 13012 // cond: 13013 // result: (LEAL2 x (LEAL2 <v.Type> x x)) 13014 for { 13015 if v.AuxInt != 7 { 13016 break 13017 } 13018 x := v.Args[0] 13019 v.reset(Op386LEAL2) 13020 v.AddArg(x) 13021 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 13022 v0.AddArg(x) 13023 v0.AddArg(x) 13024 v.AddArg(v0) 13025 return true 13026 } 13027 return false 13028 } 13029 func rewriteValue386_Op386MULLconst_10(v *Value) bool { 13030 b := v.Block 13031 _ = b 13032 // match: (MULLconst [9] x) 13033 // cond: 13034 // result: (LEAL8 x x) 13035 for { 13036 if v.AuxInt != 9 { 13037 break 13038 } 13039 x := v.Args[0] 13040 v.reset(Op386LEAL8) 13041 v.AddArg(x) 13042 v.AddArg(x) 13043 return true 13044 } 13045 // match: (MULLconst [11] x) 13046 // cond: 13047 // result: (LEAL2 x (LEAL4 <v.Type> x x)) 13048 for { 13049 if v.AuxInt != 11 { 13050 break 13051 } 13052 x := v.Args[0] 13053 v.reset(Op386LEAL2) 13054 v.AddArg(x) 13055 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 13056 v0.AddArg(x) 13057 v0.AddArg(x) 13058 v.AddArg(v0) 13059 return true 13060 } 13061 // match: (MULLconst [13] x) 13062 // cond: 13063 // result: (LEAL4 x (LEAL2 <v.Type> x x)) 13064 for { 13065 if v.AuxInt != 13 { 13066 break 13067 } 13068 x := v.Args[0] 13069 v.reset(Op386LEAL4) 13070 v.AddArg(x) 13071 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 13072 v0.AddArg(x) 13073 v0.AddArg(x) 13074 v.AddArg(v0) 13075 return true 13076 } 13077 // match: (MULLconst [19] x) 13078 // cond: 13079 // result: (LEAL2 x (LEAL8 <v.Type> x x)) 13080 for { 13081 if v.AuxInt != 19 { 13082 break 13083 } 13084 x := v.Args[0] 13085 v.reset(Op386LEAL2) 13086 v.AddArg(x) 13087 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 13088 v0.AddArg(x) 13089 v0.AddArg(x) 13090 v.AddArg(v0) 13091 return true 13092 } 13093 // match: (MULLconst [21] x) 13094 // cond: 13095 // result: (LEAL4 x (LEAL4 <v.Type> x x)) 13096 for { 13097 if v.AuxInt != 21 { 13098 break 13099 } 13100 x := v.Args[0] 13101 v.reset(Op386LEAL4) 13102 v.AddArg(x) 13103 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 13104 v0.AddArg(x) 13105 v0.AddArg(x) 13106 v.AddArg(v0) 13107 return true 13108 } 13109 // match: (MULLconst [25] x) 13110 // cond: 13111 // result: (LEAL8 x (LEAL2 <v.Type> x x)) 13112 for { 13113 if v.AuxInt != 25 { 13114 break 13115 } 13116 x := v.Args[0] 13117 v.reset(Op386LEAL8) 13118 v.AddArg(x) 13119 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 13120 v0.AddArg(x) 13121 v0.AddArg(x) 13122 v.AddArg(v0) 13123 return true 13124 } 13125 // match: (MULLconst [27] x) 13126 // cond: 13127 // result: (LEAL8 (LEAL2 <v.Type> x x) (LEAL2 <v.Type> x x)) 13128 for { 13129 if v.AuxInt != 27 { 13130 break 13131 } 13132 x := v.Args[0] 13133 v.reset(Op386LEAL8) 13134 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 13135 v0.AddArg(x) 13136 v0.AddArg(x) 13137 v.AddArg(v0) 13138 v1 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 13139 v1.AddArg(x) 13140 v1.AddArg(x) 13141 v.AddArg(v1) 13142 return true 13143 } 13144 // match: (MULLconst [37] x) 13145 // cond: 13146 // result: (LEAL4 x (LEAL8 <v.Type> x x)) 13147 for { 13148 if v.AuxInt != 37 { 13149 break 13150 } 13151 x := v.Args[0] 13152 v.reset(Op386LEAL4) 13153 v.AddArg(x) 13154 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 13155 v0.AddArg(x) 13156 v0.AddArg(x) 13157 v.AddArg(v0) 13158 return true 13159 } 13160 // match: (MULLconst [41] x) 13161 // cond: 13162 // result: (LEAL8 x (LEAL4 <v.Type> x x)) 13163 for { 13164 if v.AuxInt != 41 { 13165 break 13166 } 13167 x := v.Args[0] 13168 v.reset(Op386LEAL8) 13169 v.AddArg(x) 13170 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 13171 v0.AddArg(x) 13172 v0.AddArg(x) 13173 v.AddArg(v0) 13174 return true 13175 } 13176 // match: (MULLconst [45] x) 13177 // cond: 13178 // result: (LEAL8 (LEAL4 <v.Type> x x) (LEAL4 <v.Type> x x)) 13179 for { 13180 if v.AuxInt != 45 { 13181 break 13182 } 13183 x := v.Args[0] 13184 v.reset(Op386LEAL8) 13185 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 13186 v0.AddArg(x) 13187 v0.AddArg(x) 13188 v.AddArg(v0) 13189 v1 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 13190 v1.AddArg(x) 13191 v1.AddArg(x) 13192 v.AddArg(v1) 13193 return true 13194 } 13195 return false 13196 } 13197 func rewriteValue386_Op386MULLconst_20(v *Value) bool { 13198 b := v.Block 13199 _ = b 13200 // match: (MULLconst [73] x) 13201 // cond: 13202 // result: (LEAL8 x (LEAL8 <v.Type> x x)) 13203 for { 13204 if v.AuxInt != 73 { 13205 break 13206 } 13207 x := v.Args[0] 13208 v.reset(Op386LEAL8) 13209 v.AddArg(x) 13210 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 13211 v0.AddArg(x) 13212 v0.AddArg(x) 13213 v.AddArg(v0) 13214 return true 13215 } 13216 // match: (MULLconst [81] x) 13217 // cond: 13218 // result: (LEAL8 (LEAL8 <v.Type> x x) (LEAL8 <v.Type> x x)) 13219 for { 13220 if v.AuxInt != 81 { 13221 break 13222 } 13223 x := v.Args[0] 13224 v.reset(Op386LEAL8) 13225 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 13226 v0.AddArg(x) 13227 v0.AddArg(x) 13228 v.AddArg(v0) 13229 v1 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 13230 v1.AddArg(x) 13231 v1.AddArg(x) 13232 v.AddArg(v1) 13233 return true 13234 } 13235 // match: (MULLconst [c] x) 13236 // cond: isPowerOfTwo(c+1) && c >= 15 13237 // result: (SUBL (SHLLconst <v.Type> [log2(c+1)] x) x) 13238 for { 13239 c := v.AuxInt 13240 x := v.Args[0] 13241 if !(isPowerOfTwo(c+1) && c >= 15) { 13242 break 13243 } 13244 v.reset(Op386SUBL) 13245 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 13246 v0.AuxInt = log2(c + 1) 13247 v0.AddArg(x) 13248 v.AddArg(v0) 13249 v.AddArg(x) 13250 return true 13251 } 13252 // match: (MULLconst [c] x) 13253 // cond: isPowerOfTwo(c-1) && c >= 17 13254 // result: (LEAL1 (SHLLconst <v.Type> [log2(c-1)] x) x) 13255 for { 13256 c := v.AuxInt 13257 x := v.Args[0] 13258 if !(isPowerOfTwo(c-1) && c >= 17) { 13259 break 13260 } 13261 v.reset(Op386LEAL1) 13262 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 13263 v0.AuxInt = log2(c - 1) 13264 v0.AddArg(x) 13265 v.AddArg(v0) 13266 v.AddArg(x) 13267 return true 13268 } 13269 // match: (MULLconst [c] x) 13270 // cond: isPowerOfTwo(c-2) && c >= 34 13271 // result: (LEAL2 (SHLLconst <v.Type> [log2(c-2)] x) x) 13272 for { 13273 c := v.AuxInt 13274 x := v.Args[0] 13275 if !(isPowerOfTwo(c-2) && c >= 34) { 13276 break 13277 } 13278 v.reset(Op386LEAL2) 13279 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 13280 v0.AuxInt = log2(c - 2) 13281 v0.AddArg(x) 13282 v.AddArg(v0) 13283 v.AddArg(x) 13284 return true 13285 } 13286 // match: (MULLconst [c] x) 13287 // cond: isPowerOfTwo(c-4) && c >= 68 13288 // result: (LEAL4 (SHLLconst <v.Type> [log2(c-4)] x) x) 13289 for { 13290 c := v.AuxInt 13291 x := v.Args[0] 13292 if !(isPowerOfTwo(c-4) && c >= 68) { 13293 break 13294 } 13295 v.reset(Op386LEAL4) 13296 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 13297 v0.AuxInt = log2(c - 4) 13298 v0.AddArg(x) 13299 v.AddArg(v0) 13300 v.AddArg(x) 13301 return true 13302 } 13303 // match: (MULLconst [c] x) 13304 // cond: isPowerOfTwo(c-8) && c >= 136 13305 // result: (LEAL8 (SHLLconst <v.Type> [log2(c-8)] x) x) 13306 for { 13307 c := v.AuxInt 13308 x := v.Args[0] 13309 if !(isPowerOfTwo(c-8) && c >= 136) { 13310 break 13311 } 13312 v.reset(Op386LEAL8) 13313 v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) 13314 v0.AuxInt = log2(c - 8) 13315 v0.AddArg(x) 13316 v.AddArg(v0) 13317 v.AddArg(x) 13318 return true 13319 } 13320 // match: (MULLconst [c] x) 13321 // cond: c%3 == 0 && isPowerOfTwo(c/3) 13322 // result: (SHLLconst [log2(c/3)] (LEAL2 <v.Type> x x)) 13323 for { 13324 c := v.AuxInt 13325 x := v.Args[0] 13326 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 13327 break 13328 } 13329 v.reset(Op386SHLLconst) 13330 v.AuxInt = log2(c / 3) 13331 v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) 13332 v0.AddArg(x) 13333 v0.AddArg(x) 13334 v.AddArg(v0) 13335 return true 13336 } 13337 // match: (MULLconst [c] x) 13338 // cond: c%5 == 0 && isPowerOfTwo(c/5) 13339 // result: (SHLLconst [log2(c/5)] (LEAL4 <v.Type> x x)) 13340 for { 13341 c := v.AuxInt 13342 x := v.Args[0] 13343 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 13344 break 13345 } 13346 v.reset(Op386SHLLconst) 13347 v.AuxInt = log2(c / 5) 13348 v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) 13349 v0.AddArg(x) 13350 v0.AddArg(x) 13351 v.AddArg(v0) 13352 return true 13353 } 13354 // match: (MULLconst [c] x) 13355 // cond: c%9 == 0 && isPowerOfTwo(c/9) 13356 // result: (SHLLconst [log2(c/9)] (LEAL8 <v.Type> x x)) 13357 for { 13358 c := v.AuxInt 13359 x := v.Args[0] 13360 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 13361 break 13362 } 13363 v.reset(Op386SHLLconst) 13364 v.AuxInt = log2(c / 9) 13365 v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) 13366 v0.AddArg(x) 13367 v0.AddArg(x) 13368 v.AddArg(v0) 13369 return true 13370 } 13371 return false 13372 } 13373 func rewriteValue386_Op386MULLconst_30(v *Value) bool { 13374 // match: (MULLconst [c] (MOVLconst [d])) 13375 // cond: 13376 // result: (MOVLconst [int64(int32(c*d))]) 13377 for { 13378 c := v.AuxInt 13379 v_0 := v.Args[0] 13380 if v_0.Op != Op386MOVLconst { 13381 break 13382 } 13383 d := v_0.AuxInt 13384 v.reset(Op386MOVLconst) 13385 v.AuxInt = int64(int32(c * d)) 13386 return true 13387 } 13388 return false 13389 } 13390 func rewriteValue386_Op386MULLload_0(v *Value) bool { 13391 b := v.Block 13392 _ = b 13393 config := b.Func.Config 13394 _ = config 13395 // match: (MULLload [off1] {sym} val (ADDLconst [off2] base) mem) 13396 // cond: is32Bit(off1+off2) 13397 // result: (MULLload [off1+off2] {sym} val base mem) 13398 for { 13399 off1 := v.AuxInt 13400 sym := v.Aux 13401 _ = v.Args[2] 13402 val := v.Args[0] 13403 v_1 := v.Args[1] 13404 if v_1.Op != Op386ADDLconst { 13405 break 13406 } 13407 off2 := v_1.AuxInt 13408 base := v_1.Args[0] 13409 mem := v.Args[2] 13410 if !(is32Bit(off1 + off2)) { 13411 break 13412 } 13413 v.reset(Op386MULLload) 13414 v.AuxInt = off1 + off2 13415 v.Aux = sym 13416 v.AddArg(val) 13417 v.AddArg(base) 13418 v.AddArg(mem) 13419 return true 13420 } 13421 // match: (MULLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 13422 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 13423 // result: (MULLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 13424 for { 13425 off1 := v.AuxInt 13426 sym1 := v.Aux 13427 _ = v.Args[2] 13428 val := v.Args[0] 13429 v_1 := v.Args[1] 13430 if v_1.Op != Op386LEAL { 13431 break 13432 } 13433 off2 := v_1.AuxInt 13434 sym2 := v_1.Aux 13435 base := v_1.Args[0] 13436 mem := v.Args[2] 13437 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 13438 break 13439 } 13440 v.reset(Op386MULLload) 13441 v.AuxInt = off1 + off2 13442 v.Aux = mergeSym(sym1, sym2) 13443 v.AddArg(val) 13444 v.AddArg(base) 13445 v.AddArg(mem) 13446 return true 13447 } 13448 // match: (MULLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) 13449 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13450 // result: (MULLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) 13451 for { 13452 off1 := v.AuxInt 13453 sym1 := v.Aux 13454 _ = v.Args[2] 13455 val := v.Args[0] 13456 v_1 := v.Args[1] 13457 if v_1.Op != Op386LEAL4 { 13458 break 13459 } 13460 off2 := v_1.AuxInt 13461 sym2 := v_1.Aux 13462 _ = v_1.Args[1] 13463 ptr := v_1.Args[0] 13464 idx := v_1.Args[1] 13465 mem := v.Args[2] 13466 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13467 break 13468 } 13469 v.reset(Op386MULLloadidx4) 13470 v.AuxInt = off1 + off2 13471 v.Aux = mergeSym(sym1, sym2) 13472 v.AddArg(val) 13473 v.AddArg(ptr) 13474 v.AddArg(idx) 13475 v.AddArg(mem) 13476 return true 13477 } 13478 return false 13479 } 13480 func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { 13481 b := v.Block 13482 _ = b 13483 config := b.Func.Config 13484 _ = config 13485 // match: (MULLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) 13486 // cond: is32Bit(off1+off2) 13487 // result: (MULLloadidx4 [off1+off2] {sym} val base idx mem) 13488 for { 13489 off1 := v.AuxInt 13490 sym := v.Aux 13491 _ = v.Args[3] 13492 val := v.Args[0] 13493 v_1 := v.Args[1] 13494 if v_1.Op != Op386ADDLconst { 13495 break 13496 } 13497 off2 := v_1.AuxInt 13498 base := v_1.Args[0] 13499 idx := v.Args[2] 13500 mem := v.Args[3] 13501 if !(is32Bit(off1 + off2)) { 13502 break 13503 } 13504 v.reset(Op386MULLloadidx4) 13505 v.AuxInt = off1 + off2 13506 v.Aux = sym 13507 v.AddArg(val) 13508 v.AddArg(base) 13509 v.AddArg(idx) 13510 v.AddArg(mem) 13511 return true 13512 } 13513 // match: (MULLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) 13514 // cond: is32Bit(off1+off2*4) 13515 // result: (MULLloadidx4 [off1+off2*4] {sym} val base idx mem) 13516 for { 13517 off1 := v.AuxInt 13518 sym := v.Aux 13519 _ = v.Args[3] 13520 val := v.Args[0] 13521 base := v.Args[1] 13522 v_2 := v.Args[2] 13523 if v_2.Op != Op386ADDLconst { 13524 break 13525 } 13526 off2 := v_2.AuxInt 13527 idx := v_2.Args[0] 13528 mem := v.Args[3] 13529 if !(is32Bit(off1 + off2*4)) { 13530 break 13531 } 13532 v.reset(Op386MULLloadidx4) 13533 v.AuxInt = off1 + off2*4 13534 v.Aux = sym 13535 v.AddArg(val) 13536 v.AddArg(base) 13537 v.AddArg(idx) 13538 v.AddArg(mem) 13539 return true 13540 } 13541 // match: (MULLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) 13542 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 13543 // result: (MULLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) 13544 for { 13545 off1 := v.AuxInt 13546 sym1 := v.Aux 13547 _ = v.Args[3] 13548 val := v.Args[0] 13549 v_1 := v.Args[1] 13550 if v_1.Op != Op386LEAL { 13551 break 13552 } 13553 off2 := v_1.AuxInt 13554 sym2 := v_1.Aux 13555 base := v_1.Args[0] 13556 idx := v.Args[2] 13557 mem := v.Args[3] 13558 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 13559 break 13560 } 13561 v.reset(Op386MULLloadidx4) 13562 v.AuxInt = off1 + off2 13563 v.Aux = mergeSym(sym1, sym2) 13564 v.AddArg(val) 13565 v.AddArg(base) 13566 v.AddArg(idx) 13567 v.AddArg(mem) 13568 return true 13569 } 13570 return false 13571 } 13572 func rewriteValue386_Op386MULSD_0(v *Value) bool { 13573 b := v.Block 13574 _ = b 13575 config := b.Func.Config 13576 _ = config 13577 // match: (MULSD x l:(MOVSDload [off] {sym} ptr mem)) 13578 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 13579 // result: (MULSDload x [off] {sym} ptr mem) 13580 for { 13581 _ = v.Args[1] 13582 x := v.Args[0] 13583 l := v.Args[1] 13584 if l.Op != Op386MOVSDload { 13585 break 13586 } 13587 off := l.AuxInt 13588 sym := l.Aux 13589 _ = l.Args[1] 13590 ptr := l.Args[0] 13591 mem := l.Args[1] 13592 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 13593 break 13594 } 13595 v.reset(Op386MULSDload) 13596 v.AuxInt = off 13597 v.Aux = sym 13598 v.AddArg(x) 13599 v.AddArg(ptr) 13600 v.AddArg(mem) 13601 return true 13602 } 13603 // match: (MULSD l:(MOVSDload [off] {sym} ptr mem) x) 13604 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 13605 // result: (MULSDload x [off] {sym} ptr mem) 13606 for { 13607 _ = v.Args[1] 13608 l := v.Args[0] 13609 if l.Op != Op386MOVSDload { 13610 break 13611 } 13612 off := l.AuxInt 13613 sym := l.Aux 13614 _ = l.Args[1] 13615 ptr := l.Args[0] 13616 mem := l.Args[1] 13617 x := v.Args[1] 13618 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 13619 break 13620 } 13621 v.reset(Op386MULSDload) 13622 v.AuxInt = off 13623 v.Aux = sym 13624 v.AddArg(x) 13625 v.AddArg(ptr) 13626 v.AddArg(mem) 13627 return true 13628 } 13629 return false 13630 } 13631 func rewriteValue386_Op386MULSDload_0(v *Value) bool { 13632 b := v.Block 13633 _ = b 13634 config := b.Func.Config 13635 _ = config 13636 // match: (MULSDload [off1] {sym} val (ADDLconst [off2] base) mem) 13637 // cond: is32Bit(off1+off2) 13638 // result: (MULSDload [off1+off2] {sym} val base mem) 13639 for { 13640 off1 := v.AuxInt 13641 sym := v.Aux 13642 _ = v.Args[2] 13643 val := v.Args[0] 13644 v_1 := v.Args[1] 13645 if v_1.Op != Op386ADDLconst { 13646 break 13647 } 13648 off2 := v_1.AuxInt 13649 base := v_1.Args[0] 13650 mem := v.Args[2] 13651 if !(is32Bit(off1 + off2)) { 13652 break 13653 } 13654 v.reset(Op386MULSDload) 13655 v.AuxInt = off1 + off2 13656 v.Aux = sym 13657 v.AddArg(val) 13658 v.AddArg(base) 13659 v.AddArg(mem) 13660 return true 13661 } 13662 // match: (MULSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 13663 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 13664 // result: (MULSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 13665 for { 13666 off1 := v.AuxInt 13667 sym1 := v.Aux 13668 _ = v.Args[2] 13669 val := v.Args[0] 13670 v_1 := v.Args[1] 13671 if v_1.Op != Op386LEAL { 13672 break 13673 } 13674 off2 := v_1.AuxInt 13675 sym2 := v_1.Aux 13676 base := v_1.Args[0] 13677 mem := v.Args[2] 13678 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 13679 break 13680 } 13681 v.reset(Op386MULSDload) 13682 v.AuxInt = off1 + off2 13683 v.Aux = mergeSym(sym1, sym2) 13684 v.AddArg(val) 13685 v.AddArg(base) 13686 v.AddArg(mem) 13687 return true 13688 } 13689 return false 13690 } 13691 func rewriteValue386_Op386MULSS_0(v *Value) bool { 13692 b := v.Block 13693 _ = b 13694 config := b.Func.Config 13695 _ = config 13696 // match: (MULSS x l:(MOVSSload [off] {sym} ptr mem)) 13697 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 13698 // result: (MULSSload x [off] {sym} ptr mem) 13699 for { 13700 _ = v.Args[1] 13701 x := v.Args[0] 13702 l := v.Args[1] 13703 if l.Op != Op386MOVSSload { 13704 break 13705 } 13706 off := l.AuxInt 13707 sym := l.Aux 13708 _ = l.Args[1] 13709 ptr := l.Args[0] 13710 mem := l.Args[1] 13711 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 13712 break 13713 } 13714 v.reset(Op386MULSSload) 13715 v.AuxInt = off 13716 v.Aux = sym 13717 v.AddArg(x) 13718 v.AddArg(ptr) 13719 v.AddArg(mem) 13720 return true 13721 } 13722 // match: (MULSS l:(MOVSSload [off] {sym} ptr mem) x) 13723 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 13724 // result: (MULSSload x [off] {sym} ptr mem) 13725 for { 13726 _ = v.Args[1] 13727 l := v.Args[0] 13728 if l.Op != Op386MOVSSload { 13729 break 13730 } 13731 off := l.AuxInt 13732 sym := l.Aux 13733 _ = l.Args[1] 13734 ptr := l.Args[0] 13735 mem := l.Args[1] 13736 x := v.Args[1] 13737 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 13738 break 13739 } 13740 v.reset(Op386MULSSload) 13741 v.AuxInt = off 13742 v.Aux = sym 13743 v.AddArg(x) 13744 v.AddArg(ptr) 13745 v.AddArg(mem) 13746 return true 13747 } 13748 return false 13749 } 13750 func rewriteValue386_Op386MULSSload_0(v *Value) bool { 13751 b := v.Block 13752 _ = b 13753 config := b.Func.Config 13754 _ = config 13755 // match: (MULSSload [off1] {sym} val (ADDLconst [off2] base) mem) 13756 // cond: is32Bit(off1+off2) 13757 // result: (MULSSload [off1+off2] {sym} val base mem) 13758 for { 13759 off1 := v.AuxInt 13760 sym := v.Aux 13761 _ = v.Args[2] 13762 val := v.Args[0] 13763 v_1 := v.Args[1] 13764 if v_1.Op != Op386ADDLconst { 13765 break 13766 } 13767 off2 := v_1.AuxInt 13768 base := v_1.Args[0] 13769 mem := v.Args[2] 13770 if !(is32Bit(off1 + off2)) { 13771 break 13772 } 13773 v.reset(Op386MULSSload) 13774 v.AuxInt = off1 + off2 13775 v.Aux = sym 13776 v.AddArg(val) 13777 v.AddArg(base) 13778 v.AddArg(mem) 13779 return true 13780 } 13781 // match: (MULSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 13782 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 13783 // result: (MULSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 13784 for { 13785 off1 := v.AuxInt 13786 sym1 := v.Aux 13787 _ = v.Args[2] 13788 val := v.Args[0] 13789 v_1 := v.Args[1] 13790 if v_1.Op != Op386LEAL { 13791 break 13792 } 13793 off2 := v_1.AuxInt 13794 sym2 := v_1.Aux 13795 base := v_1.Args[0] 13796 mem := v.Args[2] 13797 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 13798 break 13799 } 13800 v.reset(Op386MULSSload) 13801 v.AuxInt = off1 + off2 13802 v.Aux = mergeSym(sym1, sym2) 13803 v.AddArg(val) 13804 v.AddArg(base) 13805 v.AddArg(mem) 13806 return true 13807 } 13808 return false 13809 } 13810 func rewriteValue386_Op386NEGL_0(v *Value) bool { 13811 // match: (NEGL (MOVLconst [c])) 13812 // cond: 13813 // result: (MOVLconst [int64(int32(-c))]) 13814 for { 13815 v_0 := v.Args[0] 13816 if v_0.Op != Op386MOVLconst { 13817 break 13818 } 13819 c := v_0.AuxInt 13820 v.reset(Op386MOVLconst) 13821 v.AuxInt = int64(int32(-c)) 13822 return true 13823 } 13824 return false 13825 } 13826 func rewriteValue386_Op386NOTL_0(v *Value) bool { 13827 // match: (NOTL (MOVLconst [c])) 13828 // cond: 13829 // result: (MOVLconst [^c]) 13830 for { 13831 v_0 := v.Args[0] 13832 if v_0.Op != Op386MOVLconst { 13833 break 13834 } 13835 c := v_0.AuxInt 13836 v.reset(Op386MOVLconst) 13837 v.AuxInt = ^c 13838 return true 13839 } 13840 return false 13841 } 13842 func rewriteValue386_Op386ORL_0(v *Value) bool { 13843 // match: (ORL x (MOVLconst [c])) 13844 // cond: 13845 // result: (ORLconst [c] x) 13846 for { 13847 _ = v.Args[1] 13848 x := v.Args[0] 13849 v_1 := v.Args[1] 13850 if v_1.Op != Op386MOVLconst { 13851 break 13852 } 13853 c := v_1.AuxInt 13854 v.reset(Op386ORLconst) 13855 v.AuxInt = c 13856 v.AddArg(x) 13857 return true 13858 } 13859 // match: (ORL (MOVLconst [c]) x) 13860 // cond: 13861 // result: (ORLconst [c] x) 13862 for { 13863 _ = v.Args[1] 13864 v_0 := v.Args[0] 13865 if v_0.Op != Op386MOVLconst { 13866 break 13867 } 13868 c := v_0.AuxInt 13869 x := v.Args[1] 13870 v.reset(Op386ORLconst) 13871 v.AuxInt = c 13872 v.AddArg(x) 13873 return true 13874 } 13875 // match: (ORL (SHLLconst [c] x) (SHRLconst [d] x)) 13876 // cond: d == 32-c 13877 // result: (ROLLconst [c] x) 13878 for { 13879 _ = v.Args[1] 13880 v_0 := v.Args[0] 13881 if v_0.Op != Op386SHLLconst { 13882 break 13883 } 13884 c := v_0.AuxInt 13885 x := v_0.Args[0] 13886 v_1 := v.Args[1] 13887 if v_1.Op != Op386SHRLconst { 13888 break 13889 } 13890 d := v_1.AuxInt 13891 if x != v_1.Args[0] { 13892 break 13893 } 13894 if !(d == 32-c) { 13895 break 13896 } 13897 v.reset(Op386ROLLconst) 13898 v.AuxInt = c 13899 v.AddArg(x) 13900 return true 13901 } 13902 // match: (ORL (SHRLconst [d] x) (SHLLconst [c] x)) 13903 // cond: d == 32-c 13904 // result: (ROLLconst [c] x) 13905 for { 13906 _ = v.Args[1] 13907 v_0 := v.Args[0] 13908 if v_0.Op != Op386SHRLconst { 13909 break 13910 } 13911 d := v_0.AuxInt 13912 x := v_0.Args[0] 13913 v_1 := v.Args[1] 13914 if v_1.Op != Op386SHLLconst { 13915 break 13916 } 13917 c := v_1.AuxInt 13918 if x != v_1.Args[0] { 13919 break 13920 } 13921 if !(d == 32-c) { 13922 break 13923 } 13924 v.reset(Op386ROLLconst) 13925 v.AuxInt = c 13926 v.AddArg(x) 13927 return true 13928 } 13929 // match: (ORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 13930 // cond: c < 16 && d == 16-c && t.Size() == 2 13931 // result: (ROLWconst x [c]) 13932 for { 13933 t := v.Type 13934 _ = v.Args[1] 13935 v_0 := v.Args[0] 13936 if v_0.Op != Op386SHLLconst { 13937 break 13938 } 13939 c := v_0.AuxInt 13940 x := v_0.Args[0] 13941 v_1 := v.Args[1] 13942 if v_1.Op != Op386SHRWconst { 13943 break 13944 } 13945 d := v_1.AuxInt 13946 if x != v_1.Args[0] { 13947 break 13948 } 13949 if !(c < 16 && d == 16-c && t.Size() == 2) { 13950 break 13951 } 13952 v.reset(Op386ROLWconst) 13953 v.AuxInt = c 13954 v.AddArg(x) 13955 return true 13956 } 13957 // match: (ORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 13958 // cond: c < 16 && d == 16-c && t.Size() == 2 13959 // result: (ROLWconst x [c]) 13960 for { 13961 t := v.Type 13962 _ = v.Args[1] 13963 v_0 := v.Args[0] 13964 if v_0.Op != Op386SHRWconst { 13965 break 13966 } 13967 d := v_0.AuxInt 13968 x := v_0.Args[0] 13969 v_1 := v.Args[1] 13970 if v_1.Op != Op386SHLLconst { 13971 break 13972 } 13973 c := v_1.AuxInt 13974 if x != v_1.Args[0] { 13975 break 13976 } 13977 if !(c < 16 && d == 16-c && t.Size() == 2) { 13978 break 13979 } 13980 v.reset(Op386ROLWconst) 13981 v.AuxInt = c 13982 v.AddArg(x) 13983 return true 13984 } 13985 // match: (ORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 13986 // cond: c < 8 && d == 8-c && t.Size() == 1 13987 // result: (ROLBconst x [c]) 13988 for { 13989 t := v.Type 13990 _ = v.Args[1] 13991 v_0 := v.Args[0] 13992 if v_0.Op != Op386SHLLconst { 13993 break 13994 } 13995 c := v_0.AuxInt 13996 x := v_0.Args[0] 13997 v_1 := v.Args[1] 13998 if v_1.Op != Op386SHRBconst { 13999 break 14000 } 14001 d := v_1.AuxInt 14002 if x != v_1.Args[0] { 14003 break 14004 } 14005 if !(c < 8 && d == 8-c && t.Size() == 1) { 14006 break 14007 } 14008 v.reset(Op386ROLBconst) 14009 v.AuxInt = c 14010 v.AddArg(x) 14011 return true 14012 } 14013 // match: (ORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 14014 // cond: c < 8 && d == 8-c && t.Size() == 1 14015 // result: (ROLBconst x [c]) 14016 for { 14017 t := v.Type 14018 _ = v.Args[1] 14019 v_0 := v.Args[0] 14020 if v_0.Op != Op386SHRBconst { 14021 break 14022 } 14023 d := v_0.AuxInt 14024 x := v_0.Args[0] 14025 v_1 := v.Args[1] 14026 if v_1.Op != Op386SHLLconst { 14027 break 14028 } 14029 c := v_1.AuxInt 14030 if x != v_1.Args[0] { 14031 break 14032 } 14033 if !(c < 8 && d == 8-c && t.Size() == 1) { 14034 break 14035 } 14036 v.reset(Op386ROLBconst) 14037 v.AuxInt = c 14038 v.AddArg(x) 14039 return true 14040 } 14041 // match: (ORL x l:(MOVLload [off] {sym} ptr mem)) 14042 // cond: canMergeLoad(v, l, x) && clobber(l) 14043 // result: (ORLload x [off] {sym} ptr mem) 14044 for { 14045 _ = v.Args[1] 14046 x := v.Args[0] 14047 l := v.Args[1] 14048 if l.Op != Op386MOVLload { 14049 break 14050 } 14051 off := l.AuxInt 14052 sym := l.Aux 14053 _ = l.Args[1] 14054 ptr := l.Args[0] 14055 mem := l.Args[1] 14056 if !(canMergeLoad(v, l, x) && clobber(l)) { 14057 break 14058 } 14059 v.reset(Op386ORLload) 14060 v.AuxInt = off 14061 v.Aux = sym 14062 v.AddArg(x) 14063 v.AddArg(ptr) 14064 v.AddArg(mem) 14065 return true 14066 } 14067 // match: (ORL l:(MOVLload [off] {sym} ptr mem) x) 14068 // cond: canMergeLoad(v, l, x) && clobber(l) 14069 // result: (ORLload x [off] {sym} ptr mem) 14070 for { 14071 _ = v.Args[1] 14072 l := v.Args[0] 14073 if l.Op != Op386MOVLload { 14074 break 14075 } 14076 off := l.AuxInt 14077 sym := l.Aux 14078 _ = l.Args[1] 14079 ptr := l.Args[0] 14080 mem := l.Args[1] 14081 x := v.Args[1] 14082 if !(canMergeLoad(v, l, x) && clobber(l)) { 14083 break 14084 } 14085 v.reset(Op386ORLload) 14086 v.AuxInt = off 14087 v.Aux = sym 14088 v.AddArg(x) 14089 v.AddArg(ptr) 14090 v.AddArg(mem) 14091 return true 14092 } 14093 return false 14094 } 14095 func rewriteValue386_Op386ORL_10(v *Value) bool { 14096 b := v.Block 14097 _ = b 14098 typ := &b.Func.Config.Types 14099 _ = typ 14100 // match: (ORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) 14101 // cond: canMergeLoad(v, l, x) && clobber(l) 14102 // result: (ORLloadidx4 x [off] {sym} ptr idx mem) 14103 for { 14104 _ = v.Args[1] 14105 x := v.Args[0] 14106 l := v.Args[1] 14107 if l.Op != Op386MOVLloadidx4 { 14108 break 14109 } 14110 off := l.AuxInt 14111 sym := l.Aux 14112 _ = l.Args[2] 14113 ptr := l.Args[0] 14114 idx := l.Args[1] 14115 mem := l.Args[2] 14116 if !(canMergeLoad(v, l, x) && clobber(l)) { 14117 break 14118 } 14119 v.reset(Op386ORLloadidx4) 14120 v.AuxInt = off 14121 v.Aux = sym 14122 v.AddArg(x) 14123 v.AddArg(ptr) 14124 v.AddArg(idx) 14125 v.AddArg(mem) 14126 return true 14127 } 14128 // match: (ORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) 14129 // cond: canMergeLoad(v, l, x) && clobber(l) 14130 // result: (ORLloadidx4 x [off] {sym} ptr idx mem) 14131 for { 14132 _ = v.Args[1] 14133 l := v.Args[0] 14134 if l.Op != Op386MOVLloadidx4 { 14135 break 14136 } 14137 off := l.AuxInt 14138 sym := l.Aux 14139 _ = l.Args[2] 14140 ptr := l.Args[0] 14141 idx := l.Args[1] 14142 mem := l.Args[2] 14143 x := v.Args[1] 14144 if !(canMergeLoad(v, l, x) && clobber(l)) { 14145 break 14146 } 14147 v.reset(Op386ORLloadidx4) 14148 v.AuxInt = off 14149 v.Aux = sym 14150 v.AddArg(x) 14151 v.AddArg(ptr) 14152 v.AddArg(idx) 14153 v.AddArg(mem) 14154 return true 14155 } 14156 // match: (ORL x x) 14157 // cond: 14158 // result: x 14159 for { 14160 _ = v.Args[1] 14161 x := v.Args[0] 14162 if x != v.Args[1] { 14163 break 14164 } 14165 v.reset(OpCopy) 14166 v.Type = x.Type 14167 v.AddArg(x) 14168 return true 14169 } 14170 // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) 14171 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14172 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 14173 for { 14174 _ = v.Args[1] 14175 x0 := v.Args[0] 14176 if x0.Op != Op386MOVBload { 14177 break 14178 } 14179 i0 := x0.AuxInt 14180 s := x0.Aux 14181 _ = x0.Args[1] 14182 p := x0.Args[0] 14183 mem := x0.Args[1] 14184 s0 := v.Args[1] 14185 if s0.Op != Op386SHLLconst { 14186 break 14187 } 14188 if s0.AuxInt != 8 { 14189 break 14190 } 14191 x1 := s0.Args[0] 14192 if x1.Op != Op386MOVBload { 14193 break 14194 } 14195 i1 := x1.AuxInt 14196 if x1.Aux != s { 14197 break 14198 } 14199 _ = x1.Args[1] 14200 if p != x1.Args[0] { 14201 break 14202 } 14203 if mem != x1.Args[1] { 14204 break 14205 } 14206 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14207 break 14208 } 14209 b = mergePoint(b, x0, x1) 14210 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 14211 v.reset(OpCopy) 14212 v.AddArg(v0) 14213 v0.AuxInt = i0 14214 v0.Aux = s 14215 v0.AddArg(p) 14216 v0.AddArg(mem) 14217 return true 14218 } 14219 // match: (ORL s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) 14220 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14221 // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) 14222 for { 14223 _ = v.Args[1] 14224 s0 := v.Args[0] 14225 if s0.Op != Op386SHLLconst { 14226 break 14227 } 14228 if s0.AuxInt != 8 { 14229 break 14230 } 14231 x1 := s0.Args[0] 14232 if x1.Op != Op386MOVBload { 14233 break 14234 } 14235 i1 := x1.AuxInt 14236 s := x1.Aux 14237 _ = x1.Args[1] 14238 p := x1.Args[0] 14239 mem := x1.Args[1] 14240 x0 := v.Args[1] 14241 if x0.Op != Op386MOVBload { 14242 break 14243 } 14244 i0 := x0.AuxInt 14245 if x0.Aux != s { 14246 break 14247 } 14248 _ = x0.Args[1] 14249 if p != x0.Args[0] { 14250 break 14251 } 14252 if mem != x0.Args[1] { 14253 break 14254 } 14255 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14256 break 14257 } 14258 b = mergePoint(b, x0, x1) 14259 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 14260 v.reset(OpCopy) 14261 v.AddArg(v0) 14262 v0.AuxInt = i0 14263 v0.Aux = s 14264 v0.AddArg(p) 14265 v0.AddArg(mem) 14266 return true 14267 } 14268 // 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))) 14269 // 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) 14270 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 14271 for { 14272 _ = v.Args[1] 14273 o0 := v.Args[0] 14274 if o0.Op != Op386ORL { 14275 break 14276 } 14277 _ = o0.Args[1] 14278 x0 := o0.Args[0] 14279 if x0.Op != Op386MOVWload { 14280 break 14281 } 14282 i0 := x0.AuxInt 14283 s := x0.Aux 14284 _ = x0.Args[1] 14285 p := x0.Args[0] 14286 mem := x0.Args[1] 14287 s0 := o0.Args[1] 14288 if s0.Op != Op386SHLLconst { 14289 break 14290 } 14291 if s0.AuxInt != 16 { 14292 break 14293 } 14294 x1 := s0.Args[0] 14295 if x1.Op != Op386MOVBload { 14296 break 14297 } 14298 i2 := x1.AuxInt 14299 if x1.Aux != s { 14300 break 14301 } 14302 _ = x1.Args[1] 14303 if p != x1.Args[0] { 14304 break 14305 } 14306 if mem != x1.Args[1] { 14307 break 14308 } 14309 s1 := v.Args[1] 14310 if s1.Op != Op386SHLLconst { 14311 break 14312 } 14313 if s1.AuxInt != 24 { 14314 break 14315 } 14316 x2 := s1.Args[0] 14317 if x2.Op != Op386MOVBload { 14318 break 14319 } 14320 i3 := x2.AuxInt 14321 if x2.Aux != s { 14322 break 14323 } 14324 _ = x2.Args[1] 14325 if p != x2.Args[0] { 14326 break 14327 } 14328 if mem != x2.Args[1] { 14329 break 14330 } 14331 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)) { 14332 break 14333 } 14334 b = mergePoint(b, x0, x1, x2) 14335 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 14336 v.reset(OpCopy) 14337 v.AddArg(v0) 14338 v0.AuxInt = i0 14339 v0.Aux = s 14340 v0.AddArg(p) 14341 v0.AddArg(mem) 14342 return true 14343 } 14344 // 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))) 14345 // 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) 14346 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 14347 for { 14348 _ = v.Args[1] 14349 o0 := v.Args[0] 14350 if o0.Op != Op386ORL { 14351 break 14352 } 14353 _ = o0.Args[1] 14354 s0 := o0.Args[0] 14355 if s0.Op != Op386SHLLconst { 14356 break 14357 } 14358 if s0.AuxInt != 16 { 14359 break 14360 } 14361 x1 := s0.Args[0] 14362 if x1.Op != Op386MOVBload { 14363 break 14364 } 14365 i2 := x1.AuxInt 14366 s := x1.Aux 14367 _ = x1.Args[1] 14368 p := x1.Args[0] 14369 mem := x1.Args[1] 14370 x0 := o0.Args[1] 14371 if x0.Op != Op386MOVWload { 14372 break 14373 } 14374 i0 := x0.AuxInt 14375 if x0.Aux != s { 14376 break 14377 } 14378 _ = x0.Args[1] 14379 if p != x0.Args[0] { 14380 break 14381 } 14382 if mem != x0.Args[1] { 14383 break 14384 } 14385 s1 := v.Args[1] 14386 if s1.Op != Op386SHLLconst { 14387 break 14388 } 14389 if s1.AuxInt != 24 { 14390 break 14391 } 14392 x2 := s1.Args[0] 14393 if x2.Op != Op386MOVBload { 14394 break 14395 } 14396 i3 := x2.AuxInt 14397 if x2.Aux != s { 14398 break 14399 } 14400 _ = x2.Args[1] 14401 if p != x2.Args[0] { 14402 break 14403 } 14404 if mem != x2.Args[1] { 14405 break 14406 } 14407 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)) { 14408 break 14409 } 14410 b = mergePoint(b, x0, x1, x2) 14411 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 14412 v.reset(OpCopy) 14413 v.AddArg(v0) 14414 v0.AuxInt = i0 14415 v0.Aux = s 14416 v0.AddArg(p) 14417 v0.AddArg(mem) 14418 return true 14419 } 14420 // 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)))) 14421 // 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) 14422 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 14423 for { 14424 _ = v.Args[1] 14425 s1 := v.Args[0] 14426 if s1.Op != Op386SHLLconst { 14427 break 14428 } 14429 if s1.AuxInt != 24 { 14430 break 14431 } 14432 x2 := s1.Args[0] 14433 if x2.Op != Op386MOVBload { 14434 break 14435 } 14436 i3 := x2.AuxInt 14437 s := x2.Aux 14438 _ = x2.Args[1] 14439 p := x2.Args[0] 14440 mem := x2.Args[1] 14441 o0 := v.Args[1] 14442 if o0.Op != Op386ORL { 14443 break 14444 } 14445 _ = o0.Args[1] 14446 x0 := o0.Args[0] 14447 if x0.Op != Op386MOVWload { 14448 break 14449 } 14450 i0 := x0.AuxInt 14451 if x0.Aux != s { 14452 break 14453 } 14454 _ = x0.Args[1] 14455 if p != x0.Args[0] { 14456 break 14457 } 14458 if mem != x0.Args[1] { 14459 break 14460 } 14461 s0 := o0.Args[1] 14462 if s0.Op != Op386SHLLconst { 14463 break 14464 } 14465 if s0.AuxInt != 16 { 14466 break 14467 } 14468 x1 := s0.Args[0] 14469 if x1.Op != Op386MOVBload { 14470 break 14471 } 14472 i2 := x1.AuxInt 14473 if x1.Aux != s { 14474 break 14475 } 14476 _ = x1.Args[1] 14477 if p != x1.Args[0] { 14478 break 14479 } 14480 if mem != x1.Args[1] { 14481 break 14482 } 14483 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)) { 14484 break 14485 } 14486 b = mergePoint(b, x0, x1, x2) 14487 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 14488 v.reset(OpCopy) 14489 v.AddArg(v0) 14490 v0.AuxInt = i0 14491 v0.Aux = s 14492 v0.AddArg(p) 14493 v0.AddArg(mem) 14494 return true 14495 } 14496 // 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))) 14497 // 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) 14498 // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) 14499 for { 14500 _ = v.Args[1] 14501 s1 := v.Args[0] 14502 if s1.Op != Op386SHLLconst { 14503 break 14504 } 14505 if s1.AuxInt != 24 { 14506 break 14507 } 14508 x2 := s1.Args[0] 14509 if x2.Op != Op386MOVBload { 14510 break 14511 } 14512 i3 := x2.AuxInt 14513 s := x2.Aux 14514 _ = x2.Args[1] 14515 p := x2.Args[0] 14516 mem := x2.Args[1] 14517 o0 := v.Args[1] 14518 if o0.Op != Op386ORL { 14519 break 14520 } 14521 _ = o0.Args[1] 14522 s0 := o0.Args[0] 14523 if s0.Op != Op386SHLLconst { 14524 break 14525 } 14526 if s0.AuxInt != 16 { 14527 break 14528 } 14529 x1 := s0.Args[0] 14530 if x1.Op != Op386MOVBload { 14531 break 14532 } 14533 i2 := x1.AuxInt 14534 if x1.Aux != s { 14535 break 14536 } 14537 _ = x1.Args[1] 14538 if p != x1.Args[0] { 14539 break 14540 } 14541 if mem != x1.Args[1] { 14542 break 14543 } 14544 x0 := o0.Args[1] 14545 if x0.Op != Op386MOVWload { 14546 break 14547 } 14548 i0 := x0.AuxInt 14549 if x0.Aux != s { 14550 break 14551 } 14552 _ = x0.Args[1] 14553 if p != x0.Args[0] { 14554 break 14555 } 14556 if mem != x0.Args[1] { 14557 break 14558 } 14559 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)) { 14560 break 14561 } 14562 b = mergePoint(b, x0, x1, x2) 14563 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 14564 v.reset(OpCopy) 14565 v.AddArg(v0) 14566 v0.AuxInt = i0 14567 v0.Aux = s 14568 v0.AddArg(p) 14569 v0.AddArg(mem) 14570 return true 14571 } 14572 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 14573 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14574 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14575 for { 14576 _ = v.Args[1] 14577 x0 := v.Args[0] 14578 if x0.Op != Op386MOVBloadidx1 { 14579 break 14580 } 14581 i0 := x0.AuxInt 14582 s := x0.Aux 14583 _ = x0.Args[2] 14584 p := x0.Args[0] 14585 idx := x0.Args[1] 14586 mem := x0.Args[2] 14587 s0 := v.Args[1] 14588 if s0.Op != Op386SHLLconst { 14589 break 14590 } 14591 if s0.AuxInt != 8 { 14592 break 14593 } 14594 x1 := s0.Args[0] 14595 if x1.Op != Op386MOVBloadidx1 { 14596 break 14597 } 14598 i1 := x1.AuxInt 14599 if x1.Aux != s { 14600 break 14601 } 14602 _ = x1.Args[2] 14603 if p != x1.Args[0] { 14604 break 14605 } 14606 if idx != x1.Args[1] { 14607 break 14608 } 14609 if mem != x1.Args[2] { 14610 break 14611 } 14612 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14613 break 14614 } 14615 b = mergePoint(b, x0, x1) 14616 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14617 v.reset(OpCopy) 14618 v.AddArg(v0) 14619 v0.AuxInt = i0 14620 v0.Aux = s 14621 v0.AddArg(p) 14622 v0.AddArg(idx) 14623 v0.AddArg(mem) 14624 return true 14625 } 14626 return false 14627 } 14628 func rewriteValue386_Op386ORL_20(v *Value) bool { 14629 b := v.Block 14630 _ = b 14631 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) 14632 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14633 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14634 for { 14635 _ = v.Args[1] 14636 x0 := v.Args[0] 14637 if x0.Op != Op386MOVBloadidx1 { 14638 break 14639 } 14640 i0 := x0.AuxInt 14641 s := x0.Aux 14642 _ = x0.Args[2] 14643 idx := x0.Args[0] 14644 p := x0.Args[1] 14645 mem := x0.Args[2] 14646 s0 := v.Args[1] 14647 if s0.Op != Op386SHLLconst { 14648 break 14649 } 14650 if s0.AuxInt != 8 { 14651 break 14652 } 14653 x1 := s0.Args[0] 14654 if x1.Op != Op386MOVBloadidx1 { 14655 break 14656 } 14657 i1 := x1.AuxInt 14658 if x1.Aux != s { 14659 break 14660 } 14661 _ = x1.Args[2] 14662 if p != x1.Args[0] { 14663 break 14664 } 14665 if idx != x1.Args[1] { 14666 break 14667 } 14668 if mem != x1.Args[2] { 14669 break 14670 } 14671 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14672 break 14673 } 14674 b = mergePoint(b, x0, x1) 14675 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14676 v.reset(OpCopy) 14677 v.AddArg(v0) 14678 v0.AuxInt = i0 14679 v0.Aux = s 14680 v0.AddArg(p) 14681 v0.AddArg(idx) 14682 v0.AddArg(mem) 14683 return true 14684 } 14685 // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 14686 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14687 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14688 for { 14689 _ = v.Args[1] 14690 x0 := v.Args[0] 14691 if x0.Op != Op386MOVBloadidx1 { 14692 break 14693 } 14694 i0 := x0.AuxInt 14695 s := x0.Aux 14696 _ = x0.Args[2] 14697 p := x0.Args[0] 14698 idx := x0.Args[1] 14699 mem := x0.Args[2] 14700 s0 := v.Args[1] 14701 if s0.Op != Op386SHLLconst { 14702 break 14703 } 14704 if s0.AuxInt != 8 { 14705 break 14706 } 14707 x1 := s0.Args[0] 14708 if x1.Op != Op386MOVBloadidx1 { 14709 break 14710 } 14711 i1 := x1.AuxInt 14712 if x1.Aux != s { 14713 break 14714 } 14715 _ = x1.Args[2] 14716 if idx != x1.Args[0] { 14717 break 14718 } 14719 if p != x1.Args[1] { 14720 break 14721 } 14722 if mem != x1.Args[2] { 14723 break 14724 } 14725 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14726 break 14727 } 14728 b = mergePoint(b, x0, x1) 14729 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14730 v.reset(OpCopy) 14731 v.AddArg(v0) 14732 v0.AuxInt = i0 14733 v0.Aux = s 14734 v0.AddArg(p) 14735 v0.AddArg(idx) 14736 v0.AddArg(mem) 14737 return true 14738 } 14739 // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) 14740 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14741 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14742 for { 14743 _ = v.Args[1] 14744 x0 := v.Args[0] 14745 if x0.Op != Op386MOVBloadidx1 { 14746 break 14747 } 14748 i0 := x0.AuxInt 14749 s := x0.Aux 14750 _ = x0.Args[2] 14751 idx := x0.Args[0] 14752 p := x0.Args[1] 14753 mem := x0.Args[2] 14754 s0 := v.Args[1] 14755 if s0.Op != Op386SHLLconst { 14756 break 14757 } 14758 if s0.AuxInt != 8 { 14759 break 14760 } 14761 x1 := s0.Args[0] 14762 if x1.Op != Op386MOVBloadidx1 { 14763 break 14764 } 14765 i1 := x1.AuxInt 14766 if x1.Aux != s { 14767 break 14768 } 14769 _ = x1.Args[2] 14770 if idx != x1.Args[0] { 14771 break 14772 } 14773 if p != x1.Args[1] { 14774 break 14775 } 14776 if mem != x1.Args[2] { 14777 break 14778 } 14779 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14780 break 14781 } 14782 b = mergePoint(b, x0, x1) 14783 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14784 v.reset(OpCopy) 14785 v.AddArg(v0) 14786 v0.AuxInt = i0 14787 v0.Aux = s 14788 v0.AddArg(p) 14789 v0.AddArg(idx) 14790 v0.AddArg(mem) 14791 return true 14792 } 14793 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 14794 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14795 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14796 for { 14797 _ = v.Args[1] 14798 s0 := v.Args[0] 14799 if s0.Op != Op386SHLLconst { 14800 break 14801 } 14802 if s0.AuxInt != 8 { 14803 break 14804 } 14805 x1 := s0.Args[0] 14806 if x1.Op != Op386MOVBloadidx1 { 14807 break 14808 } 14809 i1 := x1.AuxInt 14810 s := x1.Aux 14811 _ = x1.Args[2] 14812 p := x1.Args[0] 14813 idx := x1.Args[1] 14814 mem := x1.Args[2] 14815 x0 := v.Args[1] 14816 if x0.Op != Op386MOVBloadidx1 { 14817 break 14818 } 14819 i0 := x0.AuxInt 14820 if x0.Aux != s { 14821 break 14822 } 14823 _ = x0.Args[2] 14824 if p != x0.Args[0] { 14825 break 14826 } 14827 if idx != x0.Args[1] { 14828 break 14829 } 14830 if mem != x0.Args[2] { 14831 break 14832 } 14833 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14834 break 14835 } 14836 b = mergePoint(b, x0, x1) 14837 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14838 v.reset(OpCopy) 14839 v.AddArg(v0) 14840 v0.AuxInt = i0 14841 v0.Aux = s 14842 v0.AddArg(p) 14843 v0.AddArg(idx) 14844 v0.AddArg(mem) 14845 return true 14846 } 14847 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) 14848 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14849 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14850 for { 14851 _ = v.Args[1] 14852 s0 := v.Args[0] 14853 if s0.Op != Op386SHLLconst { 14854 break 14855 } 14856 if s0.AuxInt != 8 { 14857 break 14858 } 14859 x1 := s0.Args[0] 14860 if x1.Op != Op386MOVBloadidx1 { 14861 break 14862 } 14863 i1 := x1.AuxInt 14864 s := x1.Aux 14865 _ = x1.Args[2] 14866 idx := x1.Args[0] 14867 p := x1.Args[1] 14868 mem := x1.Args[2] 14869 x0 := v.Args[1] 14870 if x0.Op != Op386MOVBloadidx1 { 14871 break 14872 } 14873 i0 := x0.AuxInt 14874 if x0.Aux != s { 14875 break 14876 } 14877 _ = x0.Args[2] 14878 if p != x0.Args[0] { 14879 break 14880 } 14881 if idx != x0.Args[1] { 14882 break 14883 } 14884 if mem != x0.Args[2] { 14885 break 14886 } 14887 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14888 break 14889 } 14890 b = mergePoint(b, x0, x1) 14891 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14892 v.reset(OpCopy) 14893 v.AddArg(v0) 14894 v0.AuxInt = i0 14895 v0.Aux = s 14896 v0.AddArg(p) 14897 v0.AddArg(idx) 14898 v0.AddArg(mem) 14899 return true 14900 } 14901 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 14902 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14903 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14904 for { 14905 _ = v.Args[1] 14906 s0 := v.Args[0] 14907 if s0.Op != Op386SHLLconst { 14908 break 14909 } 14910 if s0.AuxInt != 8 { 14911 break 14912 } 14913 x1 := s0.Args[0] 14914 if x1.Op != Op386MOVBloadidx1 { 14915 break 14916 } 14917 i1 := x1.AuxInt 14918 s := x1.Aux 14919 _ = x1.Args[2] 14920 p := x1.Args[0] 14921 idx := x1.Args[1] 14922 mem := x1.Args[2] 14923 x0 := v.Args[1] 14924 if x0.Op != Op386MOVBloadidx1 { 14925 break 14926 } 14927 i0 := x0.AuxInt 14928 if x0.Aux != s { 14929 break 14930 } 14931 _ = x0.Args[2] 14932 if idx != x0.Args[0] { 14933 break 14934 } 14935 if p != x0.Args[1] { 14936 break 14937 } 14938 if mem != x0.Args[2] { 14939 break 14940 } 14941 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14942 break 14943 } 14944 b = mergePoint(b, x0, x1) 14945 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 14946 v.reset(OpCopy) 14947 v.AddArg(v0) 14948 v0.AuxInt = i0 14949 v0.Aux = s 14950 v0.AddArg(p) 14951 v0.AddArg(idx) 14952 v0.AddArg(mem) 14953 return true 14954 } 14955 // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) 14956 // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 14957 // result: @mergePoint(b,x0,x1) (MOVWloadidx1 <v.Type> [i0] {s} p idx mem) 14958 for { 14959 _ = v.Args[1] 14960 s0 := v.Args[0] 14961 if s0.Op != Op386SHLLconst { 14962 break 14963 } 14964 if s0.AuxInt != 8 { 14965 break 14966 } 14967 x1 := s0.Args[0] 14968 if x1.Op != Op386MOVBloadidx1 { 14969 break 14970 } 14971 i1 := x1.AuxInt 14972 s := x1.Aux 14973 _ = x1.Args[2] 14974 idx := x1.Args[0] 14975 p := x1.Args[1] 14976 mem := x1.Args[2] 14977 x0 := v.Args[1] 14978 if x0.Op != Op386MOVBloadidx1 { 14979 break 14980 } 14981 i0 := x0.AuxInt 14982 if x0.Aux != s { 14983 break 14984 } 14985 _ = x0.Args[2] 14986 if idx != x0.Args[0] { 14987 break 14988 } 14989 if p != x0.Args[1] { 14990 break 14991 } 14992 if mem != x0.Args[2] { 14993 break 14994 } 14995 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 14996 break 14997 } 14998 b = mergePoint(b, x0, x1) 14999 v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) 15000 v.reset(OpCopy) 15001 v.AddArg(v0) 15002 v0.AuxInt = i0 15003 v0.Aux = s 15004 v0.AddArg(p) 15005 v0.AddArg(idx) 15006 v0.AddArg(mem) 15007 return true 15008 } 15009 // 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))) 15010 // 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) 15011 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15012 for { 15013 _ = v.Args[1] 15014 o0 := v.Args[0] 15015 if o0.Op != Op386ORL { 15016 break 15017 } 15018 _ = o0.Args[1] 15019 x0 := o0.Args[0] 15020 if x0.Op != Op386MOVWloadidx1 { 15021 break 15022 } 15023 i0 := x0.AuxInt 15024 s := x0.Aux 15025 _ = x0.Args[2] 15026 p := x0.Args[0] 15027 idx := x0.Args[1] 15028 mem := x0.Args[2] 15029 s0 := o0.Args[1] 15030 if s0.Op != Op386SHLLconst { 15031 break 15032 } 15033 if s0.AuxInt != 16 { 15034 break 15035 } 15036 x1 := s0.Args[0] 15037 if x1.Op != Op386MOVBloadidx1 { 15038 break 15039 } 15040 i2 := x1.AuxInt 15041 if x1.Aux != s { 15042 break 15043 } 15044 _ = x1.Args[2] 15045 if p != x1.Args[0] { 15046 break 15047 } 15048 if idx != x1.Args[1] { 15049 break 15050 } 15051 if mem != x1.Args[2] { 15052 break 15053 } 15054 s1 := v.Args[1] 15055 if s1.Op != Op386SHLLconst { 15056 break 15057 } 15058 if s1.AuxInt != 24 { 15059 break 15060 } 15061 x2 := s1.Args[0] 15062 if x2.Op != Op386MOVBloadidx1 { 15063 break 15064 } 15065 i3 := x2.AuxInt 15066 if x2.Aux != s { 15067 break 15068 } 15069 _ = x2.Args[2] 15070 if p != x2.Args[0] { 15071 break 15072 } 15073 if idx != x2.Args[1] { 15074 break 15075 } 15076 if mem != x2.Args[2] { 15077 break 15078 } 15079 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)) { 15080 break 15081 } 15082 b = mergePoint(b, x0, x1, x2) 15083 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15084 v.reset(OpCopy) 15085 v.AddArg(v0) 15086 v0.AuxInt = i0 15087 v0.Aux = s 15088 v0.AddArg(p) 15089 v0.AddArg(idx) 15090 v0.AddArg(mem) 15091 return true 15092 } 15093 // 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))) 15094 // 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) 15095 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15096 for { 15097 _ = v.Args[1] 15098 o0 := v.Args[0] 15099 if o0.Op != Op386ORL { 15100 break 15101 } 15102 _ = o0.Args[1] 15103 x0 := o0.Args[0] 15104 if x0.Op != Op386MOVWloadidx1 { 15105 break 15106 } 15107 i0 := x0.AuxInt 15108 s := x0.Aux 15109 _ = x0.Args[2] 15110 idx := x0.Args[0] 15111 p := x0.Args[1] 15112 mem := x0.Args[2] 15113 s0 := o0.Args[1] 15114 if s0.Op != Op386SHLLconst { 15115 break 15116 } 15117 if s0.AuxInt != 16 { 15118 break 15119 } 15120 x1 := s0.Args[0] 15121 if x1.Op != Op386MOVBloadidx1 { 15122 break 15123 } 15124 i2 := x1.AuxInt 15125 if x1.Aux != s { 15126 break 15127 } 15128 _ = x1.Args[2] 15129 if p != x1.Args[0] { 15130 break 15131 } 15132 if idx != x1.Args[1] { 15133 break 15134 } 15135 if mem != x1.Args[2] { 15136 break 15137 } 15138 s1 := v.Args[1] 15139 if s1.Op != Op386SHLLconst { 15140 break 15141 } 15142 if s1.AuxInt != 24 { 15143 break 15144 } 15145 x2 := s1.Args[0] 15146 if x2.Op != Op386MOVBloadidx1 { 15147 break 15148 } 15149 i3 := x2.AuxInt 15150 if x2.Aux != s { 15151 break 15152 } 15153 _ = x2.Args[2] 15154 if p != x2.Args[0] { 15155 break 15156 } 15157 if idx != x2.Args[1] { 15158 break 15159 } 15160 if mem != x2.Args[2] { 15161 break 15162 } 15163 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)) { 15164 break 15165 } 15166 b = mergePoint(b, x0, x1, x2) 15167 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15168 v.reset(OpCopy) 15169 v.AddArg(v0) 15170 v0.AuxInt = i0 15171 v0.Aux = s 15172 v0.AddArg(p) 15173 v0.AddArg(idx) 15174 v0.AddArg(mem) 15175 return true 15176 } 15177 // 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))) 15178 // 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) 15179 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15180 for { 15181 _ = v.Args[1] 15182 o0 := v.Args[0] 15183 if o0.Op != Op386ORL { 15184 break 15185 } 15186 _ = o0.Args[1] 15187 x0 := o0.Args[0] 15188 if x0.Op != Op386MOVWloadidx1 { 15189 break 15190 } 15191 i0 := x0.AuxInt 15192 s := x0.Aux 15193 _ = x0.Args[2] 15194 p := x0.Args[0] 15195 idx := x0.Args[1] 15196 mem := x0.Args[2] 15197 s0 := o0.Args[1] 15198 if s0.Op != Op386SHLLconst { 15199 break 15200 } 15201 if s0.AuxInt != 16 { 15202 break 15203 } 15204 x1 := s0.Args[0] 15205 if x1.Op != Op386MOVBloadidx1 { 15206 break 15207 } 15208 i2 := x1.AuxInt 15209 if x1.Aux != s { 15210 break 15211 } 15212 _ = x1.Args[2] 15213 if idx != x1.Args[0] { 15214 break 15215 } 15216 if p != x1.Args[1] { 15217 break 15218 } 15219 if mem != x1.Args[2] { 15220 break 15221 } 15222 s1 := v.Args[1] 15223 if s1.Op != Op386SHLLconst { 15224 break 15225 } 15226 if s1.AuxInt != 24 { 15227 break 15228 } 15229 x2 := s1.Args[0] 15230 if x2.Op != Op386MOVBloadidx1 { 15231 break 15232 } 15233 i3 := x2.AuxInt 15234 if x2.Aux != s { 15235 break 15236 } 15237 _ = x2.Args[2] 15238 if p != x2.Args[0] { 15239 break 15240 } 15241 if idx != x2.Args[1] { 15242 break 15243 } 15244 if mem != x2.Args[2] { 15245 break 15246 } 15247 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)) { 15248 break 15249 } 15250 b = mergePoint(b, x0, x1, x2) 15251 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15252 v.reset(OpCopy) 15253 v.AddArg(v0) 15254 v0.AuxInt = i0 15255 v0.Aux = s 15256 v0.AddArg(p) 15257 v0.AddArg(idx) 15258 v0.AddArg(mem) 15259 return true 15260 } 15261 return false 15262 } 15263 func rewriteValue386_Op386ORL_30(v *Value) bool { 15264 b := v.Block 15265 _ = b 15266 // 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))) 15267 // 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) 15268 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15269 for { 15270 _ = v.Args[1] 15271 o0 := v.Args[0] 15272 if o0.Op != Op386ORL { 15273 break 15274 } 15275 _ = o0.Args[1] 15276 x0 := o0.Args[0] 15277 if x0.Op != Op386MOVWloadidx1 { 15278 break 15279 } 15280 i0 := x0.AuxInt 15281 s := x0.Aux 15282 _ = x0.Args[2] 15283 idx := x0.Args[0] 15284 p := x0.Args[1] 15285 mem := x0.Args[2] 15286 s0 := o0.Args[1] 15287 if s0.Op != Op386SHLLconst { 15288 break 15289 } 15290 if s0.AuxInt != 16 { 15291 break 15292 } 15293 x1 := s0.Args[0] 15294 if x1.Op != Op386MOVBloadidx1 { 15295 break 15296 } 15297 i2 := x1.AuxInt 15298 if x1.Aux != s { 15299 break 15300 } 15301 _ = x1.Args[2] 15302 if idx != x1.Args[0] { 15303 break 15304 } 15305 if p != x1.Args[1] { 15306 break 15307 } 15308 if mem != x1.Args[2] { 15309 break 15310 } 15311 s1 := v.Args[1] 15312 if s1.Op != Op386SHLLconst { 15313 break 15314 } 15315 if s1.AuxInt != 24 { 15316 break 15317 } 15318 x2 := s1.Args[0] 15319 if x2.Op != Op386MOVBloadidx1 { 15320 break 15321 } 15322 i3 := x2.AuxInt 15323 if x2.Aux != s { 15324 break 15325 } 15326 _ = x2.Args[2] 15327 if p != x2.Args[0] { 15328 break 15329 } 15330 if idx != x2.Args[1] { 15331 break 15332 } 15333 if mem != x2.Args[2] { 15334 break 15335 } 15336 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)) { 15337 break 15338 } 15339 b = mergePoint(b, x0, x1, x2) 15340 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15341 v.reset(OpCopy) 15342 v.AddArg(v0) 15343 v0.AuxInt = i0 15344 v0.Aux = s 15345 v0.AddArg(p) 15346 v0.AddArg(idx) 15347 v0.AddArg(mem) 15348 return true 15349 } 15350 // 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))) 15351 // 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) 15352 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15353 for { 15354 _ = v.Args[1] 15355 o0 := v.Args[0] 15356 if o0.Op != Op386ORL { 15357 break 15358 } 15359 _ = o0.Args[1] 15360 s0 := o0.Args[0] 15361 if s0.Op != Op386SHLLconst { 15362 break 15363 } 15364 if s0.AuxInt != 16 { 15365 break 15366 } 15367 x1 := s0.Args[0] 15368 if x1.Op != Op386MOVBloadidx1 { 15369 break 15370 } 15371 i2 := x1.AuxInt 15372 s := x1.Aux 15373 _ = x1.Args[2] 15374 p := x1.Args[0] 15375 idx := x1.Args[1] 15376 mem := x1.Args[2] 15377 x0 := o0.Args[1] 15378 if x0.Op != Op386MOVWloadidx1 { 15379 break 15380 } 15381 i0 := x0.AuxInt 15382 if x0.Aux != s { 15383 break 15384 } 15385 _ = x0.Args[2] 15386 if p != x0.Args[0] { 15387 break 15388 } 15389 if idx != x0.Args[1] { 15390 break 15391 } 15392 if mem != x0.Args[2] { 15393 break 15394 } 15395 s1 := v.Args[1] 15396 if s1.Op != Op386SHLLconst { 15397 break 15398 } 15399 if s1.AuxInt != 24 { 15400 break 15401 } 15402 x2 := s1.Args[0] 15403 if x2.Op != Op386MOVBloadidx1 { 15404 break 15405 } 15406 i3 := x2.AuxInt 15407 if x2.Aux != s { 15408 break 15409 } 15410 _ = x2.Args[2] 15411 if p != x2.Args[0] { 15412 break 15413 } 15414 if idx != x2.Args[1] { 15415 break 15416 } 15417 if mem != x2.Args[2] { 15418 break 15419 } 15420 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)) { 15421 break 15422 } 15423 b = mergePoint(b, x0, x1, x2) 15424 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15425 v.reset(OpCopy) 15426 v.AddArg(v0) 15427 v0.AuxInt = i0 15428 v0.Aux = s 15429 v0.AddArg(p) 15430 v0.AddArg(idx) 15431 v0.AddArg(mem) 15432 return true 15433 } 15434 // 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))) 15435 // 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) 15436 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15437 for { 15438 _ = v.Args[1] 15439 o0 := v.Args[0] 15440 if o0.Op != Op386ORL { 15441 break 15442 } 15443 _ = o0.Args[1] 15444 s0 := o0.Args[0] 15445 if s0.Op != Op386SHLLconst { 15446 break 15447 } 15448 if s0.AuxInt != 16 { 15449 break 15450 } 15451 x1 := s0.Args[0] 15452 if x1.Op != Op386MOVBloadidx1 { 15453 break 15454 } 15455 i2 := x1.AuxInt 15456 s := x1.Aux 15457 _ = x1.Args[2] 15458 idx := x1.Args[0] 15459 p := x1.Args[1] 15460 mem := x1.Args[2] 15461 x0 := o0.Args[1] 15462 if x0.Op != Op386MOVWloadidx1 { 15463 break 15464 } 15465 i0 := x0.AuxInt 15466 if x0.Aux != s { 15467 break 15468 } 15469 _ = x0.Args[2] 15470 if p != x0.Args[0] { 15471 break 15472 } 15473 if idx != x0.Args[1] { 15474 break 15475 } 15476 if mem != x0.Args[2] { 15477 break 15478 } 15479 s1 := v.Args[1] 15480 if s1.Op != Op386SHLLconst { 15481 break 15482 } 15483 if s1.AuxInt != 24 { 15484 break 15485 } 15486 x2 := s1.Args[0] 15487 if x2.Op != Op386MOVBloadidx1 { 15488 break 15489 } 15490 i3 := x2.AuxInt 15491 if x2.Aux != s { 15492 break 15493 } 15494 _ = x2.Args[2] 15495 if p != x2.Args[0] { 15496 break 15497 } 15498 if idx != x2.Args[1] { 15499 break 15500 } 15501 if mem != x2.Args[2] { 15502 break 15503 } 15504 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)) { 15505 break 15506 } 15507 b = mergePoint(b, x0, x1, x2) 15508 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15509 v.reset(OpCopy) 15510 v.AddArg(v0) 15511 v0.AuxInt = i0 15512 v0.Aux = s 15513 v0.AddArg(p) 15514 v0.AddArg(idx) 15515 v0.AddArg(mem) 15516 return true 15517 } 15518 // 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))) 15519 // 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) 15520 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15521 for { 15522 _ = v.Args[1] 15523 o0 := v.Args[0] 15524 if o0.Op != Op386ORL { 15525 break 15526 } 15527 _ = o0.Args[1] 15528 s0 := o0.Args[0] 15529 if s0.Op != Op386SHLLconst { 15530 break 15531 } 15532 if s0.AuxInt != 16 { 15533 break 15534 } 15535 x1 := s0.Args[0] 15536 if x1.Op != Op386MOVBloadidx1 { 15537 break 15538 } 15539 i2 := x1.AuxInt 15540 s := x1.Aux 15541 _ = x1.Args[2] 15542 p := x1.Args[0] 15543 idx := x1.Args[1] 15544 mem := x1.Args[2] 15545 x0 := o0.Args[1] 15546 if x0.Op != Op386MOVWloadidx1 { 15547 break 15548 } 15549 i0 := x0.AuxInt 15550 if x0.Aux != s { 15551 break 15552 } 15553 _ = x0.Args[2] 15554 if idx != x0.Args[0] { 15555 break 15556 } 15557 if p != x0.Args[1] { 15558 break 15559 } 15560 if mem != x0.Args[2] { 15561 break 15562 } 15563 s1 := v.Args[1] 15564 if s1.Op != Op386SHLLconst { 15565 break 15566 } 15567 if s1.AuxInt != 24 { 15568 break 15569 } 15570 x2 := s1.Args[0] 15571 if x2.Op != Op386MOVBloadidx1 { 15572 break 15573 } 15574 i3 := x2.AuxInt 15575 if x2.Aux != s { 15576 break 15577 } 15578 _ = x2.Args[2] 15579 if p != x2.Args[0] { 15580 break 15581 } 15582 if idx != x2.Args[1] { 15583 break 15584 } 15585 if mem != x2.Args[2] { 15586 break 15587 } 15588 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)) { 15589 break 15590 } 15591 b = mergePoint(b, x0, x1, x2) 15592 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15593 v.reset(OpCopy) 15594 v.AddArg(v0) 15595 v0.AuxInt = i0 15596 v0.Aux = s 15597 v0.AddArg(p) 15598 v0.AddArg(idx) 15599 v0.AddArg(mem) 15600 return true 15601 } 15602 // 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))) 15603 // 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) 15604 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15605 for { 15606 _ = v.Args[1] 15607 o0 := v.Args[0] 15608 if o0.Op != Op386ORL { 15609 break 15610 } 15611 _ = o0.Args[1] 15612 s0 := o0.Args[0] 15613 if s0.Op != Op386SHLLconst { 15614 break 15615 } 15616 if s0.AuxInt != 16 { 15617 break 15618 } 15619 x1 := s0.Args[0] 15620 if x1.Op != Op386MOVBloadidx1 { 15621 break 15622 } 15623 i2 := x1.AuxInt 15624 s := x1.Aux 15625 _ = x1.Args[2] 15626 idx := x1.Args[0] 15627 p := x1.Args[1] 15628 mem := x1.Args[2] 15629 x0 := o0.Args[1] 15630 if x0.Op != Op386MOVWloadidx1 { 15631 break 15632 } 15633 i0 := x0.AuxInt 15634 if x0.Aux != s { 15635 break 15636 } 15637 _ = x0.Args[2] 15638 if idx != x0.Args[0] { 15639 break 15640 } 15641 if p != x0.Args[1] { 15642 break 15643 } 15644 if mem != x0.Args[2] { 15645 break 15646 } 15647 s1 := v.Args[1] 15648 if s1.Op != Op386SHLLconst { 15649 break 15650 } 15651 if s1.AuxInt != 24 { 15652 break 15653 } 15654 x2 := s1.Args[0] 15655 if x2.Op != Op386MOVBloadidx1 { 15656 break 15657 } 15658 i3 := x2.AuxInt 15659 if x2.Aux != s { 15660 break 15661 } 15662 _ = x2.Args[2] 15663 if p != x2.Args[0] { 15664 break 15665 } 15666 if idx != x2.Args[1] { 15667 break 15668 } 15669 if mem != x2.Args[2] { 15670 break 15671 } 15672 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)) { 15673 break 15674 } 15675 b = mergePoint(b, x0, x1, x2) 15676 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15677 v.reset(OpCopy) 15678 v.AddArg(v0) 15679 v0.AuxInt = i0 15680 v0.Aux = s 15681 v0.AddArg(p) 15682 v0.AddArg(idx) 15683 v0.AddArg(mem) 15684 return true 15685 } 15686 // 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))) 15687 // 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) 15688 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15689 for { 15690 _ = v.Args[1] 15691 o0 := v.Args[0] 15692 if o0.Op != Op386ORL { 15693 break 15694 } 15695 _ = o0.Args[1] 15696 x0 := o0.Args[0] 15697 if x0.Op != Op386MOVWloadidx1 { 15698 break 15699 } 15700 i0 := x0.AuxInt 15701 s := x0.Aux 15702 _ = x0.Args[2] 15703 p := x0.Args[0] 15704 idx := x0.Args[1] 15705 mem := x0.Args[2] 15706 s0 := o0.Args[1] 15707 if s0.Op != Op386SHLLconst { 15708 break 15709 } 15710 if s0.AuxInt != 16 { 15711 break 15712 } 15713 x1 := s0.Args[0] 15714 if x1.Op != Op386MOVBloadidx1 { 15715 break 15716 } 15717 i2 := x1.AuxInt 15718 if x1.Aux != s { 15719 break 15720 } 15721 _ = x1.Args[2] 15722 if p != x1.Args[0] { 15723 break 15724 } 15725 if idx != x1.Args[1] { 15726 break 15727 } 15728 if mem != x1.Args[2] { 15729 break 15730 } 15731 s1 := v.Args[1] 15732 if s1.Op != Op386SHLLconst { 15733 break 15734 } 15735 if s1.AuxInt != 24 { 15736 break 15737 } 15738 x2 := s1.Args[0] 15739 if x2.Op != Op386MOVBloadidx1 { 15740 break 15741 } 15742 i3 := x2.AuxInt 15743 if x2.Aux != s { 15744 break 15745 } 15746 _ = x2.Args[2] 15747 if idx != x2.Args[0] { 15748 break 15749 } 15750 if p != x2.Args[1] { 15751 break 15752 } 15753 if mem != x2.Args[2] { 15754 break 15755 } 15756 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)) { 15757 break 15758 } 15759 b = mergePoint(b, x0, x1, x2) 15760 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15761 v.reset(OpCopy) 15762 v.AddArg(v0) 15763 v0.AuxInt = i0 15764 v0.Aux = s 15765 v0.AddArg(p) 15766 v0.AddArg(idx) 15767 v0.AddArg(mem) 15768 return true 15769 } 15770 // 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))) 15771 // 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) 15772 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15773 for { 15774 _ = v.Args[1] 15775 o0 := v.Args[0] 15776 if o0.Op != Op386ORL { 15777 break 15778 } 15779 _ = o0.Args[1] 15780 x0 := o0.Args[0] 15781 if x0.Op != Op386MOVWloadidx1 { 15782 break 15783 } 15784 i0 := x0.AuxInt 15785 s := x0.Aux 15786 _ = x0.Args[2] 15787 idx := x0.Args[0] 15788 p := x0.Args[1] 15789 mem := x0.Args[2] 15790 s0 := o0.Args[1] 15791 if s0.Op != Op386SHLLconst { 15792 break 15793 } 15794 if s0.AuxInt != 16 { 15795 break 15796 } 15797 x1 := s0.Args[0] 15798 if x1.Op != Op386MOVBloadidx1 { 15799 break 15800 } 15801 i2 := x1.AuxInt 15802 if x1.Aux != s { 15803 break 15804 } 15805 _ = x1.Args[2] 15806 if p != x1.Args[0] { 15807 break 15808 } 15809 if idx != x1.Args[1] { 15810 break 15811 } 15812 if mem != x1.Args[2] { 15813 break 15814 } 15815 s1 := v.Args[1] 15816 if s1.Op != Op386SHLLconst { 15817 break 15818 } 15819 if s1.AuxInt != 24 { 15820 break 15821 } 15822 x2 := s1.Args[0] 15823 if x2.Op != Op386MOVBloadidx1 { 15824 break 15825 } 15826 i3 := x2.AuxInt 15827 if x2.Aux != s { 15828 break 15829 } 15830 _ = x2.Args[2] 15831 if idx != x2.Args[0] { 15832 break 15833 } 15834 if p != x2.Args[1] { 15835 break 15836 } 15837 if mem != x2.Args[2] { 15838 break 15839 } 15840 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)) { 15841 break 15842 } 15843 b = mergePoint(b, x0, x1, x2) 15844 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15845 v.reset(OpCopy) 15846 v.AddArg(v0) 15847 v0.AuxInt = i0 15848 v0.Aux = s 15849 v0.AddArg(p) 15850 v0.AddArg(idx) 15851 v0.AddArg(mem) 15852 return true 15853 } 15854 // 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))) 15855 // 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) 15856 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15857 for { 15858 _ = v.Args[1] 15859 o0 := v.Args[0] 15860 if o0.Op != Op386ORL { 15861 break 15862 } 15863 _ = o0.Args[1] 15864 x0 := o0.Args[0] 15865 if x0.Op != Op386MOVWloadidx1 { 15866 break 15867 } 15868 i0 := x0.AuxInt 15869 s := x0.Aux 15870 _ = x0.Args[2] 15871 p := x0.Args[0] 15872 idx := x0.Args[1] 15873 mem := x0.Args[2] 15874 s0 := o0.Args[1] 15875 if s0.Op != Op386SHLLconst { 15876 break 15877 } 15878 if s0.AuxInt != 16 { 15879 break 15880 } 15881 x1 := s0.Args[0] 15882 if x1.Op != Op386MOVBloadidx1 { 15883 break 15884 } 15885 i2 := x1.AuxInt 15886 if x1.Aux != s { 15887 break 15888 } 15889 _ = x1.Args[2] 15890 if idx != x1.Args[0] { 15891 break 15892 } 15893 if p != x1.Args[1] { 15894 break 15895 } 15896 if mem != x1.Args[2] { 15897 break 15898 } 15899 s1 := v.Args[1] 15900 if s1.Op != Op386SHLLconst { 15901 break 15902 } 15903 if s1.AuxInt != 24 { 15904 break 15905 } 15906 x2 := s1.Args[0] 15907 if x2.Op != Op386MOVBloadidx1 { 15908 break 15909 } 15910 i3 := x2.AuxInt 15911 if x2.Aux != s { 15912 break 15913 } 15914 _ = x2.Args[2] 15915 if idx != x2.Args[0] { 15916 break 15917 } 15918 if p != x2.Args[1] { 15919 break 15920 } 15921 if mem != x2.Args[2] { 15922 break 15923 } 15924 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)) { 15925 break 15926 } 15927 b = mergePoint(b, x0, x1, x2) 15928 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 15929 v.reset(OpCopy) 15930 v.AddArg(v0) 15931 v0.AuxInt = i0 15932 v0.Aux = s 15933 v0.AddArg(p) 15934 v0.AddArg(idx) 15935 v0.AddArg(mem) 15936 return true 15937 } 15938 // 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))) 15939 // 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) 15940 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 15941 for { 15942 _ = v.Args[1] 15943 o0 := v.Args[0] 15944 if o0.Op != Op386ORL { 15945 break 15946 } 15947 _ = o0.Args[1] 15948 x0 := o0.Args[0] 15949 if x0.Op != Op386MOVWloadidx1 { 15950 break 15951 } 15952 i0 := x0.AuxInt 15953 s := x0.Aux 15954 _ = x0.Args[2] 15955 idx := x0.Args[0] 15956 p := x0.Args[1] 15957 mem := x0.Args[2] 15958 s0 := o0.Args[1] 15959 if s0.Op != Op386SHLLconst { 15960 break 15961 } 15962 if s0.AuxInt != 16 { 15963 break 15964 } 15965 x1 := s0.Args[0] 15966 if x1.Op != Op386MOVBloadidx1 { 15967 break 15968 } 15969 i2 := x1.AuxInt 15970 if x1.Aux != s { 15971 break 15972 } 15973 _ = x1.Args[2] 15974 if idx != x1.Args[0] { 15975 break 15976 } 15977 if p != x1.Args[1] { 15978 break 15979 } 15980 if mem != x1.Args[2] { 15981 break 15982 } 15983 s1 := v.Args[1] 15984 if s1.Op != Op386SHLLconst { 15985 break 15986 } 15987 if s1.AuxInt != 24 { 15988 break 15989 } 15990 x2 := s1.Args[0] 15991 if x2.Op != Op386MOVBloadidx1 { 15992 break 15993 } 15994 i3 := x2.AuxInt 15995 if x2.Aux != s { 15996 break 15997 } 15998 _ = x2.Args[2] 15999 if idx != x2.Args[0] { 16000 break 16001 } 16002 if p != x2.Args[1] { 16003 break 16004 } 16005 if mem != x2.Args[2] { 16006 break 16007 } 16008 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)) { 16009 break 16010 } 16011 b = mergePoint(b, x0, x1, x2) 16012 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16013 v.reset(OpCopy) 16014 v.AddArg(v0) 16015 v0.AuxInt = i0 16016 v0.Aux = s 16017 v0.AddArg(p) 16018 v0.AddArg(idx) 16019 v0.AddArg(mem) 16020 return true 16021 } 16022 // 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))) 16023 // 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) 16024 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16025 for { 16026 _ = v.Args[1] 16027 o0 := v.Args[0] 16028 if o0.Op != Op386ORL { 16029 break 16030 } 16031 _ = o0.Args[1] 16032 s0 := o0.Args[0] 16033 if s0.Op != Op386SHLLconst { 16034 break 16035 } 16036 if s0.AuxInt != 16 { 16037 break 16038 } 16039 x1 := s0.Args[0] 16040 if x1.Op != Op386MOVBloadidx1 { 16041 break 16042 } 16043 i2 := x1.AuxInt 16044 s := x1.Aux 16045 _ = x1.Args[2] 16046 p := x1.Args[0] 16047 idx := x1.Args[1] 16048 mem := x1.Args[2] 16049 x0 := o0.Args[1] 16050 if x0.Op != Op386MOVWloadidx1 { 16051 break 16052 } 16053 i0 := x0.AuxInt 16054 if x0.Aux != s { 16055 break 16056 } 16057 _ = x0.Args[2] 16058 if p != x0.Args[0] { 16059 break 16060 } 16061 if idx != x0.Args[1] { 16062 break 16063 } 16064 if mem != x0.Args[2] { 16065 break 16066 } 16067 s1 := v.Args[1] 16068 if s1.Op != Op386SHLLconst { 16069 break 16070 } 16071 if s1.AuxInt != 24 { 16072 break 16073 } 16074 x2 := s1.Args[0] 16075 if x2.Op != Op386MOVBloadidx1 { 16076 break 16077 } 16078 i3 := x2.AuxInt 16079 if x2.Aux != s { 16080 break 16081 } 16082 _ = x2.Args[2] 16083 if idx != x2.Args[0] { 16084 break 16085 } 16086 if p != x2.Args[1] { 16087 break 16088 } 16089 if mem != x2.Args[2] { 16090 break 16091 } 16092 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)) { 16093 break 16094 } 16095 b = mergePoint(b, x0, x1, x2) 16096 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16097 v.reset(OpCopy) 16098 v.AddArg(v0) 16099 v0.AuxInt = i0 16100 v0.Aux = s 16101 v0.AddArg(p) 16102 v0.AddArg(idx) 16103 v0.AddArg(mem) 16104 return true 16105 } 16106 return false 16107 } 16108 func rewriteValue386_Op386ORL_40(v *Value) bool { 16109 b := v.Block 16110 _ = b 16111 // 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))) 16112 // 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) 16113 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16114 for { 16115 _ = v.Args[1] 16116 o0 := v.Args[0] 16117 if o0.Op != Op386ORL { 16118 break 16119 } 16120 _ = o0.Args[1] 16121 s0 := o0.Args[0] 16122 if s0.Op != Op386SHLLconst { 16123 break 16124 } 16125 if s0.AuxInt != 16 { 16126 break 16127 } 16128 x1 := s0.Args[0] 16129 if x1.Op != Op386MOVBloadidx1 { 16130 break 16131 } 16132 i2 := x1.AuxInt 16133 s := x1.Aux 16134 _ = x1.Args[2] 16135 idx := x1.Args[0] 16136 p := x1.Args[1] 16137 mem := x1.Args[2] 16138 x0 := o0.Args[1] 16139 if x0.Op != Op386MOVWloadidx1 { 16140 break 16141 } 16142 i0 := x0.AuxInt 16143 if x0.Aux != s { 16144 break 16145 } 16146 _ = x0.Args[2] 16147 if p != x0.Args[0] { 16148 break 16149 } 16150 if idx != x0.Args[1] { 16151 break 16152 } 16153 if mem != x0.Args[2] { 16154 break 16155 } 16156 s1 := v.Args[1] 16157 if s1.Op != Op386SHLLconst { 16158 break 16159 } 16160 if s1.AuxInt != 24 { 16161 break 16162 } 16163 x2 := s1.Args[0] 16164 if x2.Op != Op386MOVBloadidx1 { 16165 break 16166 } 16167 i3 := x2.AuxInt 16168 if x2.Aux != s { 16169 break 16170 } 16171 _ = x2.Args[2] 16172 if idx != x2.Args[0] { 16173 break 16174 } 16175 if p != x2.Args[1] { 16176 break 16177 } 16178 if mem != x2.Args[2] { 16179 break 16180 } 16181 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)) { 16182 break 16183 } 16184 b = mergePoint(b, x0, x1, x2) 16185 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16186 v.reset(OpCopy) 16187 v.AddArg(v0) 16188 v0.AuxInt = i0 16189 v0.Aux = s 16190 v0.AddArg(p) 16191 v0.AddArg(idx) 16192 v0.AddArg(mem) 16193 return true 16194 } 16195 // 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))) 16196 // 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) 16197 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16198 for { 16199 _ = v.Args[1] 16200 o0 := v.Args[0] 16201 if o0.Op != Op386ORL { 16202 break 16203 } 16204 _ = o0.Args[1] 16205 s0 := o0.Args[0] 16206 if s0.Op != Op386SHLLconst { 16207 break 16208 } 16209 if s0.AuxInt != 16 { 16210 break 16211 } 16212 x1 := s0.Args[0] 16213 if x1.Op != Op386MOVBloadidx1 { 16214 break 16215 } 16216 i2 := x1.AuxInt 16217 s := x1.Aux 16218 _ = x1.Args[2] 16219 p := x1.Args[0] 16220 idx := x1.Args[1] 16221 mem := x1.Args[2] 16222 x0 := o0.Args[1] 16223 if x0.Op != Op386MOVWloadidx1 { 16224 break 16225 } 16226 i0 := x0.AuxInt 16227 if x0.Aux != s { 16228 break 16229 } 16230 _ = x0.Args[2] 16231 if idx != x0.Args[0] { 16232 break 16233 } 16234 if p != x0.Args[1] { 16235 break 16236 } 16237 if mem != x0.Args[2] { 16238 break 16239 } 16240 s1 := v.Args[1] 16241 if s1.Op != Op386SHLLconst { 16242 break 16243 } 16244 if s1.AuxInt != 24 { 16245 break 16246 } 16247 x2 := s1.Args[0] 16248 if x2.Op != Op386MOVBloadidx1 { 16249 break 16250 } 16251 i3 := x2.AuxInt 16252 if x2.Aux != s { 16253 break 16254 } 16255 _ = x2.Args[2] 16256 if idx != x2.Args[0] { 16257 break 16258 } 16259 if p != x2.Args[1] { 16260 break 16261 } 16262 if mem != x2.Args[2] { 16263 break 16264 } 16265 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)) { 16266 break 16267 } 16268 b = mergePoint(b, x0, x1, x2) 16269 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16270 v.reset(OpCopy) 16271 v.AddArg(v0) 16272 v0.AuxInt = i0 16273 v0.Aux = s 16274 v0.AddArg(p) 16275 v0.AddArg(idx) 16276 v0.AddArg(mem) 16277 return true 16278 } 16279 // 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))) 16280 // 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) 16281 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16282 for { 16283 _ = v.Args[1] 16284 o0 := v.Args[0] 16285 if o0.Op != Op386ORL { 16286 break 16287 } 16288 _ = o0.Args[1] 16289 s0 := o0.Args[0] 16290 if s0.Op != Op386SHLLconst { 16291 break 16292 } 16293 if s0.AuxInt != 16 { 16294 break 16295 } 16296 x1 := s0.Args[0] 16297 if x1.Op != Op386MOVBloadidx1 { 16298 break 16299 } 16300 i2 := x1.AuxInt 16301 s := x1.Aux 16302 _ = x1.Args[2] 16303 idx := x1.Args[0] 16304 p := x1.Args[1] 16305 mem := x1.Args[2] 16306 x0 := o0.Args[1] 16307 if x0.Op != Op386MOVWloadidx1 { 16308 break 16309 } 16310 i0 := x0.AuxInt 16311 if x0.Aux != s { 16312 break 16313 } 16314 _ = x0.Args[2] 16315 if idx != x0.Args[0] { 16316 break 16317 } 16318 if p != x0.Args[1] { 16319 break 16320 } 16321 if mem != x0.Args[2] { 16322 break 16323 } 16324 s1 := v.Args[1] 16325 if s1.Op != Op386SHLLconst { 16326 break 16327 } 16328 if s1.AuxInt != 24 { 16329 break 16330 } 16331 x2 := s1.Args[0] 16332 if x2.Op != Op386MOVBloadidx1 { 16333 break 16334 } 16335 i3 := x2.AuxInt 16336 if x2.Aux != s { 16337 break 16338 } 16339 _ = x2.Args[2] 16340 if idx != x2.Args[0] { 16341 break 16342 } 16343 if p != x2.Args[1] { 16344 break 16345 } 16346 if mem != x2.Args[2] { 16347 break 16348 } 16349 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)) { 16350 break 16351 } 16352 b = mergePoint(b, x0, x1, x2) 16353 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16354 v.reset(OpCopy) 16355 v.AddArg(v0) 16356 v0.AuxInt = i0 16357 v0.Aux = s 16358 v0.AddArg(p) 16359 v0.AddArg(idx) 16360 v0.AddArg(mem) 16361 return true 16362 } 16363 // 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)))) 16364 // 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) 16365 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16366 for { 16367 _ = v.Args[1] 16368 s1 := v.Args[0] 16369 if s1.Op != Op386SHLLconst { 16370 break 16371 } 16372 if s1.AuxInt != 24 { 16373 break 16374 } 16375 x2 := s1.Args[0] 16376 if x2.Op != Op386MOVBloadidx1 { 16377 break 16378 } 16379 i3 := x2.AuxInt 16380 s := x2.Aux 16381 _ = x2.Args[2] 16382 p := x2.Args[0] 16383 idx := x2.Args[1] 16384 mem := x2.Args[2] 16385 o0 := v.Args[1] 16386 if o0.Op != Op386ORL { 16387 break 16388 } 16389 _ = o0.Args[1] 16390 x0 := o0.Args[0] 16391 if x0.Op != Op386MOVWloadidx1 { 16392 break 16393 } 16394 i0 := x0.AuxInt 16395 if x0.Aux != s { 16396 break 16397 } 16398 _ = x0.Args[2] 16399 if p != x0.Args[0] { 16400 break 16401 } 16402 if idx != x0.Args[1] { 16403 break 16404 } 16405 if mem != x0.Args[2] { 16406 break 16407 } 16408 s0 := o0.Args[1] 16409 if s0.Op != Op386SHLLconst { 16410 break 16411 } 16412 if s0.AuxInt != 16 { 16413 break 16414 } 16415 x1 := s0.Args[0] 16416 if x1.Op != Op386MOVBloadidx1 { 16417 break 16418 } 16419 i2 := x1.AuxInt 16420 if x1.Aux != s { 16421 break 16422 } 16423 _ = x1.Args[2] 16424 if p != x1.Args[0] { 16425 break 16426 } 16427 if idx != x1.Args[1] { 16428 break 16429 } 16430 if mem != x1.Args[2] { 16431 break 16432 } 16433 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)) { 16434 break 16435 } 16436 b = mergePoint(b, x0, x1, x2) 16437 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16438 v.reset(OpCopy) 16439 v.AddArg(v0) 16440 v0.AuxInt = i0 16441 v0.Aux = s 16442 v0.AddArg(p) 16443 v0.AddArg(idx) 16444 v0.AddArg(mem) 16445 return true 16446 } 16447 // 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)))) 16448 // 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) 16449 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16450 for { 16451 _ = v.Args[1] 16452 s1 := v.Args[0] 16453 if s1.Op != Op386SHLLconst { 16454 break 16455 } 16456 if s1.AuxInt != 24 { 16457 break 16458 } 16459 x2 := s1.Args[0] 16460 if x2.Op != Op386MOVBloadidx1 { 16461 break 16462 } 16463 i3 := x2.AuxInt 16464 s := x2.Aux 16465 _ = x2.Args[2] 16466 idx := x2.Args[0] 16467 p := x2.Args[1] 16468 mem := x2.Args[2] 16469 o0 := v.Args[1] 16470 if o0.Op != Op386ORL { 16471 break 16472 } 16473 _ = o0.Args[1] 16474 x0 := o0.Args[0] 16475 if x0.Op != Op386MOVWloadidx1 { 16476 break 16477 } 16478 i0 := x0.AuxInt 16479 if x0.Aux != s { 16480 break 16481 } 16482 _ = x0.Args[2] 16483 if p != x0.Args[0] { 16484 break 16485 } 16486 if idx != x0.Args[1] { 16487 break 16488 } 16489 if mem != x0.Args[2] { 16490 break 16491 } 16492 s0 := o0.Args[1] 16493 if s0.Op != Op386SHLLconst { 16494 break 16495 } 16496 if s0.AuxInt != 16 { 16497 break 16498 } 16499 x1 := s0.Args[0] 16500 if x1.Op != Op386MOVBloadidx1 { 16501 break 16502 } 16503 i2 := x1.AuxInt 16504 if x1.Aux != s { 16505 break 16506 } 16507 _ = x1.Args[2] 16508 if p != x1.Args[0] { 16509 break 16510 } 16511 if idx != x1.Args[1] { 16512 break 16513 } 16514 if mem != x1.Args[2] { 16515 break 16516 } 16517 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)) { 16518 break 16519 } 16520 b = mergePoint(b, x0, x1, x2) 16521 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16522 v.reset(OpCopy) 16523 v.AddArg(v0) 16524 v0.AuxInt = i0 16525 v0.Aux = s 16526 v0.AddArg(p) 16527 v0.AddArg(idx) 16528 v0.AddArg(mem) 16529 return true 16530 } 16531 // 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)))) 16532 // 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) 16533 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16534 for { 16535 _ = v.Args[1] 16536 s1 := v.Args[0] 16537 if s1.Op != Op386SHLLconst { 16538 break 16539 } 16540 if s1.AuxInt != 24 { 16541 break 16542 } 16543 x2 := s1.Args[0] 16544 if x2.Op != Op386MOVBloadidx1 { 16545 break 16546 } 16547 i3 := x2.AuxInt 16548 s := x2.Aux 16549 _ = x2.Args[2] 16550 p := x2.Args[0] 16551 idx := x2.Args[1] 16552 mem := x2.Args[2] 16553 o0 := v.Args[1] 16554 if o0.Op != Op386ORL { 16555 break 16556 } 16557 _ = o0.Args[1] 16558 x0 := o0.Args[0] 16559 if x0.Op != Op386MOVWloadidx1 { 16560 break 16561 } 16562 i0 := x0.AuxInt 16563 if x0.Aux != s { 16564 break 16565 } 16566 _ = x0.Args[2] 16567 if idx != x0.Args[0] { 16568 break 16569 } 16570 if p != x0.Args[1] { 16571 break 16572 } 16573 if mem != x0.Args[2] { 16574 break 16575 } 16576 s0 := o0.Args[1] 16577 if s0.Op != Op386SHLLconst { 16578 break 16579 } 16580 if s0.AuxInt != 16 { 16581 break 16582 } 16583 x1 := s0.Args[0] 16584 if x1.Op != Op386MOVBloadidx1 { 16585 break 16586 } 16587 i2 := x1.AuxInt 16588 if x1.Aux != s { 16589 break 16590 } 16591 _ = x1.Args[2] 16592 if p != x1.Args[0] { 16593 break 16594 } 16595 if idx != x1.Args[1] { 16596 break 16597 } 16598 if mem != x1.Args[2] { 16599 break 16600 } 16601 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)) { 16602 break 16603 } 16604 b = mergePoint(b, x0, x1, x2) 16605 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16606 v.reset(OpCopy) 16607 v.AddArg(v0) 16608 v0.AuxInt = i0 16609 v0.Aux = s 16610 v0.AddArg(p) 16611 v0.AddArg(idx) 16612 v0.AddArg(mem) 16613 return true 16614 } 16615 // 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)))) 16616 // 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) 16617 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16618 for { 16619 _ = v.Args[1] 16620 s1 := v.Args[0] 16621 if s1.Op != Op386SHLLconst { 16622 break 16623 } 16624 if s1.AuxInt != 24 { 16625 break 16626 } 16627 x2 := s1.Args[0] 16628 if x2.Op != Op386MOVBloadidx1 { 16629 break 16630 } 16631 i3 := x2.AuxInt 16632 s := x2.Aux 16633 _ = x2.Args[2] 16634 idx := x2.Args[0] 16635 p := x2.Args[1] 16636 mem := x2.Args[2] 16637 o0 := v.Args[1] 16638 if o0.Op != Op386ORL { 16639 break 16640 } 16641 _ = o0.Args[1] 16642 x0 := o0.Args[0] 16643 if x0.Op != Op386MOVWloadidx1 { 16644 break 16645 } 16646 i0 := x0.AuxInt 16647 if x0.Aux != s { 16648 break 16649 } 16650 _ = x0.Args[2] 16651 if idx != x0.Args[0] { 16652 break 16653 } 16654 if p != x0.Args[1] { 16655 break 16656 } 16657 if mem != x0.Args[2] { 16658 break 16659 } 16660 s0 := o0.Args[1] 16661 if s0.Op != Op386SHLLconst { 16662 break 16663 } 16664 if s0.AuxInt != 16 { 16665 break 16666 } 16667 x1 := s0.Args[0] 16668 if x1.Op != Op386MOVBloadidx1 { 16669 break 16670 } 16671 i2 := x1.AuxInt 16672 if x1.Aux != s { 16673 break 16674 } 16675 _ = x1.Args[2] 16676 if p != x1.Args[0] { 16677 break 16678 } 16679 if idx != x1.Args[1] { 16680 break 16681 } 16682 if mem != x1.Args[2] { 16683 break 16684 } 16685 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)) { 16686 break 16687 } 16688 b = mergePoint(b, x0, x1, x2) 16689 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16690 v.reset(OpCopy) 16691 v.AddArg(v0) 16692 v0.AuxInt = i0 16693 v0.Aux = s 16694 v0.AddArg(p) 16695 v0.AddArg(idx) 16696 v0.AddArg(mem) 16697 return true 16698 } 16699 // 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)))) 16700 // 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) 16701 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16702 for { 16703 _ = v.Args[1] 16704 s1 := v.Args[0] 16705 if s1.Op != Op386SHLLconst { 16706 break 16707 } 16708 if s1.AuxInt != 24 { 16709 break 16710 } 16711 x2 := s1.Args[0] 16712 if x2.Op != Op386MOVBloadidx1 { 16713 break 16714 } 16715 i3 := x2.AuxInt 16716 s := x2.Aux 16717 _ = x2.Args[2] 16718 p := x2.Args[0] 16719 idx := x2.Args[1] 16720 mem := x2.Args[2] 16721 o0 := v.Args[1] 16722 if o0.Op != Op386ORL { 16723 break 16724 } 16725 _ = o0.Args[1] 16726 x0 := o0.Args[0] 16727 if x0.Op != Op386MOVWloadidx1 { 16728 break 16729 } 16730 i0 := x0.AuxInt 16731 if x0.Aux != s { 16732 break 16733 } 16734 _ = x0.Args[2] 16735 if p != x0.Args[0] { 16736 break 16737 } 16738 if idx != x0.Args[1] { 16739 break 16740 } 16741 if mem != x0.Args[2] { 16742 break 16743 } 16744 s0 := o0.Args[1] 16745 if s0.Op != Op386SHLLconst { 16746 break 16747 } 16748 if s0.AuxInt != 16 { 16749 break 16750 } 16751 x1 := s0.Args[0] 16752 if x1.Op != Op386MOVBloadidx1 { 16753 break 16754 } 16755 i2 := x1.AuxInt 16756 if x1.Aux != s { 16757 break 16758 } 16759 _ = x1.Args[2] 16760 if idx != x1.Args[0] { 16761 break 16762 } 16763 if p != x1.Args[1] { 16764 break 16765 } 16766 if mem != x1.Args[2] { 16767 break 16768 } 16769 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)) { 16770 break 16771 } 16772 b = mergePoint(b, x0, x1, x2) 16773 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16774 v.reset(OpCopy) 16775 v.AddArg(v0) 16776 v0.AuxInt = i0 16777 v0.Aux = s 16778 v0.AddArg(p) 16779 v0.AddArg(idx) 16780 v0.AddArg(mem) 16781 return true 16782 } 16783 // 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)))) 16784 // 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) 16785 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16786 for { 16787 _ = v.Args[1] 16788 s1 := v.Args[0] 16789 if s1.Op != Op386SHLLconst { 16790 break 16791 } 16792 if s1.AuxInt != 24 { 16793 break 16794 } 16795 x2 := s1.Args[0] 16796 if x2.Op != Op386MOVBloadidx1 { 16797 break 16798 } 16799 i3 := x2.AuxInt 16800 s := x2.Aux 16801 _ = x2.Args[2] 16802 idx := x2.Args[0] 16803 p := x2.Args[1] 16804 mem := x2.Args[2] 16805 o0 := v.Args[1] 16806 if o0.Op != Op386ORL { 16807 break 16808 } 16809 _ = o0.Args[1] 16810 x0 := o0.Args[0] 16811 if x0.Op != Op386MOVWloadidx1 { 16812 break 16813 } 16814 i0 := x0.AuxInt 16815 if x0.Aux != s { 16816 break 16817 } 16818 _ = x0.Args[2] 16819 if p != x0.Args[0] { 16820 break 16821 } 16822 if idx != x0.Args[1] { 16823 break 16824 } 16825 if mem != x0.Args[2] { 16826 break 16827 } 16828 s0 := o0.Args[1] 16829 if s0.Op != Op386SHLLconst { 16830 break 16831 } 16832 if s0.AuxInt != 16 { 16833 break 16834 } 16835 x1 := s0.Args[0] 16836 if x1.Op != Op386MOVBloadidx1 { 16837 break 16838 } 16839 i2 := x1.AuxInt 16840 if x1.Aux != s { 16841 break 16842 } 16843 _ = x1.Args[2] 16844 if idx != x1.Args[0] { 16845 break 16846 } 16847 if p != x1.Args[1] { 16848 break 16849 } 16850 if mem != x1.Args[2] { 16851 break 16852 } 16853 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)) { 16854 break 16855 } 16856 b = mergePoint(b, x0, x1, x2) 16857 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16858 v.reset(OpCopy) 16859 v.AddArg(v0) 16860 v0.AuxInt = i0 16861 v0.Aux = s 16862 v0.AddArg(p) 16863 v0.AddArg(idx) 16864 v0.AddArg(mem) 16865 return true 16866 } 16867 // 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)))) 16868 // 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) 16869 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16870 for { 16871 _ = v.Args[1] 16872 s1 := v.Args[0] 16873 if s1.Op != Op386SHLLconst { 16874 break 16875 } 16876 if s1.AuxInt != 24 { 16877 break 16878 } 16879 x2 := s1.Args[0] 16880 if x2.Op != Op386MOVBloadidx1 { 16881 break 16882 } 16883 i3 := x2.AuxInt 16884 s := x2.Aux 16885 _ = x2.Args[2] 16886 p := x2.Args[0] 16887 idx := x2.Args[1] 16888 mem := x2.Args[2] 16889 o0 := v.Args[1] 16890 if o0.Op != Op386ORL { 16891 break 16892 } 16893 _ = o0.Args[1] 16894 x0 := o0.Args[0] 16895 if x0.Op != Op386MOVWloadidx1 { 16896 break 16897 } 16898 i0 := x0.AuxInt 16899 if x0.Aux != s { 16900 break 16901 } 16902 _ = x0.Args[2] 16903 if idx != x0.Args[0] { 16904 break 16905 } 16906 if p != x0.Args[1] { 16907 break 16908 } 16909 if mem != x0.Args[2] { 16910 break 16911 } 16912 s0 := o0.Args[1] 16913 if s0.Op != Op386SHLLconst { 16914 break 16915 } 16916 if s0.AuxInt != 16 { 16917 break 16918 } 16919 x1 := s0.Args[0] 16920 if x1.Op != Op386MOVBloadidx1 { 16921 break 16922 } 16923 i2 := x1.AuxInt 16924 if x1.Aux != s { 16925 break 16926 } 16927 _ = x1.Args[2] 16928 if idx != x1.Args[0] { 16929 break 16930 } 16931 if p != x1.Args[1] { 16932 break 16933 } 16934 if mem != x1.Args[2] { 16935 break 16936 } 16937 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)) { 16938 break 16939 } 16940 b = mergePoint(b, x0, x1, x2) 16941 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 16942 v.reset(OpCopy) 16943 v.AddArg(v0) 16944 v0.AuxInt = i0 16945 v0.Aux = s 16946 v0.AddArg(p) 16947 v0.AddArg(idx) 16948 v0.AddArg(mem) 16949 return true 16950 } 16951 return false 16952 } 16953 func rewriteValue386_Op386ORL_50(v *Value) bool { 16954 b := v.Block 16955 _ = b 16956 // 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)))) 16957 // 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) 16958 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 16959 for { 16960 _ = v.Args[1] 16961 s1 := v.Args[0] 16962 if s1.Op != Op386SHLLconst { 16963 break 16964 } 16965 if s1.AuxInt != 24 { 16966 break 16967 } 16968 x2 := s1.Args[0] 16969 if x2.Op != Op386MOVBloadidx1 { 16970 break 16971 } 16972 i3 := x2.AuxInt 16973 s := x2.Aux 16974 _ = x2.Args[2] 16975 idx := x2.Args[0] 16976 p := x2.Args[1] 16977 mem := x2.Args[2] 16978 o0 := v.Args[1] 16979 if o0.Op != Op386ORL { 16980 break 16981 } 16982 _ = o0.Args[1] 16983 x0 := o0.Args[0] 16984 if x0.Op != Op386MOVWloadidx1 { 16985 break 16986 } 16987 i0 := x0.AuxInt 16988 if x0.Aux != s { 16989 break 16990 } 16991 _ = x0.Args[2] 16992 if idx != x0.Args[0] { 16993 break 16994 } 16995 if p != x0.Args[1] { 16996 break 16997 } 16998 if mem != x0.Args[2] { 16999 break 17000 } 17001 s0 := o0.Args[1] 17002 if s0.Op != Op386SHLLconst { 17003 break 17004 } 17005 if s0.AuxInt != 16 { 17006 break 17007 } 17008 x1 := s0.Args[0] 17009 if x1.Op != Op386MOVBloadidx1 { 17010 break 17011 } 17012 i2 := x1.AuxInt 17013 if x1.Aux != s { 17014 break 17015 } 17016 _ = x1.Args[2] 17017 if idx != x1.Args[0] { 17018 break 17019 } 17020 if p != x1.Args[1] { 17021 break 17022 } 17023 if mem != x1.Args[2] { 17024 break 17025 } 17026 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)) { 17027 break 17028 } 17029 b = mergePoint(b, x0, x1, x2) 17030 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17031 v.reset(OpCopy) 17032 v.AddArg(v0) 17033 v0.AuxInt = i0 17034 v0.Aux = s 17035 v0.AddArg(p) 17036 v0.AddArg(idx) 17037 v0.AddArg(mem) 17038 return true 17039 } 17040 // 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))) 17041 // 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) 17042 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17043 for { 17044 _ = v.Args[1] 17045 s1 := v.Args[0] 17046 if s1.Op != Op386SHLLconst { 17047 break 17048 } 17049 if s1.AuxInt != 24 { 17050 break 17051 } 17052 x2 := s1.Args[0] 17053 if x2.Op != Op386MOVBloadidx1 { 17054 break 17055 } 17056 i3 := x2.AuxInt 17057 s := x2.Aux 17058 _ = x2.Args[2] 17059 p := x2.Args[0] 17060 idx := x2.Args[1] 17061 mem := x2.Args[2] 17062 o0 := v.Args[1] 17063 if o0.Op != Op386ORL { 17064 break 17065 } 17066 _ = o0.Args[1] 17067 s0 := o0.Args[0] 17068 if s0.Op != Op386SHLLconst { 17069 break 17070 } 17071 if s0.AuxInt != 16 { 17072 break 17073 } 17074 x1 := s0.Args[0] 17075 if x1.Op != Op386MOVBloadidx1 { 17076 break 17077 } 17078 i2 := x1.AuxInt 17079 if x1.Aux != s { 17080 break 17081 } 17082 _ = x1.Args[2] 17083 if p != x1.Args[0] { 17084 break 17085 } 17086 if idx != x1.Args[1] { 17087 break 17088 } 17089 if mem != x1.Args[2] { 17090 break 17091 } 17092 x0 := o0.Args[1] 17093 if x0.Op != Op386MOVWloadidx1 { 17094 break 17095 } 17096 i0 := x0.AuxInt 17097 if x0.Aux != s { 17098 break 17099 } 17100 _ = x0.Args[2] 17101 if p != x0.Args[0] { 17102 break 17103 } 17104 if idx != x0.Args[1] { 17105 break 17106 } 17107 if mem != x0.Args[2] { 17108 break 17109 } 17110 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)) { 17111 break 17112 } 17113 b = mergePoint(b, x0, x1, x2) 17114 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17115 v.reset(OpCopy) 17116 v.AddArg(v0) 17117 v0.AuxInt = i0 17118 v0.Aux = s 17119 v0.AddArg(p) 17120 v0.AddArg(idx) 17121 v0.AddArg(mem) 17122 return true 17123 } 17124 // 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))) 17125 // 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) 17126 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17127 for { 17128 _ = v.Args[1] 17129 s1 := v.Args[0] 17130 if s1.Op != Op386SHLLconst { 17131 break 17132 } 17133 if s1.AuxInt != 24 { 17134 break 17135 } 17136 x2 := s1.Args[0] 17137 if x2.Op != Op386MOVBloadidx1 { 17138 break 17139 } 17140 i3 := x2.AuxInt 17141 s := x2.Aux 17142 _ = x2.Args[2] 17143 idx := x2.Args[0] 17144 p := x2.Args[1] 17145 mem := x2.Args[2] 17146 o0 := v.Args[1] 17147 if o0.Op != Op386ORL { 17148 break 17149 } 17150 _ = o0.Args[1] 17151 s0 := o0.Args[0] 17152 if s0.Op != Op386SHLLconst { 17153 break 17154 } 17155 if s0.AuxInt != 16 { 17156 break 17157 } 17158 x1 := s0.Args[0] 17159 if x1.Op != Op386MOVBloadidx1 { 17160 break 17161 } 17162 i2 := x1.AuxInt 17163 if x1.Aux != s { 17164 break 17165 } 17166 _ = x1.Args[2] 17167 if p != x1.Args[0] { 17168 break 17169 } 17170 if idx != x1.Args[1] { 17171 break 17172 } 17173 if mem != x1.Args[2] { 17174 break 17175 } 17176 x0 := o0.Args[1] 17177 if x0.Op != Op386MOVWloadidx1 { 17178 break 17179 } 17180 i0 := x0.AuxInt 17181 if x0.Aux != s { 17182 break 17183 } 17184 _ = x0.Args[2] 17185 if p != x0.Args[0] { 17186 break 17187 } 17188 if idx != x0.Args[1] { 17189 break 17190 } 17191 if mem != x0.Args[2] { 17192 break 17193 } 17194 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)) { 17195 break 17196 } 17197 b = mergePoint(b, x0, x1, x2) 17198 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17199 v.reset(OpCopy) 17200 v.AddArg(v0) 17201 v0.AuxInt = i0 17202 v0.Aux = s 17203 v0.AddArg(p) 17204 v0.AddArg(idx) 17205 v0.AddArg(mem) 17206 return true 17207 } 17208 // 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))) 17209 // 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) 17210 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17211 for { 17212 _ = v.Args[1] 17213 s1 := v.Args[0] 17214 if s1.Op != Op386SHLLconst { 17215 break 17216 } 17217 if s1.AuxInt != 24 { 17218 break 17219 } 17220 x2 := s1.Args[0] 17221 if x2.Op != Op386MOVBloadidx1 { 17222 break 17223 } 17224 i3 := x2.AuxInt 17225 s := x2.Aux 17226 _ = x2.Args[2] 17227 p := x2.Args[0] 17228 idx := x2.Args[1] 17229 mem := x2.Args[2] 17230 o0 := v.Args[1] 17231 if o0.Op != Op386ORL { 17232 break 17233 } 17234 _ = o0.Args[1] 17235 s0 := o0.Args[0] 17236 if s0.Op != Op386SHLLconst { 17237 break 17238 } 17239 if s0.AuxInt != 16 { 17240 break 17241 } 17242 x1 := s0.Args[0] 17243 if x1.Op != Op386MOVBloadidx1 { 17244 break 17245 } 17246 i2 := x1.AuxInt 17247 if x1.Aux != s { 17248 break 17249 } 17250 _ = x1.Args[2] 17251 if idx != x1.Args[0] { 17252 break 17253 } 17254 if p != x1.Args[1] { 17255 break 17256 } 17257 if mem != x1.Args[2] { 17258 break 17259 } 17260 x0 := o0.Args[1] 17261 if x0.Op != Op386MOVWloadidx1 { 17262 break 17263 } 17264 i0 := x0.AuxInt 17265 if x0.Aux != s { 17266 break 17267 } 17268 _ = x0.Args[2] 17269 if p != x0.Args[0] { 17270 break 17271 } 17272 if idx != x0.Args[1] { 17273 break 17274 } 17275 if mem != x0.Args[2] { 17276 break 17277 } 17278 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)) { 17279 break 17280 } 17281 b = mergePoint(b, x0, x1, x2) 17282 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17283 v.reset(OpCopy) 17284 v.AddArg(v0) 17285 v0.AuxInt = i0 17286 v0.Aux = s 17287 v0.AddArg(p) 17288 v0.AddArg(idx) 17289 v0.AddArg(mem) 17290 return true 17291 } 17292 // 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))) 17293 // 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) 17294 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17295 for { 17296 _ = v.Args[1] 17297 s1 := v.Args[0] 17298 if s1.Op != Op386SHLLconst { 17299 break 17300 } 17301 if s1.AuxInt != 24 { 17302 break 17303 } 17304 x2 := s1.Args[0] 17305 if x2.Op != Op386MOVBloadidx1 { 17306 break 17307 } 17308 i3 := x2.AuxInt 17309 s := x2.Aux 17310 _ = x2.Args[2] 17311 idx := x2.Args[0] 17312 p := x2.Args[1] 17313 mem := x2.Args[2] 17314 o0 := v.Args[1] 17315 if o0.Op != Op386ORL { 17316 break 17317 } 17318 _ = o0.Args[1] 17319 s0 := o0.Args[0] 17320 if s0.Op != Op386SHLLconst { 17321 break 17322 } 17323 if s0.AuxInt != 16 { 17324 break 17325 } 17326 x1 := s0.Args[0] 17327 if x1.Op != Op386MOVBloadidx1 { 17328 break 17329 } 17330 i2 := x1.AuxInt 17331 if x1.Aux != s { 17332 break 17333 } 17334 _ = x1.Args[2] 17335 if idx != x1.Args[0] { 17336 break 17337 } 17338 if p != x1.Args[1] { 17339 break 17340 } 17341 if mem != x1.Args[2] { 17342 break 17343 } 17344 x0 := o0.Args[1] 17345 if x0.Op != Op386MOVWloadidx1 { 17346 break 17347 } 17348 i0 := x0.AuxInt 17349 if x0.Aux != s { 17350 break 17351 } 17352 _ = x0.Args[2] 17353 if p != x0.Args[0] { 17354 break 17355 } 17356 if idx != x0.Args[1] { 17357 break 17358 } 17359 if mem != x0.Args[2] { 17360 break 17361 } 17362 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)) { 17363 break 17364 } 17365 b = mergePoint(b, x0, x1, x2) 17366 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17367 v.reset(OpCopy) 17368 v.AddArg(v0) 17369 v0.AuxInt = i0 17370 v0.Aux = s 17371 v0.AddArg(p) 17372 v0.AddArg(idx) 17373 v0.AddArg(mem) 17374 return true 17375 } 17376 // 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))) 17377 // 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) 17378 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17379 for { 17380 _ = v.Args[1] 17381 s1 := v.Args[0] 17382 if s1.Op != Op386SHLLconst { 17383 break 17384 } 17385 if s1.AuxInt != 24 { 17386 break 17387 } 17388 x2 := s1.Args[0] 17389 if x2.Op != Op386MOVBloadidx1 { 17390 break 17391 } 17392 i3 := x2.AuxInt 17393 s := x2.Aux 17394 _ = x2.Args[2] 17395 p := x2.Args[0] 17396 idx := x2.Args[1] 17397 mem := x2.Args[2] 17398 o0 := v.Args[1] 17399 if o0.Op != Op386ORL { 17400 break 17401 } 17402 _ = o0.Args[1] 17403 s0 := o0.Args[0] 17404 if s0.Op != Op386SHLLconst { 17405 break 17406 } 17407 if s0.AuxInt != 16 { 17408 break 17409 } 17410 x1 := s0.Args[0] 17411 if x1.Op != Op386MOVBloadidx1 { 17412 break 17413 } 17414 i2 := x1.AuxInt 17415 if x1.Aux != s { 17416 break 17417 } 17418 _ = x1.Args[2] 17419 if p != x1.Args[0] { 17420 break 17421 } 17422 if idx != x1.Args[1] { 17423 break 17424 } 17425 if mem != x1.Args[2] { 17426 break 17427 } 17428 x0 := o0.Args[1] 17429 if x0.Op != Op386MOVWloadidx1 { 17430 break 17431 } 17432 i0 := x0.AuxInt 17433 if x0.Aux != s { 17434 break 17435 } 17436 _ = x0.Args[2] 17437 if idx != x0.Args[0] { 17438 break 17439 } 17440 if p != x0.Args[1] { 17441 break 17442 } 17443 if mem != x0.Args[2] { 17444 break 17445 } 17446 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)) { 17447 break 17448 } 17449 b = mergePoint(b, x0, x1, x2) 17450 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17451 v.reset(OpCopy) 17452 v.AddArg(v0) 17453 v0.AuxInt = i0 17454 v0.Aux = s 17455 v0.AddArg(p) 17456 v0.AddArg(idx) 17457 v0.AddArg(mem) 17458 return true 17459 } 17460 // 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))) 17461 // 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) 17462 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17463 for { 17464 _ = v.Args[1] 17465 s1 := v.Args[0] 17466 if s1.Op != Op386SHLLconst { 17467 break 17468 } 17469 if s1.AuxInt != 24 { 17470 break 17471 } 17472 x2 := s1.Args[0] 17473 if x2.Op != Op386MOVBloadidx1 { 17474 break 17475 } 17476 i3 := x2.AuxInt 17477 s := x2.Aux 17478 _ = x2.Args[2] 17479 idx := x2.Args[0] 17480 p := x2.Args[1] 17481 mem := x2.Args[2] 17482 o0 := v.Args[1] 17483 if o0.Op != Op386ORL { 17484 break 17485 } 17486 _ = o0.Args[1] 17487 s0 := o0.Args[0] 17488 if s0.Op != Op386SHLLconst { 17489 break 17490 } 17491 if s0.AuxInt != 16 { 17492 break 17493 } 17494 x1 := s0.Args[0] 17495 if x1.Op != Op386MOVBloadidx1 { 17496 break 17497 } 17498 i2 := x1.AuxInt 17499 if x1.Aux != s { 17500 break 17501 } 17502 _ = x1.Args[2] 17503 if p != x1.Args[0] { 17504 break 17505 } 17506 if idx != x1.Args[1] { 17507 break 17508 } 17509 if mem != x1.Args[2] { 17510 break 17511 } 17512 x0 := o0.Args[1] 17513 if x0.Op != Op386MOVWloadidx1 { 17514 break 17515 } 17516 i0 := x0.AuxInt 17517 if x0.Aux != s { 17518 break 17519 } 17520 _ = x0.Args[2] 17521 if idx != x0.Args[0] { 17522 break 17523 } 17524 if p != x0.Args[1] { 17525 break 17526 } 17527 if mem != x0.Args[2] { 17528 break 17529 } 17530 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)) { 17531 break 17532 } 17533 b = mergePoint(b, x0, x1, x2) 17534 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17535 v.reset(OpCopy) 17536 v.AddArg(v0) 17537 v0.AuxInt = i0 17538 v0.Aux = s 17539 v0.AddArg(p) 17540 v0.AddArg(idx) 17541 v0.AddArg(mem) 17542 return true 17543 } 17544 // 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))) 17545 // 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) 17546 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17547 for { 17548 _ = v.Args[1] 17549 s1 := v.Args[0] 17550 if s1.Op != Op386SHLLconst { 17551 break 17552 } 17553 if s1.AuxInt != 24 { 17554 break 17555 } 17556 x2 := s1.Args[0] 17557 if x2.Op != Op386MOVBloadidx1 { 17558 break 17559 } 17560 i3 := x2.AuxInt 17561 s := x2.Aux 17562 _ = x2.Args[2] 17563 p := x2.Args[0] 17564 idx := x2.Args[1] 17565 mem := x2.Args[2] 17566 o0 := v.Args[1] 17567 if o0.Op != Op386ORL { 17568 break 17569 } 17570 _ = o0.Args[1] 17571 s0 := o0.Args[0] 17572 if s0.Op != Op386SHLLconst { 17573 break 17574 } 17575 if s0.AuxInt != 16 { 17576 break 17577 } 17578 x1 := s0.Args[0] 17579 if x1.Op != Op386MOVBloadidx1 { 17580 break 17581 } 17582 i2 := x1.AuxInt 17583 if x1.Aux != s { 17584 break 17585 } 17586 _ = x1.Args[2] 17587 if idx != x1.Args[0] { 17588 break 17589 } 17590 if p != x1.Args[1] { 17591 break 17592 } 17593 if mem != x1.Args[2] { 17594 break 17595 } 17596 x0 := o0.Args[1] 17597 if x0.Op != Op386MOVWloadidx1 { 17598 break 17599 } 17600 i0 := x0.AuxInt 17601 if x0.Aux != s { 17602 break 17603 } 17604 _ = x0.Args[2] 17605 if idx != x0.Args[0] { 17606 break 17607 } 17608 if p != x0.Args[1] { 17609 break 17610 } 17611 if mem != x0.Args[2] { 17612 break 17613 } 17614 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)) { 17615 break 17616 } 17617 b = mergePoint(b, x0, x1, x2) 17618 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17619 v.reset(OpCopy) 17620 v.AddArg(v0) 17621 v0.AuxInt = i0 17622 v0.Aux = s 17623 v0.AddArg(p) 17624 v0.AddArg(idx) 17625 v0.AddArg(mem) 17626 return true 17627 } 17628 // 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))) 17629 // 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) 17630 // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 <v.Type> [i0] {s} p idx mem) 17631 for { 17632 _ = v.Args[1] 17633 s1 := v.Args[0] 17634 if s1.Op != Op386SHLLconst { 17635 break 17636 } 17637 if s1.AuxInt != 24 { 17638 break 17639 } 17640 x2 := s1.Args[0] 17641 if x2.Op != Op386MOVBloadidx1 { 17642 break 17643 } 17644 i3 := x2.AuxInt 17645 s := x2.Aux 17646 _ = x2.Args[2] 17647 idx := x2.Args[0] 17648 p := x2.Args[1] 17649 mem := x2.Args[2] 17650 o0 := v.Args[1] 17651 if o0.Op != Op386ORL { 17652 break 17653 } 17654 _ = o0.Args[1] 17655 s0 := o0.Args[0] 17656 if s0.Op != Op386SHLLconst { 17657 break 17658 } 17659 if s0.AuxInt != 16 { 17660 break 17661 } 17662 x1 := s0.Args[0] 17663 if x1.Op != Op386MOVBloadidx1 { 17664 break 17665 } 17666 i2 := x1.AuxInt 17667 if x1.Aux != s { 17668 break 17669 } 17670 _ = x1.Args[2] 17671 if idx != x1.Args[0] { 17672 break 17673 } 17674 if p != x1.Args[1] { 17675 break 17676 } 17677 if mem != x1.Args[2] { 17678 break 17679 } 17680 x0 := o0.Args[1] 17681 if x0.Op != Op386MOVWloadidx1 { 17682 break 17683 } 17684 i0 := x0.AuxInt 17685 if x0.Aux != s { 17686 break 17687 } 17688 _ = x0.Args[2] 17689 if idx != x0.Args[0] { 17690 break 17691 } 17692 if p != x0.Args[1] { 17693 break 17694 } 17695 if mem != x0.Args[2] { 17696 break 17697 } 17698 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)) { 17699 break 17700 } 17701 b = mergePoint(b, x0, x1, x2) 17702 v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) 17703 v.reset(OpCopy) 17704 v.AddArg(v0) 17705 v0.AuxInt = i0 17706 v0.Aux = s 17707 v0.AddArg(p) 17708 v0.AddArg(idx) 17709 v0.AddArg(mem) 17710 return true 17711 } 17712 return false 17713 } 17714 func rewriteValue386_Op386ORLconst_0(v *Value) bool { 17715 // match: (ORLconst [c] x) 17716 // cond: int32(c)==0 17717 // result: x 17718 for { 17719 c := v.AuxInt 17720 x := v.Args[0] 17721 if !(int32(c) == 0) { 17722 break 17723 } 17724 v.reset(OpCopy) 17725 v.Type = x.Type 17726 v.AddArg(x) 17727 return true 17728 } 17729 // match: (ORLconst [c] _) 17730 // cond: int32(c)==-1 17731 // result: (MOVLconst [-1]) 17732 for { 17733 c := v.AuxInt 17734 if !(int32(c) == -1) { 17735 break 17736 } 17737 v.reset(Op386MOVLconst) 17738 v.AuxInt = -1 17739 return true 17740 } 17741 // match: (ORLconst [c] (MOVLconst [d])) 17742 // cond: 17743 // result: (MOVLconst [c|d]) 17744 for { 17745 c := v.AuxInt 17746 v_0 := v.Args[0] 17747 if v_0.Op != Op386MOVLconst { 17748 break 17749 } 17750 d := v_0.AuxInt 17751 v.reset(Op386MOVLconst) 17752 v.AuxInt = c | d 17753 return true 17754 } 17755 return false 17756 } 17757 func rewriteValue386_Op386ORLconstmodify_0(v *Value) bool { 17758 b := v.Block 17759 _ = b 17760 config := b.Func.Config 17761 _ = config 17762 // match: (ORLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) 17763 // cond: ValAndOff(valoff1).canAdd(off2) 17764 // result: (ORLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) 17765 for { 17766 valoff1 := v.AuxInt 17767 sym := v.Aux 17768 _ = v.Args[1] 17769 v_0 := v.Args[0] 17770 if v_0.Op != Op386ADDLconst { 17771 break 17772 } 17773 off2 := v_0.AuxInt 17774 base := v_0.Args[0] 17775 mem := v.Args[1] 17776 if !(ValAndOff(valoff1).canAdd(off2)) { 17777 break 17778 } 17779 v.reset(Op386ORLconstmodify) 17780 v.AuxInt = ValAndOff(valoff1).add(off2) 17781 v.Aux = sym 17782 v.AddArg(base) 17783 v.AddArg(mem) 17784 return true 17785 } 17786 // match: (ORLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) 17787 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 17788 // result: (ORLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) 17789 for { 17790 valoff1 := v.AuxInt 17791 sym1 := v.Aux 17792 _ = v.Args[1] 17793 v_0 := v.Args[0] 17794 if v_0.Op != Op386LEAL { 17795 break 17796 } 17797 off2 := v_0.AuxInt 17798 sym2 := v_0.Aux 17799 base := v_0.Args[0] 17800 mem := v.Args[1] 17801 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 17802 break 17803 } 17804 v.reset(Op386ORLconstmodify) 17805 v.AuxInt = ValAndOff(valoff1).add(off2) 17806 v.Aux = mergeSym(sym1, sym2) 17807 v.AddArg(base) 17808 v.AddArg(mem) 17809 return true 17810 } 17811 return false 17812 } 17813 func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { 17814 b := v.Block 17815 _ = b 17816 config := b.Func.Config 17817 _ = config 17818 // match: (ORLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) 17819 // cond: ValAndOff(valoff1).canAdd(off2) 17820 // result: (ORLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) 17821 for { 17822 valoff1 := v.AuxInt 17823 sym := v.Aux 17824 _ = v.Args[2] 17825 v_0 := v.Args[0] 17826 if v_0.Op != Op386ADDLconst { 17827 break 17828 } 17829 off2 := v_0.AuxInt 17830 base := v_0.Args[0] 17831 idx := v.Args[1] 17832 mem := v.Args[2] 17833 if !(ValAndOff(valoff1).canAdd(off2)) { 17834 break 17835 } 17836 v.reset(Op386ORLconstmodifyidx4) 17837 v.AuxInt = ValAndOff(valoff1).add(off2) 17838 v.Aux = sym 17839 v.AddArg(base) 17840 v.AddArg(idx) 17841 v.AddArg(mem) 17842 return true 17843 } 17844 // match: (ORLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) 17845 // cond: ValAndOff(valoff1).canAdd(off2*4) 17846 // result: (ORLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) 17847 for { 17848 valoff1 := v.AuxInt 17849 sym := v.Aux 17850 _ = v.Args[2] 17851 base := v.Args[0] 17852 v_1 := v.Args[1] 17853 if v_1.Op != Op386ADDLconst { 17854 break 17855 } 17856 off2 := v_1.AuxInt 17857 idx := v_1.Args[0] 17858 mem := v.Args[2] 17859 if !(ValAndOff(valoff1).canAdd(off2 * 4)) { 17860 break 17861 } 17862 v.reset(Op386ORLconstmodifyidx4) 17863 v.AuxInt = ValAndOff(valoff1).add(off2 * 4) 17864 v.Aux = sym 17865 v.AddArg(base) 17866 v.AddArg(idx) 17867 v.AddArg(mem) 17868 return true 17869 } 17870 // match: (ORLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) 17871 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 17872 // result: (ORLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) 17873 for { 17874 valoff1 := v.AuxInt 17875 sym1 := v.Aux 17876 _ = v.Args[2] 17877 v_0 := v.Args[0] 17878 if v_0.Op != Op386LEAL { 17879 break 17880 } 17881 off2 := v_0.AuxInt 17882 sym2 := v_0.Aux 17883 base := v_0.Args[0] 17884 idx := v.Args[1] 17885 mem := v.Args[2] 17886 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 17887 break 17888 } 17889 v.reset(Op386ORLconstmodifyidx4) 17890 v.AuxInt = ValAndOff(valoff1).add(off2) 17891 v.Aux = mergeSym(sym1, sym2) 17892 v.AddArg(base) 17893 v.AddArg(idx) 17894 v.AddArg(mem) 17895 return true 17896 } 17897 return false 17898 } 17899 func rewriteValue386_Op386ORLload_0(v *Value) bool { 17900 b := v.Block 17901 _ = b 17902 config := b.Func.Config 17903 _ = config 17904 // match: (ORLload [off1] {sym} val (ADDLconst [off2] base) mem) 17905 // cond: is32Bit(off1+off2) 17906 // result: (ORLload [off1+off2] {sym} val base mem) 17907 for { 17908 off1 := v.AuxInt 17909 sym := v.Aux 17910 _ = v.Args[2] 17911 val := v.Args[0] 17912 v_1 := v.Args[1] 17913 if v_1.Op != Op386ADDLconst { 17914 break 17915 } 17916 off2 := v_1.AuxInt 17917 base := v_1.Args[0] 17918 mem := v.Args[2] 17919 if !(is32Bit(off1 + off2)) { 17920 break 17921 } 17922 v.reset(Op386ORLload) 17923 v.AuxInt = off1 + off2 17924 v.Aux = sym 17925 v.AddArg(val) 17926 v.AddArg(base) 17927 v.AddArg(mem) 17928 return true 17929 } 17930 // match: (ORLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 17931 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 17932 // result: (ORLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 17933 for { 17934 off1 := v.AuxInt 17935 sym1 := v.Aux 17936 _ = v.Args[2] 17937 val := v.Args[0] 17938 v_1 := v.Args[1] 17939 if v_1.Op != Op386LEAL { 17940 break 17941 } 17942 off2 := v_1.AuxInt 17943 sym2 := v_1.Aux 17944 base := v_1.Args[0] 17945 mem := v.Args[2] 17946 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 17947 break 17948 } 17949 v.reset(Op386ORLload) 17950 v.AuxInt = off1 + off2 17951 v.Aux = mergeSym(sym1, sym2) 17952 v.AddArg(val) 17953 v.AddArg(base) 17954 v.AddArg(mem) 17955 return true 17956 } 17957 // match: (ORLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) 17958 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17959 // result: (ORLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) 17960 for { 17961 off1 := v.AuxInt 17962 sym1 := v.Aux 17963 _ = v.Args[2] 17964 val := v.Args[0] 17965 v_1 := v.Args[1] 17966 if v_1.Op != Op386LEAL4 { 17967 break 17968 } 17969 off2 := v_1.AuxInt 17970 sym2 := v_1.Aux 17971 _ = v_1.Args[1] 17972 ptr := v_1.Args[0] 17973 idx := v_1.Args[1] 17974 mem := v.Args[2] 17975 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17976 break 17977 } 17978 v.reset(Op386ORLloadidx4) 17979 v.AuxInt = off1 + off2 17980 v.Aux = mergeSym(sym1, sym2) 17981 v.AddArg(val) 17982 v.AddArg(ptr) 17983 v.AddArg(idx) 17984 v.AddArg(mem) 17985 return true 17986 } 17987 return false 17988 } 17989 func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { 17990 b := v.Block 17991 _ = b 17992 config := b.Func.Config 17993 _ = config 17994 // match: (ORLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) 17995 // cond: is32Bit(off1+off2) 17996 // result: (ORLloadidx4 [off1+off2] {sym} val base idx mem) 17997 for { 17998 off1 := v.AuxInt 17999 sym := v.Aux 18000 _ = v.Args[3] 18001 val := v.Args[0] 18002 v_1 := v.Args[1] 18003 if v_1.Op != Op386ADDLconst { 18004 break 18005 } 18006 off2 := v_1.AuxInt 18007 base := v_1.Args[0] 18008 idx := v.Args[2] 18009 mem := v.Args[3] 18010 if !(is32Bit(off1 + off2)) { 18011 break 18012 } 18013 v.reset(Op386ORLloadidx4) 18014 v.AuxInt = off1 + off2 18015 v.Aux = sym 18016 v.AddArg(val) 18017 v.AddArg(base) 18018 v.AddArg(idx) 18019 v.AddArg(mem) 18020 return true 18021 } 18022 // match: (ORLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) 18023 // cond: is32Bit(off1+off2*4) 18024 // result: (ORLloadidx4 [off1+off2*4] {sym} val base idx mem) 18025 for { 18026 off1 := v.AuxInt 18027 sym := v.Aux 18028 _ = v.Args[3] 18029 val := v.Args[0] 18030 base := v.Args[1] 18031 v_2 := v.Args[2] 18032 if v_2.Op != Op386ADDLconst { 18033 break 18034 } 18035 off2 := v_2.AuxInt 18036 idx := v_2.Args[0] 18037 mem := v.Args[3] 18038 if !(is32Bit(off1 + off2*4)) { 18039 break 18040 } 18041 v.reset(Op386ORLloadidx4) 18042 v.AuxInt = off1 + off2*4 18043 v.Aux = sym 18044 v.AddArg(val) 18045 v.AddArg(base) 18046 v.AddArg(idx) 18047 v.AddArg(mem) 18048 return true 18049 } 18050 // match: (ORLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) 18051 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 18052 // result: (ORLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) 18053 for { 18054 off1 := v.AuxInt 18055 sym1 := v.Aux 18056 _ = v.Args[3] 18057 val := v.Args[0] 18058 v_1 := v.Args[1] 18059 if v_1.Op != Op386LEAL { 18060 break 18061 } 18062 off2 := v_1.AuxInt 18063 sym2 := v_1.Aux 18064 base := v_1.Args[0] 18065 idx := v.Args[2] 18066 mem := v.Args[3] 18067 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 18068 break 18069 } 18070 v.reset(Op386ORLloadidx4) 18071 v.AuxInt = off1 + off2 18072 v.Aux = mergeSym(sym1, sym2) 18073 v.AddArg(val) 18074 v.AddArg(base) 18075 v.AddArg(idx) 18076 v.AddArg(mem) 18077 return true 18078 } 18079 return false 18080 } 18081 func rewriteValue386_Op386ORLmodify_0(v *Value) bool { 18082 b := v.Block 18083 _ = b 18084 config := b.Func.Config 18085 _ = config 18086 // match: (ORLmodify [off1] {sym} (ADDLconst [off2] base) val mem) 18087 // cond: is32Bit(off1+off2) 18088 // result: (ORLmodify [off1+off2] {sym} base val mem) 18089 for { 18090 off1 := v.AuxInt 18091 sym := v.Aux 18092 _ = v.Args[2] 18093 v_0 := v.Args[0] 18094 if v_0.Op != Op386ADDLconst { 18095 break 18096 } 18097 off2 := v_0.AuxInt 18098 base := v_0.Args[0] 18099 val := v.Args[1] 18100 mem := v.Args[2] 18101 if !(is32Bit(off1 + off2)) { 18102 break 18103 } 18104 v.reset(Op386ORLmodify) 18105 v.AuxInt = off1 + off2 18106 v.Aux = sym 18107 v.AddArg(base) 18108 v.AddArg(val) 18109 v.AddArg(mem) 18110 return true 18111 } 18112 // match: (ORLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 18113 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 18114 // result: (ORLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) 18115 for { 18116 off1 := v.AuxInt 18117 sym1 := v.Aux 18118 _ = v.Args[2] 18119 v_0 := v.Args[0] 18120 if v_0.Op != Op386LEAL { 18121 break 18122 } 18123 off2 := v_0.AuxInt 18124 sym2 := v_0.Aux 18125 base := v_0.Args[0] 18126 val := v.Args[1] 18127 mem := v.Args[2] 18128 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 18129 break 18130 } 18131 v.reset(Op386ORLmodify) 18132 v.AuxInt = off1 + off2 18133 v.Aux = mergeSym(sym1, sym2) 18134 v.AddArg(base) 18135 v.AddArg(val) 18136 v.AddArg(mem) 18137 return true 18138 } 18139 return false 18140 } 18141 func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { 18142 b := v.Block 18143 _ = b 18144 config := b.Func.Config 18145 _ = config 18146 // match: (ORLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) 18147 // cond: is32Bit(off1+off2) 18148 // result: (ORLmodifyidx4 [off1+off2] {sym} base idx val mem) 18149 for { 18150 off1 := v.AuxInt 18151 sym := v.Aux 18152 _ = v.Args[3] 18153 v_0 := v.Args[0] 18154 if v_0.Op != Op386ADDLconst { 18155 break 18156 } 18157 off2 := v_0.AuxInt 18158 base := v_0.Args[0] 18159 idx := v.Args[1] 18160 val := v.Args[2] 18161 mem := v.Args[3] 18162 if !(is32Bit(off1 + off2)) { 18163 break 18164 } 18165 v.reset(Op386ORLmodifyidx4) 18166 v.AuxInt = off1 + off2 18167 v.Aux = sym 18168 v.AddArg(base) 18169 v.AddArg(idx) 18170 v.AddArg(val) 18171 v.AddArg(mem) 18172 return true 18173 } 18174 // match: (ORLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) 18175 // cond: is32Bit(off1+off2*4) 18176 // result: (ORLmodifyidx4 [off1+off2*4] {sym} base idx val mem) 18177 for { 18178 off1 := v.AuxInt 18179 sym := v.Aux 18180 _ = v.Args[3] 18181 base := v.Args[0] 18182 v_1 := v.Args[1] 18183 if v_1.Op != Op386ADDLconst { 18184 break 18185 } 18186 off2 := v_1.AuxInt 18187 idx := v_1.Args[0] 18188 val := v.Args[2] 18189 mem := v.Args[3] 18190 if !(is32Bit(off1 + off2*4)) { 18191 break 18192 } 18193 v.reset(Op386ORLmodifyidx4) 18194 v.AuxInt = off1 + off2*4 18195 v.Aux = sym 18196 v.AddArg(base) 18197 v.AddArg(idx) 18198 v.AddArg(val) 18199 v.AddArg(mem) 18200 return true 18201 } 18202 // match: (ORLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) 18203 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 18204 // result: (ORLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) 18205 for { 18206 off1 := v.AuxInt 18207 sym1 := v.Aux 18208 _ = v.Args[3] 18209 v_0 := v.Args[0] 18210 if v_0.Op != Op386LEAL { 18211 break 18212 } 18213 off2 := v_0.AuxInt 18214 sym2 := v_0.Aux 18215 base := v_0.Args[0] 18216 idx := v.Args[1] 18217 val := v.Args[2] 18218 mem := v.Args[3] 18219 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 18220 break 18221 } 18222 v.reset(Op386ORLmodifyidx4) 18223 v.AuxInt = off1 + off2 18224 v.Aux = mergeSym(sym1, sym2) 18225 v.AddArg(base) 18226 v.AddArg(idx) 18227 v.AddArg(val) 18228 v.AddArg(mem) 18229 return true 18230 } 18231 // match: (ORLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) 18232 // cond: validValAndOff(c,off) 18233 // result: (ORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 18234 for { 18235 off := v.AuxInt 18236 sym := v.Aux 18237 _ = v.Args[3] 18238 ptr := v.Args[0] 18239 idx := v.Args[1] 18240 v_2 := v.Args[2] 18241 if v_2.Op != Op386MOVLconst { 18242 break 18243 } 18244 c := v_2.AuxInt 18245 mem := v.Args[3] 18246 if !(validValAndOff(c, off)) { 18247 break 18248 } 18249 v.reset(Op386ORLconstmodifyidx4) 18250 v.AuxInt = makeValAndOff(c, off) 18251 v.Aux = sym 18252 v.AddArg(ptr) 18253 v.AddArg(idx) 18254 v.AddArg(mem) 18255 return true 18256 } 18257 return false 18258 } 18259 func rewriteValue386_Op386ROLBconst_0(v *Value) bool { 18260 // match: (ROLBconst [c] (ROLBconst [d] x)) 18261 // cond: 18262 // result: (ROLBconst [(c+d)& 7] x) 18263 for { 18264 c := v.AuxInt 18265 v_0 := v.Args[0] 18266 if v_0.Op != Op386ROLBconst { 18267 break 18268 } 18269 d := v_0.AuxInt 18270 x := v_0.Args[0] 18271 v.reset(Op386ROLBconst) 18272 v.AuxInt = (c + d) & 7 18273 v.AddArg(x) 18274 return true 18275 } 18276 // match: (ROLBconst [0] x) 18277 // cond: 18278 // result: x 18279 for { 18280 if v.AuxInt != 0 { 18281 break 18282 } 18283 x := v.Args[0] 18284 v.reset(OpCopy) 18285 v.Type = x.Type 18286 v.AddArg(x) 18287 return true 18288 } 18289 return false 18290 } 18291 func rewriteValue386_Op386ROLLconst_0(v *Value) bool { 18292 // match: (ROLLconst [c] (ROLLconst [d] x)) 18293 // cond: 18294 // result: (ROLLconst [(c+d)&31] x) 18295 for { 18296 c := v.AuxInt 18297 v_0 := v.Args[0] 18298 if v_0.Op != Op386ROLLconst { 18299 break 18300 } 18301 d := v_0.AuxInt 18302 x := v_0.Args[0] 18303 v.reset(Op386ROLLconst) 18304 v.AuxInt = (c + d) & 31 18305 v.AddArg(x) 18306 return true 18307 } 18308 // match: (ROLLconst [0] x) 18309 // cond: 18310 // result: x 18311 for { 18312 if v.AuxInt != 0 { 18313 break 18314 } 18315 x := v.Args[0] 18316 v.reset(OpCopy) 18317 v.Type = x.Type 18318 v.AddArg(x) 18319 return true 18320 } 18321 return false 18322 } 18323 func rewriteValue386_Op386ROLWconst_0(v *Value) bool { 18324 // match: (ROLWconst [c] (ROLWconst [d] x)) 18325 // cond: 18326 // result: (ROLWconst [(c+d)&15] x) 18327 for { 18328 c := v.AuxInt 18329 v_0 := v.Args[0] 18330 if v_0.Op != Op386ROLWconst { 18331 break 18332 } 18333 d := v_0.AuxInt 18334 x := v_0.Args[0] 18335 v.reset(Op386ROLWconst) 18336 v.AuxInt = (c + d) & 15 18337 v.AddArg(x) 18338 return true 18339 } 18340 // match: (ROLWconst [0] x) 18341 // cond: 18342 // result: x 18343 for { 18344 if v.AuxInt != 0 { 18345 break 18346 } 18347 x := v.Args[0] 18348 v.reset(OpCopy) 18349 v.Type = x.Type 18350 v.AddArg(x) 18351 return true 18352 } 18353 return false 18354 } 18355 func rewriteValue386_Op386SARB_0(v *Value) bool { 18356 // match: (SARB x (MOVLconst [c])) 18357 // cond: 18358 // result: (SARBconst [min(c&31,7)] x) 18359 for { 18360 _ = v.Args[1] 18361 x := v.Args[0] 18362 v_1 := v.Args[1] 18363 if v_1.Op != Op386MOVLconst { 18364 break 18365 } 18366 c := v_1.AuxInt 18367 v.reset(Op386SARBconst) 18368 v.AuxInt = min(c&31, 7) 18369 v.AddArg(x) 18370 return true 18371 } 18372 return false 18373 } 18374 func rewriteValue386_Op386SARBconst_0(v *Value) bool { 18375 // match: (SARBconst x [0]) 18376 // cond: 18377 // result: x 18378 for { 18379 if v.AuxInt != 0 { 18380 break 18381 } 18382 x := v.Args[0] 18383 v.reset(OpCopy) 18384 v.Type = x.Type 18385 v.AddArg(x) 18386 return true 18387 } 18388 // match: (SARBconst [c] (MOVLconst [d])) 18389 // cond: 18390 // result: (MOVLconst [d>>uint64(c)]) 18391 for { 18392 c := v.AuxInt 18393 v_0 := v.Args[0] 18394 if v_0.Op != Op386MOVLconst { 18395 break 18396 } 18397 d := v_0.AuxInt 18398 v.reset(Op386MOVLconst) 18399 v.AuxInt = d >> uint64(c) 18400 return true 18401 } 18402 return false 18403 } 18404 func rewriteValue386_Op386SARL_0(v *Value) bool { 18405 // match: (SARL x (MOVLconst [c])) 18406 // cond: 18407 // result: (SARLconst [c&31] x) 18408 for { 18409 _ = v.Args[1] 18410 x := v.Args[0] 18411 v_1 := v.Args[1] 18412 if v_1.Op != Op386MOVLconst { 18413 break 18414 } 18415 c := v_1.AuxInt 18416 v.reset(Op386SARLconst) 18417 v.AuxInt = c & 31 18418 v.AddArg(x) 18419 return true 18420 } 18421 // match: (SARL x (ANDLconst [31] y)) 18422 // cond: 18423 // result: (SARL x y) 18424 for { 18425 _ = v.Args[1] 18426 x := v.Args[0] 18427 v_1 := v.Args[1] 18428 if v_1.Op != Op386ANDLconst { 18429 break 18430 } 18431 if v_1.AuxInt != 31 { 18432 break 18433 } 18434 y := v_1.Args[0] 18435 v.reset(Op386SARL) 18436 v.AddArg(x) 18437 v.AddArg(y) 18438 return true 18439 } 18440 return false 18441 } 18442 func rewriteValue386_Op386SARLconst_0(v *Value) bool { 18443 // match: (SARLconst x [0]) 18444 // cond: 18445 // result: x 18446 for { 18447 if v.AuxInt != 0 { 18448 break 18449 } 18450 x := v.Args[0] 18451 v.reset(OpCopy) 18452 v.Type = x.Type 18453 v.AddArg(x) 18454 return true 18455 } 18456 // match: (SARLconst [c] (MOVLconst [d])) 18457 // cond: 18458 // result: (MOVLconst [d>>uint64(c)]) 18459 for { 18460 c := v.AuxInt 18461 v_0 := v.Args[0] 18462 if v_0.Op != Op386MOVLconst { 18463 break 18464 } 18465 d := v_0.AuxInt 18466 v.reset(Op386MOVLconst) 18467 v.AuxInt = d >> uint64(c) 18468 return true 18469 } 18470 return false 18471 } 18472 func rewriteValue386_Op386SARW_0(v *Value) bool { 18473 // match: (SARW x (MOVLconst [c])) 18474 // cond: 18475 // result: (SARWconst [min(c&31,15)] x) 18476 for { 18477 _ = v.Args[1] 18478 x := v.Args[0] 18479 v_1 := v.Args[1] 18480 if v_1.Op != Op386MOVLconst { 18481 break 18482 } 18483 c := v_1.AuxInt 18484 v.reset(Op386SARWconst) 18485 v.AuxInt = min(c&31, 15) 18486 v.AddArg(x) 18487 return true 18488 } 18489 return false 18490 } 18491 func rewriteValue386_Op386SARWconst_0(v *Value) bool { 18492 // match: (SARWconst x [0]) 18493 // cond: 18494 // result: x 18495 for { 18496 if v.AuxInt != 0 { 18497 break 18498 } 18499 x := v.Args[0] 18500 v.reset(OpCopy) 18501 v.Type = x.Type 18502 v.AddArg(x) 18503 return true 18504 } 18505 // match: (SARWconst [c] (MOVLconst [d])) 18506 // cond: 18507 // result: (MOVLconst [d>>uint64(c)]) 18508 for { 18509 c := v.AuxInt 18510 v_0 := v.Args[0] 18511 if v_0.Op != Op386MOVLconst { 18512 break 18513 } 18514 d := v_0.AuxInt 18515 v.reset(Op386MOVLconst) 18516 v.AuxInt = d >> uint64(c) 18517 return true 18518 } 18519 return false 18520 } 18521 func rewriteValue386_Op386SBBL_0(v *Value) bool { 18522 // match: (SBBL x (MOVLconst [c]) f) 18523 // cond: 18524 // result: (SBBLconst [c] x f) 18525 for { 18526 _ = v.Args[2] 18527 x := v.Args[0] 18528 v_1 := v.Args[1] 18529 if v_1.Op != Op386MOVLconst { 18530 break 18531 } 18532 c := v_1.AuxInt 18533 f := v.Args[2] 18534 v.reset(Op386SBBLconst) 18535 v.AuxInt = c 18536 v.AddArg(x) 18537 v.AddArg(f) 18538 return true 18539 } 18540 return false 18541 } 18542 func rewriteValue386_Op386SBBLcarrymask_0(v *Value) bool { 18543 // match: (SBBLcarrymask (FlagEQ)) 18544 // cond: 18545 // result: (MOVLconst [0]) 18546 for { 18547 v_0 := v.Args[0] 18548 if v_0.Op != Op386FlagEQ { 18549 break 18550 } 18551 v.reset(Op386MOVLconst) 18552 v.AuxInt = 0 18553 return true 18554 } 18555 // match: (SBBLcarrymask (FlagLT_ULT)) 18556 // cond: 18557 // result: (MOVLconst [-1]) 18558 for { 18559 v_0 := v.Args[0] 18560 if v_0.Op != Op386FlagLT_ULT { 18561 break 18562 } 18563 v.reset(Op386MOVLconst) 18564 v.AuxInt = -1 18565 return true 18566 } 18567 // match: (SBBLcarrymask (FlagLT_UGT)) 18568 // cond: 18569 // result: (MOVLconst [0]) 18570 for { 18571 v_0 := v.Args[0] 18572 if v_0.Op != Op386FlagLT_UGT { 18573 break 18574 } 18575 v.reset(Op386MOVLconst) 18576 v.AuxInt = 0 18577 return true 18578 } 18579 // match: (SBBLcarrymask (FlagGT_ULT)) 18580 // cond: 18581 // result: (MOVLconst [-1]) 18582 for { 18583 v_0 := v.Args[0] 18584 if v_0.Op != Op386FlagGT_ULT { 18585 break 18586 } 18587 v.reset(Op386MOVLconst) 18588 v.AuxInt = -1 18589 return true 18590 } 18591 // match: (SBBLcarrymask (FlagGT_UGT)) 18592 // cond: 18593 // result: (MOVLconst [0]) 18594 for { 18595 v_0 := v.Args[0] 18596 if v_0.Op != Op386FlagGT_UGT { 18597 break 18598 } 18599 v.reset(Op386MOVLconst) 18600 v.AuxInt = 0 18601 return true 18602 } 18603 return false 18604 } 18605 func rewriteValue386_Op386SETA_0(v *Value) bool { 18606 // match: (SETA (InvertFlags x)) 18607 // cond: 18608 // result: (SETB x) 18609 for { 18610 v_0 := v.Args[0] 18611 if v_0.Op != Op386InvertFlags { 18612 break 18613 } 18614 x := v_0.Args[0] 18615 v.reset(Op386SETB) 18616 v.AddArg(x) 18617 return true 18618 } 18619 // match: (SETA (FlagEQ)) 18620 // cond: 18621 // result: (MOVLconst [0]) 18622 for { 18623 v_0 := v.Args[0] 18624 if v_0.Op != Op386FlagEQ { 18625 break 18626 } 18627 v.reset(Op386MOVLconst) 18628 v.AuxInt = 0 18629 return true 18630 } 18631 // match: (SETA (FlagLT_ULT)) 18632 // cond: 18633 // result: (MOVLconst [0]) 18634 for { 18635 v_0 := v.Args[0] 18636 if v_0.Op != Op386FlagLT_ULT { 18637 break 18638 } 18639 v.reset(Op386MOVLconst) 18640 v.AuxInt = 0 18641 return true 18642 } 18643 // match: (SETA (FlagLT_UGT)) 18644 // cond: 18645 // result: (MOVLconst [1]) 18646 for { 18647 v_0 := v.Args[0] 18648 if v_0.Op != Op386FlagLT_UGT { 18649 break 18650 } 18651 v.reset(Op386MOVLconst) 18652 v.AuxInt = 1 18653 return true 18654 } 18655 // match: (SETA (FlagGT_ULT)) 18656 // cond: 18657 // result: (MOVLconst [0]) 18658 for { 18659 v_0 := v.Args[0] 18660 if v_0.Op != Op386FlagGT_ULT { 18661 break 18662 } 18663 v.reset(Op386MOVLconst) 18664 v.AuxInt = 0 18665 return true 18666 } 18667 // match: (SETA (FlagGT_UGT)) 18668 // cond: 18669 // result: (MOVLconst [1]) 18670 for { 18671 v_0 := v.Args[0] 18672 if v_0.Op != Op386FlagGT_UGT { 18673 break 18674 } 18675 v.reset(Op386MOVLconst) 18676 v.AuxInt = 1 18677 return true 18678 } 18679 return false 18680 } 18681 func rewriteValue386_Op386SETAE_0(v *Value) bool { 18682 // match: (SETAE (InvertFlags x)) 18683 // cond: 18684 // result: (SETBE x) 18685 for { 18686 v_0 := v.Args[0] 18687 if v_0.Op != Op386InvertFlags { 18688 break 18689 } 18690 x := v_0.Args[0] 18691 v.reset(Op386SETBE) 18692 v.AddArg(x) 18693 return true 18694 } 18695 // match: (SETAE (FlagEQ)) 18696 // cond: 18697 // result: (MOVLconst [1]) 18698 for { 18699 v_0 := v.Args[0] 18700 if v_0.Op != Op386FlagEQ { 18701 break 18702 } 18703 v.reset(Op386MOVLconst) 18704 v.AuxInt = 1 18705 return true 18706 } 18707 // match: (SETAE (FlagLT_ULT)) 18708 // cond: 18709 // result: (MOVLconst [0]) 18710 for { 18711 v_0 := v.Args[0] 18712 if v_0.Op != Op386FlagLT_ULT { 18713 break 18714 } 18715 v.reset(Op386MOVLconst) 18716 v.AuxInt = 0 18717 return true 18718 } 18719 // match: (SETAE (FlagLT_UGT)) 18720 // cond: 18721 // result: (MOVLconst [1]) 18722 for { 18723 v_0 := v.Args[0] 18724 if v_0.Op != Op386FlagLT_UGT { 18725 break 18726 } 18727 v.reset(Op386MOVLconst) 18728 v.AuxInt = 1 18729 return true 18730 } 18731 // match: (SETAE (FlagGT_ULT)) 18732 // cond: 18733 // result: (MOVLconst [0]) 18734 for { 18735 v_0 := v.Args[0] 18736 if v_0.Op != Op386FlagGT_ULT { 18737 break 18738 } 18739 v.reset(Op386MOVLconst) 18740 v.AuxInt = 0 18741 return true 18742 } 18743 // match: (SETAE (FlagGT_UGT)) 18744 // cond: 18745 // result: (MOVLconst [1]) 18746 for { 18747 v_0 := v.Args[0] 18748 if v_0.Op != Op386FlagGT_UGT { 18749 break 18750 } 18751 v.reset(Op386MOVLconst) 18752 v.AuxInt = 1 18753 return true 18754 } 18755 return false 18756 } 18757 func rewriteValue386_Op386SETB_0(v *Value) bool { 18758 // match: (SETB (InvertFlags x)) 18759 // cond: 18760 // result: (SETA x) 18761 for { 18762 v_0 := v.Args[0] 18763 if v_0.Op != Op386InvertFlags { 18764 break 18765 } 18766 x := v_0.Args[0] 18767 v.reset(Op386SETA) 18768 v.AddArg(x) 18769 return true 18770 } 18771 // match: (SETB (FlagEQ)) 18772 // cond: 18773 // result: (MOVLconst [0]) 18774 for { 18775 v_0 := v.Args[0] 18776 if v_0.Op != Op386FlagEQ { 18777 break 18778 } 18779 v.reset(Op386MOVLconst) 18780 v.AuxInt = 0 18781 return true 18782 } 18783 // match: (SETB (FlagLT_ULT)) 18784 // cond: 18785 // result: (MOVLconst [1]) 18786 for { 18787 v_0 := v.Args[0] 18788 if v_0.Op != Op386FlagLT_ULT { 18789 break 18790 } 18791 v.reset(Op386MOVLconst) 18792 v.AuxInt = 1 18793 return true 18794 } 18795 // match: (SETB (FlagLT_UGT)) 18796 // cond: 18797 // result: (MOVLconst [0]) 18798 for { 18799 v_0 := v.Args[0] 18800 if v_0.Op != Op386FlagLT_UGT { 18801 break 18802 } 18803 v.reset(Op386MOVLconst) 18804 v.AuxInt = 0 18805 return true 18806 } 18807 // match: (SETB (FlagGT_ULT)) 18808 // cond: 18809 // result: (MOVLconst [1]) 18810 for { 18811 v_0 := v.Args[0] 18812 if v_0.Op != Op386FlagGT_ULT { 18813 break 18814 } 18815 v.reset(Op386MOVLconst) 18816 v.AuxInt = 1 18817 return true 18818 } 18819 // match: (SETB (FlagGT_UGT)) 18820 // cond: 18821 // result: (MOVLconst [0]) 18822 for { 18823 v_0 := v.Args[0] 18824 if v_0.Op != Op386FlagGT_UGT { 18825 break 18826 } 18827 v.reset(Op386MOVLconst) 18828 v.AuxInt = 0 18829 return true 18830 } 18831 return false 18832 } 18833 func rewriteValue386_Op386SETBE_0(v *Value) bool { 18834 // match: (SETBE (InvertFlags x)) 18835 // cond: 18836 // result: (SETAE x) 18837 for { 18838 v_0 := v.Args[0] 18839 if v_0.Op != Op386InvertFlags { 18840 break 18841 } 18842 x := v_0.Args[0] 18843 v.reset(Op386SETAE) 18844 v.AddArg(x) 18845 return true 18846 } 18847 // match: (SETBE (FlagEQ)) 18848 // cond: 18849 // result: (MOVLconst [1]) 18850 for { 18851 v_0 := v.Args[0] 18852 if v_0.Op != Op386FlagEQ { 18853 break 18854 } 18855 v.reset(Op386MOVLconst) 18856 v.AuxInt = 1 18857 return true 18858 } 18859 // match: (SETBE (FlagLT_ULT)) 18860 // cond: 18861 // result: (MOVLconst [1]) 18862 for { 18863 v_0 := v.Args[0] 18864 if v_0.Op != Op386FlagLT_ULT { 18865 break 18866 } 18867 v.reset(Op386MOVLconst) 18868 v.AuxInt = 1 18869 return true 18870 } 18871 // match: (SETBE (FlagLT_UGT)) 18872 // cond: 18873 // result: (MOVLconst [0]) 18874 for { 18875 v_0 := v.Args[0] 18876 if v_0.Op != Op386FlagLT_UGT { 18877 break 18878 } 18879 v.reset(Op386MOVLconst) 18880 v.AuxInt = 0 18881 return true 18882 } 18883 // match: (SETBE (FlagGT_ULT)) 18884 // cond: 18885 // result: (MOVLconst [1]) 18886 for { 18887 v_0 := v.Args[0] 18888 if v_0.Op != Op386FlagGT_ULT { 18889 break 18890 } 18891 v.reset(Op386MOVLconst) 18892 v.AuxInt = 1 18893 return true 18894 } 18895 // match: (SETBE (FlagGT_UGT)) 18896 // cond: 18897 // result: (MOVLconst [0]) 18898 for { 18899 v_0 := v.Args[0] 18900 if v_0.Op != Op386FlagGT_UGT { 18901 break 18902 } 18903 v.reset(Op386MOVLconst) 18904 v.AuxInt = 0 18905 return true 18906 } 18907 return false 18908 } 18909 func rewriteValue386_Op386SETEQ_0(v *Value) bool { 18910 // match: (SETEQ (InvertFlags x)) 18911 // cond: 18912 // result: (SETEQ x) 18913 for { 18914 v_0 := v.Args[0] 18915 if v_0.Op != Op386InvertFlags { 18916 break 18917 } 18918 x := v_0.Args[0] 18919 v.reset(Op386SETEQ) 18920 v.AddArg(x) 18921 return true 18922 } 18923 // match: (SETEQ (FlagEQ)) 18924 // cond: 18925 // result: (MOVLconst [1]) 18926 for { 18927 v_0 := v.Args[0] 18928 if v_0.Op != Op386FlagEQ { 18929 break 18930 } 18931 v.reset(Op386MOVLconst) 18932 v.AuxInt = 1 18933 return true 18934 } 18935 // match: (SETEQ (FlagLT_ULT)) 18936 // cond: 18937 // result: (MOVLconst [0]) 18938 for { 18939 v_0 := v.Args[0] 18940 if v_0.Op != Op386FlagLT_ULT { 18941 break 18942 } 18943 v.reset(Op386MOVLconst) 18944 v.AuxInt = 0 18945 return true 18946 } 18947 // match: (SETEQ (FlagLT_UGT)) 18948 // cond: 18949 // result: (MOVLconst [0]) 18950 for { 18951 v_0 := v.Args[0] 18952 if v_0.Op != Op386FlagLT_UGT { 18953 break 18954 } 18955 v.reset(Op386MOVLconst) 18956 v.AuxInt = 0 18957 return true 18958 } 18959 // match: (SETEQ (FlagGT_ULT)) 18960 // cond: 18961 // result: (MOVLconst [0]) 18962 for { 18963 v_0 := v.Args[0] 18964 if v_0.Op != Op386FlagGT_ULT { 18965 break 18966 } 18967 v.reset(Op386MOVLconst) 18968 v.AuxInt = 0 18969 return true 18970 } 18971 // match: (SETEQ (FlagGT_UGT)) 18972 // cond: 18973 // result: (MOVLconst [0]) 18974 for { 18975 v_0 := v.Args[0] 18976 if v_0.Op != Op386FlagGT_UGT { 18977 break 18978 } 18979 v.reset(Op386MOVLconst) 18980 v.AuxInt = 0 18981 return true 18982 } 18983 return false 18984 } 18985 func rewriteValue386_Op386SETG_0(v *Value) bool { 18986 // match: (SETG (InvertFlags x)) 18987 // cond: 18988 // result: (SETL x) 18989 for { 18990 v_0 := v.Args[0] 18991 if v_0.Op != Op386InvertFlags { 18992 break 18993 } 18994 x := v_0.Args[0] 18995 v.reset(Op386SETL) 18996 v.AddArg(x) 18997 return true 18998 } 18999 // match: (SETG (FlagEQ)) 19000 // cond: 19001 // result: (MOVLconst [0]) 19002 for { 19003 v_0 := v.Args[0] 19004 if v_0.Op != Op386FlagEQ { 19005 break 19006 } 19007 v.reset(Op386MOVLconst) 19008 v.AuxInt = 0 19009 return true 19010 } 19011 // match: (SETG (FlagLT_ULT)) 19012 // cond: 19013 // result: (MOVLconst [0]) 19014 for { 19015 v_0 := v.Args[0] 19016 if v_0.Op != Op386FlagLT_ULT { 19017 break 19018 } 19019 v.reset(Op386MOVLconst) 19020 v.AuxInt = 0 19021 return true 19022 } 19023 // match: (SETG (FlagLT_UGT)) 19024 // cond: 19025 // result: (MOVLconst [0]) 19026 for { 19027 v_0 := v.Args[0] 19028 if v_0.Op != Op386FlagLT_UGT { 19029 break 19030 } 19031 v.reset(Op386MOVLconst) 19032 v.AuxInt = 0 19033 return true 19034 } 19035 // match: (SETG (FlagGT_ULT)) 19036 // cond: 19037 // result: (MOVLconst [1]) 19038 for { 19039 v_0 := v.Args[0] 19040 if v_0.Op != Op386FlagGT_ULT { 19041 break 19042 } 19043 v.reset(Op386MOVLconst) 19044 v.AuxInt = 1 19045 return true 19046 } 19047 // match: (SETG (FlagGT_UGT)) 19048 // cond: 19049 // result: (MOVLconst [1]) 19050 for { 19051 v_0 := v.Args[0] 19052 if v_0.Op != Op386FlagGT_UGT { 19053 break 19054 } 19055 v.reset(Op386MOVLconst) 19056 v.AuxInt = 1 19057 return true 19058 } 19059 return false 19060 } 19061 func rewriteValue386_Op386SETGE_0(v *Value) bool { 19062 // match: (SETGE (InvertFlags x)) 19063 // cond: 19064 // result: (SETLE x) 19065 for { 19066 v_0 := v.Args[0] 19067 if v_0.Op != Op386InvertFlags { 19068 break 19069 } 19070 x := v_0.Args[0] 19071 v.reset(Op386SETLE) 19072 v.AddArg(x) 19073 return true 19074 } 19075 // match: (SETGE (FlagEQ)) 19076 // cond: 19077 // result: (MOVLconst [1]) 19078 for { 19079 v_0 := v.Args[0] 19080 if v_0.Op != Op386FlagEQ { 19081 break 19082 } 19083 v.reset(Op386MOVLconst) 19084 v.AuxInt = 1 19085 return true 19086 } 19087 // match: (SETGE (FlagLT_ULT)) 19088 // cond: 19089 // result: (MOVLconst [0]) 19090 for { 19091 v_0 := v.Args[0] 19092 if v_0.Op != Op386FlagLT_ULT { 19093 break 19094 } 19095 v.reset(Op386MOVLconst) 19096 v.AuxInt = 0 19097 return true 19098 } 19099 // match: (SETGE (FlagLT_UGT)) 19100 // cond: 19101 // result: (MOVLconst [0]) 19102 for { 19103 v_0 := v.Args[0] 19104 if v_0.Op != Op386FlagLT_UGT { 19105 break 19106 } 19107 v.reset(Op386MOVLconst) 19108 v.AuxInt = 0 19109 return true 19110 } 19111 // match: (SETGE (FlagGT_ULT)) 19112 // cond: 19113 // result: (MOVLconst [1]) 19114 for { 19115 v_0 := v.Args[0] 19116 if v_0.Op != Op386FlagGT_ULT { 19117 break 19118 } 19119 v.reset(Op386MOVLconst) 19120 v.AuxInt = 1 19121 return true 19122 } 19123 // match: (SETGE (FlagGT_UGT)) 19124 // cond: 19125 // result: (MOVLconst [1]) 19126 for { 19127 v_0 := v.Args[0] 19128 if v_0.Op != Op386FlagGT_UGT { 19129 break 19130 } 19131 v.reset(Op386MOVLconst) 19132 v.AuxInt = 1 19133 return true 19134 } 19135 return false 19136 } 19137 func rewriteValue386_Op386SETL_0(v *Value) bool { 19138 // match: (SETL (InvertFlags x)) 19139 // cond: 19140 // result: (SETG x) 19141 for { 19142 v_0 := v.Args[0] 19143 if v_0.Op != Op386InvertFlags { 19144 break 19145 } 19146 x := v_0.Args[0] 19147 v.reset(Op386SETG) 19148 v.AddArg(x) 19149 return true 19150 } 19151 // match: (SETL (FlagEQ)) 19152 // cond: 19153 // result: (MOVLconst [0]) 19154 for { 19155 v_0 := v.Args[0] 19156 if v_0.Op != Op386FlagEQ { 19157 break 19158 } 19159 v.reset(Op386MOVLconst) 19160 v.AuxInt = 0 19161 return true 19162 } 19163 // match: (SETL (FlagLT_ULT)) 19164 // cond: 19165 // result: (MOVLconst [1]) 19166 for { 19167 v_0 := v.Args[0] 19168 if v_0.Op != Op386FlagLT_ULT { 19169 break 19170 } 19171 v.reset(Op386MOVLconst) 19172 v.AuxInt = 1 19173 return true 19174 } 19175 // match: (SETL (FlagLT_UGT)) 19176 // cond: 19177 // result: (MOVLconst [1]) 19178 for { 19179 v_0 := v.Args[0] 19180 if v_0.Op != Op386FlagLT_UGT { 19181 break 19182 } 19183 v.reset(Op386MOVLconst) 19184 v.AuxInt = 1 19185 return true 19186 } 19187 // match: (SETL (FlagGT_ULT)) 19188 // cond: 19189 // result: (MOVLconst [0]) 19190 for { 19191 v_0 := v.Args[0] 19192 if v_0.Op != Op386FlagGT_ULT { 19193 break 19194 } 19195 v.reset(Op386MOVLconst) 19196 v.AuxInt = 0 19197 return true 19198 } 19199 // match: (SETL (FlagGT_UGT)) 19200 // cond: 19201 // result: (MOVLconst [0]) 19202 for { 19203 v_0 := v.Args[0] 19204 if v_0.Op != Op386FlagGT_UGT { 19205 break 19206 } 19207 v.reset(Op386MOVLconst) 19208 v.AuxInt = 0 19209 return true 19210 } 19211 return false 19212 } 19213 func rewriteValue386_Op386SETLE_0(v *Value) bool { 19214 // match: (SETLE (InvertFlags x)) 19215 // cond: 19216 // result: (SETGE x) 19217 for { 19218 v_0 := v.Args[0] 19219 if v_0.Op != Op386InvertFlags { 19220 break 19221 } 19222 x := v_0.Args[0] 19223 v.reset(Op386SETGE) 19224 v.AddArg(x) 19225 return true 19226 } 19227 // match: (SETLE (FlagEQ)) 19228 // cond: 19229 // result: (MOVLconst [1]) 19230 for { 19231 v_0 := v.Args[0] 19232 if v_0.Op != Op386FlagEQ { 19233 break 19234 } 19235 v.reset(Op386MOVLconst) 19236 v.AuxInt = 1 19237 return true 19238 } 19239 // match: (SETLE (FlagLT_ULT)) 19240 // cond: 19241 // result: (MOVLconst [1]) 19242 for { 19243 v_0 := v.Args[0] 19244 if v_0.Op != Op386FlagLT_ULT { 19245 break 19246 } 19247 v.reset(Op386MOVLconst) 19248 v.AuxInt = 1 19249 return true 19250 } 19251 // match: (SETLE (FlagLT_UGT)) 19252 // cond: 19253 // result: (MOVLconst [1]) 19254 for { 19255 v_0 := v.Args[0] 19256 if v_0.Op != Op386FlagLT_UGT { 19257 break 19258 } 19259 v.reset(Op386MOVLconst) 19260 v.AuxInt = 1 19261 return true 19262 } 19263 // match: (SETLE (FlagGT_ULT)) 19264 // cond: 19265 // result: (MOVLconst [0]) 19266 for { 19267 v_0 := v.Args[0] 19268 if v_0.Op != Op386FlagGT_ULT { 19269 break 19270 } 19271 v.reset(Op386MOVLconst) 19272 v.AuxInt = 0 19273 return true 19274 } 19275 // match: (SETLE (FlagGT_UGT)) 19276 // cond: 19277 // result: (MOVLconst [0]) 19278 for { 19279 v_0 := v.Args[0] 19280 if v_0.Op != Op386FlagGT_UGT { 19281 break 19282 } 19283 v.reset(Op386MOVLconst) 19284 v.AuxInt = 0 19285 return true 19286 } 19287 return false 19288 } 19289 func rewriteValue386_Op386SETNE_0(v *Value) bool { 19290 // match: (SETNE (InvertFlags x)) 19291 // cond: 19292 // result: (SETNE x) 19293 for { 19294 v_0 := v.Args[0] 19295 if v_0.Op != Op386InvertFlags { 19296 break 19297 } 19298 x := v_0.Args[0] 19299 v.reset(Op386SETNE) 19300 v.AddArg(x) 19301 return true 19302 } 19303 // match: (SETNE (FlagEQ)) 19304 // cond: 19305 // result: (MOVLconst [0]) 19306 for { 19307 v_0 := v.Args[0] 19308 if v_0.Op != Op386FlagEQ { 19309 break 19310 } 19311 v.reset(Op386MOVLconst) 19312 v.AuxInt = 0 19313 return true 19314 } 19315 // match: (SETNE (FlagLT_ULT)) 19316 // cond: 19317 // result: (MOVLconst [1]) 19318 for { 19319 v_0 := v.Args[0] 19320 if v_0.Op != Op386FlagLT_ULT { 19321 break 19322 } 19323 v.reset(Op386MOVLconst) 19324 v.AuxInt = 1 19325 return true 19326 } 19327 // match: (SETNE (FlagLT_UGT)) 19328 // cond: 19329 // result: (MOVLconst [1]) 19330 for { 19331 v_0 := v.Args[0] 19332 if v_0.Op != Op386FlagLT_UGT { 19333 break 19334 } 19335 v.reset(Op386MOVLconst) 19336 v.AuxInt = 1 19337 return true 19338 } 19339 // match: (SETNE (FlagGT_ULT)) 19340 // cond: 19341 // result: (MOVLconst [1]) 19342 for { 19343 v_0 := v.Args[0] 19344 if v_0.Op != Op386FlagGT_ULT { 19345 break 19346 } 19347 v.reset(Op386MOVLconst) 19348 v.AuxInt = 1 19349 return true 19350 } 19351 // match: (SETNE (FlagGT_UGT)) 19352 // cond: 19353 // result: (MOVLconst [1]) 19354 for { 19355 v_0 := v.Args[0] 19356 if v_0.Op != Op386FlagGT_UGT { 19357 break 19358 } 19359 v.reset(Op386MOVLconst) 19360 v.AuxInt = 1 19361 return true 19362 } 19363 return false 19364 } 19365 func rewriteValue386_Op386SHLL_0(v *Value) bool { 19366 // match: (SHLL x (MOVLconst [c])) 19367 // cond: 19368 // result: (SHLLconst [c&31] x) 19369 for { 19370 _ = v.Args[1] 19371 x := v.Args[0] 19372 v_1 := v.Args[1] 19373 if v_1.Op != Op386MOVLconst { 19374 break 19375 } 19376 c := v_1.AuxInt 19377 v.reset(Op386SHLLconst) 19378 v.AuxInt = c & 31 19379 v.AddArg(x) 19380 return true 19381 } 19382 // match: (SHLL x (ANDLconst [31] y)) 19383 // cond: 19384 // result: (SHLL x y) 19385 for { 19386 _ = v.Args[1] 19387 x := v.Args[0] 19388 v_1 := v.Args[1] 19389 if v_1.Op != Op386ANDLconst { 19390 break 19391 } 19392 if v_1.AuxInt != 31 { 19393 break 19394 } 19395 y := v_1.Args[0] 19396 v.reset(Op386SHLL) 19397 v.AddArg(x) 19398 v.AddArg(y) 19399 return true 19400 } 19401 return false 19402 } 19403 func rewriteValue386_Op386SHLLconst_0(v *Value) bool { 19404 // match: (SHLLconst x [0]) 19405 // cond: 19406 // result: x 19407 for { 19408 if v.AuxInt != 0 { 19409 break 19410 } 19411 x := v.Args[0] 19412 v.reset(OpCopy) 19413 v.Type = x.Type 19414 v.AddArg(x) 19415 return true 19416 } 19417 return false 19418 } 19419 func rewriteValue386_Op386SHRB_0(v *Value) bool { 19420 // match: (SHRB x (MOVLconst [c])) 19421 // cond: c&31 < 8 19422 // result: (SHRBconst [c&31] x) 19423 for { 19424 _ = v.Args[1] 19425 x := v.Args[0] 19426 v_1 := v.Args[1] 19427 if v_1.Op != Op386MOVLconst { 19428 break 19429 } 19430 c := v_1.AuxInt 19431 if !(c&31 < 8) { 19432 break 19433 } 19434 v.reset(Op386SHRBconst) 19435 v.AuxInt = c & 31 19436 v.AddArg(x) 19437 return true 19438 } 19439 // match: (SHRB _ (MOVLconst [c])) 19440 // cond: c&31 >= 8 19441 // result: (MOVLconst [0]) 19442 for { 19443 _ = v.Args[1] 19444 v_1 := v.Args[1] 19445 if v_1.Op != Op386MOVLconst { 19446 break 19447 } 19448 c := v_1.AuxInt 19449 if !(c&31 >= 8) { 19450 break 19451 } 19452 v.reset(Op386MOVLconst) 19453 v.AuxInt = 0 19454 return true 19455 } 19456 return false 19457 } 19458 func rewriteValue386_Op386SHRBconst_0(v *Value) bool { 19459 // match: (SHRBconst x [0]) 19460 // cond: 19461 // result: x 19462 for { 19463 if v.AuxInt != 0 { 19464 break 19465 } 19466 x := v.Args[0] 19467 v.reset(OpCopy) 19468 v.Type = x.Type 19469 v.AddArg(x) 19470 return true 19471 } 19472 return false 19473 } 19474 func rewriteValue386_Op386SHRL_0(v *Value) bool { 19475 // match: (SHRL x (MOVLconst [c])) 19476 // cond: 19477 // result: (SHRLconst [c&31] x) 19478 for { 19479 _ = v.Args[1] 19480 x := v.Args[0] 19481 v_1 := v.Args[1] 19482 if v_1.Op != Op386MOVLconst { 19483 break 19484 } 19485 c := v_1.AuxInt 19486 v.reset(Op386SHRLconst) 19487 v.AuxInt = c & 31 19488 v.AddArg(x) 19489 return true 19490 } 19491 // match: (SHRL x (ANDLconst [31] y)) 19492 // cond: 19493 // result: (SHRL x y) 19494 for { 19495 _ = v.Args[1] 19496 x := v.Args[0] 19497 v_1 := v.Args[1] 19498 if v_1.Op != Op386ANDLconst { 19499 break 19500 } 19501 if v_1.AuxInt != 31 { 19502 break 19503 } 19504 y := v_1.Args[0] 19505 v.reset(Op386SHRL) 19506 v.AddArg(x) 19507 v.AddArg(y) 19508 return true 19509 } 19510 return false 19511 } 19512 func rewriteValue386_Op386SHRLconst_0(v *Value) bool { 19513 // match: (SHRLconst x [0]) 19514 // cond: 19515 // result: x 19516 for { 19517 if v.AuxInt != 0 { 19518 break 19519 } 19520 x := v.Args[0] 19521 v.reset(OpCopy) 19522 v.Type = x.Type 19523 v.AddArg(x) 19524 return true 19525 } 19526 return false 19527 } 19528 func rewriteValue386_Op386SHRW_0(v *Value) bool { 19529 // match: (SHRW x (MOVLconst [c])) 19530 // cond: c&31 < 16 19531 // result: (SHRWconst [c&31] x) 19532 for { 19533 _ = v.Args[1] 19534 x := v.Args[0] 19535 v_1 := v.Args[1] 19536 if v_1.Op != Op386MOVLconst { 19537 break 19538 } 19539 c := v_1.AuxInt 19540 if !(c&31 < 16) { 19541 break 19542 } 19543 v.reset(Op386SHRWconst) 19544 v.AuxInt = c & 31 19545 v.AddArg(x) 19546 return true 19547 } 19548 // match: (SHRW _ (MOVLconst [c])) 19549 // cond: c&31 >= 16 19550 // result: (MOVLconst [0]) 19551 for { 19552 _ = v.Args[1] 19553 v_1 := v.Args[1] 19554 if v_1.Op != Op386MOVLconst { 19555 break 19556 } 19557 c := v_1.AuxInt 19558 if !(c&31 >= 16) { 19559 break 19560 } 19561 v.reset(Op386MOVLconst) 19562 v.AuxInt = 0 19563 return true 19564 } 19565 return false 19566 } 19567 func rewriteValue386_Op386SHRWconst_0(v *Value) bool { 19568 // match: (SHRWconst x [0]) 19569 // cond: 19570 // result: x 19571 for { 19572 if v.AuxInt != 0 { 19573 break 19574 } 19575 x := v.Args[0] 19576 v.reset(OpCopy) 19577 v.Type = x.Type 19578 v.AddArg(x) 19579 return true 19580 } 19581 return false 19582 } 19583 func rewriteValue386_Op386SUBL_0(v *Value) bool { 19584 b := v.Block 19585 _ = b 19586 // match: (SUBL x (MOVLconst [c])) 19587 // cond: 19588 // result: (SUBLconst x [c]) 19589 for { 19590 _ = v.Args[1] 19591 x := v.Args[0] 19592 v_1 := v.Args[1] 19593 if v_1.Op != Op386MOVLconst { 19594 break 19595 } 19596 c := v_1.AuxInt 19597 v.reset(Op386SUBLconst) 19598 v.AuxInt = c 19599 v.AddArg(x) 19600 return true 19601 } 19602 // match: (SUBL (MOVLconst [c]) x) 19603 // cond: 19604 // result: (NEGL (SUBLconst <v.Type> x [c])) 19605 for { 19606 _ = v.Args[1] 19607 v_0 := v.Args[0] 19608 if v_0.Op != Op386MOVLconst { 19609 break 19610 } 19611 c := v_0.AuxInt 19612 x := v.Args[1] 19613 v.reset(Op386NEGL) 19614 v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) 19615 v0.AuxInt = c 19616 v0.AddArg(x) 19617 v.AddArg(v0) 19618 return true 19619 } 19620 // match: (SUBL x l:(MOVLload [off] {sym} ptr mem)) 19621 // cond: canMergeLoad(v, l, x) && clobber(l) 19622 // result: (SUBLload x [off] {sym} ptr mem) 19623 for { 19624 _ = v.Args[1] 19625 x := v.Args[0] 19626 l := v.Args[1] 19627 if l.Op != Op386MOVLload { 19628 break 19629 } 19630 off := l.AuxInt 19631 sym := l.Aux 19632 _ = l.Args[1] 19633 ptr := l.Args[0] 19634 mem := l.Args[1] 19635 if !(canMergeLoad(v, l, x) && clobber(l)) { 19636 break 19637 } 19638 v.reset(Op386SUBLload) 19639 v.AuxInt = off 19640 v.Aux = sym 19641 v.AddArg(x) 19642 v.AddArg(ptr) 19643 v.AddArg(mem) 19644 return true 19645 } 19646 // match: (SUBL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) 19647 // cond: canMergeLoad(v, l, x) && clobber(l) 19648 // result: (SUBLloadidx4 x [off] {sym} ptr idx mem) 19649 for { 19650 _ = v.Args[1] 19651 x := v.Args[0] 19652 l := v.Args[1] 19653 if l.Op != Op386MOVLloadidx4 { 19654 break 19655 } 19656 off := l.AuxInt 19657 sym := l.Aux 19658 _ = l.Args[2] 19659 ptr := l.Args[0] 19660 idx := l.Args[1] 19661 mem := l.Args[2] 19662 if !(canMergeLoad(v, l, x) && clobber(l)) { 19663 break 19664 } 19665 v.reset(Op386SUBLloadidx4) 19666 v.AuxInt = off 19667 v.Aux = sym 19668 v.AddArg(x) 19669 v.AddArg(ptr) 19670 v.AddArg(idx) 19671 v.AddArg(mem) 19672 return true 19673 } 19674 // match: (SUBL x x) 19675 // cond: 19676 // result: (MOVLconst [0]) 19677 for { 19678 _ = v.Args[1] 19679 x := v.Args[0] 19680 if x != v.Args[1] { 19681 break 19682 } 19683 v.reset(Op386MOVLconst) 19684 v.AuxInt = 0 19685 return true 19686 } 19687 return false 19688 } 19689 func rewriteValue386_Op386SUBLcarry_0(v *Value) bool { 19690 // match: (SUBLcarry x (MOVLconst [c])) 19691 // cond: 19692 // result: (SUBLconstcarry [c] x) 19693 for { 19694 _ = v.Args[1] 19695 x := v.Args[0] 19696 v_1 := v.Args[1] 19697 if v_1.Op != Op386MOVLconst { 19698 break 19699 } 19700 c := v_1.AuxInt 19701 v.reset(Op386SUBLconstcarry) 19702 v.AuxInt = c 19703 v.AddArg(x) 19704 return true 19705 } 19706 return false 19707 } 19708 func rewriteValue386_Op386SUBLconst_0(v *Value) bool { 19709 // match: (SUBLconst [c] x) 19710 // cond: int32(c) == 0 19711 // result: x 19712 for { 19713 c := v.AuxInt 19714 x := v.Args[0] 19715 if !(int32(c) == 0) { 19716 break 19717 } 19718 v.reset(OpCopy) 19719 v.Type = x.Type 19720 v.AddArg(x) 19721 return true 19722 } 19723 // match: (SUBLconst [c] x) 19724 // cond: 19725 // result: (ADDLconst [int64(int32(-c))] x) 19726 for { 19727 c := v.AuxInt 19728 x := v.Args[0] 19729 v.reset(Op386ADDLconst) 19730 v.AuxInt = int64(int32(-c)) 19731 v.AddArg(x) 19732 return true 19733 } 19734 } 19735 func rewriteValue386_Op386SUBLload_0(v *Value) bool { 19736 b := v.Block 19737 _ = b 19738 config := b.Func.Config 19739 _ = config 19740 // match: (SUBLload [off1] {sym} val (ADDLconst [off2] base) mem) 19741 // cond: is32Bit(off1+off2) 19742 // result: (SUBLload [off1+off2] {sym} val base mem) 19743 for { 19744 off1 := v.AuxInt 19745 sym := v.Aux 19746 _ = v.Args[2] 19747 val := v.Args[0] 19748 v_1 := v.Args[1] 19749 if v_1.Op != Op386ADDLconst { 19750 break 19751 } 19752 off2 := v_1.AuxInt 19753 base := v_1.Args[0] 19754 mem := v.Args[2] 19755 if !(is32Bit(off1 + off2)) { 19756 break 19757 } 19758 v.reset(Op386SUBLload) 19759 v.AuxInt = off1 + off2 19760 v.Aux = sym 19761 v.AddArg(val) 19762 v.AddArg(base) 19763 v.AddArg(mem) 19764 return true 19765 } 19766 // match: (SUBLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 19767 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 19768 // result: (SUBLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 19769 for { 19770 off1 := v.AuxInt 19771 sym1 := v.Aux 19772 _ = v.Args[2] 19773 val := v.Args[0] 19774 v_1 := v.Args[1] 19775 if v_1.Op != Op386LEAL { 19776 break 19777 } 19778 off2 := v_1.AuxInt 19779 sym2 := v_1.Aux 19780 base := v_1.Args[0] 19781 mem := v.Args[2] 19782 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 19783 break 19784 } 19785 v.reset(Op386SUBLload) 19786 v.AuxInt = off1 + off2 19787 v.Aux = mergeSym(sym1, sym2) 19788 v.AddArg(val) 19789 v.AddArg(base) 19790 v.AddArg(mem) 19791 return true 19792 } 19793 // match: (SUBLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) 19794 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 19795 // result: (SUBLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) 19796 for { 19797 off1 := v.AuxInt 19798 sym1 := v.Aux 19799 _ = v.Args[2] 19800 val := v.Args[0] 19801 v_1 := v.Args[1] 19802 if v_1.Op != Op386LEAL4 { 19803 break 19804 } 19805 off2 := v_1.AuxInt 19806 sym2 := v_1.Aux 19807 _ = v_1.Args[1] 19808 ptr := v_1.Args[0] 19809 idx := v_1.Args[1] 19810 mem := v.Args[2] 19811 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 19812 break 19813 } 19814 v.reset(Op386SUBLloadidx4) 19815 v.AuxInt = off1 + off2 19816 v.Aux = mergeSym(sym1, sym2) 19817 v.AddArg(val) 19818 v.AddArg(ptr) 19819 v.AddArg(idx) 19820 v.AddArg(mem) 19821 return true 19822 } 19823 return false 19824 } 19825 func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { 19826 b := v.Block 19827 _ = b 19828 config := b.Func.Config 19829 _ = config 19830 // match: (SUBLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) 19831 // cond: is32Bit(off1+off2) 19832 // result: (SUBLloadidx4 [off1+off2] {sym} val base idx mem) 19833 for { 19834 off1 := v.AuxInt 19835 sym := v.Aux 19836 _ = v.Args[3] 19837 val := v.Args[0] 19838 v_1 := v.Args[1] 19839 if v_1.Op != Op386ADDLconst { 19840 break 19841 } 19842 off2 := v_1.AuxInt 19843 base := v_1.Args[0] 19844 idx := v.Args[2] 19845 mem := v.Args[3] 19846 if !(is32Bit(off1 + off2)) { 19847 break 19848 } 19849 v.reset(Op386SUBLloadidx4) 19850 v.AuxInt = off1 + off2 19851 v.Aux = sym 19852 v.AddArg(val) 19853 v.AddArg(base) 19854 v.AddArg(idx) 19855 v.AddArg(mem) 19856 return true 19857 } 19858 // match: (SUBLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) 19859 // cond: is32Bit(off1+off2*4) 19860 // result: (SUBLloadidx4 [off1+off2*4] {sym} val base idx mem) 19861 for { 19862 off1 := v.AuxInt 19863 sym := v.Aux 19864 _ = v.Args[3] 19865 val := v.Args[0] 19866 base := v.Args[1] 19867 v_2 := v.Args[2] 19868 if v_2.Op != Op386ADDLconst { 19869 break 19870 } 19871 off2 := v_2.AuxInt 19872 idx := v_2.Args[0] 19873 mem := v.Args[3] 19874 if !(is32Bit(off1 + off2*4)) { 19875 break 19876 } 19877 v.reset(Op386SUBLloadidx4) 19878 v.AuxInt = off1 + off2*4 19879 v.Aux = sym 19880 v.AddArg(val) 19881 v.AddArg(base) 19882 v.AddArg(idx) 19883 v.AddArg(mem) 19884 return true 19885 } 19886 // match: (SUBLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) 19887 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 19888 // result: (SUBLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) 19889 for { 19890 off1 := v.AuxInt 19891 sym1 := v.Aux 19892 _ = v.Args[3] 19893 val := v.Args[0] 19894 v_1 := v.Args[1] 19895 if v_1.Op != Op386LEAL { 19896 break 19897 } 19898 off2 := v_1.AuxInt 19899 sym2 := v_1.Aux 19900 base := v_1.Args[0] 19901 idx := v.Args[2] 19902 mem := v.Args[3] 19903 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 19904 break 19905 } 19906 v.reset(Op386SUBLloadidx4) 19907 v.AuxInt = off1 + off2 19908 v.Aux = mergeSym(sym1, sym2) 19909 v.AddArg(val) 19910 v.AddArg(base) 19911 v.AddArg(idx) 19912 v.AddArg(mem) 19913 return true 19914 } 19915 return false 19916 } 19917 func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { 19918 b := v.Block 19919 _ = b 19920 config := b.Func.Config 19921 _ = config 19922 // match: (SUBLmodify [off1] {sym} (ADDLconst [off2] base) val mem) 19923 // cond: is32Bit(off1+off2) 19924 // result: (SUBLmodify [off1+off2] {sym} base val mem) 19925 for { 19926 off1 := v.AuxInt 19927 sym := v.Aux 19928 _ = v.Args[2] 19929 v_0 := v.Args[0] 19930 if v_0.Op != Op386ADDLconst { 19931 break 19932 } 19933 off2 := v_0.AuxInt 19934 base := v_0.Args[0] 19935 val := v.Args[1] 19936 mem := v.Args[2] 19937 if !(is32Bit(off1 + off2)) { 19938 break 19939 } 19940 v.reset(Op386SUBLmodify) 19941 v.AuxInt = off1 + off2 19942 v.Aux = sym 19943 v.AddArg(base) 19944 v.AddArg(val) 19945 v.AddArg(mem) 19946 return true 19947 } 19948 // match: (SUBLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 19949 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 19950 // result: (SUBLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) 19951 for { 19952 off1 := v.AuxInt 19953 sym1 := v.Aux 19954 _ = v.Args[2] 19955 v_0 := v.Args[0] 19956 if v_0.Op != Op386LEAL { 19957 break 19958 } 19959 off2 := v_0.AuxInt 19960 sym2 := v_0.Aux 19961 base := v_0.Args[0] 19962 val := v.Args[1] 19963 mem := v.Args[2] 19964 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 19965 break 19966 } 19967 v.reset(Op386SUBLmodify) 19968 v.AuxInt = off1 + off2 19969 v.Aux = mergeSym(sym1, sym2) 19970 v.AddArg(base) 19971 v.AddArg(val) 19972 v.AddArg(mem) 19973 return true 19974 } 19975 return false 19976 } 19977 func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { 19978 b := v.Block 19979 _ = b 19980 config := b.Func.Config 19981 _ = config 19982 // match: (SUBLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) 19983 // cond: is32Bit(off1+off2) 19984 // result: (SUBLmodifyidx4 [off1+off2] {sym} base idx val mem) 19985 for { 19986 off1 := v.AuxInt 19987 sym := v.Aux 19988 _ = v.Args[3] 19989 v_0 := v.Args[0] 19990 if v_0.Op != Op386ADDLconst { 19991 break 19992 } 19993 off2 := v_0.AuxInt 19994 base := v_0.Args[0] 19995 idx := v.Args[1] 19996 val := v.Args[2] 19997 mem := v.Args[3] 19998 if !(is32Bit(off1 + off2)) { 19999 break 20000 } 20001 v.reset(Op386SUBLmodifyidx4) 20002 v.AuxInt = off1 + off2 20003 v.Aux = sym 20004 v.AddArg(base) 20005 v.AddArg(idx) 20006 v.AddArg(val) 20007 v.AddArg(mem) 20008 return true 20009 } 20010 // match: (SUBLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) 20011 // cond: is32Bit(off1+off2*4) 20012 // result: (SUBLmodifyidx4 [off1+off2*4] {sym} base idx val mem) 20013 for { 20014 off1 := v.AuxInt 20015 sym := v.Aux 20016 _ = v.Args[3] 20017 base := v.Args[0] 20018 v_1 := v.Args[1] 20019 if v_1.Op != Op386ADDLconst { 20020 break 20021 } 20022 off2 := v_1.AuxInt 20023 idx := v_1.Args[0] 20024 val := v.Args[2] 20025 mem := v.Args[3] 20026 if !(is32Bit(off1 + off2*4)) { 20027 break 20028 } 20029 v.reset(Op386SUBLmodifyidx4) 20030 v.AuxInt = off1 + off2*4 20031 v.Aux = sym 20032 v.AddArg(base) 20033 v.AddArg(idx) 20034 v.AddArg(val) 20035 v.AddArg(mem) 20036 return true 20037 } 20038 // match: (SUBLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) 20039 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20040 // result: (SUBLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) 20041 for { 20042 off1 := v.AuxInt 20043 sym1 := v.Aux 20044 _ = v.Args[3] 20045 v_0 := v.Args[0] 20046 if v_0.Op != Op386LEAL { 20047 break 20048 } 20049 off2 := v_0.AuxInt 20050 sym2 := v_0.Aux 20051 base := v_0.Args[0] 20052 idx := v.Args[1] 20053 val := v.Args[2] 20054 mem := v.Args[3] 20055 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20056 break 20057 } 20058 v.reset(Op386SUBLmodifyidx4) 20059 v.AuxInt = off1 + off2 20060 v.Aux = mergeSym(sym1, sym2) 20061 v.AddArg(base) 20062 v.AddArg(idx) 20063 v.AddArg(val) 20064 v.AddArg(mem) 20065 return true 20066 } 20067 // match: (SUBLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) 20068 // cond: validValAndOff(-c,off) 20069 // result: (ADDLconstmodifyidx4 [makeValAndOff(-c,off)] {sym} ptr idx mem) 20070 for { 20071 off := v.AuxInt 20072 sym := v.Aux 20073 _ = v.Args[3] 20074 ptr := v.Args[0] 20075 idx := v.Args[1] 20076 v_2 := v.Args[2] 20077 if v_2.Op != Op386MOVLconst { 20078 break 20079 } 20080 c := v_2.AuxInt 20081 mem := v.Args[3] 20082 if !(validValAndOff(-c, off)) { 20083 break 20084 } 20085 v.reset(Op386ADDLconstmodifyidx4) 20086 v.AuxInt = makeValAndOff(-c, off) 20087 v.Aux = sym 20088 v.AddArg(ptr) 20089 v.AddArg(idx) 20090 v.AddArg(mem) 20091 return true 20092 } 20093 return false 20094 } 20095 func rewriteValue386_Op386SUBSD_0(v *Value) bool { 20096 b := v.Block 20097 _ = b 20098 config := b.Func.Config 20099 _ = config 20100 // match: (SUBSD x l:(MOVSDload [off] {sym} ptr mem)) 20101 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 20102 // result: (SUBSDload x [off] {sym} ptr mem) 20103 for { 20104 _ = v.Args[1] 20105 x := v.Args[0] 20106 l := v.Args[1] 20107 if l.Op != Op386MOVSDload { 20108 break 20109 } 20110 off := l.AuxInt 20111 sym := l.Aux 20112 _ = l.Args[1] 20113 ptr := l.Args[0] 20114 mem := l.Args[1] 20115 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 20116 break 20117 } 20118 v.reset(Op386SUBSDload) 20119 v.AuxInt = off 20120 v.Aux = sym 20121 v.AddArg(x) 20122 v.AddArg(ptr) 20123 v.AddArg(mem) 20124 return true 20125 } 20126 return false 20127 } 20128 func rewriteValue386_Op386SUBSDload_0(v *Value) bool { 20129 b := v.Block 20130 _ = b 20131 config := b.Func.Config 20132 _ = config 20133 // match: (SUBSDload [off1] {sym} val (ADDLconst [off2] base) mem) 20134 // cond: is32Bit(off1+off2) 20135 // result: (SUBSDload [off1+off2] {sym} val base mem) 20136 for { 20137 off1 := v.AuxInt 20138 sym := v.Aux 20139 _ = v.Args[2] 20140 val := v.Args[0] 20141 v_1 := v.Args[1] 20142 if v_1.Op != Op386ADDLconst { 20143 break 20144 } 20145 off2 := v_1.AuxInt 20146 base := v_1.Args[0] 20147 mem := v.Args[2] 20148 if !(is32Bit(off1 + off2)) { 20149 break 20150 } 20151 v.reset(Op386SUBSDload) 20152 v.AuxInt = off1 + off2 20153 v.Aux = sym 20154 v.AddArg(val) 20155 v.AddArg(base) 20156 v.AddArg(mem) 20157 return true 20158 } 20159 // match: (SUBSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 20160 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20161 // result: (SUBSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 20162 for { 20163 off1 := v.AuxInt 20164 sym1 := v.Aux 20165 _ = v.Args[2] 20166 val := v.Args[0] 20167 v_1 := v.Args[1] 20168 if v_1.Op != Op386LEAL { 20169 break 20170 } 20171 off2 := v_1.AuxInt 20172 sym2 := v_1.Aux 20173 base := v_1.Args[0] 20174 mem := v.Args[2] 20175 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20176 break 20177 } 20178 v.reset(Op386SUBSDload) 20179 v.AuxInt = off1 + off2 20180 v.Aux = mergeSym(sym1, sym2) 20181 v.AddArg(val) 20182 v.AddArg(base) 20183 v.AddArg(mem) 20184 return true 20185 } 20186 return false 20187 } 20188 func rewriteValue386_Op386SUBSS_0(v *Value) bool { 20189 b := v.Block 20190 _ = b 20191 config := b.Func.Config 20192 _ = config 20193 // match: (SUBSS x l:(MOVSSload [off] {sym} ptr mem)) 20194 // cond: canMergeLoad(v, l, x) && !config.use387 && clobber(l) 20195 // result: (SUBSSload x [off] {sym} ptr mem) 20196 for { 20197 _ = v.Args[1] 20198 x := v.Args[0] 20199 l := v.Args[1] 20200 if l.Op != Op386MOVSSload { 20201 break 20202 } 20203 off := l.AuxInt 20204 sym := l.Aux 20205 _ = l.Args[1] 20206 ptr := l.Args[0] 20207 mem := l.Args[1] 20208 if !(canMergeLoad(v, l, x) && !config.use387 && clobber(l)) { 20209 break 20210 } 20211 v.reset(Op386SUBSSload) 20212 v.AuxInt = off 20213 v.Aux = sym 20214 v.AddArg(x) 20215 v.AddArg(ptr) 20216 v.AddArg(mem) 20217 return true 20218 } 20219 return false 20220 } 20221 func rewriteValue386_Op386SUBSSload_0(v *Value) bool { 20222 b := v.Block 20223 _ = b 20224 config := b.Func.Config 20225 _ = config 20226 // match: (SUBSSload [off1] {sym} val (ADDLconst [off2] base) mem) 20227 // cond: is32Bit(off1+off2) 20228 // result: (SUBSSload [off1+off2] {sym} val base mem) 20229 for { 20230 off1 := v.AuxInt 20231 sym := v.Aux 20232 _ = v.Args[2] 20233 val := v.Args[0] 20234 v_1 := v.Args[1] 20235 if v_1.Op != Op386ADDLconst { 20236 break 20237 } 20238 off2 := v_1.AuxInt 20239 base := v_1.Args[0] 20240 mem := v.Args[2] 20241 if !(is32Bit(off1 + off2)) { 20242 break 20243 } 20244 v.reset(Op386SUBSSload) 20245 v.AuxInt = off1 + off2 20246 v.Aux = sym 20247 v.AddArg(val) 20248 v.AddArg(base) 20249 v.AddArg(mem) 20250 return true 20251 } 20252 // match: (SUBSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 20253 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20254 // result: (SUBSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 20255 for { 20256 off1 := v.AuxInt 20257 sym1 := v.Aux 20258 _ = v.Args[2] 20259 val := v.Args[0] 20260 v_1 := v.Args[1] 20261 if v_1.Op != Op386LEAL { 20262 break 20263 } 20264 off2 := v_1.AuxInt 20265 sym2 := v_1.Aux 20266 base := v_1.Args[0] 20267 mem := v.Args[2] 20268 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20269 break 20270 } 20271 v.reset(Op386SUBSSload) 20272 v.AuxInt = off1 + off2 20273 v.Aux = mergeSym(sym1, sym2) 20274 v.AddArg(val) 20275 v.AddArg(base) 20276 v.AddArg(mem) 20277 return true 20278 } 20279 return false 20280 } 20281 func rewriteValue386_Op386XORL_0(v *Value) bool { 20282 // match: (XORL x (MOVLconst [c])) 20283 // cond: 20284 // result: (XORLconst [c] x) 20285 for { 20286 _ = v.Args[1] 20287 x := v.Args[0] 20288 v_1 := v.Args[1] 20289 if v_1.Op != Op386MOVLconst { 20290 break 20291 } 20292 c := v_1.AuxInt 20293 v.reset(Op386XORLconst) 20294 v.AuxInt = c 20295 v.AddArg(x) 20296 return true 20297 } 20298 // match: (XORL (MOVLconst [c]) x) 20299 // cond: 20300 // result: (XORLconst [c] x) 20301 for { 20302 _ = v.Args[1] 20303 v_0 := v.Args[0] 20304 if v_0.Op != Op386MOVLconst { 20305 break 20306 } 20307 c := v_0.AuxInt 20308 x := v.Args[1] 20309 v.reset(Op386XORLconst) 20310 v.AuxInt = c 20311 v.AddArg(x) 20312 return true 20313 } 20314 // match: (XORL (SHLLconst [c] x) (SHRLconst [d] x)) 20315 // cond: d == 32-c 20316 // result: (ROLLconst [c] x) 20317 for { 20318 _ = v.Args[1] 20319 v_0 := v.Args[0] 20320 if v_0.Op != Op386SHLLconst { 20321 break 20322 } 20323 c := v_0.AuxInt 20324 x := v_0.Args[0] 20325 v_1 := v.Args[1] 20326 if v_1.Op != Op386SHRLconst { 20327 break 20328 } 20329 d := v_1.AuxInt 20330 if x != v_1.Args[0] { 20331 break 20332 } 20333 if !(d == 32-c) { 20334 break 20335 } 20336 v.reset(Op386ROLLconst) 20337 v.AuxInt = c 20338 v.AddArg(x) 20339 return true 20340 } 20341 // match: (XORL (SHRLconst [d] x) (SHLLconst [c] x)) 20342 // cond: d == 32-c 20343 // result: (ROLLconst [c] x) 20344 for { 20345 _ = v.Args[1] 20346 v_0 := v.Args[0] 20347 if v_0.Op != Op386SHRLconst { 20348 break 20349 } 20350 d := v_0.AuxInt 20351 x := v_0.Args[0] 20352 v_1 := v.Args[1] 20353 if v_1.Op != Op386SHLLconst { 20354 break 20355 } 20356 c := v_1.AuxInt 20357 if x != v_1.Args[0] { 20358 break 20359 } 20360 if !(d == 32-c) { 20361 break 20362 } 20363 v.reset(Op386ROLLconst) 20364 v.AuxInt = c 20365 v.AddArg(x) 20366 return true 20367 } 20368 // match: (XORL <t> (SHLLconst x [c]) (SHRWconst x [d])) 20369 // cond: c < 16 && d == 16-c && t.Size() == 2 20370 // result: (ROLWconst x [c]) 20371 for { 20372 t := v.Type 20373 _ = v.Args[1] 20374 v_0 := v.Args[0] 20375 if v_0.Op != Op386SHLLconst { 20376 break 20377 } 20378 c := v_0.AuxInt 20379 x := v_0.Args[0] 20380 v_1 := v.Args[1] 20381 if v_1.Op != Op386SHRWconst { 20382 break 20383 } 20384 d := v_1.AuxInt 20385 if x != v_1.Args[0] { 20386 break 20387 } 20388 if !(c < 16 && d == 16-c && t.Size() == 2) { 20389 break 20390 } 20391 v.reset(Op386ROLWconst) 20392 v.AuxInt = c 20393 v.AddArg(x) 20394 return true 20395 } 20396 // match: (XORL <t> (SHRWconst x [d]) (SHLLconst x [c])) 20397 // cond: c < 16 && d == 16-c && t.Size() == 2 20398 // result: (ROLWconst x [c]) 20399 for { 20400 t := v.Type 20401 _ = v.Args[1] 20402 v_0 := v.Args[0] 20403 if v_0.Op != Op386SHRWconst { 20404 break 20405 } 20406 d := v_0.AuxInt 20407 x := v_0.Args[0] 20408 v_1 := v.Args[1] 20409 if v_1.Op != Op386SHLLconst { 20410 break 20411 } 20412 c := v_1.AuxInt 20413 if x != v_1.Args[0] { 20414 break 20415 } 20416 if !(c < 16 && d == 16-c && t.Size() == 2) { 20417 break 20418 } 20419 v.reset(Op386ROLWconst) 20420 v.AuxInt = c 20421 v.AddArg(x) 20422 return true 20423 } 20424 // match: (XORL <t> (SHLLconst x [c]) (SHRBconst x [d])) 20425 // cond: c < 8 && d == 8-c && t.Size() == 1 20426 // result: (ROLBconst x [c]) 20427 for { 20428 t := v.Type 20429 _ = v.Args[1] 20430 v_0 := v.Args[0] 20431 if v_0.Op != Op386SHLLconst { 20432 break 20433 } 20434 c := v_0.AuxInt 20435 x := v_0.Args[0] 20436 v_1 := v.Args[1] 20437 if v_1.Op != Op386SHRBconst { 20438 break 20439 } 20440 d := v_1.AuxInt 20441 if x != v_1.Args[0] { 20442 break 20443 } 20444 if !(c < 8 && d == 8-c && t.Size() == 1) { 20445 break 20446 } 20447 v.reset(Op386ROLBconst) 20448 v.AuxInt = c 20449 v.AddArg(x) 20450 return true 20451 } 20452 // match: (XORL <t> (SHRBconst x [d]) (SHLLconst x [c])) 20453 // cond: c < 8 && d == 8-c && t.Size() == 1 20454 // result: (ROLBconst x [c]) 20455 for { 20456 t := v.Type 20457 _ = v.Args[1] 20458 v_0 := v.Args[0] 20459 if v_0.Op != Op386SHRBconst { 20460 break 20461 } 20462 d := v_0.AuxInt 20463 x := v_0.Args[0] 20464 v_1 := v.Args[1] 20465 if v_1.Op != Op386SHLLconst { 20466 break 20467 } 20468 c := v_1.AuxInt 20469 if x != v_1.Args[0] { 20470 break 20471 } 20472 if !(c < 8 && d == 8-c && t.Size() == 1) { 20473 break 20474 } 20475 v.reset(Op386ROLBconst) 20476 v.AuxInt = c 20477 v.AddArg(x) 20478 return true 20479 } 20480 // match: (XORL x l:(MOVLload [off] {sym} ptr mem)) 20481 // cond: canMergeLoad(v, l, x) && clobber(l) 20482 // result: (XORLload x [off] {sym} ptr mem) 20483 for { 20484 _ = v.Args[1] 20485 x := v.Args[0] 20486 l := v.Args[1] 20487 if l.Op != Op386MOVLload { 20488 break 20489 } 20490 off := l.AuxInt 20491 sym := l.Aux 20492 _ = l.Args[1] 20493 ptr := l.Args[0] 20494 mem := l.Args[1] 20495 if !(canMergeLoad(v, l, x) && clobber(l)) { 20496 break 20497 } 20498 v.reset(Op386XORLload) 20499 v.AuxInt = off 20500 v.Aux = sym 20501 v.AddArg(x) 20502 v.AddArg(ptr) 20503 v.AddArg(mem) 20504 return true 20505 } 20506 // match: (XORL l:(MOVLload [off] {sym} ptr mem) x) 20507 // cond: canMergeLoad(v, l, x) && clobber(l) 20508 // result: (XORLload x [off] {sym} ptr mem) 20509 for { 20510 _ = v.Args[1] 20511 l := v.Args[0] 20512 if l.Op != Op386MOVLload { 20513 break 20514 } 20515 off := l.AuxInt 20516 sym := l.Aux 20517 _ = l.Args[1] 20518 ptr := l.Args[0] 20519 mem := l.Args[1] 20520 x := v.Args[1] 20521 if !(canMergeLoad(v, l, x) && clobber(l)) { 20522 break 20523 } 20524 v.reset(Op386XORLload) 20525 v.AuxInt = off 20526 v.Aux = sym 20527 v.AddArg(x) 20528 v.AddArg(ptr) 20529 v.AddArg(mem) 20530 return true 20531 } 20532 return false 20533 } 20534 func rewriteValue386_Op386XORL_10(v *Value) bool { 20535 // match: (XORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) 20536 // cond: canMergeLoad(v, l, x) && clobber(l) 20537 // result: (XORLloadidx4 x [off] {sym} ptr idx mem) 20538 for { 20539 _ = v.Args[1] 20540 x := v.Args[0] 20541 l := v.Args[1] 20542 if l.Op != Op386MOVLloadidx4 { 20543 break 20544 } 20545 off := l.AuxInt 20546 sym := l.Aux 20547 _ = l.Args[2] 20548 ptr := l.Args[0] 20549 idx := l.Args[1] 20550 mem := l.Args[2] 20551 if !(canMergeLoad(v, l, x) && clobber(l)) { 20552 break 20553 } 20554 v.reset(Op386XORLloadidx4) 20555 v.AuxInt = off 20556 v.Aux = sym 20557 v.AddArg(x) 20558 v.AddArg(ptr) 20559 v.AddArg(idx) 20560 v.AddArg(mem) 20561 return true 20562 } 20563 // match: (XORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) 20564 // cond: canMergeLoad(v, l, x) && clobber(l) 20565 // result: (XORLloadidx4 x [off] {sym} ptr idx mem) 20566 for { 20567 _ = v.Args[1] 20568 l := v.Args[0] 20569 if l.Op != Op386MOVLloadidx4 { 20570 break 20571 } 20572 off := l.AuxInt 20573 sym := l.Aux 20574 _ = l.Args[2] 20575 ptr := l.Args[0] 20576 idx := l.Args[1] 20577 mem := l.Args[2] 20578 x := v.Args[1] 20579 if !(canMergeLoad(v, l, x) && clobber(l)) { 20580 break 20581 } 20582 v.reset(Op386XORLloadidx4) 20583 v.AuxInt = off 20584 v.Aux = sym 20585 v.AddArg(x) 20586 v.AddArg(ptr) 20587 v.AddArg(idx) 20588 v.AddArg(mem) 20589 return true 20590 } 20591 // match: (XORL x x) 20592 // cond: 20593 // result: (MOVLconst [0]) 20594 for { 20595 _ = v.Args[1] 20596 x := v.Args[0] 20597 if x != v.Args[1] { 20598 break 20599 } 20600 v.reset(Op386MOVLconst) 20601 v.AuxInt = 0 20602 return true 20603 } 20604 return false 20605 } 20606 func rewriteValue386_Op386XORLconst_0(v *Value) bool { 20607 // match: (XORLconst [c] (XORLconst [d] x)) 20608 // cond: 20609 // result: (XORLconst [c ^ d] x) 20610 for { 20611 c := v.AuxInt 20612 v_0 := v.Args[0] 20613 if v_0.Op != Op386XORLconst { 20614 break 20615 } 20616 d := v_0.AuxInt 20617 x := v_0.Args[0] 20618 v.reset(Op386XORLconst) 20619 v.AuxInt = c ^ d 20620 v.AddArg(x) 20621 return true 20622 } 20623 // match: (XORLconst [c] x) 20624 // cond: int32(c)==0 20625 // result: x 20626 for { 20627 c := v.AuxInt 20628 x := v.Args[0] 20629 if !(int32(c) == 0) { 20630 break 20631 } 20632 v.reset(OpCopy) 20633 v.Type = x.Type 20634 v.AddArg(x) 20635 return true 20636 } 20637 // match: (XORLconst [c] (MOVLconst [d])) 20638 // cond: 20639 // result: (MOVLconst [c^d]) 20640 for { 20641 c := v.AuxInt 20642 v_0 := v.Args[0] 20643 if v_0.Op != Op386MOVLconst { 20644 break 20645 } 20646 d := v_0.AuxInt 20647 v.reset(Op386MOVLconst) 20648 v.AuxInt = c ^ d 20649 return true 20650 } 20651 return false 20652 } 20653 func rewriteValue386_Op386XORLconstmodify_0(v *Value) bool { 20654 b := v.Block 20655 _ = b 20656 config := b.Func.Config 20657 _ = config 20658 // match: (XORLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) 20659 // cond: ValAndOff(valoff1).canAdd(off2) 20660 // result: (XORLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) 20661 for { 20662 valoff1 := v.AuxInt 20663 sym := v.Aux 20664 _ = v.Args[1] 20665 v_0 := v.Args[0] 20666 if v_0.Op != Op386ADDLconst { 20667 break 20668 } 20669 off2 := v_0.AuxInt 20670 base := v_0.Args[0] 20671 mem := v.Args[1] 20672 if !(ValAndOff(valoff1).canAdd(off2)) { 20673 break 20674 } 20675 v.reset(Op386XORLconstmodify) 20676 v.AuxInt = ValAndOff(valoff1).add(off2) 20677 v.Aux = sym 20678 v.AddArg(base) 20679 v.AddArg(mem) 20680 return true 20681 } 20682 // match: (XORLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) 20683 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20684 // result: (XORLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) 20685 for { 20686 valoff1 := v.AuxInt 20687 sym1 := v.Aux 20688 _ = v.Args[1] 20689 v_0 := v.Args[0] 20690 if v_0.Op != Op386LEAL { 20691 break 20692 } 20693 off2 := v_0.AuxInt 20694 sym2 := v_0.Aux 20695 base := v_0.Args[0] 20696 mem := v.Args[1] 20697 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20698 break 20699 } 20700 v.reset(Op386XORLconstmodify) 20701 v.AuxInt = ValAndOff(valoff1).add(off2) 20702 v.Aux = mergeSym(sym1, sym2) 20703 v.AddArg(base) 20704 v.AddArg(mem) 20705 return true 20706 } 20707 return false 20708 } 20709 func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { 20710 b := v.Block 20711 _ = b 20712 config := b.Func.Config 20713 _ = config 20714 // match: (XORLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) 20715 // cond: ValAndOff(valoff1).canAdd(off2) 20716 // result: (XORLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) 20717 for { 20718 valoff1 := v.AuxInt 20719 sym := v.Aux 20720 _ = v.Args[2] 20721 v_0 := v.Args[0] 20722 if v_0.Op != Op386ADDLconst { 20723 break 20724 } 20725 off2 := v_0.AuxInt 20726 base := v_0.Args[0] 20727 idx := v.Args[1] 20728 mem := v.Args[2] 20729 if !(ValAndOff(valoff1).canAdd(off2)) { 20730 break 20731 } 20732 v.reset(Op386XORLconstmodifyidx4) 20733 v.AuxInt = ValAndOff(valoff1).add(off2) 20734 v.Aux = sym 20735 v.AddArg(base) 20736 v.AddArg(idx) 20737 v.AddArg(mem) 20738 return true 20739 } 20740 // match: (XORLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) 20741 // cond: ValAndOff(valoff1).canAdd(off2*4) 20742 // result: (XORLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) 20743 for { 20744 valoff1 := v.AuxInt 20745 sym := v.Aux 20746 _ = v.Args[2] 20747 base := v.Args[0] 20748 v_1 := v.Args[1] 20749 if v_1.Op != Op386ADDLconst { 20750 break 20751 } 20752 off2 := v_1.AuxInt 20753 idx := v_1.Args[0] 20754 mem := v.Args[2] 20755 if !(ValAndOff(valoff1).canAdd(off2 * 4)) { 20756 break 20757 } 20758 v.reset(Op386XORLconstmodifyidx4) 20759 v.AuxInt = ValAndOff(valoff1).add(off2 * 4) 20760 v.Aux = sym 20761 v.AddArg(base) 20762 v.AddArg(idx) 20763 v.AddArg(mem) 20764 return true 20765 } 20766 // match: (XORLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) 20767 // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20768 // result: (XORLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) 20769 for { 20770 valoff1 := v.AuxInt 20771 sym1 := v.Aux 20772 _ = v.Args[2] 20773 v_0 := v.Args[0] 20774 if v_0.Op != Op386LEAL { 20775 break 20776 } 20777 off2 := v_0.AuxInt 20778 sym2 := v_0.Aux 20779 base := v_0.Args[0] 20780 idx := v.Args[1] 20781 mem := v.Args[2] 20782 if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20783 break 20784 } 20785 v.reset(Op386XORLconstmodifyidx4) 20786 v.AuxInt = ValAndOff(valoff1).add(off2) 20787 v.Aux = mergeSym(sym1, sym2) 20788 v.AddArg(base) 20789 v.AddArg(idx) 20790 v.AddArg(mem) 20791 return true 20792 } 20793 return false 20794 } 20795 func rewriteValue386_Op386XORLload_0(v *Value) bool { 20796 b := v.Block 20797 _ = b 20798 config := b.Func.Config 20799 _ = config 20800 // match: (XORLload [off1] {sym} val (ADDLconst [off2] base) mem) 20801 // cond: is32Bit(off1+off2) 20802 // result: (XORLload [off1+off2] {sym} val base mem) 20803 for { 20804 off1 := v.AuxInt 20805 sym := v.Aux 20806 _ = v.Args[2] 20807 val := v.Args[0] 20808 v_1 := v.Args[1] 20809 if v_1.Op != Op386ADDLconst { 20810 break 20811 } 20812 off2 := v_1.AuxInt 20813 base := v_1.Args[0] 20814 mem := v.Args[2] 20815 if !(is32Bit(off1 + off2)) { 20816 break 20817 } 20818 v.reset(Op386XORLload) 20819 v.AuxInt = off1 + off2 20820 v.Aux = sym 20821 v.AddArg(val) 20822 v.AddArg(base) 20823 v.AddArg(mem) 20824 return true 20825 } 20826 // match: (XORLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) 20827 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20828 // result: (XORLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) 20829 for { 20830 off1 := v.AuxInt 20831 sym1 := v.Aux 20832 _ = v.Args[2] 20833 val := v.Args[0] 20834 v_1 := v.Args[1] 20835 if v_1.Op != Op386LEAL { 20836 break 20837 } 20838 off2 := v_1.AuxInt 20839 sym2 := v_1.Aux 20840 base := v_1.Args[0] 20841 mem := v.Args[2] 20842 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20843 break 20844 } 20845 v.reset(Op386XORLload) 20846 v.AuxInt = off1 + off2 20847 v.Aux = mergeSym(sym1, sym2) 20848 v.AddArg(val) 20849 v.AddArg(base) 20850 v.AddArg(mem) 20851 return true 20852 } 20853 // match: (XORLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) 20854 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 20855 // result: (XORLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) 20856 for { 20857 off1 := v.AuxInt 20858 sym1 := v.Aux 20859 _ = v.Args[2] 20860 val := v.Args[0] 20861 v_1 := v.Args[1] 20862 if v_1.Op != Op386LEAL4 { 20863 break 20864 } 20865 off2 := v_1.AuxInt 20866 sym2 := v_1.Aux 20867 _ = v_1.Args[1] 20868 ptr := v_1.Args[0] 20869 idx := v_1.Args[1] 20870 mem := v.Args[2] 20871 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 20872 break 20873 } 20874 v.reset(Op386XORLloadidx4) 20875 v.AuxInt = off1 + off2 20876 v.Aux = mergeSym(sym1, sym2) 20877 v.AddArg(val) 20878 v.AddArg(ptr) 20879 v.AddArg(idx) 20880 v.AddArg(mem) 20881 return true 20882 } 20883 return false 20884 } 20885 func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { 20886 b := v.Block 20887 _ = b 20888 config := b.Func.Config 20889 _ = config 20890 // match: (XORLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) 20891 // cond: is32Bit(off1+off2) 20892 // result: (XORLloadidx4 [off1+off2] {sym} val base idx mem) 20893 for { 20894 off1 := v.AuxInt 20895 sym := v.Aux 20896 _ = v.Args[3] 20897 val := v.Args[0] 20898 v_1 := v.Args[1] 20899 if v_1.Op != Op386ADDLconst { 20900 break 20901 } 20902 off2 := v_1.AuxInt 20903 base := v_1.Args[0] 20904 idx := v.Args[2] 20905 mem := v.Args[3] 20906 if !(is32Bit(off1 + off2)) { 20907 break 20908 } 20909 v.reset(Op386XORLloadidx4) 20910 v.AuxInt = off1 + off2 20911 v.Aux = sym 20912 v.AddArg(val) 20913 v.AddArg(base) 20914 v.AddArg(idx) 20915 v.AddArg(mem) 20916 return true 20917 } 20918 // match: (XORLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) 20919 // cond: is32Bit(off1+off2*4) 20920 // result: (XORLloadidx4 [off1+off2*4] {sym} val base idx mem) 20921 for { 20922 off1 := v.AuxInt 20923 sym := v.Aux 20924 _ = v.Args[3] 20925 val := v.Args[0] 20926 base := v.Args[1] 20927 v_2 := v.Args[2] 20928 if v_2.Op != Op386ADDLconst { 20929 break 20930 } 20931 off2 := v_2.AuxInt 20932 idx := v_2.Args[0] 20933 mem := v.Args[3] 20934 if !(is32Bit(off1 + off2*4)) { 20935 break 20936 } 20937 v.reset(Op386XORLloadidx4) 20938 v.AuxInt = off1 + off2*4 20939 v.Aux = sym 20940 v.AddArg(val) 20941 v.AddArg(base) 20942 v.AddArg(idx) 20943 v.AddArg(mem) 20944 return true 20945 } 20946 // match: (XORLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) 20947 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 20948 // result: (XORLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) 20949 for { 20950 off1 := v.AuxInt 20951 sym1 := v.Aux 20952 _ = v.Args[3] 20953 val := v.Args[0] 20954 v_1 := v.Args[1] 20955 if v_1.Op != Op386LEAL { 20956 break 20957 } 20958 off2 := v_1.AuxInt 20959 sym2 := v_1.Aux 20960 base := v_1.Args[0] 20961 idx := v.Args[2] 20962 mem := v.Args[3] 20963 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 20964 break 20965 } 20966 v.reset(Op386XORLloadidx4) 20967 v.AuxInt = off1 + off2 20968 v.Aux = mergeSym(sym1, sym2) 20969 v.AddArg(val) 20970 v.AddArg(base) 20971 v.AddArg(idx) 20972 v.AddArg(mem) 20973 return true 20974 } 20975 return false 20976 } 20977 func rewriteValue386_Op386XORLmodify_0(v *Value) bool { 20978 b := v.Block 20979 _ = b 20980 config := b.Func.Config 20981 _ = config 20982 // match: (XORLmodify [off1] {sym} (ADDLconst [off2] base) val mem) 20983 // cond: is32Bit(off1+off2) 20984 // result: (XORLmodify [off1+off2] {sym} base val mem) 20985 for { 20986 off1 := v.AuxInt 20987 sym := v.Aux 20988 _ = v.Args[2] 20989 v_0 := v.Args[0] 20990 if v_0.Op != Op386ADDLconst { 20991 break 20992 } 20993 off2 := v_0.AuxInt 20994 base := v_0.Args[0] 20995 val := v.Args[1] 20996 mem := v.Args[2] 20997 if !(is32Bit(off1 + off2)) { 20998 break 20999 } 21000 v.reset(Op386XORLmodify) 21001 v.AuxInt = off1 + off2 21002 v.Aux = sym 21003 v.AddArg(base) 21004 v.AddArg(val) 21005 v.AddArg(mem) 21006 return true 21007 } 21008 // match: (XORLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) 21009 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 21010 // result: (XORLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) 21011 for { 21012 off1 := v.AuxInt 21013 sym1 := v.Aux 21014 _ = v.Args[2] 21015 v_0 := v.Args[0] 21016 if v_0.Op != Op386LEAL { 21017 break 21018 } 21019 off2 := v_0.AuxInt 21020 sym2 := v_0.Aux 21021 base := v_0.Args[0] 21022 val := v.Args[1] 21023 mem := v.Args[2] 21024 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 21025 break 21026 } 21027 v.reset(Op386XORLmodify) 21028 v.AuxInt = off1 + off2 21029 v.Aux = mergeSym(sym1, sym2) 21030 v.AddArg(base) 21031 v.AddArg(val) 21032 v.AddArg(mem) 21033 return true 21034 } 21035 return false 21036 } 21037 func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { 21038 b := v.Block 21039 _ = b 21040 config := b.Func.Config 21041 _ = config 21042 // match: (XORLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) 21043 // cond: is32Bit(off1+off2) 21044 // result: (XORLmodifyidx4 [off1+off2] {sym} base idx val mem) 21045 for { 21046 off1 := v.AuxInt 21047 sym := v.Aux 21048 _ = v.Args[3] 21049 v_0 := v.Args[0] 21050 if v_0.Op != Op386ADDLconst { 21051 break 21052 } 21053 off2 := v_0.AuxInt 21054 base := v_0.Args[0] 21055 idx := v.Args[1] 21056 val := v.Args[2] 21057 mem := v.Args[3] 21058 if !(is32Bit(off1 + off2)) { 21059 break 21060 } 21061 v.reset(Op386XORLmodifyidx4) 21062 v.AuxInt = off1 + off2 21063 v.Aux = sym 21064 v.AddArg(base) 21065 v.AddArg(idx) 21066 v.AddArg(val) 21067 v.AddArg(mem) 21068 return true 21069 } 21070 // match: (XORLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) 21071 // cond: is32Bit(off1+off2*4) 21072 // result: (XORLmodifyidx4 [off1+off2*4] {sym} base idx val mem) 21073 for { 21074 off1 := v.AuxInt 21075 sym := v.Aux 21076 _ = v.Args[3] 21077 base := v.Args[0] 21078 v_1 := v.Args[1] 21079 if v_1.Op != Op386ADDLconst { 21080 break 21081 } 21082 off2 := v_1.AuxInt 21083 idx := v_1.Args[0] 21084 val := v.Args[2] 21085 mem := v.Args[3] 21086 if !(is32Bit(off1 + off2*4)) { 21087 break 21088 } 21089 v.reset(Op386XORLmodifyidx4) 21090 v.AuxInt = off1 + off2*4 21091 v.Aux = sym 21092 v.AddArg(base) 21093 v.AddArg(idx) 21094 v.AddArg(val) 21095 v.AddArg(mem) 21096 return true 21097 } 21098 // match: (XORLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) 21099 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) 21100 // result: (XORLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) 21101 for { 21102 off1 := v.AuxInt 21103 sym1 := v.Aux 21104 _ = v.Args[3] 21105 v_0 := v.Args[0] 21106 if v_0.Op != Op386LEAL { 21107 break 21108 } 21109 off2 := v_0.AuxInt 21110 sym2 := v_0.Aux 21111 base := v_0.Args[0] 21112 idx := v.Args[1] 21113 val := v.Args[2] 21114 mem := v.Args[3] 21115 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { 21116 break 21117 } 21118 v.reset(Op386XORLmodifyidx4) 21119 v.AuxInt = off1 + off2 21120 v.Aux = mergeSym(sym1, sym2) 21121 v.AddArg(base) 21122 v.AddArg(idx) 21123 v.AddArg(val) 21124 v.AddArg(mem) 21125 return true 21126 } 21127 // match: (XORLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) 21128 // cond: validValAndOff(c,off) 21129 // result: (XORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) 21130 for { 21131 off := v.AuxInt 21132 sym := v.Aux 21133 _ = v.Args[3] 21134 ptr := v.Args[0] 21135 idx := v.Args[1] 21136 v_2 := v.Args[2] 21137 if v_2.Op != Op386MOVLconst { 21138 break 21139 } 21140 c := v_2.AuxInt 21141 mem := v.Args[3] 21142 if !(validValAndOff(c, off)) { 21143 break 21144 } 21145 v.reset(Op386XORLconstmodifyidx4) 21146 v.AuxInt = makeValAndOff(c, off) 21147 v.Aux = sym 21148 v.AddArg(ptr) 21149 v.AddArg(idx) 21150 v.AddArg(mem) 21151 return true 21152 } 21153 return false 21154 } 21155 func rewriteValue386_OpAdd16_0(v *Value) bool { 21156 // match: (Add16 x y) 21157 // cond: 21158 // result: (ADDL x y) 21159 for { 21160 _ = v.Args[1] 21161 x := v.Args[0] 21162 y := v.Args[1] 21163 v.reset(Op386ADDL) 21164 v.AddArg(x) 21165 v.AddArg(y) 21166 return true 21167 } 21168 } 21169 func rewriteValue386_OpAdd32_0(v *Value) bool { 21170 // match: (Add32 x y) 21171 // cond: 21172 // result: (ADDL x y) 21173 for { 21174 _ = v.Args[1] 21175 x := v.Args[0] 21176 y := v.Args[1] 21177 v.reset(Op386ADDL) 21178 v.AddArg(x) 21179 v.AddArg(y) 21180 return true 21181 } 21182 } 21183 func rewriteValue386_OpAdd32F_0(v *Value) bool { 21184 // match: (Add32F x y) 21185 // cond: 21186 // result: (ADDSS x y) 21187 for { 21188 _ = v.Args[1] 21189 x := v.Args[0] 21190 y := v.Args[1] 21191 v.reset(Op386ADDSS) 21192 v.AddArg(x) 21193 v.AddArg(y) 21194 return true 21195 } 21196 } 21197 func rewriteValue386_OpAdd32carry_0(v *Value) bool { 21198 // match: (Add32carry x y) 21199 // cond: 21200 // result: (ADDLcarry x y) 21201 for { 21202 _ = v.Args[1] 21203 x := v.Args[0] 21204 y := v.Args[1] 21205 v.reset(Op386ADDLcarry) 21206 v.AddArg(x) 21207 v.AddArg(y) 21208 return true 21209 } 21210 } 21211 func rewriteValue386_OpAdd32withcarry_0(v *Value) bool { 21212 // match: (Add32withcarry x y c) 21213 // cond: 21214 // result: (ADCL x y c) 21215 for { 21216 _ = v.Args[2] 21217 x := v.Args[0] 21218 y := v.Args[1] 21219 c := v.Args[2] 21220 v.reset(Op386ADCL) 21221 v.AddArg(x) 21222 v.AddArg(y) 21223 v.AddArg(c) 21224 return true 21225 } 21226 } 21227 func rewriteValue386_OpAdd64F_0(v *Value) bool { 21228 // match: (Add64F x y) 21229 // cond: 21230 // result: (ADDSD x y) 21231 for { 21232 _ = v.Args[1] 21233 x := v.Args[0] 21234 y := v.Args[1] 21235 v.reset(Op386ADDSD) 21236 v.AddArg(x) 21237 v.AddArg(y) 21238 return true 21239 } 21240 } 21241 func rewriteValue386_OpAdd8_0(v *Value) bool { 21242 // match: (Add8 x y) 21243 // cond: 21244 // result: (ADDL x y) 21245 for { 21246 _ = v.Args[1] 21247 x := v.Args[0] 21248 y := v.Args[1] 21249 v.reset(Op386ADDL) 21250 v.AddArg(x) 21251 v.AddArg(y) 21252 return true 21253 } 21254 } 21255 func rewriteValue386_OpAddPtr_0(v *Value) bool { 21256 // match: (AddPtr x y) 21257 // cond: 21258 // result: (ADDL x y) 21259 for { 21260 _ = v.Args[1] 21261 x := v.Args[0] 21262 y := v.Args[1] 21263 v.reset(Op386ADDL) 21264 v.AddArg(x) 21265 v.AddArg(y) 21266 return true 21267 } 21268 } 21269 func rewriteValue386_OpAddr_0(v *Value) bool { 21270 // match: (Addr {sym} base) 21271 // cond: 21272 // result: (LEAL {sym} base) 21273 for { 21274 sym := v.Aux 21275 base := v.Args[0] 21276 v.reset(Op386LEAL) 21277 v.Aux = sym 21278 v.AddArg(base) 21279 return true 21280 } 21281 } 21282 func rewriteValue386_OpAnd16_0(v *Value) bool { 21283 // match: (And16 x y) 21284 // cond: 21285 // result: (ANDL x y) 21286 for { 21287 _ = v.Args[1] 21288 x := v.Args[0] 21289 y := v.Args[1] 21290 v.reset(Op386ANDL) 21291 v.AddArg(x) 21292 v.AddArg(y) 21293 return true 21294 } 21295 } 21296 func rewriteValue386_OpAnd32_0(v *Value) bool { 21297 // match: (And32 x y) 21298 // cond: 21299 // result: (ANDL x y) 21300 for { 21301 _ = v.Args[1] 21302 x := v.Args[0] 21303 y := v.Args[1] 21304 v.reset(Op386ANDL) 21305 v.AddArg(x) 21306 v.AddArg(y) 21307 return true 21308 } 21309 } 21310 func rewriteValue386_OpAnd8_0(v *Value) bool { 21311 // match: (And8 x y) 21312 // cond: 21313 // result: (ANDL x y) 21314 for { 21315 _ = v.Args[1] 21316 x := v.Args[0] 21317 y := v.Args[1] 21318 v.reset(Op386ANDL) 21319 v.AddArg(x) 21320 v.AddArg(y) 21321 return true 21322 } 21323 } 21324 func rewriteValue386_OpAndB_0(v *Value) bool { 21325 // match: (AndB x y) 21326 // cond: 21327 // result: (ANDL x y) 21328 for { 21329 _ = v.Args[1] 21330 x := v.Args[0] 21331 y := v.Args[1] 21332 v.reset(Op386ANDL) 21333 v.AddArg(x) 21334 v.AddArg(y) 21335 return true 21336 } 21337 } 21338 func rewriteValue386_OpAvg32u_0(v *Value) bool { 21339 // match: (Avg32u x y) 21340 // cond: 21341 // result: (AVGLU x y) 21342 for { 21343 _ = v.Args[1] 21344 x := v.Args[0] 21345 y := v.Args[1] 21346 v.reset(Op386AVGLU) 21347 v.AddArg(x) 21348 v.AddArg(y) 21349 return true 21350 } 21351 } 21352 func rewriteValue386_OpBswap32_0(v *Value) bool { 21353 // match: (Bswap32 x) 21354 // cond: 21355 // result: (BSWAPL x) 21356 for { 21357 x := v.Args[0] 21358 v.reset(Op386BSWAPL) 21359 v.AddArg(x) 21360 return true 21361 } 21362 } 21363 func rewriteValue386_OpClosureCall_0(v *Value) bool { 21364 // match: (ClosureCall [argwid] entry closure mem) 21365 // cond: 21366 // result: (CALLclosure [argwid] entry closure mem) 21367 for { 21368 argwid := v.AuxInt 21369 _ = v.Args[2] 21370 entry := v.Args[0] 21371 closure := v.Args[1] 21372 mem := v.Args[2] 21373 v.reset(Op386CALLclosure) 21374 v.AuxInt = argwid 21375 v.AddArg(entry) 21376 v.AddArg(closure) 21377 v.AddArg(mem) 21378 return true 21379 } 21380 } 21381 func rewriteValue386_OpCom16_0(v *Value) bool { 21382 // match: (Com16 x) 21383 // cond: 21384 // result: (NOTL x) 21385 for { 21386 x := v.Args[0] 21387 v.reset(Op386NOTL) 21388 v.AddArg(x) 21389 return true 21390 } 21391 } 21392 func rewriteValue386_OpCom32_0(v *Value) bool { 21393 // match: (Com32 x) 21394 // cond: 21395 // result: (NOTL x) 21396 for { 21397 x := v.Args[0] 21398 v.reset(Op386NOTL) 21399 v.AddArg(x) 21400 return true 21401 } 21402 } 21403 func rewriteValue386_OpCom8_0(v *Value) bool { 21404 // match: (Com8 x) 21405 // cond: 21406 // result: (NOTL x) 21407 for { 21408 x := v.Args[0] 21409 v.reset(Op386NOTL) 21410 v.AddArg(x) 21411 return true 21412 } 21413 } 21414 func rewriteValue386_OpConst16_0(v *Value) bool { 21415 // match: (Const16 [val]) 21416 // cond: 21417 // result: (MOVLconst [val]) 21418 for { 21419 val := v.AuxInt 21420 v.reset(Op386MOVLconst) 21421 v.AuxInt = val 21422 return true 21423 } 21424 } 21425 func rewriteValue386_OpConst32_0(v *Value) bool { 21426 // match: (Const32 [val]) 21427 // cond: 21428 // result: (MOVLconst [val]) 21429 for { 21430 val := v.AuxInt 21431 v.reset(Op386MOVLconst) 21432 v.AuxInt = val 21433 return true 21434 } 21435 } 21436 func rewriteValue386_OpConst32F_0(v *Value) bool { 21437 // match: (Const32F [val]) 21438 // cond: 21439 // result: (MOVSSconst [val]) 21440 for { 21441 val := v.AuxInt 21442 v.reset(Op386MOVSSconst) 21443 v.AuxInt = val 21444 return true 21445 } 21446 } 21447 func rewriteValue386_OpConst64F_0(v *Value) bool { 21448 // match: (Const64F [val]) 21449 // cond: 21450 // result: (MOVSDconst [val]) 21451 for { 21452 val := v.AuxInt 21453 v.reset(Op386MOVSDconst) 21454 v.AuxInt = val 21455 return true 21456 } 21457 } 21458 func rewriteValue386_OpConst8_0(v *Value) bool { 21459 // match: (Const8 [val]) 21460 // cond: 21461 // result: (MOVLconst [val]) 21462 for { 21463 val := v.AuxInt 21464 v.reset(Op386MOVLconst) 21465 v.AuxInt = val 21466 return true 21467 } 21468 } 21469 func rewriteValue386_OpConstBool_0(v *Value) bool { 21470 // match: (ConstBool [b]) 21471 // cond: 21472 // result: (MOVLconst [b]) 21473 for { 21474 b := v.AuxInt 21475 v.reset(Op386MOVLconst) 21476 v.AuxInt = b 21477 return true 21478 } 21479 } 21480 func rewriteValue386_OpConstNil_0(v *Value) bool { 21481 // match: (ConstNil) 21482 // cond: 21483 // result: (MOVLconst [0]) 21484 for { 21485 v.reset(Op386MOVLconst) 21486 v.AuxInt = 0 21487 return true 21488 } 21489 } 21490 func rewriteValue386_OpCvt32Fto32_0(v *Value) bool { 21491 // match: (Cvt32Fto32 x) 21492 // cond: 21493 // result: (CVTTSS2SL x) 21494 for { 21495 x := v.Args[0] 21496 v.reset(Op386CVTTSS2SL) 21497 v.AddArg(x) 21498 return true 21499 } 21500 } 21501 func rewriteValue386_OpCvt32Fto64F_0(v *Value) bool { 21502 // match: (Cvt32Fto64F x) 21503 // cond: 21504 // result: (CVTSS2SD x) 21505 for { 21506 x := v.Args[0] 21507 v.reset(Op386CVTSS2SD) 21508 v.AddArg(x) 21509 return true 21510 } 21511 } 21512 func rewriteValue386_OpCvt32to32F_0(v *Value) bool { 21513 // match: (Cvt32to32F x) 21514 // cond: 21515 // result: (CVTSL2SS x) 21516 for { 21517 x := v.Args[0] 21518 v.reset(Op386CVTSL2SS) 21519 v.AddArg(x) 21520 return true 21521 } 21522 } 21523 func rewriteValue386_OpCvt32to64F_0(v *Value) bool { 21524 // match: (Cvt32to64F x) 21525 // cond: 21526 // result: (CVTSL2SD x) 21527 for { 21528 x := v.Args[0] 21529 v.reset(Op386CVTSL2SD) 21530 v.AddArg(x) 21531 return true 21532 } 21533 } 21534 func rewriteValue386_OpCvt64Fto32_0(v *Value) bool { 21535 // match: (Cvt64Fto32 x) 21536 // cond: 21537 // result: (CVTTSD2SL x) 21538 for { 21539 x := v.Args[0] 21540 v.reset(Op386CVTTSD2SL) 21541 v.AddArg(x) 21542 return true 21543 } 21544 } 21545 func rewriteValue386_OpCvt64Fto32F_0(v *Value) bool { 21546 // match: (Cvt64Fto32F x) 21547 // cond: 21548 // result: (CVTSD2SS x) 21549 for { 21550 x := v.Args[0] 21551 v.reset(Op386CVTSD2SS) 21552 v.AddArg(x) 21553 return true 21554 } 21555 } 21556 func rewriteValue386_OpDiv16_0(v *Value) bool { 21557 // match: (Div16 [a] x y) 21558 // cond: 21559 // result: (DIVW [a] x y) 21560 for { 21561 a := v.AuxInt 21562 _ = v.Args[1] 21563 x := v.Args[0] 21564 y := v.Args[1] 21565 v.reset(Op386DIVW) 21566 v.AuxInt = a 21567 v.AddArg(x) 21568 v.AddArg(y) 21569 return true 21570 } 21571 } 21572 func rewriteValue386_OpDiv16u_0(v *Value) bool { 21573 // match: (Div16u x y) 21574 // cond: 21575 // result: (DIVWU x y) 21576 for { 21577 _ = v.Args[1] 21578 x := v.Args[0] 21579 y := v.Args[1] 21580 v.reset(Op386DIVWU) 21581 v.AddArg(x) 21582 v.AddArg(y) 21583 return true 21584 } 21585 } 21586 func rewriteValue386_OpDiv32_0(v *Value) bool { 21587 // match: (Div32 [a] x y) 21588 // cond: 21589 // result: (DIVL [a] x y) 21590 for { 21591 a := v.AuxInt 21592 _ = v.Args[1] 21593 x := v.Args[0] 21594 y := v.Args[1] 21595 v.reset(Op386DIVL) 21596 v.AuxInt = a 21597 v.AddArg(x) 21598 v.AddArg(y) 21599 return true 21600 } 21601 } 21602 func rewriteValue386_OpDiv32F_0(v *Value) bool { 21603 // match: (Div32F x y) 21604 // cond: 21605 // result: (DIVSS x y) 21606 for { 21607 _ = v.Args[1] 21608 x := v.Args[0] 21609 y := v.Args[1] 21610 v.reset(Op386DIVSS) 21611 v.AddArg(x) 21612 v.AddArg(y) 21613 return true 21614 } 21615 } 21616 func rewriteValue386_OpDiv32u_0(v *Value) bool { 21617 // match: (Div32u x y) 21618 // cond: 21619 // result: (DIVLU x y) 21620 for { 21621 _ = v.Args[1] 21622 x := v.Args[0] 21623 y := v.Args[1] 21624 v.reset(Op386DIVLU) 21625 v.AddArg(x) 21626 v.AddArg(y) 21627 return true 21628 } 21629 } 21630 func rewriteValue386_OpDiv64F_0(v *Value) bool { 21631 // match: (Div64F x y) 21632 // cond: 21633 // result: (DIVSD x y) 21634 for { 21635 _ = v.Args[1] 21636 x := v.Args[0] 21637 y := v.Args[1] 21638 v.reset(Op386DIVSD) 21639 v.AddArg(x) 21640 v.AddArg(y) 21641 return true 21642 } 21643 } 21644 func rewriteValue386_OpDiv8_0(v *Value) bool { 21645 b := v.Block 21646 _ = b 21647 typ := &b.Func.Config.Types 21648 _ = typ 21649 // match: (Div8 x y) 21650 // cond: 21651 // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) 21652 for { 21653 _ = v.Args[1] 21654 x := v.Args[0] 21655 y := v.Args[1] 21656 v.reset(Op386DIVW) 21657 v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 21658 v0.AddArg(x) 21659 v.AddArg(v0) 21660 v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 21661 v1.AddArg(y) 21662 v.AddArg(v1) 21663 return true 21664 } 21665 } 21666 func rewriteValue386_OpDiv8u_0(v *Value) bool { 21667 b := v.Block 21668 _ = b 21669 typ := &b.Func.Config.Types 21670 _ = typ 21671 // match: (Div8u x y) 21672 // cond: 21673 // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 21674 for { 21675 _ = v.Args[1] 21676 x := v.Args[0] 21677 y := v.Args[1] 21678 v.reset(Op386DIVWU) 21679 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 21680 v0.AddArg(x) 21681 v.AddArg(v0) 21682 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 21683 v1.AddArg(y) 21684 v.AddArg(v1) 21685 return true 21686 } 21687 } 21688 func rewriteValue386_OpEq16_0(v *Value) bool { 21689 b := v.Block 21690 _ = b 21691 // match: (Eq16 x y) 21692 // cond: 21693 // result: (SETEQ (CMPW x y)) 21694 for { 21695 _ = v.Args[1] 21696 x := v.Args[0] 21697 y := v.Args[1] 21698 v.reset(Op386SETEQ) 21699 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 21700 v0.AddArg(x) 21701 v0.AddArg(y) 21702 v.AddArg(v0) 21703 return true 21704 } 21705 } 21706 func rewriteValue386_OpEq32_0(v *Value) bool { 21707 b := v.Block 21708 _ = b 21709 // match: (Eq32 x y) 21710 // cond: 21711 // result: (SETEQ (CMPL x y)) 21712 for { 21713 _ = v.Args[1] 21714 x := v.Args[0] 21715 y := v.Args[1] 21716 v.reset(Op386SETEQ) 21717 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 21718 v0.AddArg(x) 21719 v0.AddArg(y) 21720 v.AddArg(v0) 21721 return true 21722 } 21723 } 21724 func rewriteValue386_OpEq32F_0(v *Value) bool { 21725 b := v.Block 21726 _ = b 21727 // match: (Eq32F x y) 21728 // cond: 21729 // result: (SETEQF (UCOMISS x y)) 21730 for { 21731 _ = v.Args[1] 21732 x := v.Args[0] 21733 y := v.Args[1] 21734 v.reset(Op386SETEQF) 21735 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 21736 v0.AddArg(x) 21737 v0.AddArg(y) 21738 v.AddArg(v0) 21739 return true 21740 } 21741 } 21742 func rewriteValue386_OpEq64F_0(v *Value) bool { 21743 b := v.Block 21744 _ = b 21745 // match: (Eq64F x y) 21746 // cond: 21747 // result: (SETEQF (UCOMISD x y)) 21748 for { 21749 _ = v.Args[1] 21750 x := v.Args[0] 21751 y := v.Args[1] 21752 v.reset(Op386SETEQF) 21753 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 21754 v0.AddArg(x) 21755 v0.AddArg(y) 21756 v.AddArg(v0) 21757 return true 21758 } 21759 } 21760 func rewriteValue386_OpEq8_0(v *Value) bool { 21761 b := v.Block 21762 _ = b 21763 // match: (Eq8 x y) 21764 // cond: 21765 // result: (SETEQ (CMPB x y)) 21766 for { 21767 _ = v.Args[1] 21768 x := v.Args[0] 21769 y := v.Args[1] 21770 v.reset(Op386SETEQ) 21771 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 21772 v0.AddArg(x) 21773 v0.AddArg(y) 21774 v.AddArg(v0) 21775 return true 21776 } 21777 } 21778 func rewriteValue386_OpEqB_0(v *Value) bool { 21779 b := v.Block 21780 _ = b 21781 // match: (EqB x y) 21782 // cond: 21783 // result: (SETEQ (CMPB x y)) 21784 for { 21785 _ = v.Args[1] 21786 x := v.Args[0] 21787 y := v.Args[1] 21788 v.reset(Op386SETEQ) 21789 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 21790 v0.AddArg(x) 21791 v0.AddArg(y) 21792 v.AddArg(v0) 21793 return true 21794 } 21795 } 21796 func rewriteValue386_OpEqPtr_0(v *Value) bool { 21797 b := v.Block 21798 _ = b 21799 // match: (EqPtr x y) 21800 // cond: 21801 // result: (SETEQ (CMPL x y)) 21802 for { 21803 _ = v.Args[1] 21804 x := v.Args[0] 21805 y := v.Args[1] 21806 v.reset(Op386SETEQ) 21807 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 21808 v0.AddArg(x) 21809 v0.AddArg(y) 21810 v.AddArg(v0) 21811 return true 21812 } 21813 } 21814 func rewriteValue386_OpGeq16_0(v *Value) bool { 21815 b := v.Block 21816 _ = b 21817 // match: (Geq16 x y) 21818 // cond: 21819 // result: (SETGE (CMPW x y)) 21820 for { 21821 _ = v.Args[1] 21822 x := v.Args[0] 21823 y := v.Args[1] 21824 v.reset(Op386SETGE) 21825 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 21826 v0.AddArg(x) 21827 v0.AddArg(y) 21828 v.AddArg(v0) 21829 return true 21830 } 21831 } 21832 func rewriteValue386_OpGeq16U_0(v *Value) bool { 21833 b := v.Block 21834 _ = b 21835 // match: (Geq16U x y) 21836 // cond: 21837 // result: (SETAE (CMPW x y)) 21838 for { 21839 _ = v.Args[1] 21840 x := v.Args[0] 21841 y := v.Args[1] 21842 v.reset(Op386SETAE) 21843 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 21844 v0.AddArg(x) 21845 v0.AddArg(y) 21846 v.AddArg(v0) 21847 return true 21848 } 21849 } 21850 func rewriteValue386_OpGeq32_0(v *Value) bool { 21851 b := v.Block 21852 _ = b 21853 // match: (Geq32 x y) 21854 // cond: 21855 // result: (SETGE (CMPL x y)) 21856 for { 21857 _ = v.Args[1] 21858 x := v.Args[0] 21859 y := v.Args[1] 21860 v.reset(Op386SETGE) 21861 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 21862 v0.AddArg(x) 21863 v0.AddArg(y) 21864 v.AddArg(v0) 21865 return true 21866 } 21867 } 21868 func rewriteValue386_OpGeq32F_0(v *Value) bool { 21869 b := v.Block 21870 _ = b 21871 // match: (Geq32F x y) 21872 // cond: 21873 // result: (SETGEF (UCOMISS x y)) 21874 for { 21875 _ = v.Args[1] 21876 x := v.Args[0] 21877 y := v.Args[1] 21878 v.reset(Op386SETGEF) 21879 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 21880 v0.AddArg(x) 21881 v0.AddArg(y) 21882 v.AddArg(v0) 21883 return true 21884 } 21885 } 21886 func rewriteValue386_OpGeq32U_0(v *Value) bool { 21887 b := v.Block 21888 _ = b 21889 // match: (Geq32U x y) 21890 // cond: 21891 // result: (SETAE (CMPL x y)) 21892 for { 21893 _ = v.Args[1] 21894 x := v.Args[0] 21895 y := v.Args[1] 21896 v.reset(Op386SETAE) 21897 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 21898 v0.AddArg(x) 21899 v0.AddArg(y) 21900 v.AddArg(v0) 21901 return true 21902 } 21903 } 21904 func rewriteValue386_OpGeq64F_0(v *Value) bool { 21905 b := v.Block 21906 _ = b 21907 // match: (Geq64F x y) 21908 // cond: 21909 // result: (SETGEF (UCOMISD x y)) 21910 for { 21911 _ = v.Args[1] 21912 x := v.Args[0] 21913 y := v.Args[1] 21914 v.reset(Op386SETGEF) 21915 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 21916 v0.AddArg(x) 21917 v0.AddArg(y) 21918 v.AddArg(v0) 21919 return true 21920 } 21921 } 21922 func rewriteValue386_OpGeq8_0(v *Value) bool { 21923 b := v.Block 21924 _ = b 21925 // match: (Geq8 x y) 21926 // cond: 21927 // result: (SETGE (CMPB x y)) 21928 for { 21929 _ = v.Args[1] 21930 x := v.Args[0] 21931 y := v.Args[1] 21932 v.reset(Op386SETGE) 21933 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 21934 v0.AddArg(x) 21935 v0.AddArg(y) 21936 v.AddArg(v0) 21937 return true 21938 } 21939 } 21940 func rewriteValue386_OpGeq8U_0(v *Value) bool { 21941 b := v.Block 21942 _ = b 21943 // match: (Geq8U x y) 21944 // cond: 21945 // result: (SETAE (CMPB x y)) 21946 for { 21947 _ = v.Args[1] 21948 x := v.Args[0] 21949 y := v.Args[1] 21950 v.reset(Op386SETAE) 21951 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 21952 v0.AddArg(x) 21953 v0.AddArg(y) 21954 v.AddArg(v0) 21955 return true 21956 } 21957 } 21958 func rewriteValue386_OpGetCallerPC_0(v *Value) bool { 21959 // match: (GetCallerPC) 21960 // cond: 21961 // result: (LoweredGetCallerPC) 21962 for { 21963 v.reset(Op386LoweredGetCallerPC) 21964 return true 21965 } 21966 } 21967 func rewriteValue386_OpGetCallerSP_0(v *Value) bool { 21968 // match: (GetCallerSP) 21969 // cond: 21970 // result: (LoweredGetCallerSP) 21971 for { 21972 v.reset(Op386LoweredGetCallerSP) 21973 return true 21974 } 21975 } 21976 func rewriteValue386_OpGetClosurePtr_0(v *Value) bool { 21977 // match: (GetClosurePtr) 21978 // cond: 21979 // result: (LoweredGetClosurePtr) 21980 for { 21981 v.reset(Op386LoweredGetClosurePtr) 21982 return true 21983 } 21984 } 21985 func rewriteValue386_OpGetG_0(v *Value) bool { 21986 // match: (GetG mem) 21987 // cond: 21988 // result: (LoweredGetG mem) 21989 for { 21990 mem := v.Args[0] 21991 v.reset(Op386LoweredGetG) 21992 v.AddArg(mem) 21993 return true 21994 } 21995 } 21996 func rewriteValue386_OpGreater16_0(v *Value) bool { 21997 b := v.Block 21998 _ = b 21999 // match: (Greater16 x y) 22000 // cond: 22001 // result: (SETG (CMPW x y)) 22002 for { 22003 _ = v.Args[1] 22004 x := v.Args[0] 22005 y := v.Args[1] 22006 v.reset(Op386SETG) 22007 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 22008 v0.AddArg(x) 22009 v0.AddArg(y) 22010 v.AddArg(v0) 22011 return true 22012 } 22013 } 22014 func rewriteValue386_OpGreater16U_0(v *Value) bool { 22015 b := v.Block 22016 _ = b 22017 // match: (Greater16U x y) 22018 // cond: 22019 // result: (SETA (CMPW x y)) 22020 for { 22021 _ = v.Args[1] 22022 x := v.Args[0] 22023 y := v.Args[1] 22024 v.reset(Op386SETA) 22025 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 22026 v0.AddArg(x) 22027 v0.AddArg(y) 22028 v.AddArg(v0) 22029 return true 22030 } 22031 } 22032 func rewriteValue386_OpGreater32_0(v *Value) bool { 22033 b := v.Block 22034 _ = b 22035 // match: (Greater32 x y) 22036 // cond: 22037 // result: (SETG (CMPL x y)) 22038 for { 22039 _ = v.Args[1] 22040 x := v.Args[0] 22041 y := v.Args[1] 22042 v.reset(Op386SETG) 22043 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22044 v0.AddArg(x) 22045 v0.AddArg(y) 22046 v.AddArg(v0) 22047 return true 22048 } 22049 } 22050 func rewriteValue386_OpGreater32F_0(v *Value) bool { 22051 b := v.Block 22052 _ = b 22053 // match: (Greater32F x y) 22054 // cond: 22055 // result: (SETGF (UCOMISS x y)) 22056 for { 22057 _ = v.Args[1] 22058 x := v.Args[0] 22059 y := v.Args[1] 22060 v.reset(Op386SETGF) 22061 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 22062 v0.AddArg(x) 22063 v0.AddArg(y) 22064 v.AddArg(v0) 22065 return true 22066 } 22067 } 22068 func rewriteValue386_OpGreater32U_0(v *Value) bool { 22069 b := v.Block 22070 _ = b 22071 // match: (Greater32U x y) 22072 // cond: 22073 // result: (SETA (CMPL x y)) 22074 for { 22075 _ = v.Args[1] 22076 x := v.Args[0] 22077 y := v.Args[1] 22078 v.reset(Op386SETA) 22079 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22080 v0.AddArg(x) 22081 v0.AddArg(y) 22082 v.AddArg(v0) 22083 return true 22084 } 22085 } 22086 func rewriteValue386_OpGreater64F_0(v *Value) bool { 22087 b := v.Block 22088 _ = b 22089 // match: (Greater64F x y) 22090 // cond: 22091 // result: (SETGF (UCOMISD x y)) 22092 for { 22093 _ = v.Args[1] 22094 x := v.Args[0] 22095 y := v.Args[1] 22096 v.reset(Op386SETGF) 22097 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 22098 v0.AddArg(x) 22099 v0.AddArg(y) 22100 v.AddArg(v0) 22101 return true 22102 } 22103 } 22104 func rewriteValue386_OpGreater8_0(v *Value) bool { 22105 b := v.Block 22106 _ = b 22107 // match: (Greater8 x y) 22108 // cond: 22109 // result: (SETG (CMPB x y)) 22110 for { 22111 _ = v.Args[1] 22112 x := v.Args[0] 22113 y := v.Args[1] 22114 v.reset(Op386SETG) 22115 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 22116 v0.AddArg(x) 22117 v0.AddArg(y) 22118 v.AddArg(v0) 22119 return true 22120 } 22121 } 22122 func rewriteValue386_OpGreater8U_0(v *Value) bool { 22123 b := v.Block 22124 _ = b 22125 // match: (Greater8U x y) 22126 // cond: 22127 // result: (SETA (CMPB x y)) 22128 for { 22129 _ = v.Args[1] 22130 x := v.Args[0] 22131 y := v.Args[1] 22132 v.reset(Op386SETA) 22133 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 22134 v0.AddArg(x) 22135 v0.AddArg(y) 22136 v.AddArg(v0) 22137 return true 22138 } 22139 } 22140 func rewriteValue386_OpHmul32_0(v *Value) bool { 22141 // match: (Hmul32 x y) 22142 // cond: 22143 // result: (HMULL x y) 22144 for { 22145 _ = v.Args[1] 22146 x := v.Args[0] 22147 y := v.Args[1] 22148 v.reset(Op386HMULL) 22149 v.AddArg(x) 22150 v.AddArg(y) 22151 return true 22152 } 22153 } 22154 func rewriteValue386_OpHmul32u_0(v *Value) bool { 22155 // match: (Hmul32u x y) 22156 // cond: 22157 // result: (HMULLU x y) 22158 for { 22159 _ = v.Args[1] 22160 x := v.Args[0] 22161 y := v.Args[1] 22162 v.reset(Op386HMULLU) 22163 v.AddArg(x) 22164 v.AddArg(y) 22165 return true 22166 } 22167 } 22168 func rewriteValue386_OpInterCall_0(v *Value) bool { 22169 // match: (InterCall [argwid] entry mem) 22170 // cond: 22171 // result: (CALLinter [argwid] entry mem) 22172 for { 22173 argwid := v.AuxInt 22174 _ = v.Args[1] 22175 entry := v.Args[0] 22176 mem := v.Args[1] 22177 v.reset(Op386CALLinter) 22178 v.AuxInt = argwid 22179 v.AddArg(entry) 22180 v.AddArg(mem) 22181 return true 22182 } 22183 } 22184 func rewriteValue386_OpIsInBounds_0(v *Value) bool { 22185 b := v.Block 22186 _ = b 22187 // match: (IsInBounds idx len) 22188 // cond: 22189 // result: (SETB (CMPL idx len)) 22190 for { 22191 _ = v.Args[1] 22192 idx := v.Args[0] 22193 len := v.Args[1] 22194 v.reset(Op386SETB) 22195 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22196 v0.AddArg(idx) 22197 v0.AddArg(len) 22198 v.AddArg(v0) 22199 return true 22200 } 22201 } 22202 func rewriteValue386_OpIsNonNil_0(v *Value) bool { 22203 b := v.Block 22204 _ = b 22205 // match: (IsNonNil p) 22206 // cond: 22207 // result: (SETNE (TESTL p p)) 22208 for { 22209 p := v.Args[0] 22210 v.reset(Op386SETNE) 22211 v0 := b.NewValue0(v.Pos, Op386TESTL, types.TypeFlags) 22212 v0.AddArg(p) 22213 v0.AddArg(p) 22214 v.AddArg(v0) 22215 return true 22216 } 22217 } 22218 func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { 22219 b := v.Block 22220 _ = b 22221 // match: (IsSliceInBounds idx len) 22222 // cond: 22223 // result: (SETBE (CMPL idx len)) 22224 for { 22225 _ = v.Args[1] 22226 idx := v.Args[0] 22227 len := v.Args[1] 22228 v.reset(Op386SETBE) 22229 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22230 v0.AddArg(idx) 22231 v0.AddArg(len) 22232 v.AddArg(v0) 22233 return true 22234 } 22235 } 22236 func rewriteValue386_OpLeq16_0(v *Value) bool { 22237 b := v.Block 22238 _ = b 22239 // match: (Leq16 x y) 22240 // cond: 22241 // result: (SETLE (CMPW x y)) 22242 for { 22243 _ = v.Args[1] 22244 x := v.Args[0] 22245 y := v.Args[1] 22246 v.reset(Op386SETLE) 22247 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 22248 v0.AddArg(x) 22249 v0.AddArg(y) 22250 v.AddArg(v0) 22251 return true 22252 } 22253 } 22254 func rewriteValue386_OpLeq16U_0(v *Value) bool { 22255 b := v.Block 22256 _ = b 22257 // match: (Leq16U x y) 22258 // cond: 22259 // result: (SETBE (CMPW x y)) 22260 for { 22261 _ = v.Args[1] 22262 x := v.Args[0] 22263 y := v.Args[1] 22264 v.reset(Op386SETBE) 22265 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 22266 v0.AddArg(x) 22267 v0.AddArg(y) 22268 v.AddArg(v0) 22269 return true 22270 } 22271 } 22272 func rewriteValue386_OpLeq32_0(v *Value) bool { 22273 b := v.Block 22274 _ = b 22275 // match: (Leq32 x y) 22276 // cond: 22277 // result: (SETLE (CMPL x y)) 22278 for { 22279 _ = v.Args[1] 22280 x := v.Args[0] 22281 y := v.Args[1] 22282 v.reset(Op386SETLE) 22283 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22284 v0.AddArg(x) 22285 v0.AddArg(y) 22286 v.AddArg(v0) 22287 return true 22288 } 22289 } 22290 func rewriteValue386_OpLeq32F_0(v *Value) bool { 22291 b := v.Block 22292 _ = b 22293 // match: (Leq32F x y) 22294 // cond: 22295 // result: (SETGEF (UCOMISS y x)) 22296 for { 22297 _ = v.Args[1] 22298 x := v.Args[0] 22299 y := v.Args[1] 22300 v.reset(Op386SETGEF) 22301 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 22302 v0.AddArg(y) 22303 v0.AddArg(x) 22304 v.AddArg(v0) 22305 return true 22306 } 22307 } 22308 func rewriteValue386_OpLeq32U_0(v *Value) bool { 22309 b := v.Block 22310 _ = b 22311 // match: (Leq32U x y) 22312 // cond: 22313 // result: (SETBE (CMPL x y)) 22314 for { 22315 _ = v.Args[1] 22316 x := v.Args[0] 22317 y := v.Args[1] 22318 v.reset(Op386SETBE) 22319 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22320 v0.AddArg(x) 22321 v0.AddArg(y) 22322 v.AddArg(v0) 22323 return true 22324 } 22325 } 22326 func rewriteValue386_OpLeq64F_0(v *Value) bool { 22327 b := v.Block 22328 _ = b 22329 // match: (Leq64F x y) 22330 // cond: 22331 // result: (SETGEF (UCOMISD y x)) 22332 for { 22333 _ = v.Args[1] 22334 x := v.Args[0] 22335 y := v.Args[1] 22336 v.reset(Op386SETGEF) 22337 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 22338 v0.AddArg(y) 22339 v0.AddArg(x) 22340 v.AddArg(v0) 22341 return true 22342 } 22343 } 22344 func rewriteValue386_OpLeq8_0(v *Value) bool { 22345 b := v.Block 22346 _ = b 22347 // match: (Leq8 x y) 22348 // cond: 22349 // result: (SETLE (CMPB x y)) 22350 for { 22351 _ = v.Args[1] 22352 x := v.Args[0] 22353 y := v.Args[1] 22354 v.reset(Op386SETLE) 22355 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 22356 v0.AddArg(x) 22357 v0.AddArg(y) 22358 v.AddArg(v0) 22359 return true 22360 } 22361 } 22362 func rewriteValue386_OpLeq8U_0(v *Value) bool { 22363 b := v.Block 22364 _ = b 22365 // match: (Leq8U x y) 22366 // cond: 22367 // result: (SETBE (CMPB x y)) 22368 for { 22369 _ = v.Args[1] 22370 x := v.Args[0] 22371 y := v.Args[1] 22372 v.reset(Op386SETBE) 22373 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 22374 v0.AddArg(x) 22375 v0.AddArg(y) 22376 v.AddArg(v0) 22377 return true 22378 } 22379 } 22380 func rewriteValue386_OpLess16_0(v *Value) bool { 22381 b := v.Block 22382 _ = b 22383 // match: (Less16 x y) 22384 // cond: 22385 // result: (SETL (CMPW x y)) 22386 for { 22387 _ = v.Args[1] 22388 x := v.Args[0] 22389 y := v.Args[1] 22390 v.reset(Op386SETL) 22391 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 22392 v0.AddArg(x) 22393 v0.AddArg(y) 22394 v.AddArg(v0) 22395 return true 22396 } 22397 } 22398 func rewriteValue386_OpLess16U_0(v *Value) bool { 22399 b := v.Block 22400 _ = b 22401 // match: (Less16U x y) 22402 // cond: 22403 // result: (SETB (CMPW x y)) 22404 for { 22405 _ = v.Args[1] 22406 x := v.Args[0] 22407 y := v.Args[1] 22408 v.reset(Op386SETB) 22409 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 22410 v0.AddArg(x) 22411 v0.AddArg(y) 22412 v.AddArg(v0) 22413 return true 22414 } 22415 } 22416 func rewriteValue386_OpLess32_0(v *Value) bool { 22417 b := v.Block 22418 _ = b 22419 // match: (Less32 x y) 22420 // cond: 22421 // result: (SETL (CMPL x y)) 22422 for { 22423 _ = v.Args[1] 22424 x := v.Args[0] 22425 y := v.Args[1] 22426 v.reset(Op386SETL) 22427 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22428 v0.AddArg(x) 22429 v0.AddArg(y) 22430 v.AddArg(v0) 22431 return true 22432 } 22433 } 22434 func rewriteValue386_OpLess32F_0(v *Value) bool { 22435 b := v.Block 22436 _ = b 22437 // match: (Less32F x y) 22438 // cond: 22439 // result: (SETGF (UCOMISS y x)) 22440 for { 22441 _ = v.Args[1] 22442 x := v.Args[0] 22443 y := v.Args[1] 22444 v.reset(Op386SETGF) 22445 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 22446 v0.AddArg(y) 22447 v0.AddArg(x) 22448 v.AddArg(v0) 22449 return true 22450 } 22451 } 22452 func rewriteValue386_OpLess32U_0(v *Value) bool { 22453 b := v.Block 22454 _ = b 22455 // match: (Less32U x y) 22456 // cond: 22457 // result: (SETB (CMPL x y)) 22458 for { 22459 _ = v.Args[1] 22460 x := v.Args[0] 22461 y := v.Args[1] 22462 v.reset(Op386SETB) 22463 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 22464 v0.AddArg(x) 22465 v0.AddArg(y) 22466 v.AddArg(v0) 22467 return true 22468 } 22469 } 22470 func rewriteValue386_OpLess64F_0(v *Value) bool { 22471 b := v.Block 22472 _ = b 22473 // match: (Less64F x y) 22474 // cond: 22475 // result: (SETGF (UCOMISD y x)) 22476 for { 22477 _ = v.Args[1] 22478 x := v.Args[0] 22479 y := v.Args[1] 22480 v.reset(Op386SETGF) 22481 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 22482 v0.AddArg(y) 22483 v0.AddArg(x) 22484 v.AddArg(v0) 22485 return true 22486 } 22487 } 22488 func rewriteValue386_OpLess8_0(v *Value) bool { 22489 b := v.Block 22490 _ = b 22491 // match: (Less8 x y) 22492 // cond: 22493 // result: (SETL (CMPB x y)) 22494 for { 22495 _ = v.Args[1] 22496 x := v.Args[0] 22497 y := v.Args[1] 22498 v.reset(Op386SETL) 22499 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 22500 v0.AddArg(x) 22501 v0.AddArg(y) 22502 v.AddArg(v0) 22503 return true 22504 } 22505 } 22506 func rewriteValue386_OpLess8U_0(v *Value) bool { 22507 b := v.Block 22508 _ = b 22509 // match: (Less8U x y) 22510 // cond: 22511 // result: (SETB (CMPB x y)) 22512 for { 22513 _ = v.Args[1] 22514 x := v.Args[0] 22515 y := v.Args[1] 22516 v.reset(Op386SETB) 22517 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 22518 v0.AddArg(x) 22519 v0.AddArg(y) 22520 v.AddArg(v0) 22521 return true 22522 } 22523 } 22524 func rewriteValue386_OpLoad_0(v *Value) bool { 22525 // match: (Load <t> ptr mem) 22526 // cond: (is32BitInt(t) || isPtr(t)) 22527 // result: (MOVLload ptr mem) 22528 for { 22529 t := v.Type 22530 _ = v.Args[1] 22531 ptr := v.Args[0] 22532 mem := v.Args[1] 22533 if !(is32BitInt(t) || isPtr(t)) { 22534 break 22535 } 22536 v.reset(Op386MOVLload) 22537 v.AddArg(ptr) 22538 v.AddArg(mem) 22539 return true 22540 } 22541 // match: (Load <t> ptr mem) 22542 // cond: is16BitInt(t) 22543 // result: (MOVWload ptr mem) 22544 for { 22545 t := v.Type 22546 _ = v.Args[1] 22547 ptr := v.Args[0] 22548 mem := v.Args[1] 22549 if !(is16BitInt(t)) { 22550 break 22551 } 22552 v.reset(Op386MOVWload) 22553 v.AddArg(ptr) 22554 v.AddArg(mem) 22555 return true 22556 } 22557 // match: (Load <t> ptr mem) 22558 // cond: (t.IsBoolean() || is8BitInt(t)) 22559 // result: (MOVBload ptr mem) 22560 for { 22561 t := v.Type 22562 _ = v.Args[1] 22563 ptr := v.Args[0] 22564 mem := v.Args[1] 22565 if !(t.IsBoolean() || is8BitInt(t)) { 22566 break 22567 } 22568 v.reset(Op386MOVBload) 22569 v.AddArg(ptr) 22570 v.AddArg(mem) 22571 return true 22572 } 22573 // match: (Load <t> ptr mem) 22574 // cond: is32BitFloat(t) 22575 // result: (MOVSSload ptr mem) 22576 for { 22577 t := v.Type 22578 _ = v.Args[1] 22579 ptr := v.Args[0] 22580 mem := v.Args[1] 22581 if !(is32BitFloat(t)) { 22582 break 22583 } 22584 v.reset(Op386MOVSSload) 22585 v.AddArg(ptr) 22586 v.AddArg(mem) 22587 return true 22588 } 22589 // match: (Load <t> ptr mem) 22590 // cond: is64BitFloat(t) 22591 // result: (MOVSDload ptr mem) 22592 for { 22593 t := v.Type 22594 _ = v.Args[1] 22595 ptr := v.Args[0] 22596 mem := v.Args[1] 22597 if !(is64BitFloat(t)) { 22598 break 22599 } 22600 v.reset(Op386MOVSDload) 22601 v.AddArg(ptr) 22602 v.AddArg(mem) 22603 return true 22604 } 22605 return false 22606 } 22607 func rewriteValue386_OpLocalAddr_0(v *Value) bool { 22608 // match: (LocalAddr {sym} base _) 22609 // cond: 22610 // result: (LEAL {sym} base) 22611 for { 22612 sym := v.Aux 22613 _ = v.Args[1] 22614 base := v.Args[0] 22615 v.reset(Op386LEAL) 22616 v.Aux = sym 22617 v.AddArg(base) 22618 return true 22619 } 22620 } 22621 func rewriteValue386_OpLsh16x16_0(v *Value) bool { 22622 b := v.Block 22623 _ = b 22624 // match: (Lsh16x16 <t> x y) 22625 // cond: 22626 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 22627 for { 22628 t := v.Type 22629 _ = v.Args[1] 22630 x := v.Args[0] 22631 y := v.Args[1] 22632 v.reset(Op386ANDL) 22633 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22634 v0.AddArg(x) 22635 v0.AddArg(y) 22636 v.AddArg(v0) 22637 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22638 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 22639 v2.AuxInt = 32 22640 v2.AddArg(y) 22641 v1.AddArg(v2) 22642 v.AddArg(v1) 22643 return true 22644 } 22645 } 22646 func rewriteValue386_OpLsh16x32_0(v *Value) bool { 22647 b := v.Block 22648 _ = b 22649 // match: (Lsh16x32 <t> x y) 22650 // cond: 22651 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 22652 for { 22653 t := v.Type 22654 _ = v.Args[1] 22655 x := v.Args[0] 22656 y := v.Args[1] 22657 v.reset(Op386ANDL) 22658 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22659 v0.AddArg(x) 22660 v0.AddArg(y) 22661 v.AddArg(v0) 22662 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22663 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 22664 v2.AuxInt = 32 22665 v2.AddArg(y) 22666 v1.AddArg(v2) 22667 v.AddArg(v1) 22668 return true 22669 } 22670 } 22671 func rewriteValue386_OpLsh16x64_0(v *Value) bool { 22672 // match: (Lsh16x64 x (Const64 [c])) 22673 // cond: uint64(c) < 16 22674 // result: (SHLLconst x [c]) 22675 for { 22676 _ = v.Args[1] 22677 x := v.Args[0] 22678 v_1 := v.Args[1] 22679 if v_1.Op != OpConst64 { 22680 break 22681 } 22682 c := v_1.AuxInt 22683 if !(uint64(c) < 16) { 22684 break 22685 } 22686 v.reset(Op386SHLLconst) 22687 v.AuxInt = c 22688 v.AddArg(x) 22689 return true 22690 } 22691 // match: (Lsh16x64 _ (Const64 [c])) 22692 // cond: uint64(c) >= 16 22693 // result: (Const16 [0]) 22694 for { 22695 _ = v.Args[1] 22696 v_1 := v.Args[1] 22697 if v_1.Op != OpConst64 { 22698 break 22699 } 22700 c := v_1.AuxInt 22701 if !(uint64(c) >= 16) { 22702 break 22703 } 22704 v.reset(OpConst16) 22705 v.AuxInt = 0 22706 return true 22707 } 22708 return false 22709 } 22710 func rewriteValue386_OpLsh16x8_0(v *Value) bool { 22711 b := v.Block 22712 _ = b 22713 // match: (Lsh16x8 <t> x y) 22714 // cond: 22715 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 22716 for { 22717 t := v.Type 22718 _ = v.Args[1] 22719 x := v.Args[0] 22720 y := v.Args[1] 22721 v.reset(Op386ANDL) 22722 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22723 v0.AddArg(x) 22724 v0.AddArg(y) 22725 v.AddArg(v0) 22726 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22727 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 22728 v2.AuxInt = 32 22729 v2.AddArg(y) 22730 v1.AddArg(v2) 22731 v.AddArg(v1) 22732 return true 22733 } 22734 } 22735 func rewriteValue386_OpLsh32x16_0(v *Value) bool { 22736 b := v.Block 22737 _ = b 22738 // match: (Lsh32x16 <t> x y) 22739 // cond: 22740 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 22741 for { 22742 t := v.Type 22743 _ = v.Args[1] 22744 x := v.Args[0] 22745 y := v.Args[1] 22746 v.reset(Op386ANDL) 22747 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22748 v0.AddArg(x) 22749 v0.AddArg(y) 22750 v.AddArg(v0) 22751 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22752 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 22753 v2.AuxInt = 32 22754 v2.AddArg(y) 22755 v1.AddArg(v2) 22756 v.AddArg(v1) 22757 return true 22758 } 22759 } 22760 func rewriteValue386_OpLsh32x32_0(v *Value) bool { 22761 b := v.Block 22762 _ = b 22763 // match: (Lsh32x32 <t> x y) 22764 // cond: 22765 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 22766 for { 22767 t := v.Type 22768 _ = v.Args[1] 22769 x := v.Args[0] 22770 y := v.Args[1] 22771 v.reset(Op386ANDL) 22772 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22773 v0.AddArg(x) 22774 v0.AddArg(y) 22775 v.AddArg(v0) 22776 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22777 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 22778 v2.AuxInt = 32 22779 v2.AddArg(y) 22780 v1.AddArg(v2) 22781 v.AddArg(v1) 22782 return true 22783 } 22784 } 22785 func rewriteValue386_OpLsh32x64_0(v *Value) bool { 22786 // match: (Lsh32x64 x (Const64 [c])) 22787 // cond: uint64(c) < 32 22788 // result: (SHLLconst x [c]) 22789 for { 22790 _ = v.Args[1] 22791 x := v.Args[0] 22792 v_1 := v.Args[1] 22793 if v_1.Op != OpConst64 { 22794 break 22795 } 22796 c := v_1.AuxInt 22797 if !(uint64(c) < 32) { 22798 break 22799 } 22800 v.reset(Op386SHLLconst) 22801 v.AuxInt = c 22802 v.AddArg(x) 22803 return true 22804 } 22805 // match: (Lsh32x64 _ (Const64 [c])) 22806 // cond: uint64(c) >= 32 22807 // result: (Const32 [0]) 22808 for { 22809 _ = v.Args[1] 22810 v_1 := v.Args[1] 22811 if v_1.Op != OpConst64 { 22812 break 22813 } 22814 c := v_1.AuxInt 22815 if !(uint64(c) >= 32) { 22816 break 22817 } 22818 v.reset(OpConst32) 22819 v.AuxInt = 0 22820 return true 22821 } 22822 return false 22823 } 22824 func rewriteValue386_OpLsh32x8_0(v *Value) bool { 22825 b := v.Block 22826 _ = b 22827 // match: (Lsh32x8 <t> x y) 22828 // cond: 22829 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 22830 for { 22831 t := v.Type 22832 _ = v.Args[1] 22833 x := v.Args[0] 22834 y := v.Args[1] 22835 v.reset(Op386ANDL) 22836 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22837 v0.AddArg(x) 22838 v0.AddArg(y) 22839 v.AddArg(v0) 22840 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22841 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 22842 v2.AuxInt = 32 22843 v2.AddArg(y) 22844 v1.AddArg(v2) 22845 v.AddArg(v1) 22846 return true 22847 } 22848 } 22849 func rewriteValue386_OpLsh8x16_0(v *Value) bool { 22850 b := v.Block 22851 _ = b 22852 // match: (Lsh8x16 <t> x y) 22853 // cond: 22854 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 22855 for { 22856 t := v.Type 22857 _ = v.Args[1] 22858 x := v.Args[0] 22859 y := v.Args[1] 22860 v.reset(Op386ANDL) 22861 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22862 v0.AddArg(x) 22863 v0.AddArg(y) 22864 v.AddArg(v0) 22865 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22866 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 22867 v2.AuxInt = 32 22868 v2.AddArg(y) 22869 v1.AddArg(v2) 22870 v.AddArg(v1) 22871 return true 22872 } 22873 } 22874 func rewriteValue386_OpLsh8x32_0(v *Value) bool { 22875 b := v.Block 22876 _ = b 22877 // match: (Lsh8x32 <t> x y) 22878 // cond: 22879 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 22880 for { 22881 t := v.Type 22882 _ = v.Args[1] 22883 x := v.Args[0] 22884 y := v.Args[1] 22885 v.reset(Op386ANDL) 22886 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22887 v0.AddArg(x) 22888 v0.AddArg(y) 22889 v.AddArg(v0) 22890 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22891 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 22892 v2.AuxInt = 32 22893 v2.AddArg(y) 22894 v1.AddArg(v2) 22895 v.AddArg(v1) 22896 return true 22897 } 22898 } 22899 func rewriteValue386_OpLsh8x64_0(v *Value) bool { 22900 // match: (Lsh8x64 x (Const64 [c])) 22901 // cond: uint64(c) < 8 22902 // result: (SHLLconst x [c]) 22903 for { 22904 _ = v.Args[1] 22905 x := v.Args[0] 22906 v_1 := v.Args[1] 22907 if v_1.Op != OpConst64 { 22908 break 22909 } 22910 c := v_1.AuxInt 22911 if !(uint64(c) < 8) { 22912 break 22913 } 22914 v.reset(Op386SHLLconst) 22915 v.AuxInt = c 22916 v.AddArg(x) 22917 return true 22918 } 22919 // match: (Lsh8x64 _ (Const64 [c])) 22920 // cond: uint64(c) >= 8 22921 // result: (Const8 [0]) 22922 for { 22923 _ = v.Args[1] 22924 v_1 := v.Args[1] 22925 if v_1.Op != OpConst64 { 22926 break 22927 } 22928 c := v_1.AuxInt 22929 if !(uint64(c) >= 8) { 22930 break 22931 } 22932 v.reset(OpConst8) 22933 v.AuxInt = 0 22934 return true 22935 } 22936 return false 22937 } 22938 func rewriteValue386_OpLsh8x8_0(v *Value) bool { 22939 b := v.Block 22940 _ = b 22941 // match: (Lsh8x8 <t> x y) 22942 // cond: 22943 // result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 22944 for { 22945 t := v.Type 22946 _ = v.Args[1] 22947 x := v.Args[0] 22948 y := v.Args[1] 22949 v.reset(Op386ANDL) 22950 v0 := b.NewValue0(v.Pos, Op386SHLL, t) 22951 v0.AddArg(x) 22952 v0.AddArg(y) 22953 v.AddArg(v0) 22954 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 22955 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 22956 v2.AuxInt = 32 22957 v2.AddArg(y) 22958 v1.AddArg(v2) 22959 v.AddArg(v1) 22960 return true 22961 } 22962 } 22963 func rewriteValue386_OpMod16_0(v *Value) bool { 22964 // match: (Mod16 [a] x y) 22965 // cond: 22966 // result: (MODW [a] x y) 22967 for { 22968 a := v.AuxInt 22969 _ = v.Args[1] 22970 x := v.Args[0] 22971 y := v.Args[1] 22972 v.reset(Op386MODW) 22973 v.AuxInt = a 22974 v.AddArg(x) 22975 v.AddArg(y) 22976 return true 22977 } 22978 } 22979 func rewriteValue386_OpMod16u_0(v *Value) bool { 22980 // match: (Mod16u x y) 22981 // cond: 22982 // result: (MODWU x y) 22983 for { 22984 _ = v.Args[1] 22985 x := v.Args[0] 22986 y := v.Args[1] 22987 v.reset(Op386MODWU) 22988 v.AddArg(x) 22989 v.AddArg(y) 22990 return true 22991 } 22992 } 22993 func rewriteValue386_OpMod32_0(v *Value) bool { 22994 // match: (Mod32 [a] x y) 22995 // cond: 22996 // result: (MODL [a] x y) 22997 for { 22998 a := v.AuxInt 22999 _ = v.Args[1] 23000 x := v.Args[0] 23001 y := v.Args[1] 23002 v.reset(Op386MODL) 23003 v.AuxInt = a 23004 v.AddArg(x) 23005 v.AddArg(y) 23006 return true 23007 } 23008 } 23009 func rewriteValue386_OpMod32u_0(v *Value) bool { 23010 // match: (Mod32u x y) 23011 // cond: 23012 // result: (MODLU x y) 23013 for { 23014 _ = v.Args[1] 23015 x := v.Args[0] 23016 y := v.Args[1] 23017 v.reset(Op386MODLU) 23018 v.AddArg(x) 23019 v.AddArg(y) 23020 return true 23021 } 23022 } 23023 func rewriteValue386_OpMod8_0(v *Value) bool { 23024 b := v.Block 23025 _ = b 23026 typ := &b.Func.Config.Types 23027 _ = typ 23028 // match: (Mod8 x y) 23029 // cond: 23030 // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) 23031 for { 23032 _ = v.Args[1] 23033 x := v.Args[0] 23034 y := v.Args[1] 23035 v.reset(Op386MODW) 23036 v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 23037 v0.AddArg(x) 23038 v.AddArg(v0) 23039 v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) 23040 v1.AddArg(y) 23041 v.AddArg(v1) 23042 return true 23043 } 23044 } 23045 func rewriteValue386_OpMod8u_0(v *Value) bool { 23046 b := v.Block 23047 _ = b 23048 typ := &b.Func.Config.Types 23049 _ = typ 23050 // match: (Mod8u x y) 23051 // cond: 23052 // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) 23053 for { 23054 _ = v.Args[1] 23055 x := v.Args[0] 23056 y := v.Args[1] 23057 v.reset(Op386MODWU) 23058 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 23059 v0.AddArg(x) 23060 v.AddArg(v0) 23061 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) 23062 v1.AddArg(y) 23063 v.AddArg(v1) 23064 return true 23065 } 23066 } 23067 func rewriteValue386_OpMove_0(v *Value) bool { 23068 b := v.Block 23069 _ = b 23070 typ := &b.Func.Config.Types 23071 _ = typ 23072 // match: (Move [0] _ _ mem) 23073 // cond: 23074 // result: mem 23075 for { 23076 if v.AuxInt != 0 { 23077 break 23078 } 23079 _ = v.Args[2] 23080 mem := v.Args[2] 23081 v.reset(OpCopy) 23082 v.Type = mem.Type 23083 v.AddArg(mem) 23084 return true 23085 } 23086 // match: (Move [1] dst src mem) 23087 // cond: 23088 // result: (MOVBstore dst (MOVBload src mem) mem) 23089 for { 23090 if v.AuxInt != 1 { 23091 break 23092 } 23093 _ = v.Args[2] 23094 dst := v.Args[0] 23095 src := v.Args[1] 23096 mem := v.Args[2] 23097 v.reset(Op386MOVBstore) 23098 v.AddArg(dst) 23099 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 23100 v0.AddArg(src) 23101 v0.AddArg(mem) 23102 v.AddArg(v0) 23103 v.AddArg(mem) 23104 return true 23105 } 23106 // match: (Move [2] dst src mem) 23107 // cond: 23108 // result: (MOVWstore dst (MOVWload src mem) mem) 23109 for { 23110 if v.AuxInt != 2 { 23111 break 23112 } 23113 _ = v.Args[2] 23114 dst := v.Args[0] 23115 src := v.Args[1] 23116 mem := v.Args[2] 23117 v.reset(Op386MOVWstore) 23118 v.AddArg(dst) 23119 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 23120 v0.AddArg(src) 23121 v0.AddArg(mem) 23122 v.AddArg(v0) 23123 v.AddArg(mem) 23124 return true 23125 } 23126 // match: (Move [4] dst src mem) 23127 // cond: 23128 // result: (MOVLstore dst (MOVLload src mem) mem) 23129 for { 23130 if v.AuxInt != 4 { 23131 break 23132 } 23133 _ = v.Args[2] 23134 dst := v.Args[0] 23135 src := v.Args[1] 23136 mem := v.Args[2] 23137 v.reset(Op386MOVLstore) 23138 v.AddArg(dst) 23139 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23140 v0.AddArg(src) 23141 v0.AddArg(mem) 23142 v.AddArg(v0) 23143 v.AddArg(mem) 23144 return true 23145 } 23146 // match: (Move [3] dst src mem) 23147 // cond: 23148 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) 23149 for { 23150 if v.AuxInt != 3 { 23151 break 23152 } 23153 _ = v.Args[2] 23154 dst := v.Args[0] 23155 src := v.Args[1] 23156 mem := v.Args[2] 23157 v.reset(Op386MOVBstore) 23158 v.AuxInt = 2 23159 v.AddArg(dst) 23160 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 23161 v0.AuxInt = 2 23162 v0.AddArg(src) 23163 v0.AddArg(mem) 23164 v.AddArg(v0) 23165 v1 := b.NewValue0(v.Pos, Op386MOVWstore, types.TypeMem) 23166 v1.AddArg(dst) 23167 v2 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 23168 v2.AddArg(src) 23169 v2.AddArg(mem) 23170 v1.AddArg(v2) 23171 v1.AddArg(mem) 23172 v.AddArg(v1) 23173 return true 23174 } 23175 // match: (Move [5] dst src mem) 23176 // cond: 23177 // result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 23178 for { 23179 if v.AuxInt != 5 { 23180 break 23181 } 23182 _ = v.Args[2] 23183 dst := v.Args[0] 23184 src := v.Args[1] 23185 mem := v.Args[2] 23186 v.reset(Op386MOVBstore) 23187 v.AuxInt = 4 23188 v.AddArg(dst) 23189 v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) 23190 v0.AuxInt = 4 23191 v0.AddArg(src) 23192 v0.AddArg(mem) 23193 v.AddArg(v0) 23194 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 23195 v1.AddArg(dst) 23196 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23197 v2.AddArg(src) 23198 v2.AddArg(mem) 23199 v1.AddArg(v2) 23200 v1.AddArg(mem) 23201 v.AddArg(v1) 23202 return true 23203 } 23204 // match: (Move [6] dst src mem) 23205 // cond: 23206 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 23207 for { 23208 if v.AuxInt != 6 { 23209 break 23210 } 23211 _ = v.Args[2] 23212 dst := v.Args[0] 23213 src := v.Args[1] 23214 mem := v.Args[2] 23215 v.reset(Op386MOVWstore) 23216 v.AuxInt = 4 23217 v.AddArg(dst) 23218 v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) 23219 v0.AuxInt = 4 23220 v0.AddArg(src) 23221 v0.AddArg(mem) 23222 v.AddArg(v0) 23223 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 23224 v1.AddArg(dst) 23225 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23226 v2.AddArg(src) 23227 v2.AddArg(mem) 23228 v1.AddArg(v2) 23229 v1.AddArg(mem) 23230 v.AddArg(v1) 23231 return true 23232 } 23233 // match: (Move [7] dst src mem) 23234 // cond: 23235 // result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem)) 23236 for { 23237 if v.AuxInt != 7 { 23238 break 23239 } 23240 _ = v.Args[2] 23241 dst := v.Args[0] 23242 src := v.Args[1] 23243 mem := v.Args[2] 23244 v.reset(Op386MOVLstore) 23245 v.AuxInt = 3 23246 v.AddArg(dst) 23247 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23248 v0.AuxInt = 3 23249 v0.AddArg(src) 23250 v0.AddArg(mem) 23251 v.AddArg(v0) 23252 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 23253 v1.AddArg(dst) 23254 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23255 v2.AddArg(src) 23256 v2.AddArg(mem) 23257 v1.AddArg(v2) 23258 v1.AddArg(mem) 23259 v.AddArg(v1) 23260 return true 23261 } 23262 // match: (Move [8] dst src mem) 23263 // cond: 23264 // result: (MOVLstore [4] dst (MOVLload [4] src mem) (MOVLstore dst (MOVLload src mem) mem)) 23265 for { 23266 if v.AuxInt != 8 { 23267 break 23268 } 23269 _ = v.Args[2] 23270 dst := v.Args[0] 23271 src := v.Args[1] 23272 mem := v.Args[2] 23273 v.reset(Op386MOVLstore) 23274 v.AuxInt = 4 23275 v.AddArg(dst) 23276 v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23277 v0.AuxInt = 4 23278 v0.AddArg(src) 23279 v0.AddArg(mem) 23280 v.AddArg(v0) 23281 v1 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 23282 v1.AddArg(dst) 23283 v2 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23284 v2.AddArg(src) 23285 v2.AddArg(mem) 23286 v1.AddArg(v2) 23287 v1.AddArg(mem) 23288 v.AddArg(v1) 23289 return true 23290 } 23291 // match: (Move [s] dst src mem) 23292 // cond: s > 8 && s%4 != 0 23293 // result: (Move [s-s%4] (ADDLconst <dst.Type> dst [s%4]) (ADDLconst <src.Type> src [s%4]) (MOVLstore dst (MOVLload src mem) mem)) 23294 for { 23295 s := v.AuxInt 23296 _ = v.Args[2] 23297 dst := v.Args[0] 23298 src := v.Args[1] 23299 mem := v.Args[2] 23300 if !(s > 8 && s%4 != 0) { 23301 break 23302 } 23303 v.reset(OpMove) 23304 v.AuxInt = s - s%4 23305 v0 := b.NewValue0(v.Pos, Op386ADDLconst, dst.Type) 23306 v0.AuxInt = s % 4 23307 v0.AddArg(dst) 23308 v.AddArg(v0) 23309 v1 := b.NewValue0(v.Pos, Op386ADDLconst, src.Type) 23310 v1.AuxInt = s % 4 23311 v1.AddArg(src) 23312 v.AddArg(v1) 23313 v2 := b.NewValue0(v.Pos, Op386MOVLstore, types.TypeMem) 23314 v2.AddArg(dst) 23315 v3 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) 23316 v3.AddArg(src) 23317 v3.AddArg(mem) 23318 v2.AddArg(v3) 23319 v2.AddArg(mem) 23320 v.AddArg(v2) 23321 return true 23322 } 23323 return false 23324 } 23325 func rewriteValue386_OpMove_10(v *Value) bool { 23326 b := v.Block 23327 _ = b 23328 config := b.Func.Config 23329 _ = config 23330 typ := &b.Func.Config.Types 23331 _ = typ 23332 // match: (Move [s] dst src mem) 23333 // cond: s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 23334 // result: (DUFFCOPY [10*(128-s/4)] dst src mem) 23335 for { 23336 s := v.AuxInt 23337 _ = v.Args[2] 23338 dst := v.Args[0] 23339 src := v.Args[1] 23340 mem := v.Args[2] 23341 if !(s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 23342 break 23343 } 23344 v.reset(Op386DUFFCOPY) 23345 v.AuxInt = 10 * (128 - s/4) 23346 v.AddArg(dst) 23347 v.AddArg(src) 23348 v.AddArg(mem) 23349 return true 23350 } 23351 // match: (Move [s] dst src mem) 23352 // cond: (s > 4*128 || config.noDuffDevice) && s%4 == 0 23353 // result: (REPMOVSL dst src (MOVLconst [s/4]) mem) 23354 for { 23355 s := v.AuxInt 23356 _ = v.Args[2] 23357 dst := v.Args[0] 23358 src := v.Args[1] 23359 mem := v.Args[2] 23360 if !((s > 4*128 || config.noDuffDevice) && s%4 == 0) { 23361 break 23362 } 23363 v.reset(Op386REPMOVSL) 23364 v.AddArg(dst) 23365 v.AddArg(src) 23366 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 23367 v0.AuxInt = s / 4 23368 v.AddArg(v0) 23369 v.AddArg(mem) 23370 return true 23371 } 23372 return false 23373 } 23374 func rewriteValue386_OpMul16_0(v *Value) bool { 23375 // match: (Mul16 x y) 23376 // cond: 23377 // result: (MULL x y) 23378 for { 23379 _ = v.Args[1] 23380 x := v.Args[0] 23381 y := v.Args[1] 23382 v.reset(Op386MULL) 23383 v.AddArg(x) 23384 v.AddArg(y) 23385 return true 23386 } 23387 } 23388 func rewriteValue386_OpMul32_0(v *Value) bool { 23389 // match: (Mul32 x y) 23390 // cond: 23391 // result: (MULL x y) 23392 for { 23393 _ = v.Args[1] 23394 x := v.Args[0] 23395 y := v.Args[1] 23396 v.reset(Op386MULL) 23397 v.AddArg(x) 23398 v.AddArg(y) 23399 return true 23400 } 23401 } 23402 func rewriteValue386_OpMul32F_0(v *Value) bool { 23403 // match: (Mul32F x y) 23404 // cond: 23405 // result: (MULSS x y) 23406 for { 23407 _ = v.Args[1] 23408 x := v.Args[0] 23409 y := v.Args[1] 23410 v.reset(Op386MULSS) 23411 v.AddArg(x) 23412 v.AddArg(y) 23413 return true 23414 } 23415 } 23416 func rewriteValue386_OpMul32uhilo_0(v *Value) bool { 23417 // match: (Mul32uhilo x y) 23418 // cond: 23419 // result: (MULLQU x y) 23420 for { 23421 _ = v.Args[1] 23422 x := v.Args[0] 23423 y := v.Args[1] 23424 v.reset(Op386MULLQU) 23425 v.AddArg(x) 23426 v.AddArg(y) 23427 return true 23428 } 23429 } 23430 func rewriteValue386_OpMul64F_0(v *Value) bool { 23431 // match: (Mul64F x y) 23432 // cond: 23433 // result: (MULSD x y) 23434 for { 23435 _ = v.Args[1] 23436 x := v.Args[0] 23437 y := v.Args[1] 23438 v.reset(Op386MULSD) 23439 v.AddArg(x) 23440 v.AddArg(y) 23441 return true 23442 } 23443 } 23444 func rewriteValue386_OpMul8_0(v *Value) bool { 23445 // match: (Mul8 x y) 23446 // cond: 23447 // result: (MULL x y) 23448 for { 23449 _ = v.Args[1] 23450 x := v.Args[0] 23451 y := v.Args[1] 23452 v.reset(Op386MULL) 23453 v.AddArg(x) 23454 v.AddArg(y) 23455 return true 23456 } 23457 } 23458 func rewriteValue386_OpNeg16_0(v *Value) bool { 23459 // match: (Neg16 x) 23460 // cond: 23461 // result: (NEGL x) 23462 for { 23463 x := v.Args[0] 23464 v.reset(Op386NEGL) 23465 v.AddArg(x) 23466 return true 23467 } 23468 } 23469 func rewriteValue386_OpNeg32_0(v *Value) bool { 23470 // match: (Neg32 x) 23471 // cond: 23472 // result: (NEGL x) 23473 for { 23474 x := v.Args[0] 23475 v.reset(Op386NEGL) 23476 v.AddArg(x) 23477 return true 23478 } 23479 } 23480 func rewriteValue386_OpNeg32F_0(v *Value) bool { 23481 b := v.Block 23482 _ = b 23483 config := b.Func.Config 23484 _ = config 23485 typ := &b.Func.Config.Types 23486 _ = typ 23487 // match: (Neg32F x) 23488 // cond: !config.use387 23489 // result: (PXOR x (MOVSSconst <typ.Float32> [auxFrom32F(float32(math.Copysign(0, -1)))])) 23490 for { 23491 x := v.Args[0] 23492 if !(!config.use387) { 23493 break 23494 } 23495 v.reset(Op386PXOR) 23496 v.AddArg(x) 23497 v0 := b.NewValue0(v.Pos, Op386MOVSSconst, typ.Float32) 23498 v0.AuxInt = auxFrom32F(float32(math.Copysign(0, -1))) 23499 v.AddArg(v0) 23500 return true 23501 } 23502 // match: (Neg32F x) 23503 // cond: config.use387 23504 // result: (FCHS x) 23505 for { 23506 x := v.Args[0] 23507 if !(config.use387) { 23508 break 23509 } 23510 v.reset(Op386FCHS) 23511 v.AddArg(x) 23512 return true 23513 } 23514 return false 23515 } 23516 func rewriteValue386_OpNeg64F_0(v *Value) bool { 23517 b := v.Block 23518 _ = b 23519 config := b.Func.Config 23520 _ = config 23521 typ := &b.Func.Config.Types 23522 _ = typ 23523 // match: (Neg64F x) 23524 // cond: !config.use387 23525 // result: (PXOR x (MOVSDconst <typ.Float64> [auxFrom64F(math.Copysign(0, -1))])) 23526 for { 23527 x := v.Args[0] 23528 if !(!config.use387) { 23529 break 23530 } 23531 v.reset(Op386PXOR) 23532 v.AddArg(x) 23533 v0 := b.NewValue0(v.Pos, Op386MOVSDconst, typ.Float64) 23534 v0.AuxInt = auxFrom64F(math.Copysign(0, -1)) 23535 v.AddArg(v0) 23536 return true 23537 } 23538 // match: (Neg64F x) 23539 // cond: config.use387 23540 // result: (FCHS x) 23541 for { 23542 x := v.Args[0] 23543 if !(config.use387) { 23544 break 23545 } 23546 v.reset(Op386FCHS) 23547 v.AddArg(x) 23548 return true 23549 } 23550 return false 23551 } 23552 func rewriteValue386_OpNeg8_0(v *Value) bool { 23553 // match: (Neg8 x) 23554 // cond: 23555 // result: (NEGL x) 23556 for { 23557 x := v.Args[0] 23558 v.reset(Op386NEGL) 23559 v.AddArg(x) 23560 return true 23561 } 23562 } 23563 func rewriteValue386_OpNeq16_0(v *Value) bool { 23564 b := v.Block 23565 _ = b 23566 // match: (Neq16 x y) 23567 // cond: 23568 // result: (SETNE (CMPW x y)) 23569 for { 23570 _ = v.Args[1] 23571 x := v.Args[0] 23572 y := v.Args[1] 23573 v.reset(Op386SETNE) 23574 v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) 23575 v0.AddArg(x) 23576 v0.AddArg(y) 23577 v.AddArg(v0) 23578 return true 23579 } 23580 } 23581 func rewriteValue386_OpNeq32_0(v *Value) bool { 23582 b := v.Block 23583 _ = b 23584 // match: (Neq32 x y) 23585 // cond: 23586 // result: (SETNE (CMPL x y)) 23587 for { 23588 _ = v.Args[1] 23589 x := v.Args[0] 23590 y := v.Args[1] 23591 v.reset(Op386SETNE) 23592 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 23593 v0.AddArg(x) 23594 v0.AddArg(y) 23595 v.AddArg(v0) 23596 return true 23597 } 23598 } 23599 func rewriteValue386_OpNeq32F_0(v *Value) bool { 23600 b := v.Block 23601 _ = b 23602 // match: (Neq32F x y) 23603 // cond: 23604 // result: (SETNEF (UCOMISS x y)) 23605 for { 23606 _ = v.Args[1] 23607 x := v.Args[0] 23608 y := v.Args[1] 23609 v.reset(Op386SETNEF) 23610 v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) 23611 v0.AddArg(x) 23612 v0.AddArg(y) 23613 v.AddArg(v0) 23614 return true 23615 } 23616 } 23617 func rewriteValue386_OpNeq64F_0(v *Value) bool { 23618 b := v.Block 23619 _ = b 23620 // match: (Neq64F x y) 23621 // cond: 23622 // result: (SETNEF (UCOMISD x y)) 23623 for { 23624 _ = v.Args[1] 23625 x := v.Args[0] 23626 y := v.Args[1] 23627 v.reset(Op386SETNEF) 23628 v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) 23629 v0.AddArg(x) 23630 v0.AddArg(y) 23631 v.AddArg(v0) 23632 return true 23633 } 23634 } 23635 func rewriteValue386_OpNeq8_0(v *Value) bool { 23636 b := v.Block 23637 _ = b 23638 // match: (Neq8 x y) 23639 // cond: 23640 // result: (SETNE (CMPB x y)) 23641 for { 23642 _ = v.Args[1] 23643 x := v.Args[0] 23644 y := v.Args[1] 23645 v.reset(Op386SETNE) 23646 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 23647 v0.AddArg(x) 23648 v0.AddArg(y) 23649 v.AddArg(v0) 23650 return true 23651 } 23652 } 23653 func rewriteValue386_OpNeqB_0(v *Value) bool { 23654 b := v.Block 23655 _ = b 23656 // match: (NeqB x y) 23657 // cond: 23658 // result: (SETNE (CMPB x y)) 23659 for { 23660 _ = v.Args[1] 23661 x := v.Args[0] 23662 y := v.Args[1] 23663 v.reset(Op386SETNE) 23664 v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) 23665 v0.AddArg(x) 23666 v0.AddArg(y) 23667 v.AddArg(v0) 23668 return true 23669 } 23670 } 23671 func rewriteValue386_OpNeqPtr_0(v *Value) bool { 23672 b := v.Block 23673 _ = b 23674 // match: (NeqPtr x y) 23675 // cond: 23676 // result: (SETNE (CMPL x y)) 23677 for { 23678 _ = v.Args[1] 23679 x := v.Args[0] 23680 y := v.Args[1] 23681 v.reset(Op386SETNE) 23682 v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) 23683 v0.AddArg(x) 23684 v0.AddArg(y) 23685 v.AddArg(v0) 23686 return true 23687 } 23688 } 23689 func rewriteValue386_OpNilCheck_0(v *Value) bool { 23690 // match: (NilCheck ptr mem) 23691 // cond: 23692 // result: (LoweredNilCheck ptr mem) 23693 for { 23694 _ = v.Args[1] 23695 ptr := v.Args[0] 23696 mem := v.Args[1] 23697 v.reset(Op386LoweredNilCheck) 23698 v.AddArg(ptr) 23699 v.AddArg(mem) 23700 return true 23701 } 23702 } 23703 func rewriteValue386_OpNot_0(v *Value) bool { 23704 // match: (Not x) 23705 // cond: 23706 // result: (XORLconst [1] x) 23707 for { 23708 x := v.Args[0] 23709 v.reset(Op386XORLconst) 23710 v.AuxInt = 1 23711 v.AddArg(x) 23712 return true 23713 } 23714 } 23715 func rewriteValue386_OpOffPtr_0(v *Value) bool { 23716 // match: (OffPtr [off] ptr) 23717 // cond: 23718 // result: (ADDLconst [off] ptr) 23719 for { 23720 off := v.AuxInt 23721 ptr := v.Args[0] 23722 v.reset(Op386ADDLconst) 23723 v.AuxInt = off 23724 v.AddArg(ptr) 23725 return true 23726 } 23727 } 23728 func rewriteValue386_OpOr16_0(v *Value) bool { 23729 // match: (Or16 x y) 23730 // cond: 23731 // result: (ORL x y) 23732 for { 23733 _ = v.Args[1] 23734 x := v.Args[0] 23735 y := v.Args[1] 23736 v.reset(Op386ORL) 23737 v.AddArg(x) 23738 v.AddArg(y) 23739 return true 23740 } 23741 } 23742 func rewriteValue386_OpOr32_0(v *Value) bool { 23743 // match: (Or32 x y) 23744 // cond: 23745 // result: (ORL x y) 23746 for { 23747 _ = v.Args[1] 23748 x := v.Args[0] 23749 y := v.Args[1] 23750 v.reset(Op386ORL) 23751 v.AddArg(x) 23752 v.AddArg(y) 23753 return true 23754 } 23755 } 23756 func rewriteValue386_OpOr8_0(v *Value) bool { 23757 // match: (Or8 x y) 23758 // cond: 23759 // result: (ORL x y) 23760 for { 23761 _ = v.Args[1] 23762 x := v.Args[0] 23763 y := v.Args[1] 23764 v.reset(Op386ORL) 23765 v.AddArg(x) 23766 v.AddArg(y) 23767 return true 23768 } 23769 } 23770 func rewriteValue386_OpOrB_0(v *Value) bool { 23771 // match: (OrB x y) 23772 // cond: 23773 // result: (ORL x y) 23774 for { 23775 _ = v.Args[1] 23776 x := v.Args[0] 23777 y := v.Args[1] 23778 v.reset(Op386ORL) 23779 v.AddArg(x) 23780 v.AddArg(y) 23781 return true 23782 } 23783 } 23784 func rewriteValue386_OpRound32F_0(v *Value) bool { 23785 // match: (Round32F x) 23786 // cond: 23787 // result: x 23788 for { 23789 x := v.Args[0] 23790 v.reset(OpCopy) 23791 v.Type = x.Type 23792 v.AddArg(x) 23793 return true 23794 } 23795 } 23796 func rewriteValue386_OpRound64F_0(v *Value) bool { 23797 // match: (Round64F x) 23798 // cond: 23799 // result: x 23800 for { 23801 x := v.Args[0] 23802 v.reset(OpCopy) 23803 v.Type = x.Type 23804 v.AddArg(x) 23805 return true 23806 } 23807 } 23808 func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { 23809 b := v.Block 23810 _ = b 23811 // match: (Rsh16Ux16 <t> x y) 23812 // cond: 23813 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16]))) 23814 for { 23815 t := v.Type 23816 _ = v.Args[1] 23817 x := v.Args[0] 23818 y := v.Args[1] 23819 v.reset(Op386ANDL) 23820 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 23821 v0.AddArg(x) 23822 v0.AddArg(y) 23823 v.AddArg(v0) 23824 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 23825 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 23826 v2.AuxInt = 16 23827 v2.AddArg(y) 23828 v1.AddArg(v2) 23829 v.AddArg(v1) 23830 return true 23831 } 23832 } 23833 func rewriteValue386_OpRsh16Ux32_0(v *Value) bool { 23834 b := v.Block 23835 _ = b 23836 // match: (Rsh16Ux32 <t> x y) 23837 // cond: 23838 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16]))) 23839 for { 23840 t := v.Type 23841 _ = v.Args[1] 23842 x := v.Args[0] 23843 y := v.Args[1] 23844 v.reset(Op386ANDL) 23845 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 23846 v0.AddArg(x) 23847 v0.AddArg(y) 23848 v.AddArg(v0) 23849 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 23850 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 23851 v2.AuxInt = 16 23852 v2.AddArg(y) 23853 v1.AddArg(v2) 23854 v.AddArg(v1) 23855 return true 23856 } 23857 } 23858 func rewriteValue386_OpRsh16Ux64_0(v *Value) bool { 23859 // match: (Rsh16Ux64 x (Const64 [c])) 23860 // cond: uint64(c) < 16 23861 // result: (SHRWconst x [c]) 23862 for { 23863 _ = v.Args[1] 23864 x := v.Args[0] 23865 v_1 := v.Args[1] 23866 if v_1.Op != OpConst64 { 23867 break 23868 } 23869 c := v_1.AuxInt 23870 if !(uint64(c) < 16) { 23871 break 23872 } 23873 v.reset(Op386SHRWconst) 23874 v.AuxInt = c 23875 v.AddArg(x) 23876 return true 23877 } 23878 // match: (Rsh16Ux64 _ (Const64 [c])) 23879 // cond: uint64(c) >= 16 23880 // result: (Const16 [0]) 23881 for { 23882 _ = v.Args[1] 23883 v_1 := v.Args[1] 23884 if v_1.Op != OpConst64 { 23885 break 23886 } 23887 c := v_1.AuxInt 23888 if !(uint64(c) >= 16) { 23889 break 23890 } 23891 v.reset(OpConst16) 23892 v.AuxInt = 0 23893 return true 23894 } 23895 return false 23896 } 23897 func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { 23898 b := v.Block 23899 _ = b 23900 // match: (Rsh16Ux8 <t> x y) 23901 // cond: 23902 // result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16]))) 23903 for { 23904 t := v.Type 23905 _ = v.Args[1] 23906 x := v.Args[0] 23907 y := v.Args[1] 23908 v.reset(Op386ANDL) 23909 v0 := b.NewValue0(v.Pos, Op386SHRW, t) 23910 v0.AddArg(x) 23911 v0.AddArg(y) 23912 v.AddArg(v0) 23913 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 23914 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 23915 v2.AuxInt = 16 23916 v2.AddArg(y) 23917 v1.AddArg(v2) 23918 v.AddArg(v1) 23919 return true 23920 } 23921 } 23922 func rewriteValue386_OpRsh16x16_0(v *Value) bool { 23923 b := v.Block 23924 _ = b 23925 // match: (Rsh16x16 <t> x y) 23926 // cond: 23927 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16]))))) 23928 for { 23929 t := v.Type 23930 _ = v.Args[1] 23931 x := v.Args[0] 23932 y := v.Args[1] 23933 v.reset(Op386SARW) 23934 v.Type = t 23935 v.AddArg(x) 23936 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 23937 v0.AddArg(y) 23938 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 23939 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 23940 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 23941 v3.AuxInt = 16 23942 v3.AddArg(y) 23943 v2.AddArg(v3) 23944 v1.AddArg(v2) 23945 v0.AddArg(v1) 23946 v.AddArg(v0) 23947 return true 23948 } 23949 } 23950 func rewriteValue386_OpRsh16x32_0(v *Value) bool { 23951 b := v.Block 23952 _ = b 23953 // match: (Rsh16x32 <t> x y) 23954 // cond: 23955 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16]))))) 23956 for { 23957 t := v.Type 23958 _ = v.Args[1] 23959 x := v.Args[0] 23960 y := v.Args[1] 23961 v.reset(Op386SARW) 23962 v.Type = t 23963 v.AddArg(x) 23964 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 23965 v0.AddArg(y) 23966 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 23967 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 23968 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 23969 v3.AuxInt = 16 23970 v3.AddArg(y) 23971 v2.AddArg(v3) 23972 v1.AddArg(v2) 23973 v0.AddArg(v1) 23974 v.AddArg(v0) 23975 return true 23976 } 23977 } 23978 func rewriteValue386_OpRsh16x64_0(v *Value) bool { 23979 // match: (Rsh16x64 x (Const64 [c])) 23980 // cond: uint64(c) < 16 23981 // result: (SARWconst x [c]) 23982 for { 23983 _ = v.Args[1] 23984 x := v.Args[0] 23985 v_1 := v.Args[1] 23986 if v_1.Op != OpConst64 { 23987 break 23988 } 23989 c := v_1.AuxInt 23990 if !(uint64(c) < 16) { 23991 break 23992 } 23993 v.reset(Op386SARWconst) 23994 v.AuxInt = c 23995 v.AddArg(x) 23996 return true 23997 } 23998 // match: (Rsh16x64 x (Const64 [c])) 23999 // cond: uint64(c) >= 16 24000 // result: (SARWconst x [15]) 24001 for { 24002 _ = v.Args[1] 24003 x := v.Args[0] 24004 v_1 := v.Args[1] 24005 if v_1.Op != OpConst64 { 24006 break 24007 } 24008 c := v_1.AuxInt 24009 if !(uint64(c) >= 16) { 24010 break 24011 } 24012 v.reset(Op386SARWconst) 24013 v.AuxInt = 15 24014 v.AddArg(x) 24015 return true 24016 } 24017 return false 24018 } 24019 func rewriteValue386_OpRsh16x8_0(v *Value) bool { 24020 b := v.Block 24021 _ = b 24022 // match: (Rsh16x8 <t> x y) 24023 // cond: 24024 // result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16]))))) 24025 for { 24026 t := v.Type 24027 _ = v.Args[1] 24028 x := v.Args[0] 24029 y := v.Args[1] 24030 v.reset(Op386SARW) 24031 v.Type = t 24032 v.AddArg(x) 24033 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24034 v0.AddArg(y) 24035 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24036 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24037 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 24038 v3.AuxInt = 16 24039 v3.AddArg(y) 24040 v2.AddArg(v3) 24041 v1.AddArg(v2) 24042 v0.AddArg(v1) 24043 v.AddArg(v0) 24044 return true 24045 } 24046 } 24047 func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { 24048 b := v.Block 24049 _ = b 24050 // match: (Rsh32Ux16 <t> x y) 24051 // cond: 24052 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32]))) 24053 for { 24054 t := v.Type 24055 _ = v.Args[1] 24056 x := v.Args[0] 24057 y := v.Args[1] 24058 v.reset(Op386ANDL) 24059 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 24060 v0.AddArg(x) 24061 v0.AddArg(y) 24062 v.AddArg(v0) 24063 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 24064 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 24065 v2.AuxInt = 32 24066 v2.AddArg(y) 24067 v1.AddArg(v2) 24068 v.AddArg(v1) 24069 return true 24070 } 24071 } 24072 func rewriteValue386_OpRsh32Ux32_0(v *Value) bool { 24073 b := v.Block 24074 _ = b 24075 // match: (Rsh32Ux32 <t> x y) 24076 // cond: 24077 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32]))) 24078 for { 24079 t := v.Type 24080 _ = v.Args[1] 24081 x := v.Args[0] 24082 y := v.Args[1] 24083 v.reset(Op386ANDL) 24084 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 24085 v0.AddArg(x) 24086 v0.AddArg(y) 24087 v.AddArg(v0) 24088 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 24089 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 24090 v2.AuxInt = 32 24091 v2.AddArg(y) 24092 v1.AddArg(v2) 24093 v.AddArg(v1) 24094 return true 24095 } 24096 } 24097 func rewriteValue386_OpRsh32Ux64_0(v *Value) bool { 24098 // match: (Rsh32Ux64 x (Const64 [c])) 24099 // cond: uint64(c) < 32 24100 // result: (SHRLconst x [c]) 24101 for { 24102 _ = v.Args[1] 24103 x := v.Args[0] 24104 v_1 := v.Args[1] 24105 if v_1.Op != OpConst64 { 24106 break 24107 } 24108 c := v_1.AuxInt 24109 if !(uint64(c) < 32) { 24110 break 24111 } 24112 v.reset(Op386SHRLconst) 24113 v.AuxInt = c 24114 v.AddArg(x) 24115 return true 24116 } 24117 // match: (Rsh32Ux64 _ (Const64 [c])) 24118 // cond: uint64(c) >= 32 24119 // result: (Const32 [0]) 24120 for { 24121 _ = v.Args[1] 24122 v_1 := v.Args[1] 24123 if v_1.Op != OpConst64 { 24124 break 24125 } 24126 c := v_1.AuxInt 24127 if !(uint64(c) >= 32) { 24128 break 24129 } 24130 v.reset(OpConst32) 24131 v.AuxInt = 0 24132 return true 24133 } 24134 return false 24135 } 24136 func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { 24137 b := v.Block 24138 _ = b 24139 // match: (Rsh32Ux8 <t> x y) 24140 // cond: 24141 // result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32]))) 24142 for { 24143 t := v.Type 24144 _ = v.Args[1] 24145 x := v.Args[0] 24146 y := v.Args[1] 24147 v.reset(Op386ANDL) 24148 v0 := b.NewValue0(v.Pos, Op386SHRL, t) 24149 v0.AddArg(x) 24150 v0.AddArg(y) 24151 v.AddArg(v0) 24152 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 24153 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 24154 v2.AuxInt = 32 24155 v2.AddArg(y) 24156 v1.AddArg(v2) 24157 v.AddArg(v1) 24158 return true 24159 } 24160 } 24161 func rewriteValue386_OpRsh32x16_0(v *Value) bool { 24162 b := v.Block 24163 _ = b 24164 // match: (Rsh32x16 <t> x y) 24165 // cond: 24166 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32]))))) 24167 for { 24168 t := v.Type 24169 _ = v.Args[1] 24170 x := v.Args[0] 24171 y := v.Args[1] 24172 v.reset(Op386SARL) 24173 v.Type = t 24174 v.AddArg(x) 24175 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24176 v0.AddArg(y) 24177 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24178 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24179 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 24180 v3.AuxInt = 32 24181 v3.AddArg(y) 24182 v2.AddArg(v3) 24183 v1.AddArg(v2) 24184 v0.AddArg(v1) 24185 v.AddArg(v0) 24186 return true 24187 } 24188 } 24189 func rewriteValue386_OpRsh32x32_0(v *Value) bool { 24190 b := v.Block 24191 _ = b 24192 // match: (Rsh32x32 <t> x y) 24193 // cond: 24194 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32]))))) 24195 for { 24196 t := v.Type 24197 _ = v.Args[1] 24198 x := v.Args[0] 24199 y := v.Args[1] 24200 v.reset(Op386SARL) 24201 v.Type = t 24202 v.AddArg(x) 24203 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24204 v0.AddArg(y) 24205 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24206 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24207 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 24208 v3.AuxInt = 32 24209 v3.AddArg(y) 24210 v2.AddArg(v3) 24211 v1.AddArg(v2) 24212 v0.AddArg(v1) 24213 v.AddArg(v0) 24214 return true 24215 } 24216 } 24217 func rewriteValue386_OpRsh32x64_0(v *Value) bool { 24218 // match: (Rsh32x64 x (Const64 [c])) 24219 // cond: uint64(c) < 32 24220 // result: (SARLconst x [c]) 24221 for { 24222 _ = v.Args[1] 24223 x := v.Args[0] 24224 v_1 := v.Args[1] 24225 if v_1.Op != OpConst64 { 24226 break 24227 } 24228 c := v_1.AuxInt 24229 if !(uint64(c) < 32) { 24230 break 24231 } 24232 v.reset(Op386SARLconst) 24233 v.AuxInt = c 24234 v.AddArg(x) 24235 return true 24236 } 24237 // match: (Rsh32x64 x (Const64 [c])) 24238 // cond: uint64(c) >= 32 24239 // result: (SARLconst x [31]) 24240 for { 24241 _ = v.Args[1] 24242 x := v.Args[0] 24243 v_1 := v.Args[1] 24244 if v_1.Op != OpConst64 { 24245 break 24246 } 24247 c := v_1.AuxInt 24248 if !(uint64(c) >= 32) { 24249 break 24250 } 24251 v.reset(Op386SARLconst) 24252 v.AuxInt = 31 24253 v.AddArg(x) 24254 return true 24255 } 24256 return false 24257 } 24258 func rewriteValue386_OpRsh32x8_0(v *Value) bool { 24259 b := v.Block 24260 _ = b 24261 // match: (Rsh32x8 <t> x y) 24262 // cond: 24263 // result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32]))))) 24264 for { 24265 t := v.Type 24266 _ = v.Args[1] 24267 x := v.Args[0] 24268 y := v.Args[1] 24269 v.reset(Op386SARL) 24270 v.Type = t 24271 v.AddArg(x) 24272 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24273 v0.AddArg(y) 24274 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24275 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24276 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 24277 v3.AuxInt = 32 24278 v3.AddArg(y) 24279 v2.AddArg(v3) 24280 v1.AddArg(v2) 24281 v0.AddArg(v1) 24282 v.AddArg(v0) 24283 return true 24284 } 24285 } 24286 func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { 24287 b := v.Block 24288 _ = b 24289 // match: (Rsh8Ux16 <t> x y) 24290 // cond: 24291 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8]))) 24292 for { 24293 t := v.Type 24294 _ = v.Args[1] 24295 x := v.Args[0] 24296 y := v.Args[1] 24297 v.reset(Op386ANDL) 24298 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 24299 v0.AddArg(x) 24300 v0.AddArg(y) 24301 v.AddArg(v0) 24302 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 24303 v2 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 24304 v2.AuxInt = 8 24305 v2.AddArg(y) 24306 v1.AddArg(v2) 24307 v.AddArg(v1) 24308 return true 24309 } 24310 } 24311 func rewriteValue386_OpRsh8Ux32_0(v *Value) bool { 24312 b := v.Block 24313 _ = b 24314 // match: (Rsh8Ux32 <t> x y) 24315 // cond: 24316 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8]))) 24317 for { 24318 t := v.Type 24319 _ = v.Args[1] 24320 x := v.Args[0] 24321 y := v.Args[1] 24322 v.reset(Op386ANDL) 24323 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 24324 v0.AddArg(x) 24325 v0.AddArg(y) 24326 v.AddArg(v0) 24327 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 24328 v2 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 24329 v2.AuxInt = 8 24330 v2.AddArg(y) 24331 v1.AddArg(v2) 24332 v.AddArg(v1) 24333 return true 24334 } 24335 } 24336 func rewriteValue386_OpRsh8Ux64_0(v *Value) bool { 24337 // match: (Rsh8Ux64 x (Const64 [c])) 24338 // cond: uint64(c) < 8 24339 // result: (SHRBconst x [c]) 24340 for { 24341 _ = v.Args[1] 24342 x := v.Args[0] 24343 v_1 := v.Args[1] 24344 if v_1.Op != OpConst64 { 24345 break 24346 } 24347 c := v_1.AuxInt 24348 if !(uint64(c) < 8) { 24349 break 24350 } 24351 v.reset(Op386SHRBconst) 24352 v.AuxInt = c 24353 v.AddArg(x) 24354 return true 24355 } 24356 // match: (Rsh8Ux64 _ (Const64 [c])) 24357 // cond: uint64(c) >= 8 24358 // result: (Const8 [0]) 24359 for { 24360 _ = v.Args[1] 24361 v_1 := v.Args[1] 24362 if v_1.Op != OpConst64 { 24363 break 24364 } 24365 c := v_1.AuxInt 24366 if !(uint64(c) >= 8) { 24367 break 24368 } 24369 v.reset(OpConst8) 24370 v.AuxInt = 0 24371 return true 24372 } 24373 return false 24374 } 24375 func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { 24376 b := v.Block 24377 _ = b 24378 // match: (Rsh8Ux8 <t> x y) 24379 // cond: 24380 // result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8]))) 24381 for { 24382 t := v.Type 24383 _ = v.Args[1] 24384 x := v.Args[0] 24385 y := v.Args[1] 24386 v.reset(Op386ANDL) 24387 v0 := b.NewValue0(v.Pos, Op386SHRB, t) 24388 v0.AddArg(x) 24389 v0.AddArg(y) 24390 v.AddArg(v0) 24391 v1 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 24392 v2 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 24393 v2.AuxInt = 8 24394 v2.AddArg(y) 24395 v1.AddArg(v2) 24396 v.AddArg(v1) 24397 return true 24398 } 24399 } 24400 func rewriteValue386_OpRsh8x16_0(v *Value) bool { 24401 b := v.Block 24402 _ = b 24403 // match: (Rsh8x16 <t> x y) 24404 // cond: 24405 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8]))))) 24406 for { 24407 t := v.Type 24408 _ = v.Args[1] 24409 x := v.Args[0] 24410 y := v.Args[1] 24411 v.reset(Op386SARB) 24412 v.Type = t 24413 v.AddArg(x) 24414 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24415 v0.AddArg(y) 24416 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24417 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24418 v3 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) 24419 v3.AuxInt = 8 24420 v3.AddArg(y) 24421 v2.AddArg(v3) 24422 v1.AddArg(v2) 24423 v0.AddArg(v1) 24424 v.AddArg(v0) 24425 return true 24426 } 24427 } 24428 func rewriteValue386_OpRsh8x32_0(v *Value) bool { 24429 b := v.Block 24430 _ = b 24431 // match: (Rsh8x32 <t> x y) 24432 // cond: 24433 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8]))))) 24434 for { 24435 t := v.Type 24436 _ = v.Args[1] 24437 x := v.Args[0] 24438 y := v.Args[1] 24439 v.reset(Op386SARB) 24440 v.Type = t 24441 v.AddArg(x) 24442 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24443 v0.AddArg(y) 24444 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24445 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24446 v3 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 24447 v3.AuxInt = 8 24448 v3.AddArg(y) 24449 v2.AddArg(v3) 24450 v1.AddArg(v2) 24451 v0.AddArg(v1) 24452 v.AddArg(v0) 24453 return true 24454 } 24455 } 24456 func rewriteValue386_OpRsh8x64_0(v *Value) bool { 24457 // match: (Rsh8x64 x (Const64 [c])) 24458 // cond: uint64(c) < 8 24459 // result: (SARBconst x [c]) 24460 for { 24461 _ = v.Args[1] 24462 x := v.Args[0] 24463 v_1 := v.Args[1] 24464 if v_1.Op != OpConst64 { 24465 break 24466 } 24467 c := v_1.AuxInt 24468 if !(uint64(c) < 8) { 24469 break 24470 } 24471 v.reset(Op386SARBconst) 24472 v.AuxInt = c 24473 v.AddArg(x) 24474 return true 24475 } 24476 // match: (Rsh8x64 x (Const64 [c])) 24477 // cond: uint64(c) >= 8 24478 // result: (SARBconst x [7]) 24479 for { 24480 _ = v.Args[1] 24481 x := v.Args[0] 24482 v_1 := v.Args[1] 24483 if v_1.Op != OpConst64 { 24484 break 24485 } 24486 c := v_1.AuxInt 24487 if !(uint64(c) >= 8) { 24488 break 24489 } 24490 v.reset(Op386SARBconst) 24491 v.AuxInt = 7 24492 v.AddArg(x) 24493 return true 24494 } 24495 return false 24496 } 24497 func rewriteValue386_OpRsh8x8_0(v *Value) bool { 24498 b := v.Block 24499 _ = b 24500 // match: (Rsh8x8 <t> x y) 24501 // cond: 24502 // result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8]))))) 24503 for { 24504 t := v.Type 24505 _ = v.Args[1] 24506 x := v.Args[0] 24507 y := v.Args[1] 24508 v.reset(Op386SARB) 24509 v.Type = t 24510 v.AddArg(x) 24511 v0 := b.NewValue0(v.Pos, Op386ORL, y.Type) 24512 v0.AddArg(y) 24513 v1 := b.NewValue0(v.Pos, Op386NOTL, y.Type) 24514 v2 := b.NewValue0(v.Pos, Op386SBBLcarrymask, y.Type) 24515 v3 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) 24516 v3.AuxInt = 8 24517 v3.AddArg(y) 24518 v2.AddArg(v3) 24519 v1.AddArg(v2) 24520 v0.AddArg(v1) 24521 v.AddArg(v0) 24522 return true 24523 } 24524 } 24525 func rewriteValue386_OpSelect0_0(v *Value) bool { 24526 b := v.Block 24527 _ = b 24528 typ := &b.Func.Config.Types 24529 _ = typ 24530 // match: (Select0 (Mul32uover x y)) 24531 // cond: 24532 // result: (Select0 <typ.UInt32> (MULLU x y)) 24533 for { 24534 v_0 := v.Args[0] 24535 if v_0.Op != OpMul32uover { 24536 break 24537 } 24538 _ = v_0.Args[1] 24539 x := v_0.Args[0] 24540 y := v_0.Args[1] 24541 v.reset(OpSelect0) 24542 v.Type = typ.UInt32 24543 v0 := b.NewValue0(v.Pos, Op386MULLU, types.NewTuple(typ.UInt32, types.TypeFlags)) 24544 v0.AddArg(x) 24545 v0.AddArg(y) 24546 v.AddArg(v0) 24547 return true 24548 } 24549 return false 24550 } 24551 func rewriteValue386_OpSelect1_0(v *Value) bool { 24552 b := v.Block 24553 _ = b 24554 typ := &b.Func.Config.Types 24555 _ = typ 24556 // match: (Select1 (Mul32uover x y)) 24557 // cond: 24558 // result: (SETO (Select1 <types.TypeFlags> (MULLU x y))) 24559 for { 24560 v_0 := v.Args[0] 24561 if v_0.Op != OpMul32uover { 24562 break 24563 } 24564 _ = v_0.Args[1] 24565 x := v_0.Args[0] 24566 y := v_0.Args[1] 24567 v.reset(Op386SETO) 24568 v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) 24569 v1 := b.NewValue0(v.Pos, Op386MULLU, types.NewTuple(typ.UInt32, types.TypeFlags)) 24570 v1.AddArg(x) 24571 v1.AddArg(y) 24572 v0.AddArg(v1) 24573 v.AddArg(v0) 24574 return true 24575 } 24576 return false 24577 } 24578 func rewriteValue386_OpSignExt16to32_0(v *Value) bool { 24579 // match: (SignExt16to32 x) 24580 // cond: 24581 // result: (MOVWLSX x) 24582 for { 24583 x := v.Args[0] 24584 v.reset(Op386MOVWLSX) 24585 v.AddArg(x) 24586 return true 24587 } 24588 } 24589 func rewriteValue386_OpSignExt8to16_0(v *Value) bool { 24590 // match: (SignExt8to16 x) 24591 // cond: 24592 // result: (MOVBLSX x) 24593 for { 24594 x := v.Args[0] 24595 v.reset(Op386MOVBLSX) 24596 v.AddArg(x) 24597 return true 24598 } 24599 } 24600 func rewriteValue386_OpSignExt8to32_0(v *Value) bool { 24601 // match: (SignExt8to32 x) 24602 // cond: 24603 // result: (MOVBLSX x) 24604 for { 24605 x := v.Args[0] 24606 v.reset(Op386MOVBLSX) 24607 v.AddArg(x) 24608 return true 24609 } 24610 } 24611 func rewriteValue386_OpSignmask_0(v *Value) bool { 24612 // match: (Signmask x) 24613 // cond: 24614 // result: (SARLconst x [31]) 24615 for { 24616 x := v.Args[0] 24617 v.reset(Op386SARLconst) 24618 v.AuxInt = 31 24619 v.AddArg(x) 24620 return true 24621 } 24622 } 24623 func rewriteValue386_OpSlicemask_0(v *Value) bool { 24624 b := v.Block 24625 _ = b 24626 // match: (Slicemask <t> x) 24627 // cond: 24628 // result: (SARLconst (NEGL <t> x) [31]) 24629 for { 24630 t := v.Type 24631 x := v.Args[0] 24632 v.reset(Op386SARLconst) 24633 v.AuxInt = 31 24634 v0 := b.NewValue0(v.Pos, Op386NEGL, t) 24635 v0.AddArg(x) 24636 v.AddArg(v0) 24637 return true 24638 } 24639 } 24640 func rewriteValue386_OpSqrt_0(v *Value) bool { 24641 // match: (Sqrt x) 24642 // cond: 24643 // result: (SQRTSD x) 24644 for { 24645 x := v.Args[0] 24646 v.reset(Op386SQRTSD) 24647 v.AddArg(x) 24648 return true 24649 } 24650 } 24651 func rewriteValue386_OpStaticCall_0(v *Value) bool { 24652 // match: (StaticCall [argwid] {target} mem) 24653 // cond: 24654 // result: (CALLstatic [argwid] {target} mem) 24655 for { 24656 argwid := v.AuxInt 24657 target := v.Aux 24658 mem := v.Args[0] 24659 v.reset(Op386CALLstatic) 24660 v.AuxInt = argwid 24661 v.Aux = target 24662 v.AddArg(mem) 24663 return true 24664 } 24665 } 24666 func rewriteValue386_OpStore_0(v *Value) bool { 24667 // match: (Store {t} ptr val mem) 24668 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 24669 // result: (MOVSDstore ptr val mem) 24670 for { 24671 t := v.Aux 24672 _ = v.Args[2] 24673 ptr := v.Args[0] 24674 val := v.Args[1] 24675 mem := v.Args[2] 24676 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 24677 break 24678 } 24679 v.reset(Op386MOVSDstore) 24680 v.AddArg(ptr) 24681 v.AddArg(val) 24682 v.AddArg(mem) 24683 return true 24684 } 24685 // match: (Store {t} ptr val mem) 24686 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 24687 // result: (MOVSSstore ptr val mem) 24688 for { 24689 t := v.Aux 24690 _ = v.Args[2] 24691 ptr := v.Args[0] 24692 val := v.Args[1] 24693 mem := v.Args[2] 24694 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 24695 break 24696 } 24697 v.reset(Op386MOVSSstore) 24698 v.AddArg(ptr) 24699 v.AddArg(val) 24700 v.AddArg(mem) 24701 return true 24702 } 24703 // match: (Store {t} ptr val mem) 24704 // cond: t.(*types.Type).Size() == 4 24705 // result: (MOVLstore ptr val mem) 24706 for { 24707 t := v.Aux 24708 _ = v.Args[2] 24709 ptr := v.Args[0] 24710 val := v.Args[1] 24711 mem := v.Args[2] 24712 if !(t.(*types.Type).Size() == 4) { 24713 break 24714 } 24715 v.reset(Op386MOVLstore) 24716 v.AddArg(ptr) 24717 v.AddArg(val) 24718 v.AddArg(mem) 24719 return true 24720 } 24721 // match: (Store {t} ptr val mem) 24722 // cond: t.(*types.Type).Size() == 2 24723 // result: (MOVWstore ptr val mem) 24724 for { 24725 t := v.Aux 24726 _ = v.Args[2] 24727 ptr := v.Args[0] 24728 val := v.Args[1] 24729 mem := v.Args[2] 24730 if !(t.(*types.Type).Size() == 2) { 24731 break 24732 } 24733 v.reset(Op386MOVWstore) 24734 v.AddArg(ptr) 24735 v.AddArg(val) 24736 v.AddArg(mem) 24737 return true 24738 } 24739 // match: (Store {t} ptr val mem) 24740 // cond: t.(*types.Type).Size() == 1 24741 // result: (MOVBstore ptr val mem) 24742 for { 24743 t := v.Aux 24744 _ = v.Args[2] 24745 ptr := v.Args[0] 24746 val := v.Args[1] 24747 mem := v.Args[2] 24748 if !(t.(*types.Type).Size() == 1) { 24749 break 24750 } 24751 v.reset(Op386MOVBstore) 24752 v.AddArg(ptr) 24753 v.AddArg(val) 24754 v.AddArg(mem) 24755 return true 24756 } 24757 return false 24758 } 24759 func rewriteValue386_OpSub16_0(v *Value) bool { 24760 // match: (Sub16 x y) 24761 // cond: 24762 // result: (SUBL x y) 24763 for { 24764 _ = v.Args[1] 24765 x := v.Args[0] 24766 y := v.Args[1] 24767 v.reset(Op386SUBL) 24768 v.AddArg(x) 24769 v.AddArg(y) 24770 return true 24771 } 24772 } 24773 func rewriteValue386_OpSub32_0(v *Value) bool { 24774 // match: (Sub32 x y) 24775 // cond: 24776 // result: (SUBL x y) 24777 for { 24778 _ = v.Args[1] 24779 x := v.Args[0] 24780 y := v.Args[1] 24781 v.reset(Op386SUBL) 24782 v.AddArg(x) 24783 v.AddArg(y) 24784 return true 24785 } 24786 } 24787 func rewriteValue386_OpSub32F_0(v *Value) bool { 24788 // match: (Sub32F x y) 24789 // cond: 24790 // result: (SUBSS x y) 24791 for { 24792 _ = v.Args[1] 24793 x := v.Args[0] 24794 y := v.Args[1] 24795 v.reset(Op386SUBSS) 24796 v.AddArg(x) 24797 v.AddArg(y) 24798 return true 24799 } 24800 } 24801 func rewriteValue386_OpSub32carry_0(v *Value) bool { 24802 // match: (Sub32carry x y) 24803 // cond: 24804 // result: (SUBLcarry x y) 24805 for { 24806 _ = v.Args[1] 24807 x := v.Args[0] 24808 y := v.Args[1] 24809 v.reset(Op386SUBLcarry) 24810 v.AddArg(x) 24811 v.AddArg(y) 24812 return true 24813 } 24814 } 24815 func rewriteValue386_OpSub32withcarry_0(v *Value) bool { 24816 // match: (Sub32withcarry x y c) 24817 // cond: 24818 // result: (SBBL x y c) 24819 for { 24820 _ = v.Args[2] 24821 x := v.Args[0] 24822 y := v.Args[1] 24823 c := v.Args[2] 24824 v.reset(Op386SBBL) 24825 v.AddArg(x) 24826 v.AddArg(y) 24827 v.AddArg(c) 24828 return true 24829 } 24830 } 24831 func rewriteValue386_OpSub64F_0(v *Value) bool { 24832 // match: (Sub64F x y) 24833 // cond: 24834 // result: (SUBSD x y) 24835 for { 24836 _ = v.Args[1] 24837 x := v.Args[0] 24838 y := v.Args[1] 24839 v.reset(Op386SUBSD) 24840 v.AddArg(x) 24841 v.AddArg(y) 24842 return true 24843 } 24844 } 24845 func rewriteValue386_OpSub8_0(v *Value) bool { 24846 // match: (Sub8 x y) 24847 // cond: 24848 // result: (SUBL x y) 24849 for { 24850 _ = v.Args[1] 24851 x := v.Args[0] 24852 y := v.Args[1] 24853 v.reset(Op386SUBL) 24854 v.AddArg(x) 24855 v.AddArg(y) 24856 return true 24857 } 24858 } 24859 func rewriteValue386_OpSubPtr_0(v *Value) bool { 24860 // match: (SubPtr x y) 24861 // cond: 24862 // result: (SUBL x y) 24863 for { 24864 _ = v.Args[1] 24865 x := v.Args[0] 24866 y := v.Args[1] 24867 v.reset(Op386SUBL) 24868 v.AddArg(x) 24869 v.AddArg(y) 24870 return true 24871 } 24872 } 24873 func rewriteValue386_OpTrunc16to8_0(v *Value) bool { 24874 // match: (Trunc16to8 x) 24875 // cond: 24876 // result: x 24877 for { 24878 x := v.Args[0] 24879 v.reset(OpCopy) 24880 v.Type = x.Type 24881 v.AddArg(x) 24882 return true 24883 } 24884 } 24885 func rewriteValue386_OpTrunc32to16_0(v *Value) bool { 24886 // match: (Trunc32to16 x) 24887 // cond: 24888 // result: x 24889 for { 24890 x := v.Args[0] 24891 v.reset(OpCopy) 24892 v.Type = x.Type 24893 v.AddArg(x) 24894 return true 24895 } 24896 } 24897 func rewriteValue386_OpTrunc32to8_0(v *Value) bool { 24898 // match: (Trunc32to8 x) 24899 // cond: 24900 // result: x 24901 for { 24902 x := v.Args[0] 24903 v.reset(OpCopy) 24904 v.Type = x.Type 24905 v.AddArg(x) 24906 return true 24907 } 24908 } 24909 func rewriteValue386_OpWB_0(v *Value) bool { 24910 // match: (WB {fn} destptr srcptr mem) 24911 // cond: 24912 // result: (LoweredWB {fn} destptr srcptr mem) 24913 for { 24914 fn := v.Aux 24915 _ = v.Args[2] 24916 destptr := v.Args[0] 24917 srcptr := v.Args[1] 24918 mem := v.Args[2] 24919 v.reset(Op386LoweredWB) 24920 v.Aux = fn 24921 v.AddArg(destptr) 24922 v.AddArg(srcptr) 24923 v.AddArg(mem) 24924 return true 24925 } 24926 } 24927 func rewriteValue386_OpXor16_0(v *Value) bool { 24928 // match: (Xor16 x y) 24929 // cond: 24930 // result: (XORL x y) 24931 for { 24932 _ = v.Args[1] 24933 x := v.Args[0] 24934 y := v.Args[1] 24935 v.reset(Op386XORL) 24936 v.AddArg(x) 24937 v.AddArg(y) 24938 return true 24939 } 24940 } 24941 func rewriteValue386_OpXor32_0(v *Value) bool { 24942 // match: (Xor32 x y) 24943 // cond: 24944 // result: (XORL x y) 24945 for { 24946 _ = v.Args[1] 24947 x := v.Args[0] 24948 y := v.Args[1] 24949 v.reset(Op386XORL) 24950 v.AddArg(x) 24951 v.AddArg(y) 24952 return true 24953 } 24954 } 24955 func rewriteValue386_OpXor8_0(v *Value) bool { 24956 // match: (Xor8 x y) 24957 // cond: 24958 // result: (XORL x y) 24959 for { 24960 _ = v.Args[1] 24961 x := v.Args[0] 24962 y := v.Args[1] 24963 v.reset(Op386XORL) 24964 v.AddArg(x) 24965 v.AddArg(y) 24966 return true 24967 } 24968 } 24969 func rewriteValue386_OpZero_0(v *Value) bool { 24970 b := v.Block 24971 _ = b 24972 typ := &b.Func.Config.Types 24973 _ = typ 24974 // match: (Zero [0] _ mem) 24975 // cond: 24976 // result: mem 24977 for { 24978 if v.AuxInt != 0 { 24979 break 24980 } 24981 _ = v.Args[1] 24982 mem := v.Args[1] 24983 v.reset(OpCopy) 24984 v.Type = mem.Type 24985 v.AddArg(mem) 24986 return true 24987 } 24988 // match: (Zero [1] destptr mem) 24989 // cond: 24990 // result: (MOVBstoreconst [0] destptr mem) 24991 for { 24992 if v.AuxInt != 1 { 24993 break 24994 } 24995 _ = v.Args[1] 24996 destptr := v.Args[0] 24997 mem := v.Args[1] 24998 v.reset(Op386MOVBstoreconst) 24999 v.AuxInt = 0 25000 v.AddArg(destptr) 25001 v.AddArg(mem) 25002 return true 25003 } 25004 // match: (Zero [2] destptr mem) 25005 // cond: 25006 // result: (MOVWstoreconst [0] destptr mem) 25007 for { 25008 if v.AuxInt != 2 { 25009 break 25010 } 25011 _ = v.Args[1] 25012 destptr := v.Args[0] 25013 mem := v.Args[1] 25014 v.reset(Op386MOVWstoreconst) 25015 v.AuxInt = 0 25016 v.AddArg(destptr) 25017 v.AddArg(mem) 25018 return true 25019 } 25020 // match: (Zero [4] destptr mem) 25021 // cond: 25022 // result: (MOVLstoreconst [0] destptr mem) 25023 for { 25024 if v.AuxInt != 4 { 25025 break 25026 } 25027 _ = v.Args[1] 25028 destptr := v.Args[0] 25029 mem := v.Args[1] 25030 v.reset(Op386MOVLstoreconst) 25031 v.AuxInt = 0 25032 v.AddArg(destptr) 25033 v.AddArg(mem) 25034 return true 25035 } 25036 // match: (Zero [3] destptr mem) 25037 // cond: 25038 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVWstoreconst [0] destptr mem)) 25039 for { 25040 if v.AuxInt != 3 { 25041 break 25042 } 25043 _ = v.Args[1] 25044 destptr := v.Args[0] 25045 mem := v.Args[1] 25046 v.reset(Op386MOVBstoreconst) 25047 v.AuxInt = makeValAndOff(0, 2) 25048 v.AddArg(destptr) 25049 v0 := b.NewValue0(v.Pos, Op386MOVWstoreconst, types.TypeMem) 25050 v0.AuxInt = 0 25051 v0.AddArg(destptr) 25052 v0.AddArg(mem) 25053 v.AddArg(v0) 25054 return true 25055 } 25056 // match: (Zero [5] destptr mem) 25057 // cond: 25058 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 25059 for { 25060 if v.AuxInt != 5 { 25061 break 25062 } 25063 _ = v.Args[1] 25064 destptr := v.Args[0] 25065 mem := v.Args[1] 25066 v.reset(Op386MOVBstoreconst) 25067 v.AuxInt = makeValAndOff(0, 4) 25068 v.AddArg(destptr) 25069 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25070 v0.AuxInt = 0 25071 v0.AddArg(destptr) 25072 v0.AddArg(mem) 25073 v.AddArg(v0) 25074 return true 25075 } 25076 // match: (Zero [6] destptr mem) 25077 // cond: 25078 // result: (MOVWstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 25079 for { 25080 if v.AuxInt != 6 { 25081 break 25082 } 25083 _ = v.Args[1] 25084 destptr := v.Args[0] 25085 mem := v.Args[1] 25086 v.reset(Op386MOVWstoreconst) 25087 v.AuxInt = makeValAndOff(0, 4) 25088 v.AddArg(destptr) 25089 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25090 v0.AuxInt = 0 25091 v0.AddArg(destptr) 25092 v0.AddArg(mem) 25093 v.AddArg(v0) 25094 return true 25095 } 25096 // match: (Zero [7] destptr mem) 25097 // cond: 25098 // result: (MOVLstoreconst [makeValAndOff(0,3)] destptr (MOVLstoreconst [0] destptr mem)) 25099 for { 25100 if v.AuxInt != 7 { 25101 break 25102 } 25103 _ = v.Args[1] 25104 destptr := v.Args[0] 25105 mem := v.Args[1] 25106 v.reset(Op386MOVLstoreconst) 25107 v.AuxInt = makeValAndOff(0, 3) 25108 v.AddArg(destptr) 25109 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25110 v0.AuxInt = 0 25111 v0.AddArg(destptr) 25112 v0.AddArg(mem) 25113 v.AddArg(v0) 25114 return true 25115 } 25116 // match: (Zero [s] destptr mem) 25117 // cond: s%4 != 0 && s > 4 25118 // result: (Zero [s-s%4] (ADDLconst destptr [s%4]) (MOVLstoreconst [0] destptr mem)) 25119 for { 25120 s := v.AuxInt 25121 _ = v.Args[1] 25122 destptr := v.Args[0] 25123 mem := v.Args[1] 25124 if !(s%4 != 0 && s > 4) { 25125 break 25126 } 25127 v.reset(OpZero) 25128 v.AuxInt = s - s%4 25129 v0 := b.NewValue0(v.Pos, Op386ADDLconst, typ.UInt32) 25130 v0.AuxInt = s % 4 25131 v0.AddArg(destptr) 25132 v.AddArg(v0) 25133 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25134 v1.AuxInt = 0 25135 v1.AddArg(destptr) 25136 v1.AddArg(mem) 25137 v.AddArg(v1) 25138 return true 25139 } 25140 // match: (Zero [8] destptr mem) 25141 // cond: 25142 // result: (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)) 25143 for { 25144 if v.AuxInt != 8 { 25145 break 25146 } 25147 _ = v.Args[1] 25148 destptr := v.Args[0] 25149 mem := v.Args[1] 25150 v.reset(Op386MOVLstoreconst) 25151 v.AuxInt = makeValAndOff(0, 4) 25152 v.AddArg(destptr) 25153 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25154 v0.AuxInt = 0 25155 v0.AddArg(destptr) 25156 v0.AddArg(mem) 25157 v.AddArg(v0) 25158 return true 25159 } 25160 return false 25161 } 25162 func rewriteValue386_OpZero_10(v *Value) bool { 25163 b := v.Block 25164 _ = b 25165 config := b.Func.Config 25166 _ = config 25167 typ := &b.Func.Config.Types 25168 _ = typ 25169 // match: (Zero [12] destptr mem) 25170 // cond: 25171 // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) 25172 for { 25173 if v.AuxInt != 12 { 25174 break 25175 } 25176 _ = v.Args[1] 25177 destptr := v.Args[0] 25178 mem := v.Args[1] 25179 v.reset(Op386MOVLstoreconst) 25180 v.AuxInt = makeValAndOff(0, 8) 25181 v.AddArg(destptr) 25182 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25183 v0.AuxInt = makeValAndOff(0, 4) 25184 v0.AddArg(destptr) 25185 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25186 v1.AuxInt = 0 25187 v1.AddArg(destptr) 25188 v1.AddArg(mem) 25189 v0.AddArg(v1) 25190 v.AddArg(v0) 25191 return true 25192 } 25193 // match: (Zero [16] destptr mem) 25194 // cond: 25195 // result: (MOVLstoreconst [makeValAndOff(0,12)] destptr (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem)))) 25196 for { 25197 if v.AuxInt != 16 { 25198 break 25199 } 25200 _ = v.Args[1] 25201 destptr := v.Args[0] 25202 mem := v.Args[1] 25203 v.reset(Op386MOVLstoreconst) 25204 v.AuxInt = makeValAndOff(0, 12) 25205 v.AddArg(destptr) 25206 v0 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25207 v0.AuxInt = makeValAndOff(0, 8) 25208 v0.AddArg(destptr) 25209 v1 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25210 v1.AuxInt = makeValAndOff(0, 4) 25211 v1.AddArg(destptr) 25212 v2 := b.NewValue0(v.Pos, Op386MOVLstoreconst, types.TypeMem) 25213 v2.AuxInt = 0 25214 v2.AddArg(destptr) 25215 v2.AddArg(mem) 25216 v1.AddArg(v2) 25217 v0.AddArg(v1) 25218 v.AddArg(v0) 25219 return true 25220 } 25221 // match: (Zero [s] destptr mem) 25222 // cond: s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice 25223 // result: (DUFFZERO [1*(128-s/4)] destptr (MOVLconst [0]) mem) 25224 for { 25225 s := v.AuxInt 25226 _ = v.Args[1] 25227 destptr := v.Args[0] 25228 mem := v.Args[1] 25229 if !(s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { 25230 break 25231 } 25232 v.reset(Op386DUFFZERO) 25233 v.AuxInt = 1 * (128 - s/4) 25234 v.AddArg(destptr) 25235 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 25236 v0.AuxInt = 0 25237 v.AddArg(v0) 25238 v.AddArg(mem) 25239 return true 25240 } 25241 // match: (Zero [s] destptr mem) 25242 // cond: (s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0 25243 // result: (REPSTOSL destptr (MOVLconst [s/4]) (MOVLconst [0]) mem) 25244 for { 25245 s := v.AuxInt 25246 _ = v.Args[1] 25247 destptr := v.Args[0] 25248 mem := v.Args[1] 25249 if !((s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0) { 25250 break 25251 } 25252 v.reset(Op386REPSTOSL) 25253 v.AddArg(destptr) 25254 v0 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 25255 v0.AuxInt = s / 4 25256 v.AddArg(v0) 25257 v1 := b.NewValue0(v.Pos, Op386MOVLconst, typ.UInt32) 25258 v1.AuxInt = 0 25259 v.AddArg(v1) 25260 v.AddArg(mem) 25261 return true 25262 } 25263 return false 25264 } 25265 func rewriteValue386_OpZeroExt16to32_0(v *Value) bool { 25266 // match: (ZeroExt16to32 x) 25267 // cond: 25268 // result: (MOVWLZX x) 25269 for { 25270 x := v.Args[0] 25271 v.reset(Op386MOVWLZX) 25272 v.AddArg(x) 25273 return true 25274 } 25275 } 25276 func rewriteValue386_OpZeroExt8to16_0(v *Value) bool { 25277 // match: (ZeroExt8to16 x) 25278 // cond: 25279 // result: (MOVBLZX x) 25280 for { 25281 x := v.Args[0] 25282 v.reset(Op386MOVBLZX) 25283 v.AddArg(x) 25284 return true 25285 } 25286 } 25287 func rewriteValue386_OpZeroExt8to32_0(v *Value) bool { 25288 // match: (ZeroExt8to32 x) 25289 // cond: 25290 // result: (MOVBLZX x) 25291 for { 25292 x := v.Args[0] 25293 v.reset(Op386MOVBLZX) 25294 v.AddArg(x) 25295 return true 25296 } 25297 } 25298 func rewriteValue386_OpZeromask_0(v *Value) bool { 25299 b := v.Block 25300 _ = b 25301 // match: (Zeromask <t> x) 25302 // cond: 25303 // result: (XORLconst [-1] (SBBLcarrymask <t> (CMPLconst x [1]))) 25304 for { 25305 t := v.Type 25306 x := v.Args[0] 25307 v.reset(Op386XORLconst) 25308 v.AuxInt = -1 25309 v0 := b.NewValue0(v.Pos, Op386SBBLcarrymask, t) 25310 v1 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) 25311 v1.AuxInt = 1 25312 v1.AddArg(x) 25313 v0.AddArg(v1) 25314 v.AddArg(v0) 25315 return true 25316 } 25317 } 25318 func rewriteBlock386(b *Block) bool { 25319 config := b.Func.Config 25320 _ = config 25321 fe := b.Func.fe 25322 _ = fe 25323 typ := &config.Types 25324 _ = typ 25325 switch b.Kind { 25326 case Block386EQ: 25327 // match: (EQ (InvertFlags cmp) yes no) 25328 // cond: 25329 // result: (EQ cmp yes no) 25330 for { 25331 v := b.Control 25332 if v.Op != Op386InvertFlags { 25333 break 25334 } 25335 cmp := v.Args[0] 25336 b.Kind = Block386EQ 25337 b.SetControl(cmp) 25338 b.Aux = nil 25339 return true 25340 } 25341 // match: (EQ (FlagEQ) yes no) 25342 // cond: 25343 // result: (First nil yes no) 25344 for { 25345 v := b.Control 25346 if v.Op != Op386FlagEQ { 25347 break 25348 } 25349 b.Kind = BlockFirst 25350 b.SetControl(nil) 25351 b.Aux = nil 25352 return true 25353 } 25354 // match: (EQ (FlagLT_ULT) yes no) 25355 // cond: 25356 // result: (First nil no yes) 25357 for { 25358 v := b.Control 25359 if v.Op != Op386FlagLT_ULT { 25360 break 25361 } 25362 b.Kind = BlockFirst 25363 b.SetControl(nil) 25364 b.Aux = nil 25365 b.swapSuccessors() 25366 return true 25367 } 25368 // match: (EQ (FlagLT_UGT) yes no) 25369 // cond: 25370 // result: (First nil no yes) 25371 for { 25372 v := b.Control 25373 if v.Op != Op386FlagLT_UGT { 25374 break 25375 } 25376 b.Kind = BlockFirst 25377 b.SetControl(nil) 25378 b.Aux = nil 25379 b.swapSuccessors() 25380 return true 25381 } 25382 // match: (EQ (FlagGT_ULT) yes no) 25383 // cond: 25384 // result: (First nil no yes) 25385 for { 25386 v := b.Control 25387 if v.Op != Op386FlagGT_ULT { 25388 break 25389 } 25390 b.Kind = BlockFirst 25391 b.SetControl(nil) 25392 b.Aux = nil 25393 b.swapSuccessors() 25394 return true 25395 } 25396 // match: (EQ (FlagGT_UGT) yes no) 25397 // cond: 25398 // result: (First nil no yes) 25399 for { 25400 v := b.Control 25401 if v.Op != Op386FlagGT_UGT { 25402 break 25403 } 25404 b.Kind = BlockFirst 25405 b.SetControl(nil) 25406 b.Aux = nil 25407 b.swapSuccessors() 25408 return true 25409 } 25410 case Block386GE: 25411 // match: (GE (InvertFlags cmp) yes no) 25412 // cond: 25413 // result: (LE cmp yes no) 25414 for { 25415 v := b.Control 25416 if v.Op != Op386InvertFlags { 25417 break 25418 } 25419 cmp := v.Args[0] 25420 b.Kind = Block386LE 25421 b.SetControl(cmp) 25422 b.Aux = nil 25423 return true 25424 } 25425 // match: (GE (FlagEQ) yes no) 25426 // cond: 25427 // result: (First nil yes no) 25428 for { 25429 v := b.Control 25430 if v.Op != Op386FlagEQ { 25431 break 25432 } 25433 b.Kind = BlockFirst 25434 b.SetControl(nil) 25435 b.Aux = nil 25436 return true 25437 } 25438 // match: (GE (FlagLT_ULT) yes no) 25439 // cond: 25440 // result: (First nil no yes) 25441 for { 25442 v := b.Control 25443 if v.Op != Op386FlagLT_ULT { 25444 break 25445 } 25446 b.Kind = BlockFirst 25447 b.SetControl(nil) 25448 b.Aux = nil 25449 b.swapSuccessors() 25450 return true 25451 } 25452 // match: (GE (FlagLT_UGT) yes no) 25453 // cond: 25454 // result: (First nil no yes) 25455 for { 25456 v := b.Control 25457 if v.Op != Op386FlagLT_UGT { 25458 break 25459 } 25460 b.Kind = BlockFirst 25461 b.SetControl(nil) 25462 b.Aux = nil 25463 b.swapSuccessors() 25464 return true 25465 } 25466 // match: (GE (FlagGT_ULT) yes no) 25467 // cond: 25468 // result: (First nil yes no) 25469 for { 25470 v := b.Control 25471 if v.Op != Op386FlagGT_ULT { 25472 break 25473 } 25474 b.Kind = BlockFirst 25475 b.SetControl(nil) 25476 b.Aux = nil 25477 return true 25478 } 25479 // match: (GE (FlagGT_UGT) yes no) 25480 // cond: 25481 // result: (First nil yes no) 25482 for { 25483 v := b.Control 25484 if v.Op != Op386FlagGT_UGT { 25485 break 25486 } 25487 b.Kind = BlockFirst 25488 b.SetControl(nil) 25489 b.Aux = nil 25490 return true 25491 } 25492 case Block386GT: 25493 // match: (GT (InvertFlags cmp) yes no) 25494 // cond: 25495 // result: (LT cmp yes no) 25496 for { 25497 v := b.Control 25498 if v.Op != Op386InvertFlags { 25499 break 25500 } 25501 cmp := v.Args[0] 25502 b.Kind = Block386LT 25503 b.SetControl(cmp) 25504 b.Aux = nil 25505 return true 25506 } 25507 // match: (GT (FlagEQ) yes no) 25508 // cond: 25509 // result: (First nil no yes) 25510 for { 25511 v := b.Control 25512 if v.Op != Op386FlagEQ { 25513 break 25514 } 25515 b.Kind = BlockFirst 25516 b.SetControl(nil) 25517 b.Aux = nil 25518 b.swapSuccessors() 25519 return true 25520 } 25521 // match: (GT (FlagLT_ULT) yes no) 25522 // cond: 25523 // result: (First nil no yes) 25524 for { 25525 v := b.Control 25526 if v.Op != Op386FlagLT_ULT { 25527 break 25528 } 25529 b.Kind = BlockFirst 25530 b.SetControl(nil) 25531 b.Aux = nil 25532 b.swapSuccessors() 25533 return true 25534 } 25535 // match: (GT (FlagLT_UGT) yes no) 25536 // cond: 25537 // result: (First nil no yes) 25538 for { 25539 v := b.Control 25540 if v.Op != Op386FlagLT_UGT { 25541 break 25542 } 25543 b.Kind = BlockFirst 25544 b.SetControl(nil) 25545 b.Aux = nil 25546 b.swapSuccessors() 25547 return true 25548 } 25549 // match: (GT (FlagGT_ULT) yes no) 25550 // cond: 25551 // result: (First nil yes no) 25552 for { 25553 v := b.Control 25554 if v.Op != Op386FlagGT_ULT { 25555 break 25556 } 25557 b.Kind = BlockFirst 25558 b.SetControl(nil) 25559 b.Aux = nil 25560 return true 25561 } 25562 // match: (GT (FlagGT_UGT) yes no) 25563 // cond: 25564 // result: (First nil yes no) 25565 for { 25566 v := b.Control 25567 if v.Op != Op386FlagGT_UGT { 25568 break 25569 } 25570 b.Kind = BlockFirst 25571 b.SetControl(nil) 25572 b.Aux = nil 25573 return true 25574 } 25575 case BlockIf: 25576 // match: (If (SETL cmp) yes no) 25577 // cond: 25578 // result: (LT cmp yes no) 25579 for { 25580 v := b.Control 25581 if v.Op != Op386SETL { 25582 break 25583 } 25584 cmp := v.Args[0] 25585 b.Kind = Block386LT 25586 b.SetControl(cmp) 25587 b.Aux = nil 25588 return true 25589 } 25590 // match: (If (SETLE cmp) yes no) 25591 // cond: 25592 // result: (LE cmp yes no) 25593 for { 25594 v := b.Control 25595 if v.Op != Op386SETLE { 25596 break 25597 } 25598 cmp := v.Args[0] 25599 b.Kind = Block386LE 25600 b.SetControl(cmp) 25601 b.Aux = nil 25602 return true 25603 } 25604 // match: (If (SETG cmp) yes no) 25605 // cond: 25606 // result: (GT cmp yes no) 25607 for { 25608 v := b.Control 25609 if v.Op != Op386SETG { 25610 break 25611 } 25612 cmp := v.Args[0] 25613 b.Kind = Block386GT 25614 b.SetControl(cmp) 25615 b.Aux = nil 25616 return true 25617 } 25618 // match: (If (SETGE cmp) yes no) 25619 // cond: 25620 // result: (GE cmp yes no) 25621 for { 25622 v := b.Control 25623 if v.Op != Op386SETGE { 25624 break 25625 } 25626 cmp := v.Args[0] 25627 b.Kind = Block386GE 25628 b.SetControl(cmp) 25629 b.Aux = nil 25630 return true 25631 } 25632 // match: (If (SETEQ cmp) yes no) 25633 // cond: 25634 // result: (EQ cmp yes no) 25635 for { 25636 v := b.Control 25637 if v.Op != Op386SETEQ { 25638 break 25639 } 25640 cmp := v.Args[0] 25641 b.Kind = Block386EQ 25642 b.SetControl(cmp) 25643 b.Aux = nil 25644 return true 25645 } 25646 // match: (If (SETNE cmp) yes no) 25647 // cond: 25648 // result: (NE cmp yes no) 25649 for { 25650 v := b.Control 25651 if v.Op != Op386SETNE { 25652 break 25653 } 25654 cmp := v.Args[0] 25655 b.Kind = Block386NE 25656 b.SetControl(cmp) 25657 b.Aux = nil 25658 return true 25659 } 25660 // match: (If (SETB cmp) yes no) 25661 // cond: 25662 // result: (ULT cmp yes no) 25663 for { 25664 v := b.Control 25665 if v.Op != Op386SETB { 25666 break 25667 } 25668 cmp := v.Args[0] 25669 b.Kind = Block386ULT 25670 b.SetControl(cmp) 25671 b.Aux = nil 25672 return true 25673 } 25674 // match: (If (SETBE cmp) yes no) 25675 // cond: 25676 // result: (ULE cmp yes no) 25677 for { 25678 v := b.Control 25679 if v.Op != Op386SETBE { 25680 break 25681 } 25682 cmp := v.Args[0] 25683 b.Kind = Block386ULE 25684 b.SetControl(cmp) 25685 b.Aux = nil 25686 return true 25687 } 25688 // match: (If (SETA cmp) yes no) 25689 // cond: 25690 // result: (UGT cmp yes no) 25691 for { 25692 v := b.Control 25693 if v.Op != Op386SETA { 25694 break 25695 } 25696 cmp := v.Args[0] 25697 b.Kind = Block386UGT 25698 b.SetControl(cmp) 25699 b.Aux = nil 25700 return true 25701 } 25702 // match: (If (SETAE cmp) yes no) 25703 // cond: 25704 // result: (UGE cmp yes no) 25705 for { 25706 v := b.Control 25707 if v.Op != Op386SETAE { 25708 break 25709 } 25710 cmp := v.Args[0] 25711 b.Kind = Block386UGE 25712 b.SetControl(cmp) 25713 b.Aux = nil 25714 return true 25715 } 25716 // match: (If (SETO cmp) yes no) 25717 // cond: 25718 // result: (OS cmp yes no) 25719 for { 25720 v := b.Control 25721 if v.Op != Op386SETO { 25722 break 25723 } 25724 cmp := v.Args[0] 25725 b.Kind = Block386OS 25726 b.SetControl(cmp) 25727 b.Aux = nil 25728 return true 25729 } 25730 // match: (If (SETGF cmp) yes no) 25731 // cond: 25732 // result: (UGT cmp yes no) 25733 for { 25734 v := b.Control 25735 if v.Op != Op386SETGF { 25736 break 25737 } 25738 cmp := v.Args[0] 25739 b.Kind = Block386UGT 25740 b.SetControl(cmp) 25741 b.Aux = nil 25742 return true 25743 } 25744 // match: (If (SETGEF cmp) yes no) 25745 // cond: 25746 // result: (UGE cmp yes no) 25747 for { 25748 v := b.Control 25749 if v.Op != Op386SETGEF { 25750 break 25751 } 25752 cmp := v.Args[0] 25753 b.Kind = Block386UGE 25754 b.SetControl(cmp) 25755 b.Aux = nil 25756 return true 25757 } 25758 // match: (If (SETEQF cmp) yes no) 25759 // cond: 25760 // result: (EQF cmp yes no) 25761 for { 25762 v := b.Control 25763 if v.Op != Op386SETEQF { 25764 break 25765 } 25766 cmp := v.Args[0] 25767 b.Kind = Block386EQF 25768 b.SetControl(cmp) 25769 b.Aux = nil 25770 return true 25771 } 25772 // match: (If (SETNEF cmp) yes no) 25773 // cond: 25774 // result: (NEF cmp yes no) 25775 for { 25776 v := b.Control 25777 if v.Op != Op386SETNEF { 25778 break 25779 } 25780 cmp := v.Args[0] 25781 b.Kind = Block386NEF 25782 b.SetControl(cmp) 25783 b.Aux = nil 25784 return true 25785 } 25786 // match: (If cond yes no) 25787 // cond: 25788 // result: (NE (TESTB cond cond) yes no) 25789 for { 25790 v := b.Control 25791 _ = v 25792 cond := b.Control 25793 b.Kind = Block386NE 25794 v0 := b.NewValue0(v.Pos, Op386TESTB, types.TypeFlags) 25795 v0.AddArg(cond) 25796 v0.AddArg(cond) 25797 b.SetControl(v0) 25798 b.Aux = nil 25799 return true 25800 } 25801 case Block386LE: 25802 // match: (LE (InvertFlags cmp) yes no) 25803 // cond: 25804 // result: (GE cmp yes no) 25805 for { 25806 v := b.Control 25807 if v.Op != Op386InvertFlags { 25808 break 25809 } 25810 cmp := v.Args[0] 25811 b.Kind = Block386GE 25812 b.SetControl(cmp) 25813 b.Aux = nil 25814 return true 25815 } 25816 // match: (LE (FlagEQ) yes no) 25817 // cond: 25818 // result: (First nil yes no) 25819 for { 25820 v := b.Control 25821 if v.Op != Op386FlagEQ { 25822 break 25823 } 25824 b.Kind = BlockFirst 25825 b.SetControl(nil) 25826 b.Aux = nil 25827 return true 25828 } 25829 // match: (LE (FlagLT_ULT) yes no) 25830 // cond: 25831 // result: (First nil yes no) 25832 for { 25833 v := b.Control 25834 if v.Op != Op386FlagLT_ULT { 25835 break 25836 } 25837 b.Kind = BlockFirst 25838 b.SetControl(nil) 25839 b.Aux = nil 25840 return true 25841 } 25842 // match: (LE (FlagLT_UGT) yes no) 25843 // cond: 25844 // result: (First nil yes no) 25845 for { 25846 v := b.Control 25847 if v.Op != Op386FlagLT_UGT { 25848 break 25849 } 25850 b.Kind = BlockFirst 25851 b.SetControl(nil) 25852 b.Aux = nil 25853 return true 25854 } 25855 // match: (LE (FlagGT_ULT) yes no) 25856 // cond: 25857 // result: (First nil no yes) 25858 for { 25859 v := b.Control 25860 if v.Op != Op386FlagGT_ULT { 25861 break 25862 } 25863 b.Kind = BlockFirst 25864 b.SetControl(nil) 25865 b.Aux = nil 25866 b.swapSuccessors() 25867 return true 25868 } 25869 // match: (LE (FlagGT_UGT) yes no) 25870 // cond: 25871 // result: (First nil no yes) 25872 for { 25873 v := b.Control 25874 if v.Op != Op386FlagGT_UGT { 25875 break 25876 } 25877 b.Kind = BlockFirst 25878 b.SetControl(nil) 25879 b.Aux = nil 25880 b.swapSuccessors() 25881 return true 25882 } 25883 case Block386LT: 25884 // match: (LT (InvertFlags cmp) yes no) 25885 // cond: 25886 // result: (GT cmp yes no) 25887 for { 25888 v := b.Control 25889 if v.Op != Op386InvertFlags { 25890 break 25891 } 25892 cmp := v.Args[0] 25893 b.Kind = Block386GT 25894 b.SetControl(cmp) 25895 b.Aux = nil 25896 return true 25897 } 25898 // match: (LT (FlagEQ) yes no) 25899 // cond: 25900 // result: (First nil no yes) 25901 for { 25902 v := b.Control 25903 if v.Op != Op386FlagEQ { 25904 break 25905 } 25906 b.Kind = BlockFirst 25907 b.SetControl(nil) 25908 b.Aux = nil 25909 b.swapSuccessors() 25910 return true 25911 } 25912 // match: (LT (FlagLT_ULT) yes no) 25913 // cond: 25914 // result: (First nil yes no) 25915 for { 25916 v := b.Control 25917 if v.Op != Op386FlagLT_ULT { 25918 break 25919 } 25920 b.Kind = BlockFirst 25921 b.SetControl(nil) 25922 b.Aux = nil 25923 return true 25924 } 25925 // match: (LT (FlagLT_UGT) yes no) 25926 // cond: 25927 // result: (First nil yes no) 25928 for { 25929 v := b.Control 25930 if v.Op != Op386FlagLT_UGT { 25931 break 25932 } 25933 b.Kind = BlockFirst 25934 b.SetControl(nil) 25935 b.Aux = nil 25936 return true 25937 } 25938 // match: (LT (FlagGT_ULT) yes no) 25939 // cond: 25940 // result: (First nil no yes) 25941 for { 25942 v := b.Control 25943 if v.Op != Op386FlagGT_ULT { 25944 break 25945 } 25946 b.Kind = BlockFirst 25947 b.SetControl(nil) 25948 b.Aux = nil 25949 b.swapSuccessors() 25950 return true 25951 } 25952 // match: (LT (FlagGT_UGT) yes no) 25953 // cond: 25954 // result: (First nil no yes) 25955 for { 25956 v := b.Control 25957 if v.Op != Op386FlagGT_UGT { 25958 break 25959 } 25960 b.Kind = BlockFirst 25961 b.SetControl(nil) 25962 b.Aux = nil 25963 b.swapSuccessors() 25964 return true 25965 } 25966 case Block386NE: 25967 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 25968 // cond: 25969 // result: (LT cmp yes no) 25970 for { 25971 v := b.Control 25972 if v.Op != Op386TESTB { 25973 break 25974 } 25975 _ = v.Args[1] 25976 v_0 := v.Args[0] 25977 if v_0.Op != Op386SETL { 25978 break 25979 } 25980 cmp := v_0.Args[0] 25981 v_1 := v.Args[1] 25982 if v_1.Op != Op386SETL { 25983 break 25984 } 25985 if cmp != v_1.Args[0] { 25986 break 25987 } 25988 b.Kind = Block386LT 25989 b.SetControl(cmp) 25990 b.Aux = nil 25991 return true 25992 } 25993 // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) 25994 // cond: 25995 // result: (LT cmp yes no) 25996 for { 25997 v := b.Control 25998 if v.Op != Op386TESTB { 25999 break 26000 } 26001 _ = v.Args[1] 26002 v_0 := v.Args[0] 26003 if v_0.Op != Op386SETL { 26004 break 26005 } 26006 cmp := v_0.Args[0] 26007 v_1 := v.Args[1] 26008 if v_1.Op != Op386SETL { 26009 break 26010 } 26011 if cmp != v_1.Args[0] { 26012 break 26013 } 26014 b.Kind = Block386LT 26015 b.SetControl(cmp) 26016 b.Aux = nil 26017 return true 26018 } 26019 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 26020 // cond: 26021 // result: (LE cmp yes no) 26022 for { 26023 v := b.Control 26024 if v.Op != Op386TESTB { 26025 break 26026 } 26027 _ = v.Args[1] 26028 v_0 := v.Args[0] 26029 if v_0.Op != Op386SETLE { 26030 break 26031 } 26032 cmp := v_0.Args[0] 26033 v_1 := v.Args[1] 26034 if v_1.Op != Op386SETLE { 26035 break 26036 } 26037 if cmp != v_1.Args[0] { 26038 break 26039 } 26040 b.Kind = Block386LE 26041 b.SetControl(cmp) 26042 b.Aux = nil 26043 return true 26044 } 26045 // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) 26046 // cond: 26047 // result: (LE cmp yes no) 26048 for { 26049 v := b.Control 26050 if v.Op != Op386TESTB { 26051 break 26052 } 26053 _ = v.Args[1] 26054 v_0 := v.Args[0] 26055 if v_0.Op != Op386SETLE { 26056 break 26057 } 26058 cmp := v_0.Args[0] 26059 v_1 := v.Args[1] 26060 if v_1.Op != Op386SETLE { 26061 break 26062 } 26063 if cmp != v_1.Args[0] { 26064 break 26065 } 26066 b.Kind = Block386LE 26067 b.SetControl(cmp) 26068 b.Aux = nil 26069 return true 26070 } 26071 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 26072 // cond: 26073 // result: (GT cmp yes no) 26074 for { 26075 v := b.Control 26076 if v.Op != Op386TESTB { 26077 break 26078 } 26079 _ = v.Args[1] 26080 v_0 := v.Args[0] 26081 if v_0.Op != Op386SETG { 26082 break 26083 } 26084 cmp := v_0.Args[0] 26085 v_1 := v.Args[1] 26086 if v_1.Op != Op386SETG { 26087 break 26088 } 26089 if cmp != v_1.Args[0] { 26090 break 26091 } 26092 b.Kind = Block386GT 26093 b.SetControl(cmp) 26094 b.Aux = nil 26095 return true 26096 } 26097 // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) 26098 // cond: 26099 // result: (GT cmp yes no) 26100 for { 26101 v := b.Control 26102 if v.Op != Op386TESTB { 26103 break 26104 } 26105 _ = v.Args[1] 26106 v_0 := v.Args[0] 26107 if v_0.Op != Op386SETG { 26108 break 26109 } 26110 cmp := v_0.Args[0] 26111 v_1 := v.Args[1] 26112 if v_1.Op != Op386SETG { 26113 break 26114 } 26115 if cmp != v_1.Args[0] { 26116 break 26117 } 26118 b.Kind = Block386GT 26119 b.SetControl(cmp) 26120 b.Aux = nil 26121 return true 26122 } 26123 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 26124 // cond: 26125 // result: (GE cmp yes no) 26126 for { 26127 v := b.Control 26128 if v.Op != Op386TESTB { 26129 break 26130 } 26131 _ = v.Args[1] 26132 v_0 := v.Args[0] 26133 if v_0.Op != Op386SETGE { 26134 break 26135 } 26136 cmp := v_0.Args[0] 26137 v_1 := v.Args[1] 26138 if v_1.Op != Op386SETGE { 26139 break 26140 } 26141 if cmp != v_1.Args[0] { 26142 break 26143 } 26144 b.Kind = Block386GE 26145 b.SetControl(cmp) 26146 b.Aux = nil 26147 return true 26148 } 26149 // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) 26150 // cond: 26151 // result: (GE cmp yes no) 26152 for { 26153 v := b.Control 26154 if v.Op != Op386TESTB { 26155 break 26156 } 26157 _ = v.Args[1] 26158 v_0 := v.Args[0] 26159 if v_0.Op != Op386SETGE { 26160 break 26161 } 26162 cmp := v_0.Args[0] 26163 v_1 := v.Args[1] 26164 if v_1.Op != Op386SETGE { 26165 break 26166 } 26167 if cmp != v_1.Args[0] { 26168 break 26169 } 26170 b.Kind = Block386GE 26171 b.SetControl(cmp) 26172 b.Aux = nil 26173 return true 26174 } 26175 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 26176 // cond: 26177 // result: (EQ cmp yes no) 26178 for { 26179 v := b.Control 26180 if v.Op != Op386TESTB { 26181 break 26182 } 26183 _ = v.Args[1] 26184 v_0 := v.Args[0] 26185 if v_0.Op != Op386SETEQ { 26186 break 26187 } 26188 cmp := v_0.Args[0] 26189 v_1 := v.Args[1] 26190 if v_1.Op != Op386SETEQ { 26191 break 26192 } 26193 if cmp != v_1.Args[0] { 26194 break 26195 } 26196 b.Kind = Block386EQ 26197 b.SetControl(cmp) 26198 b.Aux = nil 26199 return true 26200 } 26201 // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) 26202 // cond: 26203 // result: (EQ cmp yes no) 26204 for { 26205 v := b.Control 26206 if v.Op != Op386TESTB { 26207 break 26208 } 26209 _ = v.Args[1] 26210 v_0 := v.Args[0] 26211 if v_0.Op != Op386SETEQ { 26212 break 26213 } 26214 cmp := v_0.Args[0] 26215 v_1 := v.Args[1] 26216 if v_1.Op != Op386SETEQ { 26217 break 26218 } 26219 if cmp != v_1.Args[0] { 26220 break 26221 } 26222 b.Kind = Block386EQ 26223 b.SetControl(cmp) 26224 b.Aux = nil 26225 return true 26226 } 26227 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 26228 // cond: 26229 // result: (NE cmp yes no) 26230 for { 26231 v := b.Control 26232 if v.Op != Op386TESTB { 26233 break 26234 } 26235 _ = v.Args[1] 26236 v_0 := v.Args[0] 26237 if v_0.Op != Op386SETNE { 26238 break 26239 } 26240 cmp := v_0.Args[0] 26241 v_1 := v.Args[1] 26242 if v_1.Op != Op386SETNE { 26243 break 26244 } 26245 if cmp != v_1.Args[0] { 26246 break 26247 } 26248 b.Kind = Block386NE 26249 b.SetControl(cmp) 26250 b.Aux = nil 26251 return true 26252 } 26253 // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) 26254 // cond: 26255 // result: (NE cmp yes no) 26256 for { 26257 v := b.Control 26258 if v.Op != Op386TESTB { 26259 break 26260 } 26261 _ = v.Args[1] 26262 v_0 := v.Args[0] 26263 if v_0.Op != Op386SETNE { 26264 break 26265 } 26266 cmp := v_0.Args[0] 26267 v_1 := v.Args[1] 26268 if v_1.Op != Op386SETNE { 26269 break 26270 } 26271 if cmp != v_1.Args[0] { 26272 break 26273 } 26274 b.Kind = Block386NE 26275 b.SetControl(cmp) 26276 b.Aux = nil 26277 return true 26278 } 26279 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 26280 // cond: 26281 // result: (ULT cmp yes no) 26282 for { 26283 v := b.Control 26284 if v.Op != Op386TESTB { 26285 break 26286 } 26287 _ = v.Args[1] 26288 v_0 := v.Args[0] 26289 if v_0.Op != Op386SETB { 26290 break 26291 } 26292 cmp := v_0.Args[0] 26293 v_1 := v.Args[1] 26294 if v_1.Op != Op386SETB { 26295 break 26296 } 26297 if cmp != v_1.Args[0] { 26298 break 26299 } 26300 b.Kind = Block386ULT 26301 b.SetControl(cmp) 26302 b.Aux = nil 26303 return true 26304 } 26305 // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) 26306 // cond: 26307 // result: (ULT cmp yes no) 26308 for { 26309 v := b.Control 26310 if v.Op != Op386TESTB { 26311 break 26312 } 26313 _ = v.Args[1] 26314 v_0 := v.Args[0] 26315 if v_0.Op != Op386SETB { 26316 break 26317 } 26318 cmp := v_0.Args[0] 26319 v_1 := v.Args[1] 26320 if v_1.Op != Op386SETB { 26321 break 26322 } 26323 if cmp != v_1.Args[0] { 26324 break 26325 } 26326 b.Kind = Block386ULT 26327 b.SetControl(cmp) 26328 b.Aux = nil 26329 return true 26330 } 26331 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 26332 // cond: 26333 // result: (ULE cmp yes no) 26334 for { 26335 v := b.Control 26336 if v.Op != Op386TESTB { 26337 break 26338 } 26339 _ = v.Args[1] 26340 v_0 := v.Args[0] 26341 if v_0.Op != Op386SETBE { 26342 break 26343 } 26344 cmp := v_0.Args[0] 26345 v_1 := v.Args[1] 26346 if v_1.Op != Op386SETBE { 26347 break 26348 } 26349 if cmp != v_1.Args[0] { 26350 break 26351 } 26352 b.Kind = Block386ULE 26353 b.SetControl(cmp) 26354 b.Aux = nil 26355 return true 26356 } 26357 // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) 26358 // cond: 26359 // result: (ULE cmp yes no) 26360 for { 26361 v := b.Control 26362 if v.Op != Op386TESTB { 26363 break 26364 } 26365 _ = v.Args[1] 26366 v_0 := v.Args[0] 26367 if v_0.Op != Op386SETBE { 26368 break 26369 } 26370 cmp := v_0.Args[0] 26371 v_1 := v.Args[1] 26372 if v_1.Op != Op386SETBE { 26373 break 26374 } 26375 if cmp != v_1.Args[0] { 26376 break 26377 } 26378 b.Kind = Block386ULE 26379 b.SetControl(cmp) 26380 b.Aux = nil 26381 return true 26382 } 26383 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 26384 // cond: 26385 // result: (UGT cmp yes no) 26386 for { 26387 v := b.Control 26388 if v.Op != Op386TESTB { 26389 break 26390 } 26391 _ = v.Args[1] 26392 v_0 := v.Args[0] 26393 if v_0.Op != Op386SETA { 26394 break 26395 } 26396 cmp := v_0.Args[0] 26397 v_1 := v.Args[1] 26398 if v_1.Op != Op386SETA { 26399 break 26400 } 26401 if cmp != v_1.Args[0] { 26402 break 26403 } 26404 b.Kind = Block386UGT 26405 b.SetControl(cmp) 26406 b.Aux = nil 26407 return true 26408 } 26409 // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) 26410 // cond: 26411 // result: (UGT cmp yes no) 26412 for { 26413 v := b.Control 26414 if v.Op != Op386TESTB { 26415 break 26416 } 26417 _ = v.Args[1] 26418 v_0 := v.Args[0] 26419 if v_0.Op != Op386SETA { 26420 break 26421 } 26422 cmp := v_0.Args[0] 26423 v_1 := v.Args[1] 26424 if v_1.Op != Op386SETA { 26425 break 26426 } 26427 if cmp != v_1.Args[0] { 26428 break 26429 } 26430 b.Kind = Block386UGT 26431 b.SetControl(cmp) 26432 b.Aux = nil 26433 return true 26434 } 26435 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 26436 // cond: 26437 // result: (UGE cmp yes no) 26438 for { 26439 v := b.Control 26440 if v.Op != Op386TESTB { 26441 break 26442 } 26443 _ = v.Args[1] 26444 v_0 := v.Args[0] 26445 if v_0.Op != Op386SETAE { 26446 break 26447 } 26448 cmp := v_0.Args[0] 26449 v_1 := v.Args[1] 26450 if v_1.Op != Op386SETAE { 26451 break 26452 } 26453 if cmp != v_1.Args[0] { 26454 break 26455 } 26456 b.Kind = Block386UGE 26457 b.SetControl(cmp) 26458 b.Aux = nil 26459 return true 26460 } 26461 // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) 26462 // cond: 26463 // result: (UGE cmp yes no) 26464 for { 26465 v := b.Control 26466 if v.Op != Op386TESTB { 26467 break 26468 } 26469 _ = v.Args[1] 26470 v_0 := v.Args[0] 26471 if v_0.Op != Op386SETAE { 26472 break 26473 } 26474 cmp := v_0.Args[0] 26475 v_1 := v.Args[1] 26476 if v_1.Op != Op386SETAE { 26477 break 26478 } 26479 if cmp != v_1.Args[0] { 26480 break 26481 } 26482 b.Kind = Block386UGE 26483 b.SetControl(cmp) 26484 b.Aux = nil 26485 return true 26486 } 26487 // match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no) 26488 // cond: 26489 // result: (OS cmp yes no) 26490 for { 26491 v := b.Control 26492 if v.Op != Op386TESTB { 26493 break 26494 } 26495 _ = v.Args[1] 26496 v_0 := v.Args[0] 26497 if v_0.Op != Op386SETO { 26498 break 26499 } 26500 cmp := v_0.Args[0] 26501 v_1 := v.Args[1] 26502 if v_1.Op != Op386SETO { 26503 break 26504 } 26505 if cmp != v_1.Args[0] { 26506 break 26507 } 26508 b.Kind = Block386OS 26509 b.SetControl(cmp) 26510 b.Aux = nil 26511 return true 26512 } 26513 // match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no) 26514 // cond: 26515 // result: (OS cmp yes no) 26516 for { 26517 v := b.Control 26518 if v.Op != Op386TESTB { 26519 break 26520 } 26521 _ = v.Args[1] 26522 v_0 := v.Args[0] 26523 if v_0.Op != Op386SETO { 26524 break 26525 } 26526 cmp := v_0.Args[0] 26527 v_1 := v.Args[1] 26528 if v_1.Op != Op386SETO { 26529 break 26530 } 26531 if cmp != v_1.Args[0] { 26532 break 26533 } 26534 b.Kind = Block386OS 26535 b.SetControl(cmp) 26536 b.Aux = nil 26537 return true 26538 } 26539 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 26540 // cond: 26541 // result: (UGT cmp yes no) 26542 for { 26543 v := b.Control 26544 if v.Op != Op386TESTB { 26545 break 26546 } 26547 _ = v.Args[1] 26548 v_0 := v.Args[0] 26549 if v_0.Op != Op386SETGF { 26550 break 26551 } 26552 cmp := v_0.Args[0] 26553 v_1 := v.Args[1] 26554 if v_1.Op != Op386SETGF { 26555 break 26556 } 26557 if cmp != v_1.Args[0] { 26558 break 26559 } 26560 b.Kind = Block386UGT 26561 b.SetControl(cmp) 26562 b.Aux = nil 26563 return true 26564 } 26565 // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) 26566 // cond: 26567 // result: (UGT cmp yes no) 26568 for { 26569 v := b.Control 26570 if v.Op != Op386TESTB { 26571 break 26572 } 26573 _ = v.Args[1] 26574 v_0 := v.Args[0] 26575 if v_0.Op != Op386SETGF { 26576 break 26577 } 26578 cmp := v_0.Args[0] 26579 v_1 := v.Args[1] 26580 if v_1.Op != Op386SETGF { 26581 break 26582 } 26583 if cmp != v_1.Args[0] { 26584 break 26585 } 26586 b.Kind = Block386UGT 26587 b.SetControl(cmp) 26588 b.Aux = nil 26589 return true 26590 } 26591 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 26592 // cond: 26593 // result: (UGE cmp yes no) 26594 for { 26595 v := b.Control 26596 if v.Op != Op386TESTB { 26597 break 26598 } 26599 _ = v.Args[1] 26600 v_0 := v.Args[0] 26601 if v_0.Op != Op386SETGEF { 26602 break 26603 } 26604 cmp := v_0.Args[0] 26605 v_1 := v.Args[1] 26606 if v_1.Op != Op386SETGEF { 26607 break 26608 } 26609 if cmp != v_1.Args[0] { 26610 break 26611 } 26612 b.Kind = Block386UGE 26613 b.SetControl(cmp) 26614 b.Aux = nil 26615 return true 26616 } 26617 // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) 26618 // cond: 26619 // result: (UGE cmp yes no) 26620 for { 26621 v := b.Control 26622 if v.Op != Op386TESTB { 26623 break 26624 } 26625 _ = v.Args[1] 26626 v_0 := v.Args[0] 26627 if v_0.Op != Op386SETGEF { 26628 break 26629 } 26630 cmp := v_0.Args[0] 26631 v_1 := v.Args[1] 26632 if v_1.Op != Op386SETGEF { 26633 break 26634 } 26635 if cmp != v_1.Args[0] { 26636 break 26637 } 26638 b.Kind = Block386UGE 26639 b.SetControl(cmp) 26640 b.Aux = nil 26641 return true 26642 } 26643 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 26644 // cond: 26645 // result: (EQF cmp yes no) 26646 for { 26647 v := b.Control 26648 if v.Op != Op386TESTB { 26649 break 26650 } 26651 _ = v.Args[1] 26652 v_0 := v.Args[0] 26653 if v_0.Op != Op386SETEQF { 26654 break 26655 } 26656 cmp := v_0.Args[0] 26657 v_1 := v.Args[1] 26658 if v_1.Op != Op386SETEQF { 26659 break 26660 } 26661 if cmp != v_1.Args[0] { 26662 break 26663 } 26664 b.Kind = Block386EQF 26665 b.SetControl(cmp) 26666 b.Aux = nil 26667 return true 26668 } 26669 // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) 26670 // cond: 26671 // result: (EQF cmp yes no) 26672 for { 26673 v := b.Control 26674 if v.Op != Op386TESTB { 26675 break 26676 } 26677 _ = v.Args[1] 26678 v_0 := v.Args[0] 26679 if v_0.Op != Op386SETEQF { 26680 break 26681 } 26682 cmp := v_0.Args[0] 26683 v_1 := v.Args[1] 26684 if v_1.Op != Op386SETEQF { 26685 break 26686 } 26687 if cmp != v_1.Args[0] { 26688 break 26689 } 26690 b.Kind = Block386EQF 26691 b.SetControl(cmp) 26692 b.Aux = nil 26693 return true 26694 } 26695 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 26696 // cond: 26697 // result: (NEF cmp yes no) 26698 for { 26699 v := b.Control 26700 if v.Op != Op386TESTB { 26701 break 26702 } 26703 _ = v.Args[1] 26704 v_0 := v.Args[0] 26705 if v_0.Op != Op386SETNEF { 26706 break 26707 } 26708 cmp := v_0.Args[0] 26709 v_1 := v.Args[1] 26710 if v_1.Op != Op386SETNEF { 26711 break 26712 } 26713 if cmp != v_1.Args[0] { 26714 break 26715 } 26716 b.Kind = Block386NEF 26717 b.SetControl(cmp) 26718 b.Aux = nil 26719 return true 26720 } 26721 // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) 26722 // cond: 26723 // result: (NEF cmp yes no) 26724 for { 26725 v := b.Control 26726 if v.Op != Op386TESTB { 26727 break 26728 } 26729 _ = v.Args[1] 26730 v_0 := v.Args[0] 26731 if v_0.Op != Op386SETNEF { 26732 break 26733 } 26734 cmp := v_0.Args[0] 26735 v_1 := v.Args[1] 26736 if v_1.Op != Op386SETNEF { 26737 break 26738 } 26739 if cmp != v_1.Args[0] { 26740 break 26741 } 26742 b.Kind = Block386NEF 26743 b.SetControl(cmp) 26744 b.Aux = nil 26745 return true 26746 } 26747 // match: (NE (InvertFlags cmp) yes no) 26748 // cond: 26749 // result: (NE cmp yes no) 26750 for { 26751 v := b.Control 26752 if v.Op != Op386InvertFlags { 26753 break 26754 } 26755 cmp := v.Args[0] 26756 b.Kind = Block386NE 26757 b.SetControl(cmp) 26758 b.Aux = nil 26759 return true 26760 } 26761 // match: (NE (FlagEQ) yes no) 26762 // cond: 26763 // result: (First nil no yes) 26764 for { 26765 v := b.Control 26766 if v.Op != Op386FlagEQ { 26767 break 26768 } 26769 b.Kind = BlockFirst 26770 b.SetControl(nil) 26771 b.Aux = nil 26772 b.swapSuccessors() 26773 return true 26774 } 26775 // match: (NE (FlagLT_ULT) yes no) 26776 // cond: 26777 // result: (First nil yes no) 26778 for { 26779 v := b.Control 26780 if v.Op != Op386FlagLT_ULT { 26781 break 26782 } 26783 b.Kind = BlockFirst 26784 b.SetControl(nil) 26785 b.Aux = nil 26786 return true 26787 } 26788 // match: (NE (FlagLT_UGT) yes no) 26789 // cond: 26790 // result: (First nil yes no) 26791 for { 26792 v := b.Control 26793 if v.Op != Op386FlagLT_UGT { 26794 break 26795 } 26796 b.Kind = BlockFirst 26797 b.SetControl(nil) 26798 b.Aux = nil 26799 return true 26800 } 26801 // match: (NE (FlagGT_ULT) yes no) 26802 // cond: 26803 // result: (First nil yes no) 26804 for { 26805 v := b.Control 26806 if v.Op != Op386FlagGT_ULT { 26807 break 26808 } 26809 b.Kind = BlockFirst 26810 b.SetControl(nil) 26811 b.Aux = nil 26812 return true 26813 } 26814 // match: (NE (FlagGT_UGT) yes no) 26815 // cond: 26816 // result: (First nil yes no) 26817 for { 26818 v := b.Control 26819 if v.Op != Op386FlagGT_UGT { 26820 break 26821 } 26822 b.Kind = BlockFirst 26823 b.SetControl(nil) 26824 b.Aux = nil 26825 return true 26826 } 26827 case Block386UGE: 26828 // match: (UGE (InvertFlags cmp) yes no) 26829 // cond: 26830 // result: (ULE cmp yes no) 26831 for { 26832 v := b.Control 26833 if v.Op != Op386InvertFlags { 26834 break 26835 } 26836 cmp := v.Args[0] 26837 b.Kind = Block386ULE 26838 b.SetControl(cmp) 26839 b.Aux = nil 26840 return true 26841 } 26842 // match: (UGE (FlagEQ) yes no) 26843 // cond: 26844 // result: (First nil yes no) 26845 for { 26846 v := b.Control 26847 if v.Op != Op386FlagEQ { 26848 break 26849 } 26850 b.Kind = BlockFirst 26851 b.SetControl(nil) 26852 b.Aux = nil 26853 return true 26854 } 26855 // match: (UGE (FlagLT_ULT) yes no) 26856 // cond: 26857 // result: (First nil no yes) 26858 for { 26859 v := b.Control 26860 if v.Op != Op386FlagLT_ULT { 26861 break 26862 } 26863 b.Kind = BlockFirst 26864 b.SetControl(nil) 26865 b.Aux = nil 26866 b.swapSuccessors() 26867 return true 26868 } 26869 // match: (UGE (FlagLT_UGT) yes no) 26870 // cond: 26871 // result: (First nil yes no) 26872 for { 26873 v := b.Control 26874 if v.Op != Op386FlagLT_UGT { 26875 break 26876 } 26877 b.Kind = BlockFirst 26878 b.SetControl(nil) 26879 b.Aux = nil 26880 return true 26881 } 26882 // match: (UGE (FlagGT_ULT) yes no) 26883 // cond: 26884 // result: (First nil no yes) 26885 for { 26886 v := b.Control 26887 if v.Op != Op386FlagGT_ULT { 26888 break 26889 } 26890 b.Kind = BlockFirst 26891 b.SetControl(nil) 26892 b.Aux = nil 26893 b.swapSuccessors() 26894 return true 26895 } 26896 // match: (UGE (FlagGT_UGT) yes no) 26897 // cond: 26898 // result: (First nil yes no) 26899 for { 26900 v := b.Control 26901 if v.Op != Op386FlagGT_UGT { 26902 break 26903 } 26904 b.Kind = BlockFirst 26905 b.SetControl(nil) 26906 b.Aux = nil 26907 return true 26908 } 26909 case Block386UGT: 26910 // match: (UGT (InvertFlags cmp) yes no) 26911 // cond: 26912 // result: (ULT cmp yes no) 26913 for { 26914 v := b.Control 26915 if v.Op != Op386InvertFlags { 26916 break 26917 } 26918 cmp := v.Args[0] 26919 b.Kind = Block386ULT 26920 b.SetControl(cmp) 26921 b.Aux = nil 26922 return true 26923 } 26924 // match: (UGT (FlagEQ) yes no) 26925 // cond: 26926 // result: (First nil no yes) 26927 for { 26928 v := b.Control 26929 if v.Op != Op386FlagEQ { 26930 break 26931 } 26932 b.Kind = BlockFirst 26933 b.SetControl(nil) 26934 b.Aux = nil 26935 b.swapSuccessors() 26936 return true 26937 } 26938 // match: (UGT (FlagLT_ULT) yes no) 26939 // cond: 26940 // result: (First nil no yes) 26941 for { 26942 v := b.Control 26943 if v.Op != Op386FlagLT_ULT { 26944 break 26945 } 26946 b.Kind = BlockFirst 26947 b.SetControl(nil) 26948 b.Aux = nil 26949 b.swapSuccessors() 26950 return true 26951 } 26952 // match: (UGT (FlagLT_UGT) yes no) 26953 // cond: 26954 // result: (First nil yes no) 26955 for { 26956 v := b.Control 26957 if v.Op != Op386FlagLT_UGT { 26958 break 26959 } 26960 b.Kind = BlockFirst 26961 b.SetControl(nil) 26962 b.Aux = nil 26963 return true 26964 } 26965 // match: (UGT (FlagGT_ULT) yes no) 26966 // cond: 26967 // result: (First nil no yes) 26968 for { 26969 v := b.Control 26970 if v.Op != Op386FlagGT_ULT { 26971 break 26972 } 26973 b.Kind = BlockFirst 26974 b.SetControl(nil) 26975 b.Aux = nil 26976 b.swapSuccessors() 26977 return true 26978 } 26979 // match: (UGT (FlagGT_UGT) yes no) 26980 // cond: 26981 // result: (First nil yes no) 26982 for { 26983 v := b.Control 26984 if v.Op != Op386FlagGT_UGT { 26985 break 26986 } 26987 b.Kind = BlockFirst 26988 b.SetControl(nil) 26989 b.Aux = nil 26990 return true 26991 } 26992 case Block386ULE: 26993 // match: (ULE (InvertFlags cmp) yes no) 26994 // cond: 26995 // result: (UGE cmp yes no) 26996 for { 26997 v := b.Control 26998 if v.Op != Op386InvertFlags { 26999 break 27000 } 27001 cmp := v.Args[0] 27002 b.Kind = Block386UGE 27003 b.SetControl(cmp) 27004 b.Aux = nil 27005 return true 27006 } 27007 // match: (ULE (FlagEQ) yes no) 27008 // cond: 27009 // result: (First nil yes no) 27010 for { 27011 v := b.Control 27012 if v.Op != Op386FlagEQ { 27013 break 27014 } 27015 b.Kind = BlockFirst 27016 b.SetControl(nil) 27017 b.Aux = nil 27018 return true 27019 } 27020 // match: (ULE (FlagLT_ULT) yes no) 27021 // cond: 27022 // result: (First nil yes no) 27023 for { 27024 v := b.Control 27025 if v.Op != Op386FlagLT_ULT { 27026 break 27027 } 27028 b.Kind = BlockFirst 27029 b.SetControl(nil) 27030 b.Aux = nil 27031 return true 27032 } 27033 // match: (ULE (FlagLT_UGT) yes no) 27034 // cond: 27035 // result: (First nil no yes) 27036 for { 27037 v := b.Control 27038 if v.Op != Op386FlagLT_UGT { 27039 break 27040 } 27041 b.Kind = BlockFirst 27042 b.SetControl(nil) 27043 b.Aux = nil 27044 b.swapSuccessors() 27045 return true 27046 } 27047 // match: (ULE (FlagGT_ULT) yes no) 27048 // cond: 27049 // result: (First nil yes no) 27050 for { 27051 v := b.Control 27052 if v.Op != Op386FlagGT_ULT { 27053 break 27054 } 27055 b.Kind = BlockFirst 27056 b.SetControl(nil) 27057 b.Aux = nil 27058 return true 27059 } 27060 // match: (ULE (FlagGT_UGT) yes no) 27061 // cond: 27062 // result: (First nil no yes) 27063 for { 27064 v := b.Control 27065 if v.Op != Op386FlagGT_UGT { 27066 break 27067 } 27068 b.Kind = BlockFirst 27069 b.SetControl(nil) 27070 b.Aux = nil 27071 b.swapSuccessors() 27072 return true 27073 } 27074 case Block386ULT: 27075 // match: (ULT (InvertFlags cmp) yes no) 27076 // cond: 27077 // result: (UGT cmp yes no) 27078 for { 27079 v := b.Control 27080 if v.Op != Op386InvertFlags { 27081 break 27082 } 27083 cmp := v.Args[0] 27084 b.Kind = Block386UGT 27085 b.SetControl(cmp) 27086 b.Aux = nil 27087 return true 27088 } 27089 // match: (ULT (FlagEQ) yes no) 27090 // cond: 27091 // result: (First nil no yes) 27092 for { 27093 v := b.Control 27094 if v.Op != Op386FlagEQ { 27095 break 27096 } 27097 b.Kind = BlockFirst 27098 b.SetControl(nil) 27099 b.Aux = nil 27100 b.swapSuccessors() 27101 return true 27102 } 27103 // match: (ULT (FlagLT_ULT) yes no) 27104 // cond: 27105 // result: (First nil yes no) 27106 for { 27107 v := b.Control 27108 if v.Op != Op386FlagLT_ULT { 27109 break 27110 } 27111 b.Kind = BlockFirst 27112 b.SetControl(nil) 27113 b.Aux = nil 27114 return true 27115 } 27116 // match: (ULT (FlagLT_UGT) yes no) 27117 // cond: 27118 // result: (First nil no yes) 27119 for { 27120 v := b.Control 27121 if v.Op != Op386FlagLT_UGT { 27122 break 27123 } 27124 b.Kind = BlockFirst 27125 b.SetControl(nil) 27126 b.Aux = nil 27127 b.swapSuccessors() 27128 return true 27129 } 27130 // match: (ULT (FlagGT_ULT) yes no) 27131 // cond: 27132 // result: (First nil yes no) 27133 for { 27134 v := b.Control 27135 if v.Op != Op386FlagGT_ULT { 27136 break 27137 } 27138 b.Kind = BlockFirst 27139 b.SetControl(nil) 27140 b.Aux = nil 27141 return true 27142 } 27143 // match: (ULT (FlagGT_UGT) yes no) 27144 // cond: 27145 // result: (First nil no yes) 27146 for { 27147 v := b.Control 27148 if v.Op != Op386FlagGT_UGT { 27149 break 27150 } 27151 b.Kind = BlockFirst 27152 b.SetControl(nil) 27153 b.Aux = nil 27154 b.swapSuccessors() 27155 return true 27156 } 27157 } 27158 return false 27159 }