github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/cmd/compile/internal/ssa/rewriteS390X.go (about) 1 // Code generated from gen/S390X.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 9 var _ = math.MinInt8 // in case not otherwise used 10 var _ = obj.ANOP // in case not otherwise used 11 func rewriteValueS390X(v *Value) bool { 12 switch v.Op { 13 case OpAdd16: 14 return rewriteValueS390X_OpAdd16(v) 15 case OpAdd32: 16 return rewriteValueS390X_OpAdd32(v) 17 case OpAdd32F: 18 return rewriteValueS390X_OpAdd32F(v) 19 case OpAdd64: 20 return rewriteValueS390X_OpAdd64(v) 21 case OpAdd64F: 22 return rewriteValueS390X_OpAdd64F(v) 23 case OpAdd8: 24 return rewriteValueS390X_OpAdd8(v) 25 case OpAddPtr: 26 return rewriteValueS390X_OpAddPtr(v) 27 case OpAddr: 28 return rewriteValueS390X_OpAddr(v) 29 case OpAnd16: 30 return rewriteValueS390X_OpAnd16(v) 31 case OpAnd32: 32 return rewriteValueS390X_OpAnd32(v) 33 case OpAnd64: 34 return rewriteValueS390X_OpAnd64(v) 35 case OpAnd8: 36 return rewriteValueS390X_OpAnd8(v) 37 case OpAndB: 38 return rewriteValueS390X_OpAndB(v) 39 case OpAtomicAdd32: 40 return rewriteValueS390X_OpAtomicAdd32(v) 41 case OpAtomicAdd64: 42 return rewriteValueS390X_OpAtomicAdd64(v) 43 case OpAtomicCompareAndSwap32: 44 return rewriteValueS390X_OpAtomicCompareAndSwap32(v) 45 case OpAtomicCompareAndSwap64: 46 return rewriteValueS390X_OpAtomicCompareAndSwap64(v) 47 case OpAtomicExchange32: 48 return rewriteValueS390X_OpAtomicExchange32(v) 49 case OpAtomicExchange64: 50 return rewriteValueS390X_OpAtomicExchange64(v) 51 case OpAtomicLoad32: 52 return rewriteValueS390X_OpAtomicLoad32(v) 53 case OpAtomicLoad64: 54 return rewriteValueS390X_OpAtomicLoad64(v) 55 case OpAtomicLoadPtr: 56 return rewriteValueS390X_OpAtomicLoadPtr(v) 57 case OpAtomicStore32: 58 return rewriteValueS390X_OpAtomicStore32(v) 59 case OpAtomicStore64: 60 return rewriteValueS390X_OpAtomicStore64(v) 61 case OpAtomicStorePtrNoWB: 62 return rewriteValueS390X_OpAtomicStorePtrNoWB(v) 63 case OpAvg64u: 64 return rewriteValueS390X_OpAvg64u(v) 65 case OpBitLen64: 66 return rewriteValueS390X_OpBitLen64(v) 67 case OpBswap32: 68 return rewriteValueS390X_OpBswap32(v) 69 case OpBswap64: 70 return rewriteValueS390X_OpBswap64(v) 71 case OpClosureCall: 72 return rewriteValueS390X_OpClosureCall(v) 73 case OpCom16: 74 return rewriteValueS390X_OpCom16(v) 75 case OpCom32: 76 return rewriteValueS390X_OpCom32(v) 77 case OpCom64: 78 return rewriteValueS390X_OpCom64(v) 79 case OpCom8: 80 return rewriteValueS390X_OpCom8(v) 81 case OpConst16: 82 return rewriteValueS390X_OpConst16(v) 83 case OpConst32: 84 return rewriteValueS390X_OpConst32(v) 85 case OpConst32F: 86 return rewriteValueS390X_OpConst32F(v) 87 case OpConst64: 88 return rewriteValueS390X_OpConst64(v) 89 case OpConst64F: 90 return rewriteValueS390X_OpConst64F(v) 91 case OpConst8: 92 return rewriteValueS390X_OpConst8(v) 93 case OpConstBool: 94 return rewriteValueS390X_OpConstBool(v) 95 case OpConstNil: 96 return rewriteValueS390X_OpConstNil(v) 97 case OpConvert: 98 return rewriteValueS390X_OpConvert(v) 99 case OpCtz32: 100 return rewriteValueS390X_OpCtz32(v) 101 case OpCtz64: 102 return rewriteValueS390X_OpCtz64(v) 103 case OpCvt32Fto32: 104 return rewriteValueS390X_OpCvt32Fto32(v) 105 case OpCvt32Fto64: 106 return rewriteValueS390X_OpCvt32Fto64(v) 107 case OpCvt32Fto64F: 108 return rewriteValueS390X_OpCvt32Fto64F(v) 109 case OpCvt32to32F: 110 return rewriteValueS390X_OpCvt32to32F(v) 111 case OpCvt32to64F: 112 return rewriteValueS390X_OpCvt32to64F(v) 113 case OpCvt64Fto32: 114 return rewriteValueS390X_OpCvt64Fto32(v) 115 case OpCvt64Fto32F: 116 return rewriteValueS390X_OpCvt64Fto32F(v) 117 case OpCvt64Fto64: 118 return rewriteValueS390X_OpCvt64Fto64(v) 119 case OpCvt64to32F: 120 return rewriteValueS390X_OpCvt64to32F(v) 121 case OpCvt64to64F: 122 return rewriteValueS390X_OpCvt64to64F(v) 123 case OpDiv16: 124 return rewriteValueS390X_OpDiv16(v) 125 case OpDiv16u: 126 return rewriteValueS390X_OpDiv16u(v) 127 case OpDiv32: 128 return rewriteValueS390X_OpDiv32(v) 129 case OpDiv32F: 130 return rewriteValueS390X_OpDiv32F(v) 131 case OpDiv32u: 132 return rewriteValueS390X_OpDiv32u(v) 133 case OpDiv64: 134 return rewriteValueS390X_OpDiv64(v) 135 case OpDiv64F: 136 return rewriteValueS390X_OpDiv64F(v) 137 case OpDiv64u: 138 return rewriteValueS390X_OpDiv64u(v) 139 case OpDiv8: 140 return rewriteValueS390X_OpDiv8(v) 141 case OpDiv8u: 142 return rewriteValueS390X_OpDiv8u(v) 143 case OpEq16: 144 return rewriteValueS390X_OpEq16(v) 145 case OpEq32: 146 return rewriteValueS390X_OpEq32(v) 147 case OpEq32F: 148 return rewriteValueS390X_OpEq32F(v) 149 case OpEq64: 150 return rewriteValueS390X_OpEq64(v) 151 case OpEq64F: 152 return rewriteValueS390X_OpEq64F(v) 153 case OpEq8: 154 return rewriteValueS390X_OpEq8(v) 155 case OpEqB: 156 return rewriteValueS390X_OpEqB(v) 157 case OpEqPtr: 158 return rewriteValueS390X_OpEqPtr(v) 159 case OpGeq16: 160 return rewriteValueS390X_OpGeq16(v) 161 case OpGeq16U: 162 return rewriteValueS390X_OpGeq16U(v) 163 case OpGeq32: 164 return rewriteValueS390X_OpGeq32(v) 165 case OpGeq32F: 166 return rewriteValueS390X_OpGeq32F(v) 167 case OpGeq32U: 168 return rewriteValueS390X_OpGeq32U(v) 169 case OpGeq64: 170 return rewriteValueS390X_OpGeq64(v) 171 case OpGeq64F: 172 return rewriteValueS390X_OpGeq64F(v) 173 case OpGeq64U: 174 return rewriteValueS390X_OpGeq64U(v) 175 case OpGeq8: 176 return rewriteValueS390X_OpGeq8(v) 177 case OpGeq8U: 178 return rewriteValueS390X_OpGeq8U(v) 179 case OpGetClosurePtr: 180 return rewriteValueS390X_OpGetClosurePtr(v) 181 case OpGetG: 182 return rewriteValueS390X_OpGetG(v) 183 case OpGreater16: 184 return rewriteValueS390X_OpGreater16(v) 185 case OpGreater16U: 186 return rewriteValueS390X_OpGreater16U(v) 187 case OpGreater32: 188 return rewriteValueS390X_OpGreater32(v) 189 case OpGreater32F: 190 return rewriteValueS390X_OpGreater32F(v) 191 case OpGreater32U: 192 return rewriteValueS390X_OpGreater32U(v) 193 case OpGreater64: 194 return rewriteValueS390X_OpGreater64(v) 195 case OpGreater64F: 196 return rewriteValueS390X_OpGreater64F(v) 197 case OpGreater64U: 198 return rewriteValueS390X_OpGreater64U(v) 199 case OpGreater8: 200 return rewriteValueS390X_OpGreater8(v) 201 case OpGreater8U: 202 return rewriteValueS390X_OpGreater8U(v) 203 case OpHmul32: 204 return rewriteValueS390X_OpHmul32(v) 205 case OpHmul32u: 206 return rewriteValueS390X_OpHmul32u(v) 207 case OpHmul64: 208 return rewriteValueS390X_OpHmul64(v) 209 case OpHmul64u: 210 return rewriteValueS390X_OpHmul64u(v) 211 case OpITab: 212 return rewriteValueS390X_OpITab(v) 213 case OpInterCall: 214 return rewriteValueS390X_OpInterCall(v) 215 case OpIsInBounds: 216 return rewriteValueS390X_OpIsInBounds(v) 217 case OpIsNonNil: 218 return rewriteValueS390X_OpIsNonNil(v) 219 case OpIsSliceInBounds: 220 return rewriteValueS390X_OpIsSliceInBounds(v) 221 case OpLeq16: 222 return rewriteValueS390X_OpLeq16(v) 223 case OpLeq16U: 224 return rewriteValueS390X_OpLeq16U(v) 225 case OpLeq32: 226 return rewriteValueS390X_OpLeq32(v) 227 case OpLeq32F: 228 return rewriteValueS390X_OpLeq32F(v) 229 case OpLeq32U: 230 return rewriteValueS390X_OpLeq32U(v) 231 case OpLeq64: 232 return rewriteValueS390X_OpLeq64(v) 233 case OpLeq64F: 234 return rewriteValueS390X_OpLeq64F(v) 235 case OpLeq64U: 236 return rewriteValueS390X_OpLeq64U(v) 237 case OpLeq8: 238 return rewriteValueS390X_OpLeq8(v) 239 case OpLeq8U: 240 return rewriteValueS390X_OpLeq8U(v) 241 case OpLess16: 242 return rewriteValueS390X_OpLess16(v) 243 case OpLess16U: 244 return rewriteValueS390X_OpLess16U(v) 245 case OpLess32: 246 return rewriteValueS390X_OpLess32(v) 247 case OpLess32F: 248 return rewriteValueS390X_OpLess32F(v) 249 case OpLess32U: 250 return rewriteValueS390X_OpLess32U(v) 251 case OpLess64: 252 return rewriteValueS390X_OpLess64(v) 253 case OpLess64F: 254 return rewriteValueS390X_OpLess64F(v) 255 case OpLess64U: 256 return rewriteValueS390X_OpLess64U(v) 257 case OpLess8: 258 return rewriteValueS390X_OpLess8(v) 259 case OpLess8U: 260 return rewriteValueS390X_OpLess8U(v) 261 case OpLoad: 262 return rewriteValueS390X_OpLoad(v) 263 case OpLsh16x16: 264 return rewriteValueS390X_OpLsh16x16(v) 265 case OpLsh16x32: 266 return rewriteValueS390X_OpLsh16x32(v) 267 case OpLsh16x64: 268 return rewriteValueS390X_OpLsh16x64(v) 269 case OpLsh16x8: 270 return rewriteValueS390X_OpLsh16x8(v) 271 case OpLsh32x16: 272 return rewriteValueS390X_OpLsh32x16(v) 273 case OpLsh32x32: 274 return rewriteValueS390X_OpLsh32x32(v) 275 case OpLsh32x64: 276 return rewriteValueS390X_OpLsh32x64(v) 277 case OpLsh32x8: 278 return rewriteValueS390X_OpLsh32x8(v) 279 case OpLsh64x16: 280 return rewriteValueS390X_OpLsh64x16(v) 281 case OpLsh64x32: 282 return rewriteValueS390X_OpLsh64x32(v) 283 case OpLsh64x64: 284 return rewriteValueS390X_OpLsh64x64(v) 285 case OpLsh64x8: 286 return rewriteValueS390X_OpLsh64x8(v) 287 case OpLsh8x16: 288 return rewriteValueS390X_OpLsh8x16(v) 289 case OpLsh8x32: 290 return rewriteValueS390X_OpLsh8x32(v) 291 case OpLsh8x64: 292 return rewriteValueS390X_OpLsh8x64(v) 293 case OpLsh8x8: 294 return rewriteValueS390X_OpLsh8x8(v) 295 case OpMod16: 296 return rewriteValueS390X_OpMod16(v) 297 case OpMod16u: 298 return rewriteValueS390X_OpMod16u(v) 299 case OpMod32: 300 return rewriteValueS390X_OpMod32(v) 301 case OpMod32u: 302 return rewriteValueS390X_OpMod32u(v) 303 case OpMod64: 304 return rewriteValueS390X_OpMod64(v) 305 case OpMod64u: 306 return rewriteValueS390X_OpMod64u(v) 307 case OpMod8: 308 return rewriteValueS390X_OpMod8(v) 309 case OpMod8u: 310 return rewriteValueS390X_OpMod8u(v) 311 case OpMove: 312 return rewriteValueS390X_OpMove(v) 313 case OpMul16: 314 return rewriteValueS390X_OpMul16(v) 315 case OpMul32: 316 return rewriteValueS390X_OpMul32(v) 317 case OpMul32F: 318 return rewriteValueS390X_OpMul32F(v) 319 case OpMul64: 320 return rewriteValueS390X_OpMul64(v) 321 case OpMul64F: 322 return rewriteValueS390X_OpMul64F(v) 323 case OpMul8: 324 return rewriteValueS390X_OpMul8(v) 325 case OpNeg16: 326 return rewriteValueS390X_OpNeg16(v) 327 case OpNeg32: 328 return rewriteValueS390X_OpNeg32(v) 329 case OpNeg32F: 330 return rewriteValueS390X_OpNeg32F(v) 331 case OpNeg64: 332 return rewriteValueS390X_OpNeg64(v) 333 case OpNeg64F: 334 return rewriteValueS390X_OpNeg64F(v) 335 case OpNeg8: 336 return rewriteValueS390X_OpNeg8(v) 337 case OpNeq16: 338 return rewriteValueS390X_OpNeq16(v) 339 case OpNeq32: 340 return rewriteValueS390X_OpNeq32(v) 341 case OpNeq32F: 342 return rewriteValueS390X_OpNeq32F(v) 343 case OpNeq64: 344 return rewriteValueS390X_OpNeq64(v) 345 case OpNeq64F: 346 return rewriteValueS390X_OpNeq64F(v) 347 case OpNeq8: 348 return rewriteValueS390X_OpNeq8(v) 349 case OpNeqB: 350 return rewriteValueS390X_OpNeqB(v) 351 case OpNeqPtr: 352 return rewriteValueS390X_OpNeqPtr(v) 353 case OpNilCheck: 354 return rewriteValueS390X_OpNilCheck(v) 355 case OpNot: 356 return rewriteValueS390X_OpNot(v) 357 case OpOffPtr: 358 return rewriteValueS390X_OpOffPtr(v) 359 case OpOr16: 360 return rewriteValueS390X_OpOr16(v) 361 case OpOr32: 362 return rewriteValueS390X_OpOr32(v) 363 case OpOr64: 364 return rewriteValueS390X_OpOr64(v) 365 case OpOr8: 366 return rewriteValueS390X_OpOr8(v) 367 case OpOrB: 368 return rewriteValueS390X_OpOrB(v) 369 case OpRound32F: 370 return rewriteValueS390X_OpRound32F(v) 371 case OpRound64F: 372 return rewriteValueS390X_OpRound64F(v) 373 case OpRsh16Ux16: 374 return rewriteValueS390X_OpRsh16Ux16(v) 375 case OpRsh16Ux32: 376 return rewriteValueS390X_OpRsh16Ux32(v) 377 case OpRsh16Ux64: 378 return rewriteValueS390X_OpRsh16Ux64(v) 379 case OpRsh16Ux8: 380 return rewriteValueS390X_OpRsh16Ux8(v) 381 case OpRsh16x16: 382 return rewriteValueS390X_OpRsh16x16(v) 383 case OpRsh16x32: 384 return rewriteValueS390X_OpRsh16x32(v) 385 case OpRsh16x64: 386 return rewriteValueS390X_OpRsh16x64(v) 387 case OpRsh16x8: 388 return rewriteValueS390X_OpRsh16x8(v) 389 case OpRsh32Ux16: 390 return rewriteValueS390X_OpRsh32Ux16(v) 391 case OpRsh32Ux32: 392 return rewriteValueS390X_OpRsh32Ux32(v) 393 case OpRsh32Ux64: 394 return rewriteValueS390X_OpRsh32Ux64(v) 395 case OpRsh32Ux8: 396 return rewriteValueS390X_OpRsh32Ux8(v) 397 case OpRsh32x16: 398 return rewriteValueS390X_OpRsh32x16(v) 399 case OpRsh32x32: 400 return rewriteValueS390X_OpRsh32x32(v) 401 case OpRsh32x64: 402 return rewriteValueS390X_OpRsh32x64(v) 403 case OpRsh32x8: 404 return rewriteValueS390X_OpRsh32x8(v) 405 case OpRsh64Ux16: 406 return rewriteValueS390X_OpRsh64Ux16(v) 407 case OpRsh64Ux32: 408 return rewriteValueS390X_OpRsh64Ux32(v) 409 case OpRsh64Ux64: 410 return rewriteValueS390X_OpRsh64Ux64(v) 411 case OpRsh64Ux8: 412 return rewriteValueS390X_OpRsh64Ux8(v) 413 case OpRsh64x16: 414 return rewriteValueS390X_OpRsh64x16(v) 415 case OpRsh64x32: 416 return rewriteValueS390X_OpRsh64x32(v) 417 case OpRsh64x64: 418 return rewriteValueS390X_OpRsh64x64(v) 419 case OpRsh64x8: 420 return rewriteValueS390X_OpRsh64x8(v) 421 case OpRsh8Ux16: 422 return rewriteValueS390X_OpRsh8Ux16(v) 423 case OpRsh8Ux32: 424 return rewriteValueS390X_OpRsh8Ux32(v) 425 case OpRsh8Ux64: 426 return rewriteValueS390X_OpRsh8Ux64(v) 427 case OpRsh8Ux8: 428 return rewriteValueS390X_OpRsh8Ux8(v) 429 case OpRsh8x16: 430 return rewriteValueS390X_OpRsh8x16(v) 431 case OpRsh8x32: 432 return rewriteValueS390X_OpRsh8x32(v) 433 case OpRsh8x64: 434 return rewriteValueS390X_OpRsh8x64(v) 435 case OpRsh8x8: 436 return rewriteValueS390X_OpRsh8x8(v) 437 case OpS390XADD: 438 return rewriteValueS390X_OpS390XADD(v) 439 case OpS390XADDW: 440 return rewriteValueS390X_OpS390XADDW(v) 441 case OpS390XADDWconst: 442 return rewriteValueS390X_OpS390XADDWconst(v) 443 case OpS390XADDconst: 444 return rewriteValueS390X_OpS390XADDconst(v) 445 case OpS390XAND: 446 return rewriteValueS390X_OpS390XAND(v) 447 case OpS390XANDW: 448 return rewriteValueS390X_OpS390XANDW(v) 449 case OpS390XANDWconst: 450 return rewriteValueS390X_OpS390XANDWconst(v) 451 case OpS390XANDconst: 452 return rewriteValueS390X_OpS390XANDconst(v) 453 case OpS390XCMP: 454 return rewriteValueS390X_OpS390XCMP(v) 455 case OpS390XCMPU: 456 return rewriteValueS390X_OpS390XCMPU(v) 457 case OpS390XCMPUconst: 458 return rewriteValueS390X_OpS390XCMPUconst(v) 459 case OpS390XCMPW: 460 return rewriteValueS390X_OpS390XCMPW(v) 461 case OpS390XCMPWU: 462 return rewriteValueS390X_OpS390XCMPWU(v) 463 case OpS390XCMPWUconst: 464 return rewriteValueS390X_OpS390XCMPWUconst(v) 465 case OpS390XCMPWconst: 466 return rewriteValueS390X_OpS390XCMPWconst(v) 467 case OpS390XCMPconst: 468 return rewriteValueS390X_OpS390XCMPconst(v) 469 case OpS390XFADD: 470 return rewriteValueS390X_OpS390XFADD(v) 471 case OpS390XFADDS: 472 return rewriteValueS390X_OpS390XFADDS(v) 473 case OpS390XFMOVDload: 474 return rewriteValueS390X_OpS390XFMOVDload(v) 475 case OpS390XFMOVDloadidx: 476 return rewriteValueS390X_OpS390XFMOVDloadidx(v) 477 case OpS390XFMOVDstore: 478 return rewriteValueS390X_OpS390XFMOVDstore(v) 479 case OpS390XFMOVDstoreidx: 480 return rewriteValueS390X_OpS390XFMOVDstoreidx(v) 481 case OpS390XFMOVSload: 482 return rewriteValueS390X_OpS390XFMOVSload(v) 483 case OpS390XFMOVSloadidx: 484 return rewriteValueS390X_OpS390XFMOVSloadidx(v) 485 case OpS390XFMOVSstore: 486 return rewriteValueS390X_OpS390XFMOVSstore(v) 487 case OpS390XFMOVSstoreidx: 488 return rewriteValueS390X_OpS390XFMOVSstoreidx(v) 489 case OpS390XFSUB: 490 return rewriteValueS390X_OpS390XFSUB(v) 491 case OpS390XFSUBS: 492 return rewriteValueS390X_OpS390XFSUBS(v) 493 case OpS390XLoweredRound32F: 494 return rewriteValueS390X_OpS390XLoweredRound32F(v) 495 case OpS390XLoweredRound64F: 496 return rewriteValueS390X_OpS390XLoweredRound64F(v) 497 case OpS390XMOVBZload: 498 return rewriteValueS390X_OpS390XMOVBZload(v) 499 case OpS390XMOVBZloadidx: 500 return rewriteValueS390X_OpS390XMOVBZloadidx(v) 501 case OpS390XMOVBZreg: 502 return rewriteValueS390X_OpS390XMOVBZreg(v) 503 case OpS390XMOVBload: 504 return rewriteValueS390X_OpS390XMOVBload(v) 505 case OpS390XMOVBreg: 506 return rewriteValueS390X_OpS390XMOVBreg(v) 507 case OpS390XMOVBstore: 508 return rewriteValueS390X_OpS390XMOVBstore(v) 509 case OpS390XMOVBstoreconst: 510 return rewriteValueS390X_OpS390XMOVBstoreconst(v) 511 case OpS390XMOVBstoreidx: 512 return rewriteValueS390X_OpS390XMOVBstoreidx(v) 513 case OpS390XMOVDEQ: 514 return rewriteValueS390X_OpS390XMOVDEQ(v) 515 case OpS390XMOVDGE: 516 return rewriteValueS390X_OpS390XMOVDGE(v) 517 case OpS390XMOVDGT: 518 return rewriteValueS390X_OpS390XMOVDGT(v) 519 case OpS390XMOVDLE: 520 return rewriteValueS390X_OpS390XMOVDLE(v) 521 case OpS390XMOVDLT: 522 return rewriteValueS390X_OpS390XMOVDLT(v) 523 case OpS390XMOVDNE: 524 return rewriteValueS390X_OpS390XMOVDNE(v) 525 case OpS390XMOVDaddridx: 526 return rewriteValueS390X_OpS390XMOVDaddridx(v) 527 case OpS390XMOVDload: 528 return rewriteValueS390X_OpS390XMOVDload(v) 529 case OpS390XMOVDloadidx: 530 return rewriteValueS390X_OpS390XMOVDloadidx(v) 531 case OpS390XMOVDnop: 532 return rewriteValueS390X_OpS390XMOVDnop(v) 533 case OpS390XMOVDreg: 534 return rewriteValueS390X_OpS390XMOVDreg(v) 535 case OpS390XMOVDstore: 536 return rewriteValueS390X_OpS390XMOVDstore(v) 537 case OpS390XMOVDstoreconst: 538 return rewriteValueS390X_OpS390XMOVDstoreconst(v) 539 case OpS390XMOVDstoreidx: 540 return rewriteValueS390X_OpS390XMOVDstoreidx(v) 541 case OpS390XMOVHBRstore: 542 return rewriteValueS390X_OpS390XMOVHBRstore(v) 543 case OpS390XMOVHBRstoreidx: 544 return rewriteValueS390X_OpS390XMOVHBRstoreidx(v) 545 case OpS390XMOVHZload: 546 return rewriteValueS390X_OpS390XMOVHZload(v) 547 case OpS390XMOVHZloadidx: 548 return rewriteValueS390X_OpS390XMOVHZloadidx(v) 549 case OpS390XMOVHZreg: 550 return rewriteValueS390X_OpS390XMOVHZreg(v) 551 case OpS390XMOVHload: 552 return rewriteValueS390X_OpS390XMOVHload(v) 553 case OpS390XMOVHreg: 554 return rewriteValueS390X_OpS390XMOVHreg(v) 555 case OpS390XMOVHstore: 556 return rewriteValueS390X_OpS390XMOVHstore(v) 557 case OpS390XMOVHstoreconst: 558 return rewriteValueS390X_OpS390XMOVHstoreconst(v) 559 case OpS390XMOVHstoreidx: 560 return rewriteValueS390X_OpS390XMOVHstoreidx(v) 561 case OpS390XMOVWBRstore: 562 return rewriteValueS390X_OpS390XMOVWBRstore(v) 563 case OpS390XMOVWBRstoreidx: 564 return rewriteValueS390X_OpS390XMOVWBRstoreidx(v) 565 case OpS390XMOVWZload: 566 return rewriteValueS390X_OpS390XMOVWZload(v) 567 case OpS390XMOVWZloadidx: 568 return rewriteValueS390X_OpS390XMOVWZloadidx(v) 569 case OpS390XMOVWZreg: 570 return rewriteValueS390X_OpS390XMOVWZreg(v) 571 case OpS390XMOVWload: 572 return rewriteValueS390X_OpS390XMOVWload(v) 573 case OpS390XMOVWreg: 574 return rewriteValueS390X_OpS390XMOVWreg(v) 575 case OpS390XMOVWstore: 576 return rewriteValueS390X_OpS390XMOVWstore(v) 577 case OpS390XMOVWstoreconst: 578 return rewriteValueS390X_OpS390XMOVWstoreconst(v) 579 case OpS390XMOVWstoreidx: 580 return rewriteValueS390X_OpS390XMOVWstoreidx(v) 581 case OpS390XMULLD: 582 return rewriteValueS390X_OpS390XMULLD(v) 583 case OpS390XMULLDconst: 584 return rewriteValueS390X_OpS390XMULLDconst(v) 585 case OpS390XMULLW: 586 return rewriteValueS390X_OpS390XMULLW(v) 587 case OpS390XMULLWconst: 588 return rewriteValueS390X_OpS390XMULLWconst(v) 589 case OpS390XNEG: 590 return rewriteValueS390X_OpS390XNEG(v) 591 case OpS390XNEGW: 592 return rewriteValueS390X_OpS390XNEGW(v) 593 case OpS390XNOT: 594 return rewriteValueS390X_OpS390XNOT(v) 595 case OpS390XNOTW: 596 return rewriteValueS390X_OpS390XNOTW(v) 597 case OpS390XOR: 598 return rewriteValueS390X_OpS390XOR(v) 599 case OpS390XORW: 600 return rewriteValueS390X_OpS390XORW(v) 601 case OpS390XORWconst: 602 return rewriteValueS390X_OpS390XORWconst(v) 603 case OpS390XORconst: 604 return rewriteValueS390X_OpS390XORconst(v) 605 case OpS390XSLD: 606 return rewriteValueS390X_OpS390XSLD(v) 607 case OpS390XSLW: 608 return rewriteValueS390X_OpS390XSLW(v) 609 case OpS390XSRAD: 610 return rewriteValueS390X_OpS390XSRAD(v) 611 case OpS390XSRADconst: 612 return rewriteValueS390X_OpS390XSRADconst(v) 613 case OpS390XSRAW: 614 return rewriteValueS390X_OpS390XSRAW(v) 615 case OpS390XSRAWconst: 616 return rewriteValueS390X_OpS390XSRAWconst(v) 617 case OpS390XSRD: 618 return rewriteValueS390X_OpS390XSRD(v) 619 case OpS390XSRW: 620 return rewriteValueS390X_OpS390XSRW(v) 621 case OpS390XSTM2: 622 return rewriteValueS390X_OpS390XSTM2(v) 623 case OpS390XSTMG2: 624 return rewriteValueS390X_OpS390XSTMG2(v) 625 case OpS390XSUB: 626 return rewriteValueS390X_OpS390XSUB(v) 627 case OpS390XSUBEWcarrymask: 628 return rewriteValueS390X_OpS390XSUBEWcarrymask(v) 629 case OpS390XSUBEcarrymask: 630 return rewriteValueS390X_OpS390XSUBEcarrymask(v) 631 case OpS390XSUBW: 632 return rewriteValueS390X_OpS390XSUBW(v) 633 case OpS390XSUBWconst: 634 return rewriteValueS390X_OpS390XSUBWconst(v) 635 case OpS390XSUBconst: 636 return rewriteValueS390X_OpS390XSUBconst(v) 637 case OpS390XXOR: 638 return rewriteValueS390X_OpS390XXOR(v) 639 case OpS390XXORW: 640 return rewriteValueS390X_OpS390XXORW(v) 641 case OpS390XXORWconst: 642 return rewriteValueS390X_OpS390XXORWconst(v) 643 case OpS390XXORconst: 644 return rewriteValueS390X_OpS390XXORconst(v) 645 case OpSelect0: 646 return rewriteValueS390X_OpSelect0(v) 647 case OpSelect1: 648 return rewriteValueS390X_OpSelect1(v) 649 case OpSignExt16to32: 650 return rewriteValueS390X_OpSignExt16to32(v) 651 case OpSignExt16to64: 652 return rewriteValueS390X_OpSignExt16to64(v) 653 case OpSignExt32to64: 654 return rewriteValueS390X_OpSignExt32to64(v) 655 case OpSignExt8to16: 656 return rewriteValueS390X_OpSignExt8to16(v) 657 case OpSignExt8to32: 658 return rewriteValueS390X_OpSignExt8to32(v) 659 case OpSignExt8to64: 660 return rewriteValueS390X_OpSignExt8to64(v) 661 case OpSlicemask: 662 return rewriteValueS390X_OpSlicemask(v) 663 case OpSqrt: 664 return rewriteValueS390X_OpSqrt(v) 665 case OpStaticCall: 666 return rewriteValueS390X_OpStaticCall(v) 667 case OpStore: 668 return rewriteValueS390X_OpStore(v) 669 case OpSub16: 670 return rewriteValueS390X_OpSub16(v) 671 case OpSub32: 672 return rewriteValueS390X_OpSub32(v) 673 case OpSub32F: 674 return rewriteValueS390X_OpSub32F(v) 675 case OpSub64: 676 return rewriteValueS390X_OpSub64(v) 677 case OpSub64F: 678 return rewriteValueS390X_OpSub64F(v) 679 case OpSub8: 680 return rewriteValueS390X_OpSub8(v) 681 case OpSubPtr: 682 return rewriteValueS390X_OpSubPtr(v) 683 case OpTrunc16to8: 684 return rewriteValueS390X_OpTrunc16to8(v) 685 case OpTrunc32to16: 686 return rewriteValueS390X_OpTrunc32to16(v) 687 case OpTrunc32to8: 688 return rewriteValueS390X_OpTrunc32to8(v) 689 case OpTrunc64to16: 690 return rewriteValueS390X_OpTrunc64to16(v) 691 case OpTrunc64to32: 692 return rewriteValueS390X_OpTrunc64to32(v) 693 case OpTrunc64to8: 694 return rewriteValueS390X_OpTrunc64to8(v) 695 case OpXor16: 696 return rewriteValueS390X_OpXor16(v) 697 case OpXor32: 698 return rewriteValueS390X_OpXor32(v) 699 case OpXor64: 700 return rewriteValueS390X_OpXor64(v) 701 case OpXor8: 702 return rewriteValueS390X_OpXor8(v) 703 case OpZero: 704 return rewriteValueS390X_OpZero(v) 705 case OpZeroExt16to32: 706 return rewriteValueS390X_OpZeroExt16to32(v) 707 case OpZeroExt16to64: 708 return rewriteValueS390X_OpZeroExt16to64(v) 709 case OpZeroExt32to64: 710 return rewriteValueS390X_OpZeroExt32to64(v) 711 case OpZeroExt8to16: 712 return rewriteValueS390X_OpZeroExt8to16(v) 713 case OpZeroExt8to32: 714 return rewriteValueS390X_OpZeroExt8to32(v) 715 case OpZeroExt8to64: 716 return rewriteValueS390X_OpZeroExt8to64(v) 717 } 718 return false 719 } 720 func rewriteValueS390X_OpAdd16(v *Value) bool { 721 // match: (Add16 x y) 722 // cond: 723 // result: (ADDW x y) 724 for { 725 x := v.Args[0] 726 y := v.Args[1] 727 v.reset(OpS390XADDW) 728 v.AddArg(x) 729 v.AddArg(y) 730 return true 731 } 732 } 733 func rewriteValueS390X_OpAdd32(v *Value) bool { 734 // match: (Add32 x y) 735 // cond: 736 // result: (ADDW x y) 737 for { 738 x := v.Args[0] 739 y := v.Args[1] 740 v.reset(OpS390XADDW) 741 v.AddArg(x) 742 v.AddArg(y) 743 return true 744 } 745 } 746 func rewriteValueS390X_OpAdd32F(v *Value) bool { 747 // match: (Add32F x y) 748 // cond: 749 // result: (FADDS x y) 750 for { 751 x := v.Args[0] 752 y := v.Args[1] 753 v.reset(OpS390XFADDS) 754 v.AddArg(x) 755 v.AddArg(y) 756 return true 757 } 758 } 759 func rewriteValueS390X_OpAdd64(v *Value) bool { 760 // match: (Add64 x y) 761 // cond: 762 // result: (ADD x y) 763 for { 764 x := v.Args[0] 765 y := v.Args[1] 766 v.reset(OpS390XADD) 767 v.AddArg(x) 768 v.AddArg(y) 769 return true 770 } 771 } 772 func rewriteValueS390X_OpAdd64F(v *Value) bool { 773 // match: (Add64F x y) 774 // cond: 775 // result: (FADD x y) 776 for { 777 x := v.Args[0] 778 y := v.Args[1] 779 v.reset(OpS390XFADD) 780 v.AddArg(x) 781 v.AddArg(y) 782 return true 783 } 784 } 785 func rewriteValueS390X_OpAdd8(v *Value) bool { 786 // match: (Add8 x y) 787 // cond: 788 // result: (ADDW x y) 789 for { 790 x := v.Args[0] 791 y := v.Args[1] 792 v.reset(OpS390XADDW) 793 v.AddArg(x) 794 v.AddArg(y) 795 return true 796 } 797 } 798 func rewriteValueS390X_OpAddPtr(v *Value) bool { 799 // match: (AddPtr x y) 800 // cond: 801 // result: (ADD x y) 802 for { 803 x := v.Args[0] 804 y := v.Args[1] 805 v.reset(OpS390XADD) 806 v.AddArg(x) 807 v.AddArg(y) 808 return true 809 } 810 } 811 func rewriteValueS390X_OpAddr(v *Value) bool { 812 // match: (Addr {sym} base) 813 // cond: 814 // result: (MOVDaddr {sym} base) 815 for { 816 sym := v.Aux 817 base := v.Args[0] 818 v.reset(OpS390XMOVDaddr) 819 v.Aux = sym 820 v.AddArg(base) 821 return true 822 } 823 } 824 func rewriteValueS390X_OpAnd16(v *Value) bool { 825 // match: (And16 x y) 826 // cond: 827 // result: (ANDW x y) 828 for { 829 x := v.Args[0] 830 y := v.Args[1] 831 v.reset(OpS390XANDW) 832 v.AddArg(x) 833 v.AddArg(y) 834 return true 835 } 836 } 837 func rewriteValueS390X_OpAnd32(v *Value) bool { 838 // match: (And32 x y) 839 // cond: 840 // result: (ANDW x y) 841 for { 842 x := v.Args[0] 843 y := v.Args[1] 844 v.reset(OpS390XANDW) 845 v.AddArg(x) 846 v.AddArg(y) 847 return true 848 } 849 } 850 func rewriteValueS390X_OpAnd64(v *Value) bool { 851 // match: (And64 x y) 852 // cond: 853 // result: (AND x y) 854 for { 855 x := v.Args[0] 856 y := v.Args[1] 857 v.reset(OpS390XAND) 858 v.AddArg(x) 859 v.AddArg(y) 860 return true 861 } 862 } 863 func rewriteValueS390X_OpAnd8(v *Value) bool { 864 // match: (And8 x y) 865 // cond: 866 // result: (ANDW x y) 867 for { 868 x := v.Args[0] 869 y := v.Args[1] 870 v.reset(OpS390XANDW) 871 v.AddArg(x) 872 v.AddArg(y) 873 return true 874 } 875 } 876 func rewriteValueS390X_OpAndB(v *Value) bool { 877 // match: (AndB x y) 878 // cond: 879 // result: (ANDW x y) 880 for { 881 x := v.Args[0] 882 y := v.Args[1] 883 v.reset(OpS390XANDW) 884 v.AddArg(x) 885 v.AddArg(y) 886 return true 887 } 888 } 889 func rewriteValueS390X_OpAtomicAdd32(v *Value) bool { 890 b := v.Block 891 _ = b 892 types := &b.Func.Config.Types 893 _ = types 894 // match: (AtomicAdd32 ptr val mem) 895 // cond: 896 // result: (AddTupleFirst32 (LAA ptr val mem) val) 897 for { 898 ptr := v.Args[0] 899 val := v.Args[1] 900 mem := v.Args[2] 901 v.reset(OpS390XAddTupleFirst32) 902 v0 := b.NewValue0(v.Pos, OpS390XLAA, MakeTuple(types.UInt32, TypeMem)) 903 v0.AddArg(ptr) 904 v0.AddArg(val) 905 v0.AddArg(mem) 906 v.AddArg(v0) 907 v.AddArg(val) 908 return true 909 } 910 } 911 func rewriteValueS390X_OpAtomicAdd64(v *Value) bool { 912 b := v.Block 913 _ = b 914 types := &b.Func.Config.Types 915 _ = types 916 // match: (AtomicAdd64 ptr val mem) 917 // cond: 918 // result: (AddTupleFirst64 (LAAG ptr val mem) val) 919 for { 920 ptr := v.Args[0] 921 val := v.Args[1] 922 mem := v.Args[2] 923 v.reset(OpS390XAddTupleFirst64) 924 v0 := b.NewValue0(v.Pos, OpS390XLAAG, MakeTuple(types.UInt64, TypeMem)) 925 v0.AddArg(ptr) 926 v0.AddArg(val) 927 v0.AddArg(mem) 928 v.AddArg(v0) 929 v.AddArg(val) 930 return true 931 } 932 } 933 func rewriteValueS390X_OpAtomicCompareAndSwap32(v *Value) bool { 934 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 935 // cond: 936 // result: (LoweredAtomicCas32 ptr old new_ mem) 937 for { 938 ptr := v.Args[0] 939 old := v.Args[1] 940 new_ := v.Args[2] 941 mem := v.Args[3] 942 v.reset(OpS390XLoweredAtomicCas32) 943 v.AddArg(ptr) 944 v.AddArg(old) 945 v.AddArg(new_) 946 v.AddArg(mem) 947 return true 948 } 949 } 950 func rewriteValueS390X_OpAtomicCompareAndSwap64(v *Value) bool { 951 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 952 // cond: 953 // result: (LoweredAtomicCas64 ptr old new_ mem) 954 for { 955 ptr := v.Args[0] 956 old := v.Args[1] 957 new_ := v.Args[2] 958 mem := v.Args[3] 959 v.reset(OpS390XLoweredAtomicCas64) 960 v.AddArg(ptr) 961 v.AddArg(old) 962 v.AddArg(new_) 963 v.AddArg(mem) 964 return true 965 } 966 } 967 func rewriteValueS390X_OpAtomicExchange32(v *Value) bool { 968 // match: (AtomicExchange32 ptr val mem) 969 // cond: 970 // result: (LoweredAtomicExchange32 ptr val mem) 971 for { 972 ptr := v.Args[0] 973 val := v.Args[1] 974 mem := v.Args[2] 975 v.reset(OpS390XLoweredAtomicExchange32) 976 v.AddArg(ptr) 977 v.AddArg(val) 978 v.AddArg(mem) 979 return true 980 } 981 } 982 func rewriteValueS390X_OpAtomicExchange64(v *Value) bool { 983 // match: (AtomicExchange64 ptr val mem) 984 // cond: 985 // result: (LoweredAtomicExchange64 ptr val mem) 986 for { 987 ptr := v.Args[0] 988 val := v.Args[1] 989 mem := v.Args[2] 990 v.reset(OpS390XLoweredAtomicExchange64) 991 v.AddArg(ptr) 992 v.AddArg(val) 993 v.AddArg(mem) 994 return true 995 } 996 } 997 func rewriteValueS390X_OpAtomicLoad32(v *Value) bool { 998 // match: (AtomicLoad32 ptr mem) 999 // cond: 1000 // result: (MOVWZatomicload ptr mem) 1001 for { 1002 ptr := v.Args[0] 1003 mem := v.Args[1] 1004 v.reset(OpS390XMOVWZatomicload) 1005 v.AddArg(ptr) 1006 v.AddArg(mem) 1007 return true 1008 } 1009 } 1010 func rewriteValueS390X_OpAtomicLoad64(v *Value) bool { 1011 // match: (AtomicLoad64 ptr mem) 1012 // cond: 1013 // result: (MOVDatomicload ptr mem) 1014 for { 1015 ptr := v.Args[0] 1016 mem := v.Args[1] 1017 v.reset(OpS390XMOVDatomicload) 1018 v.AddArg(ptr) 1019 v.AddArg(mem) 1020 return true 1021 } 1022 } 1023 func rewriteValueS390X_OpAtomicLoadPtr(v *Value) bool { 1024 // match: (AtomicLoadPtr ptr mem) 1025 // cond: 1026 // result: (MOVDatomicload ptr mem) 1027 for { 1028 ptr := v.Args[0] 1029 mem := v.Args[1] 1030 v.reset(OpS390XMOVDatomicload) 1031 v.AddArg(ptr) 1032 v.AddArg(mem) 1033 return true 1034 } 1035 } 1036 func rewriteValueS390X_OpAtomicStore32(v *Value) bool { 1037 // match: (AtomicStore32 ptr val mem) 1038 // cond: 1039 // result: (MOVWatomicstore ptr val mem) 1040 for { 1041 ptr := v.Args[0] 1042 val := v.Args[1] 1043 mem := v.Args[2] 1044 v.reset(OpS390XMOVWatomicstore) 1045 v.AddArg(ptr) 1046 v.AddArg(val) 1047 v.AddArg(mem) 1048 return true 1049 } 1050 } 1051 func rewriteValueS390X_OpAtomicStore64(v *Value) bool { 1052 // match: (AtomicStore64 ptr val mem) 1053 // cond: 1054 // result: (MOVDatomicstore ptr val mem) 1055 for { 1056 ptr := v.Args[0] 1057 val := v.Args[1] 1058 mem := v.Args[2] 1059 v.reset(OpS390XMOVDatomicstore) 1060 v.AddArg(ptr) 1061 v.AddArg(val) 1062 v.AddArg(mem) 1063 return true 1064 } 1065 } 1066 func rewriteValueS390X_OpAtomicStorePtrNoWB(v *Value) bool { 1067 // match: (AtomicStorePtrNoWB ptr val mem) 1068 // cond: 1069 // result: (MOVDatomicstore ptr val mem) 1070 for { 1071 ptr := v.Args[0] 1072 val := v.Args[1] 1073 mem := v.Args[2] 1074 v.reset(OpS390XMOVDatomicstore) 1075 v.AddArg(ptr) 1076 v.AddArg(val) 1077 v.AddArg(mem) 1078 return true 1079 } 1080 } 1081 func rewriteValueS390X_OpAvg64u(v *Value) bool { 1082 b := v.Block 1083 _ = b 1084 // match: (Avg64u <t> x y) 1085 // cond: 1086 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1087 for { 1088 t := v.Type 1089 x := v.Args[0] 1090 y := v.Args[1] 1091 v.reset(OpS390XADD) 1092 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1093 v0.AuxInt = 1 1094 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1095 v1.AddArg(x) 1096 v1.AddArg(y) 1097 v0.AddArg(v1) 1098 v.AddArg(v0) 1099 v.AddArg(y) 1100 return true 1101 } 1102 } 1103 func rewriteValueS390X_OpBitLen64(v *Value) bool { 1104 b := v.Block 1105 _ = b 1106 types := &b.Func.Config.Types 1107 _ = types 1108 // match: (BitLen64 x) 1109 // cond: 1110 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1111 for { 1112 x := v.Args[0] 1113 v.reset(OpS390XSUB) 1114 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1115 v0.AuxInt = 64 1116 v.AddArg(v0) 1117 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, types.UInt64) 1118 v1.AddArg(x) 1119 v.AddArg(v1) 1120 return true 1121 } 1122 } 1123 func rewriteValueS390X_OpBswap32(v *Value) bool { 1124 // match: (Bswap32 x) 1125 // cond: 1126 // result: (MOVWBR x) 1127 for { 1128 x := v.Args[0] 1129 v.reset(OpS390XMOVWBR) 1130 v.AddArg(x) 1131 return true 1132 } 1133 } 1134 func rewriteValueS390X_OpBswap64(v *Value) bool { 1135 // match: (Bswap64 x) 1136 // cond: 1137 // result: (MOVDBR x) 1138 for { 1139 x := v.Args[0] 1140 v.reset(OpS390XMOVDBR) 1141 v.AddArg(x) 1142 return true 1143 } 1144 } 1145 func rewriteValueS390X_OpClosureCall(v *Value) bool { 1146 // match: (ClosureCall [argwid] entry closure mem) 1147 // cond: 1148 // result: (CALLclosure [argwid] entry closure mem) 1149 for { 1150 argwid := v.AuxInt 1151 entry := v.Args[0] 1152 closure := v.Args[1] 1153 mem := v.Args[2] 1154 v.reset(OpS390XCALLclosure) 1155 v.AuxInt = argwid 1156 v.AddArg(entry) 1157 v.AddArg(closure) 1158 v.AddArg(mem) 1159 return true 1160 } 1161 } 1162 func rewriteValueS390X_OpCom16(v *Value) bool { 1163 // match: (Com16 x) 1164 // cond: 1165 // result: (NOTW x) 1166 for { 1167 x := v.Args[0] 1168 v.reset(OpS390XNOTW) 1169 v.AddArg(x) 1170 return true 1171 } 1172 } 1173 func rewriteValueS390X_OpCom32(v *Value) bool { 1174 // match: (Com32 x) 1175 // cond: 1176 // result: (NOTW x) 1177 for { 1178 x := v.Args[0] 1179 v.reset(OpS390XNOTW) 1180 v.AddArg(x) 1181 return true 1182 } 1183 } 1184 func rewriteValueS390X_OpCom64(v *Value) bool { 1185 // match: (Com64 x) 1186 // cond: 1187 // result: (NOT x) 1188 for { 1189 x := v.Args[0] 1190 v.reset(OpS390XNOT) 1191 v.AddArg(x) 1192 return true 1193 } 1194 } 1195 func rewriteValueS390X_OpCom8(v *Value) bool { 1196 // match: (Com8 x) 1197 // cond: 1198 // result: (NOTW x) 1199 for { 1200 x := v.Args[0] 1201 v.reset(OpS390XNOTW) 1202 v.AddArg(x) 1203 return true 1204 } 1205 } 1206 func rewriteValueS390X_OpConst16(v *Value) bool { 1207 // match: (Const16 [val]) 1208 // cond: 1209 // result: (MOVDconst [val]) 1210 for { 1211 val := v.AuxInt 1212 v.reset(OpS390XMOVDconst) 1213 v.AuxInt = val 1214 return true 1215 } 1216 } 1217 func rewriteValueS390X_OpConst32(v *Value) bool { 1218 // match: (Const32 [val]) 1219 // cond: 1220 // result: (MOVDconst [val]) 1221 for { 1222 val := v.AuxInt 1223 v.reset(OpS390XMOVDconst) 1224 v.AuxInt = val 1225 return true 1226 } 1227 } 1228 func rewriteValueS390X_OpConst32F(v *Value) bool { 1229 // match: (Const32F [val]) 1230 // cond: 1231 // result: (FMOVSconst [val]) 1232 for { 1233 val := v.AuxInt 1234 v.reset(OpS390XFMOVSconst) 1235 v.AuxInt = val 1236 return true 1237 } 1238 } 1239 func rewriteValueS390X_OpConst64(v *Value) bool { 1240 // match: (Const64 [val]) 1241 // cond: 1242 // result: (MOVDconst [val]) 1243 for { 1244 val := v.AuxInt 1245 v.reset(OpS390XMOVDconst) 1246 v.AuxInt = val 1247 return true 1248 } 1249 } 1250 func rewriteValueS390X_OpConst64F(v *Value) bool { 1251 // match: (Const64F [val]) 1252 // cond: 1253 // result: (FMOVDconst [val]) 1254 for { 1255 val := v.AuxInt 1256 v.reset(OpS390XFMOVDconst) 1257 v.AuxInt = val 1258 return true 1259 } 1260 } 1261 func rewriteValueS390X_OpConst8(v *Value) bool { 1262 // match: (Const8 [val]) 1263 // cond: 1264 // result: (MOVDconst [val]) 1265 for { 1266 val := v.AuxInt 1267 v.reset(OpS390XMOVDconst) 1268 v.AuxInt = val 1269 return true 1270 } 1271 } 1272 func rewriteValueS390X_OpConstBool(v *Value) bool { 1273 // match: (ConstBool [b]) 1274 // cond: 1275 // result: (MOVDconst [b]) 1276 for { 1277 b := v.AuxInt 1278 v.reset(OpS390XMOVDconst) 1279 v.AuxInt = b 1280 return true 1281 } 1282 } 1283 func rewriteValueS390X_OpConstNil(v *Value) bool { 1284 // match: (ConstNil) 1285 // cond: 1286 // result: (MOVDconst [0]) 1287 for { 1288 v.reset(OpS390XMOVDconst) 1289 v.AuxInt = 0 1290 return true 1291 } 1292 } 1293 func rewriteValueS390X_OpConvert(v *Value) bool { 1294 // match: (Convert <t> x mem) 1295 // cond: 1296 // result: (MOVDconvert <t> x mem) 1297 for { 1298 t := v.Type 1299 x := v.Args[0] 1300 mem := v.Args[1] 1301 v.reset(OpS390XMOVDconvert) 1302 v.Type = t 1303 v.AddArg(x) 1304 v.AddArg(mem) 1305 return true 1306 } 1307 } 1308 func rewriteValueS390X_OpCtz32(v *Value) bool { 1309 b := v.Block 1310 _ = b 1311 types := &b.Func.Config.Types 1312 _ = types 1313 // match: (Ctz32 <t> x) 1314 // cond: 1315 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1316 for { 1317 t := v.Type 1318 x := v.Args[0] 1319 v.reset(OpS390XSUB) 1320 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1321 v0.AuxInt = 64 1322 v.AddArg(v0) 1323 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, types.UInt64) 1324 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 1325 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1326 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1327 v4.AuxInt = 1 1328 v4.AddArg(x) 1329 v3.AddArg(v4) 1330 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1331 v5.AddArg(x) 1332 v3.AddArg(v5) 1333 v2.AddArg(v3) 1334 v1.AddArg(v2) 1335 v.AddArg(v1) 1336 return true 1337 } 1338 } 1339 func rewriteValueS390X_OpCtz64(v *Value) bool { 1340 b := v.Block 1341 _ = b 1342 types := &b.Func.Config.Types 1343 _ = types 1344 // match: (Ctz64 <t> x) 1345 // cond: 1346 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1347 for { 1348 t := v.Type 1349 x := v.Args[0] 1350 v.reset(OpS390XSUB) 1351 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1352 v0.AuxInt = 64 1353 v.AddArg(v0) 1354 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, types.UInt64) 1355 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1356 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1357 v3.AuxInt = 1 1358 v3.AddArg(x) 1359 v2.AddArg(v3) 1360 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1361 v4.AddArg(x) 1362 v2.AddArg(v4) 1363 v1.AddArg(v2) 1364 v.AddArg(v1) 1365 return true 1366 } 1367 } 1368 func rewriteValueS390X_OpCvt32Fto32(v *Value) bool { 1369 // match: (Cvt32Fto32 x) 1370 // cond: 1371 // result: (CFEBRA x) 1372 for { 1373 x := v.Args[0] 1374 v.reset(OpS390XCFEBRA) 1375 v.AddArg(x) 1376 return true 1377 } 1378 } 1379 func rewriteValueS390X_OpCvt32Fto64(v *Value) bool { 1380 // match: (Cvt32Fto64 x) 1381 // cond: 1382 // result: (CGEBRA x) 1383 for { 1384 x := v.Args[0] 1385 v.reset(OpS390XCGEBRA) 1386 v.AddArg(x) 1387 return true 1388 } 1389 } 1390 func rewriteValueS390X_OpCvt32Fto64F(v *Value) bool { 1391 // match: (Cvt32Fto64F x) 1392 // cond: 1393 // result: (LDEBR x) 1394 for { 1395 x := v.Args[0] 1396 v.reset(OpS390XLDEBR) 1397 v.AddArg(x) 1398 return true 1399 } 1400 } 1401 func rewriteValueS390X_OpCvt32to32F(v *Value) bool { 1402 // match: (Cvt32to32F x) 1403 // cond: 1404 // result: (CEFBRA x) 1405 for { 1406 x := v.Args[0] 1407 v.reset(OpS390XCEFBRA) 1408 v.AddArg(x) 1409 return true 1410 } 1411 } 1412 func rewriteValueS390X_OpCvt32to64F(v *Value) bool { 1413 // match: (Cvt32to64F x) 1414 // cond: 1415 // result: (CDFBRA x) 1416 for { 1417 x := v.Args[0] 1418 v.reset(OpS390XCDFBRA) 1419 v.AddArg(x) 1420 return true 1421 } 1422 } 1423 func rewriteValueS390X_OpCvt64Fto32(v *Value) bool { 1424 // match: (Cvt64Fto32 x) 1425 // cond: 1426 // result: (CFDBRA x) 1427 for { 1428 x := v.Args[0] 1429 v.reset(OpS390XCFDBRA) 1430 v.AddArg(x) 1431 return true 1432 } 1433 } 1434 func rewriteValueS390X_OpCvt64Fto32F(v *Value) bool { 1435 // match: (Cvt64Fto32F x) 1436 // cond: 1437 // result: (LEDBR x) 1438 for { 1439 x := v.Args[0] 1440 v.reset(OpS390XLEDBR) 1441 v.AddArg(x) 1442 return true 1443 } 1444 } 1445 func rewriteValueS390X_OpCvt64Fto64(v *Value) bool { 1446 // match: (Cvt64Fto64 x) 1447 // cond: 1448 // result: (CGDBRA x) 1449 for { 1450 x := v.Args[0] 1451 v.reset(OpS390XCGDBRA) 1452 v.AddArg(x) 1453 return true 1454 } 1455 } 1456 func rewriteValueS390X_OpCvt64to32F(v *Value) bool { 1457 // match: (Cvt64to32F x) 1458 // cond: 1459 // result: (CEGBRA x) 1460 for { 1461 x := v.Args[0] 1462 v.reset(OpS390XCEGBRA) 1463 v.AddArg(x) 1464 return true 1465 } 1466 } 1467 func rewriteValueS390X_OpCvt64to64F(v *Value) bool { 1468 // match: (Cvt64to64F x) 1469 // cond: 1470 // result: (CDGBRA x) 1471 for { 1472 x := v.Args[0] 1473 v.reset(OpS390XCDGBRA) 1474 v.AddArg(x) 1475 return true 1476 } 1477 } 1478 func rewriteValueS390X_OpDiv16(v *Value) bool { 1479 b := v.Block 1480 _ = b 1481 types := &b.Func.Config.Types 1482 _ = types 1483 // match: (Div16 x y) 1484 // cond: 1485 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1486 for { 1487 x := v.Args[0] 1488 y := v.Args[1] 1489 v.reset(OpS390XDIVW) 1490 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1491 v0.AddArg(x) 1492 v.AddArg(v0) 1493 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1494 v1.AddArg(y) 1495 v.AddArg(v1) 1496 return true 1497 } 1498 } 1499 func rewriteValueS390X_OpDiv16u(v *Value) bool { 1500 b := v.Block 1501 _ = b 1502 types := &b.Func.Config.Types 1503 _ = types 1504 // match: (Div16u x y) 1505 // cond: 1506 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1507 for { 1508 x := v.Args[0] 1509 y := v.Args[1] 1510 v.reset(OpS390XDIVWU) 1511 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1512 v0.AddArg(x) 1513 v.AddArg(v0) 1514 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1515 v1.AddArg(y) 1516 v.AddArg(v1) 1517 return true 1518 } 1519 } 1520 func rewriteValueS390X_OpDiv32(v *Value) bool { 1521 b := v.Block 1522 _ = b 1523 types := &b.Func.Config.Types 1524 _ = types 1525 // match: (Div32 x y) 1526 // cond: 1527 // result: (DIVW (MOVWreg x) y) 1528 for { 1529 x := v.Args[0] 1530 y := v.Args[1] 1531 v.reset(OpS390XDIVW) 1532 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 1533 v0.AddArg(x) 1534 v.AddArg(v0) 1535 v.AddArg(y) 1536 return true 1537 } 1538 } 1539 func rewriteValueS390X_OpDiv32F(v *Value) bool { 1540 // match: (Div32F x y) 1541 // cond: 1542 // result: (FDIVS x y) 1543 for { 1544 x := v.Args[0] 1545 y := v.Args[1] 1546 v.reset(OpS390XFDIVS) 1547 v.AddArg(x) 1548 v.AddArg(y) 1549 return true 1550 } 1551 } 1552 func rewriteValueS390X_OpDiv32u(v *Value) bool { 1553 b := v.Block 1554 _ = b 1555 types := &b.Func.Config.Types 1556 _ = types 1557 // match: (Div32u x y) 1558 // cond: 1559 // result: (DIVWU (MOVWZreg x) y) 1560 for { 1561 x := v.Args[0] 1562 y := v.Args[1] 1563 v.reset(OpS390XDIVWU) 1564 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 1565 v0.AddArg(x) 1566 v.AddArg(v0) 1567 v.AddArg(y) 1568 return true 1569 } 1570 } 1571 func rewriteValueS390X_OpDiv64(v *Value) bool { 1572 // match: (Div64 x y) 1573 // cond: 1574 // result: (DIVD x y) 1575 for { 1576 x := v.Args[0] 1577 y := v.Args[1] 1578 v.reset(OpS390XDIVD) 1579 v.AddArg(x) 1580 v.AddArg(y) 1581 return true 1582 } 1583 } 1584 func rewriteValueS390X_OpDiv64F(v *Value) bool { 1585 // match: (Div64F x y) 1586 // cond: 1587 // result: (FDIV x y) 1588 for { 1589 x := v.Args[0] 1590 y := v.Args[1] 1591 v.reset(OpS390XFDIV) 1592 v.AddArg(x) 1593 v.AddArg(y) 1594 return true 1595 } 1596 } 1597 func rewriteValueS390X_OpDiv64u(v *Value) bool { 1598 // match: (Div64u x y) 1599 // cond: 1600 // result: (DIVDU x y) 1601 for { 1602 x := v.Args[0] 1603 y := v.Args[1] 1604 v.reset(OpS390XDIVDU) 1605 v.AddArg(x) 1606 v.AddArg(y) 1607 return true 1608 } 1609 } 1610 func rewriteValueS390X_OpDiv8(v *Value) bool { 1611 b := v.Block 1612 _ = b 1613 types := &b.Func.Config.Types 1614 _ = types 1615 // match: (Div8 x y) 1616 // cond: 1617 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1618 for { 1619 x := v.Args[0] 1620 y := v.Args[1] 1621 v.reset(OpS390XDIVW) 1622 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1623 v0.AddArg(x) 1624 v.AddArg(v0) 1625 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1626 v1.AddArg(y) 1627 v.AddArg(v1) 1628 return true 1629 } 1630 } 1631 func rewriteValueS390X_OpDiv8u(v *Value) bool { 1632 b := v.Block 1633 _ = b 1634 types := &b.Func.Config.Types 1635 _ = types 1636 // match: (Div8u x y) 1637 // cond: 1638 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1639 for { 1640 x := v.Args[0] 1641 y := v.Args[1] 1642 v.reset(OpS390XDIVWU) 1643 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 1644 v0.AddArg(x) 1645 v.AddArg(v0) 1646 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 1647 v1.AddArg(y) 1648 v.AddArg(v1) 1649 return true 1650 } 1651 } 1652 func rewriteValueS390X_OpEq16(v *Value) bool { 1653 b := v.Block 1654 _ = b 1655 types := &b.Func.Config.Types 1656 _ = types 1657 // match: (Eq16 x y) 1658 // cond: 1659 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1660 for { 1661 x := v.Args[0] 1662 y := v.Args[1] 1663 v.reset(OpS390XMOVDEQ) 1664 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1665 v0.AuxInt = 0 1666 v.AddArg(v0) 1667 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1668 v1.AuxInt = 1 1669 v.AddArg(v1) 1670 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1671 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1672 v3.AddArg(x) 1673 v2.AddArg(v3) 1674 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1675 v4.AddArg(y) 1676 v2.AddArg(v4) 1677 v.AddArg(v2) 1678 return true 1679 } 1680 } 1681 func rewriteValueS390X_OpEq32(v *Value) bool { 1682 b := v.Block 1683 _ = b 1684 types := &b.Func.Config.Types 1685 _ = types 1686 // match: (Eq32 x y) 1687 // cond: 1688 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1689 for { 1690 x := v.Args[0] 1691 y := v.Args[1] 1692 v.reset(OpS390XMOVDEQ) 1693 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1694 v0.AuxInt = 0 1695 v.AddArg(v0) 1696 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1697 v1.AuxInt = 1 1698 v.AddArg(v1) 1699 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 1700 v2.AddArg(x) 1701 v2.AddArg(y) 1702 v.AddArg(v2) 1703 return true 1704 } 1705 } 1706 func rewriteValueS390X_OpEq32F(v *Value) bool { 1707 b := v.Block 1708 _ = b 1709 types := &b.Func.Config.Types 1710 _ = types 1711 // match: (Eq32F x y) 1712 // cond: 1713 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1714 for { 1715 x := v.Args[0] 1716 y := v.Args[1] 1717 v.reset(OpS390XMOVDEQ) 1718 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1719 v0.AuxInt = 0 1720 v.AddArg(v0) 1721 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1722 v1.AuxInt = 1 1723 v.AddArg(v1) 1724 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 1725 v2.AddArg(x) 1726 v2.AddArg(y) 1727 v.AddArg(v2) 1728 return true 1729 } 1730 } 1731 func rewriteValueS390X_OpEq64(v *Value) bool { 1732 b := v.Block 1733 _ = b 1734 types := &b.Func.Config.Types 1735 _ = types 1736 // match: (Eq64 x y) 1737 // cond: 1738 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1739 for { 1740 x := v.Args[0] 1741 y := v.Args[1] 1742 v.reset(OpS390XMOVDEQ) 1743 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1744 v0.AuxInt = 0 1745 v.AddArg(v0) 1746 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1747 v1.AuxInt = 1 1748 v.AddArg(v1) 1749 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1750 v2.AddArg(x) 1751 v2.AddArg(y) 1752 v.AddArg(v2) 1753 return true 1754 } 1755 } 1756 func rewriteValueS390X_OpEq64F(v *Value) bool { 1757 b := v.Block 1758 _ = b 1759 types := &b.Func.Config.Types 1760 _ = types 1761 // match: (Eq64F x y) 1762 // cond: 1763 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1764 for { 1765 x := v.Args[0] 1766 y := v.Args[1] 1767 v.reset(OpS390XMOVDEQ) 1768 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1769 v0.AuxInt = 0 1770 v.AddArg(v0) 1771 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1772 v1.AuxInt = 1 1773 v.AddArg(v1) 1774 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 1775 v2.AddArg(x) 1776 v2.AddArg(y) 1777 v.AddArg(v2) 1778 return true 1779 } 1780 } 1781 func rewriteValueS390X_OpEq8(v *Value) bool { 1782 b := v.Block 1783 _ = b 1784 types := &b.Func.Config.Types 1785 _ = types 1786 // match: (Eq8 x y) 1787 // cond: 1788 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1789 for { 1790 x := v.Args[0] 1791 y := v.Args[1] 1792 v.reset(OpS390XMOVDEQ) 1793 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1794 v0.AuxInt = 0 1795 v.AddArg(v0) 1796 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1797 v1.AuxInt = 1 1798 v.AddArg(v1) 1799 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1800 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1801 v3.AddArg(x) 1802 v2.AddArg(v3) 1803 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1804 v4.AddArg(y) 1805 v2.AddArg(v4) 1806 v.AddArg(v2) 1807 return true 1808 } 1809 } 1810 func rewriteValueS390X_OpEqB(v *Value) bool { 1811 b := v.Block 1812 _ = b 1813 types := &b.Func.Config.Types 1814 _ = types 1815 // match: (EqB x y) 1816 // cond: 1817 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1818 for { 1819 x := v.Args[0] 1820 y := v.Args[1] 1821 v.reset(OpS390XMOVDEQ) 1822 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1823 v0.AuxInt = 0 1824 v.AddArg(v0) 1825 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1826 v1.AuxInt = 1 1827 v.AddArg(v1) 1828 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1829 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1830 v3.AddArg(x) 1831 v2.AddArg(v3) 1832 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1833 v4.AddArg(y) 1834 v2.AddArg(v4) 1835 v.AddArg(v2) 1836 return true 1837 } 1838 } 1839 func rewriteValueS390X_OpEqPtr(v *Value) bool { 1840 b := v.Block 1841 _ = b 1842 types := &b.Func.Config.Types 1843 _ = types 1844 // match: (EqPtr x y) 1845 // cond: 1846 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1847 for { 1848 x := v.Args[0] 1849 y := v.Args[1] 1850 v.reset(OpS390XMOVDEQ) 1851 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1852 v0.AuxInt = 0 1853 v.AddArg(v0) 1854 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1855 v1.AuxInt = 1 1856 v.AddArg(v1) 1857 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1858 v2.AddArg(x) 1859 v2.AddArg(y) 1860 v.AddArg(v2) 1861 return true 1862 } 1863 } 1864 func rewriteValueS390X_OpGeq16(v *Value) bool { 1865 b := v.Block 1866 _ = b 1867 types := &b.Func.Config.Types 1868 _ = types 1869 // match: (Geq16 x y) 1870 // cond: 1871 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1872 for { 1873 x := v.Args[0] 1874 y := v.Args[1] 1875 v.reset(OpS390XMOVDGE) 1876 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1877 v0.AuxInt = 0 1878 v.AddArg(v0) 1879 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1880 v1.AuxInt = 1 1881 v.AddArg(v1) 1882 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1883 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1884 v3.AddArg(x) 1885 v2.AddArg(v3) 1886 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1887 v4.AddArg(y) 1888 v2.AddArg(v4) 1889 v.AddArg(v2) 1890 return true 1891 } 1892 } 1893 func rewriteValueS390X_OpGeq16U(v *Value) bool { 1894 b := v.Block 1895 _ = b 1896 types := &b.Func.Config.Types 1897 _ = types 1898 // match: (Geq16U x y) 1899 // cond: 1900 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 1901 for { 1902 x := v.Args[0] 1903 y := v.Args[1] 1904 v.reset(OpS390XMOVDGE) 1905 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1906 v0.AuxInt = 0 1907 v.AddArg(v0) 1908 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1909 v1.AuxInt = 1 1910 v.AddArg(v1) 1911 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 1912 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1913 v3.AddArg(x) 1914 v2.AddArg(v3) 1915 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1916 v4.AddArg(y) 1917 v2.AddArg(v4) 1918 v.AddArg(v2) 1919 return true 1920 } 1921 } 1922 func rewriteValueS390X_OpGeq32(v *Value) bool { 1923 b := v.Block 1924 _ = b 1925 types := &b.Func.Config.Types 1926 _ = types 1927 // match: (Geq32 x y) 1928 // cond: 1929 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1930 for { 1931 x := v.Args[0] 1932 y := v.Args[1] 1933 v.reset(OpS390XMOVDGE) 1934 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1935 v0.AuxInt = 0 1936 v.AddArg(v0) 1937 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1938 v1.AuxInt = 1 1939 v.AddArg(v1) 1940 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 1941 v2.AddArg(x) 1942 v2.AddArg(y) 1943 v.AddArg(v2) 1944 return true 1945 } 1946 } 1947 func rewriteValueS390X_OpGeq32F(v *Value) bool { 1948 b := v.Block 1949 _ = b 1950 types := &b.Func.Config.Types 1951 _ = types 1952 // match: (Geq32F x y) 1953 // cond: 1954 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1955 for { 1956 x := v.Args[0] 1957 y := v.Args[1] 1958 v.reset(OpS390XMOVDGEnoinv) 1959 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1960 v0.AuxInt = 0 1961 v.AddArg(v0) 1962 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1963 v1.AuxInt = 1 1964 v.AddArg(v1) 1965 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 1966 v2.AddArg(x) 1967 v2.AddArg(y) 1968 v.AddArg(v2) 1969 return true 1970 } 1971 } 1972 func rewriteValueS390X_OpGeq32U(v *Value) bool { 1973 b := v.Block 1974 _ = b 1975 types := &b.Func.Config.Types 1976 _ = types 1977 // match: (Geq32U x y) 1978 // cond: 1979 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 1980 for { 1981 x := v.Args[0] 1982 y := v.Args[1] 1983 v.reset(OpS390XMOVDGE) 1984 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1985 v0.AuxInt = 0 1986 v.AddArg(v0) 1987 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1988 v1.AuxInt = 1 1989 v.AddArg(v1) 1990 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 1991 v2.AddArg(x) 1992 v2.AddArg(y) 1993 v.AddArg(v2) 1994 return true 1995 } 1996 } 1997 func rewriteValueS390X_OpGeq64(v *Value) bool { 1998 b := v.Block 1999 _ = b 2000 types := &b.Func.Config.Types 2001 _ = types 2002 // match: (Geq64 x y) 2003 // cond: 2004 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2005 for { 2006 x := v.Args[0] 2007 y := v.Args[1] 2008 v.reset(OpS390XMOVDGE) 2009 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2010 v0.AuxInt = 0 2011 v.AddArg(v0) 2012 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2013 v1.AuxInt = 1 2014 v.AddArg(v1) 2015 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2016 v2.AddArg(x) 2017 v2.AddArg(y) 2018 v.AddArg(v2) 2019 return true 2020 } 2021 } 2022 func rewriteValueS390X_OpGeq64F(v *Value) bool { 2023 b := v.Block 2024 _ = b 2025 types := &b.Func.Config.Types 2026 _ = types 2027 // match: (Geq64F x y) 2028 // cond: 2029 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2030 for { 2031 x := v.Args[0] 2032 y := v.Args[1] 2033 v.reset(OpS390XMOVDGEnoinv) 2034 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2035 v0.AuxInt = 0 2036 v.AddArg(v0) 2037 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2038 v1.AuxInt = 1 2039 v.AddArg(v1) 2040 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 2041 v2.AddArg(x) 2042 v2.AddArg(y) 2043 v.AddArg(v2) 2044 return true 2045 } 2046 } 2047 func rewriteValueS390X_OpGeq64U(v *Value) bool { 2048 b := v.Block 2049 _ = b 2050 types := &b.Func.Config.Types 2051 _ = types 2052 // match: (Geq64U x y) 2053 // cond: 2054 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2055 for { 2056 x := v.Args[0] 2057 y := v.Args[1] 2058 v.reset(OpS390XMOVDGE) 2059 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2060 v0.AuxInt = 0 2061 v.AddArg(v0) 2062 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2063 v1.AuxInt = 1 2064 v.AddArg(v1) 2065 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2066 v2.AddArg(x) 2067 v2.AddArg(y) 2068 v.AddArg(v2) 2069 return true 2070 } 2071 } 2072 func rewriteValueS390X_OpGeq8(v *Value) bool { 2073 b := v.Block 2074 _ = b 2075 types := &b.Func.Config.Types 2076 _ = types 2077 // match: (Geq8 x y) 2078 // cond: 2079 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2080 for { 2081 x := v.Args[0] 2082 y := v.Args[1] 2083 v.reset(OpS390XMOVDGE) 2084 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2085 v0.AuxInt = 0 2086 v.AddArg(v0) 2087 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2088 v1.AuxInt = 1 2089 v.AddArg(v1) 2090 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2091 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2092 v3.AddArg(x) 2093 v2.AddArg(v3) 2094 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2095 v4.AddArg(y) 2096 v2.AddArg(v4) 2097 v.AddArg(v2) 2098 return true 2099 } 2100 } 2101 func rewriteValueS390X_OpGeq8U(v *Value) bool { 2102 b := v.Block 2103 _ = b 2104 types := &b.Func.Config.Types 2105 _ = types 2106 // match: (Geq8U x y) 2107 // cond: 2108 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2109 for { 2110 x := v.Args[0] 2111 y := v.Args[1] 2112 v.reset(OpS390XMOVDGE) 2113 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2114 v0.AuxInt = 0 2115 v.AddArg(v0) 2116 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2117 v1.AuxInt = 1 2118 v.AddArg(v1) 2119 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2120 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2121 v3.AddArg(x) 2122 v2.AddArg(v3) 2123 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2124 v4.AddArg(y) 2125 v2.AddArg(v4) 2126 v.AddArg(v2) 2127 return true 2128 } 2129 } 2130 func rewriteValueS390X_OpGetClosurePtr(v *Value) bool { 2131 // match: (GetClosurePtr) 2132 // cond: 2133 // result: (LoweredGetClosurePtr) 2134 for { 2135 v.reset(OpS390XLoweredGetClosurePtr) 2136 return true 2137 } 2138 } 2139 func rewriteValueS390X_OpGetG(v *Value) bool { 2140 // match: (GetG mem) 2141 // cond: 2142 // result: (LoweredGetG mem) 2143 for { 2144 mem := v.Args[0] 2145 v.reset(OpS390XLoweredGetG) 2146 v.AddArg(mem) 2147 return true 2148 } 2149 } 2150 func rewriteValueS390X_OpGreater16(v *Value) bool { 2151 b := v.Block 2152 _ = b 2153 types := &b.Func.Config.Types 2154 _ = types 2155 // match: (Greater16 x y) 2156 // cond: 2157 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2158 for { 2159 x := v.Args[0] 2160 y := v.Args[1] 2161 v.reset(OpS390XMOVDGT) 2162 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2163 v0.AuxInt = 0 2164 v.AddArg(v0) 2165 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2166 v1.AuxInt = 1 2167 v.AddArg(v1) 2168 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2169 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2170 v3.AddArg(x) 2171 v2.AddArg(v3) 2172 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2173 v4.AddArg(y) 2174 v2.AddArg(v4) 2175 v.AddArg(v2) 2176 return true 2177 } 2178 } 2179 func rewriteValueS390X_OpGreater16U(v *Value) bool { 2180 b := v.Block 2181 _ = b 2182 types := &b.Func.Config.Types 2183 _ = types 2184 // match: (Greater16U x y) 2185 // cond: 2186 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2187 for { 2188 x := v.Args[0] 2189 y := v.Args[1] 2190 v.reset(OpS390XMOVDGT) 2191 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2192 v0.AuxInt = 0 2193 v.AddArg(v0) 2194 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2195 v1.AuxInt = 1 2196 v.AddArg(v1) 2197 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2198 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2199 v3.AddArg(x) 2200 v2.AddArg(v3) 2201 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2202 v4.AddArg(y) 2203 v2.AddArg(v4) 2204 v.AddArg(v2) 2205 return true 2206 } 2207 } 2208 func rewriteValueS390X_OpGreater32(v *Value) bool { 2209 b := v.Block 2210 _ = b 2211 types := &b.Func.Config.Types 2212 _ = types 2213 // match: (Greater32 x y) 2214 // cond: 2215 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2216 for { 2217 x := v.Args[0] 2218 y := v.Args[1] 2219 v.reset(OpS390XMOVDGT) 2220 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2221 v0.AuxInt = 0 2222 v.AddArg(v0) 2223 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2224 v1.AuxInt = 1 2225 v.AddArg(v1) 2226 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 2227 v2.AddArg(x) 2228 v2.AddArg(y) 2229 v.AddArg(v2) 2230 return true 2231 } 2232 } 2233 func rewriteValueS390X_OpGreater32F(v *Value) bool { 2234 b := v.Block 2235 _ = b 2236 types := &b.Func.Config.Types 2237 _ = types 2238 // match: (Greater32F x y) 2239 // cond: 2240 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2241 for { 2242 x := v.Args[0] 2243 y := v.Args[1] 2244 v.reset(OpS390XMOVDGTnoinv) 2245 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2246 v0.AuxInt = 0 2247 v.AddArg(v0) 2248 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2249 v1.AuxInt = 1 2250 v.AddArg(v1) 2251 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 2252 v2.AddArg(x) 2253 v2.AddArg(y) 2254 v.AddArg(v2) 2255 return true 2256 } 2257 } 2258 func rewriteValueS390X_OpGreater32U(v *Value) bool { 2259 b := v.Block 2260 _ = b 2261 types := &b.Func.Config.Types 2262 _ = types 2263 // match: (Greater32U x y) 2264 // cond: 2265 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2266 for { 2267 x := v.Args[0] 2268 y := v.Args[1] 2269 v.reset(OpS390XMOVDGT) 2270 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2271 v0.AuxInt = 0 2272 v.AddArg(v0) 2273 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2274 v1.AuxInt = 1 2275 v.AddArg(v1) 2276 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 2277 v2.AddArg(x) 2278 v2.AddArg(y) 2279 v.AddArg(v2) 2280 return true 2281 } 2282 } 2283 func rewriteValueS390X_OpGreater64(v *Value) bool { 2284 b := v.Block 2285 _ = b 2286 types := &b.Func.Config.Types 2287 _ = types 2288 // match: (Greater64 x y) 2289 // cond: 2290 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2291 for { 2292 x := v.Args[0] 2293 y := v.Args[1] 2294 v.reset(OpS390XMOVDGT) 2295 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2296 v0.AuxInt = 0 2297 v.AddArg(v0) 2298 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2299 v1.AuxInt = 1 2300 v.AddArg(v1) 2301 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2302 v2.AddArg(x) 2303 v2.AddArg(y) 2304 v.AddArg(v2) 2305 return true 2306 } 2307 } 2308 func rewriteValueS390X_OpGreater64F(v *Value) bool { 2309 b := v.Block 2310 _ = b 2311 types := &b.Func.Config.Types 2312 _ = types 2313 // match: (Greater64F x y) 2314 // cond: 2315 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2316 for { 2317 x := v.Args[0] 2318 y := v.Args[1] 2319 v.reset(OpS390XMOVDGTnoinv) 2320 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2321 v0.AuxInt = 0 2322 v.AddArg(v0) 2323 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2324 v1.AuxInt = 1 2325 v.AddArg(v1) 2326 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 2327 v2.AddArg(x) 2328 v2.AddArg(y) 2329 v.AddArg(v2) 2330 return true 2331 } 2332 } 2333 func rewriteValueS390X_OpGreater64U(v *Value) bool { 2334 b := v.Block 2335 _ = b 2336 types := &b.Func.Config.Types 2337 _ = types 2338 // match: (Greater64U x y) 2339 // cond: 2340 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2341 for { 2342 x := v.Args[0] 2343 y := v.Args[1] 2344 v.reset(OpS390XMOVDGT) 2345 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2346 v0.AuxInt = 0 2347 v.AddArg(v0) 2348 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2349 v1.AuxInt = 1 2350 v.AddArg(v1) 2351 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2352 v2.AddArg(x) 2353 v2.AddArg(y) 2354 v.AddArg(v2) 2355 return true 2356 } 2357 } 2358 func rewriteValueS390X_OpGreater8(v *Value) bool { 2359 b := v.Block 2360 _ = b 2361 types := &b.Func.Config.Types 2362 _ = types 2363 // match: (Greater8 x y) 2364 // cond: 2365 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2366 for { 2367 x := v.Args[0] 2368 y := v.Args[1] 2369 v.reset(OpS390XMOVDGT) 2370 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2371 v0.AuxInt = 0 2372 v.AddArg(v0) 2373 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2374 v1.AuxInt = 1 2375 v.AddArg(v1) 2376 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2377 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2378 v3.AddArg(x) 2379 v2.AddArg(v3) 2380 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2381 v4.AddArg(y) 2382 v2.AddArg(v4) 2383 v.AddArg(v2) 2384 return true 2385 } 2386 } 2387 func rewriteValueS390X_OpGreater8U(v *Value) bool { 2388 b := v.Block 2389 _ = b 2390 types := &b.Func.Config.Types 2391 _ = types 2392 // match: (Greater8U x y) 2393 // cond: 2394 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2395 for { 2396 x := v.Args[0] 2397 y := v.Args[1] 2398 v.reset(OpS390XMOVDGT) 2399 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2400 v0.AuxInt = 0 2401 v.AddArg(v0) 2402 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2403 v1.AuxInt = 1 2404 v.AddArg(v1) 2405 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2406 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2407 v3.AddArg(x) 2408 v2.AddArg(v3) 2409 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2410 v4.AddArg(y) 2411 v2.AddArg(v4) 2412 v.AddArg(v2) 2413 return true 2414 } 2415 } 2416 func rewriteValueS390X_OpHmul32(v *Value) bool { 2417 b := v.Block 2418 _ = b 2419 types := &b.Func.Config.Types 2420 _ = types 2421 // match: (Hmul32 x y) 2422 // cond: 2423 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2424 for { 2425 x := v.Args[0] 2426 y := v.Args[1] 2427 v.reset(OpS390XSRDconst) 2428 v.AuxInt = 32 2429 v0 := b.NewValue0(v.Pos, OpS390XMULLD, types.Int64) 2430 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 2431 v1.AddArg(x) 2432 v0.AddArg(v1) 2433 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 2434 v2.AddArg(y) 2435 v0.AddArg(v2) 2436 v.AddArg(v0) 2437 return true 2438 } 2439 } 2440 func rewriteValueS390X_OpHmul32u(v *Value) bool { 2441 b := v.Block 2442 _ = b 2443 types := &b.Func.Config.Types 2444 _ = types 2445 // match: (Hmul32u x y) 2446 // cond: 2447 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2448 for { 2449 x := v.Args[0] 2450 y := v.Args[1] 2451 v.reset(OpS390XSRDconst) 2452 v.AuxInt = 32 2453 v0 := b.NewValue0(v.Pos, OpS390XMULLD, types.Int64) 2454 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 2455 v1.AddArg(x) 2456 v0.AddArg(v1) 2457 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 2458 v2.AddArg(y) 2459 v0.AddArg(v2) 2460 v.AddArg(v0) 2461 return true 2462 } 2463 } 2464 func rewriteValueS390X_OpHmul64(v *Value) bool { 2465 // match: (Hmul64 x y) 2466 // cond: 2467 // result: (MULHD x y) 2468 for { 2469 x := v.Args[0] 2470 y := v.Args[1] 2471 v.reset(OpS390XMULHD) 2472 v.AddArg(x) 2473 v.AddArg(y) 2474 return true 2475 } 2476 } 2477 func rewriteValueS390X_OpHmul64u(v *Value) bool { 2478 // match: (Hmul64u x y) 2479 // cond: 2480 // result: (MULHDU x y) 2481 for { 2482 x := v.Args[0] 2483 y := v.Args[1] 2484 v.reset(OpS390XMULHDU) 2485 v.AddArg(x) 2486 v.AddArg(y) 2487 return true 2488 } 2489 } 2490 func rewriteValueS390X_OpITab(v *Value) bool { 2491 // match: (ITab (Load ptr mem)) 2492 // cond: 2493 // result: (MOVDload ptr mem) 2494 for { 2495 v_0 := v.Args[0] 2496 if v_0.Op != OpLoad { 2497 break 2498 } 2499 ptr := v_0.Args[0] 2500 mem := v_0.Args[1] 2501 v.reset(OpS390XMOVDload) 2502 v.AddArg(ptr) 2503 v.AddArg(mem) 2504 return true 2505 } 2506 return false 2507 } 2508 func rewriteValueS390X_OpInterCall(v *Value) bool { 2509 // match: (InterCall [argwid] entry mem) 2510 // cond: 2511 // result: (CALLinter [argwid] entry mem) 2512 for { 2513 argwid := v.AuxInt 2514 entry := v.Args[0] 2515 mem := v.Args[1] 2516 v.reset(OpS390XCALLinter) 2517 v.AuxInt = argwid 2518 v.AddArg(entry) 2519 v.AddArg(mem) 2520 return true 2521 } 2522 } 2523 func rewriteValueS390X_OpIsInBounds(v *Value) bool { 2524 b := v.Block 2525 _ = b 2526 types := &b.Func.Config.Types 2527 _ = types 2528 // match: (IsInBounds idx len) 2529 // cond: 2530 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2531 for { 2532 idx := v.Args[0] 2533 len := v.Args[1] 2534 v.reset(OpS390XMOVDLT) 2535 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2536 v0.AuxInt = 0 2537 v.AddArg(v0) 2538 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2539 v1.AuxInt = 1 2540 v.AddArg(v1) 2541 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2542 v2.AddArg(idx) 2543 v2.AddArg(len) 2544 v.AddArg(v2) 2545 return true 2546 } 2547 } 2548 func rewriteValueS390X_OpIsNonNil(v *Value) bool { 2549 b := v.Block 2550 _ = b 2551 types := &b.Func.Config.Types 2552 _ = types 2553 // match: (IsNonNil p) 2554 // cond: 2555 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2556 for { 2557 p := v.Args[0] 2558 v.reset(OpS390XMOVDNE) 2559 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2560 v0.AuxInt = 0 2561 v.AddArg(v0) 2562 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2563 v1.AuxInt = 1 2564 v.AddArg(v1) 2565 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, TypeFlags) 2566 v2.AuxInt = 0 2567 v2.AddArg(p) 2568 v.AddArg(v2) 2569 return true 2570 } 2571 } 2572 func rewriteValueS390X_OpIsSliceInBounds(v *Value) bool { 2573 b := v.Block 2574 _ = b 2575 types := &b.Func.Config.Types 2576 _ = types 2577 // match: (IsSliceInBounds idx len) 2578 // cond: 2579 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2580 for { 2581 idx := v.Args[0] 2582 len := v.Args[1] 2583 v.reset(OpS390XMOVDLE) 2584 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2585 v0.AuxInt = 0 2586 v.AddArg(v0) 2587 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2588 v1.AuxInt = 1 2589 v.AddArg(v1) 2590 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2591 v2.AddArg(idx) 2592 v2.AddArg(len) 2593 v.AddArg(v2) 2594 return true 2595 } 2596 } 2597 func rewriteValueS390X_OpLeq16(v *Value) bool { 2598 b := v.Block 2599 _ = b 2600 types := &b.Func.Config.Types 2601 _ = types 2602 // match: (Leq16 x y) 2603 // cond: 2604 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2605 for { 2606 x := v.Args[0] 2607 y := v.Args[1] 2608 v.reset(OpS390XMOVDLE) 2609 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2610 v0.AuxInt = 0 2611 v.AddArg(v0) 2612 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2613 v1.AuxInt = 1 2614 v.AddArg(v1) 2615 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2616 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2617 v3.AddArg(x) 2618 v2.AddArg(v3) 2619 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2620 v4.AddArg(y) 2621 v2.AddArg(v4) 2622 v.AddArg(v2) 2623 return true 2624 } 2625 } 2626 func rewriteValueS390X_OpLeq16U(v *Value) bool { 2627 b := v.Block 2628 _ = b 2629 types := &b.Func.Config.Types 2630 _ = types 2631 // match: (Leq16U x y) 2632 // cond: 2633 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2634 for { 2635 x := v.Args[0] 2636 y := v.Args[1] 2637 v.reset(OpS390XMOVDLE) 2638 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2639 v0.AuxInt = 0 2640 v.AddArg(v0) 2641 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2642 v1.AuxInt = 1 2643 v.AddArg(v1) 2644 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2645 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2646 v3.AddArg(x) 2647 v2.AddArg(v3) 2648 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2649 v4.AddArg(y) 2650 v2.AddArg(v4) 2651 v.AddArg(v2) 2652 return true 2653 } 2654 } 2655 func rewriteValueS390X_OpLeq32(v *Value) bool { 2656 b := v.Block 2657 _ = b 2658 types := &b.Func.Config.Types 2659 _ = types 2660 // match: (Leq32 x y) 2661 // cond: 2662 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2663 for { 2664 x := v.Args[0] 2665 y := v.Args[1] 2666 v.reset(OpS390XMOVDLE) 2667 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2668 v0.AuxInt = 0 2669 v.AddArg(v0) 2670 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2671 v1.AuxInt = 1 2672 v.AddArg(v1) 2673 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 2674 v2.AddArg(x) 2675 v2.AddArg(y) 2676 v.AddArg(v2) 2677 return true 2678 } 2679 } 2680 func rewriteValueS390X_OpLeq32F(v *Value) bool { 2681 b := v.Block 2682 _ = b 2683 types := &b.Func.Config.Types 2684 _ = types 2685 // match: (Leq32F x y) 2686 // cond: 2687 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2688 for { 2689 x := v.Args[0] 2690 y := v.Args[1] 2691 v.reset(OpS390XMOVDGEnoinv) 2692 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2693 v0.AuxInt = 0 2694 v.AddArg(v0) 2695 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2696 v1.AuxInt = 1 2697 v.AddArg(v1) 2698 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 2699 v2.AddArg(y) 2700 v2.AddArg(x) 2701 v.AddArg(v2) 2702 return true 2703 } 2704 } 2705 func rewriteValueS390X_OpLeq32U(v *Value) bool { 2706 b := v.Block 2707 _ = b 2708 types := &b.Func.Config.Types 2709 _ = types 2710 // match: (Leq32U x y) 2711 // cond: 2712 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2713 for { 2714 x := v.Args[0] 2715 y := v.Args[1] 2716 v.reset(OpS390XMOVDLE) 2717 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2718 v0.AuxInt = 0 2719 v.AddArg(v0) 2720 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2721 v1.AuxInt = 1 2722 v.AddArg(v1) 2723 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 2724 v2.AddArg(x) 2725 v2.AddArg(y) 2726 v.AddArg(v2) 2727 return true 2728 } 2729 } 2730 func rewriteValueS390X_OpLeq64(v *Value) bool { 2731 b := v.Block 2732 _ = b 2733 types := &b.Func.Config.Types 2734 _ = types 2735 // match: (Leq64 x y) 2736 // cond: 2737 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2738 for { 2739 x := v.Args[0] 2740 y := v.Args[1] 2741 v.reset(OpS390XMOVDLE) 2742 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2743 v0.AuxInt = 0 2744 v.AddArg(v0) 2745 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2746 v1.AuxInt = 1 2747 v.AddArg(v1) 2748 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2749 v2.AddArg(x) 2750 v2.AddArg(y) 2751 v.AddArg(v2) 2752 return true 2753 } 2754 } 2755 func rewriteValueS390X_OpLeq64F(v *Value) bool { 2756 b := v.Block 2757 _ = b 2758 types := &b.Func.Config.Types 2759 _ = types 2760 // match: (Leq64F x y) 2761 // cond: 2762 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2763 for { 2764 x := v.Args[0] 2765 y := v.Args[1] 2766 v.reset(OpS390XMOVDGEnoinv) 2767 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2768 v0.AuxInt = 0 2769 v.AddArg(v0) 2770 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2771 v1.AuxInt = 1 2772 v.AddArg(v1) 2773 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 2774 v2.AddArg(y) 2775 v2.AddArg(x) 2776 v.AddArg(v2) 2777 return true 2778 } 2779 } 2780 func rewriteValueS390X_OpLeq64U(v *Value) bool { 2781 b := v.Block 2782 _ = b 2783 types := &b.Func.Config.Types 2784 _ = types 2785 // match: (Leq64U x y) 2786 // cond: 2787 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2788 for { 2789 x := v.Args[0] 2790 y := v.Args[1] 2791 v.reset(OpS390XMOVDLE) 2792 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2793 v0.AuxInt = 0 2794 v.AddArg(v0) 2795 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2796 v1.AuxInt = 1 2797 v.AddArg(v1) 2798 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2799 v2.AddArg(x) 2800 v2.AddArg(y) 2801 v.AddArg(v2) 2802 return true 2803 } 2804 } 2805 func rewriteValueS390X_OpLeq8(v *Value) bool { 2806 b := v.Block 2807 _ = b 2808 types := &b.Func.Config.Types 2809 _ = types 2810 // match: (Leq8 x y) 2811 // cond: 2812 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2813 for { 2814 x := v.Args[0] 2815 y := v.Args[1] 2816 v.reset(OpS390XMOVDLE) 2817 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2818 v0.AuxInt = 0 2819 v.AddArg(v0) 2820 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2821 v1.AuxInt = 1 2822 v.AddArg(v1) 2823 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2824 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2825 v3.AddArg(x) 2826 v2.AddArg(v3) 2827 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2828 v4.AddArg(y) 2829 v2.AddArg(v4) 2830 v.AddArg(v2) 2831 return true 2832 } 2833 } 2834 func rewriteValueS390X_OpLeq8U(v *Value) bool { 2835 b := v.Block 2836 _ = b 2837 types := &b.Func.Config.Types 2838 _ = types 2839 // match: (Leq8U x y) 2840 // cond: 2841 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2842 for { 2843 x := v.Args[0] 2844 y := v.Args[1] 2845 v.reset(OpS390XMOVDLE) 2846 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2847 v0.AuxInt = 0 2848 v.AddArg(v0) 2849 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2850 v1.AuxInt = 1 2851 v.AddArg(v1) 2852 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2853 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2854 v3.AddArg(x) 2855 v2.AddArg(v3) 2856 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2857 v4.AddArg(y) 2858 v2.AddArg(v4) 2859 v.AddArg(v2) 2860 return true 2861 } 2862 } 2863 func rewriteValueS390X_OpLess16(v *Value) bool { 2864 b := v.Block 2865 _ = b 2866 types := &b.Func.Config.Types 2867 _ = types 2868 // match: (Less16 x y) 2869 // cond: 2870 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2871 for { 2872 x := v.Args[0] 2873 y := v.Args[1] 2874 v.reset(OpS390XMOVDLT) 2875 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2876 v0.AuxInt = 0 2877 v.AddArg(v0) 2878 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2879 v1.AuxInt = 1 2880 v.AddArg(v1) 2881 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2882 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2883 v3.AddArg(x) 2884 v2.AddArg(v3) 2885 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2886 v4.AddArg(y) 2887 v2.AddArg(v4) 2888 v.AddArg(v2) 2889 return true 2890 } 2891 } 2892 func rewriteValueS390X_OpLess16U(v *Value) bool { 2893 b := v.Block 2894 _ = b 2895 types := &b.Func.Config.Types 2896 _ = types 2897 // match: (Less16U x y) 2898 // cond: 2899 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2900 for { 2901 x := v.Args[0] 2902 y := v.Args[1] 2903 v.reset(OpS390XMOVDLT) 2904 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2905 v0.AuxInt = 0 2906 v.AddArg(v0) 2907 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2908 v1.AuxInt = 1 2909 v.AddArg(v1) 2910 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2911 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2912 v3.AddArg(x) 2913 v2.AddArg(v3) 2914 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2915 v4.AddArg(y) 2916 v2.AddArg(v4) 2917 v.AddArg(v2) 2918 return true 2919 } 2920 } 2921 func rewriteValueS390X_OpLess32(v *Value) bool { 2922 b := v.Block 2923 _ = b 2924 types := &b.Func.Config.Types 2925 _ = types 2926 // match: (Less32 x y) 2927 // cond: 2928 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2929 for { 2930 x := v.Args[0] 2931 y := v.Args[1] 2932 v.reset(OpS390XMOVDLT) 2933 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2934 v0.AuxInt = 0 2935 v.AddArg(v0) 2936 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2937 v1.AuxInt = 1 2938 v.AddArg(v1) 2939 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 2940 v2.AddArg(x) 2941 v2.AddArg(y) 2942 v.AddArg(v2) 2943 return true 2944 } 2945 } 2946 func rewriteValueS390X_OpLess32F(v *Value) bool { 2947 b := v.Block 2948 _ = b 2949 types := &b.Func.Config.Types 2950 _ = types 2951 // match: (Less32F x y) 2952 // cond: 2953 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2954 for { 2955 x := v.Args[0] 2956 y := v.Args[1] 2957 v.reset(OpS390XMOVDGTnoinv) 2958 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2959 v0.AuxInt = 0 2960 v.AddArg(v0) 2961 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2962 v1.AuxInt = 1 2963 v.AddArg(v1) 2964 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 2965 v2.AddArg(y) 2966 v2.AddArg(x) 2967 v.AddArg(v2) 2968 return true 2969 } 2970 } 2971 func rewriteValueS390X_OpLess32U(v *Value) bool { 2972 b := v.Block 2973 _ = b 2974 types := &b.Func.Config.Types 2975 _ = types 2976 // match: (Less32U x y) 2977 // cond: 2978 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2979 for { 2980 x := v.Args[0] 2981 y := v.Args[1] 2982 v.reset(OpS390XMOVDLT) 2983 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2984 v0.AuxInt = 0 2985 v.AddArg(v0) 2986 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2987 v1.AuxInt = 1 2988 v.AddArg(v1) 2989 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 2990 v2.AddArg(x) 2991 v2.AddArg(y) 2992 v.AddArg(v2) 2993 return true 2994 } 2995 } 2996 func rewriteValueS390X_OpLess64(v *Value) bool { 2997 b := v.Block 2998 _ = b 2999 types := &b.Func.Config.Types 3000 _ = types 3001 // match: (Less64 x y) 3002 // cond: 3003 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3004 for { 3005 x := v.Args[0] 3006 y := v.Args[1] 3007 v.reset(OpS390XMOVDLT) 3008 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3009 v0.AuxInt = 0 3010 v.AddArg(v0) 3011 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3012 v1.AuxInt = 1 3013 v.AddArg(v1) 3014 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 3015 v2.AddArg(x) 3016 v2.AddArg(y) 3017 v.AddArg(v2) 3018 return true 3019 } 3020 } 3021 func rewriteValueS390X_OpLess64F(v *Value) bool { 3022 b := v.Block 3023 _ = b 3024 types := &b.Func.Config.Types 3025 _ = types 3026 // match: (Less64F x y) 3027 // cond: 3028 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3029 for { 3030 x := v.Args[0] 3031 y := v.Args[1] 3032 v.reset(OpS390XMOVDGTnoinv) 3033 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3034 v0.AuxInt = 0 3035 v.AddArg(v0) 3036 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3037 v1.AuxInt = 1 3038 v.AddArg(v1) 3039 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 3040 v2.AddArg(y) 3041 v2.AddArg(x) 3042 v.AddArg(v2) 3043 return true 3044 } 3045 } 3046 func rewriteValueS390X_OpLess64U(v *Value) bool { 3047 b := v.Block 3048 _ = b 3049 types := &b.Func.Config.Types 3050 _ = types 3051 // match: (Less64U x y) 3052 // cond: 3053 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3054 for { 3055 x := v.Args[0] 3056 y := v.Args[1] 3057 v.reset(OpS390XMOVDLT) 3058 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3059 v0.AuxInt = 0 3060 v.AddArg(v0) 3061 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3062 v1.AuxInt = 1 3063 v.AddArg(v1) 3064 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 3065 v2.AddArg(x) 3066 v2.AddArg(y) 3067 v.AddArg(v2) 3068 return true 3069 } 3070 } 3071 func rewriteValueS390X_OpLess8(v *Value) bool { 3072 b := v.Block 3073 _ = b 3074 types := &b.Func.Config.Types 3075 _ = types 3076 // match: (Less8 x y) 3077 // cond: 3078 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3079 for { 3080 x := v.Args[0] 3081 y := v.Args[1] 3082 v.reset(OpS390XMOVDLT) 3083 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3084 v0.AuxInt = 0 3085 v.AddArg(v0) 3086 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3087 v1.AuxInt = 1 3088 v.AddArg(v1) 3089 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 3090 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3091 v3.AddArg(x) 3092 v2.AddArg(v3) 3093 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3094 v4.AddArg(y) 3095 v2.AddArg(v4) 3096 v.AddArg(v2) 3097 return true 3098 } 3099 } 3100 func rewriteValueS390X_OpLess8U(v *Value) bool { 3101 b := v.Block 3102 _ = b 3103 types := &b.Func.Config.Types 3104 _ = types 3105 // match: (Less8U x y) 3106 // cond: 3107 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3108 for { 3109 x := v.Args[0] 3110 y := v.Args[1] 3111 v.reset(OpS390XMOVDLT) 3112 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3113 v0.AuxInt = 0 3114 v.AddArg(v0) 3115 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3116 v1.AuxInt = 1 3117 v.AddArg(v1) 3118 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 3119 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3120 v3.AddArg(x) 3121 v2.AddArg(v3) 3122 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3123 v4.AddArg(y) 3124 v2.AddArg(v4) 3125 v.AddArg(v2) 3126 return true 3127 } 3128 } 3129 func rewriteValueS390X_OpLoad(v *Value) bool { 3130 // match: (Load <t> ptr mem) 3131 // cond: (is64BitInt(t) || isPtr(t)) 3132 // result: (MOVDload ptr mem) 3133 for { 3134 t := v.Type 3135 ptr := v.Args[0] 3136 mem := v.Args[1] 3137 if !(is64BitInt(t) || isPtr(t)) { 3138 break 3139 } 3140 v.reset(OpS390XMOVDload) 3141 v.AddArg(ptr) 3142 v.AddArg(mem) 3143 return true 3144 } 3145 // match: (Load <t> ptr mem) 3146 // cond: is32BitInt(t) && isSigned(t) 3147 // result: (MOVWload ptr mem) 3148 for { 3149 t := v.Type 3150 ptr := v.Args[0] 3151 mem := v.Args[1] 3152 if !(is32BitInt(t) && isSigned(t)) { 3153 break 3154 } 3155 v.reset(OpS390XMOVWload) 3156 v.AddArg(ptr) 3157 v.AddArg(mem) 3158 return true 3159 } 3160 // match: (Load <t> ptr mem) 3161 // cond: is32BitInt(t) && !isSigned(t) 3162 // result: (MOVWZload ptr mem) 3163 for { 3164 t := v.Type 3165 ptr := v.Args[0] 3166 mem := v.Args[1] 3167 if !(is32BitInt(t) && !isSigned(t)) { 3168 break 3169 } 3170 v.reset(OpS390XMOVWZload) 3171 v.AddArg(ptr) 3172 v.AddArg(mem) 3173 return true 3174 } 3175 // match: (Load <t> ptr mem) 3176 // cond: is16BitInt(t) && isSigned(t) 3177 // result: (MOVHload ptr mem) 3178 for { 3179 t := v.Type 3180 ptr := v.Args[0] 3181 mem := v.Args[1] 3182 if !(is16BitInt(t) && isSigned(t)) { 3183 break 3184 } 3185 v.reset(OpS390XMOVHload) 3186 v.AddArg(ptr) 3187 v.AddArg(mem) 3188 return true 3189 } 3190 // match: (Load <t> ptr mem) 3191 // cond: is16BitInt(t) && !isSigned(t) 3192 // result: (MOVHZload ptr mem) 3193 for { 3194 t := v.Type 3195 ptr := v.Args[0] 3196 mem := v.Args[1] 3197 if !(is16BitInt(t) && !isSigned(t)) { 3198 break 3199 } 3200 v.reset(OpS390XMOVHZload) 3201 v.AddArg(ptr) 3202 v.AddArg(mem) 3203 return true 3204 } 3205 // match: (Load <t> ptr mem) 3206 // cond: is8BitInt(t) && isSigned(t) 3207 // result: (MOVBload ptr mem) 3208 for { 3209 t := v.Type 3210 ptr := v.Args[0] 3211 mem := v.Args[1] 3212 if !(is8BitInt(t) && isSigned(t)) { 3213 break 3214 } 3215 v.reset(OpS390XMOVBload) 3216 v.AddArg(ptr) 3217 v.AddArg(mem) 3218 return true 3219 } 3220 // match: (Load <t> ptr mem) 3221 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3222 // result: (MOVBZload ptr mem) 3223 for { 3224 t := v.Type 3225 ptr := v.Args[0] 3226 mem := v.Args[1] 3227 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3228 break 3229 } 3230 v.reset(OpS390XMOVBZload) 3231 v.AddArg(ptr) 3232 v.AddArg(mem) 3233 return true 3234 } 3235 // match: (Load <t> ptr mem) 3236 // cond: is32BitFloat(t) 3237 // result: (FMOVSload ptr mem) 3238 for { 3239 t := v.Type 3240 ptr := v.Args[0] 3241 mem := v.Args[1] 3242 if !(is32BitFloat(t)) { 3243 break 3244 } 3245 v.reset(OpS390XFMOVSload) 3246 v.AddArg(ptr) 3247 v.AddArg(mem) 3248 return true 3249 } 3250 // match: (Load <t> ptr mem) 3251 // cond: is64BitFloat(t) 3252 // result: (FMOVDload ptr mem) 3253 for { 3254 t := v.Type 3255 ptr := v.Args[0] 3256 mem := v.Args[1] 3257 if !(is64BitFloat(t)) { 3258 break 3259 } 3260 v.reset(OpS390XFMOVDload) 3261 v.AddArg(ptr) 3262 v.AddArg(mem) 3263 return true 3264 } 3265 return false 3266 } 3267 func rewriteValueS390X_OpLsh16x16(v *Value) bool { 3268 b := v.Block 3269 _ = b 3270 types := &b.Func.Config.Types 3271 _ = types 3272 // match: (Lsh16x16 <t> x y) 3273 // cond: 3274 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3275 for { 3276 t := v.Type 3277 x := v.Args[0] 3278 y := v.Args[1] 3279 v.reset(OpS390XANDW) 3280 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3281 v0.AddArg(x) 3282 v0.AddArg(y) 3283 v.AddArg(v0) 3284 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3285 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3286 v2.AuxInt = 31 3287 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3288 v3.AddArg(y) 3289 v2.AddArg(v3) 3290 v1.AddArg(v2) 3291 v.AddArg(v1) 3292 return true 3293 } 3294 } 3295 func rewriteValueS390X_OpLsh16x32(v *Value) bool { 3296 b := v.Block 3297 _ = b 3298 // match: (Lsh16x32 <t> x y) 3299 // cond: 3300 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3301 for { 3302 t := v.Type 3303 x := v.Args[0] 3304 y := v.Args[1] 3305 v.reset(OpS390XANDW) 3306 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3307 v0.AddArg(x) 3308 v0.AddArg(y) 3309 v.AddArg(v0) 3310 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3311 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3312 v2.AuxInt = 31 3313 v2.AddArg(y) 3314 v1.AddArg(v2) 3315 v.AddArg(v1) 3316 return true 3317 } 3318 } 3319 func rewriteValueS390X_OpLsh16x64(v *Value) bool { 3320 b := v.Block 3321 _ = b 3322 // match: (Lsh16x64 <t> x y) 3323 // cond: 3324 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3325 for { 3326 t := v.Type 3327 x := v.Args[0] 3328 y := v.Args[1] 3329 v.reset(OpS390XANDW) 3330 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3331 v0.AddArg(x) 3332 v0.AddArg(y) 3333 v.AddArg(v0) 3334 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3335 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3336 v2.AuxInt = 31 3337 v2.AddArg(y) 3338 v1.AddArg(v2) 3339 v.AddArg(v1) 3340 return true 3341 } 3342 } 3343 func rewriteValueS390X_OpLsh16x8(v *Value) bool { 3344 b := v.Block 3345 _ = b 3346 types := &b.Func.Config.Types 3347 _ = types 3348 // match: (Lsh16x8 <t> x y) 3349 // cond: 3350 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3351 for { 3352 t := v.Type 3353 x := v.Args[0] 3354 y := v.Args[1] 3355 v.reset(OpS390XANDW) 3356 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3357 v0.AddArg(x) 3358 v0.AddArg(y) 3359 v.AddArg(v0) 3360 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3361 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3362 v2.AuxInt = 31 3363 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3364 v3.AddArg(y) 3365 v2.AddArg(v3) 3366 v1.AddArg(v2) 3367 v.AddArg(v1) 3368 return true 3369 } 3370 } 3371 func rewriteValueS390X_OpLsh32x16(v *Value) bool { 3372 b := v.Block 3373 _ = b 3374 types := &b.Func.Config.Types 3375 _ = types 3376 // match: (Lsh32x16 <t> x y) 3377 // cond: 3378 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3379 for { 3380 t := v.Type 3381 x := v.Args[0] 3382 y := v.Args[1] 3383 v.reset(OpS390XANDW) 3384 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3385 v0.AddArg(x) 3386 v0.AddArg(y) 3387 v.AddArg(v0) 3388 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3389 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3390 v2.AuxInt = 31 3391 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3392 v3.AddArg(y) 3393 v2.AddArg(v3) 3394 v1.AddArg(v2) 3395 v.AddArg(v1) 3396 return true 3397 } 3398 } 3399 func rewriteValueS390X_OpLsh32x32(v *Value) bool { 3400 b := v.Block 3401 _ = b 3402 // match: (Lsh32x32 <t> x y) 3403 // cond: 3404 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3405 for { 3406 t := v.Type 3407 x := v.Args[0] 3408 y := v.Args[1] 3409 v.reset(OpS390XANDW) 3410 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3411 v0.AddArg(x) 3412 v0.AddArg(y) 3413 v.AddArg(v0) 3414 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3415 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3416 v2.AuxInt = 31 3417 v2.AddArg(y) 3418 v1.AddArg(v2) 3419 v.AddArg(v1) 3420 return true 3421 } 3422 } 3423 func rewriteValueS390X_OpLsh32x64(v *Value) bool { 3424 b := v.Block 3425 _ = b 3426 // match: (Lsh32x64 <t> x y) 3427 // cond: 3428 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3429 for { 3430 t := v.Type 3431 x := v.Args[0] 3432 y := v.Args[1] 3433 v.reset(OpS390XANDW) 3434 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3435 v0.AddArg(x) 3436 v0.AddArg(y) 3437 v.AddArg(v0) 3438 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3439 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3440 v2.AuxInt = 31 3441 v2.AddArg(y) 3442 v1.AddArg(v2) 3443 v.AddArg(v1) 3444 return true 3445 } 3446 } 3447 func rewriteValueS390X_OpLsh32x8(v *Value) bool { 3448 b := v.Block 3449 _ = b 3450 types := &b.Func.Config.Types 3451 _ = types 3452 // match: (Lsh32x8 <t> x y) 3453 // cond: 3454 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3455 for { 3456 t := v.Type 3457 x := v.Args[0] 3458 y := v.Args[1] 3459 v.reset(OpS390XANDW) 3460 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3461 v0.AddArg(x) 3462 v0.AddArg(y) 3463 v.AddArg(v0) 3464 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3465 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3466 v2.AuxInt = 31 3467 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3468 v3.AddArg(y) 3469 v2.AddArg(v3) 3470 v1.AddArg(v2) 3471 v.AddArg(v1) 3472 return true 3473 } 3474 } 3475 func rewriteValueS390X_OpLsh64x16(v *Value) bool { 3476 b := v.Block 3477 _ = b 3478 types := &b.Func.Config.Types 3479 _ = types 3480 // match: (Lsh64x16 <t> x y) 3481 // cond: 3482 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3483 for { 3484 t := v.Type 3485 x := v.Args[0] 3486 y := v.Args[1] 3487 v.reset(OpS390XAND) 3488 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3489 v0.AddArg(x) 3490 v0.AddArg(y) 3491 v.AddArg(v0) 3492 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3493 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3494 v2.AuxInt = 63 3495 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3496 v3.AddArg(y) 3497 v2.AddArg(v3) 3498 v1.AddArg(v2) 3499 v.AddArg(v1) 3500 return true 3501 } 3502 } 3503 func rewriteValueS390X_OpLsh64x32(v *Value) bool { 3504 b := v.Block 3505 _ = b 3506 // match: (Lsh64x32 <t> x y) 3507 // cond: 3508 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3509 for { 3510 t := v.Type 3511 x := v.Args[0] 3512 y := v.Args[1] 3513 v.reset(OpS390XAND) 3514 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3515 v0.AddArg(x) 3516 v0.AddArg(y) 3517 v.AddArg(v0) 3518 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3519 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3520 v2.AuxInt = 63 3521 v2.AddArg(y) 3522 v1.AddArg(v2) 3523 v.AddArg(v1) 3524 return true 3525 } 3526 } 3527 func rewriteValueS390X_OpLsh64x64(v *Value) bool { 3528 b := v.Block 3529 _ = b 3530 // match: (Lsh64x64 <t> x y) 3531 // cond: 3532 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3533 for { 3534 t := v.Type 3535 x := v.Args[0] 3536 y := v.Args[1] 3537 v.reset(OpS390XAND) 3538 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3539 v0.AddArg(x) 3540 v0.AddArg(y) 3541 v.AddArg(v0) 3542 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3543 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3544 v2.AuxInt = 63 3545 v2.AddArg(y) 3546 v1.AddArg(v2) 3547 v.AddArg(v1) 3548 return true 3549 } 3550 } 3551 func rewriteValueS390X_OpLsh64x8(v *Value) bool { 3552 b := v.Block 3553 _ = b 3554 types := &b.Func.Config.Types 3555 _ = types 3556 // match: (Lsh64x8 <t> x y) 3557 // cond: 3558 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3559 for { 3560 t := v.Type 3561 x := v.Args[0] 3562 y := v.Args[1] 3563 v.reset(OpS390XAND) 3564 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3565 v0.AddArg(x) 3566 v0.AddArg(y) 3567 v.AddArg(v0) 3568 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3569 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3570 v2.AuxInt = 63 3571 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3572 v3.AddArg(y) 3573 v2.AddArg(v3) 3574 v1.AddArg(v2) 3575 v.AddArg(v1) 3576 return true 3577 } 3578 } 3579 func rewriteValueS390X_OpLsh8x16(v *Value) bool { 3580 b := v.Block 3581 _ = b 3582 types := &b.Func.Config.Types 3583 _ = types 3584 // match: (Lsh8x16 <t> x y) 3585 // cond: 3586 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3587 for { 3588 t := v.Type 3589 x := v.Args[0] 3590 y := v.Args[1] 3591 v.reset(OpS390XANDW) 3592 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3593 v0.AddArg(x) 3594 v0.AddArg(y) 3595 v.AddArg(v0) 3596 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3597 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3598 v2.AuxInt = 31 3599 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3600 v3.AddArg(y) 3601 v2.AddArg(v3) 3602 v1.AddArg(v2) 3603 v.AddArg(v1) 3604 return true 3605 } 3606 } 3607 func rewriteValueS390X_OpLsh8x32(v *Value) bool { 3608 b := v.Block 3609 _ = b 3610 // match: (Lsh8x32 <t> x y) 3611 // cond: 3612 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3613 for { 3614 t := v.Type 3615 x := v.Args[0] 3616 y := v.Args[1] 3617 v.reset(OpS390XANDW) 3618 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3619 v0.AddArg(x) 3620 v0.AddArg(y) 3621 v.AddArg(v0) 3622 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3623 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3624 v2.AuxInt = 31 3625 v2.AddArg(y) 3626 v1.AddArg(v2) 3627 v.AddArg(v1) 3628 return true 3629 } 3630 } 3631 func rewriteValueS390X_OpLsh8x64(v *Value) bool { 3632 b := v.Block 3633 _ = b 3634 // match: (Lsh8x64 <t> x y) 3635 // cond: 3636 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3637 for { 3638 t := v.Type 3639 x := v.Args[0] 3640 y := v.Args[1] 3641 v.reset(OpS390XANDW) 3642 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3643 v0.AddArg(x) 3644 v0.AddArg(y) 3645 v.AddArg(v0) 3646 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3647 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3648 v2.AuxInt = 31 3649 v2.AddArg(y) 3650 v1.AddArg(v2) 3651 v.AddArg(v1) 3652 return true 3653 } 3654 } 3655 func rewriteValueS390X_OpLsh8x8(v *Value) bool { 3656 b := v.Block 3657 _ = b 3658 types := &b.Func.Config.Types 3659 _ = types 3660 // match: (Lsh8x8 <t> x y) 3661 // cond: 3662 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3663 for { 3664 t := v.Type 3665 x := v.Args[0] 3666 y := v.Args[1] 3667 v.reset(OpS390XANDW) 3668 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3669 v0.AddArg(x) 3670 v0.AddArg(y) 3671 v.AddArg(v0) 3672 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3673 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3674 v2.AuxInt = 31 3675 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3676 v3.AddArg(y) 3677 v2.AddArg(v3) 3678 v1.AddArg(v2) 3679 v.AddArg(v1) 3680 return true 3681 } 3682 } 3683 func rewriteValueS390X_OpMod16(v *Value) bool { 3684 b := v.Block 3685 _ = b 3686 types := &b.Func.Config.Types 3687 _ = types 3688 // match: (Mod16 x y) 3689 // cond: 3690 // result: (MODW (MOVHreg x) (MOVHreg y)) 3691 for { 3692 x := v.Args[0] 3693 y := v.Args[1] 3694 v.reset(OpS390XMODW) 3695 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 3696 v0.AddArg(x) 3697 v.AddArg(v0) 3698 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 3699 v1.AddArg(y) 3700 v.AddArg(v1) 3701 return true 3702 } 3703 } 3704 func rewriteValueS390X_OpMod16u(v *Value) bool { 3705 b := v.Block 3706 _ = b 3707 types := &b.Func.Config.Types 3708 _ = types 3709 // match: (Mod16u x y) 3710 // cond: 3711 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3712 for { 3713 x := v.Args[0] 3714 y := v.Args[1] 3715 v.reset(OpS390XMODWU) 3716 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3717 v0.AddArg(x) 3718 v.AddArg(v0) 3719 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3720 v1.AddArg(y) 3721 v.AddArg(v1) 3722 return true 3723 } 3724 } 3725 func rewriteValueS390X_OpMod32(v *Value) bool { 3726 b := v.Block 3727 _ = b 3728 types := &b.Func.Config.Types 3729 _ = types 3730 // match: (Mod32 x y) 3731 // cond: 3732 // result: (MODW (MOVWreg x) y) 3733 for { 3734 x := v.Args[0] 3735 y := v.Args[1] 3736 v.reset(OpS390XMODW) 3737 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 3738 v0.AddArg(x) 3739 v.AddArg(v0) 3740 v.AddArg(y) 3741 return true 3742 } 3743 } 3744 func rewriteValueS390X_OpMod32u(v *Value) bool { 3745 b := v.Block 3746 _ = b 3747 types := &b.Func.Config.Types 3748 _ = types 3749 // match: (Mod32u x y) 3750 // cond: 3751 // result: (MODWU (MOVWZreg x) y) 3752 for { 3753 x := v.Args[0] 3754 y := v.Args[1] 3755 v.reset(OpS390XMODWU) 3756 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 3757 v0.AddArg(x) 3758 v.AddArg(v0) 3759 v.AddArg(y) 3760 return true 3761 } 3762 } 3763 func rewriteValueS390X_OpMod64(v *Value) bool { 3764 // match: (Mod64 x y) 3765 // cond: 3766 // result: (MODD x y) 3767 for { 3768 x := v.Args[0] 3769 y := v.Args[1] 3770 v.reset(OpS390XMODD) 3771 v.AddArg(x) 3772 v.AddArg(y) 3773 return true 3774 } 3775 } 3776 func rewriteValueS390X_OpMod64u(v *Value) bool { 3777 // match: (Mod64u x y) 3778 // cond: 3779 // result: (MODDU x y) 3780 for { 3781 x := v.Args[0] 3782 y := v.Args[1] 3783 v.reset(OpS390XMODDU) 3784 v.AddArg(x) 3785 v.AddArg(y) 3786 return true 3787 } 3788 } 3789 func rewriteValueS390X_OpMod8(v *Value) bool { 3790 b := v.Block 3791 _ = b 3792 types := &b.Func.Config.Types 3793 _ = types 3794 // match: (Mod8 x y) 3795 // cond: 3796 // result: (MODW (MOVBreg x) (MOVBreg y)) 3797 for { 3798 x := v.Args[0] 3799 y := v.Args[1] 3800 v.reset(OpS390XMODW) 3801 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3802 v0.AddArg(x) 3803 v.AddArg(v0) 3804 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3805 v1.AddArg(y) 3806 v.AddArg(v1) 3807 return true 3808 } 3809 } 3810 func rewriteValueS390X_OpMod8u(v *Value) bool { 3811 b := v.Block 3812 _ = b 3813 types := &b.Func.Config.Types 3814 _ = types 3815 // match: (Mod8u x y) 3816 // cond: 3817 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 3818 for { 3819 x := v.Args[0] 3820 y := v.Args[1] 3821 v.reset(OpS390XMODWU) 3822 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3823 v0.AddArg(x) 3824 v.AddArg(v0) 3825 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3826 v1.AddArg(y) 3827 v.AddArg(v1) 3828 return true 3829 } 3830 } 3831 func rewriteValueS390X_OpMove(v *Value) bool { 3832 b := v.Block 3833 _ = b 3834 types := &b.Func.Config.Types 3835 _ = types 3836 // match: (Move [0] _ _ mem) 3837 // cond: 3838 // result: mem 3839 for { 3840 if v.AuxInt != 0 { 3841 break 3842 } 3843 mem := v.Args[2] 3844 v.reset(OpCopy) 3845 v.Type = mem.Type 3846 v.AddArg(mem) 3847 return true 3848 } 3849 // match: (Move [1] dst src mem) 3850 // cond: 3851 // result: (MOVBstore dst (MOVBZload src mem) mem) 3852 for { 3853 if v.AuxInt != 1 { 3854 break 3855 } 3856 dst := v.Args[0] 3857 src := v.Args[1] 3858 mem := v.Args[2] 3859 v.reset(OpS390XMOVBstore) 3860 v.AddArg(dst) 3861 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 3862 v0.AddArg(src) 3863 v0.AddArg(mem) 3864 v.AddArg(v0) 3865 v.AddArg(mem) 3866 return true 3867 } 3868 // match: (Move [2] dst src mem) 3869 // cond: 3870 // result: (MOVHstore dst (MOVHZload src mem) mem) 3871 for { 3872 if v.AuxInt != 2 { 3873 break 3874 } 3875 dst := v.Args[0] 3876 src := v.Args[1] 3877 mem := v.Args[2] 3878 v.reset(OpS390XMOVHstore) 3879 v.AddArg(dst) 3880 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 3881 v0.AddArg(src) 3882 v0.AddArg(mem) 3883 v.AddArg(v0) 3884 v.AddArg(mem) 3885 return true 3886 } 3887 // match: (Move [4] dst src mem) 3888 // cond: 3889 // result: (MOVWstore dst (MOVWZload src mem) mem) 3890 for { 3891 if v.AuxInt != 4 { 3892 break 3893 } 3894 dst := v.Args[0] 3895 src := v.Args[1] 3896 mem := v.Args[2] 3897 v.reset(OpS390XMOVWstore) 3898 v.AddArg(dst) 3899 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 3900 v0.AddArg(src) 3901 v0.AddArg(mem) 3902 v.AddArg(v0) 3903 v.AddArg(mem) 3904 return true 3905 } 3906 // match: (Move [8] dst src mem) 3907 // cond: 3908 // result: (MOVDstore dst (MOVDload src mem) mem) 3909 for { 3910 if v.AuxInt != 8 { 3911 break 3912 } 3913 dst := v.Args[0] 3914 src := v.Args[1] 3915 mem := v.Args[2] 3916 v.reset(OpS390XMOVDstore) 3917 v.AddArg(dst) 3918 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3919 v0.AddArg(src) 3920 v0.AddArg(mem) 3921 v.AddArg(v0) 3922 v.AddArg(mem) 3923 return true 3924 } 3925 // match: (Move [16] dst src mem) 3926 // cond: 3927 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 3928 for { 3929 if v.AuxInt != 16 { 3930 break 3931 } 3932 dst := v.Args[0] 3933 src := v.Args[1] 3934 mem := v.Args[2] 3935 v.reset(OpS390XMOVDstore) 3936 v.AuxInt = 8 3937 v.AddArg(dst) 3938 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3939 v0.AuxInt = 8 3940 v0.AddArg(src) 3941 v0.AddArg(mem) 3942 v.AddArg(v0) 3943 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, TypeMem) 3944 v1.AddArg(dst) 3945 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3946 v2.AddArg(src) 3947 v2.AddArg(mem) 3948 v1.AddArg(v2) 3949 v1.AddArg(mem) 3950 v.AddArg(v1) 3951 return true 3952 } 3953 // match: (Move [24] dst src mem) 3954 // cond: 3955 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 3956 for { 3957 if v.AuxInt != 24 { 3958 break 3959 } 3960 dst := v.Args[0] 3961 src := v.Args[1] 3962 mem := v.Args[2] 3963 v.reset(OpS390XMOVDstore) 3964 v.AuxInt = 16 3965 v.AddArg(dst) 3966 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3967 v0.AuxInt = 16 3968 v0.AddArg(src) 3969 v0.AddArg(mem) 3970 v.AddArg(v0) 3971 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, TypeMem) 3972 v1.AuxInt = 8 3973 v1.AddArg(dst) 3974 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3975 v2.AuxInt = 8 3976 v2.AddArg(src) 3977 v2.AddArg(mem) 3978 v1.AddArg(v2) 3979 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, TypeMem) 3980 v3.AddArg(dst) 3981 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3982 v4.AddArg(src) 3983 v4.AddArg(mem) 3984 v3.AddArg(v4) 3985 v3.AddArg(mem) 3986 v1.AddArg(v3) 3987 v.AddArg(v1) 3988 return true 3989 } 3990 // match: (Move [3] dst src mem) 3991 // cond: 3992 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 3993 for { 3994 if v.AuxInt != 3 { 3995 break 3996 } 3997 dst := v.Args[0] 3998 src := v.Args[1] 3999 mem := v.Args[2] 4000 v.reset(OpS390XMOVBstore) 4001 v.AuxInt = 2 4002 v.AddArg(dst) 4003 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 4004 v0.AuxInt = 2 4005 v0.AddArg(src) 4006 v0.AddArg(mem) 4007 v.AddArg(v0) 4008 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, TypeMem) 4009 v1.AddArg(dst) 4010 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 4011 v2.AddArg(src) 4012 v2.AddArg(mem) 4013 v1.AddArg(v2) 4014 v1.AddArg(mem) 4015 v.AddArg(v1) 4016 return true 4017 } 4018 // match: (Move [5] dst src mem) 4019 // cond: 4020 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4021 for { 4022 if v.AuxInt != 5 { 4023 break 4024 } 4025 dst := v.Args[0] 4026 src := v.Args[1] 4027 mem := v.Args[2] 4028 v.reset(OpS390XMOVBstore) 4029 v.AuxInt = 4 4030 v.AddArg(dst) 4031 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 4032 v0.AuxInt = 4 4033 v0.AddArg(src) 4034 v0.AddArg(mem) 4035 v.AddArg(v0) 4036 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, TypeMem) 4037 v1.AddArg(dst) 4038 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 4039 v2.AddArg(src) 4040 v2.AddArg(mem) 4041 v1.AddArg(v2) 4042 v1.AddArg(mem) 4043 v.AddArg(v1) 4044 return true 4045 } 4046 // match: (Move [6] dst src mem) 4047 // cond: 4048 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4049 for { 4050 if v.AuxInt != 6 { 4051 break 4052 } 4053 dst := v.Args[0] 4054 src := v.Args[1] 4055 mem := v.Args[2] 4056 v.reset(OpS390XMOVHstore) 4057 v.AuxInt = 4 4058 v.AddArg(dst) 4059 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 4060 v0.AuxInt = 4 4061 v0.AddArg(src) 4062 v0.AddArg(mem) 4063 v.AddArg(v0) 4064 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, TypeMem) 4065 v1.AddArg(dst) 4066 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 4067 v2.AddArg(src) 4068 v2.AddArg(mem) 4069 v1.AddArg(v2) 4070 v1.AddArg(mem) 4071 v.AddArg(v1) 4072 return true 4073 } 4074 // match: (Move [7] dst src mem) 4075 // cond: 4076 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4077 for { 4078 if v.AuxInt != 7 { 4079 break 4080 } 4081 dst := v.Args[0] 4082 src := v.Args[1] 4083 mem := v.Args[2] 4084 v.reset(OpS390XMOVBstore) 4085 v.AuxInt = 6 4086 v.AddArg(dst) 4087 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 4088 v0.AuxInt = 6 4089 v0.AddArg(src) 4090 v0.AddArg(mem) 4091 v.AddArg(v0) 4092 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, TypeMem) 4093 v1.AuxInt = 4 4094 v1.AddArg(dst) 4095 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 4096 v2.AuxInt = 4 4097 v2.AddArg(src) 4098 v2.AddArg(mem) 4099 v1.AddArg(v2) 4100 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, TypeMem) 4101 v3.AddArg(dst) 4102 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 4103 v4.AddArg(src) 4104 v4.AddArg(mem) 4105 v3.AddArg(v4) 4106 v3.AddArg(mem) 4107 v1.AddArg(v3) 4108 v.AddArg(v1) 4109 return true 4110 } 4111 // match: (Move [s] dst src mem) 4112 // cond: s > 0 && s <= 256 4113 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4114 for { 4115 s := v.AuxInt 4116 dst := v.Args[0] 4117 src := v.Args[1] 4118 mem := v.Args[2] 4119 if !(s > 0 && s <= 256) { 4120 break 4121 } 4122 v.reset(OpS390XMVC) 4123 v.AuxInt = makeValAndOff(s, 0) 4124 v.AddArg(dst) 4125 v.AddArg(src) 4126 v.AddArg(mem) 4127 return true 4128 } 4129 // match: (Move [s] dst src mem) 4130 // cond: s > 256 && s <= 512 4131 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4132 for { 4133 s := v.AuxInt 4134 dst := v.Args[0] 4135 src := v.Args[1] 4136 mem := v.Args[2] 4137 if !(s > 256 && s <= 512) { 4138 break 4139 } 4140 v.reset(OpS390XMVC) 4141 v.AuxInt = makeValAndOff(s-256, 256) 4142 v.AddArg(dst) 4143 v.AddArg(src) 4144 v0 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4145 v0.AuxInt = makeValAndOff(256, 0) 4146 v0.AddArg(dst) 4147 v0.AddArg(src) 4148 v0.AddArg(mem) 4149 v.AddArg(v0) 4150 return true 4151 } 4152 // match: (Move [s] dst src mem) 4153 // cond: s > 512 && s <= 768 4154 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4155 for { 4156 s := v.AuxInt 4157 dst := v.Args[0] 4158 src := v.Args[1] 4159 mem := v.Args[2] 4160 if !(s > 512 && s <= 768) { 4161 break 4162 } 4163 v.reset(OpS390XMVC) 4164 v.AuxInt = makeValAndOff(s-512, 512) 4165 v.AddArg(dst) 4166 v.AddArg(src) 4167 v0 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4168 v0.AuxInt = makeValAndOff(256, 256) 4169 v0.AddArg(dst) 4170 v0.AddArg(src) 4171 v1 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4172 v1.AuxInt = makeValAndOff(256, 0) 4173 v1.AddArg(dst) 4174 v1.AddArg(src) 4175 v1.AddArg(mem) 4176 v0.AddArg(v1) 4177 v.AddArg(v0) 4178 return true 4179 } 4180 // match: (Move [s] dst src mem) 4181 // cond: s > 768 && s <= 1024 4182 // result: (MVC [makeValAndOff(s-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) 4183 for { 4184 s := v.AuxInt 4185 dst := v.Args[0] 4186 src := v.Args[1] 4187 mem := v.Args[2] 4188 if !(s > 768 && s <= 1024) { 4189 break 4190 } 4191 v.reset(OpS390XMVC) 4192 v.AuxInt = makeValAndOff(s-768, 768) 4193 v.AddArg(dst) 4194 v.AddArg(src) 4195 v0 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4196 v0.AuxInt = makeValAndOff(256, 512) 4197 v0.AddArg(dst) 4198 v0.AddArg(src) 4199 v1 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4200 v1.AuxInt = makeValAndOff(256, 256) 4201 v1.AddArg(dst) 4202 v1.AddArg(src) 4203 v2 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4204 v2.AuxInt = makeValAndOff(256, 0) 4205 v2.AddArg(dst) 4206 v2.AddArg(src) 4207 v2.AddArg(mem) 4208 v1.AddArg(v2) 4209 v0.AddArg(v1) 4210 v.AddArg(v0) 4211 return true 4212 } 4213 // match: (Move [s] dst src mem) 4214 // cond: s > 1024 4215 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4216 for { 4217 s := v.AuxInt 4218 dst := v.Args[0] 4219 src := v.Args[1] 4220 mem := v.Args[2] 4221 if !(s > 1024) { 4222 break 4223 } 4224 v.reset(OpS390XLoweredMove) 4225 v.AuxInt = s % 256 4226 v.AddArg(dst) 4227 v.AddArg(src) 4228 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4229 v0.AuxInt = (s / 256) * 256 4230 v0.AddArg(src) 4231 v.AddArg(v0) 4232 v.AddArg(mem) 4233 return true 4234 } 4235 return false 4236 } 4237 func rewriteValueS390X_OpMul16(v *Value) bool { 4238 // match: (Mul16 x y) 4239 // cond: 4240 // result: (MULLW x y) 4241 for { 4242 x := v.Args[0] 4243 y := v.Args[1] 4244 v.reset(OpS390XMULLW) 4245 v.AddArg(x) 4246 v.AddArg(y) 4247 return true 4248 } 4249 } 4250 func rewriteValueS390X_OpMul32(v *Value) bool { 4251 // match: (Mul32 x y) 4252 // cond: 4253 // result: (MULLW x y) 4254 for { 4255 x := v.Args[0] 4256 y := v.Args[1] 4257 v.reset(OpS390XMULLW) 4258 v.AddArg(x) 4259 v.AddArg(y) 4260 return true 4261 } 4262 } 4263 func rewriteValueS390X_OpMul32F(v *Value) bool { 4264 // match: (Mul32F x y) 4265 // cond: 4266 // result: (FMULS x y) 4267 for { 4268 x := v.Args[0] 4269 y := v.Args[1] 4270 v.reset(OpS390XFMULS) 4271 v.AddArg(x) 4272 v.AddArg(y) 4273 return true 4274 } 4275 } 4276 func rewriteValueS390X_OpMul64(v *Value) bool { 4277 // match: (Mul64 x y) 4278 // cond: 4279 // result: (MULLD x y) 4280 for { 4281 x := v.Args[0] 4282 y := v.Args[1] 4283 v.reset(OpS390XMULLD) 4284 v.AddArg(x) 4285 v.AddArg(y) 4286 return true 4287 } 4288 } 4289 func rewriteValueS390X_OpMul64F(v *Value) bool { 4290 // match: (Mul64F x y) 4291 // cond: 4292 // result: (FMUL x y) 4293 for { 4294 x := v.Args[0] 4295 y := v.Args[1] 4296 v.reset(OpS390XFMUL) 4297 v.AddArg(x) 4298 v.AddArg(y) 4299 return true 4300 } 4301 } 4302 func rewriteValueS390X_OpMul8(v *Value) bool { 4303 // match: (Mul8 x y) 4304 // cond: 4305 // result: (MULLW x y) 4306 for { 4307 x := v.Args[0] 4308 y := v.Args[1] 4309 v.reset(OpS390XMULLW) 4310 v.AddArg(x) 4311 v.AddArg(y) 4312 return true 4313 } 4314 } 4315 func rewriteValueS390X_OpNeg16(v *Value) bool { 4316 b := v.Block 4317 _ = b 4318 types := &b.Func.Config.Types 4319 _ = types 4320 // match: (Neg16 x) 4321 // cond: 4322 // result: (NEGW (MOVHreg x)) 4323 for { 4324 x := v.Args[0] 4325 v.reset(OpS390XNEGW) 4326 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4327 v0.AddArg(x) 4328 v.AddArg(v0) 4329 return true 4330 } 4331 } 4332 func rewriteValueS390X_OpNeg32(v *Value) bool { 4333 // match: (Neg32 x) 4334 // cond: 4335 // result: (NEGW x) 4336 for { 4337 x := v.Args[0] 4338 v.reset(OpS390XNEGW) 4339 v.AddArg(x) 4340 return true 4341 } 4342 } 4343 func rewriteValueS390X_OpNeg32F(v *Value) bool { 4344 // match: (Neg32F x) 4345 // cond: 4346 // result: (FNEGS x) 4347 for { 4348 x := v.Args[0] 4349 v.reset(OpS390XFNEGS) 4350 v.AddArg(x) 4351 return true 4352 } 4353 } 4354 func rewriteValueS390X_OpNeg64(v *Value) bool { 4355 // match: (Neg64 x) 4356 // cond: 4357 // result: (NEG x) 4358 for { 4359 x := v.Args[0] 4360 v.reset(OpS390XNEG) 4361 v.AddArg(x) 4362 return true 4363 } 4364 } 4365 func rewriteValueS390X_OpNeg64F(v *Value) bool { 4366 // match: (Neg64F x) 4367 // cond: 4368 // result: (FNEG x) 4369 for { 4370 x := v.Args[0] 4371 v.reset(OpS390XFNEG) 4372 v.AddArg(x) 4373 return true 4374 } 4375 } 4376 func rewriteValueS390X_OpNeg8(v *Value) bool { 4377 b := v.Block 4378 _ = b 4379 types := &b.Func.Config.Types 4380 _ = types 4381 // match: (Neg8 x) 4382 // cond: 4383 // result: (NEGW (MOVBreg x)) 4384 for { 4385 x := v.Args[0] 4386 v.reset(OpS390XNEGW) 4387 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4388 v0.AddArg(x) 4389 v.AddArg(v0) 4390 return true 4391 } 4392 } 4393 func rewriteValueS390X_OpNeq16(v *Value) bool { 4394 b := v.Block 4395 _ = b 4396 types := &b.Func.Config.Types 4397 _ = types 4398 // match: (Neq16 x y) 4399 // cond: 4400 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4401 for { 4402 x := v.Args[0] 4403 y := v.Args[1] 4404 v.reset(OpS390XMOVDNE) 4405 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4406 v0.AuxInt = 0 4407 v.AddArg(v0) 4408 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4409 v1.AuxInt = 1 4410 v.AddArg(v1) 4411 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4412 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4413 v3.AddArg(x) 4414 v2.AddArg(v3) 4415 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4416 v4.AddArg(y) 4417 v2.AddArg(v4) 4418 v.AddArg(v2) 4419 return true 4420 } 4421 } 4422 func rewriteValueS390X_OpNeq32(v *Value) bool { 4423 b := v.Block 4424 _ = b 4425 types := &b.Func.Config.Types 4426 _ = types 4427 // match: (Neq32 x y) 4428 // cond: 4429 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4430 for { 4431 x := v.Args[0] 4432 y := v.Args[1] 4433 v.reset(OpS390XMOVDNE) 4434 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4435 v0.AuxInt = 0 4436 v.AddArg(v0) 4437 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4438 v1.AuxInt = 1 4439 v.AddArg(v1) 4440 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 4441 v2.AddArg(x) 4442 v2.AddArg(y) 4443 v.AddArg(v2) 4444 return true 4445 } 4446 } 4447 func rewriteValueS390X_OpNeq32F(v *Value) bool { 4448 b := v.Block 4449 _ = b 4450 types := &b.Func.Config.Types 4451 _ = types 4452 // match: (Neq32F x y) 4453 // cond: 4454 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4455 for { 4456 x := v.Args[0] 4457 y := v.Args[1] 4458 v.reset(OpS390XMOVDNE) 4459 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4460 v0.AuxInt = 0 4461 v.AddArg(v0) 4462 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4463 v1.AuxInt = 1 4464 v.AddArg(v1) 4465 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 4466 v2.AddArg(x) 4467 v2.AddArg(y) 4468 v.AddArg(v2) 4469 return true 4470 } 4471 } 4472 func rewriteValueS390X_OpNeq64(v *Value) bool { 4473 b := v.Block 4474 _ = b 4475 types := &b.Func.Config.Types 4476 _ = types 4477 // match: (Neq64 x y) 4478 // cond: 4479 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4480 for { 4481 x := v.Args[0] 4482 y := v.Args[1] 4483 v.reset(OpS390XMOVDNE) 4484 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4485 v0.AuxInt = 0 4486 v.AddArg(v0) 4487 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4488 v1.AuxInt = 1 4489 v.AddArg(v1) 4490 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4491 v2.AddArg(x) 4492 v2.AddArg(y) 4493 v.AddArg(v2) 4494 return true 4495 } 4496 } 4497 func rewriteValueS390X_OpNeq64F(v *Value) bool { 4498 b := v.Block 4499 _ = b 4500 types := &b.Func.Config.Types 4501 _ = types 4502 // match: (Neq64F x y) 4503 // cond: 4504 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4505 for { 4506 x := v.Args[0] 4507 y := v.Args[1] 4508 v.reset(OpS390XMOVDNE) 4509 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4510 v0.AuxInt = 0 4511 v.AddArg(v0) 4512 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4513 v1.AuxInt = 1 4514 v.AddArg(v1) 4515 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 4516 v2.AddArg(x) 4517 v2.AddArg(y) 4518 v.AddArg(v2) 4519 return true 4520 } 4521 } 4522 func rewriteValueS390X_OpNeq8(v *Value) bool { 4523 b := v.Block 4524 _ = b 4525 types := &b.Func.Config.Types 4526 _ = types 4527 // match: (Neq8 x y) 4528 // cond: 4529 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4530 for { 4531 x := v.Args[0] 4532 y := v.Args[1] 4533 v.reset(OpS390XMOVDNE) 4534 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4535 v0.AuxInt = 0 4536 v.AddArg(v0) 4537 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4538 v1.AuxInt = 1 4539 v.AddArg(v1) 4540 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4541 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4542 v3.AddArg(x) 4543 v2.AddArg(v3) 4544 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4545 v4.AddArg(y) 4546 v2.AddArg(v4) 4547 v.AddArg(v2) 4548 return true 4549 } 4550 } 4551 func rewriteValueS390X_OpNeqB(v *Value) bool { 4552 b := v.Block 4553 _ = b 4554 types := &b.Func.Config.Types 4555 _ = types 4556 // match: (NeqB x y) 4557 // cond: 4558 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4559 for { 4560 x := v.Args[0] 4561 y := v.Args[1] 4562 v.reset(OpS390XMOVDNE) 4563 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4564 v0.AuxInt = 0 4565 v.AddArg(v0) 4566 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4567 v1.AuxInt = 1 4568 v.AddArg(v1) 4569 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4570 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4571 v3.AddArg(x) 4572 v2.AddArg(v3) 4573 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4574 v4.AddArg(y) 4575 v2.AddArg(v4) 4576 v.AddArg(v2) 4577 return true 4578 } 4579 } 4580 func rewriteValueS390X_OpNeqPtr(v *Value) bool { 4581 b := v.Block 4582 _ = b 4583 types := &b.Func.Config.Types 4584 _ = types 4585 // match: (NeqPtr x y) 4586 // cond: 4587 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4588 for { 4589 x := v.Args[0] 4590 y := v.Args[1] 4591 v.reset(OpS390XMOVDNE) 4592 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4593 v0.AuxInt = 0 4594 v.AddArg(v0) 4595 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4596 v1.AuxInt = 1 4597 v.AddArg(v1) 4598 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4599 v2.AddArg(x) 4600 v2.AddArg(y) 4601 v.AddArg(v2) 4602 return true 4603 } 4604 } 4605 func rewriteValueS390X_OpNilCheck(v *Value) bool { 4606 // match: (NilCheck ptr mem) 4607 // cond: 4608 // result: (LoweredNilCheck ptr mem) 4609 for { 4610 ptr := v.Args[0] 4611 mem := v.Args[1] 4612 v.reset(OpS390XLoweredNilCheck) 4613 v.AddArg(ptr) 4614 v.AddArg(mem) 4615 return true 4616 } 4617 } 4618 func rewriteValueS390X_OpNot(v *Value) bool { 4619 // match: (Not x) 4620 // cond: 4621 // result: (XORWconst [1] x) 4622 for { 4623 x := v.Args[0] 4624 v.reset(OpS390XXORWconst) 4625 v.AuxInt = 1 4626 v.AddArg(x) 4627 return true 4628 } 4629 } 4630 func rewriteValueS390X_OpOffPtr(v *Value) bool { 4631 b := v.Block 4632 _ = b 4633 types := &b.Func.Config.Types 4634 _ = types 4635 // match: (OffPtr [off] ptr:(SP)) 4636 // cond: 4637 // result: (MOVDaddr [off] ptr) 4638 for { 4639 off := v.AuxInt 4640 ptr := v.Args[0] 4641 if ptr.Op != OpSP { 4642 break 4643 } 4644 v.reset(OpS390XMOVDaddr) 4645 v.AuxInt = off 4646 v.AddArg(ptr) 4647 return true 4648 } 4649 // match: (OffPtr [off] ptr) 4650 // cond: is32Bit(off) 4651 // result: (ADDconst [off] ptr) 4652 for { 4653 off := v.AuxInt 4654 ptr := v.Args[0] 4655 if !(is32Bit(off)) { 4656 break 4657 } 4658 v.reset(OpS390XADDconst) 4659 v.AuxInt = off 4660 v.AddArg(ptr) 4661 return true 4662 } 4663 // match: (OffPtr [off] ptr) 4664 // cond: 4665 // result: (ADD (MOVDconst [off]) ptr) 4666 for { 4667 off := v.AuxInt 4668 ptr := v.Args[0] 4669 v.reset(OpS390XADD) 4670 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4671 v0.AuxInt = off 4672 v.AddArg(v0) 4673 v.AddArg(ptr) 4674 return true 4675 } 4676 } 4677 func rewriteValueS390X_OpOr16(v *Value) bool { 4678 // match: (Or16 x y) 4679 // cond: 4680 // result: (ORW x y) 4681 for { 4682 x := v.Args[0] 4683 y := v.Args[1] 4684 v.reset(OpS390XORW) 4685 v.AddArg(x) 4686 v.AddArg(y) 4687 return true 4688 } 4689 } 4690 func rewriteValueS390X_OpOr32(v *Value) bool { 4691 // match: (Or32 x y) 4692 // cond: 4693 // result: (ORW x y) 4694 for { 4695 x := v.Args[0] 4696 y := v.Args[1] 4697 v.reset(OpS390XORW) 4698 v.AddArg(x) 4699 v.AddArg(y) 4700 return true 4701 } 4702 } 4703 func rewriteValueS390X_OpOr64(v *Value) bool { 4704 // match: (Or64 x y) 4705 // cond: 4706 // result: (OR x y) 4707 for { 4708 x := v.Args[0] 4709 y := v.Args[1] 4710 v.reset(OpS390XOR) 4711 v.AddArg(x) 4712 v.AddArg(y) 4713 return true 4714 } 4715 } 4716 func rewriteValueS390X_OpOr8(v *Value) bool { 4717 // match: (Or8 x y) 4718 // cond: 4719 // result: (ORW x y) 4720 for { 4721 x := v.Args[0] 4722 y := v.Args[1] 4723 v.reset(OpS390XORW) 4724 v.AddArg(x) 4725 v.AddArg(y) 4726 return true 4727 } 4728 } 4729 func rewriteValueS390X_OpOrB(v *Value) bool { 4730 // match: (OrB x y) 4731 // cond: 4732 // result: (ORW x y) 4733 for { 4734 x := v.Args[0] 4735 y := v.Args[1] 4736 v.reset(OpS390XORW) 4737 v.AddArg(x) 4738 v.AddArg(y) 4739 return true 4740 } 4741 } 4742 func rewriteValueS390X_OpRound32F(v *Value) bool { 4743 // match: (Round32F x) 4744 // cond: 4745 // result: (LoweredRound32F x) 4746 for { 4747 x := v.Args[0] 4748 v.reset(OpS390XLoweredRound32F) 4749 v.AddArg(x) 4750 return true 4751 } 4752 } 4753 func rewriteValueS390X_OpRound64F(v *Value) bool { 4754 // match: (Round64F x) 4755 // cond: 4756 // result: (LoweredRound64F x) 4757 for { 4758 x := v.Args[0] 4759 v.reset(OpS390XLoweredRound64F) 4760 v.AddArg(x) 4761 return true 4762 } 4763 } 4764 func rewriteValueS390X_OpRsh16Ux16(v *Value) bool { 4765 b := v.Block 4766 _ = b 4767 types := &b.Func.Config.Types 4768 _ = types 4769 // match: (Rsh16Ux16 <t> x y) 4770 // cond: 4771 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 4772 for { 4773 t := v.Type 4774 x := v.Args[0] 4775 y := v.Args[1] 4776 v.reset(OpS390XANDW) 4777 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4778 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4779 v1.AddArg(x) 4780 v0.AddArg(v1) 4781 v0.AddArg(y) 4782 v.AddArg(v0) 4783 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4784 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4785 v3.AuxInt = 15 4786 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4787 v4.AddArg(y) 4788 v3.AddArg(v4) 4789 v2.AddArg(v3) 4790 v.AddArg(v2) 4791 return true 4792 } 4793 } 4794 func rewriteValueS390X_OpRsh16Ux32(v *Value) bool { 4795 b := v.Block 4796 _ = b 4797 types := &b.Func.Config.Types 4798 _ = types 4799 // match: (Rsh16Ux32 <t> x y) 4800 // cond: 4801 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 4802 for { 4803 t := v.Type 4804 x := v.Args[0] 4805 y := v.Args[1] 4806 v.reset(OpS390XANDW) 4807 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4808 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4809 v1.AddArg(x) 4810 v0.AddArg(v1) 4811 v0.AddArg(y) 4812 v.AddArg(v0) 4813 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4814 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4815 v3.AuxInt = 15 4816 v3.AddArg(y) 4817 v2.AddArg(v3) 4818 v.AddArg(v2) 4819 return true 4820 } 4821 } 4822 func rewriteValueS390X_OpRsh16Ux64(v *Value) bool { 4823 b := v.Block 4824 _ = b 4825 types := &b.Func.Config.Types 4826 _ = types 4827 // match: (Rsh16Ux64 <t> x y) 4828 // cond: 4829 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 4830 for { 4831 t := v.Type 4832 x := v.Args[0] 4833 y := v.Args[1] 4834 v.reset(OpS390XANDW) 4835 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4836 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4837 v1.AddArg(x) 4838 v0.AddArg(v1) 4839 v0.AddArg(y) 4840 v.AddArg(v0) 4841 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4842 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 4843 v3.AuxInt = 15 4844 v3.AddArg(y) 4845 v2.AddArg(v3) 4846 v.AddArg(v2) 4847 return true 4848 } 4849 } 4850 func rewriteValueS390X_OpRsh16Ux8(v *Value) bool { 4851 b := v.Block 4852 _ = b 4853 types := &b.Func.Config.Types 4854 _ = types 4855 // match: (Rsh16Ux8 <t> x y) 4856 // cond: 4857 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 4858 for { 4859 t := v.Type 4860 x := v.Args[0] 4861 y := v.Args[1] 4862 v.reset(OpS390XANDW) 4863 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4864 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4865 v1.AddArg(x) 4866 v0.AddArg(v1) 4867 v0.AddArg(y) 4868 v.AddArg(v0) 4869 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4870 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4871 v3.AuxInt = 15 4872 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 4873 v4.AddArg(y) 4874 v3.AddArg(v4) 4875 v2.AddArg(v3) 4876 v.AddArg(v2) 4877 return true 4878 } 4879 } 4880 func rewriteValueS390X_OpRsh16x16(v *Value) bool { 4881 b := v.Block 4882 _ = b 4883 types := &b.Func.Config.Types 4884 _ = types 4885 // match: (Rsh16x16 <t> x y) 4886 // cond: 4887 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 4888 for { 4889 t := v.Type 4890 x := v.Args[0] 4891 y := v.Args[1] 4892 v.reset(OpS390XSRAW) 4893 v.Type = t 4894 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4895 v0.AddArg(x) 4896 v.AddArg(v0) 4897 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 4898 v1.AddArg(y) 4899 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 4900 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 4901 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4902 v4.AuxInt = 15 4903 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4904 v5.AddArg(y) 4905 v4.AddArg(v5) 4906 v3.AddArg(v4) 4907 v2.AddArg(v3) 4908 v1.AddArg(v2) 4909 v.AddArg(v1) 4910 return true 4911 } 4912 } 4913 func rewriteValueS390X_OpRsh16x32(v *Value) bool { 4914 b := v.Block 4915 _ = b 4916 types := &b.Func.Config.Types 4917 _ = types 4918 // match: (Rsh16x32 <t> x y) 4919 // cond: 4920 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 4921 for { 4922 t := v.Type 4923 x := v.Args[0] 4924 y := v.Args[1] 4925 v.reset(OpS390XSRAW) 4926 v.Type = t 4927 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4928 v0.AddArg(x) 4929 v.AddArg(v0) 4930 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 4931 v1.AddArg(y) 4932 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 4933 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 4934 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4935 v4.AuxInt = 15 4936 v4.AddArg(y) 4937 v3.AddArg(v4) 4938 v2.AddArg(v3) 4939 v1.AddArg(v2) 4940 v.AddArg(v1) 4941 return true 4942 } 4943 } 4944 func rewriteValueS390X_OpRsh16x64(v *Value) bool { 4945 b := v.Block 4946 _ = b 4947 types := &b.Func.Config.Types 4948 _ = types 4949 // match: (Rsh16x64 <t> x y) 4950 // cond: 4951 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 4952 for { 4953 t := v.Type 4954 x := v.Args[0] 4955 y := v.Args[1] 4956 v.reset(OpS390XSRAW) 4957 v.Type = t 4958 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4959 v0.AddArg(x) 4960 v.AddArg(v0) 4961 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 4962 v1.AddArg(y) 4963 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 4964 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 4965 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 4966 v4.AuxInt = 15 4967 v4.AddArg(y) 4968 v3.AddArg(v4) 4969 v2.AddArg(v3) 4970 v1.AddArg(v2) 4971 v.AddArg(v1) 4972 return true 4973 } 4974 } 4975 func rewriteValueS390X_OpRsh16x8(v *Value) bool { 4976 b := v.Block 4977 _ = b 4978 types := &b.Func.Config.Types 4979 _ = types 4980 // match: (Rsh16x8 <t> x y) 4981 // cond: 4982 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 4983 for { 4984 t := v.Type 4985 x := v.Args[0] 4986 y := v.Args[1] 4987 v.reset(OpS390XSRAW) 4988 v.Type = t 4989 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4990 v0.AddArg(x) 4991 v.AddArg(v0) 4992 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 4993 v1.AddArg(y) 4994 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 4995 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 4996 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4997 v4.AuxInt = 15 4998 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 4999 v5.AddArg(y) 5000 v4.AddArg(v5) 5001 v3.AddArg(v4) 5002 v2.AddArg(v3) 5003 v1.AddArg(v2) 5004 v.AddArg(v1) 5005 return true 5006 } 5007 } 5008 func rewriteValueS390X_OpRsh32Ux16(v *Value) bool { 5009 b := v.Block 5010 _ = b 5011 types := &b.Func.Config.Types 5012 _ = types 5013 // match: (Rsh32Ux16 <t> x y) 5014 // cond: 5015 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5016 for { 5017 t := v.Type 5018 x := v.Args[0] 5019 y := v.Args[1] 5020 v.reset(OpS390XANDW) 5021 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5022 v0.AddArg(x) 5023 v0.AddArg(y) 5024 v.AddArg(v0) 5025 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5026 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5027 v2.AuxInt = 31 5028 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5029 v3.AddArg(y) 5030 v2.AddArg(v3) 5031 v1.AddArg(v2) 5032 v.AddArg(v1) 5033 return true 5034 } 5035 } 5036 func rewriteValueS390X_OpRsh32Ux32(v *Value) bool { 5037 b := v.Block 5038 _ = b 5039 // match: (Rsh32Ux32 <t> x y) 5040 // cond: 5041 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5042 for { 5043 t := v.Type 5044 x := v.Args[0] 5045 y := v.Args[1] 5046 v.reset(OpS390XANDW) 5047 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5048 v0.AddArg(x) 5049 v0.AddArg(y) 5050 v.AddArg(v0) 5051 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5052 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5053 v2.AuxInt = 31 5054 v2.AddArg(y) 5055 v1.AddArg(v2) 5056 v.AddArg(v1) 5057 return true 5058 } 5059 } 5060 func rewriteValueS390X_OpRsh32Ux64(v *Value) bool { 5061 b := v.Block 5062 _ = b 5063 // match: (Rsh32Ux64 <t> x y) 5064 // cond: 5065 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5066 for { 5067 t := v.Type 5068 x := v.Args[0] 5069 y := v.Args[1] 5070 v.reset(OpS390XANDW) 5071 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5072 v0.AddArg(x) 5073 v0.AddArg(y) 5074 v.AddArg(v0) 5075 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5076 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5077 v2.AuxInt = 31 5078 v2.AddArg(y) 5079 v1.AddArg(v2) 5080 v.AddArg(v1) 5081 return true 5082 } 5083 } 5084 func rewriteValueS390X_OpRsh32Ux8(v *Value) bool { 5085 b := v.Block 5086 _ = b 5087 types := &b.Func.Config.Types 5088 _ = types 5089 // match: (Rsh32Ux8 <t> x y) 5090 // cond: 5091 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 5092 for { 5093 t := v.Type 5094 x := v.Args[0] 5095 y := v.Args[1] 5096 v.reset(OpS390XANDW) 5097 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5098 v0.AddArg(x) 5099 v0.AddArg(y) 5100 v.AddArg(v0) 5101 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5102 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5103 v2.AuxInt = 31 5104 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5105 v3.AddArg(y) 5106 v2.AddArg(v3) 5107 v1.AddArg(v2) 5108 v.AddArg(v1) 5109 return true 5110 } 5111 } 5112 func rewriteValueS390X_OpRsh32x16(v *Value) bool { 5113 b := v.Block 5114 _ = b 5115 types := &b.Func.Config.Types 5116 _ = types 5117 // match: (Rsh32x16 <t> x y) 5118 // cond: 5119 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5120 for { 5121 t := v.Type 5122 x := v.Args[0] 5123 y := v.Args[1] 5124 v.reset(OpS390XSRAW) 5125 v.Type = t 5126 v.AddArg(x) 5127 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5128 v0.AddArg(y) 5129 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5130 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5131 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5132 v3.AuxInt = 31 5133 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5134 v4.AddArg(y) 5135 v3.AddArg(v4) 5136 v2.AddArg(v3) 5137 v1.AddArg(v2) 5138 v0.AddArg(v1) 5139 v.AddArg(v0) 5140 return true 5141 } 5142 } 5143 func rewriteValueS390X_OpRsh32x32(v *Value) bool { 5144 b := v.Block 5145 _ = b 5146 // match: (Rsh32x32 <t> x y) 5147 // cond: 5148 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5149 for { 5150 t := v.Type 5151 x := v.Args[0] 5152 y := v.Args[1] 5153 v.reset(OpS390XSRAW) 5154 v.Type = t 5155 v.AddArg(x) 5156 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5157 v0.AddArg(y) 5158 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5159 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5160 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5161 v3.AuxInt = 31 5162 v3.AddArg(y) 5163 v2.AddArg(v3) 5164 v1.AddArg(v2) 5165 v0.AddArg(v1) 5166 v.AddArg(v0) 5167 return true 5168 } 5169 } 5170 func rewriteValueS390X_OpRsh32x64(v *Value) bool { 5171 b := v.Block 5172 _ = b 5173 // match: (Rsh32x64 <t> x y) 5174 // cond: 5175 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5176 for { 5177 t := v.Type 5178 x := v.Args[0] 5179 y := v.Args[1] 5180 v.reset(OpS390XSRAW) 5181 v.Type = t 5182 v.AddArg(x) 5183 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5184 v0.AddArg(y) 5185 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5186 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5187 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5188 v3.AuxInt = 31 5189 v3.AddArg(y) 5190 v2.AddArg(v3) 5191 v1.AddArg(v2) 5192 v0.AddArg(v1) 5193 v.AddArg(v0) 5194 return true 5195 } 5196 } 5197 func rewriteValueS390X_OpRsh32x8(v *Value) bool { 5198 b := v.Block 5199 _ = b 5200 types := &b.Func.Config.Types 5201 _ = types 5202 // match: (Rsh32x8 <t> x y) 5203 // cond: 5204 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5205 for { 5206 t := v.Type 5207 x := v.Args[0] 5208 y := v.Args[1] 5209 v.reset(OpS390XSRAW) 5210 v.Type = t 5211 v.AddArg(x) 5212 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5213 v0.AddArg(y) 5214 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5215 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5216 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5217 v3.AuxInt = 31 5218 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5219 v4.AddArg(y) 5220 v3.AddArg(v4) 5221 v2.AddArg(v3) 5222 v1.AddArg(v2) 5223 v0.AddArg(v1) 5224 v.AddArg(v0) 5225 return true 5226 } 5227 } 5228 func rewriteValueS390X_OpRsh64Ux16(v *Value) bool { 5229 b := v.Block 5230 _ = b 5231 types := &b.Func.Config.Types 5232 _ = types 5233 // match: (Rsh64Ux16 <t> x y) 5234 // cond: 5235 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5236 for { 5237 t := v.Type 5238 x := v.Args[0] 5239 y := v.Args[1] 5240 v.reset(OpS390XAND) 5241 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5242 v0.AddArg(x) 5243 v0.AddArg(y) 5244 v.AddArg(v0) 5245 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5246 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5247 v2.AuxInt = 63 5248 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5249 v3.AddArg(y) 5250 v2.AddArg(v3) 5251 v1.AddArg(v2) 5252 v.AddArg(v1) 5253 return true 5254 } 5255 } 5256 func rewriteValueS390X_OpRsh64Ux32(v *Value) bool { 5257 b := v.Block 5258 _ = b 5259 // match: (Rsh64Ux32 <t> x y) 5260 // cond: 5261 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5262 for { 5263 t := v.Type 5264 x := v.Args[0] 5265 y := v.Args[1] 5266 v.reset(OpS390XAND) 5267 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5268 v0.AddArg(x) 5269 v0.AddArg(y) 5270 v.AddArg(v0) 5271 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5272 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5273 v2.AuxInt = 63 5274 v2.AddArg(y) 5275 v1.AddArg(v2) 5276 v.AddArg(v1) 5277 return true 5278 } 5279 } 5280 func rewriteValueS390X_OpRsh64Ux64(v *Value) bool { 5281 b := v.Block 5282 _ = b 5283 // match: (Rsh64Ux64 <t> x y) 5284 // cond: 5285 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5286 for { 5287 t := v.Type 5288 x := v.Args[0] 5289 y := v.Args[1] 5290 v.reset(OpS390XAND) 5291 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5292 v0.AddArg(x) 5293 v0.AddArg(y) 5294 v.AddArg(v0) 5295 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5296 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5297 v2.AuxInt = 63 5298 v2.AddArg(y) 5299 v1.AddArg(v2) 5300 v.AddArg(v1) 5301 return true 5302 } 5303 } 5304 func rewriteValueS390X_OpRsh64Ux8(v *Value) bool { 5305 b := v.Block 5306 _ = b 5307 types := &b.Func.Config.Types 5308 _ = types 5309 // match: (Rsh64Ux8 <t> x y) 5310 // cond: 5311 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5312 for { 5313 t := v.Type 5314 x := v.Args[0] 5315 y := v.Args[1] 5316 v.reset(OpS390XAND) 5317 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5318 v0.AddArg(x) 5319 v0.AddArg(y) 5320 v.AddArg(v0) 5321 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5322 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5323 v2.AuxInt = 63 5324 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5325 v3.AddArg(y) 5326 v2.AddArg(v3) 5327 v1.AddArg(v2) 5328 v.AddArg(v1) 5329 return true 5330 } 5331 } 5332 func rewriteValueS390X_OpRsh64x16(v *Value) bool { 5333 b := v.Block 5334 _ = b 5335 types := &b.Func.Config.Types 5336 _ = types 5337 // match: (Rsh64x16 <t> x y) 5338 // cond: 5339 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5340 for { 5341 t := v.Type 5342 x := v.Args[0] 5343 y := v.Args[1] 5344 v.reset(OpS390XSRAD) 5345 v.Type = t 5346 v.AddArg(x) 5347 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5348 v0.AddArg(y) 5349 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5350 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5351 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5352 v3.AuxInt = 63 5353 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5354 v4.AddArg(y) 5355 v3.AddArg(v4) 5356 v2.AddArg(v3) 5357 v1.AddArg(v2) 5358 v0.AddArg(v1) 5359 v.AddArg(v0) 5360 return true 5361 } 5362 } 5363 func rewriteValueS390X_OpRsh64x32(v *Value) bool { 5364 b := v.Block 5365 _ = b 5366 // match: (Rsh64x32 <t> x y) 5367 // cond: 5368 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5369 for { 5370 t := v.Type 5371 x := v.Args[0] 5372 y := v.Args[1] 5373 v.reset(OpS390XSRAD) 5374 v.Type = t 5375 v.AddArg(x) 5376 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5377 v0.AddArg(y) 5378 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5379 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5380 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5381 v3.AuxInt = 63 5382 v3.AddArg(y) 5383 v2.AddArg(v3) 5384 v1.AddArg(v2) 5385 v0.AddArg(v1) 5386 v.AddArg(v0) 5387 return true 5388 } 5389 } 5390 func rewriteValueS390X_OpRsh64x64(v *Value) bool { 5391 b := v.Block 5392 _ = b 5393 // match: (Rsh64x64 <t> x y) 5394 // cond: 5395 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5396 for { 5397 t := v.Type 5398 x := v.Args[0] 5399 y := v.Args[1] 5400 v.reset(OpS390XSRAD) 5401 v.Type = t 5402 v.AddArg(x) 5403 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5404 v0.AddArg(y) 5405 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5406 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5407 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5408 v3.AuxInt = 63 5409 v3.AddArg(y) 5410 v2.AddArg(v3) 5411 v1.AddArg(v2) 5412 v0.AddArg(v1) 5413 v.AddArg(v0) 5414 return true 5415 } 5416 } 5417 func rewriteValueS390X_OpRsh64x8(v *Value) bool { 5418 b := v.Block 5419 _ = b 5420 types := &b.Func.Config.Types 5421 _ = types 5422 // match: (Rsh64x8 <t> x y) 5423 // cond: 5424 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5425 for { 5426 t := v.Type 5427 x := v.Args[0] 5428 y := v.Args[1] 5429 v.reset(OpS390XSRAD) 5430 v.Type = t 5431 v.AddArg(x) 5432 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5433 v0.AddArg(y) 5434 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5435 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5436 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5437 v3.AuxInt = 63 5438 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5439 v4.AddArg(y) 5440 v3.AddArg(v4) 5441 v2.AddArg(v3) 5442 v1.AddArg(v2) 5443 v0.AddArg(v1) 5444 v.AddArg(v0) 5445 return true 5446 } 5447 } 5448 func rewriteValueS390X_OpRsh8Ux16(v *Value) bool { 5449 b := v.Block 5450 _ = b 5451 types := &b.Func.Config.Types 5452 _ = types 5453 // match: (Rsh8Ux16 <t> x y) 5454 // cond: 5455 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5456 for { 5457 t := v.Type 5458 x := v.Args[0] 5459 y := v.Args[1] 5460 v.reset(OpS390XANDW) 5461 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5462 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5463 v1.AddArg(x) 5464 v0.AddArg(v1) 5465 v0.AddArg(y) 5466 v.AddArg(v0) 5467 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5468 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5469 v3.AuxInt = 7 5470 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5471 v4.AddArg(y) 5472 v3.AddArg(v4) 5473 v2.AddArg(v3) 5474 v.AddArg(v2) 5475 return true 5476 } 5477 } 5478 func rewriteValueS390X_OpRsh8Ux32(v *Value) bool { 5479 b := v.Block 5480 _ = b 5481 types := &b.Func.Config.Types 5482 _ = types 5483 // match: (Rsh8Ux32 <t> x y) 5484 // cond: 5485 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5486 for { 5487 t := v.Type 5488 x := v.Args[0] 5489 y := v.Args[1] 5490 v.reset(OpS390XANDW) 5491 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5492 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5493 v1.AddArg(x) 5494 v0.AddArg(v1) 5495 v0.AddArg(y) 5496 v.AddArg(v0) 5497 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5498 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5499 v3.AuxInt = 7 5500 v3.AddArg(y) 5501 v2.AddArg(v3) 5502 v.AddArg(v2) 5503 return true 5504 } 5505 } 5506 func rewriteValueS390X_OpRsh8Ux64(v *Value) bool { 5507 b := v.Block 5508 _ = b 5509 types := &b.Func.Config.Types 5510 _ = types 5511 // match: (Rsh8Ux64 <t> x y) 5512 // cond: 5513 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5514 for { 5515 t := v.Type 5516 x := v.Args[0] 5517 y := v.Args[1] 5518 v.reset(OpS390XANDW) 5519 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5520 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5521 v1.AddArg(x) 5522 v0.AddArg(v1) 5523 v0.AddArg(y) 5524 v.AddArg(v0) 5525 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5526 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5527 v3.AuxInt = 7 5528 v3.AddArg(y) 5529 v2.AddArg(v3) 5530 v.AddArg(v2) 5531 return true 5532 } 5533 } 5534 func rewriteValueS390X_OpRsh8Ux8(v *Value) bool { 5535 b := v.Block 5536 _ = b 5537 types := &b.Func.Config.Types 5538 _ = types 5539 // match: (Rsh8Ux8 <t> x y) 5540 // cond: 5541 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5542 for { 5543 t := v.Type 5544 x := v.Args[0] 5545 y := v.Args[1] 5546 v.reset(OpS390XANDW) 5547 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5548 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5549 v1.AddArg(x) 5550 v0.AddArg(v1) 5551 v0.AddArg(y) 5552 v.AddArg(v0) 5553 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5554 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5555 v3.AuxInt = 7 5556 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5557 v4.AddArg(y) 5558 v3.AddArg(v4) 5559 v2.AddArg(v3) 5560 v.AddArg(v2) 5561 return true 5562 } 5563 } 5564 func rewriteValueS390X_OpRsh8x16(v *Value) bool { 5565 b := v.Block 5566 _ = b 5567 types := &b.Func.Config.Types 5568 _ = types 5569 // match: (Rsh8x16 <t> x y) 5570 // cond: 5571 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5572 for { 5573 t := v.Type 5574 x := v.Args[0] 5575 y := v.Args[1] 5576 v.reset(OpS390XSRAW) 5577 v.Type = t 5578 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5579 v0.AddArg(x) 5580 v.AddArg(v0) 5581 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5582 v1.AddArg(y) 5583 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5584 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5585 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5586 v4.AuxInt = 7 5587 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5588 v5.AddArg(y) 5589 v4.AddArg(v5) 5590 v3.AddArg(v4) 5591 v2.AddArg(v3) 5592 v1.AddArg(v2) 5593 v.AddArg(v1) 5594 return true 5595 } 5596 } 5597 func rewriteValueS390X_OpRsh8x32(v *Value) bool { 5598 b := v.Block 5599 _ = b 5600 types := &b.Func.Config.Types 5601 _ = types 5602 // match: (Rsh8x32 <t> x y) 5603 // cond: 5604 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5605 for { 5606 t := v.Type 5607 x := v.Args[0] 5608 y := v.Args[1] 5609 v.reset(OpS390XSRAW) 5610 v.Type = t 5611 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5612 v0.AddArg(x) 5613 v.AddArg(v0) 5614 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5615 v1.AddArg(y) 5616 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5617 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5618 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5619 v4.AuxInt = 7 5620 v4.AddArg(y) 5621 v3.AddArg(v4) 5622 v2.AddArg(v3) 5623 v1.AddArg(v2) 5624 v.AddArg(v1) 5625 return true 5626 } 5627 } 5628 func rewriteValueS390X_OpRsh8x64(v *Value) bool { 5629 b := v.Block 5630 _ = b 5631 types := &b.Func.Config.Types 5632 _ = types 5633 // match: (Rsh8x64 <t> x y) 5634 // cond: 5635 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5636 for { 5637 t := v.Type 5638 x := v.Args[0] 5639 y := v.Args[1] 5640 v.reset(OpS390XSRAW) 5641 v.Type = t 5642 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5643 v0.AddArg(x) 5644 v.AddArg(v0) 5645 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5646 v1.AddArg(y) 5647 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5648 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5649 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5650 v4.AuxInt = 7 5651 v4.AddArg(y) 5652 v3.AddArg(v4) 5653 v2.AddArg(v3) 5654 v1.AddArg(v2) 5655 v.AddArg(v1) 5656 return true 5657 } 5658 } 5659 func rewriteValueS390X_OpRsh8x8(v *Value) bool { 5660 b := v.Block 5661 _ = b 5662 types := &b.Func.Config.Types 5663 _ = types 5664 // match: (Rsh8x8 <t> x y) 5665 // cond: 5666 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5667 for { 5668 t := v.Type 5669 x := v.Args[0] 5670 y := v.Args[1] 5671 v.reset(OpS390XSRAW) 5672 v.Type = t 5673 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5674 v0.AddArg(x) 5675 v.AddArg(v0) 5676 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5677 v1.AddArg(y) 5678 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5679 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5680 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5681 v4.AuxInt = 7 5682 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5683 v5.AddArg(y) 5684 v4.AddArg(v5) 5685 v3.AddArg(v4) 5686 v2.AddArg(v3) 5687 v1.AddArg(v2) 5688 v.AddArg(v1) 5689 return true 5690 } 5691 } 5692 func rewriteValueS390X_OpS390XADD(v *Value) bool { 5693 // match: (ADD x (MOVDconst [c])) 5694 // cond: is32Bit(c) 5695 // result: (ADDconst [c] x) 5696 for { 5697 x := v.Args[0] 5698 v_1 := v.Args[1] 5699 if v_1.Op != OpS390XMOVDconst { 5700 break 5701 } 5702 c := v_1.AuxInt 5703 if !(is32Bit(c)) { 5704 break 5705 } 5706 v.reset(OpS390XADDconst) 5707 v.AuxInt = c 5708 v.AddArg(x) 5709 return true 5710 } 5711 // match: (ADD (MOVDconst [c]) x) 5712 // cond: is32Bit(c) 5713 // result: (ADDconst [c] x) 5714 for { 5715 v_0 := v.Args[0] 5716 if v_0.Op != OpS390XMOVDconst { 5717 break 5718 } 5719 c := v_0.AuxInt 5720 x := v.Args[1] 5721 if !(is32Bit(c)) { 5722 break 5723 } 5724 v.reset(OpS390XADDconst) 5725 v.AuxInt = c 5726 v.AddArg(x) 5727 return true 5728 } 5729 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 5730 // cond: d == 64-c 5731 // result: (RLLGconst [c] x) 5732 for { 5733 v_0 := v.Args[0] 5734 if v_0.Op != OpS390XSLDconst { 5735 break 5736 } 5737 c := v_0.AuxInt 5738 x := v_0.Args[0] 5739 v_1 := v.Args[1] 5740 if v_1.Op != OpS390XSRDconst { 5741 break 5742 } 5743 d := v_1.AuxInt 5744 if x != v_1.Args[0] { 5745 break 5746 } 5747 if !(d == 64-c) { 5748 break 5749 } 5750 v.reset(OpS390XRLLGconst) 5751 v.AuxInt = c 5752 v.AddArg(x) 5753 return true 5754 } 5755 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 5756 // cond: d == 64-c 5757 // result: (RLLGconst [c] x) 5758 for { 5759 v_0 := v.Args[0] 5760 if v_0.Op != OpS390XSRDconst { 5761 break 5762 } 5763 d := v_0.AuxInt 5764 x := v_0.Args[0] 5765 v_1 := v.Args[1] 5766 if v_1.Op != OpS390XSLDconst { 5767 break 5768 } 5769 c := v_1.AuxInt 5770 if x != v_1.Args[0] { 5771 break 5772 } 5773 if !(d == 64-c) { 5774 break 5775 } 5776 v.reset(OpS390XRLLGconst) 5777 v.AuxInt = c 5778 v.AddArg(x) 5779 return true 5780 } 5781 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 5782 // cond: ptr.Op != OpSB && idx.Op != OpSB 5783 // result: (MOVDaddridx [c] {s} ptr idx) 5784 for { 5785 idx := v.Args[0] 5786 v_1 := v.Args[1] 5787 if v_1.Op != OpS390XMOVDaddr { 5788 break 5789 } 5790 c := v_1.AuxInt 5791 s := v_1.Aux 5792 ptr := v_1.Args[0] 5793 if !(ptr.Op != OpSB && idx.Op != OpSB) { 5794 break 5795 } 5796 v.reset(OpS390XMOVDaddridx) 5797 v.AuxInt = c 5798 v.Aux = s 5799 v.AddArg(ptr) 5800 v.AddArg(idx) 5801 return true 5802 } 5803 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 5804 // cond: ptr.Op != OpSB && idx.Op != OpSB 5805 // result: (MOVDaddridx [c] {s} ptr idx) 5806 for { 5807 v_0 := v.Args[0] 5808 if v_0.Op != OpS390XMOVDaddr { 5809 break 5810 } 5811 c := v_0.AuxInt 5812 s := v_0.Aux 5813 ptr := v_0.Args[0] 5814 idx := v.Args[1] 5815 if !(ptr.Op != OpSB && idx.Op != OpSB) { 5816 break 5817 } 5818 v.reset(OpS390XMOVDaddridx) 5819 v.AuxInt = c 5820 v.Aux = s 5821 v.AddArg(ptr) 5822 v.AddArg(idx) 5823 return true 5824 } 5825 // match: (ADD x (NEG y)) 5826 // cond: 5827 // result: (SUB x y) 5828 for { 5829 x := v.Args[0] 5830 v_1 := v.Args[1] 5831 if v_1.Op != OpS390XNEG { 5832 break 5833 } 5834 y := v_1.Args[0] 5835 v.reset(OpS390XSUB) 5836 v.AddArg(x) 5837 v.AddArg(y) 5838 return true 5839 } 5840 // match: (ADD (NEG y) x) 5841 // cond: 5842 // result: (SUB x y) 5843 for { 5844 v_0 := v.Args[0] 5845 if v_0.Op != OpS390XNEG { 5846 break 5847 } 5848 y := v_0.Args[0] 5849 x := v.Args[1] 5850 v.reset(OpS390XSUB) 5851 v.AddArg(x) 5852 v.AddArg(y) 5853 return true 5854 } 5855 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 5856 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5857 // result: (ADDload <t> [off] {sym} x ptr mem) 5858 for { 5859 t := v.Type 5860 x := v.Args[0] 5861 g := v.Args[1] 5862 if g.Op != OpS390XMOVDload { 5863 break 5864 } 5865 off := g.AuxInt 5866 sym := g.Aux 5867 ptr := g.Args[0] 5868 mem := g.Args[1] 5869 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5870 break 5871 } 5872 v.reset(OpS390XADDload) 5873 v.Type = t 5874 v.AuxInt = off 5875 v.Aux = sym 5876 v.AddArg(x) 5877 v.AddArg(ptr) 5878 v.AddArg(mem) 5879 return true 5880 } 5881 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 5882 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5883 // result: (ADDload <t> [off] {sym} x ptr mem) 5884 for { 5885 t := v.Type 5886 g := v.Args[0] 5887 if g.Op != OpS390XMOVDload { 5888 break 5889 } 5890 off := g.AuxInt 5891 sym := g.Aux 5892 ptr := g.Args[0] 5893 mem := g.Args[1] 5894 x := v.Args[1] 5895 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5896 break 5897 } 5898 v.reset(OpS390XADDload) 5899 v.Type = t 5900 v.AuxInt = off 5901 v.Aux = sym 5902 v.AddArg(x) 5903 v.AddArg(ptr) 5904 v.AddArg(mem) 5905 return true 5906 } 5907 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 5908 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5909 // result: (ADDload <t> [off] {sym} x ptr mem) 5910 for { 5911 t := v.Type 5912 g := v.Args[0] 5913 if g.Op != OpS390XMOVDload { 5914 break 5915 } 5916 off := g.AuxInt 5917 sym := g.Aux 5918 ptr := g.Args[0] 5919 mem := g.Args[1] 5920 x := v.Args[1] 5921 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5922 break 5923 } 5924 v.reset(OpS390XADDload) 5925 v.Type = t 5926 v.AuxInt = off 5927 v.Aux = sym 5928 v.AddArg(x) 5929 v.AddArg(ptr) 5930 v.AddArg(mem) 5931 return true 5932 } 5933 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 5934 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5935 // result: (ADDload <t> [off] {sym} x ptr mem) 5936 for { 5937 t := v.Type 5938 x := v.Args[0] 5939 g := v.Args[1] 5940 if g.Op != OpS390XMOVDload { 5941 break 5942 } 5943 off := g.AuxInt 5944 sym := g.Aux 5945 ptr := g.Args[0] 5946 mem := g.Args[1] 5947 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5948 break 5949 } 5950 v.reset(OpS390XADDload) 5951 v.Type = t 5952 v.AuxInt = off 5953 v.Aux = sym 5954 v.AddArg(x) 5955 v.AddArg(ptr) 5956 v.AddArg(mem) 5957 return true 5958 } 5959 return false 5960 } 5961 func rewriteValueS390X_OpS390XADDW(v *Value) bool { 5962 // match: (ADDW x (MOVDconst [c])) 5963 // cond: 5964 // result: (ADDWconst [c] x) 5965 for { 5966 x := v.Args[0] 5967 v_1 := v.Args[1] 5968 if v_1.Op != OpS390XMOVDconst { 5969 break 5970 } 5971 c := v_1.AuxInt 5972 v.reset(OpS390XADDWconst) 5973 v.AuxInt = c 5974 v.AddArg(x) 5975 return true 5976 } 5977 // match: (ADDW (MOVDconst [c]) x) 5978 // cond: 5979 // result: (ADDWconst [c] x) 5980 for { 5981 v_0 := v.Args[0] 5982 if v_0.Op != OpS390XMOVDconst { 5983 break 5984 } 5985 c := v_0.AuxInt 5986 x := v.Args[1] 5987 v.reset(OpS390XADDWconst) 5988 v.AuxInt = c 5989 v.AddArg(x) 5990 return true 5991 } 5992 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 5993 // cond: d == 32-c 5994 // result: (RLLconst [c] x) 5995 for { 5996 v_0 := v.Args[0] 5997 if v_0.Op != OpS390XSLWconst { 5998 break 5999 } 6000 c := v_0.AuxInt 6001 x := v_0.Args[0] 6002 v_1 := v.Args[1] 6003 if v_1.Op != OpS390XSRWconst { 6004 break 6005 } 6006 d := v_1.AuxInt 6007 if x != v_1.Args[0] { 6008 break 6009 } 6010 if !(d == 32-c) { 6011 break 6012 } 6013 v.reset(OpS390XRLLconst) 6014 v.AuxInt = c 6015 v.AddArg(x) 6016 return true 6017 } 6018 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 6019 // cond: d == 32-c 6020 // result: (RLLconst [c] x) 6021 for { 6022 v_0 := v.Args[0] 6023 if v_0.Op != OpS390XSRWconst { 6024 break 6025 } 6026 d := v_0.AuxInt 6027 x := v_0.Args[0] 6028 v_1 := v.Args[1] 6029 if v_1.Op != OpS390XSLWconst { 6030 break 6031 } 6032 c := v_1.AuxInt 6033 if x != v_1.Args[0] { 6034 break 6035 } 6036 if !(d == 32-c) { 6037 break 6038 } 6039 v.reset(OpS390XRLLconst) 6040 v.AuxInt = c 6041 v.AddArg(x) 6042 return true 6043 } 6044 // match: (ADDW x (NEGW y)) 6045 // cond: 6046 // result: (SUBW x y) 6047 for { 6048 x := v.Args[0] 6049 v_1 := v.Args[1] 6050 if v_1.Op != OpS390XNEGW { 6051 break 6052 } 6053 y := v_1.Args[0] 6054 v.reset(OpS390XSUBW) 6055 v.AddArg(x) 6056 v.AddArg(y) 6057 return true 6058 } 6059 // match: (ADDW (NEGW y) x) 6060 // cond: 6061 // result: (SUBW x y) 6062 for { 6063 v_0 := v.Args[0] 6064 if v_0.Op != OpS390XNEGW { 6065 break 6066 } 6067 y := v_0.Args[0] 6068 x := v.Args[1] 6069 v.reset(OpS390XSUBW) 6070 v.AddArg(x) 6071 v.AddArg(y) 6072 return true 6073 } 6074 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6075 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6076 // result: (ADDWload <t> [off] {sym} x ptr mem) 6077 for { 6078 t := v.Type 6079 x := v.Args[0] 6080 g := v.Args[1] 6081 if g.Op != OpS390XMOVWload { 6082 break 6083 } 6084 off := g.AuxInt 6085 sym := g.Aux 6086 ptr := g.Args[0] 6087 mem := g.Args[1] 6088 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6089 break 6090 } 6091 v.reset(OpS390XADDWload) 6092 v.Type = t 6093 v.AuxInt = off 6094 v.Aux = sym 6095 v.AddArg(x) 6096 v.AddArg(ptr) 6097 v.AddArg(mem) 6098 return true 6099 } 6100 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6101 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6102 // result: (ADDWload <t> [off] {sym} x ptr mem) 6103 for { 6104 t := v.Type 6105 g := v.Args[0] 6106 if g.Op != OpS390XMOVWload { 6107 break 6108 } 6109 off := g.AuxInt 6110 sym := g.Aux 6111 ptr := g.Args[0] 6112 mem := g.Args[1] 6113 x := v.Args[1] 6114 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6115 break 6116 } 6117 v.reset(OpS390XADDWload) 6118 v.Type = t 6119 v.AuxInt = off 6120 v.Aux = sym 6121 v.AddArg(x) 6122 v.AddArg(ptr) 6123 v.AddArg(mem) 6124 return true 6125 } 6126 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6127 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6128 // result: (ADDWload <t> [off] {sym} x ptr mem) 6129 for { 6130 t := v.Type 6131 g := v.Args[0] 6132 if g.Op != OpS390XMOVWload { 6133 break 6134 } 6135 off := g.AuxInt 6136 sym := g.Aux 6137 ptr := g.Args[0] 6138 mem := g.Args[1] 6139 x := v.Args[1] 6140 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6141 break 6142 } 6143 v.reset(OpS390XADDWload) 6144 v.Type = t 6145 v.AuxInt = off 6146 v.Aux = sym 6147 v.AddArg(x) 6148 v.AddArg(ptr) 6149 v.AddArg(mem) 6150 return true 6151 } 6152 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6153 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6154 // result: (ADDWload <t> [off] {sym} x ptr mem) 6155 for { 6156 t := v.Type 6157 x := v.Args[0] 6158 g := v.Args[1] 6159 if g.Op != OpS390XMOVWload { 6160 break 6161 } 6162 off := g.AuxInt 6163 sym := g.Aux 6164 ptr := g.Args[0] 6165 mem := g.Args[1] 6166 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6167 break 6168 } 6169 v.reset(OpS390XADDWload) 6170 v.Type = t 6171 v.AuxInt = off 6172 v.Aux = sym 6173 v.AddArg(x) 6174 v.AddArg(ptr) 6175 v.AddArg(mem) 6176 return true 6177 } 6178 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6179 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6180 // result: (ADDWload <t> [off] {sym} x ptr mem) 6181 for { 6182 t := v.Type 6183 x := v.Args[0] 6184 g := v.Args[1] 6185 if g.Op != OpS390XMOVWZload { 6186 break 6187 } 6188 off := g.AuxInt 6189 sym := g.Aux 6190 ptr := g.Args[0] 6191 mem := g.Args[1] 6192 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6193 break 6194 } 6195 v.reset(OpS390XADDWload) 6196 v.Type = t 6197 v.AuxInt = off 6198 v.Aux = sym 6199 v.AddArg(x) 6200 v.AddArg(ptr) 6201 v.AddArg(mem) 6202 return true 6203 } 6204 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6205 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6206 // result: (ADDWload <t> [off] {sym} x ptr mem) 6207 for { 6208 t := v.Type 6209 g := v.Args[0] 6210 if g.Op != OpS390XMOVWZload { 6211 break 6212 } 6213 off := g.AuxInt 6214 sym := g.Aux 6215 ptr := g.Args[0] 6216 mem := g.Args[1] 6217 x := v.Args[1] 6218 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6219 break 6220 } 6221 v.reset(OpS390XADDWload) 6222 v.Type = t 6223 v.AuxInt = off 6224 v.Aux = sym 6225 v.AddArg(x) 6226 v.AddArg(ptr) 6227 v.AddArg(mem) 6228 return true 6229 } 6230 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6231 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6232 // result: (ADDWload <t> [off] {sym} x ptr mem) 6233 for { 6234 t := v.Type 6235 g := v.Args[0] 6236 if g.Op != OpS390XMOVWZload { 6237 break 6238 } 6239 off := g.AuxInt 6240 sym := g.Aux 6241 ptr := g.Args[0] 6242 mem := g.Args[1] 6243 x := v.Args[1] 6244 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6245 break 6246 } 6247 v.reset(OpS390XADDWload) 6248 v.Type = t 6249 v.AuxInt = off 6250 v.Aux = sym 6251 v.AddArg(x) 6252 v.AddArg(ptr) 6253 v.AddArg(mem) 6254 return true 6255 } 6256 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6257 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6258 // result: (ADDWload <t> [off] {sym} x ptr mem) 6259 for { 6260 t := v.Type 6261 x := v.Args[0] 6262 g := v.Args[1] 6263 if g.Op != OpS390XMOVWZload { 6264 break 6265 } 6266 off := g.AuxInt 6267 sym := g.Aux 6268 ptr := g.Args[0] 6269 mem := g.Args[1] 6270 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6271 break 6272 } 6273 v.reset(OpS390XADDWload) 6274 v.Type = t 6275 v.AuxInt = off 6276 v.Aux = sym 6277 v.AddArg(x) 6278 v.AddArg(ptr) 6279 v.AddArg(mem) 6280 return true 6281 } 6282 return false 6283 } 6284 func rewriteValueS390X_OpS390XADDWconst(v *Value) bool { 6285 // match: (ADDWconst [c] x) 6286 // cond: int32(c)==0 6287 // result: x 6288 for { 6289 c := v.AuxInt 6290 x := v.Args[0] 6291 if !(int32(c) == 0) { 6292 break 6293 } 6294 v.reset(OpCopy) 6295 v.Type = x.Type 6296 v.AddArg(x) 6297 return true 6298 } 6299 // match: (ADDWconst [c] (MOVDconst [d])) 6300 // cond: 6301 // result: (MOVDconst [int64(int32(c+d))]) 6302 for { 6303 c := v.AuxInt 6304 v_0 := v.Args[0] 6305 if v_0.Op != OpS390XMOVDconst { 6306 break 6307 } 6308 d := v_0.AuxInt 6309 v.reset(OpS390XMOVDconst) 6310 v.AuxInt = int64(int32(c + d)) 6311 return true 6312 } 6313 // match: (ADDWconst [c] (ADDWconst [d] x)) 6314 // cond: 6315 // result: (ADDWconst [int64(int32(c+d))] x) 6316 for { 6317 c := v.AuxInt 6318 v_0 := v.Args[0] 6319 if v_0.Op != OpS390XADDWconst { 6320 break 6321 } 6322 d := v_0.AuxInt 6323 x := v_0.Args[0] 6324 v.reset(OpS390XADDWconst) 6325 v.AuxInt = int64(int32(c + d)) 6326 v.AddArg(x) 6327 return true 6328 } 6329 return false 6330 } 6331 func rewriteValueS390X_OpS390XADDconst(v *Value) bool { 6332 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6333 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6334 // result: (MOVDaddr [c+d] {s} x) 6335 for { 6336 c := v.AuxInt 6337 v_0 := v.Args[0] 6338 if v_0.Op != OpS390XMOVDaddr { 6339 break 6340 } 6341 d := v_0.AuxInt 6342 s := v_0.Aux 6343 x := v_0.Args[0] 6344 if x.Op != OpSB { 6345 break 6346 } 6347 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6348 break 6349 } 6350 v.reset(OpS390XMOVDaddr) 6351 v.AuxInt = c + d 6352 v.Aux = s 6353 v.AddArg(x) 6354 return true 6355 } 6356 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6357 // cond: x.Op != OpSB && is20Bit(c+d) 6358 // result: (MOVDaddr [c+d] {s} x) 6359 for { 6360 c := v.AuxInt 6361 v_0 := v.Args[0] 6362 if v_0.Op != OpS390XMOVDaddr { 6363 break 6364 } 6365 d := v_0.AuxInt 6366 s := v_0.Aux 6367 x := v_0.Args[0] 6368 if !(x.Op != OpSB && is20Bit(c+d)) { 6369 break 6370 } 6371 v.reset(OpS390XMOVDaddr) 6372 v.AuxInt = c + d 6373 v.Aux = s 6374 v.AddArg(x) 6375 return true 6376 } 6377 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6378 // cond: is20Bit(c+d) 6379 // result: (MOVDaddridx [c+d] {s} x y) 6380 for { 6381 c := v.AuxInt 6382 v_0 := v.Args[0] 6383 if v_0.Op != OpS390XMOVDaddridx { 6384 break 6385 } 6386 d := v_0.AuxInt 6387 s := v_0.Aux 6388 x := v_0.Args[0] 6389 y := v_0.Args[1] 6390 if !(is20Bit(c + d)) { 6391 break 6392 } 6393 v.reset(OpS390XMOVDaddridx) 6394 v.AuxInt = c + d 6395 v.Aux = s 6396 v.AddArg(x) 6397 v.AddArg(y) 6398 return true 6399 } 6400 // match: (ADDconst [0] x) 6401 // cond: 6402 // result: x 6403 for { 6404 if v.AuxInt != 0 { 6405 break 6406 } 6407 x := v.Args[0] 6408 v.reset(OpCopy) 6409 v.Type = x.Type 6410 v.AddArg(x) 6411 return true 6412 } 6413 // match: (ADDconst [c] (MOVDconst [d])) 6414 // cond: 6415 // result: (MOVDconst [c+d]) 6416 for { 6417 c := v.AuxInt 6418 v_0 := v.Args[0] 6419 if v_0.Op != OpS390XMOVDconst { 6420 break 6421 } 6422 d := v_0.AuxInt 6423 v.reset(OpS390XMOVDconst) 6424 v.AuxInt = c + d 6425 return true 6426 } 6427 // match: (ADDconst [c] (ADDconst [d] x)) 6428 // cond: is32Bit(c+d) 6429 // result: (ADDconst [c+d] x) 6430 for { 6431 c := v.AuxInt 6432 v_0 := v.Args[0] 6433 if v_0.Op != OpS390XADDconst { 6434 break 6435 } 6436 d := v_0.AuxInt 6437 x := v_0.Args[0] 6438 if !(is32Bit(c + d)) { 6439 break 6440 } 6441 v.reset(OpS390XADDconst) 6442 v.AuxInt = c + d 6443 v.AddArg(x) 6444 return true 6445 } 6446 return false 6447 } 6448 func rewriteValueS390X_OpS390XAND(v *Value) bool { 6449 // match: (AND x (MOVDconst [c])) 6450 // cond: is32Bit(c) && c < 0 6451 // result: (ANDconst [c] x) 6452 for { 6453 x := v.Args[0] 6454 v_1 := v.Args[1] 6455 if v_1.Op != OpS390XMOVDconst { 6456 break 6457 } 6458 c := v_1.AuxInt 6459 if !(is32Bit(c) && c < 0) { 6460 break 6461 } 6462 v.reset(OpS390XANDconst) 6463 v.AuxInt = c 6464 v.AddArg(x) 6465 return true 6466 } 6467 // match: (AND (MOVDconst [c]) x) 6468 // cond: is32Bit(c) && c < 0 6469 // result: (ANDconst [c] x) 6470 for { 6471 v_0 := v.Args[0] 6472 if v_0.Op != OpS390XMOVDconst { 6473 break 6474 } 6475 c := v_0.AuxInt 6476 x := v.Args[1] 6477 if !(is32Bit(c) && c < 0) { 6478 break 6479 } 6480 v.reset(OpS390XANDconst) 6481 v.AuxInt = c 6482 v.AddArg(x) 6483 return true 6484 } 6485 // match: (AND x (MOVDconst [0xFF])) 6486 // cond: 6487 // result: (MOVBZreg x) 6488 for { 6489 x := v.Args[0] 6490 v_1 := v.Args[1] 6491 if v_1.Op != OpS390XMOVDconst { 6492 break 6493 } 6494 if v_1.AuxInt != 0xFF { 6495 break 6496 } 6497 v.reset(OpS390XMOVBZreg) 6498 v.AddArg(x) 6499 return true 6500 } 6501 // match: (AND (MOVDconst [0xFF]) x) 6502 // cond: 6503 // result: (MOVBZreg x) 6504 for { 6505 v_0 := v.Args[0] 6506 if v_0.Op != OpS390XMOVDconst { 6507 break 6508 } 6509 if v_0.AuxInt != 0xFF { 6510 break 6511 } 6512 x := v.Args[1] 6513 v.reset(OpS390XMOVBZreg) 6514 v.AddArg(x) 6515 return true 6516 } 6517 // match: (AND x (MOVDconst [0xFFFF])) 6518 // cond: 6519 // result: (MOVHZreg x) 6520 for { 6521 x := v.Args[0] 6522 v_1 := v.Args[1] 6523 if v_1.Op != OpS390XMOVDconst { 6524 break 6525 } 6526 if v_1.AuxInt != 0xFFFF { 6527 break 6528 } 6529 v.reset(OpS390XMOVHZreg) 6530 v.AddArg(x) 6531 return true 6532 } 6533 // match: (AND (MOVDconst [0xFFFF]) x) 6534 // cond: 6535 // result: (MOVHZreg x) 6536 for { 6537 v_0 := v.Args[0] 6538 if v_0.Op != OpS390XMOVDconst { 6539 break 6540 } 6541 if v_0.AuxInt != 0xFFFF { 6542 break 6543 } 6544 x := v.Args[1] 6545 v.reset(OpS390XMOVHZreg) 6546 v.AddArg(x) 6547 return true 6548 } 6549 // match: (AND x (MOVDconst [0xFFFFFFFF])) 6550 // cond: 6551 // result: (MOVWZreg x) 6552 for { 6553 x := v.Args[0] 6554 v_1 := v.Args[1] 6555 if v_1.Op != OpS390XMOVDconst { 6556 break 6557 } 6558 if v_1.AuxInt != 0xFFFFFFFF { 6559 break 6560 } 6561 v.reset(OpS390XMOVWZreg) 6562 v.AddArg(x) 6563 return true 6564 } 6565 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 6566 // cond: 6567 // result: (MOVWZreg x) 6568 for { 6569 v_0 := v.Args[0] 6570 if v_0.Op != OpS390XMOVDconst { 6571 break 6572 } 6573 if v_0.AuxInt != 0xFFFFFFFF { 6574 break 6575 } 6576 x := v.Args[1] 6577 v.reset(OpS390XMOVWZreg) 6578 v.AddArg(x) 6579 return true 6580 } 6581 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 6582 // cond: 6583 // result: (MOVDconst [c&d]) 6584 for { 6585 v_0 := v.Args[0] 6586 if v_0.Op != OpS390XMOVDconst { 6587 break 6588 } 6589 c := v_0.AuxInt 6590 v_1 := v.Args[1] 6591 if v_1.Op != OpS390XMOVDconst { 6592 break 6593 } 6594 d := v_1.AuxInt 6595 v.reset(OpS390XMOVDconst) 6596 v.AuxInt = c & d 6597 return true 6598 } 6599 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 6600 // cond: 6601 // result: (MOVDconst [c&d]) 6602 for { 6603 v_0 := v.Args[0] 6604 if v_0.Op != OpS390XMOVDconst { 6605 break 6606 } 6607 d := v_0.AuxInt 6608 v_1 := v.Args[1] 6609 if v_1.Op != OpS390XMOVDconst { 6610 break 6611 } 6612 c := v_1.AuxInt 6613 v.reset(OpS390XMOVDconst) 6614 v.AuxInt = c & d 6615 return true 6616 } 6617 // match: (AND x x) 6618 // cond: 6619 // result: x 6620 for { 6621 x := v.Args[0] 6622 if x != v.Args[1] { 6623 break 6624 } 6625 v.reset(OpCopy) 6626 v.Type = x.Type 6627 v.AddArg(x) 6628 return true 6629 } 6630 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6631 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6632 // result: (ANDload <t> [off] {sym} x ptr mem) 6633 for { 6634 t := v.Type 6635 x := v.Args[0] 6636 g := v.Args[1] 6637 if g.Op != OpS390XMOVDload { 6638 break 6639 } 6640 off := g.AuxInt 6641 sym := g.Aux 6642 ptr := g.Args[0] 6643 mem := g.Args[1] 6644 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6645 break 6646 } 6647 v.reset(OpS390XANDload) 6648 v.Type = t 6649 v.AuxInt = off 6650 v.Aux = sym 6651 v.AddArg(x) 6652 v.AddArg(ptr) 6653 v.AddArg(mem) 6654 return true 6655 } 6656 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6657 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6658 // result: (ANDload <t> [off] {sym} x ptr mem) 6659 for { 6660 t := v.Type 6661 g := v.Args[0] 6662 if g.Op != OpS390XMOVDload { 6663 break 6664 } 6665 off := g.AuxInt 6666 sym := g.Aux 6667 ptr := g.Args[0] 6668 mem := g.Args[1] 6669 x := v.Args[1] 6670 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6671 break 6672 } 6673 v.reset(OpS390XANDload) 6674 v.Type = t 6675 v.AuxInt = off 6676 v.Aux = sym 6677 v.AddArg(x) 6678 v.AddArg(ptr) 6679 v.AddArg(mem) 6680 return true 6681 } 6682 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6683 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6684 // result: (ANDload <t> [off] {sym} x ptr mem) 6685 for { 6686 t := v.Type 6687 g := v.Args[0] 6688 if g.Op != OpS390XMOVDload { 6689 break 6690 } 6691 off := g.AuxInt 6692 sym := g.Aux 6693 ptr := g.Args[0] 6694 mem := g.Args[1] 6695 x := v.Args[1] 6696 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6697 break 6698 } 6699 v.reset(OpS390XANDload) 6700 v.Type = t 6701 v.AuxInt = off 6702 v.Aux = sym 6703 v.AddArg(x) 6704 v.AddArg(ptr) 6705 v.AddArg(mem) 6706 return true 6707 } 6708 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6709 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6710 // result: (ANDload <t> [off] {sym} x ptr mem) 6711 for { 6712 t := v.Type 6713 x := v.Args[0] 6714 g := v.Args[1] 6715 if g.Op != OpS390XMOVDload { 6716 break 6717 } 6718 off := g.AuxInt 6719 sym := g.Aux 6720 ptr := g.Args[0] 6721 mem := g.Args[1] 6722 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6723 break 6724 } 6725 v.reset(OpS390XANDload) 6726 v.Type = t 6727 v.AuxInt = off 6728 v.Aux = sym 6729 v.AddArg(x) 6730 v.AddArg(ptr) 6731 v.AddArg(mem) 6732 return true 6733 } 6734 return false 6735 } 6736 func rewriteValueS390X_OpS390XANDW(v *Value) bool { 6737 // match: (ANDW x (MOVDconst [c])) 6738 // cond: 6739 // result: (ANDWconst [c] x) 6740 for { 6741 x := v.Args[0] 6742 v_1 := v.Args[1] 6743 if v_1.Op != OpS390XMOVDconst { 6744 break 6745 } 6746 c := v_1.AuxInt 6747 v.reset(OpS390XANDWconst) 6748 v.AuxInt = c 6749 v.AddArg(x) 6750 return true 6751 } 6752 // match: (ANDW (MOVDconst [c]) x) 6753 // cond: 6754 // result: (ANDWconst [c] x) 6755 for { 6756 v_0 := v.Args[0] 6757 if v_0.Op != OpS390XMOVDconst { 6758 break 6759 } 6760 c := v_0.AuxInt 6761 x := v.Args[1] 6762 v.reset(OpS390XANDWconst) 6763 v.AuxInt = c 6764 v.AddArg(x) 6765 return true 6766 } 6767 // match: (ANDW x x) 6768 // cond: 6769 // result: x 6770 for { 6771 x := v.Args[0] 6772 if x != v.Args[1] { 6773 break 6774 } 6775 v.reset(OpCopy) 6776 v.Type = x.Type 6777 v.AddArg(x) 6778 return true 6779 } 6780 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6781 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6782 // result: (ANDWload <t> [off] {sym} x ptr mem) 6783 for { 6784 t := v.Type 6785 x := v.Args[0] 6786 g := v.Args[1] 6787 if g.Op != OpS390XMOVWload { 6788 break 6789 } 6790 off := g.AuxInt 6791 sym := g.Aux 6792 ptr := g.Args[0] 6793 mem := g.Args[1] 6794 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6795 break 6796 } 6797 v.reset(OpS390XANDWload) 6798 v.Type = t 6799 v.AuxInt = off 6800 v.Aux = sym 6801 v.AddArg(x) 6802 v.AddArg(ptr) 6803 v.AddArg(mem) 6804 return true 6805 } 6806 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6807 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6808 // result: (ANDWload <t> [off] {sym} x ptr mem) 6809 for { 6810 t := v.Type 6811 g := v.Args[0] 6812 if g.Op != OpS390XMOVWload { 6813 break 6814 } 6815 off := g.AuxInt 6816 sym := g.Aux 6817 ptr := g.Args[0] 6818 mem := g.Args[1] 6819 x := v.Args[1] 6820 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6821 break 6822 } 6823 v.reset(OpS390XANDWload) 6824 v.Type = t 6825 v.AuxInt = off 6826 v.Aux = sym 6827 v.AddArg(x) 6828 v.AddArg(ptr) 6829 v.AddArg(mem) 6830 return true 6831 } 6832 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6833 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6834 // result: (ANDWload <t> [off] {sym} x ptr mem) 6835 for { 6836 t := v.Type 6837 g := v.Args[0] 6838 if g.Op != OpS390XMOVWload { 6839 break 6840 } 6841 off := g.AuxInt 6842 sym := g.Aux 6843 ptr := g.Args[0] 6844 mem := g.Args[1] 6845 x := v.Args[1] 6846 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6847 break 6848 } 6849 v.reset(OpS390XANDWload) 6850 v.Type = t 6851 v.AuxInt = off 6852 v.Aux = sym 6853 v.AddArg(x) 6854 v.AddArg(ptr) 6855 v.AddArg(mem) 6856 return true 6857 } 6858 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6859 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6860 // result: (ANDWload <t> [off] {sym} x ptr mem) 6861 for { 6862 t := v.Type 6863 x := v.Args[0] 6864 g := v.Args[1] 6865 if g.Op != OpS390XMOVWload { 6866 break 6867 } 6868 off := g.AuxInt 6869 sym := g.Aux 6870 ptr := g.Args[0] 6871 mem := g.Args[1] 6872 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6873 break 6874 } 6875 v.reset(OpS390XANDWload) 6876 v.Type = t 6877 v.AuxInt = off 6878 v.Aux = sym 6879 v.AddArg(x) 6880 v.AddArg(ptr) 6881 v.AddArg(mem) 6882 return true 6883 } 6884 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6885 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6886 // result: (ANDWload <t> [off] {sym} x ptr mem) 6887 for { 6888 t := v.Type 6889 x := v.Args[0] 6890 g := v.Args[1] 6891 if g.Op != OpS390XMOVWZload { 6892 break 6893 } 6894 off := g.AuxInt 6895 sym := g.Aux 6896 ptr := g.Args[0] 6897 mem := g.Args[1] 6898 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6899 break 6900 } 6901 v.reset(OpS390XANDWload) 6902 v.Type = t 6903 v.AuxInt = off 6904 v.Aux = sym 6905 v.AddArg(x) 6906 v.AddArg(ptr) 6907 v.AddArg(mem) 6908 return true 6909 } 6910 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6911 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6912 // result: (ANDWload <t> [off] {sym} x ptr mem) 6913 for { 6914 t := v.Type 6915 g := v.Args[0] 6916 if g.Op != OpS390XMOVWZload { 6917 break 6918 } 6919 off := g.AuxInt 6920 sym := g.Aux 6921 ptr := g.Args[0] 6922 mem := g.Args[1] 6923 x := v.Args[1] 6924 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6925 break 6926 } 6927 v.reset(OpS390XANDWload) 6928 v.Type = t 6929 v.AuxInt = off 6930 v.Aux = sym 6931 v.AddArg(x) 6932 v.AddArg(ptr) 6933 v.AddArg(mem) 6934 return true 6935 } 6936 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6937 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6938 // result: (ANDWload <t> [off] {sym} x ptr mem) 6939 for { 6940 t := v.Type 6941 g := v.Args[0] 6942 if g.Op != OpS390XMOVWZload { 6943 break 6944 } 6945 off := g.AuxInt 6946 sym := g.Aux 6947 ptr := g.Args[0] 6948 mem := g.Args[1] 6949 x := v.Args[1] 6950 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6951 break 6952 } 6953 v.reset(OpS390XANDWload) 6954 v.Type = t 6955 v.AuxInt = off 6956 v.Aux = sym 6957 v.AddArg(x) 6958 v.AddArg(ptr) 6959 v.AddArg(mem) 6960 return true 6961 } 6962 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6963 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6964 // result: (ANDWload <t> [off] {sym} x ptr mem) 6965 for { 6966 t := v.Type 6967 x := v.Args[0] 6968 g := v.Args[1] 6969 if g.Op != OpS390XMOVWZload { 6970 break 6971 } 6972 off := g.AuxInt 6973 sym := g.Aux 6974 ptr := g.Args[0] 6975 mem := g.Args[1] 6976 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6977 break 6978 } 6979 v.reset(OpS390XANDWload) 6980 v.Type = t 6981 v.AuxInt = off 6982 v.Aux = sym 6983 v.AddArg(x) 6984 v.AddArg(ptr) 6985 v.AddArg(mem) 6986 return true 6987 } 6988 return false 6989 } 6990 func rewriteValueS390X_OpS390XANDWconst(v *Value) bool { 6991 // match: (ANDWconst [c] (ANDWconst [d] x)) 6992 // cond: 6993 // result: (ANDWconst [c & d] x) 6994 for { 6995 c := v.AuxInt 6996 v_0 := v.Args[0] 6997 if v_0.Op != OpS390XANDWconst { 6998 break 6999 } 7000 d := v_0.AuxInt 7001 x := v_0.Args[0] 7002 v.reset(OpS390XANDWconst) 7003 v.AuxInt = c & d 7004 v.AddArg(x) 7005 return true 7006 } 7007 // match: (ANDWconst [0xFF] x) 7008 // cond: 7009 // result: (MOVBZreg x) 7010 for { 7011 if v.AuxInt != 0xFF { 7012 break 7013 } 7014 x := v.Args[0] 7015 v.reset(OpS390XMOVBZreg) 7016 v.AddArg(x) 7017 return true 7018 } 7019 // match: (ANDWconst [0xFFFF] x) 7020 // cond: 7021 // result: (MOVHZreg x) 7022 for { 7023 if v.AuxInt != 0xFFFF { 7024 break 7025 } 7026 x := v.Args[0] 7027 v.reset(OpS390XMOVHZreg) 7028 v.AddArg(x) 7029 return true 7030 } 7031 // match: (ANDWconst [c] _) 7032 // cond: int32(c)==0 7033 // result: (MOVDconst [0]) 7034 for { 7035 c := v.AuxInt 7036 if !(int32(c) == 0) { 7037 break 7038 } 7039 v.reset(OpS390XMOVDconst) 7040 v.AuxInt = 0 7041 return true 7042 } 7043 // match: (ANDWconst [c] x) 7044 // cond: int32(c)==-1 7045 // result: x 7046 for { 7047 c := v.AuxInt 7048 x := v.Args[0] 7049 if !(int32(c) == -1) { 7050 break 7051 } 7052 v.reset(OpCopy) 7053 v.Type = x.Type 7054 v.AddArg(x) 7055 return true 7056 } 7057 // match: (ANDWconst [c] (MOVDconst [d])) 7058 // cond: 7059 // result: (MOVDconst [c&d]) 7060 for { 7061 c := v.AuxInt 7062 v_0 := v.Args[0] 7063 if v_0.Op != OpS390XMOVDconst { 7064 break 7065 } 7066 d := v_0.AuxInt 7067 v.reset(OpS390XMOVDconst) 7068 v.AuxInt = c & d 7069 return true 7070 } 7071 return false 7072 } 7073 func rewriteValueS390X_OpS390XANDconst(v *Value) bool { 7074 // match: (ANDconst [c] (ANDconst [d] x)) 7075 // cond: 7076 // result: (ANDconst [c & d] x) 7077 for { 7078 c := v.AuxInt 7079 v_0 := v.Args[0] 7080 if v_0.Op != OpS390XANDconst { 7081 break 7082 } 7083 d := v_0.AuxInt 7084 x := v_0.Args[0] 7085 v.reset(OpS390XANDconst) 7086 v.AuxInt = c & d 7087 v.AddArg(x) 7088 return true 7089 } 7090 // match: (ANDconst [0] _) 7091 // cond: 7092 // result: (MOVDconst [0]) 7093 for { 7094 if v.AuxInt != 0 { 7095 break 7096 } 7097 v.reset(OpS390XMOVDconst) 7098 v.AuxInt = 0 7099 return true 7100 } 7101 // match: (ANDconst [-1] x) 7102 // cond: 7103 // result: x 7104 for { 7105 if v.AuxInt != -1 { 7106 break 7107 } 7108 x := v.Args[0] 7109 v.reset(OpCopy) 7110 v.Type = x.Type 7111 v.AddArg(x) 7112 return true 7113 } 7114 // match: (ANDconst [c] (MOVDconst [d])) 7115 // cond: 7116 // result: (MOVDconst [c&d]) 7117 for { 7118 c := v.AuxInt 7119 v_0 := v.Args[0] 7120 if v_0.Op != OpS390XMOVDconst { 7121 break 7122 } 7123 d := v_0.AuxInt 7124 v.reset(OpS390XMOVDconst) 7125 v.AuxInt = c & d 7126 return true 7127 } 7128 return false 7129 } 7130 func rewriteValueS390X_OpS390XCMP(v *Value) bool { 7131 b := v.Block 7132 _ = b 7133 // match: (CMP x (MOVDconst [c])) 7134 // cond: is32Bit(c) 7135 // result: (CMPconst x [c]) 7136 for { 7137 x := v.Args[0] 7138 v_1 := v.Args[1] 7139 if v_1.Op != OpS390XMOVDconst { 7140 break 7141 } 7142 c := v_1.AuxInt 7143 if !(is32Bit(c)) { 7144 break 7145 } 7146 v.reset(OpS390XCMPconst) 7147 v.AuxInt = c 7148 v.AddArg(x) 7149 return true 7150 } 7151 // match: (CMP (MOVDconst [c]) x) 7152 // cond: is32Bit(c) 7153 // result: (InvertFlags (CMPconst x [c])) 7154 for { 7155 v_0 := v.Args[0] 7156 if v_0.Op != OpS390XMOVDconst { 7157 break 7158 } 7159 c := v_0.AuxInt 7160 x := v.Args[1] 7161 if !(is32Bit(c)) { 7162 break 7163 } 7164 v.reset(OpS390XInvertFlags) 7165 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, TypeFlags) 7166 v0.AuxInt = c 7167 v0.AddArg(x) 7168 v.AddArg(v0) 7169 return true 7170 } 7171 return false 7172 } 7173 func rewriteValueS390X_OpS390XCMPU(v *Value) bool { 7174 b := v.Block 7175 _ = b 7176 // match: (CMPU x (MOVDconst [c])) 7177 // cond: isU32Bit(c) 7178 // result: (CMPUconst x [int64(uint32(c))]) 7179 for { 7180 x := v.Args[0] 7181 v_1 := v.Args[1] 7182 if v_1.Op != OpS390XMOVDconst { 7183 break 7184 } 7185 c := v_1.AuxInt 7186 if !(isU32Bit(c)) { 7187 break 7188 } 7189 v.reset(OpS390XCMPUconst) 7190 v.AuxInt = int64(uint32(c)) 7191 v.AddArg(x) 7192 return true 7193 } 7194 // match: (CMPU (MOVDconst [c]) x) 7195 // cond: isU32Bit(c) 7196 // result: (InvertFlags (CMPUconst x [int64(uint32(c))])) 7197 for { 7198 v_0 := v.Args[0] 7199 if v_0.Op != OpS390XMOVDconst { 7200 break 7201 } 7202 c := v_0.AuxInt 7203 x := v.Args[1] 7204 if !(isU32Bit(c)) { 7205 break 7206 } 7207 v.reset(OpS390XInvertFlags) 7208 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 7209 v0.AuxInt = int64(uint32(c)) 7210 v0.AddArg(x) 7211 v.AddArg(v0) 7212 return true 7213 } 7214 return false 7215 } 7216 func rewriteValueS390X_OpS390XCMPUconst(v *Value) bool { 7217 // match: (CMPUconst (MOVDconst [x]) [y]) 7218 // cond: uint64(x)==uint64(y) 7219 // result: (FlagEQ) 7220 for { 7221 y := v.AuxInt 7222 v_0 := v.Args[0] 7223 if v_0.Op != OpS390XMOVDconst { 7224 break 7225 } 7226 x := v_0.AuxInt 7227 if !(uint64(x) == uint64(y)) { 7228 break 7229 } 7230 v.reset(OpS390XFlagEQ) 7231 return true 7232 } 7233 // match: (CMPUconst (MOVDconst [x]) [y]) 7234 // cond: uint64(x)<uint64(y) 7235 // result: (FlagLT) 7236 for { 7237 y := v.AuxInt 7238 v_0 := v.Args[0] 7239 if v_0.Op != OpS390XMOVDconst { 7240 break 7241 } 7242 x := v_0.AuxInt 7243 if !(uint64(x) < uint64(y)) { 7244 break 7245 } 7246 v.reset(OpS390XFlagLT) 7247 return true 7248 } 7249 // match: (CMPUconst (MOVDconst [x]) [y]) 7250 // cond: uint64(x)>uint64(y) 7251 // result: (FlagGT) 7252 for { 7253 y := v.AuxInt 7254 v_0 := v.Args[0] 7255 if v_0.Op != OpS390XMOVDconst { 7256 break 7257 } 7258 x := v_0.AuxInt 7259 if !(uint64(x) > uint64(y)) { 7260 break 7261 } 7262 v.reset(OpS390XFlagGT) 7263 return true 7264 } 7265 return false 7266 } 7267 func rewriteValueS390X_OpS390XCMPW(v *Value) bool { 7268 b := v.Block 7269 _ = b 7270 // match: (CMPW x (MOVDconst [c])) 7271 // cond: 7272 // result: (CMPWconst x [c]) 7273 for { 7274 x := v.Args[0] 7275 v_1 := v.Args[1] 7276 if v_1.Op != OpS390XMOVDconst { 7277 break 7278 } 7279 c := v_1.AuxInt 7280 v.reset(OpS390XCMPWconst) 7281 v.AuxInt = c 7282 v.AddArg(x) 7283 return true 7284 } 7285 // match: (CMPW (MOVDconst [c]) x) 7286 // cond: 7287 // result: (InvertFlags (CMPWconst x [c])) 7288 for { 7289 v_0 := v.Args[0] 7290 if v_0.Op != OpS390XMOVDconst { 7291 break 7292 } 7293 c := v_0.AuxInt 7294 x := v.Args[1] 7295 v.reset(OpS390XInvertFlags) 7296 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, TypeFlags) 7297 v0.AuxInt = c 7298 v0.AddArg(x) 7299 v.AddArg(v0) 7300 return true 7301 } 7302 return false 7303 } 7304 func rewriteValueS390X_OpS390XCMPWU(v *Value) bool { 7305 b := v.Block 7306 _ = b 7307 // match: (CMPWU x (MOVDconst [c])) 7308 // cond: 7309 // result: (CMPWUconst x [int64(uint32(c))]) 7310 for { 7311 x := v.Args[0] 7312 v_1 := v.Args[1] 7313 if v_1.Op != OpS390XMOVDconst { 7314 break 7315 } 7316 c := v_1.AuxInt 7317 v.reset(OpS390XCMPWUconst) 7318 v.AuxInt = int64(uint32(c)) 7319 v.AddArg(x) 7320 return true 7321 } 7322 // match: (CMPWU (MOVDconst [c]) x) 7323 // cond: 7324 // result: (InvertFlags (CMPWUconst x [int64(uint32(c))])) 7325 for { 7326 v_0 := v.Args[0] 7327 if v_0.Op != OpS390XMOVDconst { 7328 break 7329 } 7330 c := v_0.AuxInt 7331 x := v.Args[1] 7332 v.reset(OpS390XInvertFlags) 7333 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 7334 v0.AuxInt = int64(uint32(c)) 7335 v0.AddArg(x) 7336 v.AddArg(v0) 7337 return true 7338 } 7339 return false 7340 } 7341 func rewriteValueS390X_OpS390XCMPWUconst(v *Value) bool { 7342 // match: (CMPWUconst (MOVDconst [x]) [y]) 7343 // cond: uint32(x)==uint32(y) 7344 // result: (FlagEQ) 7345 for { 7346 y := v.AuxInt 7347 v_0 := v.Args[0] 7348 if v_0.Op != OpS390XMOVDconst { 7349 break 7350 } 7351 x := v_0.AuxInt 7352 if !(uint32(x) == uint32(y)) { 7353 break 7354 } 7355 v.reset(OpS390XFlagEQ) 7356 return true 7357 } 7358 // match: (CMPWUconst (MOVDconst [x]) [y]) 7359 // cond: uint32(x)<uint32(y) 7360 // result: (FlagLT) 7361 for { 7362 y := v.AuxInt 7363 v_0 := v.Args[0] 7364 if v_0.Op != OpS390XMOVDconst { 7365 break 7366 } 7367 x := v_0.AuxInt 7368 if !(uint32(x) < uint32(y)) { 7369 break 7370 } 7371 v.reset(OpS390XFlagLT) 7372 return true 7373 } 7374 // match: (CMPWUconst (MOVDconst [x]) [y]) 7375 // cond: uint32(x)>uint32(y) 7376 // result: (FlagGT) 7377 for { 7378 y := v.AuxInt 7379 v_0 := v.Args[0] 7380 if v_0.Op != OpS390XMOVDconst { 7381 break 7382 } 7383 x := v_0.AuxInt 7384 if !(uint32(x) > uint32(y)) { 7385 break 7386 } 7387 v.reset(OpS390XFlagGT) 7388 return true 7389 } 7390 return false 7391 } 7392 func rewriteValueS390X_OpS390XCMPWconst(v *Value) bool { 7393 // match: (CMPWconst (MOVDconst [x]) [y]) 7394 // cond: int32(x)==int32(y) 7395 // result: (FlagEQ) 7396 for { 7397 y := v.AuxInt 7398 v_0 := v.Args[0] 7399 if v_0.Op != OpS390XMOVDconst { 7400 break 7401 } 7402 x := v_0.AuxInt 7403 if !(int32(x) == int32(y)) { 7404 break 7405 } 7406 v.reset(OpS390XFlagEQ) 7407 return true 7408 } 7409 // match: (CMPWconst (MOVDconst [x]) [y]) 7410 // cond: int32(x)<int32(y) 7411 // result: (FlagLT) 7412 for { 7413 y := v.AuxInt 7414 v_0 := v.Args[0] 7415 if v_0.Op != OpS390XMOVDconst { 7416 break 7417 } 7418 x := v_0.AuxInt 7419 if !(int32(x) < int32(y)) { 7420 break 7421 } 7422 v.reset(OpS390XFlagLT) 7423 return true 7424 } 7425 // match: (CMPWconst (MOVDconst [x]) [y]) 7426 // cond: int32(x)>int32(y) 7427 // result: (FlagGT) 7428 for { 7429 y := v.AuxInt 7430 v_0 := v.Args[0] 7431 if v_0.Op != OpS390XMOVDconst { 7432 break 7433 } 7434 x := v_0.AuxInt 7435 if !(int32(x) > int32(y)) { 7436 break 7437 } 7438 v.reset(OpS390XFlagGT) 7439 return true 7440 } 7441 // match: (CMPWconst (SRWconst _ [c]) [n]) 7442 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 7443 // result: (FlagLT) 7444 for { 7445 n := v.AuxInt 7446 v_0 := v.Args[0] 7447 if v_0.Op != OpS390XSRWconst { 7448 break 7449 } 7450 c := v_0.AuxInt 7451 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 7452 break 7453 } 7454 v.reset(OpS390XFlagLT) 7455 return true 7456 } 7457 // match: (CMPWconst (ANDWconst _ [m]) [n]) 7458 // cond: 0 <= int32(m) && int32(m) < int32(n) 7459 // result: (FlagLT) 7460 for { 7461 n := v.AuxInt 7462 v_0 := v.Args[0] 7463 if v_0.Op != OpS390XANDWconst { 7464 break 7465 } 7466 m := v_0.AuxInt 7467 if !(0 <= int32(m) && int32(m) < int32(n)) { 7468 break 7469 } 7470 v.reset(OpS390XFlagLT) 7471 return true 7472 } 7473 return false 7474 } 7475 func rewriteValueS390X_OpS390XCMPconst(v *Value) bool { 7476 // match: (CMPconst (MOVDconst [x]) [y]) 7477 // cond: x==y 7478 // result: (FlagEQ) 7479 for { 7480 y := v.AuxInt 7481 v_0 := v.Args[0] 7482 if v_0.Op != OpS390XMOVDconst { 7483 break 7484 } 7485 x := v_0.AuxInt 7486 if !(x == y) { 7487 break 7488 } 7489 v.reset(OpS390XFlagEQ) 7490 return true 7491 } 7492 // match: (CMPconst (MOVDconst [x]) [y]) 7493 // cond: x<y 7494 // result: (FlagLT) 7495 for { 7496 y := v.AuxInt 7497 v_0 := v.Args[0] 7498 if v_0.Op != OpS390XMOVDconst { 7499 break 7500 } 7501 x := v_0.AuxInt 7502 if !(x < y) { 7503 break 7504 } 7505 v.reset(OpS390XFlagLT) 7506 return true 7507 } 7508 // match: (CMPconst (MOVDconst [x]) [y]) 7509 // cond: x>y 7510 // result: (FlagGT) 7511 for { 7512 y := v.AuxInt 7513 v_0 := v.Args[0] 7514 if v_0.Op != OpS390XMOVDconst { 7515 break 7516 } 7517 x := v_0.AuxInt 7518 if !(x > y) { 7519 break 7520 } 7521 v.reset(OpS390XFlagGT) 7522 return true 7523 } 7524 // match: (CMPconst (MOVBZreg _) [c]) 7525 // cond: 0xFF < c 7526 // result: (FlagLT) 7527 for { 7528 c := v.AuxInt 7529 v_0 := v.Args[0] 7530 if v_0.Op != OpS390XMOVBZreg { 7531 break 7532 } 7533 if !(0xFF < c) { 7534 break 7535 } 7536 v.reset(OpS390XFlagLT) 7537 return true 7538 } 7539 // match: (CMPconst (MOVHZreg _) [c]) 7540 // cond: 0xFFFF < c 7541 // result: (FlagLT) 7542 for { 7543 c := v.AuxInt 7544 v_0 := v.Args[0] 7545 if v_0.Op != OpS390XMOVHZreg { 7546 break 7547 } 7548 if !(0xFFFF < c) { 7549 break 7550 } 7551 v.reset(OpS390XFlagLT) 7552 return true 7553 } 7554 // match: (CMPconst (MOVWZreg _) [c]) 7555 // cond: 0xFFFFFFFF < c 7556 // result: (FlagLT) 7557 for { 7558 c := v.AuxInt 7559 v_0 := v.Args[0] 7560 if v_0.Op != OpS390XMOVWZreg { 7561 break 7562 } 7563 if !(0xFFFFFFFF < c) { 7564 break 7565 } 7566 v.reset(OpS390XFlagLT) 7567 return true 7568 } 7569 // match: (CMPconst (SRDconst _ [c]) [n]) 7570 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 7571 // result: (FlagLT) 7572 for { 7573 n := v.AuxInt 7574 v_0 := v.Args[0] 7575 if v_0.Op != OpS390XSRDconst { 7576 break 7577 } 7578 c := v_0.AuxInt 7579 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 7580 break 7581 } 7582 v.reset(OpS390XFlagLT) 7583 return true 7584 } 7585 // match: (CMPconst (ANDconst _ [m]) [n]) 7586 // cond: 0 <= m && m < n 7587 // result: (FlagLT) 7588 for { 7589 n := v.AuxInt 7590 v_0 := v.Args[0] 7591 if v_0.Op != OpS390XANDconst { 7592 break 7593 } 7594 m := v_0.AuxInt 7595 if !(0 <= m && m < n) { 7596 break 7597 } 7598 v.reset(OpS390XFlagLT) 7599 return true 7600 } 7601 return false 7602 } 7603 func rewriteValueS390X_OpS390XFADD(v *Value) bool { 7604 // match: (FADD (FMUL y z) x) 7605 // cond: 7606 // result: (FMADD x y z) 7607 for { 7608 v_0 := v.Args[0] 7609 if v_0.Op != OpS390XFMUL { 7610 break 7611 } 7612 y := v_0.Args[0] 7613 z := v_0.Args[1] 7614 x := v.Args[1] 7615 v.reset(OpS390XFMADD) 7616 v.AddArg(x) 7617 v.AddArg(y) 7618 v.AddArg(z) 7619 return true 7620 } 7621 // match: (FADD x (FMUL y z)) 7622 // cond: 7623 // result: (FMADD x y z) 7624 for { 7625 x := v.Args[0] 7626 v_1 := v.Args[1] 7627 if v_1.Op != OpS390XFMUL { 7628 break 7629 } 7630 y := v_1.Args[0] 7631 z := v_1.Args[1] 7632 v.reset(OpS390XFMADD) 7633 v.AddArg(x) 7634 v.AddArg(y) 7635 v.AddArg(z) 7636 return true 7637 } 7638 return false 7639 } 7640 func rewriteValueS390X_OpS390XFADDS(v *Value) bool { 7641 // match: (FADDS (FMULS y z) x) 7642 // cond: 7643 // result: (FMADDS x y z) 7644 for { 7645 v_0 := v.Args[0] 7646 if v_0.Op != OpS390XFMULS { 7647 break 7648 } 7649 y := v_0.Args[0] 7650 z := v_0.Args[1] 7651 x := v.Args[1] 7652 v.reset(OpS390XFMADDS) 7653 v.AddArg(x) 7654 v.AddArg(y) 7655 v.AddArg(z) 7656 return true 7657 } 7658 // match: (FADDS x (FMULS y z)) 7659 // cond: 7660 // result: (FMADDS x y z) 7661 for { 7662 x := v.Args[0] 7663 v_1 := v.Args[1] 7664 if v_1.Op != OpS390XFMULS { 7665 break 7666 } 7667 y := v_1.Args[0] 7668 z := v_1.Args[1] 7669 v.reset(OpS390XFMADDS) 7670 v.AddArg(x) 7671 v.AddArg(y) 7672 v.AddArg(z) 7673 return true 7674 } 7675 return false 7676 } 7677 func rewriteValueS390X_OpS390XFMOVDload(v *Value) bool { 7678 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7679 // cond: is20Bit(off1+off2) 7680 // result: (FMOVDload [off1+off2] {sym} ptr mem) 7681 for { 7682 off1 := v.AuxInt 7683 sym := v.Aux 7684 v_0 := v.Args[0] 7685 if v_0.Op != OpS390XADDconst { 7686 break 7687 } 7688 off2 := v_0.AuxInt 7689 ptr := v_0.Args[0] 7690 mem := v.Args[1] 7691 if !(is20Bit(off1 + off2)) { 7692 break 7693 } 7694 v.reset(OpS390XFMOVDload) 7695 v.AuxInt = off1 + off2 7696 v.Aux = sym 7697 v.AddArg(ptr) 7698 v.AddArg(mem) 7699 return true 7700 } 7701 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 7702 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7703 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 7704 for { 7705 off1 := v.AuxInt 7706 sym1 := v.Aux 7707 v_0 := v.Args[0] 7708 if v_0.Op != OpS390XMOVDaddr { 7709 break 7710 } 7711 off2 := v_0.AuxInt 7712 sym2 := v_0.Aux 7713 base := v_0.Args[0] 7714 mem := v.Args[1] 7715 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7716 break 7717 } 7718 v.reset(OpS390XFMOVDload) 7719 v.AuxInt = off1 + off2 7720 v.Aux = mergeSym(sym1, sym2) 7721 v.AddArg(base) 7722 v.AddArg(mem) 7723 return true 7724 } 7725 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 7726 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7727 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7728 for { 7729 off1 := v.AuxInt 7730 sym1 := v.Aux 7731 v_0 := v.Args[0] 7732 if v_0.Op != OpS390XMOVDaddridx { 7733 break 7734 } 7735 off2 := v_0.AuxInt 7736 sym2 := v_0.Aux 7737 ptr := v_0.Args[0] 7738 idx := v_0.Args[1] 7739 mem := v.Args[1] 7740 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7741 break 7742 } 7743 v.reset(OpS390XFMOVDloadidx) 7744 v.AuxInt = off1 + off2 7745 v.Aux = mergeSym(sym1, sym2) 7746 v.AddArg(ptr) 7747 v.AddArg(idx) 7748 v.AddArg(mem) 7749 return true 7750 } 7751 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 7752 // cond: ptr.Op != OpSB 7753 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 7754 for { 7755 off := v.AuxInt 7756 sym := v.Aux 7757 v_0 := v.Args[0] 7758 if v_0.Op != OpS390XADD { 7759 break 7760 } 7761 ptr := v_0.Args[0] 7762 idx := v_0.Args[1] 7763 mem := v.Args[1] 7764 if !(ptr.Op != OpSB) { 7765 break 7766 } 7767 v.reset(OpS390XFMOVDloadidx) 7768 v.AuxInt = off 7769 v.Aux = sym 7770 v.AddArg(ptr) 7771 v.AddArg(idx) 7772 v.AddArg(mem) 7773 return true 7774 } 7775 return false 7776 } 7777 func rewriteValueS390X_OpS390XFMOVDloadidx(v *Value) bool { 7778 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 7779 // cond: 7780 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 7781 for { 7782 c := v.AuxInt 7783 sym := v.Aux 7784 v_0 := v.Args[0] 7785 if v_0.Op != OpS390XADDconst { 7786 break 7787 } 7788 d := v_0.AuxInt 7789 ptr := v_0.Args[0] 7790 idx := v.Args[1] 7791 mem := v.Args[2] 7792 v.reset(OpS390XFMOVDloadidx) 7793 v.AuxInt = c + d 7794 v.Aux = sym 7795 v.AddArg(ptr) 7796 v.AddArg(idx) 7797 v.AddArg(mem) 7798 return true 7799 } 7800 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 7801 // cond: 7802 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 7803 for { 7804 c := v.AuxInt 7805 sym := v.Aux 7806 ptr := v.Args[0] 7807 v_1 := v.Args[1] 7808 if v_1.Op != OpS390XADDconst { 7809 break 7810 } 7811 d := v_1.AuxInt 7812 idx := v_1.Args[0] 7813 mem := v.Args[2] 7814 v.reset(OpS390XFMOVDloadidx) 7815 v.AuxInt = c + d 7816 v.Aux = sym 7817 v.AddArg(ptr) 7818 v.AddArg(idx) 7819 v.AddArg(mem) 7820 return true 7821 } 7822 return false 7823 } 7824 func rewriteValueS390X_OpS390XFMOVDstore(v *Value) bool { 7825 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7826 // cond: is20Bit(off1+off2) 7827 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 7828 for { 7829 off1 := v.AuxInt 7830 sym := v.Aux 7831 v_0 := v.Args[0] 7832 if v_0.Op != OpS390XADDconst { 7833 break 7834 } 7835 off2 := v_0.AuxInt 7836 ptr := v_0.Args[0] 7837 val := v.Args[1] 7838 mem := v.Args[2] 7839 if !(is20Bit(off1 + off2)) { 7840 break 7841 } 7842 v.reset(OpS390XFMOVDstore) 7843 v.AuxInt = off1 + off2 7844 v.Aux = sym 7845 v.AddArg(ptr) 7846 v.AddArg(val) 7847 v.AddArg(mem) 7848 return true 7849 } 7850 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 7851 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7852 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 7853 for { 7854 off1 := v.AuxInt 7855 sym1 := v.Aux 7856 v_0 := v.Args[0] 7857 if v_0.Op != OpS390XMOVDaddr { 7858 break 7859 } 7860 off2 := v_0.AuxInt 7861 sym2 := v_0.Aux 7862 base := v_0.Args[0] 7863 val := v.Args[1] 7864 mem := v.Args[2] 7865 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7866 break 7867 } 7868 v.reset(OpS390XFMOVDstore) 7869 v.AuxInt = off1 + off2 7870 v.Aux = mergeSym(sym1, sym2) 7871 v.AddArg(base) 7872 v.AddArg(val) 7873 v.AddArg(mem) 7874 return true 7875 } 7876 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 7877 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7878 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7879 for { 7880 off1 := v.AuxInt 7881 sym1 := v.Aux 7882 v_0 := v.Args[0] 7883 if v_0.Op != OpS390XMOVDaddridx { 7884 break 7885 } 7886 off2 := v_0.AuxInt 7887 sym2 := v_0.Aux 7888 ptr := v_0.Args[0] 7889 idx := v_0.Args[1] 7890 val := v.Args[1] 7891 mem := v.Args[2] 7892 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7893 break 7894 } 7895 v.reset(OpS390XFMOVDstoreidx) 7896 v.AuxInt = off1 + off2 7897 v.Aux = mergeSym(sym1, sym2) 7898 v.AddArg(ptr) 7899 v.AddArg(idx) 7900 v.AddArg(val) 7901 v.AddArg(mem) 7902 return true 7903 } 7904 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 7905 // cond: ptr.Op != OpSB 7906 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 7907 for { 7908 off := v.AuxInt 7909 sym := v.Aux 7910 v_0 := v.Args[0] 7911 if v_0.Op != OpS390XADD { 7912 break 7913 } 7914 ptr := v_0.Args[0] 7915 idx := v_0.Args[1] 7916 val := v.Args[1] 7917 mem := v.Args[2] 7918 if !(ptr.Op != OpSB) { 7919 break 7920 } 7921 v.reset(OpS390XFMOVDstoreidx) 7922 v.AuxInt = off 7923 v.Aux = sym 7924 v.AddArg(ptr) 7925 v.AddArg(idx) 7926 v.AddArg(val) 7927 v.AddArg(mem) 7928 return true 7929 } 7930 return false 7931 } 7932 func rewriteValueS390X_OpS390XFMOVDstoreidx(v *Value) bool { 7933 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 7934 // cond: 7935 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 7936 for { 7937 c := v.AuxInt 7938 sym := v.Aux 7939 v_0 := v.Args[0] 7940 if v_0.Op != OpS390XADDconst { 7941 break 7942 } 7943 d := v_0.AuxInt 7944 ptr := v_0.Args[0] 7945 idx := v.Args[1] 7946 val := v.Args[2] 7947 mem := v.Args[3] 7948 v.reset(OpS390XFMOVDstoreidx) 7949 v.AuxInt = c + d 7950 v.Aux = sym 7951 v.AddArg(ptr) 7952 v.AddArg(idx) 7953 v.AddArg(val) 7954 v.AddArg(mem) 7955 return true 7956 } 7957 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 7958 // cond: 7959 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 7960 for { 7961 c := v.AuxInt 7962 sym := v.Aux 7963 ptr := v.Args[0] 7964 v_1 := v.Args[1] 7965 if v_1.Op != OpS390XADDconst { 7966 break 7967 } 7968 d := v_1.AuxInt 7969 idx := v_1.Args[0] 7970 val := v.Args[2] 7971 mem := v.Args[3] 7972 v.reset(OpS390XFMOVDstoreidx) 7973 v.AuxInt = c + d 7974 v.Aux = sym 7975 v.AddArg(ptr) 7976 v.AddArg(idx) 7977 v.AddArg(val) 7978 v.AddArg(mem) 7979 return true 7980 } 7981 return false 7982 } 7983 func rewriteValueS390X_OpS390XFMOVSload(v *Value) bool { 7984 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 7985 // cond: is20Bit(off1+off2) 7986 // result: (FMOVSload [off1+off2] {sym} ptr mem) 7987 for { 7988 off1 := v.AuxInt 7989 sym := v.Aux 7990 v_0 := v.Args[0] 7991 if v_0.Op != OpS390XADDconst { 7992 break 7993 } 7994 off2 := v_0.AuxInt 7995 ptr := v_0.Args[0] 7996 mem := v.Args[1] 7997 if !(is20Bit(off1 + off2)) { 7998 break 7999 } 8000 v.reset(OpS390XFMOVSload) 8001 v.AuxInt = off1 + off2 8002 v.Aux = sym 8003 v.AddArg(ptr) 8004 v.AddArg(mem) 8005 return true 8006 } 8007 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8008 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8009 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8010 for { 8011 off1 := v.AuxInt 8012 sym1 := v.Aux 8013 v_0 := v.Args[0] 8014 if v_0.Op != OpS390XMOVDaddr { 8015 break 8016 } 8017 off2 := v_0.AuxInt 8018 sym2 := v_0.Aux 8019 base := v_0.Args[0] 8020 mem := v.Args[1] 8021 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8022 break 8023 } 8024 v.reset(OpS390XFMOVSload) 8025 v.AuxInt = off1 + off2 8026 v.Aux = mergeSym(sym1, sym2) 8027 v.AddArg(base) 8028 v.AddArg(mem) 8029 return true 8030 } 8031 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8032 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8033 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8034 for { 8035 off1 := v.AuxInt 8036 sym1 := v.Aux 8037 v_0 := v.Args[0] 8038 if v_0.Op != OpS390XMOVDaddridx { 8039 break 8040 } 8041 off2 := v_0.AuxInt 8042 sym2 := v_0.Aux 8043 ptr := v_0.Args[0] 8044 idx := v_0.Args[1] 8045 mem := v.Args[1] 8046 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8047 break 8048 } 8049 v.reset(OpS390XFMOVSloadidx) 8050 v.AuxInt = off1 + off2 8051 v.Aux = mergeSym(sym1, sym2) 8052 v.AddArg(ptr) 8053 v.AddArg(idx) 8054 v.AddArg(mem) 8055 return true 8056 } 8057 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 8058 // cond: ptr.Op != OpSB 8059 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 8060 for { 8061 off := v.AuxInt 8062 sym := v.Aux 8063 v_0 := v.Args[0] 8064 if v_0.Op != OpS390XADD { 8065 break 8066 } 8067 ptr := v_0.Args[0] 8068 idx := v_0.Args[1] 8069 mem := v.Args[1] 8070 if !(ptr.Op != OpSB) { 8071 break 8072 } 8073 v.reset(OpS390XFMOVSloadidx) 8074 v.AuxInt = off 8075 v.Aux = sym 8076 v.AddArg(ptr) 8077 v.AddArg(idx) 8078 v.AddArg(mem) 8079 return true 8080 } 8081 return false 8082 } 8083 func rewriteValueS390X_OpS390XFMOVSloadidx(v *Value) bool { 8084 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8085 // cond: 8086 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8087 for { 8088 c := v.AuxInt 8089 sym := v.Aux 8090 v_0 := v.Args[0] 8091 if v_0.Op != OpS390XADDconst { 8092 break 8093 } 8094 d := v_0.AuxInt 8095 ptr := v_0.Args[0] 8096 idx := v.Args[1] 8097 mem := v.Args[2] 8098 v.reset(OpS390XFMOVSloadidx) 8099 v.AuxInt = c + d 8100 v.Aux = sym 8101 v.AddArg(ptr) 8102 v.AddArg(idx) 8103 v.AddArg(mem) 8104 return true 8105 } 8106 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8107 // cond: 8108 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8109 for { 8110 c := v.AuxInt 8111 sym := v.Aux 8112 ptr := v.Args[0] 8113 v_1 := v.Args[1] 8114 if v_1.Op != OpS390XADDconst { 8115 break 8116 } 8117 d := v_1.AuxInt 8118 idx := v_1.Args[0] 8119 mem := v.Args[2] 8120 v.reset(OpS390XFMOVSloadidx) 8121 v.AuxInt = c + d 8122 v.Aux = sym 8123 v.AddArg(ptr) 8124 v.AddArg(idx) 8125 v.AddArg(mem) 8126 return true 8127 } 8128 return false 8129 } 8130 func rewriteValueS390X_OpS390XFMOVSstore(v *Value) bool { 8131 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8132 // cond: is20Bit(off1+off2) 8133 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 8134 for { 8135 off1 := v.AuxInt 8136 sym := v.Aux 8137 v_0 := v.Args[0] 8138 if v_0.Op != OpS390XADDconst { 8139 break 8140 } 8141 off2 := v_0.AuxInt 8142 ptr := v_0.Args[0] 8143 val := v.Args[1] 8144 mem := v.Args[2] 8145 if !(is20Bit(off1 + off2)) { 8146 break 8147 } 8148 v.reset(OpS390XFMOVSstore) 8149 v.AuxInt = off1 + off2 8150 v.Aux = sym 8151 v.AddArg(ptr) 8152 v.AddArg(val) 8153 v.AddArg(mem) 8154 return true 8155 } 8156 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8157 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8158 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8159 for { 8160 off1 := v.AuxInt 8161 sym1 := v.Aux 8162 v_0 := v.Args[0] 8163 if v_0.Op != OpS390XMOVDaddr { 8164 break 8165 } 8166 off2 := v_0.AuxInt 8167 sym2 := v_0.Aux 8168 base := v_0.Args[0] 8169 val := v.Args[1] 8170 mem := v.Args[2] 8171 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8172 break 8173 } 8174 v.reset(OpS390XFMOVSstore) 8175 v.AuxInt = off1 + off2 8176 v.Aux = mergeSym(sym1, sym2) 8177 v.AddArg(base) 8178 v.AddArg(val) 8179 v.AddArg(mem) 8180 return true 8181 } 8182 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8183 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8184 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8185 for { 8186 off1 := v.AuxInt 8187 sym1 := v.Aux 8188 v_0 := v.Args[0] 8189 if v_0.Op != OpS390XMOVDaddridx { 8190 break 8191 } 8192 off2 := v_0.AuxInt 8193 sym2 := v_0.Aux 8194 ptr := v_0.Args[0] 8195 idx := v_0.Args[1] 8196 val := v.Args[1] 8197 mem := v.Args[2] 8198 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8199 break 8200 } 8201 v.reset(OpS390XFMOVSstoreidx) 8202 v.AuxInt = off1 + off2 8203 v.Aux = mergeSym(sym1, sym2) 8204 v.AddArg(ptr) 8205 v.AddArg(idx) 8206 v.AddArg(val) 8207 v.AddArg(mem) 8208 return true 8209 } 8210 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 8211 // cond: ptr.Op != OpSB 8212 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 8213 for { 8214 off := v.AuxInt 8215 sym := v.Aux 8216 v_0 := v.Args[0] 8217 if v_0.Op != OpS390XADD { 8218 break 8219 } 8220 ptr := v_0.Args[0] 8221 idx := v_0.Args[1] 8222 val := v.Args[1] 8223 mem := v.Args[2] 8224 if !(ptr.Op != OpSB) { 8225 break 8226 } 8227 v.reset(OpS390XFMOVSstoreidx) 8228 v.AuxInt = off 8229 v.Aux = sym 8230 v.AddArg(ptr) 8231 v.AddArg(idx) 8232 v.AddArg(val) 8233 v.AddArg(mem) 8234 return true 8235 } 8236 return false 8237 } 8238 func rewriteValueS390X_OpS390XFMOVSstoreidx(v *Value) bool { 8239 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8240 // cond: 8241 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8242 for { 8243 c := v.AuxInt 8244 sym := v.Aux 8245 v_0 := v.Args[0] 8246 if v_0.Op != OpS390XADDconst { 8247 break 8248 } 8249 d := v_0.AuxInt 8250 ptr := v_0.Args[0] 8251 idx := v.Args[1] 8252 val := v.Args[2] 8253 mem := v.Args[3] 8254 v.reset(OpS390XFMOVSstoreidx) 8255 v.AuxInt = c + d 8256 v.Aux = sym 8257 v.AddArg(ptr) 8258 v.AddArg(idx) 8259 v.AddArg(val) 8260 v.AddArg(mem) 8261 return true 8262 } 8263 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8264 // cond: 8265 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8266 for { 8267 c := v.AuxInt 8268 sym := v.Aux 8269 ptr := v.Args[0] 8270 v_1 := v.Args[1] 8271 if v_1.Op != OpS390XADDconst { 8272 break 8273 } 8274 d := v_1.AuxInt 8275 idx := v_1.Args[0] 8276 val := v.Args[2] 8277 mem := v.Args[3] 8278 v.reset(OpS390XFMOVSstoreidx) 8279 v.AuxInt = c + d 8280 v.Aux = sym 8281 v.AddArg(ptr) 8282 v.AddArg(idx) 8283 v.AddArg(val) 8284 v.AddArg(mem) 8285 return true 8286 } 8287 return false 8288 } 8289 func rewriteValueS390X_OpS390XFSUB(v *Value) bool { 8290 // match: (FSUB (FMUL y z) x) 8291 // cond: 8292 // result: (FMSUB x y z) 8293 for { 8294 v_0 := v.Args[0] 8295 if v_0.Op != OpS390XFMUL { 8296 break 8297 } 8298 y := v_0.Args[0] 8299 z := v_0.Args[1] 8300 x := v.Args[1] 8301 v.reset(OpS390XFMSUB) 8302 v.AddArg(x) 8303 v.AddArg(y) 8304 v.AddArg(z) 8305 return true 8306 } 8307 return false 8308 } 8309 func rewriteValueS390X_OpS390XFSUBS(v *Value) bool { 8310 // match: (FSUBS (FMULS y z) x) 8311 // cond: 8312 // result: (FMSUBS x y z) 8313 for { 8314 v_0 := v.Args[0] 8315 if v_0.Op != OpS390XFMULS { 8316 break 8317 } 8318 y := v_0.Args[0] 8319 z := v_0.Args[1] 8320 x := v.Args[1] 8321 v.reset(OpS390XFMSUBS) 8322 v.AddArg(x) 8323 v.AddArg(y) 8324 v.AddArg(z) 8325 return true 8326 } 8327 return false 8328 } 8329 func rewriteValueS390X_OpS390XLoweredRound32F(v *Value) bool { 8330 // match: (LoweredRound32F x:(FMOVSconst)) 8331 // cond: 8332 // result: x 8333 for { 8334 x := v.Args[0] 8335 if x.Op != OpS390XFMOVSconst { 8336 break 8337 } 8338 v.reset(OpCopy) 8339 v.Type = x.Type 8340 v.AddArg(x) 8341 return true 8342 } 8343 return false 8344 } 8345 func rewriteValueS390X_OpS390XLoweredRound64F(v *Value) bool { 8346 // match: (LoweredRound64F x:(FMOVDconst)) 8347 // cond: 8348 // result: x 8349 for { 8350 x := v.Args[0] 8351 if x.Op != OpS390XFMOVDconst { 8352 break 8353 } 8354 v.reset(OpCopy) 8355 v.Type = x.Type 8356 v.AddArg(x) 8357 return true 8358 } 8359 return false 8360 } 8361 func rewriteValueS390X_OpS390XMOVBZload(v *Value) bool { 8362 // match: (MOVBZload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 8363 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8364 // result: (MOVBZreg x) 8365 for { 8366 off := v.AuxInt 8367 sym := v.Aux 8368 ptr := v.Args[0] 8369 v_1 := v.Args[1] 8370 if v_1.Op != OpS390XMOVBstore { 8371 break 8372 } 8373 off2 := v_1.AuxInt 8374 sym2 := v_1.Aux 8375 ptr2 := v_1.Args[0] 8376 x := v_1.Args[1] 8377 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8378 break 8379 } 8380 v.reset(OpS390XMOVBZreg) 8381 v.AddArg(x) 8382 return true 8383 } 8384 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 8385 // cond: is20Bit(off1+off2) 8386 // result: (MOVBZload [off1+off2] {sym} ptr mem) 8387 for { 8388 off1 := v.AuxInt 8389 sym := v.Aux 8390 v_0 := v.Args[0] 8391 if v_0.Op != OpS390XADDconst { 8392 break 8393 } 8394 off2 := v_0.AuxInt 8395 ptr := v_0.Args[0] 8396 mem := v.Args[1] 8397 if !(is20Bit(off1 + off2)) { 8398 break 8399 } 8400 v.reset(OpS390XMOVBZload) 8401 v.AuxInt = off1 + off2 8402 v.Aux = sym 8403 v.AddArg(ptr) 8404 v.AddArg(mem) 8405 return true 8406 } 8407 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8408 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8409 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8410 for { 8411 off1 := v.AuxInt 8412 sym1 := v.Aux 8413 v_0 := v.Args[0] 8414 if v_0.Op != OpS390XMOVDaddr { 8415 break 8416 } 8417 off2 := v_0.AuxInt 8418 sym2 := v_0.Aux 8419 base := v_0.Args[0] 8420 mem := v.Args[1] 8421 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8422 break 8423 } 8424 v.reset(OpS390XMOVBZload) 8425 v.AuxInt = off1 + off2 8426 v.Aux = mergeSym(sym1, sym2) 8427 v.AddArg(base) 8428 v.AddArg(mem) 8429 return true 8430 } 8431 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8432 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8433 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8434 for { 8435 off1 := v.AuxInt 8436 sym1 := v.Aux 8437 v_0 := v.Args[0] 8438 if v_0.Op != OpS390XMOVDaddridx { 8439 break 8440 } 8441 off2 := v_0.AuxInt 8442 sym2 := v_0.Aux 8443 ptr := v_0.Args[0] 8444 idx := v_0.Args[1] 8445 mem := v.Args[1] 8446 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8447 break 8448 } 8449 v.reset(OpS390XMOVBZloadidx) 8450 v.AuxInt = off1 + off2 8451 v.Aux = mergeSym(sym1, sym2) 8452 v.AddArg(ptr) 8453 v.AddArg(idx) 8454 v.AddArg(mem) 8455 return true 8456 } 8457 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 8458 // cond: ptr.Op != OpSB 8459 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 8460 for { 8461 off := v.AuxInt 8462 sym := v.Aux 8463 v_0 := v.Args[0] 8464 if v_0.Op != OpS390XADD { 8465 break 8466 } 8467 ptr := v_0.Args[0] 8468 idx := v_0.Args[1] 8469 mem := v.Args[1] 8470 if !(ptr.Op != OpSB) { 8471 break 8472 } 8473 v.reset(OpS390XMOVBZloadidx) 8474 v.AuxInt = off 8475 v.Aux = sym 8476 v.AddArg(ptr) 8477 v.AddArg(idx) 8478 v.AddArg(mem) 8479 return true 8480 } 8481 return false 8482 } 8483 func rewriteValueS390X_OpS390XMOVBZloadidx(v *Value) bool { 8484 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8485 // cond: 8486 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8487 for { 8488 c := v.AuxInt 8489 sym := v.Aux 8490 v_0 := v.Args[0] 8491 if v_0.Op != OpS390XADDconst { 8492 break 8493 } 8494 d := v_0.AuxInt 8495 ptr := v_0.Args[0] 8496 idx := v.Args[1] 8497 mem := v.Args[2] 8498 v.reset(OpS390XMOVBZloadidx) 8499 v.AuxInt = c + d 8500 v.Aux = sym 8501 v.AddArg(ptr) 8502 v.AddArg(idx) 8503 v.AddArg(mem) 8504 return true 8505 } 8506 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 8507 // cond: 8508 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8509 for { 8510 c := v.AuxInt 8511 sym := v.Aux 8512 idx := v.Args[0] 8513 v_1 := v.Args[1] 8514 if v_1.Op != OpS390XADDconst { 8515 break 8516 } 8517 d := v_1.AuxInt 8518 ptr := v_1.Args[0] 8519 mem := v.Args[2] 8520 v.reset(OpS390XMOVBZloadidx) 8521 v.AuxInt = c + d 8522 v.Aux = sym 8523 v.AddArg(ptr) 8524 v.AddArg(idx) 8525 v.AddArg(mem) 8526 return true 8527 } 8528 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8529 // cond: 8530 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8531 for { 8532 c := v.AuxInt 8533 sym := v.Aux 8534 ptr := v.Args[0] 8535 v_1 := v.Args[1] 8536 if v_1.Op != OpS390XADDconst { 8537 break 8538 } 8539 d := v_1.AuxInt 8540 idx := v_1.Args[0] 8541 mem := v.Args[2] 8542 v.reset(OpS390XMOVBZloadidx) 8543 v.AuxInt = c + d 8544 v.Aux = sym 8545 v.AddArg(ptr) 8546 v.AddArg(idx) 8547 v.AddArg(mem) 8548 return true 8549 } 8550 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 8551 // cond: 8552 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8553 for { 8554 c := v.AuxInt 8555 sym := v.Aux 8556 v_0 := v.Args[0] 8557 if v_0.Op != OpS390XADDconst { 8558 break 8559 } 8560 d := v_0.AuxInt 8561 idx := v_0.Args[0] 8562 ptr := v.Args[1] 8563 mem := v.Args[2] 8564 v.reset(OpS390XMOVBZloadidx) 8565 v.AuxInt = c + d 8566 v.Aux = sym 8567 v.AddArg(ptr) 8568 v.AddArg(idx) 8569 v.AddArg(mem) 8570 return true 8571 } 8572 return false 8573 } 8574 func rewriteValueS390X_OpS390XMOVBZreg(v *Value) bool { 8575 b := v.Block 8576 _ = b 8577 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 8578 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8579 // result: (MOVDreg x) 8580 for { 8581 x := v.Args[0] 8582 if x.Op != OpS390XMOVDLT { 8583 break 8584 } 8585 x_0 := x.Args[0] 8586 if x_0.Op != OpS390XMOVDconst { 8587 break 8588 } 8589 c := x_0.AuxInt 8590 x_1 := x.Args[1] 8591 if x_1.Op != OpS390XMOVDconst { 8592 break 8593 } 8594 d := x_1.AuxInt 8595 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8596 break 8597 } 8598 v.reset(OpS390XMOVDreg) 8599 v.AddArg(x) 8600 return true 8601 } 8602 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 8603 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8604 // result: (MOVDreg x) 8605 for { 8606 x := v.Args[0] 8607 if x.Op != OpS390XMOVDLE { 8608 break 8609 } 8610 x_0 := x.Args[0] 8611 if x_0.Op != OpS390XMOVDconst { 8612 break 8613 } 8614 c := x_0.AuxInt 8615 x_1 := x.Args[1] 8616 if x_1.Op != OpS390XMOVDconst { 8617 break 8618 } 8619 d := x_1.AuxInt 8620 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8621 break 8622 } 8623 v.reset(OpS390XMOVDreg) 8624 v.AddArg(x) 8625 return true 8626 } 8627 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 8628 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8629 // result: (MOVDreg x) 8630 for { 8631 x := v.Args[0] 8632 if x.Op != OpS390XMOVDGT { 8633 break 8634 } 8635 x_0 := x.Args[0] 8636 if x_0.Op != OpS390XMOVDconst { 8637 break 8638 } 8639 c := x_0.AuxInt 8640 x_1 := x.Args[1] 8641 if x_1.Op != OpS390XMOVDconst { 8642 break 8643 } 8644 d := x_1.AuxInt 8645 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8646 break 8647 } 8648 v.reset(OpS390XMOVDreg) 8649 v.AddArg(x) 8650 return true 8651 } 8652 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 8653 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8654 // result: (MOVDreg x) 8655 for { 8656 x := v.Args[0] 8657 if x.Op != OpS390XMOVDGE { 8658 break 8659 } 8660 x_0 := x.Args[0] 8661 if x_0.Op != OpS390XMOVDconst { 8662 break 8663 } 8664 c := x_0.AuxInt 8665 x_1 := x.Args[1] 8666 if x_1.Op != OpS390XMOVDconst { 8667 break 8668 } 8669 d := x_1.AuxInt 8670 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8671 break 8672 } 8673 v.reset(OpS390XMOVDreg) 8674 v.AddArg(x) 8675 return true 8676 } 8677 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 8678 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8679 // result: (MOVDreg x) 8680 for { 8681 x := v.Args[0] 8682 if x.Op != OpS390XMOVDEQ { 8683 break 8684 } 8685 x_0 := x.Args[0] 8686 if x_0.Op != OpS390XMOVDconst { 8687 break 8688 } 8689 c := x_0.AuxInt 8690 x_1 := x.Args[1] 8691 if x_1.Op != OpS390XMOVDconst { 8692 break 8693 } 8694 d := x_1.AuxInt 8695 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8696 break 8697 } 8698 v.reset(OpS390XMOVDreg) 8699 v.AddArg(x) 8700 return true 8701 } 8702 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 8703 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8704 // result: (MOVDreg x) 8705 for { 8706 x := v.Args[0] 8707 if x.Op != OpS390XMOVDNE { 8708 break 8709 } 8710 x_0 := x.Args[0] 8711 if x_0.Op != OpS390XMOVDconst { 8712 break 8713 } 8714 c := x_0.AuxInt 8715 x_1 := x.Args[1] 8716 if x_1.Op != OpS390XMOVDconst { 8717 break 8718 } 8719 d := x_1.AuxInt 8720 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8721 break 8722 } 8723 v.reset(OpS390XMOVDreg) 8724 v.AddArg(x) 8725 return true 8726 } 8727 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 8728 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8729 // result: (MOVDreg x) 8730 for { 8731 x := v.Args[0] 8732 if x.Op != OpS390XMOVDGTnoinv { 8733 break 8734 } 8735 x_0 := x.Args[0] 8736 if x_0.Op != OpS390XMOVDconst { 8737 break 8738 } 8739 c := x_0.AuxInt 8740 x_1 := x.Args[1] 8741 if x_1.Op != OpS390XMOVDconst { 8742 break 8743 } 8744 d := x_1.AuxInt 8745 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8746 break 8747 } 8748 v.reset(OpS390XMOVDreg) 8749 v.AddArg(x) 8750 return true 8751 } 8752 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 8753 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8754 // result: (MOVDreg x) 8755 for { 8756 x := v.Args[0] 8757 if x.Op != OpS390XMOVDGEnoinv { 8758 break 8759 } 8760 x_0 := x.Args[0] 8761 if x_0.Op != OpS390XMOVDconst { 8762 break 8763 } 8764 c := x_0.AuxInt 8765 x_1 := x.Args[1] 8766 if x_1.Op != OpS390XMOVDconst { 8767 break 8768 } 8769 d := x_1.AuxInt 8770 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8771 break 8772 } 8773 v.reset(OpS390XMOVDreg) 8774 v.AddArg(x) 8775 return true 8776 } 8777 // match: (MOVBZreg x:(MOVBZload _ _)) 8778 // cond: 8779 // result: (MOVDreg x) 8780 for { 8781 x := v.Args[0] 8782 if x.Op != OpS390XMOVBZload { 8783 break 8784 } 8785 v.reset(OpS390XMOVDreg) 8786 v.AddArg(x) 8787 return true 8788 } 8789 // match: (MOVBZreg x:(Arg <t>)) 8790 // cond: is8BitInt(t) && !isSigned(t) 8791 // result: (MOVDreg x) 8792 for { 8793 x := v.Args[0] 8794 if x.Op != OpArg { 8795 break 8796 } 8797 t := x.Type 8798 if !(is8BitInt(t) && !isSigned(t)) { 8799 break 8800 } 8801 v.reset(OpS390XMOVDreg) 8802 v.AddArg(x) 8803 return true 8804 } 8805 // match: (MOVBZreg x:(MOVBZreg _)) 8806 // cond: 8807 // result: (MOVDreg x) 8808 for { 8809 x := v.Args[0] 8810 if x.Op != OpS390XMOVBZreg { 8811 break 8812 } 8813 v.reset(OpS390XMOVDreg) 8814 v.AddArg(x) 8815 return true 8816 } 8817 // match: (MOVBZreg (MOVDconst [c])) 8818 // cond: 8819 // result: (MOVDconst [int64(uint8(c))]) 8820 for { 8821 v_0 := v.Args[0] 8822 if v_0.Op != OpS390XMOVDconst { 8823 break 8824 } 8825 c := v_0.AuxInt 8826 v.reset(OpS390XMOVDconst) 8827 v.AuxInt = int64(uint8(c)) 8828 return true 8829 } 8830 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 8831 // cond: x.Uses == 1 && clobber(x) 8832 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 8833 for { 8834 x := v.Args[0] 8835 if x.Op != OpS390XMOVBZload { 8836 break 8837 } 8838 off := x.AuxInt 8839 sym := x.Aux 8840 ptr := x.Args[0] 8841 mem := x.Args[1] 8842 if !(x.Uses == 1 && clobber(x)) { 8843 break 8844 } 8845 b = x.Block 8846 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 8847 v.reset(OpCopy) 8848 v.AddArg(v0) 8849 v0.AuxInt = off 8850 v0.Aux = sym 8851 v0.AddArg(ptr) 8852 v0.AddArg(mem) 8853 return true 8854 } 8855 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 8856 // cond: x.Uses == 1 && clobber(x) 8857 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 8858 for { 8859 x := v.Args[0] 8860 if x.Op != OpS390XMOVBZloadidx { 8861 break 8862 } 8863 off := x.AuxInt 8864 sym := x.Aux 8865 ptr := x.Args[0] 8866 idx := x.Args[1] 8867 mem := x.Args[2] 8868 if !(x.Uses == 1 && clobber(x)) { 8869 break 8870 } 8871 b = x.Block 8872 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 8873 v.reset(OpCopy) 8874 v.AddArg(v0) 8875 v0.AuxInt = off 8876 v0.Aux = sym 8877 v0.AddArg(ptr) 8878 v0.AddArg(idx) 8879 v0.AddArg(mem) 8880 return true 8881 } 8882 return false 8883 } 8884 func rewriteValueS390X_OpS390XMOVBload(v *Value) bool { 8885 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 8886 // cond: is20Bit(off1+off2) 8887 // result: (MOVBload [off1+off2] {sym} ptr mem) 8888 for { 8889 off1 := v.AuxInt 8890 sym := v.Aux 8891 v_0 := v.Args[0] 8892 if v_0.Op != OpS390XADDconst { 8893 break 8894 } 8895 off2 := v_0.AuxInt 8896 ptr := v_0.Args[0] 8897 mem := v.Args[1] 8898 if !(is20Bit(off1 + off2)) { 8899 break 8900 } 8901 v.reset(OpS390XMOVBload) 8902 v.AuxInt = off1 + off2 8903 v.Aux = sym 8904 v.AddArg(ptr) 8905 v.AddArg(mem) 8906 return true 8907 } 8908 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8909 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8910 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8911 for { 8912 off1 := v.AuxInt 8913 sym1 := v.Aux 8914 v_0 := v.Args[0] 8915 if v_0.Op != OpS390XMOVDaddr { 8916 break 8917 } 8918 off2 := v_0.AuxInt 8919 sym2 := v_0.Aux 8920 base := v_0.Args[0] 8921 mem := v.Args[1] 8922 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8923 break 8924 } 8925 v.reset(OpS390XMOVBload) 8926 v.AuxInt = off1 + off2 8927 v.Aux = mergeSym(sym1, sym2) 8928 v.AddArg(base) 8929 v.AddArg(mem) 8930 return true 8931 } 8932 return false 8933 } 8934 func rewriteValueS390X_OpS390XMOVBreg(v *Value) bool { 8935 b := v.Block 8936 _ = b 8937 // match: (MOVBreg x:(MOVBload _ _)) 8938 // cond: 8939 // result: (MOVDreg x) 8940 for { 8941 x := v.Args[0] 8942 if x.Op != OpS390XMOVBload { 8943 break 8944 } 8945 v.reset(OpS390XMOVDreg) 8946 v.AddArg(x) 8947 return true 8948 } 8949 // match: (MOVBreg x:(Arg <t>)) 8950 // cond: is8BitInt(t) && isSigned(t) 8951 // result: (MOVDreg x) 8952 for { 8953 x := v.Args[0] 8954 if x.Op != OpArg { 8955 break 8956 } 8957 t := x.Type 8958 if !(is8BitInt(t) && isSigned(t)) { 8959 break 8960 } 8961 v.reset(OpS390XMOVDreg) 8962 v.AddArg(x) 8963 return true 8964 } 8965 // match: (MOVBreg x:(MOVBreg _)) 8966 // cond: 8967 // result: (MOVDreg x) 8968 for { 8969 x := v.Args[0] 8970 if x.Op != OpS390XMOVBreg { 8971 break 8972 } 8973 v.reset(OpS390XMOVDreg) 8974 v.AddArg(x) 8975 return true 8976 } 8977 // match: (MOVBreg (MOVDconst [c])) 8978 // cond: 8979 // result: (MOVDconst [int64(int8(c))]) 8980 for { 8981 v_0 := v.Args[0] 8982 if v_0.Op != OpS390XMOVDconst { 8983 break 8984 } 8985 c := v_0.AuxInt 8986 v.reset(OpS390XMOVDconst) 8987 v.AuxInt = int64(int8(c)) 8988 return true 8989 } 8990 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 8991 // cond: x.Uses == 1 && clobber(x) 8992 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 8993 for { 8994 x := v.Args[0] 8995 if x.Op != OpS390XMOVBZload { 8996 break 8997 } 8998 off := x.AuxInt 8999 sym := x.Aux 9000 ptr := x.Args[0] 9001 mem := x.Args[1] 9002 if !(x.Uses == 1 && clobber(x)) { 9003 break 9004 } 9005 b = x.Block 9006 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 9007 v.reset(OpCopy) 9008 v.AddArg(v0) 9009 v0.AuxInt = off 9010 v0.Aux = sym 9011 v0.AddArg(ptr) 9012 v0.AddArg(mem) 9013 return true 9014 } 9015 return false 9016 } 9017 func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { 9018 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 9019 // cond: 9020 // result: (MOVBstore [off] {sym} ptr x mem) 9021 for { 9022 off := v.AuxInt 9023 sym := v.Aux 9024 ptr := v.Args[0] 9025 v_1 := v.Args[1] 9026 if v_1.Op != OpS390XMOVBreg { 9027 break 9028 } 9029 x := v_1.Args[0] 9030 mem := v.Args[2] 9031 v.reset(OpS390XMOVBstore) 9032 v.AuxInt = off 9033 v.Aux = sym 9034 v.AddArg(ptr) 9035 v.AddArg(x) 9036 v.AddArg(mem) 9037 return true 9038 } 9039 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 9040 // cond: 9041 // result: (MOVBstore [off] {sym} ptr x mem) 9042 for { 9043 off := v.AuxInt 9044 sym := v.Aux 9045 ptr := v.Args[0] 9046 v_1 := v.Args[1] 9047 if v_1.Op != OpS390XMOVBZreg { 9048 break 9049 } 9050 x := v_1.Args[0] 9051 mem := v.Args[2] 9052 v.reset(OpS390XMOVBstore) 9053 v.AuxInt = off 9054 v.Aux = sym 9055 v.AddArg(ptr) 9056 v.AddArg(x) 9057 v.AddArg(mem) 9058 return true 9059 } 9060 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9061 // cond: is20Bit(off1+off2) 9062 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 9063 for { 9064 off1 := v.AuxInt 9065 sym := v.Aux 9066 v_0 := v.Args[0] 9067 if v_0.Op != OpS390XADDconst { 9068 break 9069 } 9070 off2 := v_0.AuxInt 9071 ptr := v_0.Args[0] 9072 val := v.Args[1] 9073 mem := v.Args[2] 9074 if !(is20Bit(off1 + off2)) { 9075 break 9076 } 9077 v.reset(OpS390XMOVBstore) 9078 v.AuxInt = off1 + off2 9079 v.Aux = sym 9080 v.AddArg(ptr) 9081 v.AddArg(val) 9082 v.AddArg(mem) 9083 return true 9084 } 9085 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 9086 // cond: validOff(off) && ptr.Op != OpSB 9087 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 9088 for { 9089 off := v.AuxInt 9090 sym := v.Aux 9091 ptr := v.Args[0] 9092 v_1 := v.Args[1] 9093 if v_1.Op != OpS390XMOVDconst { 9094 break 9095 } 9096 c := v_1.AuxInt 9097 mem := v.Args[2] 9098 if !(validOff(off) && ptr.Op != OpSB) { 9099 break 9100 } 9101 v.reset(OpS390XMOVBstoreconst) 9102 v.AuxInt = makeValAndOff(int64(int8(c)), off) 9103 v.Aux = sym 9104 v.AddArg(ptr) 9105 v.AddArg(mem) 9106 return true 9107 } 9108 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 9109 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9110 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9111 for { 9112 off1 := v.AuxInt 9113 sym1 := v.Aux 9114 v_0 := v.Args[0] 9115 if v_0.Op != OpS390XMOVDaddr { 9116 break 9117 } 9118 off2 := v_0.AuxInt 9119 sym2 := v_0.Aux 9120 base := v_0.Args[0] 9121 val := v.Args[1] 9122 mem := v.Args[2] 9123 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9124 break 9125 } 9126 v.reset(OpS390XMOVBstore) 9127 v.AuxInt = off1 + off2 9128 v.Aux = mergeSym(sym1, sym2) 9129 v.AddArg(base) 9130 v.AddArg(val) 9131 v.AddArg(mem) 9132 return true 9133 } 9134 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 9135 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9136 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 9137 for { 9138 off1 := v.AuxInt 9139 sym1 := v.Aux 9140 v_0 := v.Args[0] 9141 if v_0.Op != OpS390XMOVDaddridx { 9142 break 9143 } 9144 off2 := v_0.AuxInt 9145 sym2 := v_0.Aux 9146 ptr := v_0.Args[0] 9147 idx := v_0.Args[1] 9148 val := v.Args[1] 9149 mem := v.Args[2] 9150 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9151 break 9152 } 9153 v.reset(OpS390XMOVBstoreidx) 9154 v.AuxInt = off1 + off2 9155 v.Aux = mergeSym(sym1, sym2) 9156 v.AddArg(ptr) 9157 v.AddArg(idx) 9158 v.AddArg(val) 9159 v.AddArg(mem) 9160 return true 9161 } 9162 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 9163 // cond: ptr.Op != OpSB 9164 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 9165 for { 9166 off := v.AuxInt 9167 sym := v.Aux 9168 v_0 := v.Args[0] 9169 if v_0.Op != OpS390XADD { 9170 break 9171 } 9172 ptr := v_0.Args[0] 9173 idx := v_0.Args[1] 9174 val := v.Args[1] 9175 mem := v.Args[2] 9176 if !(ptr.Op != OpSB) { 9177 break 9178 } 9179 v.reset(OpS390XMOVBstoreidx) 9180 v.AuxInt = off 9181 v.Aux = sym 9182 v.AddArg(ptr) 9183 v.AddArg(idx) 9184 v.AddArg(val) 9185 v.AddArg(mem) 9186 return true 9187 } 9188 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 9189 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9190 // result: (MOVHstore [i-1] {s} p w mem) 9191 for { 9192 i := v.AuxInt 9193 s := v.Aux 9194 p := v.Args[0] 9195 w := v.Args[1] 9196 x := v.Args[2] 9197 if x.Op != OpS390XMOVBstore { 9198 break 9199 } 9200 if x.AuxInt != i-1 { 9201 break 9202 } 9203 if x.Aux != s { 9204 break 9205 } 9206 if p != x.Args[0] { 9207 break 9208 } 9209 x_1 := x.Args[1] 9210 if x_1.Op != OpS390XSRDconst { 9211 break 9212 } 9213 if x_1.AuxInt != 8 { 9214 break 9215 } 9216 if w != x_1.Args[0] { 9217 break 9218 } 9219 mem := x.Args[2] 9220 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9221 break 9222 } 9223 v.reset(OpS390XMOVHstore) 9224 v.AuxInt = i - 1 9225 v.Aux = s 9226 v.AddArg(p) 9227 v.AddArg(w) 9228 v.AddArg(mem) 9229 return true 9230 } 9231 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 9232 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9233 // result: (MOVHstore [i-1] {s} p w0 mem) 9234 for { 9235 i := v.AuxInt 9236 s := v.Aux 9237 p := v.Args[0] 9238 w0 := v.Args[1] 9239 if w0.Op != OpS390XSRDconst { 9240 break 9241 } 9242 j := w0.AuxInt 9243 w := w0.Args[0] 9244 x := v.Args[2] 9245 if x.Op != OpS390XMOVBstore { 9246 break 9247 } 9248 if x.AuxInt != i-1 { 9249 break 9250 } 9251 if x.Aux != s { 9252 break 9253 } 9254 if p != x.Args[0] { 9255 break 9256 } 9257 x_1 := x.Args[1] 9258 if x_1.Op != OpS390XSRDconst { 9259 break 9260 } 9261 if x_1.AuxInt != j+8 { 9262 break 9263 } 9264 if w != x_1.Args[0] { 9265 break 9266 } 9267 mem := x.Args[2] 9268 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9269 break 9270 } 9271 v.reset(OpS390XMOVHstore) 9272 v.AuxInt = i - 1 9273 v.Aux = s 9274 v.AddArg(p) 9275 v.AddArg(w0) 9276 v.AddArg(mem) 9277 return true 9278 } 9279 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 9280 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9281 // result: (MOVHstore [i-1] {s} p w mem) 9282 for { 9283 i := v.AuxInt 9284 s := v.Aux 9285 p := v.Args[0] 9286 w := v.Args[1] 9287 x := v.Args[2] 9288 if x.Op != OpS390XMOVBstore { 9289 break 9290 } 9291 if x.AuxInt != i-1 { 9292 break 9293 } 9294 if x.Aux != s { 9295 break 9296 } 9297 if p != x.Args[0] { 9298 break 9299 } 9300 x_1 := x.Args[1] 9301 if x_1.Op != OpS390XSRWconst { 9302 break 9303 } 9304 if x_1.AuxInt != 8 { 9305 break 9306 } 9307 if w != x_1.Args[0] { 9308 break 9309 } 9310 mem := x.Args[2] 9311 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9312 break 9313 } 9314 v.reset(OpS390XMOVHstore) 9315 v.AuxInt = i - 1 9316 v.Aux = s 9317 v.AddArg(p) 9318 v.AddArg(w) 9319 v.AddArg(mem) 9320 return true 9321 } 9322 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 9323 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9324 // result: (MOVHstore [i-1] {s} p w0 mem) 9325 for { 9326 i := v.AuxInt 9327 s := v.Aux 9328 p := v.Args[0] 9329 w0 := v.Args[1] 9330 if w0.Op != OpS390XSRWconst { 9331 break 9332 } 9333 j := w0.AuxInt 9334 w := w0.Args[0] 9335 x := v.Args[2] 9336 if x.Op != OpS390XMOVBstore { 9337 break 9338 } 9339 if x.AuxInt != i-1 { 9340 break 9341 } 9342 if x.Aux != s { 9343 break 9344 } 9345 if p != x.Args[0] { 9346 break 9347 } 9348 x_1 := x.Args[1] 9349 if x_1.Op != OpS390XSRWconst { 9350 break 9351 } 9352 if x_1.AuxInt != j+8 { 9353 break 9354 } 9355 if w != x_1.Args[0] { 9356 break 9357 } 9358 mem := x.Args[2] 9359 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9360 break 9361 } 9362 v.reset(OpS390XMOVHstore) 9363 v.AuxInt = i - 1 9364 v.Aux = s 9365 v.AddArg(p) 9366 v.AddArg(w0) 9367 v.AddArg(mem) 9368 return true 9369 } 9370 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9371 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9372 // result: (MOVHBRstore [i-1] {s} p w mem) 9373 for { 9374 i := v.AuxInt 9375 s := v.Aux 9376 p := v.Args[0] 9377 v_1 := v.Args[1] 9378 if v_1.Op != OpS390XSRDconst { 9379 break 9380 } 9381 if v_1.AuxInt != 8 { 9382 break 9383 } 9384 w := v_1.Args[0] 9385 x := v.Args[2] 9386 if x.Op != OpS390XMOVBstore { 9387 break 9388 } 9389 if x.AuxInt != i-1 { 9390 break 9391 } 9392 if x.Aux != s { 9393 break 9394 } 9395 if p != x.Args[0] { 9396 break 9397 } 9398 if w != x.Args[1] { 9399 break 9400 } 9401 mem := x.Args[2] 9402 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9403 break 9404 } 9405 v.reset(OpS390XMOVHBRstore) 9406 v.AuxInt = i - 1 9407 v.Aux = s 9408 v.AddArg(p) 9409 v.AddArg(w) 9410 v.AddArg(mem) 9411 return true 9412 } 9413 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 9414 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9415 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9416 for { 9417 i := v.AuxInt 9418 s := v.Aux 9419 p := v.Args[0] 9420 v_1 := v.Args[1] 9421 if v_1.Op != OpS390XSRDconst { 9422 break 9423 } 9424 j := v_1.AuxInt 9425 w := v_1.Args[0] 9426 x := v.Args[2] 9427 if x.Op != OpS390XMOVBstore { 9428 break 9429 } 9430 if x.AuxInt != i-1 { 9431 break 9432 } 9433 if x.Aux != s { 9434 break 9435 } 9436 if p != x.Args[0] { 9437 break 9438 } 9439 w0 := x.Args[1] 9440 if w0.Op != OpS390XSRDconst { 9441 break 9442 } 9443 if w0.AuxInt != j-8 { 9444 break 9445 } 9446 if w != w0.Args[0] { 9447 break 9448 } 9449 mem := x.Args[2] 9450 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9451 break 9452 } 9453 v.reset(OpS390XMOVHBRstore) 9454 v.AuxInt = i - 1 9455 v.Aux = s 9456 v.AddArg(p) 9457 v.AddArg(w0) 9458 v.AddArg(mem) 9459 return true 9460 } 9461 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9462 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9463 // result: (MOVHBRstore [i-1] {s} p w mem) 9464 for { 9465 i := v.AuxInt 9466 s := v.Aux 9467 p := v.Args[0] 9468 v_1 := v.Args[1] 9469 if v_1.Op != OpS390XSRWconst { 9470 break 9471 } 9472 if v_1.AuxInt != 8 { 9473 break 9474 } 9475 w := v_1.Args[0] 9476 x := v.Args[2] 9477 if x.Op != OpS390XMOVBstore { 9478 break 9479 } 9480 if x.AuxInt != i-1 { 9481 break 9482 } 9483 if x.Aux != s { 9484 break 9485 } 9486 if p != x.Args[0] { 9487 break 9488 } 9489 if w != x.Args[1] { 9490 break 9491 } 9492 mem := x.Args[2] 9493 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9494 break 9495 } 9496 v.reset(OpS390XMOVHBRstore) 9497 v.AuxInt = i - 1 9498 v.Aux = s 9499 v.AddArg(p) 9500 v.AddArg(w) 9501 v.AddArg(mem) 9502 return true 9503 } 9504 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 9505 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9506 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9507 for { 9508 i := v.AuxInt 9509 s := v.Aux 9510 p := v.Args[0] 9511 v_1 := v.Args[1] 9512 if v_1.Op != OpS390XSRWconst { 9513 break 9514 } 9515 j := v_1.AuxInt 9516 w := v_1.Args[0] 9517 x := v.Args[2] 9518 if x.Op != OpS390XMOVBstore { 9519 break 9520 } 9521 if x.AuxInt != i-1 { 9522 break 9523 } 9524 if x.Aux != s { 9525 break 9526 } 9527 if p != x.Args[0] { 9528 break 9529 } 9530 w0 := x.Args[1] 9531 if w0.Op != OpS390XSRWconst { 9532 break 9533 } 9534 if w0.AuxInt != j-8 { 9535 break 9536 } 9537 if w != w0.Args[0] { 9538 break 9539 } 9540 mem := x.Args[2] 9541 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9542 break 9543 } 9544 v.reset(OpS390XMOVHBRstore) 9545 v.AuxInt = i - 1 9546 v.Aux = s 9547 v.AddArg(p) 9548 v.AddArg(w0) 9549 v.AddArg(mem) 9550 return true 9551 } 9552 return false 9553 } 9554 func rewriteValueS390X_OpS390XMOVBstoreconst(v *Value) bool { 9555 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 9556 // cond: ValAndOff(sc).canAdd(off) 9557 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 9558 for { 9559 sc := v.AuxInt 9560 s := v.Aux 9561 v_0 := v.Args[0] 9562 if v_0.Op != OpS390XADDconst { 9563 break 9564 } 9565 off := v_0.AuxInt 9566 ptr := v_0.Args[0] 9567 mem := v.Args[1] 9568 if !(ValAndOff(sc).canAdd(off)) { 9569 break 9570 } 9571 v.reset(OpS390XMOVBstoreconst) 9572 v.AuxInt = ValAndOff(sc).add(off) 9573 v.Aux = s 9574 v.AddArg(ptr) 9575 v.AddArg(mem) 9576 return true 9577 } 9578 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 9579 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 9580 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 9581 for { 9582 sc := v.AuxInt 9583 sym1 := v.Aux 9584 v_0 := v.Args[0] 9585 if v_0.Op != OpS390XMOVDaddr { 9586 break 9587 } 9588 off := v_0.AuxInt 9589 sym2 := v_0.Aux 9590 ptr := v_0.Args[0] 9591 mem := v.Args[1] 9592 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 9593 break 9594 } 9595 v.reset(OpS390XMOVBstoreconst) 9596 v.AuxInt = ValAndOff(sc).add(off) 9597 v.Aux = mergeSym(sym1, sym2) 9598 v.AddArg(ptr) 9599 v.AddArg(mem) 9600 return true 9601 } 9602 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 9603 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 9604 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 9605 for { 9606 c := v.AuxInt 9607 s := v.Aux 9608 p := v.Args[0] 9609 x := v.Args[1] 9610 if x.Op != OpS390XMOVBstoreconst { 9611 break 9612 } 9613 a := x.AuxInt 9614 if x.Aux != s { 9615 break 9616 } 9617 if p != x.Args[0] { 9618 break 9619 } 9620 mem := x.Args[1] 9621 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 9622 break 9623 } 9624 v.reset(OpS390XMOVHstoreconst) 9625 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 9626 v.Aux = s 9627 v.AddArg(p) 9628 v.AddArg(mem) 9629 return true 9630 } 9631 return false 9632 } 9633 func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { 9634 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 9635 // cond: 9636 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9637 for { 9638 c := v.AuxInt 9639 sym := v.Aux 9640 v_0 := v.Args[0] 9641 if v_0.Op != OpS390XADDconst { 9642 break 9643 } 9644 d := v_0.AuxInt 9645 ptr := v_0.Args[0] 9646 idx := v.Args[1] 9647 val := v.Args[2] 9648 mem := v.Args[3] 9649 v.reset(OpS390XMOVBstoreidx) 9650 v.AuxInt = c + d 9651 v.Aux = sym 9652 v.AddArg(ptr) 9653 v.AddArg(idx) 9654 v.AddArg(val) 9655 v.AddArg(mem) 9656 return true 9657 } 9658 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 9659 // cond: 9660 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9661 for { 9662 c := v.AuxInt 9663 sym := v.Aux 9664 idx := v.Args[0] 9665 v_1 := v.Args[1] 9666 if v_1.Op != OpS390XADDconst { 9667 break 9668 } 9669 d := v_1.AuxInt 9670 ptr := v_1.Args[0] 9671 val := v.Args[2] 9672 mem := v.Args[3] 9673 v.reset(OpS390XMOVBstoreidx) 9674 v.AuxInt = c + d 9675 v.Aux = sym 9676 v.AddArg(ptr) 9677 v.AddArg(idx) 9678 v.AddArg(val) 9679 v.AddArg(mem) 9680 return true 9681 } 9682 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 9683 // cond: 9684 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9685 for { 9686 c := v.AuxInt 9687 sym := v.Aux 9688 ptr := v.Args[0] 9689 v_1 := v.Args[1] 9690 if v_1.Op != OpS390XADDconst { 9691 break 9692 } 9693 d := v_1.AuxInt 9694 idx := v_1.Args[0] 9695 val := v.Args[2] 9696 mem := v.Args[3] 9697 v.reset(OpS390XMOVBstoreidx) 9698 v.AuxInt = c + d 9699 v.Aux = sym 9700 v.AddArg(ptr) 9701 v.AddArg(idx) 9702 v.AddArg(val) 9703 v.AddArg(mem) 9704 return true 9705 } 9706 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 9707 // cond: 9708 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9709 for { 9710 c := v.AuxInt 9711 sym := v.Aux 9712 v_0 := v.Args[0] 9713 if v_0.Op != OpS390XADDconst { 9714 break 9715 } 9716 d := v_0.AuxInt 9717 idx := v_0.Args[0] 9718 ptr := v.Args[1] 9719 val := v.Args[2] 9720 mem := v.Args[3] 9721 v.reset(OpS390XMOVBstoreidx) 9722 v.AuxInt = c + d 9723 v.Aux = sym 9724 v.AddArg(ptr) 9725 v.AddArg(idx) 9726 v.AddArg(val) 9727 v.AddArg(mem) 9728 return true 9729 } 9730 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 9731 // cond: x.Uses == 1 && clobber(x) 9732 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9733 for { 9734 i := v.AuxInt 9735 s := v.Aux 9736 p := v.Args[0] 9737 idx := v.Args[1] 9738 w := v.Args[2] 9739 x := v.Args[3] 9740 if x.Op != OpS390XMOVBstoreidx { 9741 break 9742 } 9743 if x.AuxInt != i-1 { 9744 break 9745 } 9746 if x.Aux != s { 9747 break 9748 } 9749 if p != x.Args[0] { 9750 break 9751 } 9752 if idx != x.Args[1] { 9753 break 9754 } 9755 x_2 := x.Args[2] 9756 if x_2.Op != OpS390XSRDconst { 9757 break 9758 } 9759 if x_2.AuxInt != 8 { 9760 break 9761 } 9762 if w != x_2.Args[0] { 9763 break 9764 } 9765 mem := x.Args[3] 9766 if !(x.Uses == 1 && clobber(x)) { 9767 break 9768 } 9769 v.reset(OpS390XMOVHstoreidx) 9770 v.AuxInt = i - 1 9771 v.Aux = s 9772 v.AddArg(p) 9773 v.AddArg(idx) 9774 v.AddArg(w) 9775 v.AddArg(mem) 9776 return true 9777 } 9778 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 9779 // cond: x.Uses == 1 && clobber(x) 9780 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9781 for { 9782 i := v.AuxInt 9783 s := v.Aux 9784 p := v.Args[0] 9785 idx := v.Args[1] 9786 w := v.Args[2] 9787 x := v.Args[3] 9788 if x.Op != OpS390XMOVBstoreidx { 9789 break 9790 } 9791 if x.AuxInt != i-1 { 9792 break 9793 } 9794 if x.Aux != s { 9795 break 9796 } 9797 if idx != x.Args[0] { 9798 break 9799 } 9800 if p != x.Args[1] { 9801 break 9802 } 9803 x_2 := x.Args[2] 9804 if x_2.Op != OpS390XSRDconst { 9805 break 9806 } 9807 if x_2.AuxInt != 8 { 9808 break 9809 } 9810 if w != x_2.Args[0] { 9811 break 9812 } 9813 mem := x.Args[3] 9814 if !(x.Uses == 1 && clobber(x)) { 9815 break 9816 } 9817 v.reset(OpS390XMOVHstoreidx) 9818 v.AuxInt = i - 1 9819 v.Aux = s 9820 v.AddArg(p) 9821 v.AddArg(idx) 9822 v.AddArg(w) 9823 v.AddArg(mem) 9824 return true 9825 } 9826 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 9827 // cond: x.Uses == 1 && clobber(x) 9828 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9829 for { 9830 i := v.AuxInt 9831 s := v.Aux 9832 idx := v.Args[0] 9833 p := v.Args[1] 9834 w := v.Args[2] 9835 x := v.Args[3] 9836 if x.Op != OpS390XMOVBstoreidx { 9837 break 9838 } 9839 if x.AuxInt != i-1 { 9840 break 9841 } 9842 if x.Aux != s { 9843 break 9844 } 9845 if p != x.Args[0] { 9846 break 9847 } 9848 if idx != x.Args[1] { 9849 break 9850 } 9851 x_2 := x.Args[2] 9852 if x_2.Op != OpS390XSRDconst { 9853 break 9854 } 9855 if x_2.AuxInt != 8 { 9856 break 9857 } 9858 if w != x_2.Args[0] { 9859 break 9860 } 9861 mem := x.Args[3] 9862 if !(x.Uses == 1 && clobber(x)) { 9863 break 9864 } 9865 v.reset(OpS390XMOVHstoreidx) 9866 v.AuxInt = i - 1 9867 v.Aux = s 9868 v.AddArg(p) 9869 v.AddArg(idx) 9870 v.AddArg(w) 9871 v.AddArg(mem) 9872 return true 9873 } 9874 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 9875 // cond: x.Uses == 1 && clobber(x) 9876 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9877 for { 9878 i := v.AuxInt 9879 s := v.Aux 9880 idx := v.Args[0] 9881 p := v.Args[1] 9882 w := v.Args[2] 9883 x := v.Args[3] 9884 if x.Op != OpS390XMOVBstoreidx { 9885 break 9886 } 9887 if x.AuxInt != i-1 { 9888 break 9889 } 9890 if x.Aux != s { 9891 break 9892 } 9893 if idx != x.Args[0] { 9894 break 9895 } 9896 if p != x.Args[1] { 9897 break 9898 } 9899 x_2 := x.Args[2] 9900 if x_2.Op != OpS390XSRDconst { 9901 break 9902 } 9903 if x_2.AuxInt != 8 { 9904 break 9905 } 9906 if w != x_2.Args[0] { 9907 break 9908 } 9909 mem := x.Args[3] 9910 if !(x.Uses == 1 && clobber(x)) { 9911 break 9912 } 9913 v.reset(OpS390XMOVHstoreidx) 9914 v.AuxInt = i - 1 9915 v.Aux = s 9916 v.AddArg(p) 9917 v.AddArg(idx) 9918 v.AddArg(w) 9919 v.AddArg(mem) 9920 return true 9921 } 9922 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 9923 // cond: x.Uses == 1 && clobber(x) 9924 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 9925 for { 9926 i := v.AuxInt 9927 s := v.Aux 9928 p := v.Args[0] 9929 idx := v.Args[1] 9930 w0 := v.Args[2] 9931 if w0.Op != OpS390XSRDconst { 9932 break 9933 } 9934 j := w0.AuxInt 9935 w := w0.Args[0] 9936 x := v.Args[3] 9937 if x.Op != OpS390XMOVBstoreidx { 9938 break 9939 } 9940 if x.AuxInt != i-1 { 9941 break 9942 } 9943 if x.Aux != s { 9944 break 9945 } 9946 if p != x.Args[0] { 9947 break 9948 } 9949 if idx != x.Args[1] { 9950 break 9951 } 9952 x_2 := x.Args[2] 9953 if x_2.Op != OpS390XSRDconst { 9954 break 9955 } 9956 if x_2.AuxInt != j+8 { 9957 break 9958 } 9959 if w != x_2.Args[0] { 9960 break 9961 } 9962 mem := x.Args[3] 9963 if !(x.Uses == 1 && clobber(x)) { 9964 break 9965 } 9966 v.reset(OpS390XMOVHstoreidx) 9967 v.AuxInt = i - 1 9968 v.Aux = s 9969 v.AddArg(p) 9970 v.AddArg(idx) 9971 v.AddArg(w0) 9972 v.AddArg(mem) 9973 return true 9974 } 9975 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 9976 // cond: x.Uses == 1 && clobber(x) 9977 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 9978 for { 9979 i := v.AuxInt 9980 s := v.Aux 9981 p := v.Args[0] 9982 idx := v.Args[1] 9983 w0 := v.Args[2] 9984 if w0.Op != OpS390XSRDconst { 9985 break 9986 } 9987 j := w0.AuxInt 9988 w := w0.Args[0] 9989 x := v.Args[3] 9990 if x.Op != OpS390XMOVBstoreidx { 9991 break 9992 } 9993 if x.AuxInt != i-1 { 9994 break 9995 } 9996 if x.Aux != s { 9997 break 9998 } 9999 if idx != x.Args[0] { 10000 break 10001 } 10002 if p != x.Args[1] { 10003 break 10004 } 10005 x_2 := x.Args[2] 10006 if x_2.Op != OpS390XSRDconst { 10007 break 10008 } 10009 if x_2.AuxInt != j+8 { 10010 break 10011 } 10012 if w != x_2.Args[0] { 10013 break 10014 } 10015 mem := x.Args[3] 10016 if !(x.Uses == 1 && clobber(x)) { 10017 break 10018 } 10019 v.reset(OpS390XMOVHstoreidx) 10020 v.AuxInt = i - 1 10021 v.Aux = s 10022 v.AddArg(p) 10023 v.AddArg(idx) 10024 v.AddArg(w0) 10025 v.AddArg(mem) 10026 return true 10027 } 10028 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 10029 // cond: x.Uses == 1 && clobber(x) 10030 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10031 for { 10032 i := v.AuxInt 10033 s := v.Aux 10034 idx := v.Args[0] 10035 p := v.Args[1] 10036 w0 := v.Args[2] 10037 if w0.Op != OpS390XSRDconst { 10038 break 10039 } 10040 j := w0.AuxInt 10041 w := w0.Args[0] 10042 x := v.Args[3] 10043 if x.Op != OpS390XMOVBstoreidx { 10044 break 10045 } 10046 if x.AuxInt != i-1 { 10047 break 10048 } 10049 if x.Aux != s { 10050 break 10051 } 10052 if p != x.Args[0] { 10053 break 10054 } 10055 if idx != x.Args[1] { 10056 break 10057 } 10058 x_2 := x.Args[2] 10059 if x_2.Op != OpS390XSRDconst { 10060 break 10061 } 10062 if x_2.AuxInt != j+8 { 10063 break 10064 } 10065 if w != x_2.Args[0] { 10066 break 10067 } 10068 mem := x.Args[3] 10069 if !(x.Uses == 1 && clobber(x)) { 10070 break 10071 } 10072 v.reset(OpS390XMOVHstoreidx) 10073 v.AuxInt = i - 1 10074 v.Aux = s 10075 v.AddArg(p) 10076 v.AddArg(idx) 10077 v.AddArg(w0) 10078 v.AddArg(mem) 10079 return true 10080 } 10081 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10082 // cond: x.Uses == 1 && clobber(x) 10083 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10084 for { 10085 i := v.AuxInt 10086 s := v.Aux 10087 idx := v.Args[0] 10088 p := v.Args[1] 10089 w0 := v.Args[2] 10090 if w0.Op != OpS390XSRDconst { 10091 break 10092 } 10093 j := w0.AuxInt 10094 w := w0.Args[0] 10095 x := v.Args[3] 10096 if x.Op != OpS390XMOVBstoreidx { 10097 break 10098 } 10099 if x.AuxInt != i-1 { 10100 break 10101 } 10102 if x.Aux != s { 10103 break 10104 } 10105 if idx != x.Args[0] { 10106 break 10107 } 10108 if p != x.Args[1] { 10109 break 10110 } 10111 x_2 := x.Args[2] 10112 if x_2.Op != OpS390XSRDconst { 10113 break 10114 } 10115 if x_2.AuxInt != j+8 { 10116 break 10117 } 10118 if w != x_2.Args[0] { 10119 break 10120 } 10121 mem := x.Args[3] 10122 if !(x.Uses == 1 && clobber(x)) { 10123 break 10124 } 10125 v.reset(OpS390XMOVHstoreidx) 10126 v.AuxInt = i - 1 10127 v.Aux = s 10128 v.AddArg(p) 10129 v.AddArg(idx) 10130 v.AddArg(w0) 10131 v.AddArg(mem) 10132 return true 10133 } 10134 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10135 // cond: x.Uses == 1 && clobber(x) 10136 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10137 for { 10138 i := v.AuxInt 10139 s := v.Aux 10140 p := v.Args[0] 10141 idx := v.Args[1] 10142 w := v.Args[2] 10143 x := v.Args[3] 10144 if x.Op != OpS390XMOVBstoreidx { 10145 break 10146 } 10147 if x.AuxInt != i-1 { 10148 break 10149 } 10150 if x.Aux != s { 10151 break 10152 } 10153 if p != x.Args[0] { 10154 break 10155 } 10156 if idx != x.Args[1] { 10157 break 10158 } 10159 x_2 := x.Args[2] 10160 if x_2.Op != OpS390XSRWconst { 10161 break 10162 } 10163 if x_2.AuxInt != 8 { 10164 break 10165 } 10166 if w != x_2.Args[0] { 10167 break 10168 } 10169 mem := x.Args[3] 10170 if !(x.Uses == 1 && clobber(x)) { 10171 break 10172 } 10173 v.reset(OpS390XMOVHstoreidx) 10174 v.AuxInt = i - 1 10175 v.Aux = s 10176 v.AddArg(p) 10177 v.AddArg(idx) 10178 v.AddArg(w) 10179 v.AddArg(mem) 10180 return true 10181 } 10182 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10183 // cond: x.Uses == 1 && clobber(x) 10184 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10185 for { 10186 i := v.AuxInt 10187 s := v.Aux 10188 p := v.Args[0] 10189 idx := v.Args[1] 10190 w := v.Args[2] 10191 x := v.Args[3] 10192 if x.Op != OpS390XMOVBstoreidx { 10193 break 10194 } 10195 if x.AuxInt != i-1 { 10196 break 10197 } 10198 if x.Aux != s { 10199 break 10200 } 10201 if idx != x.Args[0] { 10202 break 10203 } 10204 if p != x.Args[1] { 10205 break 10206 } 10207 x_2 := x.Args[2] 10208 if x_2.Op != OpS390XSRWconst { 10209 break 10210 } 10211 if x_2.AuxInt != 8 { 10212 break 10213 } 10214 if w != x_2.Args[0] { 10215 break 10216 } 10217 mem := x.Args[3] 10218 if !(x.Uses == 1 && clobber(x)) { 10219 break 10220 } 10221 v.reset(OpS390XMOVHstoreidx) 10222 v.AuxInt = i - 1 10223 v.Aux = s 10224 v.AddArg(p) 10225 v.AddArg(idx) 10226 v.AddArg(w) 10227 v.AddArg(mem) 10228 return true 10229 } 10230 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10231 // cond: x.Uses == 1 && clobber(x) 10232 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10233 for { 10234 i := v.AuxInt 10235 s := v.Aux 10236 idx := v.Args[0] 10237 p := v.Args[1] 10238 w := v.Args[2] 10239 x := v.Args[3] 10240 if x.Op != OpS390XMOVBstoreidx { 10241 break 10242 } 10243 if x.AuxInt != i-1 { 10244 break 10245 } 10246 if x.Aux != s { 10247 break 10248 } 10249 if p != x.Args[0] { 10250 break 10251 } 10252 if idx != x.Args[1] { 10253 break 10254 } 10255 x_2 := x.Args[2] 10256 if x_2.Op != OpS390XSRWconst { 10257 break 10258 } 10259 if x_2.AuxInt != 8 { 10260 break 10261 } 10262 if w != x_2.Args[0] { 10263 break 10264 } 10265 mem := x.Args[3] 10266 if !(x.Uses == 1 && clobber(x)) { 10267 break 10268 } 10269 v.reset(OpS390XMOVHstoreidx) 10270 v.AuxInt = i - 1 10271 v.Aux = s 10272 v.AddArg(p) 10273 v.AddArg(idx) 10274 v.AddArg(w) 10275 v.AddArg(mem) 10276 return true 10277 } 10278 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10279 // cond: x.Uses == 1 && clobber(x) 10280 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10281 for { 10282 i := v.AuxInt 10283 s := v.Aux 10284 idx := v.Args[0] 10285 p := v.Args[1] 10286 w := v.Args[2] 10287 x := v.Args[3] 10288 if x.Op != OpS390XMOVBstoreidx { 10289 break 10290 } 10291 if x.AuxInt != i-1 { 10292 break 10293 } 10294 if x.Aux != s { 10295 break 10296 } 10297 if idx != x.Args[0] { 10298 break 10299 } 10300 if p != x.Args[1] { 10301 break 10302 } 10303 x_2 := x.Args[2] 10304 if x_2.Op != OpS390XSRWconst { 10305 break 10306 } 10307 if x_2.AuxInt != 8 { 10308 break 10309 } 10310 if w != x_2.Args[0] { 10311 break 10312 } 10313 mem := x.Args[3] 10314 if !(x.Uses == 1 && clobber(x)) { 10315 break 10316 } 10317 v.reset(OpS390XMOVHstoreidx) 10318 v.AuxInt = i - 1 10319 v.Aux = s 10320 v.AddArg(p) 10321 v.AddArg(idx) 10322 v.AddArg(w) 10323 v.AddArg(mem) 10324 return true 10325 } 10326 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10327 // cond: x.Uses == 1 && clobber(x) 10328 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10329 for { 10330 i := v.AuxInt 10331 s := v.Aux 10332 p := v.Args[0] 10333 idx := v.Args[1] 10334 w0 := v.Args[2] 10335 if w0.Op != OpS390XSRWconst { 10336 break 10337 } 10338 j := w0.AuxInt 10339 w := w0.Args[0] 10340 x := v.Args[3] 10341 if x.Op != OpS390XMOVBstoreidx { 10342 break 10343 } 10344 if x.AuxInt != i-1 { 10345 break 10346 } 10347 if x.Aux != s { 10348 break 10349 } 10350 if p != x.Args[0] { 10351 break 10352 } 10353 if idx != x.Args[1] { 10354 break 10355 } 10356 x_2 := x.Args[2] 10357 if x_2.Op != OpS390XSRWconst { 10358 break 10359 } 10360 if x_2.AuxInt != j+8 { 10361 break 10362 } 10363 if w != x_2.Args[0] { 10364 break 10365 } 10366 mem := x.Args[3] 10367 if !(x.Uses == 1 && clobber(x)) { 10368 break 10369 } 10370 v.reset(OpS390XMOVHstoreidx) 10371 v.AuxInt = i - 1 10372 v.Aux = s 10373 v.AddArg(p) 10374 v.AddArg(idx) 10375 v.AddArg(w0) 10376 v.AddArg(mem) 10377 return true 10378 } 10379 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10380 // cond: x.Uses == 1 && clobber(x) 10381 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10382 for { 10383 i := v.AuxInt 10384 s := v.Aux 10385 p := v.Args[0] 10386 idx := v.Args[1] 10387 w0 := v.Args[2] 10388 if w0.Op != OpS390XSRWconst { 10389 break 10390 } 10391 j := w0.AuxInt 10392 w := w0.Args[0] 10393 x := v.Args[3] 10394 if x.Op != OpS390XMOVBstoreidx { 10395 break 10396 } 10397 if x.AuxInt != i-1 { 10398 break 10399 } 10400 if x.Aux != s { 10401 break 10402 } 10403 if idx != x.Args[0] { 10404 break 10405 } 10406 if p != x.Args[1] { 10407 break 10408 } 10409 x_2 := x.Args[2] 10410 if x_2.Op != OpS390XSRWconst { 10411 break 10412 } 10413 if x_2.AuxInt != j+8 { 10414 break 10415 } 10416 if w != x_2.Args[0] { 10417 break 10418 } 10419 mem := x.Args[3] 10420 if !(x.Uses == 1 && clobber(x)) { 10421 break 10422 } 10423 v.reset(OpS390XMOVHstoreidx) 10424 v.AuxInt = i - 1 10425 v.Aux = s 10426 v.AddArg(p) 10427 v.AddArg(idx) 10428 v.AddArg(w0) 10429 v.AddArg(mem) 10430 return true 10431 } 10432 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10433 // cond: x.Uses == 1 && clobber(x) 10434 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10435 for { 10436 i := v.AuxInt 10437 s := v.Aux 10438 idx := v.Args[0] 10439 p := v.Args[1] 10440 w0 := v.Args[2] 10441 if w0.Op != OpS390XSRWconst { 10442 break 10443 } 10444 j := w0.AuxInt 10445 w := w0.Args[0] 10446 x := v.Args[3] 10447 if x.Op != OpS390XMOVBstoreidx { 10448 break 10449 } 10450 if x.AuxInt != i-1 { 10451 break 10452 } 10453 if x.Aux != s { 10454 break 10455 } 10456 if p != x.Args[0] { 10457 break 10458 } 10459 if idx != x.Args[1] { 10460 break 10461 } 10462 x_2 := x.Args[2] 10463 if x_2.Op != OpS390XSRWconst { 10464 break 10465 } 10466 if x_2.AuxInt != j+8 { 10467 break 10468 } 10469 if w != x_2.Args[0] { 10470 break 10471 } 10472 mem := x.Args[3] 10473 if !(x.Uses == 1 && clobber(x)) { 10474 break 10475 } 10476 v.reset(OpS390XMOVHstoreidx) 10477 v.AuxInt = i - 1 10478 v.Aux = s 10479 v.AddArg(p) 10480 v.AddArg(idx) 10481 v.AddArg(w0) 10482 v.AddArg(mem) 10483 return true 10484 } 10485 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10486 // cond: x.Uses == 1 && clobber(x) 10487 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10488 for { 10489 i := v.AuxInt 10490 s := v.Aux 10491 idx := v.Args[0] 10492 p := v.Args[1] 10493 w0 := v.Args[2] 10494 if w0.Op != OpS390XSRWconst { 10495 break 10496 } 10497 j := w0.AuxInt 10498 w := w0.Args[0] 10499 x := v.Args[3] 10500 if x.Op != OpS390XMOVBstoreidx { 10501 break 10502 } 10503 if x.AuxInt != i-1 { 10504 break 10505 } 10506 if x.Aux != s { 10507 break 10508 } 10509 if idx != x.Args[0] { 10510 break 10511 } 10512 if p != x.Args[1] { 10513 break 10514 } 10515 x_2 := x.Args[2] 10516 if x_2.Op != OpS390XSRWconst { 10517 break 10518 } 10519 if x_2.AuxInt != j+8 { 10520 break 10521 } 10522 if w != x_2.Args[0] { 10523 break 10524 } 10525 mem := x.Args[3] 10526 if !(x.Uses == 1 && clobber(x)) { 10527 break 10528 } 10529 v.reset(OpS390XMOVHstoreidx) 10530 v.AuxInt = i - 1 10531 v.Aux = s 10532 v.AddArg(p) 10533 v.AddArg(idx) 10534 v.AddArg(w0) 10535 v.AddArg(mem) 10536 return true 10537 } 10538 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10539 // cond: x.Uses == 1 && clobber(x) 10540 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10541 for { 10542 i := v.AuxInt 10543 s := v.Aux 10544 p := v.Args[0] 10545 idx := v.Args[1] 10546 v_2 := v.Args[2] 10547 if v_2.Op != OpS390XSRDconst { 10548 break 10549 } 10550 if v_2.AuxInt != 8 { 10551 break 10552 } 10553 w := v_2.Args[0] 10554 x := v.Args[3] 10555 if x.Op != OpS390XMOVBstoreidx { 10556 break 10557 } 10558 if x.AuxInt != i-1 { 10559 break 10560 } 10561 if x.Aux != s { 10562 break 10563 } 10564 if p != x.Args[0] { 10565 break 10566 } 10567 if idx != x.Args[1] { 10568 break 10569 } 10570 if w != x.Args[2] { 10571 break 10572 } 10573 mem := x.Args[3] 10574 if !(x.Uses == 1 && clobber(x)) { 10575 break 10576 } 10577 v.reset(OpS390XMOVHBRstoreidx) 10578 v.AuxInt = i - 1 10579 v.Aux = s 10580 v.AddArg(p) 10581 v.AddArg(idx) 10582 v.AddArg(w) 10583 v.AddArg(mem) 10584 return true 10585 } 10586 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 10587 // cond: x.Uses == 1 && clobber(x) 10588 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10589 for { 10590 i := v.AuxInt 10591 s := v.Aux 10592 p := v.Args[0] 10593 idx := v.Args[1] 10594 v_2 := v.Args[2] 10595 if v_2.Op != OpS390XSRDconst { 10596 break 10597 } 10598 if v_2.AuxInt != 8 { 10599 break 10600 } 10601 w := v_2.Args[0] 10602 x := v.Args[3] 10603 if x.Op != OpS390XMOVBstoreidx { 10604 break 10605 } 10606 if x.AuxInt != i-1 { 10607 break 10608 } 10609 if x.Aux != s { 10610 break 10611 } 10612 if idx != x.Args[0] { 10613 break 10614 } 10615 if p != x.Args[1] { 10616 break 10617 } 10618 if w != x.Args[2] { 10619 break 10620 } 10621 mem := x.Args[3] 10622 if !(x.Uses == 1 && clobber(x)) { 10623 break 10624 } 10625 v.reset(OpS390XMOVHBRstoreidx) 10626 v.AuxInt = i - 1 10627 v.Aux = s 10628 v.AddArg(p) 10629 v.AddArg(idx) 10630 v.AddArg(w) 10631 v.AddArg(mem) 10632 return true 10633 } 10634 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10635 // cond: x.Uses == 1 && clobber(x) 10636 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10637 for { 10638 i := v.AuxInt 10639 s := v.Aux 10640 idx := v.Args[0] 10641 p := v.Args[1] 10642 v_2 := v.Args[2] 10643 if v_2.Op != OpS390XSRDconst { 10644 break 10645 } 10646 if v_2.AuxInt != 8 { 10647 break 10648 } 10649 w := v_2.Args[0] 10650 x := v.Args[3] 10651 if x.Op != OpS390XMOVBstoreidx { 10652 break 10653 } 10654 if x.AuxInt != i-1 { 10655 break 10656 } 10657 if x.Aux != s { 10658 break 10659 } 10660 if p != x.Args[0] { 10661 break 10662 } 10663 if idx != x.Args[1] { 10664 break 10665 } 10666 if w != x.Args[2] { 10667 break 10668 } 10669 mem := x.Args[3] 10670 if !(x.Uses == 1 && clobber(x)) { 10671 break 10672 } 10673 v.reset(OpS390XMOVHBRstoreidx) 10674 v.AuxInt = i - 1 10675 v.Aux = s 10676 v.AddArg(p) 10677 v.AddArg(idx) 10678 v.AddArg(w) 10679 v.AddArg(mem) 10680 return true 10681 } 10682 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 10683 // cond: x.Uses == 1 && clobber(x) 10684 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10685 for { 10686 i := v.AuxInt 10687 s := v.Aux 10688 idx := v.Args[0] 10689 p := v.Args[1] 10690 v_2 := v.Args[2] 10691 if v_2.Op != OpS390XSRDconst { 10692 break 10693 } 10694 if v_2.AuxInt != 8 { 10695 break 10696 } 10697 w := v_2.Args[0] 10698 x := v.Args[3] 10699 if x.Op != OpS390XMOVBstoreidx { 10700 break 10701 } 10702 if x.AuxInt != i-1 { 10703 break 10704 } 10705 if x.Aux != s { 10706 break 10707 } 10708 if idx != x.Args[0] { 10709 break 10710 } 10711 if p != x.Args[1] { 10712 break 10713 } 10714 if w != x.Args[2] { 10715 break 10716 } 10717 mem := x.Args[3] 10718 if !(x.Uses == 1 && clobber(x)) { 10719 break 10720 } 10721 v.reset(OpS390XMOVHBRstoreidx) 10722 v.AuxInt = i - 1 10723 v.Aux = s 10724 v.AddArg(p) 10725 v.AddArg(idx) 10726 v.AddArg(w) 10727 v.AddArg(mem) 10728 return true 10729 } 10730 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 10731 // cond: x.Uses == 1 && clobber(x) 10732 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10733 for { 10734 i := v.AuxInt 10735 s := v.Aux 10736 p := v.Args[0] 10737 idx := v.Args[1] 10738 v_2 := v.Args[2] 10739 if v_2.Op != OpS390XSRDconst { 10740 break 10741 } 10742 j := v_2.AuxInt 10743 w := v_2.Args[0] 10744 x := v.Args[3] 10745 if x.Op != OpS390XMOVBstoreidx { 10746 break 10747 } 10748 if x.AuxInt != i-1 { 10749 break 10750 } 10751 if x.Aux != s { 10752 break 10753 } 10754 if p != x.Args[0] { 10755 break 10756 } 10757 if idx != x.Args[1] { 10758 break 10759 } 10760 w0 := x.Args[2] 10761 if w0.Op != OpS390XSRDconst { 10762 break 10763 } 10764 if w0.AuxInt != j-8 { 10765 break 10766 } 10767 if w != w0.Args[0] { 10768 break 10769 } 10770 mem := x.Args[3] 10771 if !(x.Uses == 1 && clobber(x)) { 10772 break 10773 } 10774 v.reset(OpS390XMOVHBRstoreidx) 10775 v.AuxInt = i - 1 10776 v.Aux = s 10777 v.AddArg(p) 10778 v.AddArg(idx) 10779 v.AddArg(w0) 10780 v.AddArg(mem) 10781 return true 10782 } 10783 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 10784 // cond: x.Uses == 1 && clobber(x) 10785 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10786 for { 10787 i := v.AuxInt 10788 s := v.Aux 10789 p := v.Args[0] 10790 idx := v.Args[1] 10791 v_2 := v.Args[2] 10792 if v_2.Op != OpS390XSRDconst { 10793 break 10794 } 10795 j := v_2.AuxInt 10796 w := v_2.Args[0] 10797 x := v.Args[3] 10798 if x.Op != OpS390XMOVBstoreidx { 10799 break 10800 } 10801 if x.AuxInt != i-1 { 10802 break 10803 } 10804 if x.Aux != s { 10805 break 10806 } 10807 if idx != x.Args[0] { 10808 break 10809 } 10810 if p != x.Args[1] { 10811 break 10812 } 10813 w0 := x.Args[2] 10814 if w0.Op != OpS390XSRDconst { 10815 break 10816 } 10817 if w0.AuxInt != j-8 { 10818 break 10819 } 10820 if w != w0.Args[0] { 10821 break 10822 } 10823 mem := x.Args[3] 10824 if !(x.Uses == 1 && clobber(x)) { 10825 break 10826 } 10827 v.reset(OpS390XMOVHBRstoreidx) 10828 v.AuxInt = i - 1 10829 v.Aux = s 10830 v.AddArg(p) 10831 v.AddArg(idx) 10832 v.AddArg(w0) 10833 v.AddArg(mem) 10834 return true 10835 } 10836 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 10837 // cond: x.Uses == 1 && clobber(x) 10838 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10839 for { 10840 i := v.AuxInt 10841 s := v.Aux 10842 idx := v.Args[0] 10843 p := v.Args[1] 10844 v_2 := v.Args[2] 10845 if v_2.Op != OpS390XSRDconst { 10846 break 10847 } 10848 j := v_2.AuxInt 10849 w := v_2.Args[0] 10850 x := v.Args[3] 10851 if x.Op != OpS390XMOVBstoreidx { 10852 break 10853 } 10854 if x.AuxInt != i-1 { 10855 break 10856 } 10857 if x.Aux != s { 10858 break 10859 } 10860 if p != x.Args[0] { 10861 break 10862 } 10863 if idx != x.Args[1] { 10864 break 10865 } 10866 w0 := x.Args[2] 10867 if w0.Op != OpS390XSRDconst { 10868 break 10869 } 10870 if w0.AuxInt != j-8 { 10871 break 10872 } 10873 if w != w0.Args[0] { 10874 break 10875 } 10876 mem := x.Args[3] 10877 if !(x.Uses == 1 && clobber(x)) { 10878 break 10879 } 10880 v.reset(OpS390XMOVHBRstoreidx) 10881 v.AuxInt = i - 1 10882 v.Aux = s 10883 v.AddArg(p) 10884 v.AddArg(idx) 10885 v.AddArg(w0) 10886 v.AddArg(mem) 10887 return true 10888 } 10889 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 10890 // cond: x.Uses == 1 && clobber(x) 10891 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10892 for { 10893 i := v.AuxInt 10894 s := v.Aux 10895 idx := v.Args[0] 10896 p := v.Args[1] 10897 v_2 := v.Args[2] 10898 if v_2.Op != OpS390XSRDconst { 10899 break 10900 } 10901 j := v_2.AuxInt 10902 w := v_2.Args[0] 10903 x := v.Args[3] 10904 if x.Op != OpS390XMOVBstoreidx { 10905 break 10906 } 10907 if x.AuxInt != i-1 { 10908 break 10909 } 10910 if x.Aux != s { 10911 break 10912 } 10913 if idx != x.Args[0] { 10914 break 10915 } 10916 if p != x.Args[1] { 10917 break 10918 } 10919 w0 := x.Args[2] 10920 if w0.Op != OpS390XSRDconst { 10921 break 10922 } 10923 if w0.AuxInt != j-8 { 10924 break 10925 } 10926 if w != w0.Args[0] { 10927 break 10928 } 10929 mem := x.Args[3] 10930 if !(x.Uses == 1 && clobber(x)) { 10931 break 10932 } 10933 v.reset(OpS390XMOVHBRstoreidx) 10934 v.AuxInt = i - 1 10935 v.Aux = s 10936 v.AddArg(p) 10937 v.AddArg(idx) 10938 v.AddArg(w0) 10939 v.AddArg(mem) 10940 return true 10941 } 10942 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10943 // cond: x.Uses == 1 && clobber(x) 10944 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10945 for { 10946 i := v.AuxInt 10947 s := v.Aux 10948 p := v.Args[0] 10949 idx := v.Args[1] 10950 v_2 := v.Args[2] 10951 if v_2.Op != OpS390XSRWconst { 10952 break 10953 } 10954 if v_2.AuxInt != 8 { 10955 break 10956 } 10957 w := v_2.Args[0] 10958 x := v.Args[3] 10959 if x.Op != OpS390XMOVBstoreidx { 10960 break 10961 } 10962 if x.AuxInt != i-1 { 10963 break 10964 } 10965 if x.Aux != s { 10966 break 10967 } 10968 if p != x.Args[0] { 10969 break 10970 } 10971 if idx != x.Args[1] { 10972 break 10973 } 10974 if w != x.Args[2] { 10975 break 10976 } 10977 mem := x.Args[3] 10978 if !(x.Uses == 1 && clobber(x)) { 10979 break 10980 } 10981 v.reset(OpS390XMOVHBRstoreidx) 10982 v.AuxInt = i - 1 10983 v.Aux = s 10984 v.AddArg(p) 10985 v.AddArg(idx) 10986 v.AddArg(w) 10987 v.AddArg(mem) 10988 return true 10989 } 10990 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 10991 // cond: x.Uses == 1 && clobber(x) 10992 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10993 for { 10994 i := v.AuxInt 10995 s := v.Aux 10996 p := v.Args[0] 10997 idx := v.Args[1] 10998 v_2 := v.Args[2] 10999 if v_2.Op != OpS390XSRWconst { 11000 break 11001 } 11002 if v_2.AuxInt != 8 { 11003 break 11004 } 11005 w := v_2.Args[0] 11006 x := v.Args[3] 11007 if x.Op != OpS390XMOVBstoreidx { 11008 break 11009 } 11010 if x.AuxInt != i-1 { 11011 break 11012 } 11013 if x.Aux != s { 11014 break 11015 } 11016 if idx != x.Args[0] { 11017 break 11018 } 11019 if p != x.Args[1] { 11020 break 11021 } 11022 if w != x.Args[2] { 11023 break 11024 } 11025 mem := x.Args[3] 11026 if !(x.Uses == 1 && clobber(x)) { 11027 break 11028 } 11029 v.reset(OpS390XMOVHBRstoreidx) 11030 v.AuxInt = i - 1 11031 v.Aux = s 11032 v.AddArg(p) 11033 v.AddArg(idx) 11034 v.AddArg(w) 11035 v.AddArg(mem) 11036 return true 11037 } 11038 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11039 // cond: x.Uses == 1 && clobber(x) 11040 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11041 for { 11042 i := v.AuxInt 11043 s := v.Aux 11044 idx := v.Args[0] 11045 p := v.Args[1] 11046 v_2 := v.Args[2] 11047 if v_2.Op != OpS390XSRWconst { 11048 break 11049 } 11050 if v_2.AuxInt != 8 { 11051 break 11052 } 11053 w := v_2.Args[0] 11054 x := v.Args[3] 11055 if x.Op != OpS390XMOVBstoreidx { 11056 break 11057 } 11058 if x.AuxInt != i-1 { 11059 break 11060 } 11061 if x.Aux != s { 11062 break 11063 } 11064 if p != x.Args[0] { 11065 break 11066 } 11067 if idx != x.Args[1] { 11068 break 11069 } 11070 if w != x.Args[2] { 11071 break 11072 } 11073 mem := x.Args[3] 11074 if !(x.Uses == 1 && clobber(x)) { 11075 break 11076 } 11077 v.reset(OpS390XMOVHBRstoreidx) 11078 v.AuxInt = i - 1 11079 v.Aux = s 11080 v.AddArg(p) 11081 v.AddArg(idx) 11082 v.AddArg(w) 11083 v.AddArg(mem) 11084 return true 11085 } 11086 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11087 // cond: x.Uses == 1 && clobber(x) 11088 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11089 for { 11090 i := v.AuxInt 11091 s := v.Aux 11092 idx := v.Args[0] 11093 p := v.Args[1] 11094 v_2 := v.Args[2] 11095 if v_2.Op != OpS390XSRWconst { 11096 break 11097 } 11098 if v_2.AuxInt != 8 { 11099 break 11100 } 11101 w := v_2.Args[0] 11102 x := v.Args[3] 11103 if x.Op != OpS390XMOVBstoreidx { 11104 break 11105 } 11106 if x.AuxInt != i-1 { 11107 break 11108 } 11109 if x.Aux != s { 11110 break 11111 } 11112 if idx != x.Args[0] { 11113 break 11114 } 11115 if p != x.Args[1] { 11116 break 11117 } 11118 if w != x.Args[2] { 11119 break 11120 } 11121 mem := x.Args[3] 11122 if !(x.Uses == 1 && clobber(x)) { 11123 break 11124 } 11125 v.reset(OpS390XMOVHBRstoreidx) 11126 v.AuxInt = i - 1 11127 v.Aux = s 11128 v.AddArg(p) 11129 v.AddArg(idx) 11130 v.AddArg(w) 11131 v.AddArg(mem) 11132 return true 11133 } 11134 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11135 // cond: x.Uses == 1 && clobber(x) 11136 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11137 for { 11138 i := v.AuxInt 11139 s := v.Aux 11140 p := v.Args[0] 11141 idx := v.Args[1] 11142 v_2 := v.Args[2] 11143 if v_2.Op != OpS390XSRWconst { 11144 break 11145 } 11146 j := v_2.AuxInt 11147 w := v_2.Args[0] 11148 x := v.Args[3] 11149 if x.Op != OpS390XMOVBstoreidx { 11150 break 11151 } 11152 if x.AuxInt != i-1 { 11153 break 11154 } 11155 if x.Aux != s { 11156 break 11157 } 11158 if p != x.Args[0] { 11159 break 11160 } 11161 if idx != x.Args[1] { 11162 break 11163 } 11164 w0 := x.Args[2] 11165 if w0.Op != OpS390XSRWconst { 11166 break 11167 } 11168 if w0.AuxInt != j-8 { 11169 break 11170 } 11171 if w != w0.Args[0] { 11172 break 11173 } 11174 mem := x.Args[3] 11175 if !(x.Uses == 1 && clobber(x)) { 11176 break 11177 } 11178 v.reset(OpS390XMOVHBRstoreidx) 11179 v.AuxInt = i - 1 11180 v.Aux = s 11181 v.AddArg(p) 11182 v.AddArg(idx) 11183 v.AddArg(w0) 11184 v.AddArg(mem) 11185 return true 11186 } 11187 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11188 // cond: x.Uses == 1 && clobber(x) 11189 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11190 for { 11191 i := v.AuxInt 11192 s := v.Aux 11193 p := v.Args[0] 11194 idx := v.Args[1] 11195 v_2 := v.Args[2] 11196 if v_2.Op != OpS390XSRWconst { 11197 break 11198 } 11199 j := v_2.AuxInt 11200 w := v_2.Args[0] 11201 x := v.Args[3] 11202 if x.Op != OpS390XMOVBstoreidx { 11203 break 11204 } 11205 if x.AuxInt != i-1 { 11206 break 11207 } 11208 if x.Aux != s { 11209 break 11210 } 11211 if idx != x.Args[0] { 11212 break 11213 } 11214 if p != x.Args[1] { 11215 break 11216 } 11217 w0 := x.Args[2] 11218 if w0.Op != OpS390XSRWconst { 11219 break 11220 } 11221 if w0.AuxInt != j-8 { 11222 break 11223 } 11224 if w != w0.Args[0] { 11225 break 11226 } 11227 mem := x.Args[3] 11228 if !(x.Uses == 1 && clobber(x)) { 11229 break 11230 } 11231 v.reset(OpS390XMOVHBRstoreidx) 11232 v.AuxInt = i - 1 11233 v.Aux = s 11234 v.AddArg(p) 11235 v.AddArg(idx) 11236 v.AddArg(w0) 11237 v.AddArg(mem) 11238 return true 11239 } 11240 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11241 // cond: x.Uses == 1 && clobber(x) 11242 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11243 for { 11244 i := v.AuxInt 11245 s := v.Aux 11246 idx := v.Args[0] 11247 p := v.Args[1] 11248 v_2 := v.Args[2] 11249 if v_2.Op != OpS390XSRWconst { 11250 break 11251 } 11252 j := v_2.AuxInt 11253 w := v_2.Args[0] 11254 x := v.Args[3] 11255 if x.Op != OpS390XMOVBstoreidx { 11256 break 11257 } 11258 if x.AuxInt != i-1 { 11259 break 11260 } 11261 if x.Aux != s { 11262 break 11263 } 11264 if p != x.Args[0] { 11265 break 11266 } 11267 if idx != x.Args[1] { 11268 break 11269 } 11270 w0 := x.Args[2] 11271 if w0.Op != OpS390XSRWconst { 11272 break 11273 } 11274 if w0.AuxInt != j-8 { 11275 break 11276 } 11277 if w != w0.Args[0] { 11278 break 11279 } 11280 mem := x.Args[3] 11281 if !(x.Uses == 1 && clobber(x)) { 11282 break 11283 } 11284 v.reset(OpS390XMOVHBRstoreidx) 11285 v.AuxInt = i - 1 11286 v.Aux = s 11287 v.AddArg(p) 11288 v.AddArg(idx) 11289 v.AddArg(w0) 11290 v.AddArg(mem) 11291 return true 11292 } 11293 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11294 // cond: x.Uses == 1 && clobber(x) 11295 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11296 for { 11297 i := v.AuxInt 11298 s := v.Aux 11299 idx := v.Args[0] 11300 p := v.Args[1] 11301 v_2 := v.Args[2] 11302 if v_2.Op != OpS390XSRWconst { 11303 break 11304 } 11305 j := v_2.AuxInt 11306 w := v_2.Args[0] 11307 x := v.Args[3] 11308 if x.Op != OpS390XMOVBstoreidx { 11309 break 11310 } 11311 if x.AuxInt != i-1 { 11312 break 11313 } 11314 if x.Aux != s { 11315 break 11316 } 11317 if idx != x.Args[0] { 11318 break 11319 } 11320 if p != x.Args[1] { 11321 break 11322 } 11323 w0 := x.Args[2] 11324 if w0.Op != OpS390XSRWconst { 11325 break 11326 } 11327 if w0.AuxInt != j-8 { 11328 break 11329 } 11330 if w != w0.Args[0] { 11331 break 11332 } 11333 mem := x.Args[3] 11334 if !(x.Uses == 1 && clobber(x)) { 11335 break 11336 } 11337 v.reset(OpS390XMOVHBRstoreidx) 11338 v.AuxInt = i - 1 11339 v.Aux = s 11340 v.AddArg(p) 11341 v.AddArg(idx) 11342 v.AddArg(w0) 11343 v.AddArg(mem) 11344 return true 11345 } 11346 return false 11347 } 11348 func rewriteValueS390X_OpS390XMOVDEQ(v *Value) bool { 11349 // match: (MOVDEQ x y (InvertFlags cmp)) 11350 // cond: 11351 // result: (MOVDEQ x y cmp) 11352 for { 11353 x := v.Args[0] 11354 y := v.Args[1] 11355 v_2 := v.Args[2] 11356 if v_2.Op != OpS390XInvertFlags { 11357 break 11358 } 11359 cmp := v_2.Args[0] 11360 v.reset(OpS390XMOVDEQ) 11361 v.AddArg(x) 11362 v.AddArg(y) 11363 v.AddArg(cmp) 11364 return true 11365 } 11366 // match: (MOVDEQ _ x (FlagEQ)) 11367 // cond: 11368 // result: x 11369 for { 11370 x := v.Args[1] 11371 v_2 := v.Args[2] 11372 if v_2.Op != OpS390XFlagEQ { 11373 break 11374 } 11375 v.reset(OpCopy) 11376 v.Type = x.Type 11377 v.AddArg(x) 11378 return true 11379 } 11380 // match: (MOVDEQ y _ (FlagLT)) 11381 // cond: 11382 // result: y 11383 for { 11384 y := v.Args[0] 11385 v_2 := v.Args[2] 11386 if v_2.Op != OpS390XFlagLT { 11387 break 11388 } 11389 v.reset(OpCopy) 11390 v.Type = y.Type 11391 v.AddArg(y) 11392 return true 11393 } 11394 // match: (MOVDEQ y _ (FlagGT)) 11395 // cond: 11396 // result: y 11397 for { 11398 y := v.Args[0] 11399 v_2 := v.Args[2] 11400 if v_2.Op != OpS390XFlagGT { 11401 break 11402 } 11403 v.reset(OpCopy) 11404 v.Type = y.Type 11405 v.AddArg(y) 11406 return true 11407 } 11408 return false 11409 } 11410 func rewriteValueS390X_OpS390XMOVDGE(v *Value) bool { 11411 // match: (MOVDGE x y (InvertFlags cmp)) 11412 // cond: 11413 // result: (MOVDLE x y cmp) 11414 for { 11415 x := v.Args[0] 11416 y := v.Args[1] 11417 v_2 := v.Args[2] 11418 if v_2.Op != OpS390XInvertFlags { 11419 break 11420 } 11421 cmp := v_2.Args[0] 11422 v.reset(OpS390XMOVDLE) 11423 v.AddArg(x) 11424 v.AddArg(y) 11425 v.AddArg(cmp) 11426 return true 11427 } 11428 // match: (MOVDGE _ x (FlagEQ)) 11429 // cond: 11430 // result: x 11431 for { 11432 x := v.Args[1] 11433 v_2 := v.Args[2] 11434 if v_2.Op != OpS390XFlagEQ { 11435 break 11436 } 11437 v.reset(OpCopy) 11438 v.Type = x.Type 11439 v.AddArg(x) 11440 return true 11441 } 11442 // match: (MOVDGE y _ (FlagLT)) 11443 // cond: 11444 // result: y 11445 for { 11446 y := v.Args[0] 11447 v_2 := v.Args[2] 11448 if v_2.Op != OpS390XFlagLT { 11449 break 11450 } 11451 v.reset(OpCopy) 11452 v.Type = y.Type 11453 v.AddArg(y) 11454 return true 11455 } 11456 // match: (MOVDGE _ x (FlagGT)) 11457 // cond: 11458 // result: x 11459 for { 11460 x := v.Args[1] 11461 v_2 := v.Args[2] 11462 if v_2.Op != OpS390XFlagGT { 11463 break 11464 } 11465 v.reset(OpCopy) 11466 v.Type = x.Type 11467 v.AddArg(x) 11468 return true 11469 } 11470 return false 11471 } 11472 func rewriteValueS390X_OpS390XMOVDGT(v *Value) bool { 11473 // match: (MOVDGT x y (InvertFlags cmp)) 11474 // cond: 11475 // result: (MOVDLT x y cmp) 11476 for { 11477 x := v.Args[0] 11478 y := v.Args[1] 11479 v_2 := v.Args[2] 11480 if v_2.Op != OpS390XInvertFlags { 11481 break 11482 } 11483 cmp := v_2.Args[0] 11484 v.reset(OpS390XMOVDLT) 11485 v.AddArg(x) 11486 v.AddArg(y) 11487 v.AddArg(cmp) 11488 return true 11489 } 11490 // match: (MOVDGT y _ (FlagEQ)) 11491 // cond: 11492 // result: y 11493 for { 11494 y := v.Args[0] 11495 v_2 := v.Args[2] 11496 if v_2.Op != OpS390XFlagEQ { 11497 break 11498 } 11499 v.reset(OpCopy) 11500 v.Type = y.Type 11501 v.AddArg(y) 11502 return true 11503 } 11504 // match: (MOVDGT y _ (FlagLT)) 11505 // cond: 11506 // result: y 11507 for { 11508 y := v.Args[0] 11509 v_2 := v.Args[2] 11510 if v_2.Op != OpS390XFlagLT { 11511 break 11512 } 11513 v.reset(OpCopy) 11514 v.Type = y.Type 11515 v.AddArg(y) 11516 return true 11517 } 11518 // match: (MOVDGT _ x (FlagGT)) 11519 // cond: 11520 // result: x 11521 for { 11522 x := v.Args[1] 11523 v_2 := v.Args[2] 11524 if v_2.Op != OpS390XFlagGT { 11525 break 11526 } 11527 v.reset(OpCopy) 11528 v.Type = x.Type 11529 v.AddArg(x) 11530 return true 11531 } 11532 return false 11533 } 11534 func rewriteValueS390X_OpS390XMOVDLE(v *Value) bool { 11535 // match: (MOVDLE x y (InvertFlags cmp)) 11536 // cond: 11537 // result: (MOVDGE x y cmp) 11538 for { 11539 x := v.Args[0] 11540 y := v.Args[1] 11541 v_2 := v.Args[2] 11542 if v_2.Op != OpS390XInvertFlags { 11543 break 11544 } 11545 cmp := v_2.Args[0] 11546 v.reset(OpS390XMOVDGE) 11547 v.AddArg(x) 11548 v.AddArg(y) 11549 v.AddArg(cmp) 11550 return true 11551 } 11552 // match: (MOVDLE _ x (FlagEQ)) 11553 // cond: 11554 // result: x 11555 for { 11556 x := v.Args[1] 11557 v_2 := v.Args[2] 11558 if v_2.Op != OpS390XFlagEQ { 11559 break 11560 } 11561 v.reset(OpCopy) 11562 v.Type = x.Type 11563 v.AddArg(x) 11564 return true 11565 } 11566 // match: (MOVDLE _ x (FlagLT)) 11567 // cond: 11568 // result: x 11569 for { 11570 x := v.Args[1] 11571 v_2 := v.Args[2] 11572 if v_2.Op != OpS390XFlagLT { 11573 break 11574 } 11575 v.reset(OpCopy) 11576 v.Type = x.Type 11577 v.AddArg(x) 11578 return true 11579 } 11580 // match: (MOVDLE y _ (FlagGT)) 11581 // cond: 11582 // result: y 11583 for { 11584 y := v.Args[0] 11585 v_2 := v.Args[2] 11586 if v_2.Op != OpS390XFlagGT { 11587 break 11588 } 11589 v.reset(OpCopy) 11590 v.Type = y.Type 11591 v.AddArg(y) 11592 return true 11593 } 11594 return false 11595 } 11596 func rewriteValueS390X_OpS390XMOVDLT(v *Value) bool { 11597 // match: (MOVDLT x y (InvertFlags cmp)) 11598 // cond: 11599 // result: (MOVDGT x y cmp) 11600 for { 11601 x := v.Args[0] 11602 y := v.Args[1] 11603 v_2 := v.Args[2] 11604 if v_2.Op != OpS390XInvertFlags { 11605 break 11606 } 11607 cmp := v_2.Args[0] 11608 v.reset(OpS390XMOVDGT) 11609 v.AddArg(x) 11610 v.AddArg(y) 11611 v.AddArg(cmp) 11612 return true 11613 } 11614 // match: (MOVDLT y _ (FlagEQ)) 11615 // cond: 11616 // result: y 11617 for { 11618 y := v.Args[0] 11619 v_2 := v.Args[2] 11620 if v_2.Op != OpS390XFlagEQ { 11621 break 11622 } 11623 v.reset(OpCopy) 11624 v.Type = y.Type 11625 v.AddArg(y) 11626 return true 11627 } 11628 // match: (MOVDLT _ x (FlagLT)) 11629 // cond: 11630 // result: x 11631 for { 11632 x := v.Args[1] 11633 v_2 := v.Args[2] 11634 if v_2.Op != OpS390XFlagLT { 11635 break 11636 } 11637 v.reset(OpCopy) 11638 v.Type = x.Type 11639 v.AddArg(x) 11640 return true 11641 } 11642 // match: (MOVDLT y _ (FlagGT)) 11643 // cond: 11644 // result: y 11645 for { 11646 y := v.Args[0] 11647 v_2 := v.Args[2] 11648 if v_2.Op != OpS390XFlagGT { 11649 break 11650 } 11651 v.reset(OpCopy) 11652 v.Type = y.Type 11653 v.AddArg(y) 11654 return true 11655 } 11656 return false 11657 } 11658 func rewriteValueS390X_OpS390XMOVDNE(v *Value) bool { 11659 // match: (MOVDNE x y (InvertFlags cmp)) 11660 // cond: 11661 // result: (MOVDNE x y cmp) 11662 for { 11663 x := v.Args[0] 11664 y := v.Args[1] 11665 v_2 := v.Args[2] 11666 if v_2.Op != OpS390XInvertFlags { 11667 break 11668 } 11669 cmp := v_2.Args[0] 11670 v.reset(OpS390XMOVDNE) 11671 v.AddArg(x) 11672 v.AddArg(y) 11673 v.AddArg(cmp) 11674 return true 11675 } 11676 // match: (MOVDNE y _ (FlagEQ)) 11677 // cond: 11678 // result: y 11679 for { 11680 y := v.Args[0] 11681 v_2 := v.Args[2] 11682 if v_2.Op != OpS390XFlagEQ { 11683 break 11684 } 11685 v.reset(OpCopy) 11686 v.Type = y.Type 11687 v.AddArg(y) 11688 return true 11689 } 11690 // match: (MOVDNE _ x (FlagLT)) 11691 // cond: 11692 // result: x 11693 for { 11694 x := v.Args[1] 11695 v_2 := v.Args[2] 11696 if v_2.Op != OpS390XFlagLT { 11697 break 11698 } 11699 v.reset(OpCopy) 11700 v.Type = x.Type 11701 v.AddArg(x) 11702 return true 11703 } 11704 // match: (MOVDNE _ x (FlagGT)) 11705 // cond: 11706 // result: x 11707 for { 11708 x := v.Args[1] 11709 v_2 := v.Args[2] 11710 if v_2.Op != OpS390XFlagGT { 11711 break 11712 } 11713 v.reset(OpCopy) 11714 v.Type = x.Type 11715 v.AddArg(x) 11716 return true 11717 } 11718 return false 11719 } 11720 func rewriteValueS390X_OpS390XMOVDaddridx(v *Value) bool { 11721 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 11722 // cond: is20Bit(c+d) && x.Op != OpSB 11723 // result: (MOVDaddridx [c+d] {s} x y) 11724 for { 11725 c := v.AuxInt 11726 s := v.Aux 11727 v_0 := v.Args[0] 11728 if v_0.Op != OpS390XADDconst { 11729 break 11730 } 11731 d := v_0.AuxInt 11732 x := v_0.Args[0] 11733 y := v.Args[1] 11734 if !(is20Bit(c+d) && x.Op != OpSB) { 11735 break 11736 } 11737 v.reset(OpS390XMOVDaddridx) 11738 v.AuxInt = c + d 11739 v.Aux = s 11740 v.AddArg(x) 11741 v.AddArg(y) 11742 return true 11743 } 11744 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 11745 // cond: is20Bit(c+d) && y.Op != OpSB 11746 // result: (MOVDaddridx [c+d] {s} x y) 11747 for { 11748 c := v.AuxInt 11749 s := v.Aux 11750 x := v.Args[0] 11751 v_1 := v.Args[1] 11752 if v_1.Op != OpS390XADDconst { 11753 break 11754 } 11755 d := v_1.AuxInt 11756 y := v_1.Args[0] 11757 if !(is20Bit(c+d) && y.Op != OpSB) { 11758 break 11759 } 11760 v.reset(OpS390XMOVDaddridx) 11761 v.AuxInt = c + d 11762 v.Aux = s 11763 v.AddArg(x) 11764 v.AddArg(y) 11765 return true 11766 } 11767 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 11768 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 11769 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 11770 for { 11771 off1 := v.AuxInt 11772 sym1 := v.Aux 11773 v_0 := v.Args[0] 11774 if v_0.Op != OpS390XMOVDaddr { 11775 break 11776 } 11777 off2 := v_0.AuxInt 11778 sym2 := v_0.Aux 11779 x := v_0.Args[0] 11780 y := v.Args[1] 11781 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 11782 break 11783 } 11784 v.reset(OpS390XMOVDaddridx) 11785 v.AuxInt = off1 + off2 11786 v.Aux = mergeSym(sym1, sym2) 11787 v.AddArg(x) 11788 v.AddArg(y) 11789 return true 11790 } 11791 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 11792 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 11793 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 11794 for { 11795 off1 := v.AuxInt 11796 sym1 := v.Aux 11797 x := v.Args[0] 11798 v_1 := v.Args[1] 11799 if v_1.Op != OpS390XMOVDaddr { 11800 break 11801 } 11802 off2 := v_1.AuxInt 11803 sym2 := v_1.Aux 11804 y := v_1.Args[0] 11805 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 11806 break 11807 } 11808 v.reset(OpS390XMOVDaddridx) 11809 v.AuxInt = off1 + off2 11810 v.Aux = mergeSym(sym1, sym2) 11811 v.AddArg(x) 11812 v.AddArg(y) 11813 return true 11814 } 11815 return false 11816 } 11817 func rewriteValueS390X_OpS390XMOVDload(v *Value) bool { 11818 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 11819 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 11820 // result: (MOVDreg x) 11821 for { 11822 off := v.AuxInt 11823 sym := v.Aux 11824 ptr := v.Args[0] 11825 v_1 := v.Args[1] 11826 if v_1.Op != OpS390XMOVDstore { 11827 break 11828 } 11829 off2 := v_1.AuxInt 11830 sym2 := v_1.Aux 11831 ptr2 := v_1.Args[0] 11832 x := v_1.Args[1] 11833 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 11834 break 11835 } 11836 v.reset(OpS390XMOVDreg) 11837 v.AddArg(x) 11838 return true 11839 } 11840 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 11841 // cond: is20Bit(off1+off2) 11842 // result: (MOVDload [off1+off2] {sym} ptr mem) 11843 for { 11844 off1 := v.AuxInt 11845 sym := v.Aux 11846 v_0 := v.Args[0] 11847 if v_0.Op != OpS390XADDconst { 11848 break 11849 } 11850 off2 := v_0.AuxInt 11851 ptr := v_0.Args[0] 11852 mem := v.Args[1] 11853 if !(is20Bit(off1 + off2)) { 11854 break 11855 } 11856 v.reset(OpS390XMOVDload) 11857 v.AuxInt = off1 + off2 11858 v.Aux = sym 11859 v.AddArg(ptr) 11860 v.AddArg(mem) 11861 return true 11862 } 11863 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11864 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11865 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11866 for { 11867 off1 := v.AuxInt 11868 sym1 := v.Aux 11869 v_0 := v.Args[0] 11870 if v_0.Op != OpS390XMOVDaddr { 11871 break 11872 } 11873 off2 := v_0.AuxInt 11874 sym2 := v_0.Aux 11875 base := v_0.Args[0] 11876 mem := v.Args[1] 11877 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11878 break 11879 } 11880 v.reset(OpS390XMOVDload) 11881 v.AuxInt = off1 + off2 11882 v.Aux = mergeSym(sym1, sym2) 11883 v.AddArg(base) 11884 v.AddArg(mem) 11885 return true 11886 } 11887 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11888 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11889 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11890 for { 11891 off1 := v.AuxInt 11892 sym1 := v.Aux 11893 v_0 := v.Args[0] 11894 if v_0.Op != OpS390XMOVDaddridx { 11895 break 11896 } 11897 off2 := v_0.AuxInt 11898 sym2 := v_0.Aux 11899 ptr := v_0.Args[0] 11900 idx := v_0.Args[1] 11901 mem := v.Args[1] 11902 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11903 break 11904 } 11905 v.reset(OpS390XMOVDloadidx) 11906 v.AuxInt = off1 + off2 11907 v.Aux = mergeSym(sym1, sym2) 11908 v.AddArg(ptr) 11909 v.AddArg(idx) 11910 v.AddArg(mem) 11911 return true 11912 } 11913 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 11914 // cond: ptr.Op != OpSB 11915 // result: (MOVDloadidx [off] {sym} ptr idx mem) 11916 for { 11917 off := v.AuxInt 11918 sym := v.Aux 11919 v_0 := v.Args[0] 11920 if v_0.Op != OpS390XADD { 11921 break 11922 } 11923 ptr := v_0.Args[0] 11924 idx := v_0.Args[1] 11925 mem := v.Args[1] 11926 if !(ptr.Op != OpSB) { 11927 break 11928 } 11929 v.reset(OpS390XMOVDloadidx) 11930 v.AuxInt = off 11931 v.Aux = sym 11932 v.AddArg(ptr) 11933 v.AddArg(idx) 11934 v.AddArg(mem) 11935 return true 11936 } 11937 return false 11938 } 11939 func rewriteValueS390X_OpS390XMOVDloadidx(v *Value) bool { 11940 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11941 // cond: 11942 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 11943 for { 11944 c := v.AuxInt 11945 sym := v.Aux 11946 v_0 := v.Args[0] 11947 if v_0.Op != OpS390XADDconst { 11948 break 11949 } 11950 d := v_0.AuxInt 11951 ptr := v_0.Args[0] 11952 idx := v.Args[1] 11953 mem := v.Args[2] 11954 v.reset(OpS390XMOVDloadidx) 11955 v.AuxInt = c + d 11956 v.Aux = sym 11957 v.AddArg(ptr) 11958 v.AddArg(idx) 11959 v.AddArg(mem) 11960 return true 11961 } 11962 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 11963 // cond: 11964 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 11965 for { 11966 c := v.AuxInt 11967 sym := v.Aux 11968 idx := v.Args[0] 11969 v_1 := v.Args[1] 11970 if v_1.Op != OpS390XADDconst { 11971 break 11972 } 11973 d := v_1.AuxInt 11974 ptr := v_1.Args[0] 11975 mem := v.Args[2] 11976 v.reset(OpS390XMOVDloadidx) 11977 v.AuxInt = c + d 11978 v.Aux = sym 11979 v.AddArg(ptr) 11980 v.AddArg(idx) 11981 v.AddArg(mem) 11982 return true 11983 } 11984 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 11985 // cond: 11986 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 11987 for { 11988 c := v.AuxInt 11989 sym := v.Aux 11990 ptr := v.Args[0] 11991 v_1 := v.Args[1] 11992 if v_1.Op != OpS390XADDconst { 11993 break 11994 } 11995 d := v_1.AuxInt 11996 idx := v_1.Args[0] 11997 mem := v.Args[2] 11998 v.reset(OpS390XMOVDloadidx) 11999 v.AuxInt = c + d 12000 v.Aux = sym 12001 v.AddArg(ptr) 12002 v.AddArg(idx) 12003 v.AddArg(mem) 12004 return true 12005 } 12006 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 12007 // cond: 12008 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12009 for { 12010 c := v.AuxInt 12011 sym := v.Aux 12012 v_0 := v.Args[0] 12013 if v_0.Op != OpS390XADDconst { 12014 break 12015 } 12016 d := v_0.AuxInt 12017 idx := v_0.Args[0] 12018 ptr := v.Args[1] 12019 mem := v.Args[2] 12020 v.reset(OpS390XMOVDloadidx) 12021 v.AuxInt = c + d 12022 v.Aux = sym 12023 v.AddArg(ptr) 12024 v.AddArg(idx) 12025 v.AddArg(mem) 12026 return true 12027 } 12028 return false 12029 } 12030 func rewriteValueS390X_OpS390XMOVDnop(v *Value) bool { 12031 b := v.Block 12032 _ = b 12033 // match: (MOVDnop <t> x) 12034 // cond: t.Compare(x.Type) == CMPeq 12035 // result: x 12036 for { 12037 t := v.Type 12038 x := v.Args[0] 12039 if !(t.Compare(x.Type) == CMPeq) { 12040 break 12041 } 12042 v.reset(OpCopy) 12043 v.Type = x.Type 12044 v.AddArg(x) 12045 return true 12046 } 12047 // match: (MOVDnop (MOVDconst [c])) 12048 // cond: 12049 // result: (MOVDconst [c]) 12050 for { 12051 v_0 := v.Args[0] 12052 if v_0.Op != OpS390XMOVDconst { 12053 break 12054 } 12055 c := v_0.AuxInt 12056 v.reset(OpS390XMOVDconst) 12057 v.AuxInt = c 12058 return true 12059 } 12060 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 12061 // cond: x.Uses == 1 && clobber(x) 12062 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12063 for { 12064 t := v.Type 12065 x := v.Args[0] 12066 if x.Op != OpS390XMOVBZload { 12067 break 12068 } 12069 off := x.AuxInt 12070 sym := x.Aux 12071 ptr := x.Args[0] 12072 mem := x.Args[1] 12073 if !(x.Uses == 1 && clobber(x)) { 12074 break 12075 } 12076 b = x.Block 12077 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12078 v.reset(OpCopy) 12079 v.AddArg(v0) 12080 v0.AuxInt = off 12081 v0.Aux = sym 12082 v0.AddArg(ptr) 12083 v0.AddArg(mem) 12084 return true 12085 } 12086 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 12087 // cond: x.Uses == 1 && clobber(x) 12088 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12089 for { 12090 t := v.Type 12091 x := v.Args[0] 12092 if x.Op != OpS390XMOVBload { 12093 break 12094 } 12095 off := x.AuxInt 12096 sym := x.Aux 12097 ptr := x.Args[0] 12098 mem := x.Args[1] 12099 if !(x.Uses == 1 && clobber(x)) { 12100 break 12101 } 12102 b = x.Block 12103 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12104 v.reset(OpCopy) 12105 v.AddArg(v0) 12106 v0.AuxInt = off 12107 v0.Aux = sym 12108 v0.AddArg(ptr) 12109 v0.AddArg(mem) 12110 return true 12111 } 12112 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 12113 // cond: x.Uses == 1 && clobber(x) 12114 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12115 for { 12116 t := v.Type 12117 x := v.Args[0] 12118 if x.Op != OpS390XMOVHZload { 12119 break 12120 } 12121 off := x.AuxInt 12122 sym := x.Aux 12123 ptr := x.Args[0] 12124 mem := x.Args[1] 12125 if !(x.Uses == 1 && clobber(x)) { 12126 break 12127 } 12128 b = x.Block 12129 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12130 v.reset(OpCopy) 12131 v.AddArg(v0) 12132 v0.AuxInt = off 12133 v0.Aux = sym 12134 v0.AddArg(ptr) 12135 v0.AddArg(mem) 12136 return true 12137 } 12138 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 12139 // cond: x.Uses == 1 && clobber(x) 12140 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12141 for { 12142 t := v.Type 12143 x := v.Args[0] 12144 if x.Op != OpS390XMOVHload { 12145 break 12146 } 12147 off := x.AuxInt 12148 sym := x.Aux 12149 ptr := x.Args[0] 12150 mem := x.Args[1] 12151 if !(x.Uses == 1 && clobber(x)) { 12152 break 12153 } 12154 b = x.Block 12155 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12156 v.reset(OpCopy) 12157 v.AddArg(v0) 12158 v0.AuxInt = off 12159 v0.Aux = sym 12160 v0.AddArg(ptr) 12161 v0.AddArg(mem) 12162 return true 12163 } 12164 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 12165 // cond: x.Uses == 1 && clobber(x) 12166 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12167 for { 12168 t := v.Type 12169 x := v.Args[0] 12170 if x.Op != OpS390XMOVWZload { 12171 break 12172 } 12173 off := x.AuxInt 12174 sym := x.Aux 12175 ptr := x.Args[0] 12176 mem := x.Args[1] 12177 if !(x.Uses == 1 && clobber(x)) { 12178 break 12179 } 12180 b = x.Block 12181 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12182 v.reset(OpCopy) 12183 v.AddArg(v0) 12184 v0.AuxInt = off 12185 v0.Aux = sym 12186 v0.AddArg(ptr) 12187 v0.AddArg(mem) 12188 return true 12189 } 12190 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 12191 // cond: x.Uses == 1 && clobber(x) 12192 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12193 for { 12194 t := v.Type 12195 x := v.Args[0] 12196 if x.Op != OpS390XMOVWload { 12197 break 12198 } 12199 off := x.AuxInt 12200 sym := x.Aux 12201 ptr := x.Args[0] 12202 mem := x.Args[1] 12203 if !(x.Uses == 1 && clobber(x)) { 12204 break 12205 } 12206 b = x.Block 12207 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12208 v.reset(OpCopy) 12209 v.AddArg(v0) 12210 v0.AuxInt = off 12211 v0.Aux = sym 12212 v0.AddArg(ptr) 12213 v0.AddArg(mem) 12214 return true 12215 } 12216 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 12217 // cond: x.Uses == 1 && clobber(x) 12218 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12219 for { 12220 t := v.Type 12221 x := v.Args[0] 12222 if x.Op != OpS390XMOVDload { 12223 break 12224 } 12225 off := x.AuxInt 12226 sym := x.Aux 12227 ptr := x.Args[0] 12228 mem := x.Args[1] 12229 if !(x.Uses == 1 && clobber(x)) { 12230 break 12231 } 12232 b = x.Block 12233 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12234 v.reset(OpCopy) 12235 v.AddArg(v0) 12236 v0.AuxInt = off 12237 v0.Aux = sym 12238 v0.AddArg(ptr) 12239 v0.AddArg(mem) 12240 return true 12241 } 12242 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12243 // cond: x.Uses == 1 && clobber(x) 12244 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12245 for { 12246 t := v.Type 12247 x := v.Args[0] 12248 if x.Op != OpS390XMOVBZloadidx { 12249 break 12250 } 12251 off := x.AuxInt 12252 sym := x.Aux 12253 ptr := x.Args[0] 12254 idx := x.Args[1] 12255 mem := x.Args[2] 12256 if !(x.Uses == 1 && clobber(x)) { 12257 break 12258 } 12259 b = x.Block 12260 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12261 v.reset(OpCopy) 12262 v.AddArg(v0) 12263 v0.AuxInt = off 12264 v0.Aux = sym 12265 v0.AddArg(ptr) 12266 v0.AddArg(idx) 12267 v0.AddArg(mem) 12268 return true 12269 } 12270 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12271 // cond: x.Uses == 1 && clobber(x) 12272 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12273 for { 12274 t := v.Type 12275 x := v.Args[0] 12276 if x.Op != OpS390XMOVHZloadidx { 12277 break 12278 } 12279 off := x.AuxInt 12280 sym := x.Aux 12281 ptr := x.Args[0] 12282 idx := x.Args[1] 12283 mem := x.Args[2] 12284 if !(x.Uses == 1 && clobber(x)) { 12285 break 12286 } 12287 b = x.Block 12288 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12289 v.reset(OpCopy) 12290 v.AddArg(v0) 12291 v0.AuxInt = off 12292 v0.Aux = sym 12293 v0.AddArg(ptr) 12294 v0.AddArg(idx) 12295 v0.AddArg(mem) 12296 return true 12297 } 12298 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12299 // cond: x.Uses == 1 && clobber(x) 12300 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12301 for { 12302 t := v.Type 12303 x := v.Args[0] 12304 if x.Op != OpS390XMOVWZloadidx { 12305 break 12306 } 12307 off := x.AuxInt 12308 sym := x.Aux 12309 ptr := x.Args[0] 12310 idx := x.Args[1] 12311 mem := x.Args[2] 12312 if !(x.Uses == 1 && clobber(x)) { 12313 break 12314 } 12315 b = x.Block 12316 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12317 v.reset(OpCopy) 12318 v.AddArg(v0) 12319 v0.AuxInt = off 12320 v0.Aux = sym 12321 v0.AddArg(ptr) 12322 v0.AddArg(idx) 12323 v0.AddArg(mem) 12324 return true 12325 } 12326 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12327 // cond: x.Uses == 1 && clobber(x) 12328 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12329 for { 12330 t := v.Type 12331 x := v.Args[0] 12332 if x.Op != OpS390XMOVDloadidx { 12333 break 12334 } 12335 off := x.AuxInt 12336 sym := x.Aux 12337 ptr := x.Args[0] 12338 idx := x.Args[1] 12339 mem := x.Args[2] 12340 if !(x.Uses == 1 && clobber(x)) { 12341 break 12342 } 12343 b = x.Block 12344 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12345 v.reset(OpCopy) 12346 v.AddArg(v0) 12347 v0.AuxInt = off 12348 v0.Aux = sym 12349 v0.AddArg(ptr) 12350 v0.AddArg(idx) 12351 v0.AddArg(mem) 12352 return true 12353 } 12354 return false 12355 } 12356 func rewriteValueS390X_OpS390XMOVDreg(v *Value) bool { 12357 b := v.Block 12358 _ = b 12359 // match: (MOVDreg <t> x) 12360 // cond: t.Compare(x.Type) == CMPeq 12361 // result: x 12362 for { 12363 t := v.Type 12364 x := v.Args[0] 12365 if !(t.Compare(x.Type) == CMPeq) { 12366 break 12367 } 12368 v.reset(OpCopy) 12369 v.Type = x.Type 12370 v.AddArg(x) 12371 return true 12372 } 12373 // match: (MOVDreg (MOVDconst [c])) 12374 // cond: 12375 // result: (MOVDconst [c]) 12376 for { 12377 v_0 := v.Args[0] 12378 if v_0.Op != OpS390XMOVDconst { 12379 break 12380 } 12381 c := v_0.AuxInt 12382 v.reset(OpS390XMOVDconst) 12383 v.AuxInt = c 12384 return true 12385 } 12386 // match: (MOVDreg x) 12387 // cond: x.Uses == 1 12388 // result: (MOVDnop x) 12389 for { 12390 x := v.Args[0] 12391 if !(x.Uses == 1) { 12392 break 12393 } 12394 v.reset(OpS390XMOVDnop) 12395 v.AddArg(x) 12396 return true 12397 } 12398 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 12399 // cond: x.Uses == 1 && clobber(x) 12400 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12401 for { 12402 t := v.Type 12403 x := v.Args[0] 12404 if x.Op != OpS390XMOVBZload { 12405 break 12406 } 12407 off := x.AuxInt 12408 sym := x.Aux 12409 ptr := x.Args[0] 12410 mem := x.Args[1] 12411 if !(x.Uses == 1 && clobber(x)) { 12412 break 12413 } 12414 b = x.Block 12415 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12416 v.reset(OpCopy) 12417 v.AddArg(v0) 12418 v0.AuxInt = off 12419 v0.Aux = sym 12420 v0.AddArg(ptr) 12421 v0.AddArg(mem) 12422 return true 12423 } 12424 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 12425 // cond: x.Uses == 1 && clobber(x) 12426 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12427 for { 12428 t := v.Type 12429 x := v.Args[0] 12430 if x.Op != OpS390XMOVBload { 12431 break 12432 } 12433 off := x.AuxInt 12434 sym := x.Aux 12435 ptr := x.Args[0] 12436 mem := x.Args[1] 12437 if !(x.Uses == 1 && clobber(x)) { 12438 break 12439 } 12440 b = x.Block 12441 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12442 v.reset(OpCopy) 12443 v.AddArg(v0) 12444 v0.AuxInt = off 12445 v0.Aux = sym 12446 v0.AddArg(ptr) 12447 v0.AddArg(mem) 12448 return true 12449 } 12450 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 12451 // cond: x.Uses == 1 && clobber(x) 12452 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12453 for { 12454 t := v.Type 12455 x := v.Args[0] 12456 if x.Op != OpS390XMOVHZload { 12457 break 12458 } 12459 off := x.AuxInt 12460 sym := x.Aux 12461 ptr := x.Args[0] 12462 mem := x.Args[1] 12463 if !(x.Uses == 1 && clobber(x)) { 12464 break 12465 } 12466 b = x.Block 12467 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12468 v.reset(OpCopy) 12469 v.AddArg(v0) 12470 v0.AuxInt = off 12471 v0.Aux = sym 12472 v0.AddArg(ptr) 12473 v0.AddArg(mem) 12474 return true 12475 } 12476 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 12477 // cond: x.Uses == 1 && clobber(x) 12478 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12479 for { 12480 t := v.Type 12481 x := v.Args[0] 12482 if x.Op != OpS390XMOVHload { 12483 break 12484 } 12485 off := x.AuxInt 12486 sym := x.Aux 12487 ptr := x.Args[0] 12488 mem := x.Args[1] 12489 if !(x.Uses == 1 && clobber(x)) { 12490 break 12491 } 12492 b = x.Block 12493 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12494 v.reset(OpCopy) 12495 v.AddArg(v0) 12496 v0.AuxInt = off 12497 v0.Aux = sym 12498 v0.AddArg(ptr) 12499 v0.AddArg(mem) 12500 return true 12501 } 12502 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 12503 // cond: x.Uses == 1 && clobber(x) 12504 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12505 for { 12506 t := v.Type 12507 x := v.Args[0] 12508 if x.Op != OpS390XMOVWZload { 12509 break 12510 } 12511 off := x.AuxInt 12512 sym := x.Aux 12513 ptr := x.Args[0] 12514 mem := x.Args[1] 12515 if !(x.Uses == 1 && clobber(x)) { 12516 break 12517 } 12518 b = x.Block 12519 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12520 v.reset(OpCopy) 12521 v.AddArg(v0) 12522 v0.AuxInt = off 12523 v0.Aux = sym 12524 v0.AddArg(ptr) 12525 v0.AddArg(mem) 12526 return true 12527 } 12528 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 12529 // cond: x.Uses == 1 && clobber(x) 12530 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12531 for { 12532 t := v.Type 12533 x := v.Args[0] 12534 if x.Op != OpS390XMOVWload { 12535 break 12536 } 12537 off := x.AuxInt 12538 sym := x.Aux 12539 ptr := x.Args[0] 12540 mem := x.Args[1] 12541 if !(x.Uses == 1 && clobber(x)) { 12542 break 12543 } 12544 b = x.Block 12545 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12546 v.reset(OpCopy) 12547 v.AddArg(v0) 12548 v0.AuxInt = off 12549 v0.Aux = sym 12550 v0.AddArg(ptr) 12551 v0.AddArg(mem) 12552 return true 12553 } 12554 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 12555 // cond: x.Uses == 1 && clobber(x) 12556 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12557 for { 12558 t := v.Type 12559 x := v.Args[0] 12560 if x.Op != OpS390XMOVDload { 12561 break 12562 } 12563 off := x.AuxInt 12564 sym := x.Aux 12565 ptr := x.Args[0] 12566 mem := x.Args[1] 12567 if !(x.Uses == 1 && clobber(x)) { 12568 break 12569 } 12570 b = x.Block 12571 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12572 v.reset(OpCopy) 12573 v.AddArg(v0) 12574 v0.AuxInt = off 12575 v0.Aux = sym 12576 v0.AddArg(ptr) 12577 v0.AddArg(mem) 12578 return true 12579 } 12580 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12581 // cond: x.Uses == 1 && clobber(x) 12582 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12583 for { 12584 t := v.Type 12585 x := v.Args[0] 12586 if x.Op != OpS390XMOVBZloadidx { 12587 break 12588 } 12589 off := x.AuxInt 12590 sym := x.Aux 12591 ptr := x.Args[0] 12592 idx := x.Args[1] 12593 mem := x.Args[2] 12594 if !(x.Uses == 1 && clobber(x)) { 12595 break 12596 } 12597 b = x.Block 12598 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12599 v.reset(OpCopy) 12600 v.AddArg(v0) 12601 v0.AuxInt = off 12602 v0.Aux = sym 12603 v0.AddArg(ptr) 12604 v0.AddArg(idx) 12605 v0.AddArg(mem) 12606 return true 12607 } 12608 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12609 // cond: x.Uses == 1 && clobber(x) 12610 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12611 for { 12612 t := v.Type 12613 x := v.Args[0] 12614 if x.Op != OpS390XMOVHZloadidx { 12615 break 12616 } 12617 off := x.AuxInt 12618 sym := x.Aux 12619 ptr := x.Args[0] 12620 idx := x.Args[1] 12621 mem := x.Args[2] 12622 if !(x.Uses == 1 && clobber(x)) { 12623 break 12624 } 12625 b = x.Block 12626 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12627 v.reset(OpCopy) 12628 v.AddArg(v0) 12629 v0.AuxInt = off 12630 v0.Aux = sym 12631 v0.AddArg(ptr) 12632 v0.AddArg(idx) 12633 v0.AddArg(mem) 12634 return true 12635 } 12636 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12637 // cond: x.Uses == 1 && clobber(x) 12638 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12639 for { 12640 t := v.Type 12641 x := v.Args[0] 12642 if x.Op != OpS390XMOVWZloadidx { 12643 break 12644 } 12645 off := x.AuxInt 12646 sym := x.Aux 12647 ptr := x.Args[0] 12648 idx := x.Args[1] 12649 mem := x.Args[2] 12650 if !(x.Uses == 1 && clobber(x)) { 12651 break 12652 } 12653 b = x.Block 12654 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12655 v.reset(OpCopy) 12656 v.AddArg(v0) 12657 v0.AuxInt = off 12658 v0.Aux = sym 12659 v0.AddArg(ptr) 12660 v0.AddArg(idx) 12661 v0.AddArg(mem) 12662 return true 12663 } 12664 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12665 // cond: x.Uses == 1 && clobber(x) 12666 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12667 for { 12668 t := v.Type 12669 x := v.Args[0] 12670 if x.Op != OpS390XMOVDloadidx { 12671 break 12672 } 12673 off := x.AuxInt 12674 sym := x.Aux 12675 ptr := x.Args[0] 12676 idx := x.Args[1] 12677 mem := x.Args[2] 12678 if !(x.Uses == 1 && clobber(x)) { 12679 break 12680 } 12681 b = x.Block 12682 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12683 v.reset(OpCopy) 12684 v.AddArg(v0) 12685 v0.AuxInt = off 12686 v0.Aux = sym 12687 v0.AddArg(ptr) 12688 v0.AddArg(idx) 12689 v0.AddArg(mem) 12690 return true 12691 } 12692 return false 12693 } 12694 func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { 12695 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 12696 // cond: is20Bit(off1+off2) 12697 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 12698 for { 12699 off1 := v.AuxInt 12700 sym := v.Aux 12701 v_0 := v.Args[0] 12702 if v_0.Op != OpS390XADDconst { 12703 break 12704 } 12705 off2 := v_0.AuxInt 12706 ptr := v_0.Args[0] 12707 val := v.Args[1] 12708 mem := v.Args[2] 12709 if !(is20Bit(off1 + off2)) { 12710 break 12711 } 12712 v.reset(OpS390XMOVDstore) 12713 v.AuxInt = off1 + off2 12714 v.Aux = sym 12715 v.AddArg(ptr) 12716 v.AddArg(val) 12717 v.AddArg(mem) 12718 return true 12719 } 12720 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 12721 // cond: validValAndOff(c,off) && int64(int16(c)) == c && ptr.Op != OpSB 12722 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 12723 for { 12724 off := v.AuxInt 12725 sym := v.Aux 12726 ptr := v.Args[0] 12727 v_1 := v.Args[1] 12728 if v_1.Op != OpS390XMOVDconst { 12729 break 12730 } 12731 c := v_1.AuxInt 12732 mem := v.Args[2] 12733 if !(validValAndOff(c, off) && int64(int16(c)) == c && ptr.Op != OpSB) { 12734 break 12735 } 12736 v.reset(OpS390XMOVDstoreconst) 12737 v.AuxInt = makeValAndOff(c, off) 12738 v.Aux = sym 12739 v.AddArg(ptr) 12740 v.AddArg(mem) 12741 return true 12742 } 12743 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 12744 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12745 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 12746 for { 12747 off1 := v.AuxInt 12748 sym1 := v.Aux 12749 v_0 := v.Args[0] 12750 if v_0.Op != OpS390XMOVDaddr { 12751 break 12752 } 12753 off2 := v_0.AuxInt 12754 sym2 := v_0.Aux 12755 base := v_0.Args[0] 12756 val := v.Args[1] 12757 mem := v.Args[2] 12758 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12759 break 12760 } 12761 v.reset(OpS390XMOVDstore) 12762 v.AuxInt = off1 + off2 12763 v.Aux = mergeSym(sym1, sym2) 12764 v.AddArg(base) 12765 v.AddArg(val) 12766 v.AddArg(mem) 12767 return true 12768 } 12769 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 12770 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12771 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 12772 for { 12773 off1 := v.AuxInt 12774 sym1 := v.Aux 12775 v_0 := v.Args[0] 12776 if v_0.Op != OpS390XMOVDaddridx { 12777 break 12778 } 12779 off2 := v_0.AuxInt 12780 sym2 := v_0.Aux 12781 ptr := v_0.Args[0] 12782 idx := v_0.Args[1] 12783 val := v.Args[1] 12784 mem := v.Args[2] 12785 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12786 break 12787 } 12788 v.reset(OpS390XMOVDstoreidx) 12789 v.AuxInt = off1 + off2 12790 v.Aux = mergeSym(sym1, sym2) 12791 v.AddArg(ptr) 12792 v.AddArg(idx) 12793 v.AddArg(val) 12794 v.AddArg(mem) 12795 return true 12796 } 12797 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 12798 // cond: ptr.Op != OpSB 12799 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 12800 for { 12801 off := v.AuxInt 12802 sym := v.Aux 12803 v_0 := v.Args[0] 12804 if v_0.Op != OpS390XADD { 12805 break 12806 } 12807 ptr := v_0.Args[0] 12808 idx := v_0.Args[1] 12809 val := v.Args[1] 12810 mem := v.Args[2] 12811 if !(ptr.Op != OpSB) { 12812 break 12813 } 12814 v.reset(OpS390XMOVDstoreidx) 12815 v.AuxInt = off 12816 v.Aux = sym 12817 v.AddArg(ptr) 12818 v.AddArg(idx) 12819 v.AddArg(val) 12820 v.AddArg(mem) 12821 return true 12822 } 12823 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 12824 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 12825 // result: (STMG2 [i-8] {s} p w0 w1 mem) 12826 for { 12827 i := v.AuxInt 12828 s := v.Aux 12829 p := v.Args[0] 12830 w1 := v.Args[1] 12831 x := v.Args[2] 12832 if x.Op != OpS390XMOVDstore { 12833 break 12834 } 12835 if x.AuxInt != i-8 { 12836 break 12837 } 12838 if x.Aux != s { 12839 break 12840 } 12841 if p != x.Args[0] { 12842 break 12843 } 12844 w0 := x.Args[1] 12845 mem := x.Args[2] 12846 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 12847 break 12848 } 12849 v.reset(OpS390XSTMG2) 12850 v.AuxInt = i - 8 12851 v.Aux = s 12852 v.AddArg(p) 12853 v.AddArg(w0) 12854 v.AddArg(w1) 12855 v.AddArg(mem) 12856 return true 12857 } 12858 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 12859 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 12860 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 12861 for { 12862 i := v.AuxInt 12863 s := v.Aux 12864 p := v.Args[0] 12865 w2 := v.Args[1] 12866 x := v.Args[2] 12867 if x.Op != OpS390XSTMG2 { 12868 break 12869 } 12870 if x.AuxInt != i-16 { 12871 break 12872 } 12873 if x.Aux != s { 12874 break 12875 } 12876 if p != x.Args[0] { 12877 break 12878 } 12879 w0 := x.Args[1] 12880 w1 := x.Args[2] 12881 mem := x.Args[3] 12882 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 12883 break 12884 } 12885 v.reset(OpS390XSTMG3) 12886 v.AuxInt = i - 16 12887 v.Aux = s 12888 v.AddArg(p) 12889 v.AddArg(w0) 12890 v.AddArg(w1) 12891 v.AddArg(w2) 12892 v.AddArg(mem) 12893 return true 12894 } 12895 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 12896 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 12897 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 12898 for { 12899 i := v.AuxInt 12900 s := v.Aux 12901 p := v.Args[0] 12902 w3 := v.Args[1] 12903 x := v.Args[2] 12904 if x.Op != OpS390XSTMG3 { 12905 break 12906 } 12907 if x.AuxInt != i-24 { 12908 break 12909 } 12910 if x.Aux != s { 12911 break 12912 } 12913 if p != x.Args[0] { 12914 break 12915 } 12916 w0 := x.Args[1] 12917 w1 := x.Args[2] 12918 w2 := x.Args[3] 12919 mem := x.Args[4] 12920 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 12921 break 12922 } 12923 v.reset(OpS390XSTMG4) 12924 v.AuxInt = i - 24 12925 v.Aux = s 12926 v.AddArg(p) 12927 v.AddArg(w0) 12928 v.AddArg(w1) 12929 v.AddArg(w2) 12930 v.AddArg(w3) 12931 v.AddArg(mem) 12932 return true 12933 } 12934 return false 12935 } 12936 func rewriteValueS390X_OpS390XMOVDstoreconst(v *Value) bool { 12937 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 12938 // cond: ValAndOff(sc).canAdd(off) 12939 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 12940 for { 12941 sc := v.AuxInt 12942 s := v.Aux 12943 v_0 := v.Args[0] 12944 if v_0.Op != OpS390XADDconst { 12945 break 12946 } 12947 off := v_0.AuxInt 12948 ptr := v_0.Args[0] 12949 mem := v.Args[1] 12950 if !(ValAndOff(sc).canAdd(off)) { 12951 break 12952 } 12953 v.reset(OpS390XMOVDstoreconst) 12954 v.AuxInt = ValAndOff(sc).add(off) 12955 v.Aux = s 12956 v.AddArg(ptr) 12957 v.AddArg(mem) 12958 return true 12959 } 12960 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 12961 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 12962 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 12963 for { 12964 sc := v.AuxInt 12965 sym1 := v.Aux 12966 v_0 := v.Args[0] 12967 if v_0.Op != OpS390XMOVDaddr { 12968 break 12969 } 12970 off := v_0.AuxInt 12971 sym2 := v_0.Aux 12972 ptr := v_0.Args[0] 12973 mem := v.Args[1] 12974 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 12975 break 12976 } 12977 v.reset(OpS390XMOVDstoreconst) 12978 v.AuxInt = ValAndOff(sc).add(off) 12979 v.Aux = mergeSym(sym1, sym2) 12980 v.AddArg(ptr) 12981 v.AddArg(mem) 12982 return true 12983 } 12984 return false 12985 } 12986 func rewriteValueS390X_OpS390XMOVDstoreidx(v *Value) bool { 12987 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 12988 // cond: 12989 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 12990 for { 12991 c := v.AuxInt 12992 sym := v.Aux 12993 v_0 := v.Args[0] 12994 if v_0.Op != OpS390XADDconst { 12995 break 12996 } 12997 d := v_0.AuxInt 12998 ptr := v_0.Args[0] 12999 idx := v.Args[1] 13000 val := v.Args[2] 13001 mem := v.Args[3] 13002 v.reset(OpS390XMOVDstoreidx) 13003 v.AuxInt = c + d 13004 v.Aux = sym 13005 v.AddArg(ptr) 13006 v.AddArg(idx) 13007 v.AddArg(val) 13008 v.AddArg(mem) 13009 return true 13010 } 13011 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 13012 // cond: 13013 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13014 for { 13015 c := v.AuxInt 13016 sym := v.Aux 13017 idx := v.Args[0] 13018 v_1 := v.Args[1] 13019 if v_1.Op != OpS390XADDconst { 13020 break 13021 } 13022 d := v_1.AuxInt 13023 ptr := v_1.Args[0] 13024 val := v.Args[2] 13025 mem := v.Args[3] 13026 v.reset(OpS390XMOVDstoreidx) 13027 v.AuxInt = c + d 13028 v.Aux = sym 13029 v.AddArg(ptr) 13030 v.AddArg(idx) 13031 v.AddArg(val) 13032 v.AddArg(mem) 13033 return true 13034 } 13035 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 13036 // cond: 13037 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13038 for { 13039 c := v.AuxInt 13040 sym := v.Aux 13041 ptr := v.Args[0] 13042 v_1 := v.Args[1] 13043 if v_1.Op != OpS390XADDconst { 13044 break 13045 } 13046 d := v_1.AuxInt 13047 idx := v_1.Args[0] 13048 val := v.Args[2] 13049 mem := v.Args[3] 13050 v.reset(OpS390XMOVDstoreidx) 13051 v.AuxInt = c + d 13052 v.Aux = sym 13053 v.AddArg(ptr) 13054 v.AddArg(idx) 13055 v.AddArg(val) 13056 v.AddArg(mem) 13057 return true 13058 } 13059 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 13060 // cond: 13061 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13062 for { 13063 c := v.AuxInt 13064 sym := v.Aux 13065 v_0 := v.Args[0] 13066 if v_0.Op != OpS390XADDconst { 13067 break 13068 } 13069 d := v_0.AuxInt 13070 idx := v_0.Args[0] 13071 ptr := v.Args[1] 13072 val := v.Args[2] 13073 mem := v.Args[3] 13074 v.reset(OpS390XMOVDstoreidx) 13075 v.AuxInt = c + d 13076 v.Aux = sym 13077 v.AddArg(ptr) 13078 v.AddArg(idx) 13079 v.AddArg(val) 13080 v.AddArg(mem) 13081 return true 13082 } 13083 return false 13084 } 13085 func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { 13086 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13087 // cond: x.Uses == 1 && clobber(x) 13088 // result: (MOVWBRstore [i-2] {s} p w mem) 13089 for { 13090 i := v.AuxInt 13091 s := v.Aux 13092 p := v.Args[0] 13093 v_1 := v.Args[1] 13094 if v_1.Op != OpS390XSRDconst { 13095 break 13096 } 13097 if v_1.AuxInt != 16 { 13098 break 13099 } 13100 w := v_1.Args[0] 13101 x := v.Args[2] 13102 if x.Op != OpS390XMOVHBRstore { 13103 break 13104 } 13105 if x.AuxInt != i-2 { 13106 break 13107 } 13108 if x.Aux != s { 13109 break 13110 } 13111 if p != x.Args[0] { 13112 break 13113 } 13114 if w != x.Args[1] { 13115 break 13116 } 13117 mem := x.Args[2] 13118 if !(x.Uses == 1 && clobber(x)) { 13119 break 13120 } 13121 v.reset(OpS390XMOVWBRstore) 13122 v.AuxInt = i - 2 13123 v.Aux = s 13124 v.AddArg(p) 13125 v.AddArg(w) 13126 v.AddArg(mem) 13127 return true 13128 } 13129 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 13130 // cond: x.Uses == 1 && clobber(x) 13131 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13132 for { 13133 i := v.AuxInt 13134 s := v.Aux 13135 p := v.Args[0] 13136 v_1 := v.Args[1] 13137 if v_1.Op != OpS390XSRDconst { 13138 break 13139 } 13140 j := v_1.AuxInt 13141 w := v_1.Args[0] 13142 x := v.Args[2] 13143 if x.Op != OpS390XMOVHBRstore { 13144 break 13145 } 13146 if x.AuxInt != i-2 { 13147 break 13148 } 13149 if x.Aux != s { 13150 break 13151 } 13152 if p != x.Args[0] { 13153 break 13154 } 13155 w0 := x.Args[1] 13156 if w0.Op != OpS390XSRDconst { 13157 break 13158 } 13159 if w0.AuxInt != j-16 { 13160 break 13161 } 13162 if w != w0.Args[0] { 13163 break 13164 } 13165 mem := x.Args[2] 13166 if !(x.Uses == 1 && clobber(x)) { 13167 break 13168 } 13169 v.reset(OpS390XMOVWBRstore) 13170 v.AuxInt = i - 2 13171 v.Aux = s 13172 v.AddArg(p) 13173 v.AddArg(w0) 13174 v.AddArg(mem) 13175 return true 13176 } 13177 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13178 // cond: x.Uses == 1 && clobber(x) 13179 // result: (MOVWBRstore [i-2] {s} p w mem) 13180 for { 13181 i := v.AuxInt 13182 s := v.Aux 13183 p := v.Args[0] 13184 v_1 := v.Args[1] 13185 if v_1.Op != OpS390XSRWconst { 13186 break 13187 } 13188 if v_1.AuxInt != 16 { 13189 break 13190 } 13191 w := v_1.Args[0] 13192 x := v.Args[2] 13193 if x.Op != OpS390XMOVHBRstore { 13194 break 13195 } 13196 if x.AuxInt != i-2 { 13197 break 13198 } 13199 if x.Aux != s { 13200 break 13201 } 13202 if p != x.Args[0] { 13203 break 13204 } 13205 if w != x.Args[1] { 13206 break 13207 } 13208 mem := x.Args[2] 13209 if !(x.Uses == 1 && clobber(x)) { 13210 break 13211 } 13212 v.reset(OpS390XMOVWBRstore) 13213 v.AuxInt = i - 2 13214 v.Aux = s 13215 v.AddArg(p) 13216 v.AddArg(w) 13217 v.AddArg(mem) 13218 return true 13219 } 13220 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 13221 // cond: x.Uses == 1 && clobber(x) 13222 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13223 for { 13224 i := v.AuxInt 13225 s := v.Aux 13226 p := v.Args[0] 13227 v_1 := v.Args[1] 13228 if v_1.Op != OpS390XSRWconst { 13229 break 13230 } 13231 j := v_1.AuxInt 13232 w := v_1.Args[0] 13233 x := v.Args[2] 13234 if x.Op != OpS390XMOVHBRstore { 13235 break 13236 } 13237 if x.AuxInt != i-2 { 13238 break 13239 } 13240 if x.Aux != s { 13241 break 13242 } 13243 if p != x.Args[0] { 13244 break 13245 } 13246 w0 := x.Args[1] 13247 if w0.Op != OpS390XSRWconst { 13248 break 13249 } 13250 if w0.AuxInt != j-16 { 13251 break 13252 } 13253 if w != w0.Args[0] { 13254 break 13255 } 13256 mem := x.Args[2] 13257 if !(x.Uses == 1 && clobber(x)) { 13258 break 13259 } 13260 v.reset(OpS390XMOVWBRstore) 13261 v.AuxInt = i - 2 13262 v.Aux = s 13263 v.AddArg(p) 13264 v.AddArg(w0) 13265 v.AddArg(mem) 13266 return true 13267 } 13268 return false 13269 } 13270 func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { 13271 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13272 // cond: x.Uses == 1 && clobber(x) 13273 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13274 for { 13275 i := v.AuxInt 13276 s := v.Aux 13277 p := v.Args[0] 13278 idx := v.Args[1] 13279 v_2 := v.Args[2] 13280 if v_2.Op != OpS390XSRDconst { 13281 break 13282 } 13283 if v_2.AuxInt != 16 { 13284 break 13285 } 13286 w := v_2.Args[0] 13287 x := v.Args[3] 13288 if x.Op != OpS390XMOVHBRstoreidx { 13289 break 13290 } 13291 if x.AuxInt != i-2 { 13292 break 13293 } 13294 if x.Aux != s { 13295 break 13296 } 13297 if p != x.Args[0] { 13298 break 13299 } 13300 if idx != x.Args[1] { 13301 break 13302 } 13303 if w != x.Args[2] { 13304 break 13305 } 13306 mem := x.Args[3] 13307 if !(x.Uses == 1 && clobber(x)) { 13308 break 13309 } 13310 v.reset(OpS390XMOVWBRstoreidx) 13311 v.AuxInt = i - 2 13312 v.Aux = s 13313 v.AddArg(p) 13314 v.AddArg(idx) 13315 v.AddArg(w) 13316 v.AddArg(mem) 13317 return true 13318 } 13319 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13320 // cond: x.Uses == 1 && clobber(x) 13321 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13322 for { 13323 i := v.AuxInt 13324 s := v.Aux 13325 p := v.Args[0] 13326 idx := v.Args[1] 13327 v_2 := v.Args[2] 13328 if v_2.Op != OpS390XSRDconst { 13329 break 13330 } 13331 if v_2.AuxInt != 16 { 13332 break 13333 } 13334 w := v_2.Args[0] 13335 x := v.Args[3] 13336 if x.Op != OpS390XMOVHBRstoreidx { 13337 break 13338 } 13339 if x.AuxInt != i-2 { 13340 break 13341 } 13342 if x.Aux != s { 13343 break 13344 } 13345 if idx != x.Args[0] { 13346 break 13347 } 13348 if p != x.Args[1] { 13349 break 13350 } 13351 if w != x.Args[2] { 13352 break 13353 } 13354 mem := x.Args[3] 13355 if !(x.Uses == 1 && clobber(x)) { 13356 break 13357 } 13358 v.reset(OpS390XMOVWBRstoreidx) 13359 v.AuxInt = i - 2 13360 v.Aux = s 13361 v.AddArg(p) 13362 v.AddArg(idx) 13363 v.AddArg(w) 13364 v.AddArg(mem) 13365 return true 13366 } 13367 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13368 // cond: x.Uses == 1 && clobber(x) 13369 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13370 for { 13371 i := v.AuxInt 13372 s := v.Aux 13373 idx := v.Args[0] 13374 p := v.Args[1] 13375 v_2 := v.Args[2] 13376 if v_2.Op != OpS390XSRDconst { 13377 break 13378 } 13379 if v_2.AuxInt != 16 { 13380 break 13381 } 13382 w := v_2.Args[0] 13383 x := v.Args[3] 13384 if x.Op != OpS390XMOVHBRstoreidx { 13385 break 13386 } 13387 if x.AuxInt != i-2 { 13388 break 13389 } 13390 if x.Aux != s { 13391 break 13392 } 13393 if p != x.Args[0] { 13394 break 13395 } 13396 if idx != x.Args[1] { 13397 break 13398 } 13399 if w != x.Args[2] { 13400 break 13401 } 13402 mem := x.Args[3] 13403 if !(x.Uses == 1 && clobber(x)) { 13404 break 13405 } 13406 v.reset(OpS390XMOVWBRstoreidx) 13407 v.AuxInt = i - 2 13408 v.Aux = s 13409 v.AddArg(p) 13410 v.AddArg(idx) 13411 v.AddArg(w) 13412 v.AddArg(mem) 13413 return true 13414 } 13415 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13416 // cond: x.Uses == 1 && clobber(x) 13417 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13418 for { 13419 i := v.AuxInt 13420 s := v.Aux 13421 idx := v.Args[0] 13422 p := v.Args[1] 13423 v_2 := v.Args[2] 13424 if v_2.Op != OpS390XSRDconst { 13425 break 13426 } 13427 if v_2.AuxInt != 16 { 13428 break 13429 } 13430 w := v_2.Args[0] 13431 x := v.Args[3] 13432 if x.Op != OpS390XMOVHBRstoreidx { 13433 break 13434 } 13435 if x.AuxInt != i-2 { 13436 break 13437 } 13438 if x.Aux != s { 13439 break 13440 } 13441 if idx != x.Args[0] { 13442 break 13443 } 13444 if p != x.Args[1] { 13445 break 13446 } 13447 if w != x.Args[2] { 13448 break 13449 } 13450 mem := x.Args[3] 13451 if !(x.Uses == 1 && clobber(x)) { 13452 break 13453 } 13454 v.reset(OpS390XMOVWBRstoreidx) 13455 v.AuxInt = i - 2 13456 v.Aux = s 13457 v.AddArg(p) 13458 v.AddArg(idx) 13459 v.AddArg(w) 13460 v.AddArg(mem) 13461 return true 13462 } 13463 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 13464 // cond: x.Uses == 1 && clobber(x) 13465 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13466 for { 13467 i := v.AuxInt 13468 s := v.Aux 13469 p := v.Args[0] 13470 idx := v.Args[1] 13471 v_2 := v.Args[2] 13472 if v_2.Op != OpS390XSRDconst { 13473 break 13474 } 13475 j := v_2.AuxInt 13476 w := v_2.Args[0] 13477 x := v.Args[3] 13478 if x.Op != OpS390XMOVHBRstoreidx { 13479 break 13480 } 13481 if x.AuxInt != i-2 { 13482 break 13483 } 13484 if x.Aux != s { 13485 break 13486 } 13487 if p != x.Args[0] { 13488 break 13489 } 13490 if idx != x.Args[1] { 13491 break 13492 } 13493 w0 := x.Args[2] 13494 if w0.Op != OpS390XSRDconst { 13495 break 13496 } 13497 if w0.AuxInt != j-16 { 13498 break 13499 } 13500 if w != w0.Args[0] { 13501 break 13502 } 13503 mem := x.Args[3] 13504 if !(x.Uses == 1 && clobber(x)) { 13505 break 13506 } 13507 v.reset(OpS390XMOVWBRstoreidx) 13508 v.AuxInt = i - 2 13509 v.Aux = s 13510 v.AddArg(p) 13511 v.AddArg(idx) 13512 v.AddArg(w0) 13513 v.AddArg(mem) 13514 return true 13515 } 13516 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 13517 // cond: x.Uses == 1 && clobber(x) 13518 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13519 for { 13520 i := v.AuxInt 13521 s := v.Aux 13522 p := v.Args[0] 13523 idx := v.Args[1] 13524 v_2 := v.Args[2] 13525 if v_2.Op != OpS390XSRDconst { 13526 break 13527 } 13528 j := v_2.AuxInt 13529 w := v_2.Args[0] 13530 x := v.Args[3] 13531 if x.Op != OpS390XMOVHBRstoreidx { 13532 break 13533 } 13534 if x.AuxInt != i-2 { 13535 break 13536 } 13537 if x.Aux != s { 13538 break 13539 } 13540 if idx != x.Args[0] { 13541 break 13542 } 13543 if p != x.Args[1] { 13544 break 13545 } 13546 w0 := x.Args[2] 13547 if w0.Op != OpS390XSRDconst { 13548 break 13549 } 13550 if w0.AuxInt != j-16 { 13551 break 13552 } 13553 if w != w0.Args[0] { 13554 break 13555 } 13556 mem := x.Args[3] 13557 if !(x.Uses == 1 && clobber(x)) { 13558 break 13559 } 13560 v.reset(OpS390XMOVWBRstoreidx) 13561 v.AuxInt = i - 2 13562 v.Aux = s 13563 v.AddArg(p) 13564 v.AddArg(idx) 13565 v.AddArg(w0) 13566 v.AddArg(mem) 13567 return true 13568 } 13569 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 13570 // cond: x.Uses == 1 && clobber(x) 13571 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13572 for { 13573 i := v.AuxInt 13574 s := v.Aux 13575 idx := v.Args[0] 13576 p := v.Args[1] 13577 v_2 := v.Args[2] 13578 if v_2.Op != OpS390XSRDconst { 13579 break 13580 } 13581 j := v_2.AuxInt 13582 w := v_2.Args[0] 13583 x := v.Args[3] 13584 if x.Op != OpS390XMOVHBRstoreidx { 13585 break 13586 } 13587 if x.AuxInt != i-2 { 13588 break 13589 } 13590 if x.Aux != s { 13591 break 13592 } 13593 if p != x.Args[0] { 13594 break 13595 } 13596 if idx != x.Args[1] { 13597 break 13598 } 13599 w0 := x.Args[2] 13600 if w0.Op != OpS390XSRDconst { 13601 break 13602 } 13603 if w0.AuxInt != j-16 { 13604 break 13605 } 13606 if w != w0.Args[0] { 13607 break 13608 } 13609 mem := x.Args[3] 13610 if !(x.Uses == 1 && clobber(x)) { 13611 break 13612 } 13613 v.reset(OpS390XMOVWBRstoreidx) 13614 v.AuxInt = i - 2 13615 v.Aux = s 13616 v.AddArg(p) 13617 v.AddArg(idx) 13618 v.AddArg(w0) 13619 v.AddArg(mem) 13620 return true 13621 } 13622 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 13623 // cond: x.Uses == 1 && clobber(x) 13624 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13625 for { 13626 i := v.AuxInt 13627 s := v.Aux 13628 idx := v.Args[0] 13629 p := v.Args[1] 13630 v_2 := v.Args[2] 13631 if v_2.Op != OpS390XSRDconst { 13632 break 13633 } 13634 j := v_2.AuxInt 13635 w := v_2.Args[0] 13636 x := v.Args[3] 13637 if x.Op != OpS390XMOVHBRstoreidx { 13638 break 13639 } 13640 if x.AuxInt != i-2 { 13641 break 13642 } 13643 if x.Aux != s { 13644 break 13645 } 13646 if idx != x.Args[0] { 13647 break 13648 } 13649 if p != x.Args[1] { 13650 break 13651 } 13652 w0 := x.Args[2] 13653 if w0.Op != OpS390XSRDconst { 13654 break 13655 } 13656 if w0.AuxInt != j-16 { 13657 break 13658 } 13659 if w != w0.Args[0] { 13660 break 13661 } 13662 mem := x.Args[3] 13663 if !(x.Uses == 1 && clobber(x)) { 13664 break 13665 } 13666 v.reset(OpS390XMOVWBRstoreidx) 13667 v.AuxInt = i - 2 13668 v.Aux = s 13669 v.AddArg(p) 13670 v.AddArg(idx) 13671 v.AddArg(w0) 13672 v.AddArg(mem) 13673 return true 13674 } 13675 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13676 // cond: x.Uses == 1 && clobber(x) 13677 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13678 for { 13679 i := v.AuxInt 13680 s := v.Aux 13681 p := v.Args[0] 13682 idx := v.Args[1] 13683 v_2 := v.Args[2] 13684 if v_2.Op != OpS390XSRWconst { 13685 break 13686 } 13687 if v_2.AuxInt != 16 { 13688 break 13689 } 13690 w := v_2.Args[0] 13691 x := v.Args[3] 13692 if x.Op != OpS390XMOVHBRstoreidx { 13693 break 13694 } 13695 if x.AuxInt != i-2 { 13696 break 13697 } 13698 if x.Aux != s { 13699 break 13700 } 13701 if p != x.Args[0] { 13702 break 13703 } 13704 if idx != x.Args[1] { 13705 break 13706 } 13707 if w != x.Args[2] { 13708 break 13709 } 13710 mem := x.Args[3] 13711 if !(x.Uses == 1 && clobber(x)) { 13712 break 13713 } 13714 v.reset(OpS390XMOVWBRstoreidx) 13715 v.AuxInt = i - 2 13716 v.Aux = s 13717 v.AddArg(p) 13718 v.AddArg(idx) 13719 v.AddArg(w) 13720 v.AddArg(mem) 13721 return true 13722 } 13723 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13724 // cond: x.Uses == 1 && clobber(x) 13725 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13726 for { 13727 i := v.AuxInt 13728 s := v.Aux 13729 p := v.Args[0] 13730 idx := v.Args[1] 13731 v_2 := v.Args[2] 13732 if v_2.Op != OpS390XSRWconst { 13733 break 13734 } 13735 if v_2.AuxInt != 16 { 13736 break 13737 } 13738 w := v_2.Args[0] 13739 x := v.Args[3] 13740 if x.Op != OpS390XMOVHBRstoreidx { 13741 break 13742 } 13743 if x.AuxInt != i-2 { 13744 break 13745 } 13746 if x.Aux != s { 13747 break 13748 } 13749 if idx != x.Args[0] { 13750 break 13751 } 13752 if p != x.Args[1] { 13753 break 13754 } 13755 if w != x.Args[2] { 13756 break 13757 } 13758 mem := x.Args[3] 13759 if !(x.Uses == 1 && clobber(x)) { 13760 break 13761 } 13762 v.reset(OpS390XMOVWBRstoreidx) 13763 v.AuxInt = i - 2 13764 v.Aux = s 13765 v.AddArg(p) 13766 v.AddArg(idx) 13767 v.AddArg(w) 13768 v.AddArg(mem) 13769 return true 13770 } 13771 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13772 // cond: x.Uses == 1 && clobber(x) 13773 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13774 for { 13775 i := v.AuxInt 13776 s := v.Aux 13777 idx := v.Args[0] 13778 p := v.Args[1] 13779 v_2 := v.Args[2] 13780 if v_2.Op != OpS390XSRWconst { 13781 break 13782 } 13783 if v_2.AuxInt != 16 { 13784 break 13785 } 13786 w := v_2.Args[0] 13787 x := v.Args[3] 13788 if x.Op != OpS390XMOVHBRstoreidx { 13789 break 13790 } 13791 if x.AuxInt != i-2 { 13792 break 13793 } 13794 if x.Aux != s { 13795 break 13796 } 13797 if p != x.Args[0] { 13798 break 13799 } 13800 if idx != x.Args[1] { 13801 break 13802 } 13803 if w != x.Args[2] { 13804 break 13805 } 13806 mem := x.Args[3] 13807 if !(x.Uses == 1 && clobber(x)) { 13808 break 13809 } 13810 v.reset(OpS390XMOVWBRstoreidx) 13811 v.AuxInt = i - 2 13812 v.Aux = s 13813 v.AddArg(p) 13814 v.AddArg(idx) 13815 v.AddArg(w) 13816 v.AddArg(mem) 13817 return true 13818 } 13819 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13820 // cond: x.Uses == 1 && clobber(x) 13821 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13822 for { 13823 i := v.AuxInt 13824 s := v.Aux 13825 idx := v.Args[0] 13826 p := v.Args[1] 13827 v_2 := v.Args[2] 13828 if v_2.Op != OpS390XSRWconst { 13829 break 13830 } 13831 if v_2.AuxInt != 16 { 13832 break 13833 } 13834 w := v_2.Args[0] 13835 x := v.Args[3] 13836 if x.Op != OpS390XMOVHBRstoreidx { 13837 break 13838 } 13839 if x.AuxInt != i-2 { 13840 break 13841 } 13842 if x.Aux != s { 13843 break 13844 } 13845 if idx != x.Args[0] { 13846 break 13847 } 13848 if p != x.Args[1] { 13849 break 13850 } 13851 if w != x.Args[2] { 13852 break 13853 } 13854 mem := x.Args[3] 13855 if !(x.Uses == 1 && clobber(x)) { 13856 break 13857 } 13858 v.reset(OpS390XMOVWBRstoreidx) 13859 v.AuxInt = i - 2 13860 v.Aux = s 13861 v.AddArg(p) 13862 v.AddArg(idx) 13863 v.AddArg(w) 13864 v.AddArg(mem) 13865 return true 13866 } 13867 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 13868 // cond: x.Uses == 1 && clobber(x) 13869 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13870 for { 13871 i := v.AuxInt 13872 s := v.Aux 13873 p := v.Args[0] 13874 idx := v.Args[1] 13875 v_2 := v.Args[2] 13876 if v_2.Op != OpS390XSRWconst { 13877 break 13878 } 13879 j := v_2.AuxInt 13880 w := v_2.Args[0] 13881 x := v.Args[3] 13882 if x.Op != OpS390XMOVHBRstoreidx { 13883 break 13884 } 13885 if x.AuxInt != i-2 { 13886 break 13887 } 13888 if x.Aux != s { 13889 break 13890 } 13891 if p != x.Args[0] { 13892 break 13893 } 13894 if idx != x.Args[1] { 13895 break 13896 } 13897 w0 := x.Args[2] 13898 if w0.Op != OpS390XSRWconst { 13899 break 13900 } 13901 if w0.AuxInt != j-16 { 13902 break 13903 } 13904 if w != w0.Args[0] { 13905 break 13906 } 13907 mem := x.Args[3] 13908 if !(x.Uses == 1 && clobber(x)) { 13909 break 13910 } 13911 v.reset(OpS390XMOVWBRstoreidx) 13912 v.AuxInt = i - 2 13913 v.Aux = s 13914 v.AddArg(p) 13915 v.AddArg(idx) 13916 v.AddArg(w0) 13917 v.AddArg(mem) 13918 return true 13919 } 13920 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 13921 // cond: x.Uses == 1 && clobber(x) 13922 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13923 for { 13924 i := v.AuxInt 13925 s := v.Aux 13926 p := v.Args[0] 13927 idx := v.Args[1] 13928 v_2 := v.Args[2] 13929 if v_2.Op != OpS390XSRWconst { 13930 break 13931 } 13932 j := v_2.AuxInt 13933 w := v_2.Args[0] 13934 x := v.Args[3] 13935 if x.Op != OpS390XMOVHBRstoreidx { 13936 break 13937 } 13938 if x.AuxInt != i-2 { 13939 break 13940 } 13941 if x.Aux != s { 13942 break 13943 } 13944 if idx != x.Args[0] { 13945 break 13946 } 13947 if p != x.Args[1] { 13948 break 13949 } 13950 w0 := x.Args[2] 13951 if w0.Op != OpS390XSRWconst { 13952 break 13953 } 13954 if w0.AuxInt != j-16 { 13955 break 13956 } 13957 if w != w0.Args[0] { 13958 break 13959 } 13960 mem := x.Args[3] 13961 if !(x.Uses == 1 && clobber(x)) { 13962 break 13963 } 13964 v.reset(OpS390XMOVWBRstoreidx) 13965 v.AuxInt = i - 2 13966 v.Aux = s 13967 v.AddArg(p) 13968 v.AddArg(idx) 13969 v.AddArg(w0) 13970 v.AddArg(mem) 13971 return true 13972 } 13973 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 13974 // cond: x.Uses == 1 && clobber(x) 13975 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13976 for { 13977 i := v.AuxInt 13978 s := v.Aux 13979 idx := v.Args[0] 13980 p := v.Args[1] 13981 v_2 := v.Args[2] 13982 if v_2.Op != OpS390XSRWconst { 13983 break 13984 } 13985 j := v_2.AuxInt 13986 w := v_2.Args[0] 13987 x := v.Args[3] 13988 if x.Op != OpS390XMOVHBRstoreidx { 13989 break 13990 } 13991 if x.AuxInt != i-2 { 13992 break 13993 } 13994 if x.Aux != s { 13995 break 13996 } 13997 if p != x.Args[0] { 13998 break 13999 } 14000 if idx != x.Args[1] { 14001 break 14002 } 14003 w0 := x.Args[2] 14004 if w0.Op != OpS390XSRWconst { 14005 break 14006 } 14007 if w0.AuxInt != j-16 { 14008 break 14009 } 14010 if w != w0.Args[0] { 14011 break 14012 } 14013 mem := x.Args[3] 14014 if !(x.Uses == 1 && clobber(x)) { 14015 break 14016 } 14017 v.reset(OpS390XMOVWBRstoreidx) 14018 v.AuxInt = i - 2 14019 v.Aux = s 14020 v.AddArg(p) 14021 v.AddArg(idx) 14022 v.AddArg(w0) 14023 v.AddArg(mem) 14024 return true 14025 } 14026 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14027 // cond: x.Uses == 1 && clobber(x) 14028 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14029 for { 14030 i := v.AuxInt 14031 s := v.Aux 14032 idx := v.Args[0] 14033 p := v.Args[1] 14034 v_2 := v.Args[2] 14035 if v_2.Op != OpS390XSRWconst { 14036 break 14037 } 14038 j := v_2.AuxInt 14039 w := v_2.Args[0] 14040 x := v.Args[3] 14041 if x.Op != OpS390XMOVHBRstoreidx { 14042 break 14043 } 14044 if x.AuxInt != i-2 { 14045 break 14046 } 14047 if x.Aux != s { 14048 break 14049 } 14050 if idx != x.Args[0] { 14051 break 14052 } 14053 if p != x.Args[1] { 14054 break 14055 } 14056 w0 := x.Args[2] 14057 if w0.Op != OpS390XSRWconst { 14058 break 14059 } 14060 if w0.AuxInt != j-16 { 14061 break 14062 } 14063 if w != w0.Args[0] { 14064 break 14065 } 14066 mem := x.Args[3] 14067 if !(x.Uses == 1 && clobber(x)) { 14068 break 14069 } 14070 v.reset(OpS390XMOVWBRstoreidx) 14071 v.AuxInt = i - 2 14072 v.Aux = s 14073 v.AddArg(p) 14074 v.AddArg(idx) 14075 v.AddArg(w0) 14076 v.AddArg(mem) 14077 return true 14078 } 14079 return false 14080 } 14081 func rewriteValueS390X_OpS390XMOVHZload(v *Value) bool { 14082 // match: (MOVHZload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 14083 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 14084 // result: (MOVHZreg x) 14085 for { 14086 off := v.AuxInt 14087 sym := v.Aux 14088 ptr := v.Args[0] 14089 v_1 := v.Args[1] 14090 if v_1.Op != OpS390XMOVHstore { 14091 break 14092 } 14093 off2 := v_1.AuxInt 14094 sym2 := v_1.Aux 14095 ptr2 := v_1.Args[0] 14096 x := v_1.Args[1] 14097 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 14098 break 14099 } 14100 v.reset(OpS390XMOVHZreg) 14101 v.AddArg(x) 14102 return true 14103 } 14104 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 14105 // cond: is20Bit(off1+off2) 14106 // result: (MOVHZload [off1+off2] {sym} ptr mem) 14107 for { 14108 off1 := v.AuxInt 14109 sym := v.Aux 14110 v_0 := v.Args[0] 14111 if v_0.Op != OpS390XADDconst { 14112 break 14113 } 14114 off2 := v_0.AuxInt 14115 ptr := v_0.Args[0] 14116 mem := v.Args[1] 14117 if !(is20Bit(off1 + off2)) { 14118 break 14119 } 14120 v.reset(OpS390XMOVHZload) 14121 v.AuxInt = off1 + off2 14122 v.Aux = sym 14123 v.AddArg(ptr) 14124 v.AddArg(mem) 14125 return true 14126 } 14127 // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 14128 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14129 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14130 for { 14131 off1 := v.AuxInt 14132 sym1 := v.Aux 14133 v_0 := v.Args[0] 14134 if v_0.Op != OpS390XMOVDaddr { 14135 break 14136 } 14137 off2 := v_0.AuxInt 14138 sym2 := v_0.Aux 14139 base := v_0.Args[0] 14140 mem := v.Args[1] 14141 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14142 break 14143 } 14144 v.reset(OpS390XMOVHZload) 14145 v.AuxInt = off1 + off2 14146 v.Aux = mergeSym(sym1, sym2) 14147 v.AddArg(base) 14148 v.AddArg(mem) 14149 return true 14150 } 14151 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 14152 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14153 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 14154 for { 14155 off1 := v.AuxInt 14156 sym1 := v.Aux 14157 v_0 := v.Args[0] 14158 if v_0.Op != OpS390XMOVDaddridx { 14159 break 14160 } 14161 off2 := v_0.AuxInt 14162 sym2 := v_0.Aux 14163 ptr := v_0.Args[0] 14164 idx := v_0.Args[1] 14165 mem := v.Args[1] 14166 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14167 break 14168 } 14169 v.reset(OpS390XMOVHZloadidx) 14170 v.AuxInt = off1 + off2 14171 v.Aux = mergeSym(sym1, sym2) 14172 v.AddArg(ptr) 14173 v.AddArg(idx) 14174 v.AddArg(mem) 14175 return true 14176 } 14177 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 14178 // cond: ptr.Op != OpSB 14179 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 14180 for { 14181 off := v.AuxInt 14182 sym := v.Aux 14183 v_0 := v.Args[0] 14184 if v_0.Op != OpS390XADD { 14185 break 14186 } 14187 ptr := v_0.Args[0] 14188 idx := v_0.Args[1] 14189 mem := v.Args[1] 14190 if !(ptr.Op != OpSB) { 14191 break 14192 } 14193 v.reset(OpS390XMOVHZloadidx) 14194 v.AuxInt = off 14195 v.Aux = sym 14196 v.AddArg(ptr) 14197 v.AddArg(idx) 14198 v.AddArg(mem) 14199 return true 14200 } 14201 return false 14202 } 14203 func rewriteValueS390X_OpS390XMOVHZloadidx(v *Value) bool { 14204 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 14205 // cond: 14206 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14207 for { 14208 c := v.AuxInt 14209 sym := v.Aux 14210 v_0 := v.Args[0] 14211 if v_0.Op != OpS390XADDconst { 14212 break 14213 } 14214 d := v_0.AuxInt 14215 ptr := v_0.Args[0] 14216 idx := v.Args[1] 14217 mem := v.Args[2] 14218 v.reset(OpS390XMOVHZloadidx) 14219 v.AuxInt = c + d 14220 v.Aux = sym 14221 v.AddArg(ptr) 14222 v.AddArg(idx) 14223 v.AddArg(mem) 14224 return true 14225 } 14226 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 14227 // cond: 14228 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14229 for { 14230 c := v.AuxInt 14231 sym := v.Aux 14232 idx := v.Args[0] 14233 v_1 := v.Args[1] 14234 if v_1.Op != OpS390XADDconst { 14235 break 14236 } 14237 d := v_1.AuxInt 14238 ptr := v_1.Args[0] 14239 mem := v.Args[2] 14240 v.reset(OpS390XMOVHZloadidx) 14241 v.AuxInt = c + d 14242 v.Aux = sym 14243 v.AddArg(ptr) 14244 v.AddArg(idx) 14245 v.AddArg(mem) 14246 return true 14247 } 14248 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 14249 // cond: 14250 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14251 for { 14252 c := v.AuxInt 14253 sym := v.Aux 14254 ptr := v.Args[0] 14255 v_1 := v.Args[1] 14256 if v_1.Op != OpS390XADDconst { 14257 break 14258 } 14259 d := v_1.AuxInt 14260 idx := v_1.Args[0] 14261 mem := v.Args[2] 14262 v.reset(OpS390XMOVHZloadidx) 14263 v.AuxInt = c + d 14264 v.Aux = sym 14265 v.AddArg(ptr) 14266 v.AddArg(idx) 14267 v.AddArg(mem) 14268 return true 14269 } 14270 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 14271 // cond: 14272 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14273 for { 14274 c := v.AuxInt 14275 sym := v.Aux 14276 v_0 := v.Args[0] 14277 if v_0.Op != OpS390XADDconst { 14278 break 14279 } 14280 d := v_0.AuxInt 14281 idx := v_0.Args[0] 14282 ptr := v.Args[1] 14283 mem := v.Args[2] 14284 v.reset(OpS390XMOVHZloadidx) 14285 v.AuxInt = c + d 14286 v.Aux = sym 14287 v.AddArg(ptr) 14288 v.AddArg(idx) 14289 v.AddArg(mem) 14290 return true 14291 } 14292 return false 14293 } 14294 func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { 14295 b := v.Block 14296 _ = b 14297 // match: (MOVHZreg x:(MOVBZload _ _)) 14298 // cond: 14299 // result: (MOVDreg x) 14300 for { 14301 x := v.Args[0] 14302 if x.Op != OpS390XMOVBZload { 14303 break 14304 } 14305 v.reset(OpS390XMOVDreg) 14306 v.AddArg(x) 14307 return true 14308 } 14309 // match: (MOVHZreg x:(MOVHZload _ _)) 14310 // cond: 14311 // result: (MOVDreg x) 14312 for { 14313 x := v.Args[0] 14314 if x.Op != OpS390XMOVHZload { 14315 break 14316 } 14317 v.reset(OpS390XMOVDreg) 14318 v.AddArg(x) 14319 return true 14320 } 14321 // match: (MOVHZreg x:(Arg <t>)) 14322 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 14323 // result: (MOVDreg x) 14324 for { 14325 x := v.Args[0] 14326 if x.Op != OpArg { 14327 break 14328 } 14329 t := x.Type 14330 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 14331 break 14332 } 14333 v.reset(OpS390XMOVDreg) 14334 v.AddArg(x) 14335 return true 14336 } 14337 // match: (MOVHZreg x:(MOVBZreg _)) 14338 // cond: 14339 // result: (MOVDreg x) 14340 for { 14341 x := v.Args[0] 14342 if x.Op != OpS390XMOVBZreg { 14343 break 14344 } 14345 v.reset(OpS390XMOVDreg) 14346 v.AddArg(x) 14347 return true 14348 } 14349 // match: (MOVHZreg x:(MOVHZreg _)) 14350 // cond: 14351 // result: (MOVDreg x) 14352 for { 14353 x := v.Args[0] 14354 if x.Op != OpS390XMOVHZreg { 14355 break 14356 } 14357 v.reset(OpS390XMOVDreg) 14358 v.AddArg(x) 14359 return true 14360 } 14361 // match: (MOVHZreg (MOVDconst [c])) 14362 // cond: 14363 // result: (MOVDconst [int64(uint16(c))]) 14364 for { 14365 v_0 := v.Args[0] 14366 if v_0.Op != OpS390XMOVDconst { 14367 break 14368 } 14369 c := v_0.AuxInt 14370 v.reset(OpS390XMOVDconst) 14371 v.AuxInt = int64(uint16(c)) 14372 return true 14373 } 14374 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 14375 // cond: x.Uses == 1 && clobber(x) 14376 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 14377 for { 14378 x := v.Args[0] 14379 if x.Op != OpS390XMOVHZload { 14380 break 14381 } 14382 off := x.AuxInt 14383 sym := x.Aux 14384 ptr := x.Args[0] 14385 mem := x.Args[1] 14386 if !(x.Uses == 1 && clobber(x)) { 14387 break 14388 } 14389 b = x.Block 14390 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 14391 v.reset(OpCopy) 14392 v.AddArg(v0) 14393 v0.AuxInt = off 14394 v0.Aux = sym 14395 v0.AddArg(ptr) 14396 v0.AddArg(mem) 14397 return true 14398 } 14399 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 14400 // cond: x.Uses == 1 && clobber(x) 14401 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 14402 for { 14403 x := v.Args[0] 14404 if x.Op != OpS390XMOVHZloadidx { 14405 break 14406 } 14407 off := x.AuxInt 14408 sym := x.Aux 14409 ptr := x.Args[0] 14410 idx := x.Args[1] 14411 mem := x.Args[2] 14412 if !(x.Uses == 1 && clobber(x)) { 14413 break 14414 } 14415 b = x.Block 14416 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 14417 v.reset(OpCopy) 14418 v.AddArg(v0) 14419 v0.AuxInt = off 14420 v0.Aux = sym 14421 v0.AddArg(ptr) 14422 v0.AddArg(idx) 14423 v0.AddArg(mem) 14424 return true 14425 } 14426 return false 14427 } 14428 func rewriteValueS390X_OpS390XMOVHload(v *Value) bool { 14429 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 14430 // cond: is20Bit(off1+off2) 14431 // result: (MOVHload [off1+off2] {sym} ptr mem) 14432 for { 14433 off1 := v.AuxInt 14434 sym := v.Aux 14435 v_0 := v.Args[0] 14436 if v_0.Op != OpS390XADDconst { 14437 break 14438 } 14439 off2 := v_0.AuxInt 14440 ptr := v_0.Args[0] 14441 mem := v.Args[1] 14442 if !(is20Bit(off1 + off2)) { 14443 break 14444 } 14445 v.reset(OpS390XMOVHload) 14446 v.AuxInt = off1 + off2 14447 v.Aux = sym 14448 v.AddArg(ptr) 14449 v.AddArg(mem) 14450 return true 14451 } 14452 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 14453 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14454 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14455 for { 14456 off1 := v.AuxInt 14457 sym1 := v.Aux 14458 v_0 := v.Args[0] 14459 if v_0.Op != OpS390XMOVDaddr { 14460 break 14461 } 14462 off2 := v_0.AuxInt 14463 sym2 := v_0.Aux 14464 base := v_0.Args[0] 14465 mem := v.Args[1] 14466 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14467 break 14468 } 14469 v.reset(OpS390XMOVHload) 14470 v.AuxInt = off1 + off2 14471 v.Aux = mergeSym(sym1, sym2) 14472 v.AddArg(base) 14473 v.AddArg(mem) 14474 return true 14475 } 14476 return false 14477 } 14478 func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { 14479 b := v.Block 14480 _ = b 14481 // match: (MOVHreg x:(MOVBload _ _)) 14482 // cond: 14483 // result: (MOVDreg x) 14484 for { 14485 x := v.Args[0] 14486 if x.Op != OpS390XMOVBload { 14487 break 14488 } 14489 v.reset(OpS390XMOVDreg) 14490 v.AddArg(x) 14491 return true 14492 } 14493 // match: (MOVHreg x:(MOVBZload _ _)) 14494 // cond: 14495 // result: (MOVDreg x) 14496 for { 14497 x := v.Args[0] 14498 if x.Op != OpS390XMOVBZload { 14499 break 14500 } 14501 v.reset(OpS390XMOVDreg) 14502 v.AddArg(x) 14503 return true 14504 } 14505 // match: (MOVHreg x:(MOVHload _ _)) 14506 // cond: 14507 // result: (MOVDreg x) 14508 for { 14509 x := v.Args[0] 14510 if x.Op != OpS390XMOVHload { 14511 break 14512 } 14513 v.reset(OpS390XMOVDreg) 14514 v.AddArg(x) 14515 return true 14516 } 14517 // match: (MOVHreg x:(Arg <t>)) 14518 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 14519 // result: (MOVDreg x) 14520 for { 14521 x := v.Args[0] 14522 if x.Op != OpArg { 14523 break 14524 } 14525 t := x.Type 14526 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 14527 break 14528 } 14529 v.reset(OpS390XMOVDreg) 14530 v.AddArg(x) 14531 return true 14532 } 14533 // match: (MOVHreg x:(MOVBreg _)) 14534 // cond: 14535 // result: (MOVDreg x) 14536 for { 14537 x := v.Args[0] 14538 if x.Op != OpS390XMOVBreg { 14539 break 14540 } 14541 v.reset(OpS390XMOVDreg) 14542 v.AddArg(x) 14543 return true 14544 } 14545 // match: (MOVHreg x:(MOVBZreg _)) 14546 // cond: 14547 // result: (MOVDreg x) 14548 for { 14549 x := v.Args[0] 14550 if x.Op != OpS390XMOVBZreg { 14551 break 14552 } 14553 v.reset(OpS390XMOVDreg) 14554 v.AddArg(x) 14555 return true 14556 } 14557 // match: (MOVHreg x:(MOVHreg _)) 14558 // cond: 14559 // result: (MOVDreg x) 14560 for { 14561 x := v.Args[0] 14562 if x.Op != OpS390XMOVHreg { 14563 break 14564 } 14565 v.reset(OpS390XMOVDreg) 14566 v.AddArg(x) 14567 return true 14568 } 14569 // match: (MOVHreg (MOVDconst [c])) 14570 // cond: 14571 // result: (MOVDconst [int64(int16(c))]) 14572 for { 14573 v_0 := v.Args[0] 14574 if v_0.Op != OpS390XMOVDconst { 14575 break 14576 } 14577 c := v_0.AuxInt 14578 v.reset(OpS390XMOVDconst) 14579 v.AuxInt = int64(int16(c)) 14580 return true 14581 } 14582 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 14583 // cond: x.Uses == 1 && clobber(x) 14584 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 14585 for { 14586 x := v.Args[0] 14587 if x.Op != OpS390XMOVHZload { 14588 break 14589 } 14590 off := x.AuxInt 14591 sym := x.Aux 14592 ptr := x.Args[0] 14593 mem := x.Args[1] 14594 if !(x.Uses == 1 && clobber(x)) { 14595 break 14596 } 14597 b = x.Block 14598 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 14599 v.reset(OpCopy) 14600 v.AddArg(v0) 14601 v0.AuxInt = off 14602 v0.Aux = sym 14603 v0.AddArg(ptr) 14604 v0.AddArg(mem) 14605 return true 14606 } 14607 return false 14608 } 14609 func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { 14610 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 14611 // cond: 14612 // result: (MOVHstore [off] {sym} ptr x mem) 14613 for { 14614 off := v.AuxInt 14615 sym := v.Aux 14616 ptr := v.Args[0] 14617 v_1 := v.Args[1] 14618 if v_1.Op != OpS390XMOVHreg { 14619 break 14620 } 14621 x := v_1.Args[0] 14622 mem := v.Args[2] 14623 v.reset(OpS390XMOVHstore) 14624 v.AuxInt = off 14625 v.Aux = sym 14626 v.AddArg(ptr) 14627 v.AddArg(x) 14628 v.AddArg(mem) 14629 return true 14630 } 14631 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 14632 // cond: 14633 // result: (MOVHstore [off] {sym} ptr x mem) 14634 for { 14635 off := v.AuxInt 14636 sym := v.Aux 14637 ptr := v.Args[0] 14638 v_1 := v.Args[1] 14639 if v_1.Op != OpS390XMOVHZreg { 14640 break 14641 } 14642 x := v_1.Args[0] 14643 mem := v.Args[2] 14644 v.reset(OpS390XMOVHstore) 14645 v.AuxInt = off 14646 v.Aux = sym 14647 v.AddArg(ptr) 14648 v.AddArg(x) 14649 v.AddArg(mem) 14650 return true 14651 } 14652 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 14653 // cond: is20Bit(off1+off2) 14654 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 14655 for { 14656 off1 := v.AuxInt 14657 sym := v.Aux 14658 v_0 := v.Args[0] 14659 if v_0.Op != OpS390XADDconst { 14660 break 14661 } 14662 off2 := v_0.AuxInt 14663 ptr := v_0.Args[0] 14664 val := v.Args[1] 14665 mem := v.Args[2] 14666 if !(is20Bit(off1 + off2)) { 14667 break 14668 } 14669 v.reset(OpS390XMOVHstore) 14670 v.AuxInt = off1 + off2 14671 v.Aux = sym 14672 v.AddArg(ptr) 14673 v.AddArg(val) 14674 v.AddArg(mem) 14675 return true 14676 } 14677 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 14678 // cond: validOff(off) && ptr.Op != OpSB 14679 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 14680 for { 14681 off := v.AuxInt 14682 sym := v.Aux 14683 ptr := v.Args[0] 14684 v_1 := v.Args[1] 14685 if v_1.Op != OpS390XMOVDconst { 14686 break 14687 } 14688 c := v_1.AuxInt 14689 mem := v.Args[2] 14690 if !(validOff(off) && ptr.Op != OpSB) { 14691 break 14692 } 14693 v.reset(OpS390XMOVHstoreconst) 14694 v.AuxInt = makeValAndOff(int64(int16(c)), off) 14695 v.Aux = sym 14696 v.AddArg(ptr) 14697 v.AddArg(mem) 14698 return true 14699 } 14700 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 14701 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14702 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 14703 for { 14704 off1 := v.AuxInt 14705 sym1 := v.Aux 14706 v_0 := v.Args[0] 14707 if v_0.Op != OpS390XMOVDaddr { 14708 break 14709 } 14710 off2 := v_0.AuxInt 14711 sym2 := v_0.Aux 14712 base := v_0.Args[0] 14713 val := v.Args[1] 14714 mem := v.Args[2] 14715 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14716 break 14717 } 14718 v.reset(OpS390XMOVHstore) 14719 v.AuxInt = off1 + off2 14720 v.Aux = mergeSym(sym1, sym2) 14721 v.AddArg(base) 14722 v.AddArg(val) 14723 v.AddArg(mem) 14724 return true 14725 } 14726 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 14727 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14728 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 14729 for { 14730 off1 := v.AuxInt 14731 sym1 := v.Aux 14732 v_0 := v.Args[0] 14733 if v_0.Op != OpS390XMOVDaddridx { 14734 break 14735 } 14736 off2 := v_0.AuxInt 14737 sym2 := v_0.Aux 14738 ptr := v_0.Args[0] 14739 idx := v_0.Args[1] 14740 val := v.Args[1] 14741 mem := v.Args[2] 14742 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14743 break 14744 } 14745 v.reset(OpS390XMOVHstoreidx) 14746 v.AuxInt = off1 + off2 14747 v.Aux = mergeSym(sym1, sym2) 14748 v.AddArg(ptr) 14749 v.AddArg(idx) 14750 v.AddArg(val) 14751 v.AddArg(mem) 14752 return true 14753 } 14754 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 14755 // cond: ptr.Op != OpSB 14756 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 14757 for { 14758 off := v.AuxInt 14759 sym := v.Aux 14760 v_0 := v.Args[0] 14761 if v_0.Op != OpS390XADD { 14762 break 14763 } 14764 ptr := v_0.Args[0] 14765 idx := v_0.Args[1] 14766 val := v.Args[1] 14767 mem := v.Args[2] 14768 if !(ptr.Op != OpSB) { 14769 break 14770 } 14771 v.reset(OpS390XMOVHstoreidx) 14772 v.AuxInt = off 14773 v.Aux = sym 14774 v.AddArg(ptr) 14775 v.AddArg(idx) 14776 v.AddArg(val) 14777 v.AddArg(mem) 14778 return true 14779 } 14780 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 14781 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14782 // result: (MOVWstore [i-2] {s} p w mem) 14783 for { 14784 i := v.AuxInt 14785 s := v.Aux 14786 p := v.Args[0] 14787 w := v.Args[1] 14788 x := v.Args[2] 14789 if x.Op != OpS390XMOVHstore { 14790 break 14791 } 14792 if x.AuxInt != i-2 { 14793 break 14794 } 14795 if x.Aux != s { 14796 break 14797 } 14798 if p != x.Args[0] { 14799 break 14800 } 14801 x_1 := x.Args[1] 14802 if x_1.Op != OpS390XSRDconst { 14803 break 14804 } 14805 if x_1.AuxInt != 16 { 14806 break 14807 } 14808 if w != x_1.Args[0] { 14809 break 14810 } 14811 mem := x.Args[2] 14812 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14813 break 14814 } 14815 v.reset(OpS390XMOVWstore) 14816 v.AuxInt = i - 2 14817 v.Aux = s 14818 v.AddArg(p) 14819 v.AddArg(w) 14820 v.AddArg(mem) 14821 return true 14822 } 14823 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 14824 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14825 // result: (MOVWstore [i-2] {s} p w0 mem) 14826 for { 14827 i := v.AuxInt 14828 s := v.Aux 14829 p := v.Args[0] 14830 w0 := v.Args[1] 14831 if w0.Op != OpS390XSRDconst { 14832 break 14833 } 14834 j := w0.AuxInt 14835 w := w0.Args[0] 14836 x := v.Args[2] 14837 if x.Op != OpS390XMOVHstore { 14838 break 14839 } 14840 if x.AuxInt != i-2 { 14841 break 14842 } 14843 if x.Aux != s { 14844 break 14845 } 14846 if p != x.Args[0] { 14847 break 14848 } 14849 x_1 := x.Args[1] 14850 if x_1.Op != OpS390XSRDconst { 14851 break 14852 } 14853 if x_1.AuxInt != j+16 { 14854 break 14855 } 14856 if w != x_1.Args[0] { 14857 break 14858 } 14859 mem := x.Args[2] 14860 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14861 break 14862 } 14863 v.reset(OpS390XMOVWstore) 14864 v.AuxInt = i - 2 14865 v.Aux = s 14866 v.AddArg(p) 14867 v.AddArg(w0) 14868 v.AddArg(mem) 14869 return true 14870 } 14871 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 14872 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14873 // result: (MOVWstore [i-2] {s} p w mem) 14874 for { 14875 i := v.AuxInt 14876 s := v.Aux 14877 p := v.Args[0] 14878 w := v.Args[1] 14879 x := v.Args[2] 14880 if x.Op != OpS390XMOVHstore { 14881 break 14882 } 14883 if x.AuxInt != i-2 { 14884 break 14885 } 14886 if x.Aux != s { 14887 break 14888 } 14889 if p != x.Args[0] { 14890 break 14891 } 14892 x_1 := x.Args[1] 14893 if x_1.Op != OpS390XSRWconst { 14894 break 14895 } 14896 if x_1.AuxInt != 16 { 14897 break 14898 } 14899 if w != x_1.Args[0] { 14900 break 14901 } 14902 mem := x.Args[2] 14903 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14904 break 14905 } 14906 v.reset(OpS390XMOVWstore) 14907 v.AuxInt = i - 2 14908 v.Aux = s 14909 v.AddArg(p) 14910 v.AddArg(w) 14911 v.AddArg(mem) 14912 return true 14913 } 14914 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 14915 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14916 // result: (MOVWstore [i-2] {s} p w0 mem) 14917 for { 14918 i := v.AuxInt 14919 s := v.Aux 14920 p := v.Args[0] 14921 w0 := v.Args[1] 14922 if w0.Op != OpS390XSRWconst { 14923 break 14924 } 14925 j := w0.AuxInt 14926 w := w0.Args[0] 14927 x := v.Args[2] 14928 if x.Op != OpS390XMOVHstore { 14929 break 14930 } 14931 if x.AuxInt != i-2 { 14932 break 14933 } 14934 if x.Aux != s { 14935 break 14936 } 14937 if p != x.Args[0] { 14938 break 14939 } 14940 x_1 := x.Args[1] 14941 if x_1.Op != OpS390XSRWconst { 14942 break 14943 } 14944 if x_1.AuxInt != j+16 { 14945 break 14946 } 14947 if w != x_1.Args[0] { 14948 break 14949 } 14950 mem := x.Args[2] 14951 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14952 break 14953 } 14954 v.reset(OpS390XMOVWstore) 14955 v.AuxInt = i - 2 14956 v.Aux = s 14957 v.AddArg(p) 14958 v.AddArg(w0) 14959 v.AddArg(mem) 14960 return true 14961 } 14962 return false 14963 } 14964 func rewriteValueS390X_OpS390XMOVHstoreconst(v *Value) bool { 14965 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 14966 // cond: ValAndOff(sc).canAdd(off) 14967 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 14968 for { 14969 sc := v.AuxInt 14970 s := v.Aux 14971 v_0 := v.Args[0] 14972 if v_0.Op != OpS390XADDconst { 14973 break 14974 } 14975 off := v_0.AuxInt 14976 ptr := v_0.Args[0] 14977 mem := v.Args[1] 14978 if !(ValAndOff(sc).canAdd(off)) { 14979 break 14980 } 14981 v.reset(OpS390XMOVHstoreconst) 14982 v.AuxInt = ValAndOff(sc).add(off) 14983 v.Aux = s 14984 v.AddArg(ptr) 14985 v.AddArg(mem) 14986 return true 14987 } 14988 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 14989 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 14990 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 14991 for { 14992 sc := v.AuxInt 14993 sym1 := v.Aux 14994 v_0 := v.Args[0] 14995 if v_0.Op != OpS390XMOVDaddr { 14996 break 14997 } 14998 off := v_0.AuxInt 14999 sym2 := v_0.Aux 15000 ptr := v_0.Args[0] 15001 mem := v.Args[1] 15002 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 15003 break 15004 } 15005 v.reset(OpS390XMOVHstoreconst) 15006 v.AuxInt = ValAndOff(sc).add(off) 15007 v.Aux = mergeSym(sym1, sym2) 15008 v.AddArg(ptr) 15009 v.AddArg(mem) 15010 return true 15011 } 15012 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 15013 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 15014 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16, ValAndOff(a).Off())] {s} p mem) 15015 for { 15016 c := v.AuxInt 15017 s := v.Aux 15018 p := v.Args[0] 15019 x := v.Args[1] 15020 if x.Op != OpS390XMOVHstoreconst { 15021 break 15022 } 15023 a := x.AuxInt 15024 if x.Aux != s { 15025 break 15026 } 15027 if p != x.Args[0] { 15028 break 15029 } 15030 mem := x.Args[1] 15031 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 15032 break 15033 } 15034 v.reset(OpS390XMOVWstoreconst) 15035 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xffff|ValAndOff(a).Val()<<16, ValAndOff(a).Off()) 15036 v.Aux = s 15037 v.AddArg(p) 15038 v.AddArg(mem) 15039 return true 15040 } 15041 return false 15042 } 15043 func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { 15044 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 15045 // cond: 15046 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15047 for { 15048 c := v.AuxInt 15049 sym := v.Aux 15050 v_0 := v.Args[0] 15051 if v_0.Op != OpS390XADDconst { 15052 break 15053 } 15054 d := v_0.AuxInt 15055 ptr := v_0.Args[0] 15056 idx := v.Args[1] 15057 val := v.Args[2] 15058 mem := v.Args[3] 15059 v.reset(OpS390XMOVHstoreidx) 15060 v.AuxInt = c + d 15061 v.Aux = sym 15062 v.AddArg(ptr) 15063 v.AddArg(idx) 15064 v.AddArg(val) 15065 v.AddArg(mem) 15066 return true 15067 } 15068 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 15069 // cond: 15070 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15071 for { 15072 c := v.AuxInt 15073 sym := v.Aux 15074 idx := v.Args[0] 15075 v_1 := v.Args[1] 15076 if v_1.Op != OpS390XADDconst { 15077 break 15078 } 15079 d := v_1.AuxInt 15080 ptr := v_1.Args[0] 15081 val := v.Args[2] 15082 mem := v.Args[3] 15083 v.reset(OpS390XMOVHstoreidx) 15084 v.AuxInt = c + d 15085 v.Aux = sym 15086 v.AddArg(ptr) 15087 v.AddArg(idx) 15088 v.AddArg(val) 15089 v.AddArg(mem) 15090 return true 15091 } 15092 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 15093 // cond: 15094 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15095 for { 15096 c := v.AuxInt 15097 sym := v.Aux 15098 ptr := v.Args[0] 15099 v_1 := v.Args[1] 15100 if v_1.Op != OpS390XADDconst { 15101 break 15102 } 15103 d := v_1.AuxInt 15104 idx := v_1.Args[0] 15105 val := v.Args[2] 15106 mem := v.Args[3] 15107 v.reset(OpS390XMOVHstoreidx) 15108 v.AuxInt = c + d 15109 v.Aux = sym 15110 v.AddArg(ptr) 15111 v.AddArg(idx) 15112 v.AddArg(val) 15113 v.AddArg(mem) 15114 return true 15115 } 15116 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 15117 // cond: 15118 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15119 for { 15120 c := v.AuxInt 15121 sym := v.Aux 15122 v_0 := v.Args[0] 15123 if v_0.Op != OpS390XADDconst { 15124 break 15125 } 15126 d := v_0.AuxInt 15127 idx := v_0.Args[0] 15128 ptr := v.Args[1] 15129 val := v.Args[2] 15130 mem := v.Args[3] 15131 v.reset(OpS390XMOVHstoreidx) 15132 v.AuxInt = c + d 15133 v.Aux = sym 15134 v.AddArg(ptr) 15135 v.AddArg(idx) 15136 v.AddArg(val) 15137 v.AddArg(mem) 15138 return true 15139 } 15140 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15141 // cond: x.Uses == 1 && clobber(x) 15142 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15143 for { 15144 i := v.AuxInt 15145 s := v.Aux 15146 p := v.Args[0] 15147 idx := v.Args[1] 15148 w := v.Args[2] 15149 x := v.Args[3] 15150 if x.Op != OpS390XMOVHstoreidx { 15151 break 15152 } 15153 if x.AuxInt != i-2 { 15154 break 15155 } 15156 if x.Aux != s { 15157 break 15158 } 15159 if p != x.Args[0] { 15160 break 15161 } 15162 if idx != x.Args[1] { 15163 break 15164 } 15165 x_2 := x.Args[2] 15166 if x_2.Op != OpS390XSRDconst { 15167 break 15168 } 15169 if x_2.AuxInt != 16 { 15170 break 15171 } 15172 if w != x_2.Args[0] { 15173 break 15174 } 15175 mem := x.Args[3] 15176 if !(x.Uses == 1 && clobber(x)) { 15177 break 15178 } 15179 v.reset(OpS390XMOVWstoreidx) 15180 v.AuxInt = i - 2 15181 v.Aux = s 15182 v.AddArg(p) 15183 v.AddArg(idx) 15184 v.AddArg(w) 15185 v.AddArg(mem) 15186 return true 15187 } 15188 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15189 // cond: x.Uses == 1 && clobber(x) 15190 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15191 for { 15192 i := v.AuxInt 15193 s := v.Aux 15194 p := v.Args[0] 15195 idx := v.Args[1] 15196 w := v.Args[2] 15197 x := v.Args[3] 15198 if x.Op != OpS390XMOVHstoreidx { 15199 break 15200 } 15201 if x.AuxInt != i-2 { 15202 break 15203 } 15204 if x.Aux != s { 15205 break 15206 } 15207 if idx != x.Args[0] { 15208 break 15209 } 15210 if p != x.Args[1] { 15211 break 15212 } 15213 x_2 := x.Args[2] 15214 if x_2.Op != OpS390XSRDconst { 15215 break 15216 } 15217 if x_2.AuxInt != 16 { 15218 break 15219 } 15220 if w != x_2.Args[0] { 15221 break 15222 } 15223 mem := x.Args[3] 15224 if !(x.Uses == 1 && clobber(x)) { 15225 break 15226 } 15227 v.reset(OpS390XMOVWstoreidx) 15228 v.AuxInt = i - 2 15229 v.Aux = s 15230 v.AddArg(p) 15231 v.AddArg(idx) 15232 v.AddArg(w) 15233 v.AddArg(mem) 15234 return true 15235 } 15236 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15237 // cond: x.Uses == 1 && clobber(x) 15238 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15239 for { 15240 i := v.AuxInt 15241 s := v.Aux 15242 idx := v.Args[0] 15243 p := v.Args[1] 15244 w := v.Args[2] 15245 x := v.Args[3] 15246 if x.Op != OpS390XMOVHstoreidx { 15247 break 15248 } 15249 if x.AuxInt != i-2 { 15250 break 15251 } 15252 if x.Aux != s { 15253 break 15254 } 15255 if p != x.Args[0] { 15256 break 15257 } 15258 if idx != x.Args[1] { 15259 break 15260 } 15261 x_2 := x.Args[2] 15262 if x_2.Op != OpS390XSRDconst { 15263 break 15264 } 15265 if x_2.AuxInt != 16 { 15266 break 15267 } 15268 if w != x_2.Args[0] { 15269 break 15270 } 15271 mem := x.Args[3] 15272 if !(x.Uses == 1 && clobber(x)) { 15273 break 15274 } 15275 v.reset(OpS390XMOVWstoreidx) 15276 v.AuxInt = i - 2 15277 v.Aux = s 15278 v.AddArg(p) 15279 v.AddArg(idx) 15280 v.AddArg(w) 15281 v.AddArg(mem) 15282 return true 15283 } 15284 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15285 // cond: x.Uses == 1 && clobber(x) 15286 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15287 for { 15288 i := v.AuxInt 15289 s := v.Aux 15290 idx := v.Args[0] 15291 p := v.Args[1] 15292 w := v.Args[2] 15293 x := v.Args[3] 15294 if x.Op != OpS390XMOVHstoreidx { 15295 break 15296 } 15297 if x.AuxInt != i-2 { 15298 break 15299 } 15300 if x.Aux != s { 15301 break 15302 } 15303 if idx != x.Args[0] { 15304 break 15305 } 15306 if p != x.Args[1] { 15307 break 15308 } 15309 x_2 := x.Args[2] 15310 if x_2.Op != OpS390XSRDconst { 15311 break 15312 } 15313 if x_2.AuxInt != 16 { 15314 break 15315 } 15316 if w != x_2.Args[0] { 15317 break 15318 } 15319 mem := x.Args[3] 15320 if !(x.Uses == 1 && clobber(x)) { 15321 break 15322 } 15323 v.reset(OpS390XMOVWstoreidx) 15324 v.AuxInt = i - 2 15325 v.Aux = s 15326 v.AddArg(p) 15327 v.AddArg(idx) 15328 v.AddArg(w) 15329 v.AddArg(mem) 15330 return true 15331 } 15332 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 15333 // cond: x.Uses == 1 && clobber(x) 15334 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15335 for { 15336 i := v.AuxInt 15337 s := v.Aux 15338 p := v.Args[0] 15339 idx := v.Args[1] 15340 w0 := v.Args[2] 15341 if w0.Op != OpS390XSRDconst { 15342 break 15343 } 15344 j := w0.AuxInt 15345 w := w0.Args[0] 15346 x := v.Args[3] 15347 if x.Op != OpS390XMOVHstoreidx { 15348 break 15349 } 15350 if x.AuxInt != i-2 { 15351 break 15352 } 15353 if x.Aux != s { 15354 break 15355 } 15356 if p != x.Args[0] { 15357 break 15358 } 15359 if idx != x.Args[1] { 15360 break 15361 } 15362 x_2 := x.Args[2] 15363 if x_2.Op != OpS390XSRDconst { 15364 break 15365 } 15366 if x_2.AuxInt != j+16 { 15367 break 15368 } 15369 if w != x_2.Args[0] { 15370 break 15371 } 15372 mem := x.Args[3] 15373 if !(x.Uses == 1 && clobber(x)) { 15374 break 15375 } 15376 v.reset(OpS390XMOVWstoreidx) 15377 v.AuxInt = i - 2 15378 v.Aux = s 15379 v.AddArg(p) 15380 v.AddArg(idx) 15381 v.AddArg(w0) 15382 v.AddArg(mem) 15383 return true 15384 } 15385 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 15386 // cond: x.Uses == 1 && clobber(x) 15387 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15388 for { 15389 i := v.AuxInt 15390 s := v.Aux 15391 p := v.Args[0] 15392 idx := v.Args[1] 15393 w0 := v.Args[2] 15394 if w0.Op != OpS390XSRDconst { 15395 break 15396 } 15397 j := w0.AuxInt 15398 w := w0.Args[0] 15399 x := v.Args[3] 15400 if x.Op != OpS390XMOVHstoreidx { 15401 break 15402 } 15403 if x.AuxInt != i-2 { 15404 break 15405 } 15406 if x.Aux != s { 15407 break 15408 } 15409 if idx != x.Args[0] { 15410 break 15411 } 15412 if p != x.Args[1] { 15413 break 15414 } 15415 x_2 := x.Args[2] 15416 if x_2.Op != OpS390XSRDconst { 15417 break 15418 } 15419 if x_2.AuxInt != j+16 { 15420 break 15421 } 15422 if w != x_2.Args[0] { 15423 break 15424 } 15425 mem := x.Args[3] 15426 if !(x.Uses == 1 && clobber(x)) { 15427 break 15428 } 15429 v.reset(OpS390XMOVWstoreidx) 15430 v.AuxInt = i - 2 15431 v.Aux = s 15432 v.AddArg(p) 15433 v.AddArg(idx) 15434 v.AddArg(w0) 15435 v.AddArg(mem) 15436 return true 15437 } 15438 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 15439 // cond: x.Uses == 1 && clobber(x) 15440 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15441 for { 15442 i := v.AuxInt 15443 s := v.Aux 15444 idx := v.Args[0] 15445 p := v.Args[1] 15446 w0 := v.Args[2] 15447 if w0.Op != OpS390XSRDconst { 15448 break 15449 } 15450 j := w0.AuxInt 15451 w := w0.Args[0] 15452 x := v.Args[3] 15453 if x.Op != OpS390XMOVHstoreidx { 15454 break 15455 } 15456 if x.AuxInt != i-2 { 15457 break 15458 } 15459 if x.Aux != s { 15460 break 15461 } 15462 if p != x.Args[0] { 15463 break 15464 } 15465 if idx != x.Args[1] { 15466 break 15467 } 15468 x_2 := x.Args[2] 15469 if x_2.Op != OpS390XSRDconst { 15470 break 15471 } 15472 if x_2.AuxInt != j+16 { 15473 break 15474 } 15475 if w != x_2.Args[0] { 15476 break 15477 } 15478 mem := x.Args[3] 15479 if !(x.Uses == 1 && clobber(x)) { 15480 break 15481 } 15482 v.reset(OpS390XMOVWstoreidx) 15483 v.AuxInt = i - 2 15484 v.Aux = s 15485 v.AddArg(p) 15486 v.AddArg(idx) 15487 v.AddArg(w0) 15488 v.AddArg(mem) 15489 return true 15490 } 15491 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 15492 // cond: x.Uses == 1 && clobber(x) 15493 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15494 for { 15495 i := v.AuxInt 15496 s := v.Aux 15497 idx := v.Args[0] 15498 p := v.Args[1] 15499 w0 := v.Args[2] 15500 if w0.Op != OpS390XSRDconst { 15501 break 15502 } 15503 j := w0.AuxInt 15504 w := w0.Args[0] 15505 x := v.Args[3] 15506 if x.Op != OpS390XMOVHstoreidx { 15507 break 15508 } 15509 if x.AuxInt != i-2 { 15510 break 15511 } 15512 if x.Aux != s { 15513 break 15514 } 15515 if idx != x.Args[0] { 15516 break 15517 } 15518 if p != x.Args[1] { 15519 break 15520 } 15521 x_2 := x.Args[2] 15522 if x_2.Op != OpS390XSRDconst { 15523 break 15524 } 15525 if x_2.AuxInt != j+16 { 15526 break 15527 } 15528 if w != x_2.Args[0] { 15529 break 15530 } 15531 mem := x.Args[3] 15532 if !(x.Uses == 1 && clobber(x)) { 15533 break 15534 } 15535 v.reset(OpS390XMOVWstoreidx) 15536 v.AuxInt = i - 2 15537 v.Aux = s 15538 v.AddArg(p) 15539 v.AddArg(idx) 15540 v.AddArg(w0) 15541 v.AddArg(mem) 15542 return true 15543 } 15544 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 15545 // cond: x.Uses == 1 && clobber(x) 15546 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15547 for { 15548 i := v.AuxInt 15549 s := v.Aux 15550 p := v.Args[0] 15551 idx := v.Args[1] 15552 w := v.Args[2] 15553 x := v.Args[3] 15554 if x.Op != OpS390XMOVHstoreidx { 15555 break 15556 } 15557 if x.AuxInt != i-2 { 15558 break 15559 } 15560 if x.Aux != s { 15561 break 15562 } 15563 if p != x.Args[0] { 15564 break 15565 } 15566 if idx != x.Args[1] { 15567 break 15568 } 15569 x_2 := x.Args[2] 15570 if x_2.Op != OpS390XSRWconst { 15571 break 15572 } 15573 if x_2.AuxInt != 16 { 15574 break 15575 } 15576 if w != x_2.Args[0] { 15577 break 15578 } 15579 mem := x.Args[3] 15580 if !(x.Uses == 1 && clobber(x)) { 15581 break 15582 } 15583 v.reset(OpS390XMOVWstoreidx) 15584 v.AuxInt = i - 2 15585 v.Aux = s 15586 v.AddArg(p) 15587 v.AddArg(idx) 15588 v.AddArg(w) 15589 v.AddArg(mem) 15590 return true 15591 } 15592 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 15593 // cond: x.Uses == 1 && clobber(x) 15594 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15595 for { 15596 i := v.AuxInt 15597 s := v.Aux 15598 p := v.Args[0] 15599 idx := v.Args[1] 15600 w := v.Args[2] 15601 x := v.Args[3] 15602 if x.Op != OpS390XMOVHstoreidx { 15603 break 15604 } 15605 if x.AuxInt != i-2 { 15606 break 15607 } 15608 if x.Aux != s { 15609 break 15610 } 15611 if idx != x.Args[0] { 15612 break 15613 } 15614 if p != x.Args[1] { 15615 break 15616 } 15617 x_2 := x.Args[2] 15618 if x_2.Op != OpS390XSRWconst { 15619 break 15620 } 15621 if x_2.AuxInt != 16 { 15622 break 15623 } 15624 if w != x_2.Args[0] { 15625 break 15626 } 15627 mem := x.Args[3] 15628 if !(x.Uses == 1 && clobber(x)) { 15629 break 15630 } 15631 v.reset(OpS390XMOVWstoreidx) 15632 v.AuxInt = i - 2 15633 v.Aux = s 15634 v.AddArg(p) 15635 v.AddArg(idx) 15636 v.AddArg(w) 15637 v.AddArg(mem) 15638 return true 15639 } 15640 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 15641 // cond: x.Uses == 1 && clobber(x) 15642 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15643 for { 15644 i := v.AuxInt 15645 s := v.Aux 15646 idx := v.Args[0] 15647 p := v.Args[1] 15648 w := v.Args[2] 15649 x := v.Args[3] 15650 if x.Op != OpS390XMOVHstoreidx { 15651 break 15652 } 15653 if x.AuxInt != i-2 { 15654 break 15655 } 15656 if x.Aux != s { 15657 break 15658 } 15659 if p != x.Args[0] { 15660 break 15661 } 15662 if idx != x.Args[1] { 15663 break 15664 } 15665 x_2 := x.Args[2] 15666 if x_2.Op != OpS390XSRWconst { 15667 break 15668 } 15669 if x_2.AuxInt != 16 { 15670 break 15671 } 15672 if w != x_2.Args[0] { 15673 break 15674 } 15675 mem := x.Args[3] 15676 if !(x.Uses == 1 && clobber(x)) { 15677 break 15678 } 15679 v.reset(OpS390XMOVWstoreidx) 15680 v.AuxInt = i - 2 15681 v.Aux = s 15682 v.AddArg(p) 15683 v.AddArg(idx) 15684 v.AddArg(w) 15685 v.AddArg(mem) 15686 return true 15687 } 15688 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 15689 // cond: x.Uses == 1 && clobber(x) 15690 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15691 for { 15692 i := v.AuxInt 15693 s := v.Aux 15694 idx := v.Args[0] 15695 p := v.Args[1] 15696 w := v.Args[2] 15697 x := v.Args[3] 15698 if x.Op != OpS390XMOVHstoreidx { 15699 break 15700 } 15701 if x.AuxInt != i-2 { 15702 break 15703 } 15704 if x.Aux != s { 15705 break 15706 } 15707 if idx != x.Args[0] { 15708 break 15709 } 15710 if p != x.Args[1] { 15711 break 15712 } 15713 x_2 := x.Args[2] 15714 if x_2.Op != OpS390XSRWconst { 15715 break 15716 } 15717 if x_2.AuxInt != 16 { 15718 break 15719 } 15720 if w != x_2.Args[0] { 15721 break 15722 } 15723 mem := x.Args[3] 15724 if !(x.Uses == 1 && clobber(x)) { 15725 break 15726 } 15727 v.reset(OpS390XMOVWstoreidx) 15728 v.AuxInt = i - 2 15729 v.Aux = s 15730 v.AddArg(p) 15731 v.AddArg(idx) 15732 v.AddArg(w) 15733 v.AddArg(mem) 15734 return true 15735 } 15736 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 15737 // cond: x.Uses == 1 && clobber(x) 15738 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15739 for { 15740 i := v.AuxInt 15741 s := v.Aux 15742 p := v.Args[0] 15743 idx := v.Args[1] 15744 w0 := v.Args[2] 15745 if w0.Op != OpS390XSRWconst { 15746 break 15747 } 15748 j := w0.AuxInt 15749 w := w0.Args[0] 15750 x := v.Args[3] 15751 if x.Op != OpS390XMOVHstoreidx { 15752 break 15753 } 15754 if x.AuxInt != i-2 { 15755 break 15756 } 15757 if x.Aux != s { 15758 break 15759 } 15760 if p != x.Args[0] { 15761 break 15762 } 15763 if idx != x.Args[1] { 15764 break 15765 } 15766 x_2 := x.Args[2] 15767 if x_2.Op != OpS390XSRWconst { 15768 break 15769 } 15770 if x_2.AuxInt != j+16 { 15771 break 15772 } 15773 if w != x_2.Args[0] { 15774 break 15775 } 15776 mem := x.Args[3] 15777 if !(x.Uses == 1 && clobber(x)) { 15778 break 15779 } 15780 v.reset(OpS390XMOVWstoreidx) 15781 v.AuxInt = i - 2 15782 v.Aux = s 15783 v.AddArg(p) 15784 v.AddArg(idx) 15785 v.AddArg(w0) 15786 v.AddArg(mem) 15787 return true 15788 } 15789 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 15790 // cond: x.Uses == 1 && clobber(x) 15791 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15792 for { 15793 i := v.AuxInt 15794 s := v.Aux 15795 p := v.Args[0] 15796 idx := v.Args[1] 15797 w0 := v.Args[2] 15798 if w0.Op != OpS390XSRWconst { 15799 break 15800 } 15801 j := w0.AuxInt 15802 w := w0.Args[0] 15803 x := v.Args[3] 15804 if x.Op != OpS390XMOVHstoreidx { 15805 break 15806 } 15807 if x.AuxInt != i-2 { 15808 break 15809 } 15810 if x.Aux != s { 15811 break 15812 } 15813 if idx != x.Args[0] { 15814 break 15815 } 15816 if p != x.Args[1] { 15817 break 15818 } 15819 x_2 := x.Args[2] 15820 if x_2.Op != OpS390XSRWconst { 15821 break 15822 } 15823 if x_2.AuxInt != j+16 { 15824 break 15825 } 15826 if w != x_2.Args[0] { 15827 break 15828 } 15829 mem := x.Args[3] 15830 if !(x.Uses == 1 && clobber(x)) { 15831 break 15832 } 15833 v.reset(OpS390XMOVWstoreidx) 15834 v.AuxInt = i - 2 15835 v.Aux = s 15836 v.AddArg(p) 15837 v.AddArg(idx) 15838 v.AddArg(w0) 15839 v.AddArg(mem) 15840 return true 15841 } 15842 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 15843 // cond: x.Uses == 1 && clobber(x) 15844 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15845 for { 15846 i := v.AuxInt 15847 s := v.Aux 15848 idx := v.Args[0] 15849 p := v.Args[1] 15850 w0 := v.Args[2] 15851 if w0.Op != OpS390XSRWconst { 15852 break 15853 } 15854 j := w0.AuxInt 15855 w := w0.Args[0] 15856 x := v.Args[3] 15857 if x.Op != OpS390XMOVHstoreidx { 15858 break 15859 } 15860 if x.AuxInt != i-2 { 15861 break 15862 } 15863 if x.Aux != s { 15864 break 15865 } 15866 if p != x.Args[0] { 15867 break 15868 } 15869 if idx != x.Args[1] { 15870 break 15871 } 15872 x_2 := x.Args[2] 15873 if x_2.Op != OpS390XSRWconst { 15874 break 15875 } 15876 if x_2.AuxInt != j+16 { 15877 break 15878 } 15879 if w != x_2.Args[0] { 15880 break 15881 } 15882 mem := x.Args[3] 15883 if !(x.Uses == 1 && clobber(x)) { 15884 break 15885 } 15886 v.reset(OpS390XMOVWstoreidx) 15887 v.AuxInt = i - 2 15888 v.Aux = s 15889 v.AddArg(p) 15890 v.AddArg(idx) 15891 v.AddArg(w0) 15892 v.AddArg(mem) 15893 return true 15894 } 15895 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 15896 // cond: x.Uses == 1 && clobber(x) 15897 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15898 for { 15899 i := v.AuxInt 15900 s := v.Aux 15901 idx := v.Args[0] 15902 p := v.Args[1] 15903 w0 := v.Args[2] 15904 if w0.Op != OpS390XSRWconst { 15905 break 15906 } 15907 j := w0.AuxInt 15908 w := w0.Args[0] 15909 x := v.Args[3] 15910 if x.Op != OpS390XMOVHstoreidx { 15911 break 15912 } 15913 if x.AuxInt != i-2 { 15914 break 15915 } 15916 if x.Aux != s { 15917 break 15918 } 15919 if idx != x.Args[0] { 15920 break 15921 } 15922 if p != x.Args[1] { 15923 break 15924 } 15925 x_2 := x.Args[2] 15926 if x_2.Op != OpS390XSRWconst { 15927 break 15928 } 15929 if x_2.AuxInt != j+16 { 15930 break 15931 } 15932 if w != x_2.Args[0] { 15933 break 15934 } 15935 mem := x.Args[3] 15936 if !(x.Uses == 1 && clobber(x)) { 15937 break 15938 } 15939 v.reset(OpS390XMOVWstoreidx) 15940 v.AuxInt = i - 2 15941 v.Aux = s 15942 v.AddArg(p) 15943 v.AddArg(idx) 15944 v.AddArg(w0) 15945 v.AddArg(mem) 15946 return true 15947 } 15948 return false 15949 } 15950 func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { 15951 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 15952 // cond: x.Uses == 1 && clobber(x) 15953 // result: (MOVDBRstore [i-4] {s} p w mem) 15954 for { 15955 i := v.AuxInt 15956 s := v.Aux 15957 p := v.Args[0] 15958 v_1 := v.Args[1] 15959 if v_1.Op != OpS390XSRDconst { 15960 break 15961 } 15962 if v_1.AuxInt != 32 { 15963 break 15964 } 15965 w := v_1.Args[0] 15966 x := v.Args[2] 15967 if x.Op != OpS390XMOVWBRstore { 15968 break 15969 } 15970 if x.AuxInt != i-4 { 15971 break 15972 } 15973 if x.Aux != s { 15974 break 15975 } 15976 if p != x.Args[0] { 15977 break 15978 } 15979 if w != x.Args[1] { 15980 break 15981 } 15982 mem := x.Args[2] 15983 if !(x.Uses == 1 && clobber(x)) { 15984 break 15985 } 15986 v.reset(OpS390XMOVDBRstore) 15987 v.AuxInt = i - 4 15988 v.Aux = s 15989 v.AddArg(p) 15990 v.AddArg(w) 15991 v.AddArg(mem) 15992 return true 15993 } 15994 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 15995 // cond: x.Uses == 1 && clobber(x) 15996 // result: (MOVDBRstore [i-4] {s} p w0 mem) 15997 for { 15998 i := v.AuxInt 15999 s := v.Aux 16000 p := v.Args[0] 16001 v_1 := v.Args[1] 16002 if v_1.Op != OpS390XSRDconst { 16003 break 16004 } 16005 j := v_1.AuxInt 16006 w := v_1.Args[0] 16007 x := v.Args[2] 16008 if x.Op != OpS390XMOVWBRstore { 16009 break 16010 } 16011 if x.AuxInt != i-4 { 16012 break 16013 } 16014 if x.Aux != s { 16015 break 16016 } 16017 if p != x.Args[0] { 16018 break 16019 } 16020 w0 := x.Args[1] 16021 if w0.Op != OpS390XSRDconst { 16022 break 16023 } 16024 if w0.AuxInt != j-32 { 16025 break 16026 } 16027 if w != w0.Args[0] { 16028 break 16029 } 16030 mem := x.Args[2] 16031 if !(x.Uses == 1 && clobber(x)) { 16032 break 16033 } 16034 v.reset(OpS390XMOVDBRstore) 16035 v.AuxInt = i - 4 16036 v.Aux = s 16037 v.AddArg(p) 16038 v.AddArg(w0) 16039 v.AddArg(mem) 16040 return true 16041 } 16042 return false 16043 } 16044 func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value) bool { 16045 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16046 // cond: x.Uses == 1 && clobber(x) 16047 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16048 for { 16049 i := v.AuxInt 16050 s := v.Aux 16051 p := v.Args[0] 16052 idx := v.Args[1] 16053 v_2 := v.Args[2] 16054 if v_2.Op != OpS390XSRDconst { 16055 break 16056 } 16057 if v_2.AuxInt != 32 { 16058 break 16059 } 16060 w := v_2.Args[0] 16061 x := v.Args[3] 16062 if x.Op != OpS390XMOVWBRstoreidx { 16063 break 16064 } 16065 if x.AuxInt != i-4 { 16066 break 16067 } 16068 if x.Aux != s { 16069 break 16070 } 16071 if p != x.Args[0] { 16072 break 16073 } 16074 if idx != x.Args[1] { 16075 break 16076 } 16077 if w != x.Args[2] { 16078 break 16079 } 16080 mem := x.Args[3] 16081 if !(x.Uses == 1 && clobber(x)) { 16082 break 16083 } 16084 v.reset(OpS390XMOVDBRstoreidx) 16085 v.AuxInt = i - 4 16086 v.Aux = s 16087 v.AddArg(p) 16088 v.AddArg(idx) 16089 v.AddArg(w) 16090 v.AddArg(mem) 16091 return true 16092 } 16093 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16094 // cond: x.Uses == 1 && clobber(x) 16095 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16096 for { 16097 i := v.AuxInt 16098 s := v.Aux 16099 p := v.Args[0] 16100 idx := v.Args[1] 16101 v_2 := v.Args[2] 16102 if v_2.Op != OpS390XSRDconst { 16103 break 16104 } 16105 if v_2.AuxInt != 32 { 16106 break 16107 } 16108 w := v_2.Args[0] 16109 x := v.Args[3] 16110 if x.Op != OpS390XMOVWBRstoreidx { 16111 break 16112 } 16113 if x.AuxInt != i-4 { 16114 break 16115 } 16116 if x.Aux != s { 16117 break 16118 } 16119 if idx != x.Args[0] { 16120 break 16121 } 16122 if p != x.Args[1] { 16123 break 16124 } 16125 if w != x.Args[2] { 16126 break 16127 } 16128 mem := x.Args[3] 16129 if !(x.Uses == 1 && clobber(x)) { 16130 break 16131 } 16132 v.reset(OpS390XMOVDBRstoreidx) 16133 v.AuxInt = i - 4 16134 v.Aux = s 16135 v.AddArg(p) 16136 v.AddArg(idx) 16137 v.AddArg(w) 16138 v.AddArg(mem) 16139 return true 16140 } 16141 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16142 // cond: x.Uses == 1 && clobber(x) 16143 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16144 for { 16145 i := v.AuxInt 16146 s := v.Aux 16147 idx := v.Args[0] 16148 p := v.Args[1] 16149 v_2 := v.Args[2] 16150 if v_2.Op != OpS390XSRDconst { 16151 break 16152 } 16153 if v_2.AuxInt != 32 { 16154 break 16155 } 16156 w := v_2.Args[0] 16157 x := v.Args[3] 16158 if x.Op != OpS390XMOVWBRstoreidx { 16159 break 16160 } 16161 if x.AuxInt != i-4 { 16162 break 16163 } 16164 if x.Aux != s { 16165 break 16166 } 16167 if p != x.Args[0] { 16168 break 16169 } 16170 if idx != x.Args[1] { 16171 break 16172 } 16173 if w != x.Args[2] { 16174 break 16175 } 16176 mem := x.Args[3] 16177 if !(x.Uses == 1 && clobber(x)) { 16178 break 16179 } 16180 v.reset(OpS390XMOVDBRstoreidx) 16181 v.AuxInt = i - 4 16182 v.Aux = s 16183 v.AddArg(p) 16184 v.AddArg(idx) 16185 v.AddArg(w) 16186 v.AddArg(mem) 16187 return true 16188 } 16189 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16190 // cond: x.Uses == 1 && clobber(x) 16191 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16192 for { 16193 i := v.AuxInt 16194 s := v.Aux 16195 idx := v.Args[0] 16196 p := v.Args[1] 16197 v_2 := v.Args[2] 16198 if v_2.Op != OpS390XSRDconst { 16199 break 16200 } 16201 if v_2.AuxInt != 32 { 16202 break 16203 } 16204 w := v_2.Args[0] 16205 x := v.Args[3] 16206 if x.Op != OpS390XMOVWBRstoreidx { 16207 break 16208 } 16209 if x.AuxInt != i-4 { 16210 break 16211 } 16212 if x.Aux != s { 16213 break 16214 } 16215 if idx != x.Args[0] { 16216 break 16217 } 16218 if p != x.Args[1] { 16219 break 16220 } 16221 if w != x.Args[2] { 16222 break 16223 } 16224 mem := x.Args[3] 16225 if !(x.Uses == 1 && clobber(x)) { 16226 break 16227 } 16228 v.reset(OpS390XMOVDBRstoreidx) 16229 v.AuxInt = i - 4 16230 v.Aux = s 16231 v.AddArg(p) 16232 v.AddArg(idx) 16233 v.AddArg(w) 16234 v.AddArg(mem) 16235 return true 16236 } 16237 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 16238 // cond: x.Uses == 1 && clobber(x) 16239 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16240 for { 16241 i := v.AuxInt 16242 s := v.Aux 16243 p := v.Args[0] 16244 idx := v.Args[1] 16245 v_2 := v.Args[2] 16246 if v_2.Op != OpS390XSRDconst { 16247 break 16248 } 16249 j := v_2.AuxInt 16250 w := v_2.Args[0] 16251 x := v.Args[3] 16252 if x.Op != OpS390XMOVWBRstoreidx { 16253 break 16254 } 16255 if x.AuxInt != i-4 { 16256 break 16257 } 16258 if x.Aux != s { 16259 break 16260 } 16261 if p != x.Args[0] { 16262 break 16263 } 16264 if idx != x.Args[1] { 16265 break 16266 } 16267 w0 := x.Args[2] 16268 if w0.Op != OpS390XSRDconst { 16269 break 16270 } 16271 if w0.AuxInt != j-32 { 16272 break 16273 } 16274 if w != w0.Args[0] { 16275 break 16276 } 16277 mem := x.Args[3] 16278 if !(x.Uses == 1 && clobber(x)) { 16279 break 16280 } 16281 v.reset(OpS390XMOVDBRstoreidx) 16282 v.AuxInt = i - 4 16283 v.Aux = s 16284 v.AddArg(p) 16285 v.AddArg(idx) 16286 v.AddArg(w0) 16287 v.AddArg(mem) 16288 return true 16289 } 16290 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 16291 // cond: x.Uses == 1 && clobber(x) 16292 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16293 for { 16294 i := v.AuxInt 16295 s := v.Aux 16296 p := v.Args[0] 16297 idx := v.Args[1] 16298 v_2 := v.Args[2] 16299 if v_2.Op != OpS390XSRDconst { 16300 break 16301 } 16302 j := v_2.AuxInt 16303 w := v_2.Args[0] 16304 x := v.Args[3] 16305 if x.Op != OpS390XMOVWBRstoreidx { 16306 break 16307 } 16308 if x.AuxInt != i-4 { 16309 break 16310 } 16311 if x.Aux != s { 16312 break 16313 } 16314 if idx != x.Args[0] { 16315 break 16316 } 16317 if p != x.Args[1] { 16318 break 16319 } 16320 w0 := x.Args[2] 16321 if w0.Op != OpS390XSRDconst { 16322 break 16323 } 16324 if w0.AuxInt != j-32 { 16325 break 16326 } 16327 if w != w0.Args[0] { 16328 break 16329 } 16330 mem := x.Args[3] 16331 if !(x.Uses == 1 && clobber(x)) { 16332 break 16333 } 16334 v.reset(OpS390XMOVDBRstoreidx) 16335 v.AuxInt = i - 4 16336 v.Aux = s 16337 v.AddArg(p) 16338 v.AddArg(idx) 16339 v.AddArg(w0) 16340 v.AddArg(mem) 16341 return true 16342 } 16343 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 16344 // cond: x.Uses == 1 && clobber(x) 16345 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16346 for { 16347 i := v.AuxInt 16348 s := v.Aux 16349 idx := v.Args[0] 16350 p := v.Args[1] 16351 v_2 := v.Args[2] 16352 if v_2.Op != OpS390XSRDconst { 16353 break 16354 } 16355 j := v_2.AuxInt 16356 w := v_2.Args[0] 16357 x := v.Args[3] 16358 if x.Op != OpS390XMOVWBRstoreidx { 16359 break 16360 } 16361 if x.AuxInt != i-4 { 16362 break 16363 } 16364 if x.Aux != s { 16365 break 16366 } 16367 if p != x.Args[0] { 16368 break 16369 } 16370 if idx != x.Args[1] { 16371 break 16372 } 16373 w0 := x.Args[2] 16374 if w0.Op != OpS390XSRDconst { 16375 break 16376 } 16377 if w0.AuxInt != j-32 { 16378 break 16379 } 16380 if w != w0.Args[0] { 16381 break 16382 } 16383 mem := x.Args[3] 16384 if !(x.Uses == 1 && clobber(x)) { 16385 break 16386 } 16387 v.reset(OpS390XMOVDBRstoreidx) 16388 v.AuxInt = i - 4 16389 v.Aux = s 16390 v.AddArg(p) 16391 v.AddArg(idx) 16392 v.AddArg(w0) 16393 v.AddArg(mem) 16394 return true 16395 } 16396 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 16397 // cond: x.Uses == 1 && clobber(x) 16398 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16399 for { 16400 i := v.AuxInt 16401 s := v.Aux 16402 idx := v.Args[0] 16403 p := v.Args[1] 16404 v_2 := v.Args[2] 16405 if v_2.Op != OpS390XSRDconst { 16406 break 16407 } 16408 j := v_2.AuxInt 16409 w := v_2.Args[0] 16410 x := v.Args[3] 16411 if x.Op != OpS390XMOVWBRstoreidx { 16412 break 16413 } 16414 if x.AuxInt != i-4 { 16415 break 16416 } 16417 if x.Aux != s { 16418 break 16419 } 16420 if idx != x.Args[0] { 16421 break 16422 } 16423 if p != x.Args[1] { 16424 break 16425 } 16426 w0 := x.Args[2] 16427 if w0.Op != OpS390XSRDconst { 16428 break 16429 } 16430 if w0.AuxInt != j-32 { 16431 break 16432 } 16433 if w != w0.Args[0] { 16434 break 16435 } 16436 mem := x.Args[3] 16437 if !(x.Uses == 1 && clobber(x)) { 16438 break 16439 } 16440 v.reset(OpS390XMOVDBRstoreidx) 16441 v.AuxInt = i - 4 16442 v.Aux = s 16443 v.AddArg(p) 16444 v.AddArg(idx) 16445 v.AddArg(w0) 16446 v.AddArg(mem) 16447 return true 16448 } 16449 return false 16450 } 16451 func rewriteValueS390X_OpS390XMOVWZload(v *Value) bool { 16452 // match: (MOVWZload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 16453 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 16454 // result: (MOVWZreg x) 16455 for { 16456 off := v.AuxInt 16457 sym := v.Aux 16458 ptr := v.Args[0] 16459 v_1 := v.Args[1] 16460 if v_1.Op != OpS390XMOVWstore { 16461 break 16462 } 16463 off2 := v_1.AuxInt 16464 sym2 := v_1.Aux 16465 ptr2 := v_1.Args[0] 16466 x := v_1.Args[1] 16467 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 16468 break 16469 } 16470 v.reset(OpS390XMOVWZreg) 16471 v.AddArg(x) 16472 return true 16473 } 16474 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 16475 // cond: is20Bit(off1+off2) 16476 // result: (MOVWZload [off1+off2] {sym} ptr mem) 16477 for { 16478 off1 := v.AuxInt 16479 sym := v.Aux 16480 v_0 := v.Args[0] 16481 if v_0.Op != OpS390XADDconst { 16482 break 16483 } 16484 off2 := v_0.AuxInt 16485 ptr := v_0.Args[0] 16486 mem := v.Args[1] 16487 if !(is20Bit(off1 + off2)) { 16488 break 16489 } 16490 v.reset(OpS390XMOVWZload) 16491 v.AuxInt = off1 + off2 16492 v.Aux = sym 16493 v.AddArg(ptr) 16494 v.AddArg(mem) 16495 return true 16496 } 16497 // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 16498 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16499 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 16500 for { 16501 off1 := v.AuxInt 16502 sym1 := v.Aux 16503 v_0 := v.Args[0] 16504 if v_0.Op != OpS390XMOVDaddr { 16505 break 16506 } 16507 off2 := v_0.AuxInt 16508 sym2 := v_0.Aux 16509 base := v_0.Args[0] 16510 mem := v.Args[1] 16511 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16512 break 16513 } 16514 v.reset(OpS390XMOVWZload) 16515 v.AuxInt = off1 + off2 16516 v.Aux = mergeSym(sym1, sym2) 16517 v.AddArg(base) 16518 v.AddArg(mem) 16519 return true 16520 } 16521 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 16522 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16523 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 16524 for { 16525 off1 := v.AuxInt 16526 sym1 := v.Aux 16527 v_0 := v.Args[0] 16528 if v_0.Op != OpS390XMOVDaddridx { 16529 break 16530 } 16531 off2 := v_0.AuxInt 16532 sym2 := v_0.Aux 16533 ptr := v_0.Args[0] 16534 idx := v_0.Args[1] 16535 mem := v.Args[1] 16536 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16537 break 16538 } 16539 v.reset(OpS390XMOVWZloadidx) 16540 v.AuxInt = off1 + off2 16541 v.Aux = mergeSym(sym1, sym2) 16542 v.AddArg(ptr) 16543 v.AddArg(idx) 16544 v.AddArg(mem) 16545 return true 16546 } 16547 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 16548 // cond: ptr.Op != OpSB 16549 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 16550 for { 16551 off := v.AuxInt 16552 sym := v.Aux 16553 v_0 := v.Args[0] 16554 if v_0.Op != OpS390XADD { 16555 break 16556 } 16557 ptr := v_0.Args[0] 16558 idx := v_0.Args[1] 16559 mem := v.Args[1] 16560 if !(ptr.Op != OpSB) { 16561 break 16562 } 16563 v.reset(OpS390XMOVWZloadidx) 16564 v.AuxInt = off 16565 v.Aux = sym 16566 v.AddArg(ptr) 16567 v.AddArg(idx) 16568 v.AddArg(mem) 16569 return true 16570 } 16571 return false 16572 } 16573 func rewriteValueS390X_OpS390XMOVWZloadidx(v *Value) bool { 16574 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 16575 // cond: 16576 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16577 for { 16578 c := v.AuxInt 16579 sym := v.Aux 16580 v_0 := v.Args[0] 16581 if v_0.Op != OpS390XADDconst { 16582 break 16583 } 16584 d := v_0.AuxInt 16585 ptr := v_0.Args[0] 16586 idx := v.Args[1] 16587 mem := v.Args[2] 16588 v.reset(OpS390XMOVWZloadidx) 16589 v.AuxInt = c + d 16590 v.Aux = sym 16591 v.AddArg(ptr) 16592 v.AddArg(idx) 16593 v.AddArg(mem) 16594 return true 16595 } 16596 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 16597 // cond: 16598 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16599 for { 16600 c := v.AuxInt 16601 sym := v.Aux 16602 idx := v.Args[0] 16603 v_1 := v.Args[1] 16604 if v_1.Op != OpS390XADDconst { 16605 break 16606 } 16607 d := v_1.AuxInt 16608 ptr := v_1.Args[0] 16609 mem := v.Args[2] 16610 v.reset(OpS390XMOVWZloadidx) 16611 v.AuxInt = c + d 16612 v.Aux = sym 16613 v.AddArg(ptr) 16614 v.AddArg(idx) 16615 v.AddArg(mem) 16616 return true 16617 } 16618 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 16619 // cond: 16620 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16621 for { 16622 c := v.AuxInt 16623 sym := v.Aux 16624 ptr := v.Args[0] 16625 v_1 := v.Args[1] 16626 if v_1.Op != OpS390XADDconst { 16627 break 16628 } 16629 d := v_1.AuxInt 16630 idx := v_1.Args[0] 16631 mem := v.Args[2] 16632 v.reset(OpS390XMOVWZloadidx) 16633 v.AuxInt = c + d 16634 v.Aux = sym 16635 v.AddArg(ptr) 16636 v.AddArg(idx) 16637 v.AddArg(mem) 16638 return true 16639 } 16640 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 16641 // cond: 16642 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16643 for { 16644 c := v.AuxInt 16645 sym := v.Aux 16646 v_0 := v.Args[0] 16647 if v_0.Op != OpS390XADDconst { 16648 break 16649 } 16650 d := v_0.AuxInt 16651 idx := v_0.Args[0] 16652 ptr := v.Args[1] 16653 mem := v.Args[2] 16654 v.reset(OpS390XMOVWZloadidx) 16655 v.AuxInt = c + d 16656 v.Aux = sym 16657 v.AddArg(ptr) 16658 v.AddArg(idx) 16659 v.AddArg(mem) 16660 return true 16661 } 16662 return false 16663 } 16664 func rewriteValueS390X_OpS390XMOVWZreg(v *Value) bool { 16665 b := v.Block 16666 _ = b 16667 // match: (MOVWZreg x:(MOVBZload _ _)) 16668 // cond: 16669 // result: (MOVDreg x) 16670 for { 16671 x := v.Args[0] 16672 if x.Op != OpS390XMOVBZload { 16673 break 16674 } 16675 v.reset(OpS390XMOVDreg) 16676 v.AddArg(x) 16677 return true 16678 } 16679 // match: (MOVWZreg x:(MOVHZload _ _)) 16680 // cond: 16681 // result: (MOVDreg x) 16682 for { 16683 x := v.Args[0] 16684 if x.Op != OpS390XMOVHZload { 16685 break 16686 } 16687 v.reset(OpS390XMOVDreg) 16688 v.AddArg(x) 16689 return true 16690 } 16691 // match: (MOVWZreg x:(MOVWZload _ _)) 16692 // cond: 16693 // result: (MOVDreg x) 16694 for { 16695 x := v.Args[0] 16696 if x.Op != OpS390XMOVWZload { 16697 break 16698 } 16699 v.reset(OpS390XMOVDreg) 16700 v.AddArg(x) 16701 return true 16702 } 16703 // match: (MOVWZreg x:(Arg <t>)) 16704 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 16705 // result: (MOVDreg x) 16706 for { 16707 x := v.Args[0] 16708 if x.Op != OpArg { 16709 break 16710 } 16711 t := x.Type 16712 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 16713 break 16714 } 16715 v.reset(OpS390XMOVDreg) 16716 v.AddArg(x) 16717 return true 16718 } 16719 // match: (MOVWZreg x:(MOVBZreg _)) 16720 // cond: 16721 // result: (MOVDreg x) 16722 for { 16723 x := v.Args[0] 16724 if x.Op != OpS390XMOVBZreg { 16725 break 16726 } 16727 v.reset(OpS390XMOVDreg) 16728 v.AddArg(x) 16729 return true 16730 } 16731 // match: (MOVWZreg x:(MOVHZreg _)) 16732 // cond: 16733 // result: (MOVDreg x) 16734 for { 16735 x := v.Args[0] 16736 if x.Op != OpS390XMOVHZreg { 16737 break 16738 } 16739 v.reset(OpS390XMOVDreg) 16740 v.AddArg(x) 16741 return true 16742 } 16743 // match: (MOVWZreg x:(MOVWZreg _)) 16744 // cond: 16745 // result: (MOVDreg x) 16746 for { 16747 x := v.Args[0] 16748 if x.Op != OpS390XMOVWZreg { 16749 break 16750 } 16751 v.reset(OpS390XMOVDreg) 16752 v.AddArg(x) 16753 return true 16754 } 16755 // match: (MOVWZreg (MOVDconst [c])) 16756 // cond: 16757 // result: (MOVDconst [int64(uint32(c))]) 16758 for { 16759 v_0 := v.Args[0] 16760 if v_0.Op != OpS390XMOVDconst { 16761 break 16762 } 16763 c := v_0.AuxInt 16764 v.reset(OpS390XMOVDconst) 16765 v.AuxInt = int64(uint32(c)) 16766 return true 16767 } 16768 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 16769 // cond: x.Uses == 1 && clobber(x) 16770 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 16771 for { 16772 x := v.Args[0] 16773 if x.Op != OpS390XMOVWZload { 16774 break 16775 } 16776 off := x.AuxInt 16777 sym := x.Aux 16778 ptr := x.Args[0] 16779 mem := x.Args[1] 16780 if !(x.Uses == 1 && clobber(x)) { 16781 break 16782 } 16783 b = x.Block 16784 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 16785 v.reset(OpCopy) 16786 v.AddArg(v0) 16787 v0.AuxInt = off 16788 v0.Aux = sym 16789 v0.AddArg(ptr) 16790 v0.AddArg(mem) 16791 return true 16792 } 16793 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 16794 // cond: x.Uses == 1 && clobber(x) 16795 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 16796 for { 16797 x := v.Args[0] 16798 if x.Op != OpS390XMOVWZloadidx { 16799 break 16800 } 16801 off := x.AuxInt 16802 sym := x.Aux 16803 ptr := x.Args[0] 16804 idx := x.Args[1] 16805 mem := x.Args[2] 16806 if !(x.Uses == 1 && clobber(x)) { 16807 break 16808 } 16809 b = x.Block 16810 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 16811 v.reset(OpCopy) 16812 v.AddArg(v0) 16813 v0.AuxInt = off 16814 v0.Aux = sym 16815 v0.AddArg(ptr) 16816 v0.AddArg(idx) 16817 v0.AddArg(mem) 16818 return true 16819 } 16820 return false 16821 } 16822 func rewriteValueS390X_OpS390XMOVWload(v *Value) bool { 16823 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 16824 // cond: is20Bit(off1+off2) 16825 // result: (MOVWload [off1+off2] {sym} ptr mem) 16826 for { 16827 off1 := v.AuxInt 16828 sym := v.Aux 16829 v_0 := v.Args[0] 16830 if v_0.Op != OpS390XADDconst { 16831 break 16832 } 16833 off2 := v_0.AuxInt 16834 ptr := v_0.Args[0] 16835 mem := v.Args[1] 16836 if !(is20Bit(off1 + off2)) { 16837 break 16838 } 16839 v.reset(OpS390XMOVWload) 16840 v.AuxInt = off1 + off2 16841 v.Aux = sym 16842 v.AddArg(ptr) 16843 v.AddArg(mem) 16844 return true 16845 } 16846 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 16847 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16848 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 16849 for { 16850 off1 := v.AuxInt 16851 sym1 := v.Aux 16852 v_0 := v.Args[0] 16853 if v_0.Op != OpS390XMOVDaddr { 16854 break 16855 } 16856 off2 := v_0.AuxInt 16857 sym2 := v_0.Aux 16858 base := v_0.Args[0] 16859 mem := v.Args[1] 16860 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16861 break 16862 } 16863 v.reset(OpS390XMOVWload) 16864 v.AuxInt = off1 + off2 16865 v.Aux = mergeSym(sym1, sym2) 16866 v.AddArg(base) 16867 v.AddArg(mem) 16868 return true 16869 } 16870 return false 16871 } 16872 func rewriteValueS390X_OpS390XMOVWreg(v *Value) bool { 16873 b := v.Block 16874 _ = b 16875 // match: (MOVWreg x:(MOVBload _ _)) 16876 // cond: 16877 // result: (MOVDreg x) 16878 for { 16879 x := v.Args[0] 16880 if x.Op != OpS390XMOVBload { 16881 break 16882 } 16883 v.reset(OpS390XMOVDreg) 16884 v.AddArg(x) 16885 return true 16886 } 16887 // match: (MOVWreg x:(MOVBZload _ _)) 16888 // cond: 16889 // result: (MOVDreg x) 16890 for { 16891 x := v.Args[0] 16892 if x.Op != OpS390XMOVBZload { 16893 break 16894 } 16895 v.reset(OpS390XMOVDreg) 16896 v.AddArg(x) 16897 return true 16898 } 16899 // match: (MOVWreg x:(MOVHload _ _)) 16900 // cond: 16901 // result: (MOVDreg x) 16902 for { 16903 x := v.Args[0] 16904 if x.Op != OpS390XMOVHload { 16905 break 16906 } 16907 v.reset(OpS390XMOVDreg) 16908 v.AddArg(x) 16909 return true 16910 } 16911 // match: (MOVWreg x:(MOVHZload _ _)) 16912 // cond: 16913 // result: (MOVDreg x) 16914 for { 16915 x := v.Args[0] 16916 if x.Op != OpS390XMOVHZload { 16917 break 16918 } 16919 v.reset(OpS390XMOVDreg) 16920 v.AddArg(x) 16921 return true 16922 } 16923 // match: (MOVWreg x:(MOVWload _ _)) 16924 // cond: 16925 // result: (MOVDreg x) 16926 for { 16927 x := v.Args[0] 16928 if x.Op != OpS390XMOVWload { 16929 break 16930 } 16931 v.reset(OpS390XMOVDreg) 16932 v.AddArg(x) 16933 return true 16934 } 16935 // match: (MOVWreg x:(Arg <t>)) 16936 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 16937 // result: (MOVDreg x) 16938 for { 16939 x := v.Args[0] 16940 if x.Op != OpArg { 16941 break 16942 } 16943 t := x.Type 16944 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 16945 break 16946 } 16947 v.reset(OpS390XMOVDreg) 16948 v.AddArg(x) 16949 return true 16950 } 16951 // match: (MOVWreg x:(MOVBreg _)) 16952 // cond: 16953 // result: (MOVDreg x) 16954 for { 16955 x := v.Args[0] 16956 if x.Op != OpS390XMOVBreg { 16957 break 16958 } 16959 v.reset(OpS390XMOVDreg) 16960 v.AddArg(x) 16961 return true 16962 } 16963 // match: (MOVWreg x:(MOVBZreg _)) 16964 // cond: 16965 // result: (MOVDreg x) 16966 for { 16967 x := v.Args[0] 16968 if x.Op != OpS390XMOVBZreg { 16969 break 16970 } 16971 v.reset(OpS390XMOVDreg) 16972 v.AddArg(x) 16973 return true 16974 } 16975 // match: (MOVWreg x:(MOVHreg _)) 16976 // cond: 16977 // result: (MOVDreg x) 16978 for { 16979 x := v.Args[0] 16980 if x.Op != OpS390XMOVHreg { 16981 break 16982 } 16983 v.reset(OpS390XMOVDreg) 16984 v.AddArg(x) 16985 return true 16986 } 16987 // match: (MOVWreg x:(MOVHreg _)) 16988 // cond: 16989 // result: (MOVDreg x) 16990 for { 16991 x := v.Args[0] 16992 if x.Op != OpS390XMOVHreg { 16993 break 16994 } 16995 v.reset(OpS390XMOVDreg) 16996 v.AddArg(x) 16997 return true 16998 } 16999 // match: (MOVWreg x:(MOVWreg _)) 17000 // cond: 17001 // result: (MOVDreg x) 17002 for { 17003 x := v.Args[0] 17004 if x.Op != OpS390XMOVWreg { 17005 break 17006 } 17007 v.reset(OpS390XMOVDreg) 17008 v.AddArg(x) 17009 return true 17010 } 17011 // match: (MOVWreg (MOVDconst [c])) 17012 // cond: 17013 // result: (MOVDconst [int64(int32(c))]) 17014 for { 17015 v_0 := v.Args[0] 17016 if v_0.Op != OpS390XMOVDconst { 17017 break 17018 } 17019 c := v_0.AuxInt 17020 v.reset(OpS390XMOVDconst) 17021 v.AuxInt = int64(int32(c)) 17022 return true 17023 } 17024 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 17025 // cond: x.Uses == 1 && clobber(x) 17026 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 17027 for { 17028 x := v.Args[0] 17029 if x.Op != OpS390XMOVWZload { 17030 break 17031 } 17032 off := x.AuxInt 17033 sym := x.Aux 17034 ptr := x.Args[0] 17035 mem := x.Args[1] 17036 if !(x.Uses == 1 && clobber(x)) { 17037 break 17038 } 17039 b = x.Block 17040 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 17041 v.reset(OpCopy) 17042 v.AddArg(v0) 17043 v0.AuxInt = off 17044 v0.Aux = sym 17045 v0.AddArg(ptr) 17046 v0.AddArg(mem) 17047 return true 17048 } 17049 return false 17050 } 17051 func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { 17052 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 17053 // cond: 17054 // result: (MOVWstore [off] {sym} ptr x mem) 17055 for { 17056 off := v.AuxInt 17057 sym := v.Aux 17058 ptr := v.Args[0] 17059 v_1 := v.Args[1] 17060 if v_1.Op != OpS390XMOVWreg { 17061 break 17062 } 17063 x := v_1.Args[0] 17064 mem := v.Args[2] 17065 v.reset(OpS390XMOVWstore) 17066 v.AuxInt = off 17067 v.Aux = sym 17068 v.AddArg(ptr) 17069 v.AddArg(x) 17070 v.AddArg(mem) 17071 return true 17072 } 17073 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 17074 // cond: 17075 // result: (MOVWstore [off] {sym} ptr x mem) 17076 for { 17077 off := v.AuxInt 17078 sym := v.Aux 17079 ptr := v.Args[0] 17080 v_1 := v.Args[1] 17081 if v_1.Op != OpS390XMOVWZreg { 17082 break 17083 } 17084 x := v_1.Args[0] 17085 mem := v.Args[2] 17086 v.reset(OpS390XMOVWstore) 17087 v.AuxInt = off 17088 v.Aux = sym 17089 v.AddArg(ptr) 17090 v.AddArg(x) 17091 v.AddArg(mem) 17092 return true 17093 } 17094 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 17095 // cond: is20Bit(off1+off2) 17096 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 17097 for { 17098 off1 := v.AuxInt 17099 sym := v.Aux 17100 v_0 := v.Args[0] 17101 if v_0.Op != OpS390XADDconst { 17102 break 17103 } 17104 off2 := v_0.AuxInt 17105 ptr := v_0.Args[0] 17106 val := v.Args[1] 17107 mem := v.Args[2] 17108 if !(is20Bit(off1 + off2)) { 17109 break 17110 } 17111 v.reset(OpS390XMOVWstore) 17112 v.AuxInt = off1 + off2 17113 v.Aux = sym 17114 v.AddArg(ptr) 17115 v.AddArg(val) 17116 v.AddArg(mem) 17117 return true 17118 } 17119 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 17120 // cond: validOff(off) && int64(int16(c)) == c && ptr.Op != OpSB 17121 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 17122 for { 17123 off := v.AuxInt 17124 sym := v.Aux 17125 ptr := v.Args[0] 17126 v_1 := v.Args[1] 17127 if v_1.Op != OpS390XMOVDconst { 17128 break 17129 } 17130 c := v_1.AuxInt 17131 mem := v.Args[2] 17132 if !(validOff(off) && int64(int16(c)) == c && ptr.Op != OpSB) { 17133 break 17134 } 17135 v.reset(OpS390XMOVWstoreconst) 17136 v.AuxInt = makeValAndOff(int64(int32(c)), off) 17137 v.Aux = sym 17138 v.AddArg(ptr) 17139 v.AddArg(mem) 17140 return true 17141 } 17142 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 17143 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17144 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 17145 for { 17146 off1 := v.AuxInt 17147 sym1 := v.Aux 17148 v_0 := v.Args[0] 17149 if v_0.Op != OpS390XMOVDaddr { 17150 break 17151 } 17152 off2 := v_0.AuxInt 17153 sym2 := v_0.Aux 17154 base := v_0.Args[0] 17155 val := v.Args[1] 17156 mem := v.Args[2] 17157 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17158 break 17159 } 17160 v.reset(OpS390XMOVWstore) 17161 v.AuxInt = off1 + off2 17162 v.Aux = mergeSym(sym1, sym2) 17163 v.AddArg(base) 17164 v.AddArg(val) 17165 v.AddArg(mem) 17166 return true 17167 } 17168 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 17169 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17170 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 17171 for { 17172 off1 := v.AuxInt 17173 sym1 := v.Aux 17174 v_0 := v.Args[0] 17175 if v_0.Op != OpS390XMOVDaddridx { 17176 break 17177 } 17178 off2 := v_0.AuxInt 17179 sym2 := v_0.Aux 17180 ptr := v_0.Args[0] 17181 idx := v_0.Args[1] 17182 val := v.Args[1] 17183 mem := v.Args[2] 17184 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17185 break 17186 } 17187 v.reset(OpS390XMOVWstoreidx) 17188 v.AuxInt = off1 + off2 17189 v.Aux = mergeSym(sym1, sym2) 17190 v.AddArg(ptr) 17191 v.AddArg(idx) 17192 v.AddArg(val) 17193 v.AddArg(mem) 17194 return true 17195 } 17196 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 17197 // cond: ptr.Op != OpSB 17198 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 17199 for { 17200 off := v.AuxInt 17201 sym := v.Aux 17202 v_0 := v.Args[0] 17203 if v_0.Op != OpS390XADD { 17204 break 17205 } 17206 ptr := v_0.Args[0] 17207 idx := v_0.Args[1] 17208 val := v.Args[1] 17209 mem := v.Args[2] 17210 if !(ptr.Op != OpSB) { 17211 break 17212 } 17213 v.reset(OpS390XMOVWstoreidx) 17214 v.AuxInt = off 17215 v.Aux = sym 17216 v.AddArg(ptr) 17217 v.AddArg(idx) 17218 v.AddArg(val) 17219 v.AddArg(mem) 17220 return true 17221 } 17222 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 17223 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17224 // result: (MOVDstore [i-4] {s} p w mem) 17225 for { 17226 i := v.AuxInt 17227 s := v.Aux 17228 p := v.Args[0] 17229 v_1 := v.Args[1] 17230 if v_1.Op != OpS390XSRDconst { 17231 break 17232 } 17233 if v_1.AuxInt != 32 { 17234 break 17235 } 17236 w := v_1.Args[0] 17237 x := v.Args[2] 17238 if x.Op != OpS390XMOVWstore { 17239 break 17240 } 17241 if x.AuxInt != i-4 { 17242 break 17243 } 17244 if x.Aux != s { 17245 break 17246 } 17247 if p != x.Args[0] { 17248 break 17249 } 17250 if w != x.Args[1] { 17251 break 17252 } 17253 mem := x.Args[2] 17254 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17255 break 17256 } 17257 v.reset(OpS390XMOVDstore) 17258 v.AuxInt = i - 4 17259 v.Aux = s 17260 v.AddArg(p) 17261 v.AddArg(w) 17262 v.AddArg(mem) 17263 return true 17264 } 17265 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 17266 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17267 // result: (MOVDstore [i-4] {s} p w0 mem) 17268 for { 17269 i := v.AuxInt 17270 s := v.Aux 17271 p := v.Args[0] 17272 w0 := v.Args[1] 17273 if w0.Op != OpS390XSRDconst { 17274 break 17275 } 17276 j := w0.AuxInt 17277 w := w0.Args[0] 17278 x := v.Args[2] 17279 if x.Op != OpS390XMOVWstore { 17280 break 17281 } 17282 if x.AuxInt != i-4 { 17283 break 17284 } 17285 if x.Aux != s { 17286 break 17287 } 17288 if p != x.Args[0] { 17289 break 17290 } 17291 x_1 := x.Args[1] 17292 if x_1.Op != OpS390XSRDconst { 17293 break 17294 } 17295 if x_1.AuxInt != j+32 { 17296 break 17297 } 17298 if w != x_1.Args[0] { 17299 break 17300 } 17301 mem := x.Args[2] 17302 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17303 break 17304 } 17305 v.reset(OpS390XMOVDstore) 17306 v.AuxInt = i - 4 17307 v.Aux = s 17308 v.AddArg(p) 17309 v.AddArg(w0) 17310 v.AddArg(mem) 17311 return true 17312 } 17313 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 17314 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 17315 // result: (STM2 [i-4] {s} p w0 w1 mem) 17316 for { 17317 i := v.AuxInt 17318 s := v.Aux 17319 p := v.Args[0] 17320 w1 := v.Args[1] 17321 x := v.Args[2] 17322 if x.Op != OpS390XMOVWstore { 17323 break 17324 } 17325 if x.AuxInt != i-4 { 17326 break 17327 } 17328 if x.Aux != s { 17329 break 17330 } 17331 if p != x.Args[0] { 17332 break 17333 } 17334 w0 := x.Args[1] 17335 mem := x.Args[2] 17336 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 17337 break 17338 } 17339 v.reset(OpS390XSTM2) 17340 v.AuxInt = i - 4 17341 v.Aux = s 17342 v.AddArg(p) 17343 v.AddArg(w0) 17344 v.AddArg(w1) 17345 v.AddArg(mem) 17346 return true 17347 } 17348 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 17349 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 17350 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 17351 for { 17352 i := v.AuxInt 17353 s := v.Aux 17354 p := v.Args[0] 17355 w2 := v.Args[1] 17356 x := v.Args[2] 17357 if x.Op != OpS390XSTM2 { 17358 break 17359 } 17360 if x.AuxInt != i-8 { 17361 break 17362 } 17363 if x.Aux != s { 17364 break 17365 } 17366 if p != x.Args[0] { 17367 break 17368 } 17369 w0 := x.Args[1] 17370 w1 := x.Args[2] 17371 mem := x.Args[3] 17372 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 17373 break 17374 } 17375 v.reset(OpS390XSTM3) 17376 v.AuxInt = i - 8 17377 v.Aux = s 17378 v.AddArg(p) 17379 v.AddArg(w0) 17380 v.AddArg(w1) 17381 v.AddArg(w2) 17382 v.AddArg(mem) 17383 return true 17384 } 17385 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 17386 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 17387 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 17388 for { 17389 i := v.AuxInt 17390 s := v.Aux 17391 p := v.Args[0] 17392 w3 := v.Args[1] 17393 x := v.Args[2] 17394 if x.Op != OpS390XSTM3 { 17395 break 17396 } 17397 if x.AuxInt != i-12 { 17398 break 17399 } 17400 if x.Aux != s { 17401 break 17402 } 17403 if p != x.Args[0] { 17404 break 17405 } 17406 w0 := x.Args[1] 17407 w1 := x.Args[2] 17408 w2 := x.Args[3] 17409 mem := x.Args[4] 17410 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 17411 break 17412 } 17413 v.reset(OpS390XSTM4) 17414 v.AuxInt = i - 12 17415 v.Aux = s 17416 v.AddArg(p) 17417 v.AddArg(w0) 17418 v.AddArg(w1) 17419 v.AddArg(w2) 17420 v.AddArg(w3) 17421 v.AddArg(mem) 17422 return true 17423 } 17424 return false 17425 } 17426 func rewriteValueS390X_OpS390XMOVWstoreconst(v *Value) bool { 17427 b := v.Block 17428 _ = b 17429 types := &b.Func.Config.Types 17430 _ = types 17431 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 17432 // cond: ValAndOff(sc).canAdd(off) 17433 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 17434 for { 17435 sc := v.AuxInt 17436 s := v.Aux 17437 v_0 := v.Args[0] 17438 if v_0.Op != OpS390XADDconst { 17439 break 17440 } 17441 off := v_0.AuxInt 17442 ptr := v_0.Args[0] 17443 mem := v.Args[1] 17444 if !(ValAndOff(sc).canAdd(off)) { 17445 break 17446 } 17447 v.reset(OpS390XMOVWstoreconst) 17448 v.AuxInt = ValAndOff(sc).add(off) 17449 v.Aux = s 17450 v.AddArg(ptr) 17451 v.AddArg(mem) 17452 return true 17453 } 17454 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 17455 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 17456 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 17457 for { 17458 sc := v.AuxInt 17459 sym1 := v.Aux 17460 v_0 := v.Args[0] 17461 if v_0.Op != OpS390XMOVDaddr { 17462 break 17463 } 17464 off := v_0.AuxInt 17465 sym2 := v_0.Aux 17466 ptr := v_0.Args[0] 17467 mem := v.Args[1] 17468 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 17469 break 17470 } 17471 v.reset(OpS390XMOVWstoreconst) 17472 v.AuxInt = ValAndOff(sc).add(off) 17473 v.Aux = mergeSym(sym1, sym2) 17474 v.AddArg(ptr) 17475 v.AddArg(mem) 17476 return true 17477 } 17478 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 17479 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 17480 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 17481 for { 17482 c := v.AuxInt 17483 s := v.Aux 17484 p := v.Args[0] 17485 x := v.Args[1] 17486 if x.Op != OpS390XMOVWstoreconst { 17487 break 17488 } 17489 a := x.AuxInt 17490 if x.Aux != s { 17491 break 17492 } 17493 if p != x.Args[0] { 17494 break 17495 } 17496 mem := x.Args[1] 17497 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 17498 break 17499 } 17500 v.reset(OpS390XMOVDstore) 17501 v.AuxInt = ValAndOff(a).Off() 17502 v.Aux = s 17503 v.AddArg(p) 17504 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 17505 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 17506 v.AddArg(v0) 17507 v.AddArg(mem) 17508 return true 17509 } 17510 return false 17511 } 17512 func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { 17513 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 17514 // cond: 17515 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17516 for { 17517 c := v.AuxInt 17518 sym := v.Aux 17519 v_0 := v.Args[0] 17520 if v_0.Op != OpS390XADDconst { 17521 break 17522 } 17523 d := v_0.AuxInt 17524 ptr := v_0.Args[0] 17525 idx := v.Args[1] 17526 val := v.Args[2] 17527 mem := v.Args[3] 17528 v.reset(OpS390XMOVWstoreidx) 17529 v.AuxInt = c + d 17530 v.Aux = sym 17531 v.AddArg(ptr) 17532 v.AddArg(idx) 17533 v.AddArg(val) 17534 v.AddArg(mem) 17535 return true 17536 } 17537 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 17538 // cond: 17539 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17540 for { 17541 c := v.AuxInt 17542 sym := v.Aux 17543 idx := v.Args[0] 17544 v_1 := v.Args[1] 17545 if v_1.Op != OpS390XADDconst { 17546 break 17547 } 17548 d := v_1.AuxInt 17549 ptr := v_1.Args[0] 17550 val := v.Args[2] 17551 mem := v.Args[3] 17552 v.reset(OpS390XMOVWstoreidx) 17553 v.AuxInt = c + d 17554 v.Aux = sym 17555 v.AddArg(ptr) 17556 v.AddArg(idx) 17557 v.AddArg(val) 17558 v.AddArg(mem) 17559 return true 17560 } 17561 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 17562 // cond: 17563 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17564 for { 17565 c := v.AuxInt 17566 sym := v.Aux 17567 ptr := v.Args[0] 17568 v_1 := v.Args[1] 17569 if v_1.Op != OpS390XADDconst { 17570 break 17571 } 17572 d := v_1.AuxInt 17573 idx := v_1.Args[0] 17574 val := v.Args[2] 17575 mem := v.Args[3] 17576 v.reset(OpS390XMOVWstoreidx) 17577 v.AuxInt = c + d 17578 v.Aux = sym 17579 v.AddArg(ptr) 17580 v.AddArg(idx) 17581 v.AddArg(val) 17582 v.AddArg(mem) 17583 return true 17584 } 17585 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 17586 // cond: 17587 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17588 for { 17589 c := v.AuxInt 17590 sym := v.Aux 17591 v_0 := v.Args[0] 17592 if v_0.Op != OpS390XADDconst { 17593 break 17594 } 17595 d := v_0.AuxInt 17596 idx := v_0.Args[0] 17597 ptr := v.Args[1] 17598 val := v.Args[2] 17599 mem := v.Args[3] 17600 v.reset(OpS390XMOVWstoreidx) 17601 v.AuxInt = c + d 17602 v.Aux = sym 17603 v.AddArg(ptr) 17604 v.AddArg(idx) 17605 v.AddArg(val) 17606 v.AddArg(mem) 17607 return true 17608 } 17609 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 17610 // cond: x.Uses == 1 && clobber(x) 17611 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17612 for { 17613 i := v.AuxInt 17614 s := v.Aux 17615 p := v.Args[0] 17616 idx := v.Args[1] 17617 w := v.Args[2] 17618 x := v.Args[3] 17619 if x.Op != OpS390XMOVWstoreidx { 17620 break 17621 } 17622 if x.AuxInt != i-4 { 17623 break 17624 } 17625 if x.Aux != s { 17626 break 17627 } 17628 if p != x.Args[0] { 17629 break 17630 } 17631 if idx != x.Args[1] { 17632 break 17633 } 17634 x_2 := x.Args[2] 17635 if x_2.Op != OpS390XSRDconst { 17636 break 17637 } 17638 if x_2.AuxInt != 32 { 17639 break 17640 } 17641 if w != x_2.Args[0] { 17642 break 17643 } 17644 mem := x.Args[3] 17645 if !(x.Uses == 1 && clobber(x)) { 17646 break 17647 } 17648 v.reset(OpS390XMOVDstoreidx) 17649 v.AuxInt = i - 4 17650 v.Aux = s 17651 v.AddArg(p) 17652 v.AddArg(idx) 17653 v.AddArg(w) 17654 v.AddArg(mem) 17655 return true 17656 } 17657 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 17658 // cond: x.Uses == 1 && clobber(x) 17659 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17660 for { 17661 i := v.AuxInt 17662 s := v.Aux 17663 p := v.Args[0] 17664 idx := v.Args[1] 17665 w := v.Args[2] 17666 x := v.Args[3] 17667 if x.Op != OpS390XMOVWstoreidx { 17668 break 17669 } 17670 if x.AuxInt != i-4 { 17671 break 17672 } 17673 if x.Aux != s { 17674 break 17675 } 17676 if idx != x.Args[0] { 17677 break 17678 } 17679 if p != x.Args[1] { 17680 break 17681 } 17682 x_2 := x.Args[2] 17683 if x_2.Op != OpS390XSRDconst { 17684 break 17685 } 17686 if x_2.AuxInt != 32 { 17687 break 17688 } 17689 if w != x_2.Args[0] { 17690 break 17691 } 17692 mem := x.Args[3] 17693 if !(x.Uses == 1 && clobber(x)) { 17694 break 17695 } 17696 v.reset(OpS390XMOVDstoreidx) 17697 v.AuxInt = i - 4 17698 v.Aux = s 17699 v.AddArg(p) 17700 v.AddArg(idx) 17701 v.AddArg(w) 17702 v.AddArg(mem) 17703 return true 17704 } 17705 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 17706 // cond: x.Uses == 1 && clobber(x) 17707 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17708 for { 17709 i := v.AuxInt 17710 s := v.Aux 17711 idx := v.Args[0] 17712 p := v.Args[1] 17713 w := v.Args[2] 17714 x := v.Args[3] 17715 if x.Op != OpS390XMOVWstoreidx { 17716 break 17717 } 17718 if x.AuxInt != i-4 { 17719 break 17720 } 17721 if x.Aux != s { 17722 break 17723 } 17724 if p != x.Args[0] { 17725 break 17726 } 17727 if idx != x.Args[1] { 17728 break 17729 } 17730 x_2 := x.Args[2] 17731 if x_2.Op != OpS390XSRDconst { 17732 break 17733 } 17734 if x_2.AuxInt != 32 { 17735 break 17736 } 17737 if w != x_2.Args[0] { 17738 break 17739 } 17740 mem := x.Args[3] 17741 if !(x.Uses == 1 && clobber(x)) { 17742 break 17743 } 17744 v.reset(OpS390XMOVDstoreidx) 17745 v.AuxInt = i - 4 17746 v.Aux = s 17747 v.AddArg(p) 17748 v.AddArg(idx) 17749 v.AddArg(w) 17750 v.AddArg(mem) 17751 return true 17752 } 17753 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 17754 // cond: x.Uses == 1 && clobber(x) 17755 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17756 for { 17757 i := v.AuxInt 17758 s := v.Aux 17759 idx := v.Args[0] 17760 p := v.Args[1] 17761 w := v.Args[2] 17762 x := v.Args[3] 17763 if x.Op != OpS390XMOVWstoreidx { 17764 break 17765 } 17766 if x.AuxInt != i-4 { 17767 break 17768 } 17769 if x.Aux != s { 17770 break 17771 } 17772 if idx != x.Args[0] { 17773 break 17774 } 17775 if p != x.Args[1] { 17776 break 17777 } 17778 x_2 := x.Args[2] 17779 if x_2.Op != OpS390XSRDconst { 17780 break 17781 } 17782 if x_2.AuxInt != 32 { 17783 break 17784 } 17785 if w != x_2.Args[0] { 17786 break 17787 } 17788 mem := x.Args[3] 17789 if !(x.Uses == 1 && clobber(x)) { 17790 break 17791 } 17792 v.reset(OpS390XMOVDstoreidx) 17793 v.AuxInt = i - 4 17794 v.Aux = s 17795 v.AddArg(p) 17796 v.AddArg(idx) 17797 v.AddArg(w) 17798 v.AddArg(mem) 17799 return true 17800 } 17801 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 17802 // cond: x.Uses == 1 && clobber(x) 17803 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17804 for { 17805 i := v.AuxInt 17806 s := v.Aux 17807 p := v.Args[0] 17808 idx := v.Args[1] 17809 w0 := v.Args[2] 17810 if w0.Op != OpS390XSRDconst { 17811 break 17812 } 17813 j := w0.AuxInt 17814 w := w0.Args[0] 17815 x := v.Args[3] 17816 if x.Op != OpS390XMOVWstoreidx { 17817 break 17818 } 17819 if x.AuxInt != i-4 { 17820 break 17821 } 17822 if x.Aux != s { 17823 break 17824 } 17825 if p != x.Args[0] { 17826 break 17827 } 17828 if idx != x.Args[1] { 17829 break 17830 } 17831 x_2 := x.Args[2] 17832 if x_2.Op != OpS390XSRDconst { 17833 break 17834 } 17835 if x_2.AuxInt != j+32 { 17836 break 17837 } 17838 if w != x_2.Args[0] { 17839 break 17840 } 17841 mem := x.Args[3] 17842 if !(x.Uses == 1 && clobber(x)) { 17843 break 17844 } 17845 v.reset(OpS390XMOVDstoreidx) 17846 v.AuxInt = i - 4 17847 v.Aux = s 17848 v.AddArg(p) 17849 v.AddArg(idx) 17850 v.AddArg(w0) 17851 v.AddArg(mem) 17852 return true 17853 } 17854 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 17855 // cond: x.Uses == 1 && clobber(x) 17856 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17857 for { 17858 i := v.AuxInt 17859 s := v.Aux 17860 p := v.Args[0] 17861 idx := v.Args[1] 17862 w0 := v.Args[2] 17863 if w0.Op != OpS390XSRDconst { 17864 break 17865 } 17866 j := w0.AuxInt 17867 w := w0.Args[0] 17868 x := v.Args[3] 17869 if x.Op != OpS390XMOVWstoreidx { 17870 break 17871 } 17872 if x.AuxInt != i-4 { 17873 break 17874 } 17875 if x.Aux != s { 17876 break 17877 } 17878 if idx != x.Args[0] { 17879 break 17880 } 17881 if p != x.Args[1] { 17882 break 17883 } 17884 x_2 := x.Args[2] 17885 if x_2.Op != OpS390XSRDconst { 17886 break 17887 } 17888 if x_2.AuxInt != j+32 { 17889 break 17890 } 17891 if w != x_2.Args[0] { 17892 break 17893 } 17894 mem := x.Args[3] 17895 if !(x.Uses == 1 && clobber(x)) { 17896 break 17897 } 17898 v.reset(OpS390XMOVDstoreidx) 17899 v.AuxInt = i - 4 17900 v.Aux = s 17901 v.AddArg(p) 17902 v.AddArg(idx) 17903 v.AddArg(w0) 17904 v.AddArg(mem) 17905 return true 17906 } 17907 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 17908 // cond: x.Uses == 1 && clobber(x) 17909 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17910 for { 17911 i := v.AuxInt 17912 s := v.Aux 17913 idx := v.Args[0] 17914 p := v.Args[1] 17915 w0 := v.Args[2] 17916 if w0.Op != OpS390XSRDconst { 17917 break 17918 } 17919 j := w0.AuxInt 17920 w := w0.Args[0] 17921 x := v.Args[3] 17922 if x.Op != OpS390XMOVWstoreidx { 17923 break 17924 } 17925 if x.AuxInt != i-4 { 17926 break 17927 } 17928 if x.Aux != s { 17929 break 17930 } 17931 if p != x.Args[0] { 17932 break 17933 } 17934 if idx != x.Args[1] { 17935 break 17936 } 17937 x_2 := x.Args[2] 17938 if x_2.Op != OpS390XSRDconst { 17939 break 17940 } 17941 if x_2.AuxInt != j+32 { 17942 break 17943 } 17944 if w != x_2.Args[0] { 17945 break 17946 } 17947 mem := x.Args[3] 17948 if !(x.Uses == 1 && clobber(x)) { 17949 break 17950 } 17951 v.reset(OpS390XMOVDstoreidx) 17952 v.AuxInt = i - 4 17953 v.Aux = s 17954 v.AddArg(p) 17955 v.AddArg(idx) 17956 v.AddArg(w0) 17957 v.AddArg(mem) 17958 return true 17959 } 17960 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 17961 // cond: x.Uses == 1 && clobber(x) 17962 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17963 for { 17964 i := v.AuxInt 17965 s := v.Aux 17966 idx := v.Args[0] 17967 p := v.Args[1] 17968 w0 := v.Args[2] 17969 if w0.Op != OpS390XSRDconst { 17970 break 17971 } 17972 j := w0.AuxInt 17973 w := w0.Args[0] 17974 x := v.Args[3] 17975 if x.Op != OpS390XMOVWstoreidx { 17976 break 17977 } 17978 if x.AuxInt != i-4 { 17979 break 17980 } 17981 if x.Aux != s { 17982 break 17983 } 17984 if idx != x.Args[0] { 17985 break 17986 } 17987 if p != x.Args[1] { 17988 break 17989 } 17990 x_2 := x.Args[2] 17991 if x_2.Op != OpS390XSRDconst { 17992 break 17993 } 17994 if x_2.AuxInt != j+32 { 17995 break 17996 } 17997 if w != x_2.Args[0] { 17998 break 17999 } 18000 mem := x.Args[3] 18001 if !(x.Uses == 1 && clobber(x)) { 18002 break 18003 } 18004 v.reset(OpS390XMOVDstoreidx) 18005 v.AuxInt = i - 4 18006 v.Aux = s 18007 v.AddArg(p) 18008 v.AddArg(idx) 18009 v.AddArg(w0) 18010 v.AddArg(mem) 18011 return true 18012 } 18013 return false 18014 } 18015 func rewriteValueS390X_OpS390XMULLD(v *Value) bool { 18016 // match: (MULLD x (MOVDconst [c])) 18017 // cond: is32Bit(c) 18018 // result: (MULLDconst [c] x) 18019 for { 18020 x := v.Args[0] 18021 v_1 := v.Args[1] 18022 if v_1.Op != OpS390XMOVDconst { 18023 break 18024 } 18025 c := v_1.AuxInt 18026 if !(is32Bit(c)) { 18027 break 18028 } 18029 v.reset(OpS390XMULLDconst) 18030 v.AuxInt = c 18031 v.AddArg(x) 18032 return true 18033 } 18034 // match: (MULLD (MOVDconst [c]) x) 18035 // cond: is32Bit(c) 18036 // result: (MULLDconst [c] x) 18037 for { 18038 v_0 := v.Args[0] 18039 if v_0.Op != OpS390XMOVDconst { 18040 break 18041 } 18042 c := v_0.AuxInt 18043 x := v.Args[1] 18044 if !(is32Bit(c)) { 18045 break 18046 } 18047 v.reset(OpS390XMULLDconst) 18048 v.AuxInt = c 18049 v.AddArg(x) 18050 return true 18051 } 18052 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18053 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18054 // result: (MULLDload <t> [off] {sym} x ptr mem) 18055 for { 18056 t := v.Type 18057 x := v.Args[0] 18058 g := v.Args[1] 18059 if g.Op != OpS390XMOVDload { 18060 break 18061 } 18062 off := g.AuxInt 18063 sym := g.Aux 18064 ptr := g.Args[0] 18065 mem := g.Args[1] 18066 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18067 break 18068 } 18069 v.reset(OpS390XMULLDload) 18070 v.Type = t 18071 v.AuxInt = off 18072 v.Aux = sym 18073 v.AddArg(x) 18074 v.AddArg(ptr) 18075 v.AddArg(mem) 18076 return true 18077 } 18078 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18079 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18080 // result: (MULLDload <t> [off] {sym} x ptr mem) 18081 for { 18082 t := v.Type 18083 g := v.Args[0] 18084 if g.Op != OpS390XMOVDload { 18085 break 18086 } 18087 off := g.AuxInt 18088 sym := g.Aux 18089 ptr := g.Args[0] 18090 mem := g.Args[1] 18091 x := v.Args[1] 18092 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18093 break 18094 } 18095 v.reset(OpS390XMULLDload) 18096 v.Type = t 18097 v.AuxInt = off 18098 v.Aux = sym 18099 v.AddArg(x) 18100 v.AddArg(ptr) 18101 v.AddArg(mem) 18102 return true 18103 } 18104 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18105 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18106 // result: (MULLDload <t> [off] {sym} x ptr mem) 18107 for { 18108 t := v.Type 18109 g := v.Args[0] 18110 if g.Op != OpS390XMOVDload { 18111 break 18112 } 18113 off := g.AuxInt 18114 sym := g.Aux 18115 ptr := g.Args[0] 18116 mem := g.Args[1] 18117 x := v.Args[1] 18118 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18119 break 18120 } 18121 v.reset(OpS390XMULLDload) 18122 v.Type = t 18123 v.AuxInt = off 18124 v.Aux = sym 18125 v.AddArg(x) 18126 v.AddArg(ptr) 18127 v.AddArg(mem) 18128 return true 18129 } 18130 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18131 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18132 // result: (MULLDload <t> [off] {sym} x ptr mem) 18133 for { 18134 t := v.Type 18135 x := v.Args[0] 18136 g := v.Args[1] 18137 if g.Op != OpS390XMOVDload { 18138 break 18139 } 18140 off := g.AuxInt 18141 sym := g.Aux 18142 ptr := g.Args[0] 18143 mem := g.Args[1] 18144 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18145 break 18146 } 18147 v.reset(OpS390XMULLDload) 18148 v.Type = t 18149 v.AuxInt = off 18150 v.Aux = sym 18151 v.AddArg(x) 18152 v.AddArg(ptr) 18153 v.AddArg(mem) 18154 return true 18155 } 18156 return false 18157 } 18158 func rewriteValueS390X_OpS390XMULLDconst(v *Value) bool { 18159 b := v.Block 18160 _ = b 18161 // match: (MULLDconst [-1] x) 18162 // cond: 18163 // result: (NEG x) 18164 for { 18165 if v.AuxInt != -1 { 18166 break 18167 } 18168 x := v.Args[0] 18169 v.reset(OpS390XNEG) 18170 v.AddArg(x) 18171 return true 18172 } 18173 // match: (MULLDconst [0] _) 18174 // cond: 18175 // result: (MOVDconst [0]) 18176 for { 18177 if v.AuxInt != 0 { 18178 break 18179 } 18180 v.reset(OpS390XMOVDconst) 18181 v.AuxInt = 0 18182 return true 18183 } 18184 // match: (MULLDconst [1] x) 18185 // cond: 18186 // result: x 18187 for { 18188 if v.AuxInt != 1 { 18189 break 18190 } 18191 x := v.Args[0] 18192 v.reset(OpCopy) 18193 v.Type = x.Type 18194 v.AddArg(x) 18195 return true 18196 } 18197 // match: (MULLDconst [c] x) 18198 // cond: isPowerOfTwo(c) 18199 // result: (SLDconst [log2(c)] x) 18200 for { 18201 c := v.AuxInt 18202 x := v.Args[0] 18203 if !(isPowerOfTwo(c)) { 18204 break 18205 } 18206 v.reset(OpS390XSLDconst) 18207 v.AuxInt = log2(c) 18208 v.AddArg(x) 18209 return true 18210 } 18211 // match: (MULLDconst [c] x) 18212 // cond: isPowerOfTwo(c+1) && c >= 15 18213 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 18214 for { 18215 c := v.AuxInt 18216 x := v.Args[0] 18217 if !(isPowerOfTwo(c+1) && c >= 15) { 18218 break 18219 } 18220 v.reset(OpS390XSUB) 18221 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 18222 v0.AuxInt = log2(c + 1) 18223 v0.AddArg(x) 18224 v.AddArg(v0) 18225 v.AddArg(x) 18226 return true 18227 } 18228 // match: (MULLDconst [c] x) 18229 // cond: isPowerOfTwo(c-1) && c >= 17 18230 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 18231 for { 18232 c := v.AuxInt 18233 x := v.Args[0] 18234 if !(isPowerOfTwo(c-1) && c >= 17) { 18235 break 18236 } 18237 v.reset(OpS390XADD) 18238 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 18239 v0.AuxInt = log2(c - 1) 18240 v0.AddArg(x) 18241 v.AddArg(v0) 18242 v.AddArg(x) 18243 return true 18244 } 18245 // match: (MULLDconst [c] (MOVDconst [d])) 18246 // cond: 18247 // result: (MOVDconst [c*d]) 18248 for { 18249 c := v.AuxInt 18250 v_0 := v.Args[0] 18251 if v_0.Op != OpS390XMOVDconst { 18252 break 18253 } 18254 d := v_0.AuxInt 18255 v.reset(OpS390XMOVDconst) 18256 v.AuxInt = c * d 18257 return true 18258 } 18259 return false 18260 } 18261 func rewriteValueS390X_OpS390XMULLW(v *Value) bool { 18262 // match: (MULLW x (MOVDconst [c])) 18263 // cond: 18264 // result: (MULLWconst [c] x) 18265 for { 18266 x := v.Args[0] 18267 v_1 := v.Args[1] 18268 if v_1.Op != OpS390XMOVDconst { 18269 break 18270 } 18271 c := v_1.AuxInt 18272 v.reset(OpS390XMULLWconst) 18273 v.AuxInt = c 18274 v.AddArg(x) 18275 return true 18276 } 18277 // match: (MULLW (MOVDconst [c]) x) 18278 // cond: 18279 // result: (MULLWconst [c] x) 18280 for { 18281 v_0 := v.Args[0] 18282 if v_0.Op != OpS390XMOVDconst { 18283 break 18284 } 18285 c := v_0.AuxInt 18286 x := v.Args[1] 18287 v.reset(OpS390XMULLWconst) 18288 v.AuxInt = c 18289 v.AddArg(x) 18290 return true 18291 } 18292 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 18293 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18294 // result: (MULLWload <t> [off] {sym} x ptr mem) 18295 for { 18296 t := v.Type 18297 x := v.Args[0] 18298 g := v.Args[1] 18299 if g.Op != OpS390XMOVWload { 18300 break 18301 } 18302 off := g.AuxInt 18303 sym := g.Aux 18304 ptr := g.Args[0] 18305 mem := g.Args[1] 18306 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18307 break 18308 } 18309 v.reset(OpS390XMULLWload) 18310 v.Type = t 18311 v.AuxInt = off 18312 v.Aux = sym 18313 v.AddArg(x) 18314 v.AddArg(ptr) 18315 v.AddArg(mem) 18316 return true 18317 } 18318 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 18319 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18320 // result: (MULLWload <t> [off] {sym} x ptr mem) 18321 for { 18322 t := v.Type 18323 g := v.Args[0] 18324 if g.Op != OpS390XMOVWload { 18325 break 18326 } 18327 off := g.AuxInt 18328 sym := g.Aux 18329 ptr := g.Args[0] 18330 mem := g.Args[1] 18331 x := v.Args[1] 18332 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18333 break 18334 } 18335 v.reset(OpS390XMULLWload) 18336 v.Type = t 18337 v.AuxInt = off 18338 v.Aux = sym 18339 v.AddArg(x) 18340 v.AddArg(ptr) 18341 v.AddArg(mem) 18342 return true 18343 } 18344 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 18345 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18346 // result: (MULLWload <t> [off] {sym} x ptr mem) 18347 for { 18348 t := v.Type 18349 g := v.Args[0] 18350 if g.Op != OpS390XMOVWload { 18351 break 18352 } 18353 off := g.AuxInt 18354 sym := g.Aux 18355 ptr := g.Args[0] 18356 mem := g.Args[1] 18357 x := v.Args[1] 18358 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18359 break 18360 } 18361 v.reset(OpS390XMULLWload) 18362 v.Type = t 18363 v.AuxInt = off 18364 v.Aux = sym 18365 v.AddArg(x) 18366 v.AddArg(ptr) 18367 v.AddArg(mem) 18368 return true 18369 } 18370 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 18371 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18372 // result: (MULLWload <t> [off] {sym} x ptr mem) 18373 for { 18374 t := v.Type 18375 x := v.Args[0] 18376 g := v.Args[1] 18377 if g.Op != OpS390XMOVWload { 18378 break 18379 } 18380 off := g.AuxInt 18381 sym := g.Aux 18382 ptr := g.Args[0] 18383 mem := g.Args[1] 18384 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18385 break 18386 } 18387 v.reset(OpS390XMULLWload) 18388 v.Type = t 18389 v.AuxInt = off 18390 v.Aux = sym 18391 v.AddArg(x) 18392 v.AddArg(ptr) 18393 v.AddArg(mem) 18394 return true 18395 } 18396 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 18397 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18398 // result: (MULLWload <t> [off] {sym} x ptr mem) 18399 for { 18400 t := v.Type 18401 x := v.Args[0] 18402 g := v.Args[1] 18403 if g.Op != OpS390XMOVWZload { 18404 break 18405 } 18406 off := g.AuxInt 18407 sym := g.Aux 18408 ptr := g.Args[0] 18409 mem := g.Args[1] 18410 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18411 break 18412 } 18413 v.reset(OpS390XMULLWload) 18414 v.Type = t 18415 v.AuxInt = off 18416 v.Aux = sym 18417 v.AddArg(x) 18418 v.AddArg(ptr) 18419 v.AddArg(mem) 18420 return true 18421 } 18422 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 18423 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18424 // result: (MULLWload <t> [off] {sym} x ptr mem) 18425 for { 18426 t := v.Type 18427 g := v.Args[0] 18428 if g.Op != OpS390XMOVWZload { 18429 break 18430 } 18431 off := g.AuxInt 18432 sym := g.Aux 18433 ptr := g.Args[0] 18434 mem := g.Args[1] 18435 x := v.Args[1] 18436 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18437 break 18438 } 18439 v.reset(OpS390XMULLWload) 18440 v.Type = t 18441 v.AuxInt = off 18442 v.Aux = sym 18443 v.AddArg(x) 18444 v.AddArg(ptr) 18445 v.AddArg(mem) 18446 return true 18447 } 18448 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 18449 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18450 // result: (MULLWload <t> [off] {sym} x ptr mem) 18451 for { 18452 t := v.Type 18453 g := v.Args[0] 18454 if g.Op != OpS390XMOVWZload { 18455 break 18456 } 18457 off := g.AuxInt 18458 sym := g.Aux 18459 ptr := g.Args[0] 18460 mem := g.Args[1] 18461 x := v.Args[1] 18462 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18463 break 18464 } 18465 v.reset(OpS390XMULLWload) 18466 v.Type = t 18467 v.AuxInt = off 18468 v.Aux = sym 18469 v.AddArg(x) 18470 v.AddArg(ptr) 18471 v.AddArg(mem) 18472 return true 18473 } 18474 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 18475 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18476 // result: (MULLWload <t> [off] {sym} x ptr mem) 18477 for { 18478 t := v.Type 18479 x := v.Args[0] 18480 g := v.Args[1] 18481 if g.Op != OpS390XMOVWZload { 18482 break 18483 } 18484 off := g.AuxInt 18485 sym := g.Aux 18486 ptr := g.Args[0] 18487 mem := g.Args[1] 18488 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18489 break 18490 } 18491 v.reset(OpS390XMULLWload) 18492 v.Type = t 18493 v.AuxInt = off 18494 v.Aux = sym 18495 v.AddArg(x) 18496 v.AddArg(ptr) 18497 v.AddArg(mem) 18498 return true 18499 } 18500 return false 18501 } 18502 func rewriteValueS390X_OpS390XMULLWconst(v *Value) bool { 18503 b := v.Block 18504 _ = b 18505 // match: (MULLWconst [-1] x) 18506 // cond: 18507 // result: (NEGW x) 18508 for { 18509 if v.AuxInt != -1 { 18510 break 18511 } 18512 x := v.Args[0] 18513 v.reset(OpS390XNEGW) 18514 v.AddArg(x) 18515 return true 18516 } 18517 // match: (MULLWconst [0] _) 18518 // cond: 18519 // result: (MOVDconst [0]) 18520 for { 18521 if v.AuxInt != 0 { 18522 break 18523 } 18524 v.reset(OpS390XMOVDconst) 18525 v.AuxInt = 0 18526 return true 18527 } 18528 // match: (MULLWconst [1] x) 18529 // cond: 18530 // result: x 18531 for { 18532 if v.AuxInt != 1 { 18533 break 18534 } 18535 x := v.Args[0] 18536 v.reset(OpCopy) 18537 v.Type = x.Type 18538 v.AddArg(x) 18539 return true 18540 } 18541 // match: (MULLWconst [c] x) 18542 // cond: isPowerOfTwo(c) 18543 // result: (SLWconst [log2(c)] x) 18544 for { 18545 c := v.AuxInt 18546 x := v.Args[0] 18547 if !(isPowerOfTwo(c)) { 18548 break 18549 } 18550 v.reset(OpS390XSLWconst) 18551 v.AuxInt = log2(c) 18552 v.AddArg(x) 18553 return true 18554 } 18555 // match: (MULLWconst [c] x) 18556 // cond: isPowerOfTwo(c+1) && c >= 15 18557 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 18558 for { 18559 c := v.AuxInt 18560 x := v.Args[0] 18561 if !(isPowerOfTwo(c+1) && c >= 15) { 18562 break 18563 } 18564 v.reset(OpS390XSUBW) 18565 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 18566 v0.AuxInt = log2(c + 1) 18567 v0.AddArg(x) 18568 v.AddArg(v0) 18569 v.AddArg(x) 18570 return true 18571 } 18572 // match: (MULLWconst [c] x) 18573 // cond: isPowerOfTwo(c-1) && c >= 17 18574 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 18575 for { 18576 c := v.AuxInt 18577 x := v.Args[0] 18578 if !(isPowerOfTwo(c-1) && c >= 17) { 18579 break 18580 } 18581 v.reset(OpS390XADDW) 18582 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 18583 v0.AuxInt = log2(c - 1) 18584 v0.AddArg(x) 18585 v.AddArg(v0) 18586 v.AddArg(x) 18587 return true 18588 } 18589 // match: (MULLWconst [c] (MOVDconst [d])) 18590 // cond: 18591 // result: (MOVDconst [int64(int32(c*d))]) 18592 for { 18593 c := v.AuxInt 18594 v_0 := v.Args[0] 18595 if v_0.Op != OpS390XMOVDconst { 18596 break 18597 } 18598 d := v_0.AuxInt 18599 v.reset(OpS390XMOVDconst) 18600 v.AuxInt = int64(int32(c * d)) 18601 return true 18602 } 18603 return false 18604 } 18605 func rewriteValueS390X_OpS390XNEG(v *Value) bool { 18606 // match: (NEG (MOVDconst [c])) 18607 // cond: 18608 // result: (MOVDconst [-c]) 18609 for { 18610 v_0 := v.Args[0] 18611 if v_0.Op != OpS390XMOVDconst { 18612 break 18613 } 18614 c := v_0.AuxInt 18615 v.reset(OpS390XMOVDconst) 18616 v.AuxInt = -c 18617 return true 18618 } 18619 // match: (NEG (ADDconst [c] (NEG x))) 18620 // cond: c != -(1<<31) 18621 // result: (ADDconst [-c] x) 18622 for { 18623 v_0 := v.Args[0] 18624 if v_0.Op != OpS390XADDconst { 18625 break 18626 } 18627 c := v_0.AuxInt 18628 v_0_0 := v_0.Args[0] 18629 if v_0_0.Op != OpS390XNEG { 18630 break 18631 } 18632 x := v_0_0.Args[0] 18633 if !(c != -(1 << 31)) { 18634 break 18635 } 18636 v.reset(OpS390XADDconst) 18637 v.AuxInt = -c 18638 v.AddArg(x) 18639 return true 18640 } 18641 return false 18642 } 18643 func rewriteValueS390X_OpS390XNEGW(v *Value) bool { 18644 // match: (NEGW (MOVDconst [c])) 18645 // cond: 18646 // result: (MOVDconst [int64(int32(-c))]) 18647 for { 18648 v_0 := v.Args[0] 18649 if v_0.Op != OpS390XMOVDconst { 18650 break 18651 } 18652 c := v_0.AuxInt 18653 v.reset(OpS390XMOVDconst) 18654 v.AuxInt = int64(int32(-c)) 18655 return true 18656 } 18657 return false 18658 } 18659 func rewriteValueS390X_OpS390XNOT(v *Value) bool { 18660 b := v.Block 18661 _ = b 18662 types := &b.Func.Config.Types 18663 _ = types 18664 // match: (NOT x) 18665 // cond: true 18666 // result: (XOR (MOVDconst [-1]) x) 18667 for { 18668 x := v.Args[0] 18669 if !(true) { 18670 break 18671 } 18672 v.reset(OpS390XXOR) 18673 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 18674 v0.AuxInt = -1 18675 v.AddArg(v0) 18676 v.AddArg(x) 18677 return true 18678 } 18679 return false 18680 } 18681 func rewriteValueS390X_OpS390XNOTW(v *Value) bool { 18682 // match: (NOTW x) 18683 // cond: true 18684 // result: (XORWconst [-1] x) 18685 for { 18686 x := v.Args[0] 18687 if !(true) { 18688 break 18689 } 18690 v.reset(OpS390XXORWconst) 18691 v.AuxInt = -1 18692 v.AddArg(x) 18693 return true 18694 } 18695 return false 18696 } 18697 func rewriteValueS390X_OpS390XOR(v *Value) bool { 18698 b := v.Block 18699 _ = b 18700 types := &b.Func.Config.Types 18701 _ = types 18702 // match: (OR x (MOVDconst [c])) 18703 // cond: isU32Bit(c) 18704 // result: (ORconst [c] x) 18705 for { 18706 x := v.Args[0] 18707 v_1 := v.Args[1] 18708 if v_1.Op != OpS390XMOVDconst { 18709 break 18710 } 18711 c := v_1.AuxInt 18712 if !(isU32Bit(c)) { 18713 break 18714 } 18715 v.reset(OpS390XORconst) 18716 v.AuxInt = c 18717 v.AddArg(x) 18718 return true 18719 } 18720 // match: (OR (MOVDconst [c]) x) 18721 // cond: isU32Bit(c) 18722 // result: (ORconst [c] x) 18723 for { 18724 v_0 := v.Args[0] 18725 if v_0.Op != OpS390XMOVDconst { 18726 break 18727 } 18728 c := v_0.AuxInt 18729 x := v.Args[1] 18730 if !(isU32Bit(c)) { 18731 break 18732 } 18733 v.reset(OpS390XORconst) 18734 v.AuxInt = c 18735 v.AddArg(x) 18736 return true 18737 } 18738 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 18739 // cond: d == 64-c 18740 // result: (RLLGconst [c] x) 18741 for { 18742 v_0 := v.Args[0] 18743 if v_0.Op != OpS390XSLDconst { 18744 break 18745 } 18746 c := v_0.AuxInt 18747 x := v_0.Args[0] 18748 v_1 := v.Args[1] 18749 if v_1.Op != OpS390XSRDconst { 18750 break 18751 } 18752 d := v_1.AuxInt 18753 if x != v_1.Args[0] { 18754 break 18755 } 18756 if !(d == 64-c) { 18757 break 18758 } 18759 v.reset(OpS390XRLLGconst) 18760 v.AuxInt = c 18761 v.AddArg(x) 18762 return true 18763 } 18764 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 18765 // cond: d == 64-c 18766 // result: (RLLGconst [c] x) 18767 for { 18768 v_0 := v.Args[0] 18769 if v_0.Op != OpS390XSRDconst { 18770 break 18771 } 18772 d := v_0.AuxInt 18773 x := v_0.Args[0] 18774 v_1 := v.Args[1] 18775 if v_1.Op != OpS390XSLDconst { 18776 break 18777 } 18778 c := v_1.AuxInt 18779 if x != v_1.Args[0] { 18780 break 18781 } 18782 if !(d == 64-c) { 18783 break 18784 } 18785 v.reset(OpS390XRLLGconst) 18786 v.AuxInt = c 18787 v.AddArg(x) 18788 return true 18789 } 18790 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 18791 // cond: 18792 // result: (MOVDconst [c|d]) 18793 for { 18794 v_0 := v.Args[0] 18795 if v_0.Op != OpS390XMOVDconst { 18796 break 18797 } 18798 c := v_0.AuxInt 18799 v_1 := v.Args[1] 18800 if v_1.Op != OpS390XMOVDconst { 18801 break 18802 } 18803 d := v_1.AuxInt 18804 v.reset(OpS390XMOVDconst) 18805 v.AuxInt = c | d 18806 return true 18807 } 18808 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 18809 // cond: 18810 // result: (MOVDconst [c|d]) 18811 for { 18812 v_0 := v.Args[0] 18813 if v_0.Op != OpS390XMOVDconst { 18814 break 18815 } 18816 d := v_0.AuxInt 18817 v_1 := v.Args[1] 18818 if v_1.Op != OpS390XMOVDconst { 18819 break 18820 } 18821 c := v_1.AuxInt 18822 v.reset(OpS390XMOVDconst) 18823 v.AuxInt = c | d 18824 return true 18825 } 18826 // match: (OR x x) 18827 // cond: 18828 // result: x 18829 for { 18830 x := v.Args[0] 18831 if x != v.Args[1] { 18832 break 18833 } 18834 v.reset(OpCopy) 18835 v.Type = x.Type 18836 v.AddArg(x) 18837 return true 18838 } 18839 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 18840 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18841 // result: (ORload <t> [off] {sym} x ptr mem) 18842 for { 18843 t := v.Type 18844 x := v.Args[0] 18845 g := v.Args[1] 18846 if g.Op != OpS390XMOVDload { 18847 break 18848 } 18849 off := g.AuxInt 18850 sym := g.Aux 18851 ptr := g.Args[0] 18852 mem := g.Args[1] 18853 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18854 break 18855 } 18856 v.reset(OpS390XORload) 18857 v.Type = t 18858 v.AuxInt = off 18859 v.Aux = sym 18860 v.AddArg(x) 18861 v.AddArg(ptr) 18862 v.AddArg(mem) 18863 return true 18864 } 18865 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 18866 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18867 // result: (ORload <t> [off] {sym} x ptr mem) 18868 for { 18869 t := v.Type 18870 g := v.Args[0] 18871 if g.Op != OpS390XMOVDload { 18872 break 18873 } 18874 off := g.AuxInt 18875 sym := g.Aux 18876 ptr := g.Args[0] 18877 mem := g.Args[1] 18878 x := v.Args[1] 18879 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18880 break 18881 } 18882 v.reset(OpS390XORload) 18883 v.Type = t 18884 v.AuxInt = off 18885 v.Aux = sym 18886 v.AddArg(x) 18887 v.AddArg(ptr) 18888 v.AddArg(mem) 18889 return true 18890 } 18891 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 18892 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18893 // result: (ORload <t> [off] {sym} x ptr mem) 18894 for { 18895 t := v.Type 18896 g := v.Args[0] 18897 if g.Op != OpS390XMOVDload { 18898 break 18899 } 18900 off := g.AuxInt 18901 sym := g.Aux 18902 ptr := g.Args[0] 18903 mem := g.Args[1] 18904 x := v.Args[1] 18905 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18906 break 18907 } 18908 v.reset(OpS390XORload) 18909 v.Type = t 18910 v.AuxInt = off 18911 v.Aux = sym 18912 v.AddArg(x) 18913 v.AddArg(ptr) 18914 v.AddArg(mem) 18915 return true 18916 } 18917 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 18918 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18919 // result: (ORload <t> [off] {sym} x ptr mem) 18920 for { 18921 t := v.Type 18922 x := v.Args[0] 18923 g := v.Args[1] 18924 if g.Op != OpS390XMOVDload { 18925 break 18926 } 18927 off := g.AuxInt 18928 sym := g.Aux 18929 ptr := g.Args[0] 18930 mem := g.Args[1] 18931 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18932 break 18933 } 18934 v.reset(OpS390XORload) 18935 v.Type = t 18936 v.AuxInt = off 18937 v.Aux = sym 18938 v.AddArg(x) 18939 v.AddArg(ptr) 18940 v.AddArg(mem) 18941 return true 18942 } 18943 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 18944 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 18945 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 18946 for { 18947 x1 := v.Args[0] 18948 if x1.Op != OpS390XMOVBZload { 18949 break 18950 } 18951 i1 := x1.AuxInt 18952 s := x1.Aux 18953 p := x1.Args[0] 18954 mem := x1.Args[1] 18955 sh := v.Args[1] 18956 if sh.Op != OpS390XSLDconst { 18957 break 18958 } 18959 if sh.AuxInt != 8 { 18960 break 18961 } 18962 x0 := sh.Args[0] 18963 if x0.Op != OpS390XMOVBZload { 18964 break 18965 } 18966 i0 := x0.AuxInt 18967 if x0.Aux != s { 18968 break 18969 } 18970 if p != x0.Args[0] { 18971 break 18972 } 18973 if mem != x0.Args[1] { 18974 break 18975 } 18976 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 18977 break 18978 } 18979 b = mergePoint(b, x0, x1) 18980 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 18981 v.reset(OpCopy) 18982 v.AddArg(v0) 18983 v0.AuxInt = i0 18984 v0.Aux = s 18985 v0.AddArg(p) 18986 v0.AddArg(mem) 18987 return true 18988 } 18989 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 18990 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 18991 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 18992 for { 18993 sh := v.Args[0] 18994 if sh.Op != OpS390XSLDconst { 18995 break 18996 } 18997 if sh.AuxInt != 8 { 18998 break 18999 } 19000 x0 := sh.Args[0] 19001 if x0.Op != OpS390XMOVBZload { 19002 break 19003 } 19004 i0 := x0.AuxInt 19005 s := x0.Aux 19006 p := x0.Args[0] 19007 mem := x0.Args[1] 19008 x1 := v.Args[1] 19009 if x1.Op != OpS390XMOVBZload { 19010 break 19011 } 19012 i1 := x1.AuxInt 19013 if x1.Aux != s { 19014 break 19015 } 19016 if p != x1.Args[0] { 19017 break 19018 } 19019 if mem != x1.Args[1] { 19020 break 19021 } 19022 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19023 break 19024 } 19025 b = mergePoint(b, x0, x1) 19026 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19027 v.reset(OpCopy) 19028 v.AddArg(v0) 19029 v0.AuxInt = i0 19030 v0.Aux = s 19031 v0.AddArg(p) 19032 v0.AddArg(mem) 19033 return true 19034 } 19035 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 19036 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19037 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19038 for { 19039 x1 := v.Args[0] 19040 if x1.Op != OpS390XMOVHZload { 19041 break 19042 } 19043 i1 := x1.AuxInt 19044 s := x1.Aux 19045 p := x1.Args[0] 19046 mem := x1.Args[1] 19047 sh := v.Args[1] 19048 if sh.Op != OpS390XSLDconst { 19049 break 19050 } 19051 if sh.AuxInt != 16 { 19052 break 19053 } 19054 x0 := sh.Args[0] 19055 if x0.Op != OpS390XMOVHZload { 19056 break 19057 } 19058 i0 := x0.AuxInt 19059 if x0.Aux != s { 19060 break 19061 } 19062 if p != x0.Args[0] { 19063 break 19064 } 19065 if mem != x0.Args[1] { 19066 break 19067 } 19068 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19069 break 19070 } 19071 b = mergePoint(b, x0, x1) 19072 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19073 v.reset(OpCopy) 19074 v.AddArg(v0) 19075 v0.AuxInt = i0 19076 v0.Aux = s 19077 v0.AddArg(p) 19078 v0.AddArg(mem) 19079 return true 19080 } 19081 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 19082 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19083 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19084 for { 19085 sh := v.Args[0] 19086 if sh.Op != OpS390XSLDconst { 19087 break 19088 } 19089 if sh.AuxInt != 16 { 19090 break 19091 } 19092 x0 := sh.Args[0] 19093 if x0.Op != OpS390XMOVHZload { 19094 break 19095 } 19096 i0 := x0.AuxInt 19097 s := x0.Aux 19098 p := x0.Args[0] 19099 mem := x0.Args[1] 19100 x1 := v.Args[1] 19101 if x1.Op != OpS390XMOVHZload { 19102 break 19103 } 19104 i1 := x1.AuxInt 19105 if x1.Aux != s { 19106 break 19107 } 19108 if p != x1.Args[0] { 19109 break 19110 } 19111 if mem != x1.Args[1] { 19112 break 19113 } 19114 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19115 break 19116 } 19117 b = mergePoint(b, x0, x1) 19118 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19119 v.reset(OpCopy) 19120 v.AddArg(v0) 19121 v0.AuxInt = i0 19122 v0.Aux = s 19123 v0.AddArg(p) 19124 v0.AddArg(mem) 19125 return true 19126 } 19127 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 19128 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19129 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 19130 for { 19131 x1 := v.Args[0] 19132 if x1.Op != OpS390XMOVWZload { 19133 break 19134 } 19135 i1 := x1.AuxInt 19136 s := x1.Aux 19137 p := x1.Args[0] 19138 mem := x1.Args[1] 19139 sh := v.Args[1] 19140 if sh.Op != OpS390XSLDconst { 19141 break 19142 } 19143 if sh.AuxInt != 32 { 19144 break 19145 } 19146 x0 := sh.Args[0] 19147 if x0.Op != OpS390XMOVWZload { 19148 break 19149 } 19150 i0 := x0.AuxInt 19151 if x0.Aux != s { 19152 break 19153 } 19154 if p != x0.Args[0] { 19155 break 19156 } 19157 if mem != x0.Args[1] { 19158 break 19159 } 19160 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19161 break 19162 } 19163 b = mergePoint(b, x0, x1) 19164 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 19165 v.reset(OpCopy) 19166 v.AddArg(v0) 19167 v0.AuxInt = i0 19168 v0.Aux = s 19169 v0.AddArg(p) 19170 v0.AddArg(mem) 19171 return true 19172 } 19173 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 19174 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19175 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 19176 for { 19177 sh := v.Args[0] 19178 if sh.Op != OpS390XSLDconst { 19179 break 19180 } 19181 if sh.AuxInt != 32 { 19182 break 19183 } 19184 x0 := sh.Args[0] 19185 if x0.Op != OpS390XMOVWZload { 19186 break 19187 } 19188 i0 := x0.AuxInt 19189 s := x0.Aux 19190 p := x0.Args[0] 19191 mem := x0.Args[1] 19192 x1 := v.Args[1] 19193 if x1.Op != OpS390XMOVWZload { 19194 break 19195 } 19196 i1 := x1.AuxInt 19197 if x1.Aux != s { 19198 break 19199 } 19200 if p != x1.Args[0] { 19201 break 19202 } 19203 if mem != x1.Args[1] { 19204 break 19205 } 19206 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19207 break 19208 } 19209 b = mergePoint(b, x0, x1) 19210 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 19211 v.reset(OpCopy) 19212 v.AddArg(v0) 19213 v0.AuxInt = i0 19214 v0.Aux = s 19215 v0.AddArg(p) 19216 v0.AddArg(mem) 19217 return true 19218 } 19219 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 19220 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19221 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19222 for { 19223 s0 := v.Args[0] 19224 if s0.Op != OpS390XSLDconst { 19225 break 19226 } 19227 j0 := s0.AuxInt 19228 x0 := s0.Args[0] 19229 if x0.Op != OpS390XMOVBZload { 19230 break 19231 } 19232 i0 := x0.AuxInt 19233 s := x0.Aux 19234 p := x0.Args[0] 19235 mem := x0.Args[1] 19236 or := v.Args[1] 19237 if or.Op != OpS390XOR { 19238 break 19239 } 19240 s1 := or.Args[0] 19241 if s1.Op != OpS390XSLDconst { 19242 break 19243 } 19244 j1 := s1.AuxInt 19245 x1 := s1.Args[0] 19246 if x1.Op != OpS390XMOVBZload { 19247 break 19248 } 19249 i1 := x1.AuxInt 19250 if x1.Aux != s { 19251 break 19252 } 19253 if p != x1.Args[0] { 19254 break 19255 } 19256 if mem != x1.Args[1] { 19257 break 19258 } 19259 y := or.Args[1] 19260 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19261 break 19262 } 19263 b = mergePoint(b, x0, x1) 19264 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19265 v.reset(OpCopy) 19266 v.AddArg(v0) 19267 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19268 v1.AuxInt = j1 19269 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19270 v2.AuxInt = i0 19271 v2.Aux = s 19272 v2.AddArg(p) 19273 v2.AddArg(mem) 19274 v1.AddArg(v2) 19275 v0.AddArg(v1) 19276 v0.AddArg(y) 19277 return true 19278 } 19279 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 19280 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19281 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19282 for { 19283 s0 := v.Args[0] 19284 if s0.Op != OpS390XSLDconst { 19285 break 19286 } 19287 j0 := s0.AuxInt 19288 x0 := s0.Args[0] 19289 if x0.Op != OpS390XMOVBZload { 19290 break 19291 } 19292 i0 := x0.AuxInt 19293 s := x0.Aux 19294 p := x0.Args[0] 19295 mem := x0.Args[1] 19296 or := v.Args[1] 19297 if or.Op != OpS390XOR { 19298 break 19299 } 19300 y := or.Args[0] 19301 s1 := or.Args[1] 19302 if s1.Op != OpS390XSLDconst { 19303 break 19304 } 19305 j1 := s1.AuxInt 19306 x1 := s1.Args[0] 19307 if x1.Op != OpS390XMOVBZload { 19308 break 19309 } 19310 i1 := x1.AuxInt 19311 if x1.Aux != s { 19312 break 19313 } 19314 if p != x1.Args[0] { 19315 break 19316 } 19317 if mem != x1.Args[1] { 19318 break 19319 } 19320 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19321 break 19322 } 19323 b = mergePoint(b, x0, x1) 19324 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19325 v.reset(OpCopy) 19326 v.AddArg(v0) 19327 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19328 v1.AuxInt = j1 19329 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19330 v2.AuxInt = i0 19331 v2.Aux = s 19332 v2.AddArg(p) 19333 v2.AddArg(mem) 19334 v1.AddArg(v2) 19335 v0.AddArg(v1) 19336 v0.AddArg(y) 19337 return true 19338 } 19339 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 19340 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19341 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19342 for { 19343 or := v.Args[0] 19344 if or.Op != OpS390XOR { 19345 break 19346 } 19347 s1 := or.Args[0] 19348 if s1.Op != OpS390XSLDconst { 19349 break 19350 } 19351 j1 := s1.AuxInt 19352 x1 := s1.Args[0] 19353 if x1.Op != OpS390XMOVBZload { 19354 break 19355 } 19356 i1 := x1.AuxInt 19357 s := x1.Aux 19358 p := x1.Args[0] 19359 mem := x1.Args[1] 19360 y := or.Args[1] 19361 s0 := v.Args[1] 19362 if s0.Op != OpS390XSLDconst { 19363 break 19364 } 19365 j0 := s0.AuxInt 19366 x0 := s0.Args[0] 19367 if x0.Op != OpS390XMOVBZload { 19368 break 19369 } 19370 i0 := x0.AuxInt 19371 if x0.Aux != s { 19372 break 19373 } 19374 if p != x0.Args[0] { 19375 break 19376 } 19377 if mem != x0.Args[1] { 19378 break 19379 } 19380 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19381 break 19382 } 19383 b = mergePoint(b, x0, x1) 19384 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19385 v.reset(OpCopy) 19386 v.AddArg(v0) 19387 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19388 v1.AuxInt = j1 19389 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19390 v2.AuxInt = i0 19391 v2.Aux = s 19392 v2.AddArg(p) 19393 v2.AddArg(mem) 19394 v1.AddArg(v2) 19395 v0.AddArg(v1) 19396 v0.AddArg(y) 19397 return true 19398 } 19399 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 19400 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19401 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19402 for { 19403 or := v.Args[0] 19404 if or.Op != OpS390XOR { 19405 break 19406 } 19407 y := or.Args[0] 19408 s1 := or.Args[1] 19409 if s1.Op != OpS390XSLDconst { 19410 break 19411 } 19412 j1 := s1.AuxInt 19413 x1 := s1.Args[0] 19414 if x1.Op != OpS390XMOVBZload { 19415 break 19416 } 19417 i1 := x1.AuxInt 19418 s := x1.Aux 19419 p := x1.Args[0] 19420 mem := x1.Args[1] 19421 s0 := v.Args[1] 19422 if s0.Op != OpS390XSLDconst { 19423 break 19424 } 19425 j0 := s0.AuxInt 19426 x0 := s0.Args[0] 19427 if x0.Op != OpS390XMOVBZload { 19428 break 19429 } 19430 i0 := x0.AuxInt 19431 if x0.Aux != s { 19432 break 19433 } 19434 if p != x0.Args[0] { 19435 break 19436 } 19437 if mem != x0.Args[1] { 19438 break 19439 } 19440 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19441 break 19442 } 19443 b = mergePoint(b, x0, x1) 19444 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19445 v.reset(OpCopy) 19446 v.AddArg(v0) 19447 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19448 v1.AuxInt = j1 19449 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19450 v2.AuxInt = i0 19451 v2.Aux = s 19452 v2.AddArg(p) 19453 v2.AddArg(mem) 19454 v1.AddArg(v2) 19455 v0.AddArg(v1) 19456 v0.AddArg(y) 19457 return true 19458 } 19459 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 19460 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19461 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19462 for { 19463 s0 := v.Args[0] 19464 if s0.Op != OpS390XSLDconst { 19465 break 19466 } 19467 j0 := s0.AuxInt 19468 x0 := s0.Args[0] 19469 if x0.Op != OpS390XMOVHZload { 19470 break 19471 } 19472 i0 := x0.AuxInt 19473 s := x0.Aux 19474 p := x0.Args[0] 19475 mem := x0.Args[1] 19476 or := v.Args[1] 19477 if or.Op != OpS390XOR { 19478 break 19479 } 19480 s1 := or.Args[0] 19481 if s1.Op != OpS390XSLDconst { 19482 break 19483 } 19484 j1 := s1.AuxInt 19485 x1 := s1.Args[0] 19486 if x1.Op != OpS390XMOVHZload { 19487 break 19488 } 19489 i1 := x1.AuxInt 19490 if x1.Aux != s { 19491 break 19492 } 19493 if p != x1.Args[0] { 19494 break 19495 } 19496 if mem != x1.Args[1] { 19497 break 19498 } 19499 y := or.Args[1] 19500 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19501 break 19502 } 19503 b = mergePoint(b, x0, x1) 19504 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19505 v.reset(OpCopy) 19506 v.AddArg(v0) 19507 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19508 v1.AuxInt = j1 19509 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19510 v2.AuxInt = i0 19511 v2.Aux = s 19512 v2.AddArg(p) 19513 v2.AddArg(mem) 19514 v1.AddArg(v2) 19515 v0.AddArg(v1) 19516 v0.AddArg(y) 19517 return true 19518 } 19519 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 19520 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19521 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19522 for { 19523 s0 := v.Args[0] 19524 if s0.Op != OpS390XSLDconst { 19525 break 19526 } 19527 j0 := s0.AuxInt 19528 x0 := s0.Args[0] 19529 if x0.Op != OpS390XMOVHZload { 19530 break 19531 } 19532 i0 := x0.AuxInt 19533 s := x0.Aux 19534 p := x0.Args[0] 19535 mem := x0.Args[1] 19536 or := v.Args[1] 19537 if or.Op != OpS390XOR { 19538 break 19539 } 19540 y := or.Args[0] 19541 s1 := or.Args[1] 19542 if s1.Op != OpS390XSLDconst { 19543 break 19544 } 19545 j1 := s1.AuxInt 19546 x1 := s1.Args[0] 19547 if x1.Op != OpS390XMOVHZload { 19548 break 19549 } 19550 i1 := x1.AuxInt 19551 if x1.Aux != s { 19552 break 19553 } 19554 if p != x1.Args[0] { 19555 break 19556 } 19557 if mem != x1.Args[1] { 19558 break 19559 } 19560 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19561 break 19562 } 19563 b = mergePoint(b, x0, x1) 19564 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19565 v.reset(OpCopy) 19566 v.AddArg(v0) 19567 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19568 v1.AuxInt = j1 19569 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19570 v2.AuxInt = i0 19571 v2.Aux = s 19572 v2.AddArg(p) 19573 v2.AddArg(mem) 19574 v1.AddArg(v2) 19575 v0.AddArg(v1) 19576 v0.AddArg(y) 19577 return true 19578 } 19579 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 19580 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19581 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19582 for { 19583 or := v.Args[0] 19584 if or.Op != OpS390XOR { 19585 break 19586 } 19587 s1 := or.Args[0] 19588 if s1.Op != OpS390XSLDconst { 19589 break 19590 } 19591 j1 := s1.AuxInt 19592 x1 := s1.Args[0] 19593 if x1.Op != OpS390XMOVHZload { 19594 break 19595 } 19596 i1 := x1.AuxInt 19597 s := x1.Aux 19598 p := x1.Args[0] 19599 mem := x1.Args[1] 19600 y := or.Args[1] 19601 s0 := v.Args[1] 19602 if s0.Op != OpS390XSLDconst { 19603 break 19604 } 19605 j0 := s0.AuxInt 19606 x0 := s0.Args[0] 19607 if x0.Op != OpS390XMOVHZload { 19608 break 19609 } 19610 i0 := x0.AuxInt 19611 if x0.Aux != s { 19612 break 19613 } 19614 if p != x0.Args[0] { 19615 break 19616 } 19617 if mem != x0.Args[1] { 19618 break 19619 } 19620 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19621 break 19622 } 19623 b = mergePoint(b, x0, x1) 19624 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19625 v.reset(OpCopy) 19626 v.AddArg(v0) 19627 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19628 v1.AuxInt = j1 19629 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19630 v2.AuxInt = i0 19631 v2.Aux = s 19632 v2.AddArg(p) 19633 v2.AddArg(mem) 19634 v1.AddArg(v2) 19635 v0.AddArg(v1) 19636 v0.AddArg(y) 19637 return true 19638 } 19639 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 19640 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19641 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19642 for { 19643 or := v.Args[0] 19644 if or.Op != OpS390XOR { 19645 break 19646 } 19647 y := or.Args[0] 19648 s1 := or.Args[1] 19649 if s1.Op != OpS390XSLDconst { 19650 break 19651 } 19652 j1 := s1.AuxInt 19653 x1 := s1.Args[0] 19654 if x1.Op != OpS390XMOVHZload { 19655 break 19656 } 19657 i1 := x1.AuxInt 19658 s := x1.Aux 19659 p := x1.Args[0] 19660 mem := x1.Args[1] 19661 s0 := v.Args[1] 19662 if s0.Op != OpS390XSLDconst { 19663 break 19664 } 19665 j0 := s0.AuxInt 19666 x0 := s0.Args[0] 19667 if x0.Op != OpS390XMOVHZload { 19668 break 19669 } 19670 i0 := x0.AuxInt 19671 if x0.Aux != s { 19672 break 19673 } 19674 if p != x0.Args[0] { 19675 break 19676 } 19677 if mem != x0.Args[1] { 19678 break 19679 } 19680 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19681 break 19682 } 19683 b = mergePoint(b, x0, x1) 19684 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19685 v.reset(OpCopy) 19686 v.AddArg(v0) 19687 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19688 v1.AuxInt = j1 19689 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19690 v2.AuxInt = i0 19691 v2.Aux = s 19692 v2.AddArg(p) 19693 v2.AddArg(mem) 19694 v1.AddArg(v2) 19695 v0.AddArg(v1) 19696 v0.AddArg(y) 19697 return true 19698 } 19699 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 19700 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19701 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19702 for { 19703 x1 := v.Args[0] 19704 if x1.Op != OpS390XMOVBZloadidx { 19705 break 19706 } 19707 i1 := x1.AuxInt 19708 s := x1.Aux 19709 p := x1.Args[0] 19710 idx := x1.Args[1] 19711 mem := x1.Args[2] 19712 sh := v.Args[1] 19713 if sh.Op != OpS390XSLDconst { 19714 break 19715 } 19716 if sh.AuxInt != 8 { 19717 break 19718 } 19719 x0 := sh.Args[0] 19720 if x0.Op != OpS390XMOVBZloadidx { 19721 break 19722 } 19723 i0 := x0.AuxInt 19724 if x0.Aux != s { 19725 break 19726 } 19727 if p != x0.Args[0] { 19728 break 19729 } 19730 if idx != x0.Args[1] { 19731 break 19732 } 19733 if mem != x0.Args[2] { 19734 break 19735 } 19736 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19737 break 19738 } 19739 b = mergePoint(b, x0, x1) 19740 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19741 v.reset(OpCopy) 19742 v.AddArg(v0) 19743 v0.AuxInt = i0 19744 v0.Aux = s 19745 v0.AddArg(p) 19746 v0.AddArg(idx) 19747 v0.AddArg(mem) 19748 return true 19749 } 19750 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 19751 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19752 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19753 for { 19754 x1 := v.Args[0] 19755 if x1.Op != OpS390XMOVBZloadidx { 19756 break 19757 } 19758 i1 := x1.AuxInt 19759 s := x1.Aux 19760 idx := x1.Args[0] 19761 p := x1.Args[1] 19762 mem := x1.Args[2] 19763 sh := v.Args[1] 19764 if sh.Op != OpS390XSLDconst { 19765 break 19766 } 19767 if sh.AuxInt != 8 { 19768 break 19769 } 19770 x0 := sh.Args[0] 19771 if x0.Op != OpS390XMOVBZloadidx { 19772 break 19773 } 19774 i0 := x0.AuxInt 19775 if x0.Aux != s { 19776 break 19777 } 19778 if p != x0.Args[0] { 19779 break 19780 } 19781 if idx != x0.Args[1] { 19782 break 19783 } 19784 if mem != x0.Args[2] { 19785 break 19786 } 19787 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19788 break 19789 } 19790 b = mergePoint(b, x0, x1) 19791 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19792 v.reset(OpCopy) 19793 v.AddArg(v0) 19794 v0.AuxInt = i0 19795 v0.Aux = s 19796 v0.AddArg(p) 19797 v0.AddArg(idx) 19798 v0.AddArg(mem) 19799 return true 19800 } 19801 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 19802 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19803 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19804 for { 19805 x1 := v.Args[0] 19806 if x1.Op != OpS390XMOVBZloadidx { 19807 break 19808 } 19809 i1 := x1.AuxInt 19810 s := x1.Aux 19811 p := x1.Args[0] 19812 idx := x1.Args[1] 19813 mem := x1.Args[2] 19814 sh := v.Args[1] 19815 if sh.Op != OpS390XSLDconst { 19816 break 19817 } 19818 if sh.AuxInt != 8 { 19819 break 19820 } 19821 x0 := sh.Args[0] 19822 if x0.Op != OpS390XMOVBZloadidx { 19823 break 19824 } 19825 i0 := x0.AuxInt 19826 if x0.Aux != s { 19827 break 19828 } 19829 if idx != x0.Args[0] { 19830 break 19831 } 19832 if p != x0.Args[1] { 19833 break 19834 } 19835 if mem != x0.Args[2] { 19836 break 19837 } 19838 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19839 break 19840 } 19841 b = mergePoint(b, x0, x1) 19842 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19843 v.reset(OpCopy) 19844 v.AddArg(v0) 19845 v0.AuxInt = i0 19846 v0.Aux = s 19847 v0.AddArg(p) 19848 v0.AddArg(idx) 19849 v0.AddArg(mem) 19850 return true 19851 } 19852 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 19853 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19854 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19855 for { 19856 x1 := v.Args[0] 19857 if x1.Op != OpS390XMOVBZloadidx { 19858 break 19859 } 19860 i1 := x1.AuxInt 19861 s := x1.Aux 19862 idx := x1.Args[0] 19863 p := x1.Args[1] 19864 mem := x1.Args[2] 19865 sh := v.Args[1] 19866 if sh.Op != OpS390XSLDconst { 19867 break 19868 } 19869 if sh.AuxInt != 8 { 19870 break 19871 } 19872 x0 := sh.Args[0] 19873 if x0.Op != OpS390XMOVBZloadidx { 19874 break 19875 } 19876 i0 := x0.AuxInt 19877 if x0.Aux != s { 19878 break 19879 } 19880 if idx != x0.Args[0] { 19881 break 19882 } 19883 if p != x0.Args[1] { 19884 break 19885 } 19886 if mem != x0.Args[2] { 19887 break 19888 } 19889 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19890 break 19891 } 19892 b = mergePoint(b, x0, x1) 19893 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19894 v.reset(OpCopy) 19895 v.AddArg(v0) 19896 v0.AuxInt = i0 19897 v0.Aux = s 19898 v0.AddArg(p) 19899 v0.AddArg(idx) 19900 v0.AddArg(mem) 19901 return true 19902 } 19903 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 19904 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19905 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19906 for { 19907 sh := v.Args[0] 19908 if sh.Op != OpS390XSLDconst { 19909 break 19910 } 19911 if sh.AuxInt != 8 { 19912 break 19913 } 19914 x0 := sh.Args[0] 19915 if x0.Op != OpS390XMOVBZloadidx { 19916 break 19917 } 19918 i0 := x0.AuxInt 19919 s := x0.Aux 19920 p := x0.Args[0] 19921 idx := x0.Args[1] 19922 mem := x0.Args[2] 19923 x1 := v.Args[1] 19924 if x1.Op != OpS390XMOVBZloadidx { 19925 break 19926 } 19927 i1 := x1.AuxInt 19928 if x1.Aux != s { 19929 break 19930 } 19931 if p != x1.Args[0] { 19932 break 19933 } 19934 if idx != x1.Args[1] { 19935 break 19936 } 19937 if mem != x1.Args[2] { 19938 break 19939 } 19940 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19941 break 19942 } 19943 b = mergePoint(b, x0, x1) 19944 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19945 v.reset(OpCopy) 19946 v.AddArg(v0) 19947 v0.AuxInt = i0 19948 v0.Aux = s 19949 v0.AddArg(p) 19950 v0.AddArg(idx) 19951 v0.AddArg(mem) 19952 return true 19953 } 19954 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 19955 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19956 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19957 for { 19958 sh := v.Args[0] 19959 if sh.Op != OpS390XSLDconst { 19960 break 19961 } 19962 if sh.AuxInt != 8 { 19963 break 19964 } 19965 x0 := sh.Args[0] 19966 if x0.Op != OpS390XMOVBZloadidx { 19967 break 19968 } 19969 i0 := x0.AuxInt 19970 s := x0.Aux 19971 idx := x0.Args[0] 19972 p := x0.Args[1] 19973 mem := x0.Args[2] 19974 x1 := v.Args[1] 19975 if x1.Op != OpS390XMOVBZloadidx { 19976 break 19977 } 19978 i1 := x1.AuxInt 19979 if x1.Aux != s { 19980 break 19981 } 19982 if p != x1.Args[0] { 19983 break 19984 } 19985 if idx != x1.Args[1] { 19986 break 19987 } 19988 if mem != x1.Args[2] { 19989 break 19990 } 19991 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19992 break 19993 } 19994 b = mergePoint(b, x0, x1) 19995 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19996 v.reset(OpCopy) 19997 v.AddArg(v0) 19998 v0.AuxInt = i0 19999 v0.Aux = s 20000 v0.AddArg(p) 20001 v0.AddArg(idx) 20002 v0.AddArg(mem) 20003 return true 20004 } 20005 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20006 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20007 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20008 for { 20009 sh := v.Args[0] 20010 if sh.Op != OpS390XSLDconst { 20011 break 20012 } 20013 if sh.AuxInt != 8 { 20014 break 20015 } 20016 x0 := sh.Args[0] 20017 if x0.Op != OpS390XMOVBZloadidx { 20018 break 20019 } 20020 i0 := x0.AuxInt 20021 s := x0.Aux 20022 p := x0.Args[0] 20023 idx := x0.Args[1] 20024 mem := x0.Args[2] 20025 x1 := v.Args[1] 20026 if x1.Op != OpS390XMOVBZloadidx { 20027 break 20028 } 20029 i1 := x1.AuxInt 20030 if x1.Aux != s { 20031 break 20032 } 20033 if idx != x1.Args[0] { 20034 break 20035 } 20036 if p != x1.Args[1] { 20037 break 20038 } 20039 if mem != x1.Args[2] { 20040 break 20041 } 20042 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20043 break 20044 } 20045 b = mergePoint(b, x0, x1) 20046 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20047 v.reset(OpCopy) 20048 v.AddArg(v0) 20049 v0.AuxInt = i0 20050 v0.Aux = s 20051 v0.AddArg(p) 20052 v0.AddArg(idx) 20053 v0.AddArg(mem) 20054 return true 20055 } 20056 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20057 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20058 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20059 for { 20060 sh := v.Args[0] 20061 if sh.Op != OpS390XSLDconst { 20062 break 20063 } 20064 if sh.AuxInt != 8 { 20065 break 20066 } 20067 x0 := sh.Args[0] 20068 if x0.Op != OpS390XMOVBZloadidx { 20069 break 20070 } 20071 i0 := x0.AuxInt 20072 s := x0.Aux 20073 idx := x0.Args[0] 20074 p := x0.Args[1] 20075 mem := x0.Args[2] 20076 x1 := v.Args[1] 20077 if x1.Op != OpS390XMOVBZloadidx { 20078 break 20079 } 20080 i1 := x1.AuxInt 20081 if x1.Aux != s { 20082 break 20083 } 20084 if idx != x1.Args[0] { 20085 break 20086 } 20087 if p != x1.Args[1] { 20088 break 20089 } 20090 if mem != x1.Args[2] { 20091 break 20092 } 20093 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20094 break 20095 } 20096 b = mergePoint(b, x0, x1) 20097 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20098 v.reset(OpCopy) 20099 v.AddArg(v0) 20100 v0.AuxInt = i0 20101 v0.Aux = s 20102 v0.AddArg(p) 20103 v0.AddArg(idx) 20104 v0.AddArg(mem) 20105 return true 20106 } 20107 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 20108 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20109 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20110 for { 20111 x1 := v.Args[0] 20112 if x1.Op != OpS390XMOVHZloadidx { 20113 break 20114 } 20115 i1 := x1.AuxInt 20116 s := x1.Aux 20117 p := x1.Args[0] 20118 idx := x1.Args[1] 20119 mem := x1.Args[2] 20120 sh := v.Args[1] 20121 if sh.Op != OpS390XSLDconst { 20122 break 20123 } 20124 if sh.AuxInt != 16 { 20125 break 20126 } 20127 x0 := sh.Args[0] 20128 if x0.Op != OpS390XMOVHZloadidx { 20129 break 20130 } 20131 i0 := x0.AuxInt 20132 if x0.Aux != s { 20133 break 20134 } 20135 if p != x0.Args[0] { 20136 break 20137 } 20138 if idx != x0.Args[1] { 20139 break 20140 } 20141 if mem != x0.Args[2] { 20142 break 20143 } 20144 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20145 break 20146 } 20147 b = mergePoint(b, x0, x1) 20148 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20149 v.reset(OpCopy) 20150 v.AddArg(v0) 20151 v0.AuxInt = i0 20152 v0.Aux = s 20153 v0.AddArg(p) 20154 v0.AddArg(idx) 20155 v0.AddArg(mem) 20156 return true 20157 } 20158 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 20159 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20160 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20161 for { 20162 x1 := v.Args[0] 20163 if x1.Op != OpS390XMOVHZloadidx { 20164 break 20165 } 20166 i1 := x1.AuxInt 20167 s := x1.Aux 20168 idx := x1.Args[0] 20169 p := x1.Args[1] 20170 mem := x1.Args[2] 20171 sh := v.Args[1] 20172 if sh.Op != OpS390XSLDconst { 20173 break 20174 } 20175 if sh.AuxInt != 16 { 20176 break 20177 } 20178 x0 := sh.Args[0] 20179 if x0.Op != OpS390XMOVHZloadidx { 20180 break 20181 } 20182 i0 := x0.AuxInt 20183 if x0.Aux != s { 20184 break 20185 } 20186 if p != x0.Args[0] { 20187 break 20188 } 20189 if idx != x0.Args[1] { 20190 break 20191 } 20192 if mem != x0.Args[2] { 20193 break 20194 } 20195 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20196 break 20197 } 20198 b = mergePoint(b, x0, x1) 20199 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20200 v.reset(OpCopy) 20201 v.AddArg(v0) 20202 v0.AuxInt = i0 20203 v0.Aux = s 20204 v0.AddArg(p) 20205 v0.AddArg(idx) 20206 v0.AddArg(mem) 20207 return true 20208 } 20209 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 20210 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20211 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20212 for { 20213 x1 := v.Args[0] 20214 if x1.Op != OpS390XMOVHZloadidx { 20215 break 20216 } 20217 i1 := x1.AuxInt 20218 s := x1.Aux 20219 p := x1.Args[0] 20220 idx := x1.Args[1] 20221 mem := x1.Args[2] 20222 sh := v.Args[1] 20223 if sh.Op != OpS390XSLDconst { 20224 break 20225 } 20226 if sh.AuxInt != 16 { 20227 break 20228 } 20229 x0 := sh.Args[0] 20230 if x0.Op != OpS390XMOVHZloadidx { 20231 break 20232 } 20233 i0 := x0.AuxInt 20234 if x0.Aux != s { 20235 break 20236 } 20237 if idx != x0.Args[0] { 20238 break 20239 } 20240 if p != x0.Args[1] { 20241 break 20242 } 20243 if mem != x0.Args[2] { 20244 break 20245 } 20246 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20247 break 20248 } 20249 b = mergePoint(b, x0, x1) 20250 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20251 v.reset(OpCopy) 20252 v.AddArg(v0) 20253 v0.AuxInt = i0 20254 v0.Aux = s 20255 v0.AddArg(p) 20256 v0.AddArg(idx) 20257 v0.AddArg(mem) 20258 return true 20259 } 20260 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 20261 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20262 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20263 for { 20264 x1 := v.Args[0] 20265 if x1.Op != OpS390XMOVHZloadidx { 20266 break 20267 } 20268 i1 := x1.AuxInt 20269 s := x1.Aux 20270 idx := x1.Args[0] 20271 p := x1.Args[1] 20272 mem := x1.Args[2] 20273 sh := v.Args[1] 20274 if sh.Op != OpS390XSLDconst { 20275 break 20276 } 20277 if sh.AuxInt != 16 { 20278 break 20279 } 20280 x0 := sh.Args[0] 20281 if x0.Op != OpS390XMOVHZloadidx { 20282 break 20283 } 20284 i0 := x0.AuxInt 20285 if x0.Aux != s { 20286 break 20287 } 20288 if idx != x0.Args[0] { 20289 break 20290 } 20291 if p != x0.Args[1] { 20292 break 20293 } 20294 if mem != x0.Args[2] { 20295 break 20296 } 20297 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20298 break 20299 } 20300 b = mergePoint(b, x0, x1) 20301 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20302 v.reset(OpCopy) 20303 v.AddArg(v0) 20304 v0.AuxInt = i0 20305 v0.Aux = s 20306 v0.AddArg(p) 20307 v0.AddArg(idx) 20308 v0.AddArg(mem) 20309 return true 20310 } 20311 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 20312 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20313 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20314 for { 20315 sh := v.Args[0] 20316 if sh.Op != OpS390XSLDconst { 20317 break 20318 } 20319 if sh.AuxInt != 16 { 20320 break 20321 } 20322 x0 := sh.Args[0] 20323 if x0.Op != OpS390XMOVHZloadidx { 20324 break 20325 } 20326 i0 := x0.AuxInt 20327 s := x0.Aux 20328 p := x0.Args[0] 20329 idx := x0.Args[1] 20330 mem := x0.Args[2] 20331 x1 := v.Args[1] 20332 if x1.Op != OpS390XMOVHZloadidx { 20333 break 20334 } 20335 i1 := x1.AuxInt 20336 if x1.Aux != s { 20337 break 20338 } 20339 if p != x1.Args[0] { 20340 break 20341 } 20342 if idx != x1.Args[1] { 20343 break 20344 } 20345 if mem != x1.Args[2] { 20346 break 20347 } 20348 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20349 break 20350 } 20351 b = mergePoint(b, x0, x1) 20352 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20353 v.reset(OpCopy) 20354 v.AddArg(v0) 20355 v0.AuxInt = i0 20356 v0.Aux = s 20357 v0.AddArg(p) 20358 v0.AddArg(idx) 20359 v0.AddArg(mem) 20360 return true 20361 } 20362 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 20363 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20364 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20365 for { 20366 sh := v.Args[0] 20367 if sh.Op != OpS390XSLDconst { 20368 break 20369 } 20370 if sh.AuxInt != 16 { 20371 break 20372 } 20373 x0 := sh.Args[0] 20374 if x0.Op != OpS390XMOVHZloadidx { 20375 break 20376 } 20377 i0 := x0.AuxInt 20378 s := x0.Aux 20379 idx := x0.Args[0] 20380 p := x0.Args[1] 20381 mem := x0.Args[2] 20382 x1 := v.Args[1] 20383 if x1.Op != OpS390XMOVHZloadidx { 20384 break 20385 } 20386 i1 := x1.AuxInt 20387 if x1.Aux != s { 20388 break 20389 } 20390 if p != x1.Args[0] { 20391 break 20392 } 20393 if idx != x1.Args[1] { 20394 break 20395 } 20396 if mem != x1.Args[2] { 20397 break 20398 } 20399 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20400 break 20401 } 20402 b = mergePoint(b, x0, x1) 20403 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20404 v.reset(OpCopy) 20405 v.AddArg(v0) 20406 v0.AuxInt = i0 20407 v0.Aux = s 20408 v0.AddArg(p) 20409 v0.AddArg(idx) 20410 v0.AddArg(mem) 20411 return true 20412 } 20413 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 20414 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20415 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20416 for { 20417 sh := v.Args[0] 20418 if sh.Op != OpS390XSLDconst { 20419 break 20420 } 20421 if sh.AuxInt != 16 { 20422 break 20423 } 20424 x0 := sh.Args[0] 20425 if x0.Op != OpS390XMOVHZloadidx { 20426 break 20427 } 20428 i0 := x0.AuxInt 20429 s := x0.Aux 20430 p := x0.Args[0] 20431 idx := x0.Args[1] 20432 mem := x0.Args[2] 20433 x1 := v.Args[1] 20434 if x1.Op != OpS390XMOVHZloadidx { 20435 break 20436 } 20437 i1 := x1.AuxInt 20438 if x1.Aux != s { 20439 break 20440 } 20441 if idx != x1.Args[0] { 20442 break 20443 } 20444 if p != x1.Args[1] { 20445 break 20446 } 20447 if mem != x1.Args[2] { 20448 break 20449 } 20450 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20451 break 20452 } 20453 b = mergePoint(b, x0, x1) 20454 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20455 v.reset(OpCopy) 20456 v.AddArg(v0) 20457 v0.AuxInt = i0 20458 v0.Aux = s 20459 v0.AddArg(p) 20460 v0.AddArg(idx) 20461 v0.AddArg(mem) 20462 return true 20463 } 20464 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 20465 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20466 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20467 for { 20468 sh := v.Args[0] 20469 if sh.Op != OpS390XSLDconst { 20470 break 20471 } 20472 if sh.AuxInt != 16 { 20473 break 20474 } 20475 x0 := sh.Args[0] 20476 if x0.Op != OpS390XMOVHZloadidx { 20477 break 20478 } 20479 i0 := x0.AuxInt 20480 s := x0.Aux 20481 idx := x0.Args[0] 20482 p := x0.Args[1] 20483 mem := x0.Args[2] 20484 x1 := v.Args[1] 20485 if x1.Op != OpS390XMOVHZloadidx { 20486 break 20487 } 20488 i1 := x1.AuxInt 20489 if x1.Aux != s { 20490 break 20491 } 20492 if idx != x1.Args[0] { 20493 break 20494 } 20495 if p != x1.Args[1] { 20496 break 20497 } 20498 if mem != x1.Args[2] { 20499 break 20500 } 20501 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20502 break 20503 } 20504 b = mergePoint(b, x0, x1) 20505 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20506 v.reset(OpCopy) 20507 v.AddArg(v0) 20508 v0.AuxInt = i0 20509 v0.Aux = s 20510 v0.AddArg(p) 20511 v0.AddArg(idx) 20512 v0.AddArg(mem) 20513 return true 20514 } 20515 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 20516 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20517 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20518 for { 20519 x1 := v.Args[0] 20520 if x1.Op != OpS390XMOVWZloadidx { 20521 break 20522 } 20523 i1 := x1.AuxInt 20524 s := x1.Aux 20525 p := x1.Args[0] 20526 idx := x1.Args[1] 20527 mem := x1.Args[2] 20528 sh := v.Args[1] 20529 if sh.Op != OpS390XSLDconst { 20530 break 20531 } 20532 if sh.AuxInt != 32 { 20533 break 20534 } 20535 x0 := sh.Args[0] 20536 if x0.Op != OpS390XMOVWZloadidx { 20537 break 20538 } 20539 i0 := x0.AuxInt 20540 if x0.Aux != s { 20541 break 20542 } 20543 if p != x0.Args[0] { 20544 break 20545 } 20546 if idx != x0.Args[1] { 20547 break 20548 } 20549 if mem != x0.Args[2] { 20550 break 20551 } 20552 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20553 break 20554 } 20555 b = mergePoint(b, x0, x1) 20556 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20557 v.reset(OpCopy) 20558 v.AddArg(v0) 20559 v0.AuxInt = i0 20560 v0.Aux = s 20561 v0.AddArg(p) 20562 v0.AddArg(idx) 20563 v0.AddArg(mem) 20564 return true 20565 } 20566 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 20567 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20568 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20569 for { 20570 x1 := v.Args[0] 20571 if x1.Op != OpS390XMOVWZloadidx { 20572 break 20573 } 20574 i1 := x1.AuxInt 20575 s := x1.Aux 20576 idx := x1.Args[0] 20577 p := x1.Args[1] 20578 mem := x1.Args[2] 20579 sh := v.Args[1] 20580 if sh.Op != OpS390XSLDconst { 20581 break 20582 } 20583 if sh.AuxInt != 32 { 20584 break 20585 } 20586 x0 := sh.Args[0] 20587 if x0.Op != OpS390XMOVWZloadidx { 20588 break 20589 } 20590 i0 := x0.AuxInt 20591 if x0.Aux != s { 20592 break 20593 } 20594 if p != x0.Args[0] { 20595 break 20596 } 20597 if idx != x0.Args[1] { 20598 break 20599 } 20600 if mem != x0.Args[2] { 20601 break 20602 } 20603 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20604 break 20605 } 20606 b = mergePoint(b, x0, x1) 20607 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20608 v.reset(OpCopy) 20609 v.AddArg(v0) 20610 v0.AuxInt = i0 20611 v0.Aux = s 20612 v0.AddArg(p) 20613 v0.AddArg(idx) 20614 v0.AddArg(mem) 20615 return true 20616 } 20617 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 20618 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20619 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20620 for { 20621 x1 := v.Args[0] 20622 if x1.Op != OpS390XMOVWZloadidx { 20623 break 20624 } 20625 i1 := x1.AuxInt 20626 s := x1.Aux 20627 p := x1.Args[0] 20628 idx := x1.Args[1] 20629 mem := x1.Args[2] 20630 sh := v.Args[1] 20631 if sh.Op != OpS390XSLDconst { 20632 break 20633 } 20634 if sh.AuxInt != 32 { 20635 break 20636 } 20637 x0 := sh.Args[0] 20638 if x0.Op != OpS390XMOVWZloadidx { 20639 break 20640 } 20641 i0 := x0.AuxInt 20642 if x0.Aux != s { 20643 break 20644 } 20645 if idx != x0.Args[0] { 20646 break 20647 } 20648 if p != x0.Args[1] { 20649 break 20650 } 20651 if mem != x0.Args[2] { 20652 break 20653 } 20654 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20655 break 20656 } 20657 b = mergePoint(b, x0, x1) 20658 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20659 v.reset(OpCopy) 20660 v.AddArg(v0) 20661 v0.AuxInt = i0 20662 v0.Aux = s 20663 v0.AddArg(p) 20664 v0.AddArg(idx) 20665 v0.AddArg(mem) 20666 return true 20667 } 20668 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 20669 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20670 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20671 for { 20672 x1 := v.Args[0] 20673 if x1.Op != OpS390XMOVWZloadidx { 20674 break 20675 } 20676 i1 := x1.AuxInt 20677 s := x1.Aux 20678 idx := x1.Args[0] 20679 p := x1.Args[1] 20680 mem := x1.Args[2] 20681 sh := v.Args[1] 20682 if sh.Op != OpS390XSLDconst { 20683 break 20684 } 20685 if sh.AuxInt != 32 { 20686 break 20687 } 20688 x0 := sh.Args[0] 20689 if x0.Op != OpS390XMOVWZloadidx { 20690 break 20691 } 20692 i0 := x0.AuxInt 20693 if x0.Aux != s { 20694 break 20695 } 20696 if idx != x0.Args[0] { 20697 break 20698 } 20699 if p != x0.Args[1] { 20700 break 20701 } 20702 if mem != x0.Args[2] { 20703 break 20704 } 20705 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20706 break 20707 } 20708 b = mergePoint(b, x0, x1) 20709 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20710 v.reset(OpCopy) 20711 v.AddArg(v0) 20712 v0.AuxInt = i0 20713 v0.Aux = s 20714 v0.AddArg(p) 20715 v0.AddArg(idx) 20716 v0.AddArg(mem) 20717 return true 20718 } 20719 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 20720 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20721 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20722 for { 20723 sh := v.Args[0] 20724 if sh.Op != OpS390XSLDconst { 20725 break 20726 } 20727 if sh.AuxInt != 32 { 20728 break 20729 } 20730 x0 := sh.Args[0] 20731 if x0.Op != OpS390XMOVWZloadidx { 20732 break 20733 } 20734 i0 := x0.AuxInt 20735 s := x0.Aux 20736 p := x0.Args[0] 20737 idx := x0.Args[1] 20738 mem := x0.Args[2] 20739 x1 := v.Args[1] 20740 if x1.Op != OpS390XMOVWZloadidx { 20741 break 20742 } 20743 i1 := x1.AuxInt 20744 if x1.Aux != s { 20745 break 20746 } 20747 if p != x1.Args[0] { 20748 break 20749 } 20750 if idx != x1.Args[1] { 20751 break 20752 } 20753 if mem != x1.Args[2] { 20754 break 20755 } 20756 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20757 break 20758 } 20759 b = mergePoint(b, x0, x1) 20760 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20761 v.reset(OpCopy) 20762 v.AddArg(v0) 20763 v0.AuxInt = i0 20764 v0.Aux = s 20765 v0.AddArg(p) 20766 v0.AddArg(idx) 20767 v0.AddArg(mem) 20768 return true 20769 } 20770 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 20771 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20772 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20773 for { 20774 sh := v.Args[0] 20775 if sh.Op != OpS390XSLDconst { 20776 break 20777 } 20778 if sh.AuxInt != 32 { 20779 break 20780 } 20781 x0 := sh.Args[0] 20782 if x0.Op != OpS390XMOVWZloadidx { 20783 break 20784 } 20785 i0 := x0.AuxInt 20786 s := x0.Aux 20787 idx := x0.Args[0] 20788 p := x0.Args[1] 20789 mem := x0.Args[2] 20790 x1 := v.Args[1] 20791 if x1.Op != OpS390XMOVWZloadidx { 20792 break 20793 } 20794 i1 := x1.AuxInt 20795 if x1.Aux != s { 20796 break 20797 } 20798 if p != x1.Args[0] { 20799 break 20800 } 20801 if idx != x1.Args[1] { 20802 break 20803 } 20804 if mem != x1.Args[2] { 20805 break 20806 } 20807 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20808 break 20809 } 20810 b = mergePoint(b, x0, x1) 20811 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20812 v.reset(OpCopy) 20813 v.AddArg(v0) 20814 v0.AuxInt = i0 20815 v0.Aux = s 20816 v0.AddArg(p) 20817 v0.AddArg(idx) 20818 v0.AddArg(mem) 20819 return true 20820 } 20821 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 20822 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20823 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20824 for { 20825 sh := v.Args[0] 20826 if sh.Op != OpS390XSLDconst { 20827 break 20828 } 20829 if sh.AuxInt != 32 { 20830 break 20831 } 20832 x0 := sh.Args[0] 20833 if x0.Op != OpS390XMOVWZloadidx { 20834 break 20835 } 20836 i0 := x0.AuxInt 20837 s := x0.Aux 20838 p := x0.Args[0] 20839 idx := x0.Args[1] 20840 mem := x0.Args[2] 20841 x1 := v.Args[1] 20842 if x1.Op != OpS390XMOVWZloadidx { 20843 break 20844 } 20845 i1 := x1.AuxInt 20846 if x1.Aux != s { 20847 break 20848 } 20849 if idx != x1.Args[0] { 20850 break 20851 } 20852 if p != x1.Args[1] { 20853 break 20854 } 20855 if mem != x1.Args[2] { 20856 break 20857 } 20858 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20859 break 20860 } 20861 b = mergePoint(b, x0, x1) 20862 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20863 v.reset(OpCopy) 20864 v.AddArg(v0) 20865 v0.AuxInt = i0 20866 v0.Aux = s 20867 v0.AddArg(p) 20868 v0.AddArg(idx) 20869 v0.AddArg(mem) 20870 return true 20871 } 20872 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 20873 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20874 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20875 for { 20876 sh := v.Args[0] 20877 if sh.Op != OpS390XSLDconst { 20878 break 20879 } 20880 if sh.AuxInt != 32 { 20881 break 20882 } 20883 x0 := sh.Args[0] 20884 if x0.Op != OpS390XMOVWZloadidx { 20885 break 20886 } 20887 i0 := x0.AuxInt 20888 s := x0.Aux 20889 idx := x0.Args[0] 20890 p := x0.Args[1] 20891 mem := x0.Args[2] 20892 x1 := v.Args[1] 20893 if x1.Op != OpS390XMOVWZloadidx { 20894 break 20895 } 20896 i1 := x1.AuxInt 20897 if x1.Aux != s { 20898 break 20899 } 20900 if idx != x1.Args[0] { 20901 break 20902 } 20903 if p != x1.Args[1] { 20904 break 20905 } 20906 if mem != x1.Args[2] { 20907 break 20908 } 20909 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20910 break 20911 } 20912 b = mergePoint(b, x0, x1) 20913 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20914 v.reset(OpCopy) 20915 v.AddArg(v0) 20916 v0.AuxInt = i0 20917 v0.Aux = s 20918 v0.AddArg(p) 20919 v0.AddArg(idx) 20920 v0.AddArg(mem) 20921 return true 20922 } 20923 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 20924 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 20925 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 20926 for { 20927 s0 := v.Args[0] 20928 if s0.Op != OpS390XSLDconst { 20929 break 20930 } 20931 j0 := s0.AuxInt 20932 x0 := s0.Args[0] 20933 if x0.Op != OpS390XMOVBZloadidx { 20934 break 20935 } 20936 i0 := x0.AuxInt 20937 s := x0.Aux 20938 p := x0.Args[0] 20939 idx := x0.Args[1] 20940 mem := x0.Args[2] 20941 or := v.Args[1] 20942 if or.Op != OpS390XOR { 20943 break 20944 } 20945 s1 := or.Args[0] 20946 if s1.Op != OpS390XSLDconst { 20947 break 20948 } 20949 j1 := s1.AuxInt 20950 x1 := s1.Args[0] 20951 if x1.Op != OpS390XMOVBZloadidx { 20952 break 20953 } 20954 i1 := x1.AuxInt 20955 if x1.Aux != s { 20956 break 20957 } 20958 if p != x1.Args[0] { 20959 break 20960 } 20961 if idx != x1.Args[1] { 20962 break 20963 } 20964 if mem != x1.Args[2] { 20965 break 20966 } 20967 y := or.Args[1] 20968 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 20969 break 20970 } 20971 b = mergePoint(b, x0, x1) 20972 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20973 v.reset(OpCopy) 20974 v.AddArg(v0) 20975 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20976 v1.AuxInt = j1 20977 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20978 v2.AuxInt = i0 20979 v2.Aux = s 20980 v2.AddArg(p) 20981 v2.AddArg(idx) 20982 v2.AddArg(mem) 20983 v1.AddArg(v2) 20984 v0.AddArg(v1) 20985 v0.AddArg(y) 20986 return true 20987 } 20988 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 20989 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 20990 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 20991 for { 20992 s0 := v.Args[0] 20993 if s0.Op != OpS390XSLDconst { 20994 break 20995 } 20996 j0 := s0.AuxInt 20997 x0 := s0.Args[0] 20998 if x0.Op != OpS390XMOVBZloadidx { 20999 break 21000 } 21001 i0 := x0.AuxInt 21002 s := x0.Aux 21003 idx := x0.Args[0] 21004 p := x0.Args[1] 21005 mem := x0.Args[2] 21006 or := v.Args[1] 21007 if or.Op != OpS390XOR { 21008 break 21009 } 21010 s1 := or.Args[0] 21011 if s1.Op != OpS390XSLDconst { 21012 break 21013 } 21014 j1 := s1.AuxInt 21015 x1 := s1.Args[0] 21016 if x1.Op != OpS390XMOVBZloadidx { 21017 break 21018 } 21019 i1 := x1.AuxInt 21020 if x1.Aux != s { 21021 break 21022 } 21023 if p != x1.Args[0] { 21024 break 21025 } 21026 if idx != x1.Args[1] { 21027 break 21028 } 21029 if mem != x1.Args[2] { 21030 break 21031 } 21032 y := or.Args[1] 21033 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21034 break 21035 } 21036 b = mergePoint(b, x0, x1) 21037 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21038 v.reset(OpCopy) 21039 v.AddArg(v0) 21040 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21041 v1.AuxInt = j1 21042 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21043 v2.AuxInt = i0 21044 v2.Aux = s 21045 v2.AddArg(p) 21046 v2.AddArg(idx) 21047 v2.AddArg(mem) 21048 v1.AddArg(v2) 21049 v0.AddArg(v1) 21050 v0.AddArg(y) 21051 return true 21052 } 21053 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 21054 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21055 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21056 for { 21057 s0 := v.Args[0] 21058 if s0.Op != OpS390XSLDconst { 21059 break 21060 } 21061 j0 := s0.AuxInt 21062 x0 := s0.Args[0] 21063 if x0.Op != OpS390XMOVBZloadidx { 21064 break 21065 } 21066 i0 := x0.AuxInt 21067 s := x0.Aux 21068 p := x0.Args[0] 21069 idx := x0.Args[1] 21070 mem := x0.Args[2] 21071 or := v.Args[1] 21072 if or.Op != OpS390XOR { 21073 break 21074 } 21075 s1 := or.Args[0] 21076 if s1.Op != OpS390XSLDconst { 21077 break 21078 } 21079 j1 := s1.AuxInt 21080 x1 := s1.Args[0] 21081 if x1.Op != OpS390XMOVBZloadidx { 21082 break 21083 } 21084 i1 := x1.AuxInt 21085 if x1.Aux != s { 21086 break 21087 } 21088 if idx != x1.Args[0] { 21089 break 21090 } 21091 if p != x1.Args[1] { 21092 break 21093 } 21094 if mem != x1.Args[2] { 21095 break 21096 } 21097 y := or.Args[1] 21098 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21099 break 21100 } 21101 b = mergePoint(b, x0, x1) 21102 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21103 v.reset(OpCopy) 21104 v.AddArg(v0) 21105 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21106 v1.AuxInt = j1 21107 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21108 v2.AuxInt = i0 21109 v2.Aux = s 21110 v2.AddArg(p) 21111 v2.AddArg(idx) 21112 v2.AddArg(mem) 21113 v1.AddArg(v2) 21114 v0.AddArg(v1) 21115 v0.AddArg(y) 21116 return true 21117 } 21118 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 21119 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21120 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21121 for { 21122 s0 := v.Args[0] 21123 if s0.Op != OpS390XSLDconst { 21124 break 21125 } 21126 j0 := s0.AuxInt 21127 x0 := s0.Args[0] 21128 if x0.Op != OpS390XMOVBZloadidx { 21129 break 21130 } 21131 i0 := x0.AuxInt 21132 s := x0.Aux 21133 idx := x0.Args[0] 21134 p := x0.Args[1] 21135 mem := x0.Args[2] 21136 or := v.Args[1] 21137 if or.Op != OpS390XOR { 21138 break 21139 } 21140 s1 := or.Args[0] 21141 if s1.Op != OpS390XSLDconst { 21142 break 21143 } 21144 j1 := s1.AuxInt 21145 x1 := s1.Args[0] 21146 if x1.Op != OpS390XMOVBZloadidx { 21147 break 21148 } 21149 i1 := x1.AuxInt 21150 if x1.Aux != s { 21151 break 21152 } 21153 if idx != x1.Args[0] { 21154 break 21155 } 21156 if p != x1.Args[1] { 21157 break 21158 } 21159 if mem != x1.Args[2] { 21160 break 21161 } 21162 y := or.Args[1] 21163 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21164 break 21165 } 21166 b = mergePoint(b, x0, x1) 21167 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21168 v.reset(OpCopy) 21169 v.AddArg(v0) 21170 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21171 v1.AuxInt = j1 21172 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21173 v2.AuxInt = i0 21174 v2.Aux = s 21175 v2.AddArg(p) 21176 v2.AddArg(idx) 21177 v2.AddArg(mem) 21178 v1.AddArg(v2) 21179 v0.AddArg(v1) 21180 v0.AddArg(y) 21181 return true 21182 } 21183 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 21184 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21185 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21186 for { 21187 s0 := v.Args[0] 21188 if s0.Op != OpS390XSLDconst { 21189 break 21190 } 21191 j0 := s0.AuxInt 21192 x0 := s0.Args[0] 21193 if x0.Op != OpS390XMOVBZloadidx { 21194 break 21195 } 21196 i0 := x0.AuxInt 21197 s := x0.Aux 21198 p := x0.Args[0] 21199 idx := x0.Args[1] 21200 mem := x0.Args[2] 21201 or := v.Args[1] 21202 if or.Op != OpS390XOR { 21203 break 21204 } 21205 y := or.Args[0] 21206 s1 := or.Args[1] 21207 if s1.Op != OpS390XSLDconst { 21208 break 21209 } 21210 j1 := s1.AuxInt 21211 x1 := s1.Args[0] 21212 if x1.Op != OpS390XMOVBZloadidx { 21213 break 21214 } 21215 i1 := x1.AuxInt 21216 if x1.Aux != s { 21217 break 21218 } 21219 if p != x1.Args[0] { 21220 break 21221 } 21222 if idx != x1.Args[1] { 21223 break 21224 } 21225 if mem != x1.Args[2] { 21226 break 21227 } 21228 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21229 break 21230 } 21231 b = mergePoint(b, x0, x1) 21232 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21233 v.reset(OpCopy) 21234 v.AddArg(v0) 21235 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21236 v1.AuxInt = j1 21237 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21238 v2.AuxInt = i0 21239 v2.Aux = s 21240 v2.AddArg(p) 21241 v2.AddArg(idx) 21242 v2.AddArg(mem) 21243 v1.AddArg(v2) 21244 v0.AddArg(v1) 21245 v0.AddArg(y) 21246 return true 21247 } 21248 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 21249 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21250 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21251 for { 21252 s0 := v.Args[0] 21253 if s0.Op != OpS390XSLDconst { 21254 break 21255 } 21256 j0 := s0.AuxInt 21257 x0 := s0.Args[0] 21258 if x0.Op != OpS390XMOVBZloadidx { 21259 break 21260 } 21261 i0 := x0.AuxInt 21262 s := x0.Aux 21263 idx := x0.Args[0] 21264 p := x0.Args[1] 21265 mem := x0.Args[2] 21266 or := v.Args[1] 21267 if or.Op != OpS390XOR { 21268 break 21269 } 21270 y := or.Args[0] 21271 s1 := or.Args[1] 21272 if s1.Op != OpS390XSLDconst { 21273 break 21274 } 21275 j1 := s1.AuxInt 21276 x1 := s1.Args[0] 21277 if x1.Op != OpS390XMOVBZloadidx { 21278 break 21279 } 21280 i1 := x1.AuxInt 21281 if x1.Aux != s { 21282 break 21283 } 21284 if p != x1.Args[0] { 21285 break 21286 } 21287 if idx != x1.Args[1] { 21288 break 21289 } 21290 if mem != x1.Args[2] { 21291 break 21292 } 21293 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21294 break 21295 } 21296 b = mergePoint(b, x0, x1) 21297 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21298 v.reset(OpCopy) 21299 v.AddArg(v0) 21300 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21301 v1.AuxInt = j1 21302 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21303 v2.AuxInt = i0 21304 v2.Aux = s 21305 v2.AddArg(p) 21306 v2.AddArg(idx) 21307 v2.AddArg(mem) 21308 v1.AddArg(v2) 21309 v0.AddArg(v1) 21310 v0.AddArg(y) 21311 return true 21312 } 21313 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 21314 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21315 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21316 for { 21317 s0 := v.Args[0] 21318 if s0.Op != OpS390XSLDconst { 21319 break 21320 } 21321 j0 := s0.AuxInt 21322 x0 := s0.Args[0] 21323 if x0.Op != OpS390XMOVBZloadidx { 21324 break 21325 } 21326 i0 := x0.AuxInt 21327 s := x0.Aux 21328 p := x0.Args[0] 21329 idx := x0.Args[1] 21330 mem := x0.Args[2] 21331 or := v.Args[1] 21332 if or.Op != OpS390XOR { 21333 break 21334 } 21335 y := or.Args[0] 21336 s1 := or.Args[1] 21337 if s1.Op != OpS390XSLDconst { 21338 break 21339 } 21340 j1 := s1.AuxInt 21341 x1 := s1.Args[0] 21342 if x1.Op != OpS390XMOVBZloadidx { 21343 break 21344 } 21345 i1 := x1.AuxInt 21346 if x1.Aux != s { 21347 break 21348 } 21349 if idx != x1.Args[0] { 21350 break 21351 } 21352 if p != x1.Args[1] { 21353 break 21354 } 21355 if mem != x1.Args[2] { 21356 break 21357 } 21358 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21359 break 21360 } 21361 b = mergePoint(b, x0, x1) 21362 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21363 v.reset(OpCopy) 21364 v.AddArg(v0) 21365 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21366 v1.AuxInt = j1 21367 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21368 v2.AuxInt = i0 21369 v2.Aux = s 21370 v2.AddArg(p) 21371 v2.AddArg(idx) 21372 v2.AddArg(mem) 21373 v1.AddArg(v2) 21374 v0.AddArg(v1) 21375 v0.AddArg(y) 21376 return true 21377 } 21378 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 21379 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21380 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21381 for { 21382 s0 := v.Args[0] 21383 if s0.Op != OpS390XSLDconst { 21384 break 21385 } 21386 j0 := s0.AuxInt 21387 x0 := s0.Args[0] 21388 if x0.Op != OpS390XMOVBZloadidx { 21389 break 21390 } 21391 i0 := x0.AuxInt 21392 s := x0.Aux 21393 idx := x0.Args[0] 21394 p := x0.Args[1] 21395 mem := x0.Args[2] 21396 or := v.Args[1] 21397 if or.Op != OpS390XOR { 21398 break 21399 } 21400 y := or.Args[0] 21401 s1 := or.Args[1] 21402 if s1.Op != OpS390XSLDconst { 21403 break 21404 } 21405 j1 := s1.AuxInt 21406 x1 := s1.Args[0] 21407 if x1.Op != OpS390XMOVBZloadidx { 21408 break 21409 } 21410 i1 := x1.AuxInt 21411 if x1.Aux != s { 21412 break 21413 } 21414 if idx != x1.Args[0] { 21415 break 21416 } 21417 if p != x1.Args[1] { 21418 break 21419 } 21420 if mem != x1.Args[2] { 21421 break 21422 } 21423 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21424 break 21425 } 21426 b = mergePoint(b, x0, x1) 21427 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21428 v.reset(OpCopy) 21429 v.AddArg(v0) 21430 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21431 v1.AuxInt = j1 21432 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21433 v2.AuxInt = i0 21434 v2.Aux = s 21435 v2.AddArg(p) 21436 v2.AddArg(idx) 21437 v2.AddArg(mem) 21438 v1.AddArg(v2) 21439 v0.AddArg(v1) 21440 v0.AddArg(y) 21441 return true 21442 } 21443 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21444 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21445 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21446 for { 21447 or := v.Args[0] 21448 if or.Op != OpS390XOR { 21449 break 21450 } 21451 s1 := or.Args[0] 21452 if s1.Op != OpS390XSLDconst { 21453 break 21454 } 21455 j1 := s1.AuxInt 21456 x1 := s1.Args[0] 21457 if x1.Op != OpS390XMOVBZloadidx { 21458 break 21459 } 21460 i1 := x1.AuxInt 21461 s := x1.Aux 21462 p := x1.Args[0] 21463 idx := x1.Args[1] 21464 mem := x1.Args[2] 21465 y := or.Args[1] 21466 s0 := v.Args[1] 21467 if s0.Op != OpS390XSLDconst { 21468 break 21469 } 21470 j0 := s0.AuxInt 21471 x0 := s0.Args[0] 21472 if x0.Op != OpS390XMOVBZloadidx { 21473 break 21474 } 21475 i0 := x0.AuxInt 21476 if x0.Aux != s { 21477 break 21478 } 21479 if p != x0.Args[0] { 21480 break 21481 } 21482 if idx != x0.Args[1] { 21483 break 21484 } 21485 if mem != x0.Args[2] { 21486 break 21487 } 21488 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21489 break 21490 } 21491 b = mergePoint(b, x0, x1) 21492 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21493 v.reset(OpCopy) 21494 v.AddArg(v0) 21495 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21496 v1.AuxInt = j1 21497 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21498 v2.AuxInt = i0 21499 v2.Aux = s 21500 v2.AddArg(p) 21501 v2.AddArg(idx) 21502 v2.AddArg(mem) 21503 v1.AddArg(v2) 21504 v0.AddArg(v1) 21505 v0.AddArg(y) 21506 return true 21507 } 21508 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21509 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21510 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21511 for { 21512 or := v.Args[0] 21513 if or.Op != OpS390XOR { 21514 break 21515 } 21516 s1 := or.Args[0] 21517 if s1.Op != OpS390XSLDconst { 21518 break 21519 } 21520 j1 := s1.AuxInt 21521 x1 := s1.Args[0] 21522 if x1.Op != OpS390XMOVBZloadidx { 21523 break 21524 } 21525 i1 := x1.AuxInt 21526 s := x1.Aux 21527 idx := x1.Args[0] 21528 p := x1.Args[1] 21529 mem := x1.Args[2] 21530 y := or.Args[1] 21531 s0 := v.Args[1] 21532 if s0.Op != OpS390XSLDconst { 21533 break 21534 } 21535 j0 := s0.AuxInt 21536 x0 := s0.Args[0] 21537 if x0.Op != OpS390XMOVBZloadidx { 21538 break 21539 } 21540 i0 := x0.AuxInt 21541 if x0.Aux != s { 21542 break 21543 } 21544 if p != x0.Args[0] { 21545 break 21546 } 21547 if idx != x0.Args[1] { 21548 break 21549 } 21550 if mem != x0.Args[2] { 21551 break 21552 } 21553 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21554 break 21555 } 21556 b = mergePoint(b, x0, x1) 21557 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21558 v.reset(OpCopy) 21559 v.AddArg(v0) 21560 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21561 v1.AuxInt = j1 21562 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21563 v2.AuxInt = i0 21564 v2.Aux = s 21565 v2.AddArg(p) 21566 v2.AddArg(idx) 21567 v2.AddArg(mem) 21568 v1.AddArg(v2) 21569 v0.AddArg(v1) 21570 v0.AddArg(y) 21571 return true 21572 } 21573 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21574 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21575 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21576 for { 21577 or := v.Args[0] 21578 if or.Op != OpS390XOR { 21579 break 21580 } 21581 y := or.Args[0] 21582 s1 := or.Args[1] 21583 if s1.Op != OpS390XSLDconst { 21584 break 21585 } 21586 j1 := s1.AuxInt 21587 x1 := s1.Args[0] 21588 if x1.Op != OpS390XMOVBZloadidx { 21589 break 21590 } 21591 i1 := x1.AuxInt 21592 s := x1.Aux 21593 p := x1.Args[0] 21594 idx := x1.Args[1] 21595 mem := x1.Args[2] 21596 s0 := v.Args[1] 21597 if s0.Op != OpS390XSLDconst { 21598 break 21599 } 21600 j0 := s0.AuxInt 21601 x0 := s0.Args[0] 21602 if x0.Op != OpS390XMOVBZloadidx { 21603 break 21604 } 21605 i0 := x0.AuxInt 21606 if x0.Aux != s { 21607 break 21608 } 21609 if p != x0.Args[0] { 21610 break 21611 } 21612 if idx != x0.Args[1] { 21613 break 21614 } 21615 if mem != x0.Args[2] { 21616 break 21617 } 21618 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21619 break 21620 } 21621 b = mergePoint(b, x0, x1) 21622 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21623 v.reset(OpCopy) 21624 v.AddArg(v0) 21625 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21626 v1.AuxInt = j1 21627 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21628 v2.AuxInt = i0 21629 v2.Aux = s 21630 v2.AddArg(p) 21631 v2.AddArg(idx) 21632 v2.AddArg(mem) 21633 v1.AddArg(v2) 21634 v0.AddArg(v1) 21635 v0.AddArg(y) 21636 return true 21637 } 21638 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21639 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21640 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21641 for { 21642 or := v.Args[0] 21643 if or.Op != OpS390XOR { 21644 break 21645 } 21646 y := or.Args[0] 21647 s1 := or.Args[1] 21648 if s1.Op != OpS390XSLDconst { 21649 break 21650 } 21651 j1 := s1.AuxInt 21652 x1 := s1.Args[0] 21653 if x1.Op != OpS390XMOVBZloadidx { 21654 break 21655 } 21656 i1 := x1.AuxInt 21657 s := x1.Aux 21658 idx := x1.Args[0] 21659 p := x1.Args[1] 21660 mem := x1.Args[2] 21661 s0 := v.Args[1] 21662 if s0.Op != OpS390XSLDconst { 21663 break 21664 } 21665 j0 := s0.AuxInt 21666 x0 := s0.Args[0] 21667 if x0.Op != OpS390XMOVBZloadidx { 21668 break 21669 } 21670 i0 := x0.AuxInt 21671 if x0.Aux != s { 21672 break 21673 } 21674 if p != x0.Args[0] { 21675 break 21676 } 21677 if idx != x0.Args[1] { 21678 break 21679 } 21680 if mem != x0.Args[2] { 21681 break 21682 } 21683 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21684 break 21685 } 21686 b = mergePoint(b, x0, x1) 21687 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21688 v.reset(OpCopy) 21689 v.AddArg(v0) 21690 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21691 v1.AuxInt = j1 21692 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21693 v2.AuxInt = i0 21694 v2.Aux = s 21695 v2.AddArg(p) 21696 v2.AddArg(idx) 21697 v2.AddArg(mem) 21698 v1.AddArg(v2) 21699 v0.AddArg(v1) 21700 v0.AddArg(y) 21701 return true 21702 } 21703 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21704 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21705 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21706 for { 21707 or := v.Args[0] 21708 if or.Op != OpS390XOR { 21709 break 21710 } 21711 s1 := or.Args[0] 21712 if s1.Op != OpS390XSLDconst { 21713 break 21714 } 21715 j1 := s1.AuxInt 21716 x1 := s1.Args[0] 21717 if x1.Op != OpS390XMOVBZloadidx { 21718 break 21719 } 21720 i1 := x1.AuxInt 21721 s := x1.Aux 21722 p := x1.Args[0] 21723 idx := x1.Args[1] 21724 mem := x1.Args[2] 21725 y := or.Args[1] 21726 s0 := v.Args[1] 21727 if s0.Op != OpS390XSLDconst { 21728 break 21729 } 21730 j0 := s0.AuxInt 21731 x0 := s0.Args[0] 21732 if x0.Op != OpS390XMOVBZloadidx { 21733 break 21734 } 21735 i0 := x0.AuxInt 21736 if x0.Aux != s { 21737 break 21738 } 21739 if idx != x0.Args[0] { 21740 break 21741 } 21742 if p != x0.Args[1] { 21743 break 21744 } 21745 if mem != x0.Args[2] { 21746 break 21747 } 21748 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21749 break 21750 } 21751 b = mergePoint(b, x0, x1) 21752 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21753 v.reset(OpCopy) 21754 v.AddArg(v0) 21755 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21756 v1.AuxInt = j1 21757 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21758 v2.AuxInt = i0 21759 v2.Aux = s 21760 v2.AddArg(p) 21761 v2.AddArg(idx) 21762 v2.AddArg(mem) 21763 v1.AddArg(v2) 21764 v0.AddArg(v1) 21765 v0.AddArg(y) 21766 return true 21767 } 21768 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21769 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21770 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21771 for { 21772 or := v.Args[0] 21773 if or.Op != OpS390XOR { 21774 break 21775 } 21776 s1 := or.Args[0] 21777 if s1.Op != OpS390XSLDconst { 21778 break 21779 } 21780 j1 := s1.AuxInt 21781 x1 := s1.Args[0] 21782 if x1.Op != OpS390XMOVBZloadidx { 21783 break 21784 } 21785 i1 := x1.AuxInt 21786 s := x1.Aux 21787 idx := x1.Args[0] 21788 p := x1.Args[1] 21789 mem := x1.Args[2] 21790 y := or.Args[1] 21791 s0 := v.Args[1] 21792 if s0.Op != OpS390XSLDconst { 21793 break 21794 } 21795 j0 := s0.AuxInt 21796 x0 := s0.Args[0] 21797 if x0.Op != OpS390XMOVBZloadidx { 21798 break 21799 } 21800 i0 := x0.AuxInt 21801 if x0.Aux != s { 21802 break 21803 } 21804 if idx != x0.Args[0] { 21805 break 21806 } 21807 if p != x0.Args[1] { 21808 break 21809 } 21810 if mem != x0.Args[2] { 21811 break 21812 } 21813 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21814 break 21815 } 21816 b = mergePoint(b, x0, x1) 21817 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21818 v.reset(OpCopy) 21819 v.AddArg(v0) 21820 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21821 v1.AuxInt = j1 21822 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21823 v2.AuxInt = i0 21824 v2.Aux = s 21825 v2.AddArg(p) 21826 v2.AddArg(idx) 21827 v2.AddArg(mem) 21828 v1.AddArg(v2) 21829 v0.AddArg(v1) 21830 v0.AddArg(y) 21831 return true 21832 } 21833 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21834 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21835 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21836 for { 21837 or := v.Args[0] 21838 if or.Op != OpS390XOR { 21839 break 21840 } 21841 y := or.Args[0] 21842 s1 := or.Args[1] 21843 if s1.Op != OpS390XSLDconst { 21844 break 21845 } 21846 j1 := s1.AuxInt 21847 x1 := s1.Args[0] 21848 if x1.Op != OpS390XMOVBZloadidx { 21849 break 21850 } 21851 i1 := x1.AuxInt 21852 s := x1.Aux 21853 p := x1.Args[0] 21854 idx := x1.Args[1] 21855 mem := x1.Args[2] 21856 s0 := v.Args[1] 21857 if s0.Op != OpS390XSLDconst { 21858 break 21859 } 21860 j0 := s0.AuxInt 21861 x0 := s0.Args[0] 21862 if x0.Op != OpS390XMOVBZloadidx { 21863 break 21864 } 21865 i0 := x0.AuxInt 21866 if x0.Aux != s { 21867 break 21868 } 21869 if idx != x0.Args[0] { 21870 break 21871 } 21872 if p != x0.Args[1] { 21873 break 21874 } 21875 if mem != x0.Args[2] { 21876 break 21877 } 21878 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21879 break 21880 } 21881 b = mergePoint(b, x0, x1) 21882 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21883 v.reset(OpCopy) 21884 v.AddArg(v0) 21885 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21886 v1.AuxInt = j1 21887 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21888 v2.AuxInt = i0 21889 v2.Aux = s 21890 v2.AddArg(p) 21891 v2.AddArg(idx) 21892 v2.AddArg(mem) 21893 v1.AddArg(v2) 21894 v0.AddArg(v1) 21895 v0.AddArg(y) 21896 return true 21897 } 21898 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21899 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21900 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21901 for { 21902 or := v.Args[0] 21903 if or.Op != OpS390XOR { 21904 break 21905 } 21906 y := or.Args[0] 21907 s1 := or.Args[1] 21908 if s1.Op != OpS390XSLDconst { 21909 break 21910 } 21911 j1 := s1.AuxInt 21912 x1 := s1.Args[0] 21913 if x1.Op != OpS390XMOVBZloadidx { 21914 break 21915 } 21916 i1 := x1.AuxInt 21917 s := x1.Aux 21918 idx := x1.Args[0] 21919 p := x1.Args[1] 21920 mem := x1.Args[2] 21921 s0 := v.Args[1] 21922 if s0.Op != OpS390XSLDconst { 21923 break 21924 } 21925 j0 := s0.AuxInt 21926 x0 := s0.Args[0] 21927 if x0.Op != OpS390XMOVBZloadidx { 21928 break 21929 } 21930 i0 := x0.AuxInt 21931 if x0.Aux != s { 21932 break 21933 } 21934 if idx != x0.Args[0] { 21935 break 21936 } 21937 if p != x0.Args[1] { 21938 break 21939 } 21940 if mem != x0.Args[2] { 21941 break 21942 } 21943 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21944 break 21945 } 21946 b = mergePoint(b, x0, x1) 21947 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21948 v.reset(OpCopy) 21949 v.AddArg(v0) 21950 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21951 v1.AuxInt = j1 21952 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21953 v2.AuxInt = i0 21954 v2.Aux = s 21955 v2.AddArg(p) 21956 v2.AddArg(idx) 21957 v2.AddArg(mem) 21958 v1.AddArg(v2) 21959 v0.AddArg(v1) 21960 v0.AddArg(y) 21961 return true 21962 } 21963 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) 21964 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21965 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 21966 for { 21967 s0 := v.Args[0] 21968 if s0.Op != OpS390XSLDconst { 21969 break 21970 } 21971 j0 := s0.AuxInt 21972 x0 := s0.Args[0] 21973 if x0.Op != OpS390XMOVHZloadidx { 21974 break 21975 } 21976 i0 := x0.AuxInt 21977 s := x0.Aux 21978 p := x0.Args[0] 21979 idx := x0.Args[1] 21980 mem := x0.Args[2] 21981 or := v.Args[1] 21982 if or.Op != OpS390XOR { 21983 break 21984 } 21985 s1 := or.Args[0] 21986 if s1.Op != OpS390XSLDconst { 21987 break 21988 } 21989 j1 := s1.AuxInt 21990 x1 := s1.Args[0] 21991 if x1.Op != OpS390XMOVHZloadidx { 21992 break 21993 } 21994 i1 := x1.AuxInt 21995 if x1.Aux != s { 21996 break 21997 } 21998 if p != x1.Args[0] { 21999 break 22000 } 22001 if idx != x1.Args[1] { 22002 break 22003 } 22004 if mem != x1.Args[2] { 22005 break 22006 } 22007 y := or.Args[1] 22008 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22009 break 22010 } 22011 b = mergePoint(b, x0, x1) 22012 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22013 v.reset(OpCopy) 22014 v.AddArg(v0) 22015 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22016 v1.AuxInt = j1 22017 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22018 v2.AuxInt = i0 22019 v2.Aux = s 22020 v2.AddArg(p) 22021 v2.AddArg(idx) 22022 v2.AddArg(mem) 22023 v1.AddArg(v2) 22024 v0.AddArg(v1) 22025 v0.AddArg(y) 22026 return true 22027 } 22028 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) 22029 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22030 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22031 for { 22032 s0 := v.Args[0] 22033 if s0.Op != OpS390XSLDconst { 22034 break 22035 } 22036 j0 := s0.AuxInt 22037 x0 := s0.Args[0] 22038 if x0.Op != OpS390XMOVHZloadidx { 22039 break 22040 } 22041 i0 := x0.AuxInt 22042 s := x0.Aux 22043 idx := x0.Args[0] 22044 p := x0.Args[1] 22045 mem := x0.Args[2] 22046 or := v.Args[1] 22047 if or.Op != OpS390XOR { 22048 break 22049 } 22050 s1 := or.Args[0] 22051 if s1.Op != OpS390XSLDconst { 22052 break 22053 } 22054 j1 := s1.AuxInt 22055 x1 := s1.Args[0] 22056 if x1.Op != OpS390XMOVHZloadidx { 22057 break 22058 } 22059 i1 := x1.AuxInt 22060 if x1.Aux != s { 22061 break 22062 } 22063 if p != x1.Args[0] { 22064 break 22065 } 22066 if idx != x1.Args[1] { 22067 break 22068 } 22069 if mem != x1.Args[2] { 22070 break 22071 } 22072 y := or.Args[1] 22073 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22074 break 22075 } 22076 b = mergePoint(b, x0, x1) 22077 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22078 v.reset(OpCopy) 22079 v.AddArg(v0) 22080 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22081 v1.AuxInt = j1 22082 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22083 v2.AuxInt = i0 22084 v2.Aux = s 22085 v2.AddArg(p) 22086 v2.AddArg(idx) 22087 v2.AddArg(mem) 22088 v1.AddArg(v2) 22089 v0.AddArg(v1) 22090 v0.AddArg(y) 22091 return true 22092 } 22093 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y)) 22094 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22095 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22096 for { 22097 s0 := v.Args[0] 22098 if s0.Op != OpS390XSLDconst { 22099 break 22100 } 22101 j0 := s0.AuxInt 22102 x0 := s0.Args[0] 22103 if x0.Op != OpS390XMOVHZloadidx { 22104 break 22105 } 22106 i0 := x0.AuxInt 22107 s := x0.Aux 22108 p := x0.Args[0] 22109 idx := x0.Args[1] 22110 mem := x0.Args[2] 22111 or := v.Args[1] 22112 if or.Op != OpS390XOR { 22113 break 22114 } 22115 s1 := or.Args[0] 22116 if s1.Op != OpS390XSLDconst { 22117 break 22118 } 22119 j1 := s1.AuxInt 22120 x1 := s1.Args[0] 22121 if x1.Op != OpS390XMOVHZloadidx { 22122 break 22123 } 22124 i1 := x1.AuxInt 22125 if x1.Aux != s { 22126 break 22127 } 22128 if idx != x1.Args[0] { 22129 break 22130 } 22131 if p != x1.Args[1] { 22132 break 22133 } 22134 if mem != x1.Args[2] { 22135 break 22136 } 22137 y := or.Args[1] 22138 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22139 break 22140 } 22141 b = mergePoint(b, x0, x1) 22142 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22143 v.reset(OpCopy) 22144 v.AddArg(v0) 22145 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22146 v1.AuxInt = j1 22147 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22148 v2.AuxInt = i0 22149 v2.Aux = s 22150 v2.AddArg(p) 22151 v2.AddArg(idx) 22152 v2.AddArg(mem) 22153 v1.AddArg(v2) 22154 v0.AddArg(v1) 22155 v0.AddArg(y) 22156 return true 22157 } 22158 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y)) 22159 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22160 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22161 for { 22162 s0 := v.Args[0] 22163 if s0.Op != OpS390XSLDconst { 22164 break 22165 } 22166 j0 := s0.AuxInt 22167 x0 := s0.Args[0] 22168 if x0.Op != OpS390XMOVHZloadidx { 22169 break 22170 } 22171 i0 := x0.AuxInt 22172 s := x0.Aux 22173 idx := x0.Args[0] 22174 p := x0.Args[1] 22175 mem := x0.Args[2] 22176 or := v.Args[1] 22177 if or.Op != OpS390XOR { 22178 break 22179 } 22180 s1 := or.Args[0] 22181 if s1.Op != OpS390XSLDconst { 22182 break 22183 } 22184 j1 := s1.AuxInt 22185 x1 := s1.Args[0] 22186 if x1.Op != OpS390XMOVHZloadidx { 22187 break 22188 } 22189 i1 := x1.AuxInt 22190 if x1.Aux != s { 22191 break 22192 } 22193 if idx != x1.Args[0] { 22194 break 22195 } 22196 if p != x1.Args[1] { 22197 break 22198 } 22199 if mem != x1.Args[2] { 22200 break 22201 } 22202 y := or.Args[1] 22203 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22204 break 22205 } 22206 b = mergePoint(b, x0, x1) 22207 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22208 v.reset(OpCopy) 22209 v.AddArg(v0) 22210 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22211 v1.AuxInt = j1 22212 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22213 v2.AuxInt = i0 22214 v2.Aux = s 22215 v2.AddArg(p) 22216 v2.AddArg(idx) 22217 v2.AddArg(mem) 22218 v1.AddArg(v2) 22219 v0.AddArg(v1) 22220 v0.AddArg(y) 22221 return true 22222 } 22223 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)))) 22224 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22225 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22226 for { 22227 s0 := v.Args[0] 22228 if s0.Op != OpS390XSLDconst { 22229 break 22230 } 22231 j0 := s0.AuxInt 22232 x0 := s0.Args[0] 22233 if x0.Op != OpS390XMOVHZloadidx { 22234 break 22235 } 22236 i0 := x0.AuxInt 22237 s := x0.Aux 22238 p := x0.Args[0] 22239 idx := x0.Args[1] 22240 mem := x0.Args[2] 22241 or := v.Args[1] 22242 if or.Op != OpS390XOR { 22243 break 22244 } 22245 y := or.Args[0] 22246 s1 := or.Args[1] 22247 if s1.Op != OpS390XSLDconst { 22248 break 22249 } 22250 j1 := s1.AuxInt 22251 x1 := s1.Args[0] 22252 if x1.Op != OpS390XMOVHZloadidx { 22253 break 22254 } 22255 i1 := x1.AuxInt 22256 if x1.Aux != s { 22257 break 22258 } 22259 if p != x1.Args[0] { 22260 break 22261 } 22262 if idx != x1.Args[1] { 22263 break 22264 } 22265 if mem != x1.Args[2] { 22266 break 22267 } 22268 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22269 break 22270 } 22271 b = mergePoint(b, x0, x1) 22272 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22273 v.reset(OpCopy) 22274 v.AddArg(v0) 22275 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22276 v1.AuxInt = j1 22277 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22278 v2.AuxInt = i0 22279 v2.Aux = s 22280 v2.AddArg(p) 22281 v2.AddArg(idx) 22282 v2.AddArg(mem) 22283 v1.AddArg(v2) 22284 v0.AddArg(v1) 22285 v0.AddArg(y) 22286 return true 22287 } 22288 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)))) 22289 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22290 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22291 for { 22292 s0 := v.Args[0] 22293 if s0.Op != OpS390XSLDconst { 22294 break 22295 } 22296 j0 := s0.AuxInt 22297 x0 := s0.Args[0] 22298 if x0.Op != OpS390XMOVHZloadidx { 22299 break 22300 } 22301 i0 := x0.AuxInt 22302 s := x0.Aux 22303 idx := x0.Args[0] 22304 p := x0.Args[1] 22305 mem := x0.Args[2] 22306 or := v.Args[1] 22307 if or.Op != OpS390XOR { 22308 break 22309 } 22310 y := or.Args[0] 22311 s1 := or.Args[1] 22312 if s1.Op != OpS390XSLDconst { 22313 break 22314 } 22315 j1 := s1.AuxInt 22316 x1 := s1.Args[0] 22317 if x1.Op != OpS390XMOVHZloadidx { 22318 break 22319 } 22320 i1 := x1.AuxInt 22321 if x1.Aux != s { 22322 break 22323 } 22324 if p != x1.Args[0] { 22325 break 22326 } 22327 if idx != x1.Args[1] { 22328 break 22329 } 22330 if mem != x1.Args[2] { 22331 break 22332 } 22333 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22334 break 22335 } 22336 b = mergePoint(b, x0, x1) 22337 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22338 v.reset(OpCopy) 22339 v.AddArg(v0) 22340 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22341 v1.AuxInt = j1 22342 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22343 v2.AuxInt = i0 22344 v2.Aux = s 22345 v2.AddArg(p) 22346 v2.AddArg(idx) 22347 v2.AddArg(mem) 22348 v1.AddArg(v2) 22349 v0.AddArg(v1) 22350 v0.AddArg(y) 22351 return true 22352 } 22353 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)))) 22354 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22355 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22356 for { 22357 s0 := v.Args[0] 22358 if s0.Op != OpS390XSLDconst { 22359 break 22360 } 22361 j0 := s0.AuxInt 22362 x0 := s0.Args[0] 22363 if x0.Op != OpS390XMOVHZloadidx { 22364 break 22365 } 22366 i0 := x0.AuxInt 22367 s := x0.Aux 22368 p := x0.Args[0] 22369 idx := x0.Args[1] 22370 mem := x0.Args[2] 22371 or := v.Args[1] 22372 if or.Op != OpS390XOR { 22373 break 22374 } 22375 y := or.Args[0] 22376 s1 := or.Args[1] 22377 if s1.Op != OpS390XSLDconst { 22378 break 22379 } 22380 j1 := s1.AuxInt 22381 x1 := s1.Args[0] 22382 if x1.Op != OpS390XMOVHZloadidx { 22383 break 22384 } 22385 i1 := x1.AuxInt 22386 if x1.Aux != s { 22387 break 22388 } 22389 if idx != x1.Args[0] { 22390 break 22391 } 22392 if p != x1.Args[1] { 22393 break 22394 } 22395 if mem != x1.Args[2] { 22396 break 22397 } 22398 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22399 break 22400 } 22401 b = mergePoint(b, x0, x1) 22402 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22403 v.reset(OpCopy) 22404 v.AddArg(v0) 22405 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22406 v1.AuxInt = j1 22407 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22408 v2.AuxInt = i0 22409 v2.Aux = s 22410 v2.AddArg(p) 22411 v2.AddArg(idx) 22412 v2.AddArg(mem) 22413 v1.AddArg(v2) 22414 v0.AddArg(v1) 22415 v0.AddArg(y) 22416 return true 22417 } 22418 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)))) 22419 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22420 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22421 for { 22422 s0 := v.Args[0] 22423 if s0.Op != OpS390XSLDconst { 22424 break 22425 } 22426 j0 := s0.AuxInt 22427 x0 := s0.Args[0] 22428 if x0.Op != OpS390XMOVHZloadidx { 22429 break 22430 } 22431 i0 := x0.AuxInt 22432 s := x0.Aux 22433 idx := x0.Args[0] 22434 p := x0.Args[1] 22435 mem := x0.Args[2] 22436 or := v.Args[1] 22437 if or.Op != OpS390XOR { 22438 break 22439 } 22440 y := or.Args[0] 22441 s1 := or.Args[1] 22442 if s1.Op != OpS390XSLDconst { 22443 break 22444 } 22445 j1 := s1.AuxInt 22446 x1 := s1.Args[0] 22447 if x1.Op != OpS390XMOVHZloadidx { 22448 break 22449 } 22450 i1 := x1.AuxInt 22451 if x1.Aux != s { 22452 break 22453 } 22454 if idx != x1.Args[0] { 22455 break 22456 } 22457 if p != x1.Args[1] { 22458 break 22459 } 22460 if mem != x1.Args[2] { 22461 break 22462 } 22463 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22464 break 22465 } 22466 b = mergePoint(b, x0, x1) 22467 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22468 v.reset(OpCopy) 22469 v.AddArg(v0) 22470 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22471 v1.AuxInt = j1 22472 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22473 v2.AuxInt = i0 22474 v2.Aux = s 22475 v2.AddArg(p) 22476 v2.AddArg(idx) 22477 v2.AddArg(mem) 22478 v1.AddArg(v2) 22479 v0.AddArg(v1) 22480 v0.AddArg(y) 22481 return true 22482 } 22483 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22484 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22485 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22486 for { 22487 or := v.Args[0] 22488 if or.Op != OpS390XOR { 22489 break 22490 } 22491 s1 := or.Args[0] 22492 if s1.Op != OpS390XSLDconst { 22493 break 22494 } 22495 j1 := s1.AuxInt 22496 x1 := s1.Args[0] 22497 if x1.Op != OpS390XMOVHZloadidx { 22498 break 22499 } 22500 i1 := x1.AuxInt 22501 s := x1.Aux 22502 p := x1.Args[0] 22503 idx := x1.Args[1] 22504 mem := x1.Args[2] 22505 y := or.Args[1] 22506 s0 := v.Args[1] 22507 if s0.Op != OpS390XSLDconst { 22508 break 22509 } 22510 j0 := s0.AuxInt 22511 x0 := s0.Args[0] 22512 if x0.Op != OpS390XMOVHZloadidx { 22513 break 22514 } 22515 i0 := x0.AuxInt 22516 if x0.Aux != s { 22517 break 22518 } 22519 if p != x0.Args[0] { 22520 break 22521 } 22522 if idx != x0.Args[1] { 22523 break 22524 } 22525 if mem != x0.Args[2] { 22526 break 22527 } 22528 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22529 break 22530 } 22531 b = mergePoint(b, x0, x1) 22532 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22533 v.reset(OpCopy) 22534 v.AddArg(v0) 22535 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22536 v1.AuxInt = j1 22537 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22538 v2.AuxInt = i0 22539 v2.Aux = s 22540 v2.AddArg(p) 22541 v2.AddArg(idx) 22542 v2.AddArg(mem) 22543 v1.AddArg(v2) 22544 v0.AddArg(v1) 22545 v0.AddArg(y) 22546 return true 22547 } 22548 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22549 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22550 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22551 for { 22552 or := v.Args[0] 22553 if or.Op != OpS390XOR { 22554 break 22555 } 22556 s1 := or.Args[0] 22557 if s1.Op != OpS390XSLDconst { 22558 break 22559 } 22560 j1 := s1.AuxInt 22561 x1 := s1.Args[0] 22562 if x1.Op != OpS390XMOVHZloadidx { 22563 break 22564 } 22565 i1 := x1.AuxInt 22566 s := x1.Aux 22567 idx := x1.Args[0] 22568 p := x1.Args[1] 22569 mem := x1.Args[2] 22570 y := or.Args[1] 22571 s0 := v.Args[1] 22572 if s0.Op != OpS390XSLDconst { 22573 break 22574 } 22575 j0 := s0.AuxInt 22576 x0 := s0.Args[0] 22577 if x0.Op != OpS390XMOVHZloadidx { 22578 break 22579 } 22580 i0 := x0.AuxInt 22581 if x0.Aux != s { 22582 break 22583 } 22584 if p != x0.Args[0] { 22585 break 22586 } 22587 if idx != x0.Args[1] { 22588 break 22589 } 22590 if mem != x0.Args[2] { 22591 break 22592 } 22593 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22594 break 22595 } 22596 b = mergePoint(b, x0, x1) 22597 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22598 v.reset(OpCopy) 22599 v.AddArg(v0) 22600 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22601 v1.AuxInt = j1 22602 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22603 v2.AuxInt = i0 22604 v2.Aux = s 22605 v2.AddArg(p) 22606 v2.AddArg(idx) 22607 v2.AddArg(mem) 22608 v1.AddArg(v2) 22609 v0.AddArg(v1) 22610 v0.AddArg(y) 22611 return true 22612 } 22613 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22614 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22615 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22616 for { 22617 or := v.Args[0] 22618 if or.Op != OpS390XOR { 22619 break 22620 } 22621 y := or.Args[0] 22622 s1 := or.Args[1] 22623 if s1.Op != OpS390XSLDconst { 22624 break 22625 } 22626 j1 := s1.AuxInt 22627 x1 := s1.Args[0] 22628 if x1.Op != OpS390XMOVHZloadidx { 22629 break 22630 } 22631 i1 := x1.AuxInt 22632 s := x1.Aux 22633 p := x1.Args[0] 22634 idx := x1.Args[1] 22635 mem := x1.Args[2] 22636 s0 := v.Args[1] 22637 if s0.Op != OpS390XSLDconst { 22638 break 22639 } 22640 j0 := s0.AuxInt 22641 x0 := s0.Args[0] 22642 if x0.Op != OpS390XMOVHZloadidx { 22643 break 22644 } 22645 i0 := x0.AuxInt 22646 if x0.Aux != s { 22647 break 22648 } 22649 if p != x0.Args[0] { 22650 break 22651 } 22652 if idx != x0.Args[1] { 22653 break 22654 } 22655 if mem != x0.Args[2] { 22656 break 22657 } 22658 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22659 break 22660 } 22661 b = mergePoint(b, x0, x1) 22662 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22663 v.reset(OpCopy) 22664 v.AddArg(v0) 22665 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22666 v1.AuxInt = j1 22667 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22668 v2.AuxInt = i0 22669 v2.Aux = s 22670 v2.AddArg(p) 22671 v2.AddArg(idx) 22672 v2.AddArg(mem) 22673 v1.AddArg(v2) 22674 v0.AddArg(v1) 22675 v0.AddArg(y) 22676 return true 22677 } 22678 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22679 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22680 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22681 for { 22682 or := v.Args[0] 22683 if or.Op != OpS390XOR { 22684 break 22685 } 22686 y := or.Args[0] 22687 s1 := or.Args[1] 22688 if s1.Op != OpS390XSLDconst { 22689 break 22690 } 22691 j1 := s1.AuxInt 22692 x1 := s1.Args[0] 22693 if x1.Op != OpS390XMOVHZloadidx { 22694 break 22695 } 22696 i1 := x1.AuxInt 22697 s := x1.Aux 22698 idx := x1.Args[0] 22699 p := x1.Args[1] 22700 mem := x1.Args[2] 22701 s0 := v.Args[1] 22702 if s0.Op != OpS390XSLDconst { 22703 break 22704 } 22705 j0 := s0.AuxInt 22706 x0 := s0.Args[0] 22707 if x0.Op != OpS390XMOVHZloadidx { 22708 break 22709 } 22710 i0 := x0.AuxInt 22711 if x0.Aux != s { 22712 break 22713 } 22714 if p != x0.Args[0] { 22715 break 22716 } 22717 if idx != x0.Args[1] { 22718 break 22719 } 22720 if mem != x0.Args[2] { 22721 break 22722 } 22723 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22724 break 22725 } 22726 b = mergePoint(b, x0, x1) 22727 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22728 v.reset(OpCopy) 22729 v.AddArg(v0) 22730 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22731 v1.AuxInt = j1 22732 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22733 v2.AuxInt = i0 22734 v2.Aux = s 22735 v2.AddArg(p) 22736 v2.AddArg(idx) 22737 v2.AddArg(mem) 22738 v1.AddArg(v2) 22739 v0.AddArg(v1) 22740 v0.AddArg(y) 22741 return true 22742 } 22743 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22744 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22745 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22746 for { 22747 or := v.Args[0] 22748 if or.Op != OpS390XOR { 22749 break 22750 } 22751 s1 := or.Args[0] 22752 if s1.Op != OpS390XSLDconst { 22753 break 22754 } 22755 j1 := s1.AuxInt 22756 x1 := s1.Args[0] 22757 if x1.Op != OpS390XMOVHZloadidx { 22758 break 22759 } 22760 i1 := x1.AuxInt 22761 s := x1.Aux 22762 p := x1.Args[0] 22763 idx := x1.Args[1] 22764 mem := x1.Args[2] 22765 y := or.Args[1] 22766 s0 := v.Args[1] 22767 if s0.Op != OpS390XSLDconst { 22768 break 22769 } 22770 j0 := s0.AuxInt 22771 x0 := s0.Args[0] 22772 if x0.Op != OpS390XMOVHZloadidx { 22773 break 22774 } 22775 i0 := x0.AuxInt 22776 if x0.Aux != s { 22777 break 22778 } 22779 if idx != x0.Args[0] { 22780 break 22781 } 22782 if p != x0.Args[1] { 22783 break 22784 } 22785 if mem != x0.Args[2] { 22786 break 22787 } 22788 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22789 break 22790 } 22791 b = mergePoint(b, x0, x1) 22792 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22793 v.reset(OpCopy) 22794 v.AddArg(v0) 22795 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22796 v1.AuxInt = j1 22797 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22798 v2.AuxInt = i0 22799 v2.Aux = s 22800 v2.AddArg(p) 22801 v2.AddArg(idx) 22802 v2.AddArg(mem) 22803 v1.AddArg(v2) 22804 v0.AddArg(v1) 22805 v0.AddArg(y) 22806 return true 22807 } 22808 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22809 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22810 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22811 for { 22812 or := v.Args[0] 22813 if or.Op != OpS390XOR { 22814 break 22815 } 22816 s1 := or.Args[0] 22817 if s1.Op != OpS390XSLDconst { 22818 break 22819 } 22820 j1 := s1.AuxInt 22821 x1 := s1.Args[0] 22822 if x1.Op != OpS390XMOVHZloadidx { 22823 break 22824 } 22825 i1 := x1.AuxInt 22826 s := x1.Aux 22827 idx := x1.Args[0] 22828 p := x1.Args[1] 22829 mem := x1.Args[2] 22830 y := or.Args[1] 22831 s0 := v.Args[1] 22832 if s0.Op != OpS390XSLDconst { 22833 break 22834 } 22835 j0 := s0.AuxInt 22836 x0 := s0.Args[0] 22837 if x0.Op != OpS390XMOVHZloadidx { 22838 break 22839 } 22840 i0 := x0.AuxInt 22841 if x0.Aux != s { 22842 break 22843 } 22844 if idx != x0.Args[0] { 22845 break 22846 } 22847 if p != x0.Args[1] { 22848 break 22849 } 22850 if mem != x0.Args[2] { 22851 break 22852 } 22853 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22854 break 22855 } 22856 b = mergePoint(b, x0, x1) 22857 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22858 v.reset(OpCopy) 22859 v.AddArg(v0) 22860 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22861 v1.AuxInt = j1 22862 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22863 v2.AuxInt = i0 22864 v2.Aux = s 22865 v2.AddArg(p) 22866 v2.AddArg(idx) 22867 v2.AddArg(mem) 22868 v1.AddArg(v2) 22869 v0.AddArg(v1) 22870 v0.AddArg(y) 22871 return true 22872 } 22873 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22874 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22875 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22876 for { 22877 or := v.Args[0] 22878 if or.Op != OpS390XOR { 22879 break 22880 } 22881 y := or.Args[0] 22882 s1 := or.Args[1] 22883 if s1.Op != OpS390XSLDconst { 22884 break 22885 } 22886 j1 := s1.AuxInt 22887 x1 := s1.Args[0] 22888 if x1.Op != OpS390XMOVHZloadidx { 22889 break 22890 } 22891 i1 := x1.AuxInt 22892 s := x1.Aux 22893 p := x1.Args[0] 22894 idx := x1.Args[1] 22895 mem := x1.Args[2] 22896 s0 := v.Args[1] 22897 if s0.Op != OpS390XSLDconst { 22898 break 22899 } 22900 j0 := s0.AuxInt 22901 x0 := s0.Args[0] 22902 if x0.Op != OpS390XMOVHZloadidx { 22903 break 22904 } 22905 i0 := x0.AuxInt 22906 if x0.Aux != s { 22907 break 22908 } 22909 if idx != x0.Args[0] { 22910 break 22911 } 22912 if p != x0.Args[1] { 22913 break 22914 } 22915 if mem != x0.Args[2] { 22916 break 22917 } 22918 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22919 break 22920 } 22921 b = mergePoint(b, x0, x1) 22922 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22923 v.reset(OpCopy) 22924 v.AddArg(v0) 22925 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22926 v1.AuxInt = j1 22927 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22928 v2.AuxInt = i0 22929 v2.Aux = s 22930 v2.AddArg(p) 22931 v2.AddArg(idx) 22932 v2.AddArg(mem) 22933 v1.AddArg(v2) 22934 v0.AddArg(v1) 22935 v0.AddArg(y) 22936 return true 22937 } 22938 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22939 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22940 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22941 for { 22942 or := v.Args[0] 22943 if or.Op != OpS390XOR { 22944 break 22945 } 22946 y := or.Args[0] 22947 s1 := or.Args[1] 22948 if s1.Op != OpS390XSLDconst { 22949 break 22950 } 22951 j1 := s1.AuxInt 22952 x1 := s1.Args[0] 22953 if x1.Op != OpS390XMOVHZloadidx { 22954 break 22955 } 22956 i1 := x1.AuxInt 22957 s := x1.Aux 22958 idx := x1.Args[0] 22959 p := x1.Args[1] 22960 mem := x1.Args[2] 22961 s0 := v.Args[1] 22962 if s0.Op != OpS390XSLDconst { 22963 break 22964 } 22965 j0 := s0.AuxInt 22966 x0 := s0.Args[0] 22967 if x0.Op != OpS390XMOVHZloadidx { 22968 break 22969 } 22970 i0 := x0.AuxInt 22971 if x0.Aux != s { 22972 break 22973 } 22974 if idx != x0.Args[0] { 22975 break 22976 } 22977 if p != x0.Args[1] { 22978 break 22979 } 22980 if mem != x0.Args[2] { 22981 break 22982 } 22983 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22984 break 22985 } 22986 b = mergePoint(b, x0, x1) 22987 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22988 v.reset(OpCopy) 22989 v.AddArg(v0) 22990 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22991 v1.AuxInt = j1 22992 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22993 v2.AuxInt = i0 22994 v2.Aux = s 22995 v2.AddArg(p) 22996 v2.AddArg(idx) 22997 v2.AddArg(mem) 22998 v1.AddArg(v2) 22999 v0.AddArg(v1) 23000 v0.AddArg(y) 23001 return true 23002 } 23003 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 23004 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23005 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 23006 for { 23007 x0 := v.Args[0] 23008 if x0.Op != OpS390XMOVBZload { 23009 break 23010 } 23011 i0 := x0.AuxInt 23012 s := x0.Aux 23013 p := x0.Args[0] 23014 mem := x0.Args[1] 23015 sh := v.Args[1] 23016 if sh.Op != OpS390XSLDconst { 23017 break 23018 } 23019 if sh.AuxInt != 8 { 23020 break 23021 } 23022 x1 := sh.Args[0] 23023 if x1.Op != OpS390XMOVBZload { 23024 break 23025 } 23026 i1 := x1.AuxInt 23027 if x1.Aux != s { 23028 break 23029 } 23030 if p != x1.Args[0] { 23031 break 23032 } 23033 if mem != x1.Args[1] { 23034 break 23035 } 23036 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23037 break 23038 } 23039 b = mergePoint(b, x0, x1) 23040 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23041 v.reset(OpCopy) 23042 v.AddArg(v0) 23043 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23044 v1.AuxInt = i0 23045 v1.Aux = s 23046 v1.AddArg(p) 23047 v1.AddArg(mem) 23048 v0.AddArg(v1) 23049 return true 23050 } 23051 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 23052 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23053 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 23054 for { 23055 sh := v.Args[0] 23056 if sh.Op != OpS390XSLDconst { 23057 break 23058 } 23059 if sh.AuxInt != 8 { 23060 break 23061 } 23062 x1 := sh.Args[0] 23063 if x1.Op != OpS390XMOVBZload { 23064 break 23065 } 23066 i1 := x1.AuxInt 23067 s := x1.Aux 23068 p := x1.Args[0] 23069 mem := x1.Args[1] 23070 x0 := v.Args[1] 23071 if x0.Op != OpS390XMOVBZload { 23072 break 23073 } 23074 i0 := x0.AuxInt 23075 if x0.Aux != s { 23076 break 23077 } 23078 if p != x0.Args[0] { 23079 break 23080 } 23081 if mem != x0.Args[1] { 23082 break 23083 } 23084 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23085 break 23086 } 23087 b = mergePoint(b, x0, x1) 23088 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23089 v.reset(OpCopy) 23090 v.AddArg(v0) 23091 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23092 v1.AuxInt = i0 23093 v1.Aux = s 23094 v1.AddArg(p) 23095 v1.AddArg(mem) 23096 v0.AddArg(v1) 23097 return true 23098 } 23099 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 23100 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23101 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 23102 for { 23103 r0 := v.Args[0] 23104 if r0.Op != OpS390XMOVHZreg { 23105 break 23106 } 23107 x0 := r0.Args[0] 23108 if x0.Op != OpS390XMOVHBRload { 23109 break 23110 } 23111 i0 := x0.AuxInt 23112 s := x0.Aux 23113 p := x0.Args[0] 23114 mem := x0.Args[1] 23115 sh := v.Args[1] 23116 if sh.Op != OpS390XSLDconst { 23117 break 23118 } 23119 if sh.AuxInt != 16 { 23120 break 23121 } 23122 r1 := sh.Args[0] 23123 if r1.Op != OpS390XMOVHZreg { 23124 break 23125 } 23126 x1 := r1.Args[0] 23127 if x1.Op != OpS390XMOVHBRload { 23128 break 23129 } 23130 i1 := x1.AuxInt 23131 if x1.Aux != s { 23132 break 23133 } 23134 if p != x1.Args[0] { 23135 break 23136 } 23137 if mem != x1.Args[1] { 23138 break 23139 } 23140 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23141 break 23142 } 23143 b = mergePoint(b, x0, x1) 23144 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23145 v.reset(OpCopy) 23146 v.AddArg(v0) 23147 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23148 v1.AuxInt = i0 23149 v1.Aux = s 23150 v1.AddArg(p) 23151 v1.AddArg(mem) 23152 v0.AddArg(v1) 23153 return true 23154 } 23155 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 23156 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23157 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 23158 for { 23159 sh := v.Args[0] 23160 if sh.Op != OpS390XSLDconst { 23161 break 23162 } 23163 if sh.AuxInt != 16 { 23164 break 23165 } 23166 r1 := sh.Args[0] 23167 if r1.Op != OpS390XMOVHZreg { 23168 break 23169 } 23170 x1 := r1.Args[0] 23171 if x1.Op != OpS390XMOVHBRload { 23172 break 23173 } 23174 i1 := x1.AuxInt 23175 s := x1.Aux 23176 p := x1.Args[0] 23177 mem := x1.Args[1] 23178 r0 := v.Args[1] 23179 if r0.Op != OpS390XMOVHZreg { 23180 break 23181 } 23182 x0 := r0.Args[0] 23183 if x0.Op != OpS390XMOVHBRload { 23184 break 23185 } 23186 i0 := x0.AuxInt 23187 if x0.Aux != s { 23188 break 23189 } 23190 if p != x0.Args[0] { 23191 break 23192 } 23193 if mem != x0.Args[1] { 23194 break 23195 } 23196 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23197 break 23198 } 23199 b = mergePoint(b, x0, x1) 23200 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23201 v.reset(OpCopy) 23202 v.AddArg(v0) 23203 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23204 v1.AuxInt = i0 23205 v1.Aux = s 23206 v1.AddArg(p) 23207 v1.AddArg(mem) 23208 v0.AddArg(v1) 23209 return true 23210 } 23211 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 23212 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23213 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 23214 for { 23215 r0 := v.Args[0] 23216 if r0.Op != OpS390XMOVWZreg { 23217 break 23218 } 23219 x0 := r0.Args[0] 23220 if x0.Op != OpS390XMOVWBRload { 23221 break 23222 } 23223 i0 := x0.AuxInt 23224 s := x0.Aux 23225 p := x0.Args[0] 23226 mem := x0.Args[1] 23227 sh := v.Args[1] 23228 if sh.Op != OpS390XSLDconst { 23229 break 23230 } 23231 if sh.AuxInt != 32 { 23232 break 23233 } 23234 r1 := sh.Args[0] 23235 if r1.Op != OpS390XMOVWZreg { 23236 break 23237 } 23238 x1 := r1.Args[0] 23239 if x1.Op != OpS390XMOVWBRload { 23240 break 23241 } 23242 i1 := x1.AuxInt 23243 if x1.Aux != s { 23244 break 23245 } 23246 if p != x1.Args[0] { 23247 break 23248 } 23249 if mem != x1.Args[1] { 23250 break 23251 } 23252 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23253 break 23254 } 23255 b = mergePoint(b, x0, x1) 23256 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, types.UInt64) 23257 v.reset(OpCopy) 23258 v.AddArg(v0) 23259 v0.AuxInt = i0 23260 v0.Aux = s 23261 v0.AddArg(p) 23262 v0.AddArg(mem) 23263 return true 23264 } 23265 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 23266 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23267 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 23268 for { 23269 sh := v.Args[0] 23270 if sh.Op != OpS390XSLDconst { 23271 break 23272 } 23273 if sh.AuxInt != 32 { 23274 break 23275 } 23276 r1 := sh.Args[0] 23277 if r1.Op != OpS390XMOVWZreg { 23278 break 23279 } 23280 x1 := r1.Args[0] 23281 if x1.Op != OpS390XMOVWBRload { 23282 break 23283 } 23284 i1 := x1.AuxInt 23285 s := x1.Aux 23286 p := x1.Args[0] 23287 mem := x1.Args[1] 23288 r0 := v.Args[1] 23289 if r0.Op != OpS390XMOVWZreg { 23290 break 23291 } 23292 x0 := r0.Args[0] 23293 if x0.Op != OpS390XMOVWBRload { 23294 break 23295 } 23296 i0 := x0.AuxInt 23297 if x0.Aux != s { 23298 break 23299 } 23300 if p != x0.Args[0] { 23301 break 23302 } 23303 if mem != x0.Args[1] { 23304 break 23305 } 23306 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23307 break 23308 } 23309 b = mergePoint(b, x0, x1) 23310 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, types.UInt64) 23311 v.reset(OpCopy) 23312 v.AddArg(v0) 23313 v0.AuxInt = i0 23314 v0.Aux = s 23315 v0.AddArg(p) 23316 v0.AddArg(mem) 23317 return true 23318 } 23319 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 23320 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23321 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23322 for { 23323 s1 := v.Args[0] 23324 if s1.Op != OpS390XSLDconst { 23325 break 23326 } 23327 j1 := s1.AuxInt 23328 x1 := s1.Args[0] 23329 if x1.Op != OpS390XMOVBZload { 23330 break 23331 } 23332 i1 := x1.AuxInt 23333 s := x1.Aux 23334 p := x1.Args[0] 23335 mem := x1.Args[1] 23336 or := v.Args[1] 23337 if or.Op != OpS390XOR { 23338 break 23339 } 23340 s0 := or.Args[0] 23341 if s0.Op != OpS390XSLDconst { 23342 break 23343 } 23344 j0 := s0.AuxInt 23345 x0 := s0.Args[0] 23346 if x0.Op != OpS390XMOVBZload { 23347 break 23348 } 23349 i0 := x0.AuxInt 23350 if x0.Aux != s { 23351 break 23352 } 23353 if p != x0.Args[0] { 23354 break 23355 } 23356 if mem != x0.Args[1] { 23357 break 23358 } 23359 y := or.Args[1] 23360 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23361 break 23362 } 23363 b = mergePoint(b, x0, x1) 23364 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23365 v.reset(OpCopy) 23366 v.AddArg(v0) 23367 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23368 v1.AuxInt = j0 23369 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23370 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23371 v3.AuxInt = i0 23372 v3.Aux = s 23373 v3.AddArg(p) 23374 v3.AddArg(mem) 23375 v2.AddArg(v3) 23376 v1.AddArg(v2) 23377 v0.AddArg(v1) 23378 v0.AddArg(y) 23379 return true 23380 } 23381 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 23382 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23383 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23384 for { 23385 s1 := v.Args[0] 23386 if s1.Op != OpS390XSLDconst { 23387 break 23388 } 23389 j1 := s1.AuxInt 23390 x1 := s1.Args[0] 23391 if x1.Op != OpS390XMOVBZload { 23392 break 23393 } 23394 i1 := x1.AuxInt 23395 s := x1.Aux 23396 p := x1.Args[0] 23397 mem := x1.Args[1] 23398 or := v.Args[1] 23399 if or.Op != OpS390XOR { 23400 break 23401 } 23402 y := or.Args[0] 23403 s0 := or.Args[1] 23404 if s0.Op != OpS390XSLDconst { 23405 break 23406 } 23407 j0 := s0.AuxInt 23408 x0 := s0.Args[0] 23409 if x0.Op != OpS390XMOVBZload { 23410 break 23411 } 23412 i0 := x0.AuxInt 23413 if x0.Aux != s { 23414 break 23415 } 23416 if p != x0.Args[0] { 23417 break 23418 } 23419 if mem != x0.Args[1] { 23420 break 23421 } 23422 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23423 break 23424 } 23425 b = mergePoint(b, x0, x1) 23426 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23427 v.reset(OpCopy) 23428 v.AddArg(v0) 23429 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23430 v1.AuxInt = j0 23431 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23432 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23433 v3.AuxInt = i0 23434 v3.Aux = s 23435 v3.AddArg(p) 23436 v3.AddArg(mem) 23437 v2.AddArg(v3) 23438 v1.AddArg(v2) 23439 v0.AddArg(v1) 23440 v0.AddArg(y) 23441 return true 23442 } 23443 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 23444 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23445 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23446 for { 23447 or := v.Args[0] 23448 if or.Op != OpS390XOR { 23449 break 23450 } 23451 s0 := or.Args[0] 23452 if s0.Op != OpS390XSLDconst { 23453 break 23454 } 23455 j0 := s0.AuxInt 23456 x0 := s0.Args[0] 23457 if x0.Op != OpS390XMOVBZload { 23458 break 23459 } 23460 i0 := x0.AuxInt 23461 s := x0.Aux 23462 p := x0.Args[0] 23463 mem := x0.Args[1] 23464 y := or.Args[1] 23465 s1 := v.Args[1] 23466 if s1.Op != OpS390XSLDconst { 23467 break 23468 } 23469 j1 := s1.AuxInt 23470 x1 := s1.Args[0] 23471 if x1.Op != OpS390XMOVBZload { 23472 break 23473 } 23474 i1 := x1.AuxInt 23475 if x1.Aux != s { 23476 break 23477 } 23478 if p != x1.Args[0] { 23479 break 23480 } 23481 if mem != x1.Args[1] { 23482 break 23483 } 23484 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23485 break 23486 } 23487 b = mergePoint(b, x0, x1) 23488 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23489 v.reset(OpCopy) 23490 v.AddArg(v0) 23491 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23492 v1.AuxInt = j0 23493 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23494 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23495 v3.AuxInt = i0 23496 v3.Aux = s 23497 v3.AddArg(p) 23498 v3.AddArg(mem) 23499 v2.AddArg(v3) 23500 v1.AddArg(v2) 23501 v0.AddArg(v1) 23502 v0.AddArg(y) 23503 return true 23504 } 23505 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 23506 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23507 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23508 for { 23509 or := v.Args[0] 23510 if or.Op != OpS390XOR { 23511 break 23512 } 23513 y := or.Args[0] 23514 s0 := or.Args[1] 23515 if s0.Op != OpS390XSLDconst { 23516 break 23517 } 23518 j0 := s0.AuxInt 23519 x0 := s0.Args[0] 23520 if x0.Op != OpS390XMOVBZload { 23521 break 23522 } 23523 i0 := x0.AuxInt 23524 s := x0.Aux 23525 p := x0.Args[0] 23526 mem := x0.Args[1] 23527 s1 := v.Args[1] 23528 if s1.Op != OpS390XSLDconst { 23529 break 23530 } 23531 j1 := s1.AuxInt 23532 x1 := s1.Args[0] 23533 if x1.Op != OpS390XMOVBZload { 23534 break 23535 } 23536 i1 := x1.AuxInt 23537 if x1.Aux != s { 23538 break 23539 } 23540 if p != x1.Args[0] { 23541 break 23542 } 23543 if mem != x1.Args[1] { 23544 break 23545 } 23546 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23547 break 23548 } 23549 b = mergePoint(b, x0, x1) 23550 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23551 v.reset(OpCopy) 23552 v.AddArg(v0) 23553 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23554 v1.AuxInt = j0 23555 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23556 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23557 v3.AuxInt = i0 23558 v3.Aux = s 23559 v3.AddArg(p) 23560 v3.AddArg(mem) 23561 v2.AddArg(v3) 23562 v1.AddArg(v2) 23563 v0.AddArg(v1) 23564 v0.AddArg(y) 23565 return true 23566 } 23567 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y)) 23568 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23569 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23570 for { 23571 s1 := v.Args[0] 23572 if s1.Op != OpS390XSLDconst { 23573 break 23574 } 23575 j1 := s1.AuxInt 23576 r1 := s1.Args[0] 23577 if r1.Op != OpS390XMOVHZreg { 23578 break 23579 } 23580 x1 := r1.Args[0] 23581 if x1.Op != OpS390XMOVHBRload { 23582 break 23583 } 23584 i1 := x1.AuxInt 23585 s := x1.Aux 23586 p := x1.Args[0] 23587 mem := x1.Args[1] 23588 or := v.Args[1] 23589 if or.Op != OpS390XOR { 23590 break 23591 } 23592 s0 := or.Args[0] 23593 if s0.Op != OpS390XSLDconst { 23594 break 23595 } 23596 j0 := s0.AuxInt 23597 r0 := s0.Args[0] 23598 if r0.Op != OpS390XMOVHZreg { 23599 break 23600 } 23601 x0 := r0.Args[0] 23602 if x0.Op != OpS390XMOVHBRload { 23603 break 23604 } 23605 i0 := x0.AuxInt 23606 if x0.Aux != s { 23607 break 23608 } 23609 if p != x0.Args[0] { 23610 break 23611 } 23612 if mem != x0.Args[1] { 23613 break 23614 } 23615 y := or.Args[1] 23616 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23617 break 23618 } 23619 b = mergePoint(b, x0, x1) 23620 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23621 v.reset(OpCopy) 23622 v.AddArg(v0) 23623 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23624 v1.AuxInt = j0 23625 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23626 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23627 v3.AuxInt = i0 23628 v3.Aux = s 23629 v3.AddArg(p) 23630 v3.AddArg(mem) 23631 v2.AddArg(v3) 23632 v1.AddArg(v2) 23633 v0.AddArg(v1) 23634 v0.AddArg(y) 23635 return true 23636 } 23637 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))))) 23638 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23639 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23640 for { 23641 s1 := v.Args[0] 23642 if s1.Op != OpS390XSLDconst { 23643 break 23644 } 23645 j1 := s1.AuxInt 23646 r1 := s1.Args[0] 23647 if r1.Op != OpS390XMOVHZreg { 23648 break 23649 } 23650 x1 := r1.Args[0] 23651 if x1.Op != OpS390XMOVHBRload { 23652 break 23653 } 23654 i1 := x1.AuxInt 23655 s := x1.Aux 23656 p := x1.Args[0] 23657 mem := x1.Args[1] 23658 or := v.Args[1] 23659 if or.Op != OpS390XOR { 23660 break 23661 } 23662 y := or.Args[0] 23663 s0 := or.Args[1] 23664 if s0.Op != OpS390XSLDconst { 23665 break 23666 } 23667 j0 := s0.AuxInt 23668 r0 := s0.Args[0] 23669 if r0.Op != OpS390XMOVHZreg { 23670 break 23671 } 23672 x0 := r0.Args[0] 23673 if x0.Op != OpS390XMOVHBRload { 23674 break 23675 } 23676 i0 := x0.AuxInt 23677 if x0.Aux != s { 23678 break 23679 } 23680 if p != x0.Args[0] { 23681 break 23682 } 23683 if mem != x0.Args[1] { 23684 break 23685 } 23686 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23687 break 23688 } 23689 b = mergePoint(b, x0, x1) 23690 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23691 v.reset(OpCopy) 23692 v.AddArg(v0) 23693 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23694 v1.AuxInt = j0 23695 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23696 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23697 v3.AuxInt = i0 23698 v3.Aux = s 23699 v3.AddArg(p) 23700 v3.AddArg(mem) 23701 v2.AddArg(v3) 23702 v1.AddArg(v2) 23703 v0.AddArg(v1) 23704 v0.AddArg(y) 23705 return true 23706 } 23707 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 23708 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23709 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23710 for { 23711 or := v.Args[0] 23712 if or.Op != OpS390XOR { 23713 break 23714 } 23715 s0 := or.Args[0] 23716 if s0.Op != OpS390XSLDconst { 23717 break 23718 } 23719 j0 := s0.AuxInt 23720 r0 := s0.Args[0] 23721 if r0.Op != OpS390XMOVHZreg { 23722 break 23723 } 23724 x0 := r0.Args[0] 23725 if x0.Op != OpS390XMOVHBRload { 23726 break 23727 } 23728 i0 := x0.AuxInt 23729 s := x0.Aux 23730 p := x0.Args[0] 23731 mem := x0.Args[1] 23732 y := or.Args[1] 23733 s1 := v.Args[1] 23734 if s1.Op != OpS390XSLDconst { 23735 break 23736 } 23737 j1 := s1.AuxInt 23738 r1 := s1.Args[0] 23739 if r1.Op != OpS390XMOVHZreg { 23740 break 23741 } 23742 x1 := r1.Args[0] 23743 if x1.Op != OpS390XMOVHBRload { 23744 break 23745 } 23746 i1 := x1.AuxInt 23747 if x1.Aux != s { 23748 break 23749 } 23750 if p != x1.Args[0] { 23751 break 23752 } 23753 if mem != x1.Args[1] { 23754 break 23755 } 23756 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23757 break 23758 } 23759 b = mergePoint(b, x0, x1) 23760 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23761 v.reset(OpCopy) 23762 v.AddArg(v0) 23763 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23764 v1.AuxInt = j0 23765 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23766 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23767 v3.AuxInt = i0 23768 v3.Aux = s 23769 v3.AddArg(p) 23770 v3.AddArg(mem) 23771 v2.AddArg(v3) 23772 v1.AddArg(v2) 23773 v0.AddArg(v1) 23774 v0.AddArg(y) 23775 return true 23776 } 23777 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 23778 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23779 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23780 for { 23781 or := v.Args[0] 23782 if or.Op != OpS390XOR { 23783 break 23784 } 23785 y := or.Args[0] 23786 s0 := or.Args[1] 23787 if s0.Op != OpS390XSLDconst { 23788 break 23789 } 23790 j0 := s0.AuxInt 23791 r0 := s0.Args[0] 23792 if r0.Op != OpS390XMOVHZreg { 23793 break 23794 } 23795 x0 := r0.Args[0] 23796 if x0.Op != OpS390XMOVHBRload { 23797 break 23798 } 23799 i0 := x0.AuxInt 23800 s := x0.Aux 23801 p := x0.Args[0] 23802 mem := x0.Args[1] 23803 s1 := v.Args[1] 23804 if s1.Op != OpS390XSLDconst { 23805 break 23806 } 23807 j1 := s1.AuxInt 23808 r1 := s1.Args[0] 23809 if r1.Op != OpS390XMOVHZreg { 23810 break 23811 } 23812 x1 := r1.Args[0] 23813 if x1.Op != OpS390XMOVHBRload { 23814 break 23815 } 23816 i1 := x1.AuxInt 23817 if x1.Aux != s { 23818 break 23819 } 23820 if p != x1.Args[0] { 23821 break 23822 } 23823 if mem != x1.Args[1] { 23824 break 23825 } 23826 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23827 break 23828 } 23829 b = mergePoint(b, x0, x1) 23830 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23831 v.reset(OpCopy) 23832 v.AddArg(v0) 23833 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23834 v1.AuxInt = j0 23835 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23836 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23837 v3.AuxInt = i0 23838 v3.Aux = s 23839 v3.AddArg(p) 23840 v3.AddArg(mem) 23841 v2.AddArg(v3) 23842 v1.AddArg(v2) 23843 v0.AddArg(v1) 23844 v0.AddArg(y) 23845 return true 23846 } 23847 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 23848 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23849 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 23850 for { 23851 x0 := v.Args[0] 23852 if x0.Op != OpS390XMOVBZloadidx { 23853 break 23854 } 23855 i0 := x0.AuxInt 23856 s := x0.Aux 23857 p := x0.Args[0] 23858 idx := x0.Args[1] 23859 mem := x0.Args[2] 23860 sh := v.Args[1] 23861 if sh.Op != OpS390XSLDconst { 23862 break 23863 } 23864 if sh.AuxInt != 8 { 23865 break 23866 } 23867 x1 := sh.Args[0] 23868 if x1.Op != OpS390XMOVBZloadidx { 23869 break 23870 } 23871 i1 := x1.AuxInt 23872 if x1.Aux != s { 23873 break 23874 } 23875 if p != x1.Args[0] { 23876 break 23877 } 23878 if idx != x1.Args[1] { 23879 break 23880 } 23881 if mem != x1.Args[2] { 23882 break 23883 } 23884 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23885 break 23886 } 23887 b = mergePoint(b, x0, x1) 23888 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23889 v.reset(OpCopy) 23890 v.AddArg(v0) 23891 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 23892 v1.AuxInt = i0 23893 v1.Aux = s 23894 v1.AddArg(p) 23895 v1.AddArg(idx) 23896 v1.AddArg(mem) 23897 v0.AddArg(v1) 23898 return true 23899 } 23900 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 23901 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23902 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 23903 for { 23904 x0 := v.Args[0] 23905 if x0.Op != OpS390XMOVBZloadidx { 23906 break 23907 } 23908 i0 := x0.AuxInt 23909 s := x0.Aux 23910 idx := x0.Args[0] 23911 p := x0.Args[1] 23912 mem := x0.Args[2] 23913 sh := v.Args[1] 23914 if sh.Op != OpS390XSLDconst { 23915 break 23916 } 23917 if sh.AuxInt != 8 { 23918 break 23919 } 23920 x1 := sh.Args[0] 23921 if x1.Op != OpS390XMOVBZloadidx { 23922 break 23923 } 23924 i1 := x1.AuxInt 23925 if x1.Aux != s { 23926 break 23927 } 23928 if p != x1.Args[0] { 23929 break 23930 } 23931 if idx != x1.Args[1] { 23932 break 23933 } 23934 if mem != x1.Args[2] { 23935 break 23936 } 23937 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23938 break 23939 } 23940 b = mergePoint(b, x0, x1) 23941 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23942 v.reset(OpCopy) 23943 v.AddArg(v0) 23944 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 23945 v1.AuxInt = i0 23946 v1.Aux = s 23947 v1.AddArg(p) 23948 v1.AddArg(idx) 23949 v1.AddArg(mem) 23950 v0.AddArg(v1) 23951 return true 23952 } 23953 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 23954 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23955 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 23956 for { 23957 x0 := v.Args[0] 23958 if x0.Op != OpS390XMOVBZloadidx { 23959 break 23960 } 23961 i0 := x0.AuxInt 23962 s := x0.Aux 23963 p := x0.Args[0] 23964 idx := x0.Args[1] 23965 mem := x0.Args[2] 23966 sh := v.Args[1] 23967 if sh.Op != OpS390XSLDconst { 23968 break 23969 } 23970 if sh.AuxInt != 8 { 23971 break 23972 } 23973 x1 := sh.Args[0] 23974 if x1.Op != OpS390XMOVBZloadidx { 23975 break 23976 } 23977 i1 := x1.AuxInt 23978 if x1.Aux != s { 23979 break 23980 } 23981 if idx != x1.Args[0] { 23982 break 23983 } 23984 if p != x1.Args[1] { 23985 break 23986 } 23987 if mem != x1.Args[2] { 23988 break 23989 } 23990 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23991 break 23992 } 23993 b = mergePoint(b, x0, x1) 23994 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23995 v.reset(OpCopy) 23996 v.AddArg(v0) 23997 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 23998 v1.AuxInt = i0 23999 v1.Aux = s 24000 v1.AddArg(p) 24001 v1.AddArg(idx) 24002 v1.AddArg(mem) 24003 v0.AddArg(v1) 24004 return true 24005 } 24006 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 24007 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24008 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24009 for { 24010 x0 := v.Args[0] 24011 if x0.Op != OpS390XMOVBZloadidx { 24012 break 24013 } 24014 i0 := x0.AuxInt 24015 s := x0.Aux 24016 idx := x0.Args[0] 24017 p := x0.Args[1] 24018 mem := x0.Args[2] 24019 sh := v.Args[1] 24020 if sh.Op != OpS390XSLDconst { 24021 break 24022 } 24023 if sh.AuxInt != 8 { 24024 break 24025 } 24026 x1 := sh.Args[0] 24027 if x1.Op != OpS390XMOVBZloadidx { 24028 break 24029 } 24030 i1 := x1.AuxInt 24031 if x1.Aux != s { 24032 break 24033 } 24034 if idx != x1.Args[0] { 24035 break 24036 } 24037 if p != x1.Args[1] { 24038 break 24039 } 24040 if mem != x1.Args[2] { 24041 break 24042 } 24043 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24044 break 24045 } 24046 b = mergePoint(b, x0, x1) 24047 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24048 v.reset(OpCopy) 24049 v.AddArg(v0) 24050 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24051 v1.AuxInt = i0 24052 v1.Aux = s 24053 v1.AddArg(p) 24054 v1.AddArg(idx) 24055 v1.AddArg(mem) 24056 v0.AddArg(v1) 24057 return true 24058 } 24059 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 24060 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24061 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24062 for { 24063 sh := v.Args[0] 24064 if sh.Op != OpS390XSLDconst { 24065 break 24066 } 24067 if sh.AuxInt != 8 { 24068 break 24069 } 24070 x1 := sh.Args[0] 24071 if x1.Op != OpS390XMOVBZloadidx { 24072 break 24073 } 24074 i1 := x1.AuxInt 24075 s := x1.Aux 24076 p := x1.Args[0] 24077 idx := x1.Args[1] 24078 mem := x1.Args[2] 24079 x0 := v.Args[1] 24080 if x0.Op != OpS390XMOVBZloadidx { 24081 break 24082 } 24083 i0 := x0.AuxInt 24084 if x0.Aux != s { 24085 break 24086 } 24087 if p != x0.Args[0] { 24088 break 24089 } 24090 if idx != x0.Args[1] { 24091 break 24092 } 24093 if mem != x0.Args[2] { 24094 break 24095 } 24096 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24097 break 24098 } 24099 b = mergePoint(b, x0, x1) 24100 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24101 v.reset(OpCopy) 24102 v.AddArg(v0) 24103 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24104 v1.AuxInt = i0 24105 v1.Aux = s 24106 v1.AddArg(p) 24107 v1.AddArg(idx) 24108 v1.AddArg(mem) 24109 v0.AddArg(v1) 24110 return true 24111 } 24112 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 24113 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24114 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24115 for { 24116 sh := v.Args[0] 24117 if sh.Op != OpS390XSLDconst { 24118 break 24119 } 24120 if sh.AuxInt != 8 { 24121 break 24122 } 24123 x1 := sh.Args[0] 24124 if x1.Op != OpS390XMOVBZloadidx { 24125 break 24126 } 24127 i1 := x1.AuxInt 24128 s := x1.Aux 24129 idx := x1.Args[0] 24130 p := x1.Args[1] 24131 mem := x1.Args[2] 24132 x0 := v.Args[1] 24133 if x0.Op != OpS390XMOVBZloadidx { 24134 break 24135 } 24136 i0 := x0.AuxInt 24137 if x0.Aux != s { 24138 break 24139 } 24140 if p != x0.Args[0] { 24141 break 24142 } 24143 if idx != x0.Args[1] { 24144 break 24145 } 24146 if mem != x0.Args[2] { 24147 break 24148 } 24149 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24150 break 24151 } 24152 b = mergePoint(b, x0, x1) 24153 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24154 v.reset(OpCopy) 24155 v.AddArg(v0) 24156 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24157 v1.AuxInt = i0 24158 v1.Aux = s 24159 v1.AddArg(p) 24160 v1.AddArg(idx) 24161 v1.AddArg(mem) 24162 v0.AddArg(v1) 24163 return true 24164 } 24165 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 24166 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24167 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24168 for { 24169 sh := v.Args[0] 24170 if sh.Op != OpS390XSLDconst { 24171 break 24172 } 24173 if sh.AuxInt != 8 { 24174 break 24175 } 24176 x1 := sh.Args[0] 24177 if x1.Op != OpS390XMOVBZloadidx { 24178 break 24179 } 24180 i1 := x1.AuxInt 24181 s := x1.Aux 24182 p := x1.Args[0] 24183 idx := x1.Args[1] 24184 mem := x1.Args[2] 24185 x0 := v.Args[1] 24186 if x0.Op != OpS390XMOVBZloadidx { 24187 break 24188 } 24189 i0 := x0.AuxInt 24190 if x0.Aux != s { 24191 break 24192 } 24193 if idx != x0.Args[0] { 24194 break 24195 } 24196 if p != x0.Args[1] { 24197 break 24198 } 24199 if mem != x0.Args[2] { 24200 break 24201 } 24202 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24203 break 24204 } 24205 b = mergePoint(b, x0, x1) 24206 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24207 v.reset(OpCopy) 24208 v.AddArg(v0) 24209 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24210 v1.AuxInt = i0 24211 v1.Aux = s 24212 v1.AddArg(p) 24213 v1.AddArg(idx) 24214 v1.AddArg(mem) 24215 v0.AddArg(v1) 24216 return true 24217 } 24218 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 24219 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24220 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24221 for { 24222 sh := v.Args[0] 24223 if sh.Op != OpS390XSLDconst { 24224 break 24225 } 24226 if sh.AuxInt != 8 { 24227 break 24228 } 24229 x1 := sh.Args[0] 24230 if x1.Op != OpS390XMOVBZloadidx { 24231 break 24232 } 24233 i1 := x1.AuxInt 24234 s := x1.Aux 24235 idx := x1.Args[0] 24236 p := x1.Args[1] 24237 mem := x1.Args[2] 24238 x0 := v.Args[1] 24239 if x0.Op != OpS390XMOVBZloadidx { 24240 break 24241 } 24242 i0 := x0.AuxInt 24243 if x0.Aux != s { 24244 break 24245 } 24246 if idx != x0.Args[0] { 24247 break 24248 } 24249 if p != x0.Args[1] { 24250 break 24251 } 24252 if mem != x0.Args[2] { 24253 break 24254 } 24255 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24256 break 24257 } 24258 b = mergePoint(b, x0, x1) 24259 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24260 v.reset(OpCopy) 24261 v.AddArg(v0) 24262 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24263 v1.AuxInt = i0 24264 v1.Aux = s 24265 v1.AddArg(p) 24266 v1.AddArg(idx) 24267 v1.AddArg(mem) 24268 v0.AddArg(v1) 24269 return true 24270 } 24271 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 24272 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24273 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24274 for { 24275 r0 := v.Args[0] 24276 if r0.Op != OpS390XMOVHZreg { 24277 break 24278 } 24279 x0 := r0.Args[0] 24280 if x0.Op != OpS390XMOVHBRloadidx { 24281 break 24282 } 24283 i0 := x0.AuxInt 24284 s := x0.Aux 24285 p := x0.Args[0] 24286 idx := x0.Args[1] 24287 mem := x0.Args[2] 24288 sh := v.Args[1] 24289 if sh.Op != OpS390XSLDconst { 24290 break 24291 } 24292 if sh.AuxInt != 16 { 24293 break 24294 } 24295 r1 := sh.Args[0] 24296 if r1.Op != OpS390XMOVHZreg { 24297 break 24298 } 24299 x1 := r1.Args[0] 24300 if x1.Op != OpS390XMOVHBRloadidx { 24301 break 24302 } 24303 i1 := x1.AuxInt 24304 if x1.Aux != s { 24305 break 24306 } 24307 if p != x1.Args[0] { 24308 break 24309 } 24310 if idx != x1.Args[1] { 24311 break 24312 } 24313 if mem != x1.Args[2] { 24314 break 24315 } 24316 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24317 break 24318 } 24319 b = mergePoint(b, x0, x1) 24320 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24321 v.reset(OpCopy) 24322 v.AddArg(v0) 24323 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24324 v1.AuxInt = i0 24325 v1.Aux = s 24326 v1.AddArg(p) 24327 v1.AddArg(idx) 24328 v1.AddArg(mem) 24329 v0.AddArg(v1) 24330 return true 24331 } 24332 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 24333 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24334 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24335 for { 24336 r0 := v.Args[0] 24337 if r0.Op != OpS390XMOVHZreg { 24338 break 24339 } 24340 x0 := r0.Args[0] 24341 if x0.Op != OpS390XMOVHBRloadidx { 24342 break 24343 } 24344 i0 := x0.AuxInt 24345 s := x0.Aux 24346 idx := x0.Args[0] 24347 p := x0.Args[1] 24348 mem := x0.Args[2] 24349 sh := v.Args[1] 24350 if sh.Op != OpS390XSLDconst { 24351 break 24352 } 24353 if sh.AuxInt != 16 { 24354 break 24355 } 24356 r1 := sh.Args[0] 24357 if r1.Op != OpS390XMOVHZreg { 24358 break 24359 } 24360 x1 := r1.Args[0] 24361 if x1.Op != OpS390XMOVHBRloadidx { 24362 break 24363 } 24364 i1 := x1.AuxInt 24365 if x1.Aux != s { 24366 break 24367 } 24368 if p != x1.Args[0] { 24369 break 24370 } 24371 if idx != x1.Args[1] { 24372 break 24373 } 24374 if mem != x1.Args[2] { 24375 break 24376 } 24377 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24378 break 24379 } 24380 b = mergePoint(b, x0, x1) 24381 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24382 v.reset(OpCopy) 24383 v.AddArg(v0) 24384 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24385 v1.AuxInt = i0 24386 v1.Aux = s 24387 v1.AddArg(p) 24388 v1.AddArg(idx) 24389 v1.AddArg(mem) 24390 v0.AddArg(v1) 24391 return true 24392 } 24393 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 24394 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24395 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24396 for { 24397 r0 := v.Args[0] 24398 if r0.Op != OpS390XMOVHZreg { 24399 break 24400 } 24401 x0 := r0.Args[0] 24402 if x0.Op != OpS390XMOVHBRloadidx { 24403 break 24404 } 24405 i0 := x0.AuxInt 24406 s := x0.Aux 24407 p := x0.Args[0] 24408 idx := x0.Args[1] 24409 mem := x0.Args[2] 24410 sh := v.Args[1] 24411 if sh.Op != OpS390XSLDconst { 24412 break 24413 } 24414 if sh.AuxInt != 16 { 24415 break 24416 } 24417 r1 := sh.Args[0] 24418 if r1.Op != OpS390XMOVHZreg { 24419 break 24420 } 24421 x1 := r1.Args[0] 24422 if x1.Op != OpS390XMOVHBRloadidx { 24423 break 24424 } 24425 i1 := x1.AuxInt 24426 if x1.Aux != s { 24427 break 24428 } 24429 if idx != x1.Args[0] { 24430 break 24431 } 24432 if p != x1.Args[1] { 24433 break 24434 } 24435 if mem != x1.Args[2] { 24436 break 24437 } 24438 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24439 break 24440 } 24441 b = mergePoint(b, x0, x1) 24442 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24443 v.reset(OpCopy) 24444 v.AddArg(v0) 24445 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24446 v1.AuxInt = i0 24447 v1.Aux = s 24448 v1.AddArg(p) 24449 v1.AddArg(idx) 24450 v1.AddArg(mem) 24451 v0.AddArg(v1) 24452 return true 24453 } 24454 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 24455 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24456 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24457 for { 24458 r0 := v.Args[0] 24459 if r0.Op != OpS390XMOVHZreg { 24460 break 24461 } 24462 x0 := r0.Args[0] 24463 if x0.Op != OpS390XMOVHBRloadidx { 24464 break 24465 } 24466 i0 := x0.AuxInt 24467 s := x0.Aux 24468 idx := x0.Args[0] 24469 p := x0.Args[1] 24470 mem := x0.Args[2] 24471 sh := v.Args[1] 24472 if sh.Op != OpS390XSLDconst { 24473 break 24474 } 24475 if sh.AuxInt != 16 { 24476 break 24477 } 24478 r1 := sh.Args[0] 24479 if r1.Op != OpS390XMOVHZreg { 24480 break 24481 } 24482 x1 := r1.Args[0] 24483 if x1.Op != OpS390XMOVHBRloadidx { 24484 break 24485 } 24486 i1 := x1.AuxInt 24487 if x1.Aux != s { 24488 break 24489 } 24490 if idx != x1.Args[0] { 24491 break 24492 } 24493 if p != x1.Args[1] { 24494 break 24495 } 24496 if mem != x1.Args[2] { 24497 break 24498 } 24499 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24500 break 24501 } 24502 b = mergePoint(b, x0, x1) 24503 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24504 v.reset(OpCopy) 24505 v.AddArg(v0) 24506 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24507 v1.AuxInt = i0 24508 v1.Aux = s 24509 v1.AddArg(p) 24510 v1.AddArg(idx) 24511 v1.AddArg(mem) 24512 v0.AddArg(v1) 24513 return true 24514 } 24515 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 24516 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24517 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24518 for { 24519 sh := v.Args[0] 24520 if sh.Op != OpS390XSLDconst { 24521 break 24522 } 24523 if sh.AuxInt != 16 { 24524 break 24525 } 24526 r1 := sh.Args[0] 24527 if r1.Op != OpS390XMOVHZreg { 24528 break 24529 } 24530 x1 := r1.Args[0] 24531 if x1.Op != OpS390XMOVHBRloadidx { 24532 break 24533 } 24534 i1 := x1.AuxInt 24535 s := x1.Aux 24536 p := x1.Args[0] 24537 idx := x1.Args[1] 24538 mem := x1.Args[2] 24539 r0 := v.Args[1] 24540 if r0.Op != OpS390XMOVHZreg { 24541 break 24542 } 24543 x0 := r0.Args[0] 24544 if x0.Op != OpS390XMOVHBRloadidx { 24545 break 24546 } 24547 i0 := x0.AuxInt 24548 if x0.Aux != s { 24549 break 24550 } 24551 if p != x0.Args[0] { 24552 break 24553 } 24554 if idx != x0.Args[1] { 24555 break 24556 } 24557 if mem != x0.Args[2] { 24558 break 24559 } 24560 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24561 break 24562 } 24563 b = mergePoint(b, x0, x1) 24564 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24565 v.reset(OpCopy) 24566 v.AddArg(v0) 24567 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24568 v1.AuxInt = i0 24569 v1.Aux = s 24570 v1.AddArg(p) 24571 v1.AddArg(idx) 24572 v1.AddArg(mem) 24573 v0.AddArg(v1) 24574 return true 24575 } 24576 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 24577 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24578 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24579 for { 24580 sh := v.Args[0] 24581 if sh.Op != OpS390XSLDconst { 24582 break 24583 } 24584 if sh.AuxInt != 16 { 24585 break 24586 } 24587 r1 := sh.Args[0] 24588 if r1.Op != OpS390XMOVHZreg { 24589 break 24590 } 24591 x1 := r1.Args[0] 24592 if x1.Op != OpS390XMOVHBRloadidx { 24593 break 24594 } 24595 i1 := x1.AuxInt 24596 s := x1.Aux 24597 idx := x1.Args[0] 24598 p := x1.Args[1] 24599 mem := x1.Args[2] 24600 r0 := v.Args[1] 24601 if r0.Op != OpS390XMOVHZreg { 24602 break 24603 } 24604 x0 := r0.Args[0] 24605 if x0.Op != OpS390XMOVHBRloadidx { 24606 break 24607 } 24608 i0 := x0.AuxInt 24609 if x0.Aux != s { 24610 break 24611 } 24612 if p != x0.Args[0] { 24613 break 24614 } 24615 if idx != x0.Args[1] { 24616 break 24617 } 24618 if mem != x0.Args[2] { 24619 break 24620 } 24621 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24622 break 24623 } 24624 b = mergePoint(b, x0, x1) 24625 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24626 v.reset(OpCopy) 24627 v.AddArg(v0) 24628 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24629 v1.AuxInt = i0 24630 v1.Aux = s 24631 v1.AddArg(p) 24632 v1.AddArg(idx) 24633 v1.AddArg(mem) 24634 v0.AddArg(v1) 24635 return true 24636 } 24637 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 24638 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24639 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24640 for { 24641 sh := v.Args[0] 24642 if sh.Op != OpS390XSLDconst { 24643 break 24644 } 24645 if sh.AuxInt != 16 { 24646 break 24647 } 24648 r1 := sh.Args[0] 24649 if r1.Op != OpS390XMOVHZreg { 24650 break 24651 } 24652 x1 := r1.Args[0] 24653 if x1.Op != OpS390XMOVHBRloadidx { 24654 break 24655 } 24656 i1 := x1.AuxInt 24657 s := x1.Aux 24658 p := x1.Args[0] 24659 idx := x1.Args[1] 24660 mem := x1.Args[2] 24661 r0 := v.Args[1] 24662 if r0.Op != OpS390XMOVHZreg { 24663 break 24664 } 24665 x0 := r0.Args[0] 24666 if x0.Op != OpS390XMOVHBRloadidx { 24667 break 24668 } 24669 i0 := x0.AuxInt 24670 if x0.Aux != s { 24671 break 24672 } 24673 if idx != x0.Args[0] { 24674 break 24675 } 24676 if p != x0.Args[1] { 24677 break 24678 } 24679 if mem != x0.Args[2] { 24680 break 24681 } 24682 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24683 break 24684 } 24685 b = mergePoint(b, x0, x1) 24686 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24687 v.reset(OpCopy) 24688 v.AddArg(v0) 24689 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24690 v1.AuxInt = i0 24691 v1.Aux = s 24692 v1.AddArg(p) 24693 v1.AddArg(idx) 24694 v1.AddArg(mem) 24695 v0.AddArg(v1) 24696 return true 24697 } 24698 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 24699 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24700 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24701 for { 24702 sh := v.Args[0] 24703 if sh.Op != OpS390XSLDconst { 24704 break 24705 } 24706 if sh.AuxInt != 16 { 24707 break 24708 } 24709 r1 := sh.Args[0] 24710 if r1.Op != OpS390XMOVHZreg { 24711 break 24712 } 24713 x1 := r1.Args[0] 24714 if x1.Op != OpS390XMOVHBRloadidx { 24715 break 24716 } 24717 i1 := x1.AuxInt 24718 s := x1.Aux 24719 idx := x1.Args[0] 24720 p := x1.Args[1] 24721 mem := x1.Args[2] 24722 r0 := v.Args[1] 24723 if r0.Op != OpS390XMOVHZreg { 24724 break 24725 } 24726 x0 := r0.Args[0] 24727 if x0.Op != OpS390XMOVHBRloadidx { 24728 break 24729 } 24730 i0 := x0.AuxInt 24731 if x0.Aux != s { 24732 break 24733 } 24734 if idx != x0.Args[0] { 24735 break 24736 } 24737 if p != x0.Args[1] { 24738 break 24739 } 24740 if mem != x0.Args[2] { 24741 break 24742 } 24743 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24744 break 24745 } 24746 b = mergePoint(b, x0, x1) 24747 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24748 v.reset(OpCopy) 24749 v.AddArg(v0) 24750 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24751 v1.AuxInt = i0 24752 v1.Aux = s 24753 v1.AddArg(p) 24754 v1.AddArg(idx) 24755 v1.AddArg(mem) 24756 v0.AddArg(v1) 24757 return true 24758 } 24759 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 24760 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24761 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24762 for { 24763 r0 := v.Args[0] 24764 if r0.Op != OpS390XMOVWZreg { 24765 break 24766 } 24767 x0 := r0.Args[0] 24768 if x0.Op != OpS390XMOVWBRloadidx { 24769 break 24770 } 24771 i0 := x0.AuxInt 24772 s := x0.Aux 24773 p := x0.Args[0] 24774 idx := x0.Args[1] 24775 mem := x0.Args[2] 24776 sh := v.Args[1] 24777 if sh.Op != OpS390XSLDconst { 24778 break 24779 } 24780 if sh.AuxInt != 32 { 24781 break 24782 } 24783 r1 := sh.Args[0] 24784 if r1.Op != OpS390XMOVWZreg { 24785 break 24786 } 24787 x1 := r1.Args[0] 24788 if x1.Op != OpS390XMOVWBRloadidx { 24789 break 24790 } 24791 i1 := x1.AuxInt 24792 if x1.Aux != s { 24793 break 24794 } 24795 if p != x1.Args[0] { 24796 break 24797 } 24798 if idx != x1.Args[1] { 24799 break 24800 } 24801 if mem != x1.Args[2] { 24802 break 24803 } 24804 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24805 break 24806 } 24807 b = mergePoint(b, x0, x1) 24808 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 24809 v.reset(OpCopy) 24810 v.AddArg(v0) 24811 v0.AuxInt = i0 24812 v0.Aux = s 24813 v0.AddArg(p) 24814 v0.AddArg(idx) 24815 v0.AddArg(mem) 24816 return true 24817 } 24818 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 24819 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24820 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24821 for { 24822 r0 := v.Args[0] 24823 if r0.Op != OpS390XMOVWZreg { 24824 break 24825 } 24826 x0 := r0.Args[0] 24827 if x0.Op != OpS390XMOVWBRloadidx { 24828 break 24829 } 24830 i0 := x0.AuxInt 24831 s := x0.Aux 24832 idx := x0.Args[0] 24833 p := x0.Args[1] 24834 mem := x0.Args[2] 24835 sh := v.Args[1] 24836 if sh.Op != OpS390XSLDconst { 24837 break 24838 } 24839 if sh.AuxInt != 32 { 24840 break 24841 } 24842 r1 := sh.Args[0] 24843 if r1.Op != OpS390XMOVWZreg { 24844 break 24845 } 24846 x1 := r1.Args[0] 24847 if x1.Op != OpS390XMOVWBRloadidx { 24848 break 24849 } 24850 i1 := x1.AuxInt 24851 if x1.Aux != s { 24852 break 24853 } 24854 if p != x1.Args[0] { 24855 break 24856 } 24857 if idx != x1.Args[1] { 24858 break 24859 } 24860 if mem != x1.Args[2] { 24861 break 24862 } 24863 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24864 break 24865 } 24866 b = mergePoint(b, x0, x1) 24867 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 24868 v.reset(OpCopy) 24869 v.AddArg(v0) 24870 v0.AuxInt = i0 24871 v0.Aux = s 24872 v0.AddArg(p) 24873 v0.AddArg(idx) 24874 v0.AddArg(mem) 24875 return true 24876 } 24877 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 24878 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24879 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24880 for { 24881 r0 := v.Args[0] 24882 if r0.Op != OpS390XMOVWZreg { 24883 break 24884 } 24885 x0 := r0.Args[0] 24886 if x0.Op != OpS390XMOVWBRloadidx { 24887 break 24888 } 24889 i0 := x0.AuxInt 24890 s := x0.Aux 24891 p := x0.Args[0] 24892 idx := x0.Args[1] 24893 mem := x0.Args[2] 24894 sh := v.Args[1] 24895 if sh.Op != OpS390XSLDconst { 24896 break 24897 } 24898 if sh.AuxInt != 32 { 24899 break 24900 } 24901 r1 := sh.Args[0] 24902 if r1.Op != OpS390XMOVWZreg { 24903 break 24904 } 24905 x1 := r1.Args[0] 24906 if x1.Op != OpS390XMOVWBRloadidx { 24907 break 24908 } 24909 i1 := x1.AuxInt 24910 if x1.Aux != s { 24911 break 24912 } 24913 if idx != x1.Args[0] { 24914 break 24915 } 24916 if p != x1.Args[1] { 24917 break 24918 } 24919 if mem != x1.Args[2] { 24920 break 24921 } 24922 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24923 break 24924 } 24925 b = mergePoint(b, x0, x1) 24926 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 24927 v.reset(OpCopy) 24928 v.AddArg(v0) 24929 v0.AuxInt = i0 24930 v0.Aux = s 24931 v0.AddArg(p) 24932 v0.AddArg(idx) 24933 v0.AddArg(mem) 24934 return true 24935 } 24936 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 24937 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24938 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24939 for { 24940 r0 := v.Args[0] 24941 if r0.Op != OpS390XMOVWZreg { 24942 break 24943 } 24944 x0 := r0.Args[0] 24945 if x0.Op != OpS390XMOVWBRloadidx { 24946 break 24947 } 24948 i0 := x0.AuxInt 24949 s := x0.Aux 24950 idx := x0.Args[0] 24951 p := x0.Args[1] 24952 mem := x0.Args[2] 24953 sh := v.Args[1] 24954 if sh.Op != OpS390XSLDconst { 24955 break 24956 } 24957 if sh.AuxInt != 32 { 24958 break 24959 } 24960 r1 := sh.Args[0] 24961 if r1.Op != OpS390XMOVWZreg { 24962 break 24963 } 24964 x1 := r1.Args[0] 24965 if x1.Op != OpS390XMOVWBRloadidx { 24966 break 24967 } 24968 i1 := x1.AuxInt 24969 if x1.Aux != s { 24970 break 24971 } 24972 if idx != x1.Args[0] { 24973 break 24974 } 24975 if p != x1.Args[1] { 24976 break 24977 } 24978 if mem != x1.Args[2] { 24979 break 24980 } 24981 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24982 break 24983 } 24984 b = mergePoint(b, x0, x1) 24985 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 24986 v.reset(OpCopy) 24987 v.AddArg(v0) 24988 v0.AuxInt = i0 24989 v0.Aux = s 24990 v0.AddArg(p) 24991 v0.AddArg(idx) 24992 v0.AddArg(mem) 24993 return true 24994 } 24995 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 24996 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24997 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24998 for { 24999 sh := v.Args[0] 25000 if sh.Op != OpS390XSLDconst { 25001 break 25002 } 25003 if sh.AuxInt != 32 { 25004 break 25005 } 25006 r1 := sh.Args[0] 25007 if r1.Op != OpS390XMOVWZreg { 25008 break 25009 } 25010 x1 := r1.Args[0] 25011 if x1.Op != OpS390XMOVWBRloadidx { 25012 break 25013 } 25014 i1 := x1.AuxInt 25015 s := x1.Aux 25016 p := x1.Args[0] 25017 idx := x1.Args[1] 25018 mem := x1.Args[2] 25019 r0 := v.Args[1] 25020 if r0.Op != OpS390XMOVWZreg { 25021 break 25022 } 25023 x0 := r0.Args[0] 25024 if x0.Op != OpS390XMOVWBRloadidx { 25025 break 25026 } 25027 i0 := x0.AuxInt 25028 if x0.Aux != s { 25029 break 25030 } 25031 if p != x0.Args[0] { 25032 break 25033 } 25034 if idx != x0.Args[1] { 25035 break 25036 } 25037 if mem != x0.Args[2] { 25038 break 25039 } 25040 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25041 break 25042 } 25043 b = mergePoint(b, x0, x1) 25044 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25045 v.reset(OpCopy) 25046 v.AddArg(v0) 25047 v0.AuxInt = i0 25048 v0.Aux = s 25049 v0.AddArg(p) 25050 v0.AddArg(idx) 25051 v0.AddArg(mem) 25052 return true 25053 } 25054 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 25055 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25056 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25057 for { 25058 sh := v.Args[0] 25059 if sh.Op != OpS390XSLDconst { 25060 break 25061 } 25062 if sh.AuxInt != 32 { 25063 break 25064 } 25065 r1 := sh.Args[0] 25066 if r1.Op != OpS390XMOVWZreg { 25067 break 25068 } 25069 x1 := r1.Args[0] 25070 if x1.Op != OpS390XMOVWBRloadidx { 25071 break 25072 } 25073 i1 := x1.AuxInt 25074 s := x1.Aux 25075 idx := x1.Args[0] 25076 p := x1.Args[1] 25077 mem := x1.Args[2] 25078 r0 := v.Args[1] 25079 if r0.Op != OpS390XMOVWZreg { 25080 break 25081 } 25082 x0 := r0.Args[0] 25083 if x0.Op != OpS390XMOVWBRloadidx { 25084 break 25085 } 25086 i0 := x0.AuxInt 25087 if x0.Aux != s { 25088 break 25089 } 25090 if p != x0.Args[0] { 25091 break 25092 } 25093 if idx != x0.Args[1] { 25094 break 25095 } 25096 if mem != x0.Args[2] { 25097 break 25098 } 25099 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25100 break 25101 } 25102 b = mergePoint(b, x0, x1) 25103 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25104 v.reset(OpCopy) 25105 v.AddArg(v0) 25106 v0.AuxInt = i0 25107 v0.Aux = s 25108 v0.AddArg(p) 25109 v0.AddArg(idx) 25110 v0.AddArg(mem) 25111 return true 25112 } 25113 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 25114 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25115 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25116 for { 25117 sh := v.Args[0] 25118 if sh.Op != OpS390XSLDconst { 25119 break 25120 } 25121 if sh.AuxInt != 32 { 25122 break 25123 } 25124 r1 := sh.Args[0] 25125 if r1.Op != OpS390XMOVWZreg { 25126 break 25127 } 25128 x1 := r1.Args[0] 25129 if x1.Op != OpS390XMOVWBRloadidx { 25130 break 25131 } 25132 i1 := x1.AuxInt 25133 s := x1.Aux 25134 p := x1.Args[0] 25135 idx := x1.Args[1] 25136 mem := x1.Args[2] 25137 r0 := v.Args[1] 25138 if r0.Op != OpS390XMOVWZreg { 25139 break 25140 } 25141 x0 := r0.Args[0] 25142 if x0.Op != OpS390XMOVWBRloadidx { 25143 break 25144 } 25145 i0 := x0.AuxInt 25146 if x0.Aux != s { 25147 break 25148 } 25149 if idx != x0.Args[0] { 25150 break 25151 } 25152 if p != x0.Args[1] { 25153 break 25154 } 25155 if mem != x0.Args[2] { 25156 break 25157 } 25158 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25159 break 25160 } 25161 b = mergePoint(b, x0, x1) 25162 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25163 v.reset(OpCopy) 25164 v.AddArg(v0) 25165 v0.AuxInt = i0 25166 v0.Aux = s 25167 v0.AddArg(p) 25168 v0.AddArg(idx) 25169 v0.AddArg(mem) 25170 return true 25171 } 25172 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 25173 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25174 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25175 for { 25176 sh := v.Args[0] 25177 if sh.Op != OpS390XSLDconst { 25178 break 25179 } 25180 if sh.AuxInt != 32 { 25181 break 25182 } 25183 r1 := sh.Args[0] 25184 if r1.Op != OpS390XMOVWZreg { 25185 break 25186 } 25187 x1 := r1.Args[0] 25188 if x1.Op != OpS390XMOVWBRloadidx { 25189 break 25190 } 25191 i1 := x1.AuxInt 25192 s := x1.Aux 25193 idx := x1.Args[0] 25194 p := x1.Args[1] 25195 mem := x1.Args[2] 25196 r0 := v.Args[1] 25197 if r0.Op != OpS390XMOVWZreg { 25198 break 25199 } 25200 x0 := r0.Args[0] 25201 if x0.Op != OpS390XMOVWBRloadidx { 25202 break 25203 } 25204 i0 := x0.AuxInt 25205 if x0.Aux != s { 25206 break 25207 } 25208 if idx != x0.Args[0] { 25209 break 25210 } 25211 if p != x0.Args[1] { 25212 break 25213 } 25214 if mem != x0.Args[2] { 25215 break 25216 } 25217 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25218 break 25219 } 25220 b = mergePoint(b, x0, x1) 25221 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25222 v.reset(OpCopy) 25223 v.AddArg(v0) 25224 v0.AuxInt = i0 25225 v0.Aux = s 25226 v0.AddArg(p) 25227 v0.AddArg(idx) 25228 v0.AddArg(mem) 25229 return true 25230 } 25231 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 25232 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25233 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25234 for { 25235 s1 := v.Args[0] 25236 if s1.Op != OpS390XSLDconst { 25237 break 25238 } 25239 j1 := s1.AuxInt 25240 x1 := s1.Args[0] 25241 if x1.Op != OpS390XMOVBZloadidx { 25242 break 25243 } 25244 i1 := x1.AuxInt 25245 s := x1.Aux 25246 p := x1.Args[0] 25247 idx := x1.Args[1] 25248 mem := x1.Args[2] 25249 or := v.Args[1] 25250 if or.Op != OpS390XOR { 25251 break 25252 } 25253 s0 := or.Args[0] 25254 if s0.Op != OpS390XSLDconst { 25255 break 25256 } 25257 j0 := s0.AuxInt 25258 x0 := s0.Args[0] 25259 if x0.Op != OpS390XMOVBZloadidx { 25260 break 25261 } 25262 i0 := x0.AuxInt 25263 if x0.Aux != s { 25264 break 25265 } 25266 if p != x0.Args[0] { 25267 break 25268 } 25269 if idx != x0.Args[1] { 25270 break 25271 } 25272 if mem != x0.Args[2] { 25273 break 25274 } 25275 y := or.Args[1] 25276 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25277 break 25278 } 25279 b = mergePoint(b, x0, x1) 25280 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25281 v.reset(OpCopy) 25282 v.AddArg(v0) 25283 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25284 v1.AuxInt = j0 25285 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25286 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25287 v3.AuxInt = i0 25288 v3.Aux = s 25289 v3.AddArg(p) 25290 v3.AddArg(idx) 25291 v3.AddArg(mem) 25292 v2.AddArg(v3) 25293 v1.AddArg(v2) 25294 v0.AddArg(v1) 25295 v0.AddArg(y) 25296 return true 25297 } 25298 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 25299 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25300 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25301 for { 25302 s1 := v.Args[0] 25303 if s1.Op != OpS390XSLDconst { 25304 break 25305 } 25306 j1 := s1.AuxInt 25307 x1 := s1.Args[0] 25308 if x1.Op != OpS390XMOVBZloadidx { 25309 break 25310 } 25311 i1 := x1.AuxInt 25312 s := x1.Aux 25313 idx := x1.Args[0] 25314 p := x1.Args[1] 25315 mem := x1.Args[2] 25316 or := v.Args[1] 25317 if or.Op != OpS390XOR { 25318 break 25319 } 25320 s0 := or.Args[0] 25321 if s0.Op != OpS390XSLDconst { 25322 break 25323 } 25324 j0 := s0.AuxInt 25325 x0 := s0.Args[0] 25326 if x0.Op != OpS390XMOVBZloadidx { 25327 break 25328 } 25329 i0 := x0.AuxInt 25330 if x0.Aux != s { 25331 break 25332 } 25333 if p != x0.Args[0] { 25334 break 25335 } 25336 if idx != x0.Args[1] { 25337 break 25338 } 25339 if mem != x0.Args[2] { 25340 break 25341 } 25342 y := or.Args[1] 25343 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25344 break 25345 } 25346 b = mergePoint(b, x0, x1) 25347 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25348 v.reset(OpCopy) 25349 v.AddArg(v0) 25350 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25351 v1.AuxInt = j0 25352 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25353 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25354 v3.AuxInt = i0 25355 v3.Aux = s 25356 v3.AddArg(p) 25357 v3.AddArg(idx) 25358 v3.AddArg(mem) 25359 v2.AddArg(v3) 25360 v1.AddArg(v2) 25361 v0.AddArg(v1) 25362 v0.AddArg(y) 25363 return true 25364 } 25365 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 25366 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25367 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25368 for { 25369 s1 := v.Args[0] 25370 if s1.Op != OpS390XSLDconst { 25371 break 25372 } 25373 j1 := s1.AuxInt 25374 x1 := s1.Args[0] 25375 if x1.Op != OpS390XMOVBZloadidx { 25376 break 25377 } 25378 i1 := x1.AuxInt 25379 s := x1.Aux 25380 p := x1.Args[0] 25381 idx := x1.Args[1] 25382 mem := x1.Args[2] 25383 or := v.Args[1] 25384 if or.Op != OpS390XOR { 25385 break 25386 } 25387 s0 := or.Args[0] 25388 if s0.Op != OpS390XSLDconst { 25389 break 25390 } 25391 j0 := s0.AuxInt 25392 x0 := s0.Args[0] 25393 if x0.Op != OpS390XMOVBZloadidx { 25394 break 25395 } 25396 i0 := x0.AuxInt 25397 if x0.Aux != s { 25398 break 25399 } 25400 if idx != x0.Args[0] { 25401 break 25402 } 25403 if p != x0.Args[1] { 25404 break 25405 } 25406 if mem != x0.Args[2] { 25407 break 25408 } 25409 y := or.Args[1] 25410 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25411 break 25412 } 25413 b = mergePoint(b, x0, x1) 25414 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25415 v.reset(OpCopy) 25416 v.AddArg(v0) 25417 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25418 v1.AuxInt = j0 25419 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25420 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25421 v3.AuxInt = i0 25422 v3.Aux = s 25423 v3.AddArg(p) 25424 v3.AddArg(idx) 25425 v3.AddArg(mem) 25426 v2.AddArg(v3) 25427 v1.AddArg(v2) 25428 v0.AddArg(v1) 25429 v0.AddArg(y) 25430 return true 25431 } 25432 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 25433 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25434 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25435 for { 25436 s1 := v.Args[0] 25437 if s1.Op != OpS390XSLDconst { 25438 break 25439 } 25440 j1 := s1.AuxInt 25441 x1 := s1.Args[0] 25442 if x1.Op != OpS390XMOVBZloadidx { 25443 break 25444 } 25445 i1 := x1.AuxInt 25446 s := x1.Aux 25447 idx := x1.Args[0] 25448 p := x1.Args[1] 25449 mem := x1.Args[2] 25450 or := v.Args[1] 25451 if or.Op != OpS390XOR { 25452 break 25453 } 25454 s0 := or.Args[0] 25455 if s0.Op != OpS390XSLDconst { 25456 break 25457 } 25458 j0 := s0.AuxInt 25459 x0 := s0.Args[0] 25460 if x0.Op != OpS390XMOVBZloadidx { 25461 break 25462 } 25463 i0 := x0.AuxInt 25464 if x0.Aux != s { 25465 break 25466 } 25467 if idx != x0.Args[0] { 25468 break 25469 } 25470 if p != x0.Args[1] { 25471 break 25472 } 25473 if mem != x0.Args[2] { 25474 break 25475 } 25476 y := or.Args[1] 25477 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25478 break 25479 } 25480 b = mergePoint(b, x0, x1) 25481 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25482 v.reset(OpCopy) 25483 v.AddArg(v0) 25484 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25485 v1.AuxInt = j0 25486 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25487 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25488 v3.AuxInt = i0 25489 v3.Aux = s 25490 v3.AddArg(p) 25491 v3.AddArg(idx) 25492 v3.AddArg(mem) 25493 v2.AddArg(v3) 25494 v1.AddArg(v2) 25495 v0.AddArg(v1) 25496 v0.AddArg(y) 25497 return true 25498 } 25499 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 25500 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25501 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25502 for { 25503 s1 := v.Args[0] 25504 if s1.Op != OpS390XSLDconst { 25505 break 25506 } 25507 j1 := s1.AuxInt 25508 x1 := s1.Args[0] 25509 if x1.Op != OpS390XMOVBZloadidx { 25510 break 25511 } 25512 i1 := x1.AuxInt 25513 s := x1.Aux 25514 p := x1.Args[0] 25515 idx := x1.Args[1] 25516 mem := x1.Args[2] 25517 or := v.Args[1] 25518 if or.Op != OpS390XOR { 25519 break 25520 } 25521 y := or.Args[0] 25522 s0 := or.Args[1] 25523 if s0.Op != OpS390XSLDconst { 25524 break 25525 } 25526 j0 := s0.AuxInt 25527 x0 := s0.Args[0] 25528 if x0.Op != OpS390XMOVBZloadidx { 25529 break 25530 } 25531 i0 := x0.AuxInt 25532 if x0.Aux != s { 25533 break 25534 } 25535 if p != x0.Args[0] { 25536 break 25537 } 25538 if idx != x0.Args[1] { 25539 break 25540 } 25541 if mem != x0.Args[2] { 25542 break 25543 } 25544 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25545 break 25546 } 25547 b = mergePoint(b, x0, x1) 25548 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25549 v.reset(OpCopy) 25550 v.AddArg(v0) 25551 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25552 v1.AuxInt = j0 25553 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25554 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25555 v3.AuxInt = i0 25556 v3.Aux = s 25557 v3.AddArg(p) 25558 v3.AddArg(idx) 25559 v3.AddArg(mem) 25560 v2.AddArg(v3) 25561 v1.AddArg(v2) 25562 v0.AddArg(v1) 25563 v0.AddArg(y) 25564 return true 25565 } 25566 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 25567 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25568 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25569 for { 25570 s1 := v.Args[0] 25571 if s1.Op != OpS390XSLDconst { 25572 break 25573 } 25574 j1 := s1.AuxInt 25575 x1 := s1.Args[0] 25576 if x1.Op != OpS390XMOVBZloadidx { 25577 break 25578 } 25579 i1 := x1.AuxInt 25580 s := x1.Aux 25581 idx := x1.Args[0] 25582 p := x1.Args[1] 25583 mem := x1.Args[2] 25584 or := v.Args[1] 25585 if or.Op != OpS390XOR { 25586 break 25587 } 25588 y := or.Args[0] 25589 s0 := or.Args[1] 25590 if s0.Op != OpS390XSLDconst { 25591 break 25592 } 25593 j0 := s0.AuxInt 25594 x0 := s0.Args[0] 25595 if x0.Op != OpS390XMOVBZloadidx { 25596 break 25597 } 25598 i0 := x0.AuxInt 25599 if x0.Aux != s { 25600 break 25601 } 25602 if p != x0.Args[0] { 25603 break 25604 } 25605 if idx != x0.Args[1] { 25606 break 25607 } 25608 if mem != x0.Args[2] { 25609 break 25610 } 25611 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25612 break 25613 } 25614 b = mergePoint(b, x0, x1) 25615 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25616 v.reset(OpCopy) 25617 v.AddArg(v0) 25618 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25619 v1.AuxInt = j0 25620 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25621 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25622 v3.AuxInt = i0 25623 v3.Aux = s 25624 v3.AddArg(p) 25625 v3.AddArg(idx) 25626 v3.AddArg(mem) 25627 v2.AddArg(v3) 25628 v1.AddArg(v2) 25629 v0.AddArg(v1) 25630 v0.AddArg(y) 25631 return true 25632 } 25633 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 25634 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25635 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25636 for { 25637 s1 := v.Args[0] 25638 if s1.Op != OpS390XSLDconst { 25639 break 25640 } 25641 j1 := s1.AuxInt 25642 x1 := s1.Args[0] 25643 if x1.Op != OpS390XMOVBZloadidx { 25644 break 25645 } 25646 i1 := x1.AuxInt 25647 s := x1.Aux 25648 p := x1.Args[0] 25649 idx := x1.Args[1] 25650 mem := x1.Args[2] 25651 or := v.Args[1] 25652 if or.Op != OpS390XOR { 25653 break 25654 } 25655 y := or.Args[0] 25656 s0 := or.Args[1] 25657 if s0.Op != OpS390XSLDconst { 25658 break 25659 } 25660 j0 := s0.AuxInt 25661 x0 := s0.Args[0] 25662 if x0.Op != OpS390XMOVBZloadidx { 25663 break 25664 } 25665 i0 := x0.AuxInt 25666 if x0.Aux != s { 25667 break 25668 } 25669 if idx != x0.Args[0] { 25670 break 25671 } 25672 if p != x0.Args[1] { 25673 break 25674 } 25675 if mem != x0.Args[2] { 25676 break 25677 } 25678 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25679 break 25680 } 25681 b = mergePoint(b, x0, x1) 25682 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25683 v.reset(OpCopy) 25684 v.AddArg(v0) 25685 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25686 v1.AuxInt = j0 25687 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25688 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25689 v3.AuxInt = i0 25690 v3.Aux = s 25691 v3.AddArg(p) 25692 v3.AddArg(idx) 25693 v3.AddArg(mem) 25694 v2.AddArg(v3) 25695 v1.AddArg(v2) 25696 v0.AddArg(v1) 25697 v0.AddArg(y) 25698 return true 25699 } 25700 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 25701 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25702 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25703 for { 25704 s1 := v.Args[0] 25705 if s1.Op != OpS390XSLDconst { 25706 break 25707 } 25708 j1 := s1.AuxInt 25709 x1 := s1.Args[0] 25710 if x1.Op != OpS390XMOVBZloadidx { 25711 break 25712 } 25713 i1 := x1.AuxInt 25714 s := x1.Aux 25715 idx := x1.Args[0] 25716 p := x1.Args[1] 25717 mem := x1.Args[2] 25718 or := v.Args[1] 25719 if or.Op != OpS390XOR { 25720 break 25721 } 25722 y := or.Args[0] 25723 s0 := or.Args[1] 25724 if s0.Op != OpS390XSLDconst { 25725 break 25726 } 25727 j0 := s0.AuxInt 25728 x0 := s0.Args[0] 25729 if x0.Op != OpS390XMOVBZloadidx { 25730 break 25731 } 25732 i0 := x0.AuxInt 25733 if x0.Aux != s { 25734 break 25735 } 25736 if idx != x0.Args[0] { 25737 break 25738 } 25739 if p != x0.Args[1] { 25740 break 25741 } 25742 if mem != x0.Args[2] { 25743 break 25744 } 25745 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25746 break 25747 } 25748 b = mergePoint(b, x0, x1) 25749 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25750 v.reset(OpCopy) 25751 v.AddArg(v0) 25752 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25753 v1.AuxInt = j0 25754 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25755 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25756 v3.AuxInt = i0 25757 v3.Aux = s 25758 v3.AddArg(p) 25759 v3.AddArg(idx) 25760 v3.AddArg(mem) 25761 v2.AddArg(v3) 25762 v1.AddArg(v2) 25763 v0.AddArg(v1) 25764 v0.AddArg(y) 25765 return true 25766 } 25767 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25768 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25769 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25770 for { 25771 or := v.Args[0] 25772 if or.Op != OpS390XOR { 25773 break 25774 } 25775 s0 := or.Args[0] 25776 if s0.Op != OpS390XSLDconst { 25777 break 25778 } 25779 j0 := s0.AuxInt 25780 x0 := s0.Args[0] 25781 if x0.Op != OpS390XMOVBZloadidx { 25782 break 25783 } 25784 i0 := x0.AuxInt 25785 s := x0.Aux 25786 p := x0.Args[0] 25787 idx := x0.Args[1] 25788 mem := x0.Args[2] 25789 y := or.Args[1] 25790 s1 := v.Args[1] 25791 if s1.Op != OpS390XSLDconst { 25792 break 25793 } 25794 j1 := s1.AuxInt 25795 x1 := s1.Args[0] 25796 if x1.Op != OpS390XMOVBZloadidx { 25797 break 25798 } 25799 i1 := x1.AuxInt 25800 if x1.Aux != s { 25801 break 25802 } 25803 if p != x1.Args[0] { 25804 break 25805 } 25806 if idx != x1.Args[1] { 25807 break 25808 } 25809 if mem != x1.Args[2] { 25810 break 25811 } 25812 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25813 break 25814 } 25815 b = mergePoint(b, x0, x1) 25816 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25817 v.reset(OpCopy) 25818 v.AddArg(v0) 25819 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25820 v1.AuxInt = j0 25821 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25822 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25823 v3.AuxInt = i0 25824 v3.Aux = s 25825 v3.AddArg(p) 25826 v3.AddArg(idx) 25827 v3.AddArg(mem) 25828 v2.AddArg(v3) 25829 v1.AddArg(v2) 25830 v0.AddArg(v1) 25831 v0.AddArg(y) 25832 return true 25833 } 25834 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25835 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25836 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25837 for { 25838 or := v.Args[0] 25839 if or.Op != OpS390XOR { 25840 break 25841 } 25842 s0 := or.Args[0] 25843 if s0.Op != OpS390XSLDconst { 25844 break 25845 } 25846 j0 := s0.AuxInt 25847 x0 := s0.Args[0] 25848 if x0.Op != OpS390XMOVBZloadidx { 25849 break 25850 } 25851 i0 := x0.AuxInt 25852 s := x0.Aux 25853 idx := x0.Args[0] 25854 p := x0.Args[1] 25855 mem := x0.Args[2] 25856 y := or.Args[1] 25857 s1 := v.Args[1] 25858 if s1.Op != OpS390XSLDconst { 25859 break 25860 } 25861 j1 := s1.AuxInt 25862 x1 := s1.Args[0] 25863 if x1.Op != OpS390XMOVBZloadidx { 25864 break 25865 } 25866 i1 := x1.AuxInt 25867 if x1.Aux != s { 25868 break 25869 } 25870 if p != x1.Args[0] { 25871 break 25872 } 25873 if idx != x1.Args[1] { 25874 break 25875 } 25876 if mem != x1.Args[2] { 25877 break 25878 } 25879 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25880 break 25881 } 25882 b = mergePoint(b, x0, x1) 25883 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25884 v.reset(OpCopy) 25885 v.AddArg(v0) 25886 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25887 v1.AuxInt = j0 25888 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25889 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25890 v3.AuxInt = i0 25891 v3.Aux = s 25892 v3.AddArg(p) 25893 v3.AddArg(idx) 25894 v3.AddArg(mem) 25895 v2.AddArg(v3) 25896 v1.AddArg(v2) 25897 v0.AddArg(v1) 25898 v0.AddArg(y) 25899 return true 25900 } 25901 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25902 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25903 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25904 for { 25905 or := v.Args[0] 25906 if or.Op != OpS390XOR { 25907 break 25908 } 25909 y := or.Args[0] 25910 s0 := or.Args[1] 25911 if s0.Op != OpS390XSLDconst { 25912 break 25913 } 25914 j0 := s0.AuxInt 25915 x0 := s0.Args[0] 25916 if x0.Op != OpS390XMOVBZloadidx { 25917 break 25918 } 25919 i0 := x0.AuxInt 25920 s := x0.Aux 25921 p := x0.Args[0] 25922 idx := x0.Args[1] 25923 mem := x0.Args[2] 25924 s1 := v.Args[1] 25925 if s1.Op != OpS390XSLDconst { 25926 break 25927 } 25928 j1 := s1.AuxInt 25929 x1 := s1.Args[0] 25930 if x1.Op != OpS390XMOVBZloadidx { 25931 break 25932 } 25933 i1 := x1.AuxInt 25934 if x1.Aux != s { 25935 break 25936 } 25937 if p != x1.Args[0] { 25938 break 25939 } 25940 if idx != x1.Args[1] { 25941 break 25942 } 25943 if mem != x1.Args[2] { 25944 break 25945 } 25946 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25947 break 25948 } 25949 b = mergePoint(b, x0, x1) 25950 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25951 v.reset(OpCopy) 25952 v.AddArg(v0) 25953 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25954 v1.AuxInt = j0 25955 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25956 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25957 v3.AuxInt = i0 25958 v3.Aux = s 25959 v3.AddArg(p) 25960 v3.AddArg(idx) 25961 v3.AddArg(mem) 25962 v2.AddArg(v3) 25963 v1.AddArg(v2) 25964 v0.AddArg(v1) 25965 v0.AddArg(y) 25966 return true 25967 } 25968 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25969 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25970 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25971 for { 25972 or := v.Args[0] 25973 if or.Op != OpS390XOR { 25974 break 25975 } 25976 y := or.Args[0] 25977 s0 := or.Args[1] 25978 if s0.Op != OpS390XSLDconst { 25979 break 25980 } 25981 j0 := s0.AuxInt 25982 x0 := s0.Args[0] 25983 if x0.Op != OpS390XMOVBZloadidx { 25984 break 25985 } 25986 i0 := x0.AuxInt 25987 s := x0.Aux 25988 idx := x0.Args[0] 25989 p := x0.Args[1] 25990 mem := x0.Args[2] 25991 s1 := v.Args[1] 25992 if s1.Op != OpS390XSLDconst { 25993 break 25994 } 25995 j1 := s1.AuxInt 25996 x1 := s1.Args[0] 25997 if x1.Op != OpS390XMOVBZloadidx { 25998 break 25999 } 26000 i1 := x1.AuxInt 26001 if x1.Aux != s { 26002 break 26003 } 26004 if p != x1.Args[0] { 26005 break 26006 } 26007 if idx != x1.Args[1] { 26008 break 26009 } 26010 if mem != x1.Args[2] { 26011 break 26012 } 26013 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26014 break 26015 } 26016 b = mergePoint(b, x0, x1) 26017 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26018 v.reset(OpCopy) 26019 v.AddArg(v0) 26020 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26021 v1.AuxInt = j0 26022 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26023 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26024 v3.AuxInt = i0 26025 v3.Aux = s 26026 v3.AddArg(p) 26027 v3.AddArg(idx) 26028 v3.AddArg(mem) 26029 v2.AddArg(v3) 26030 v1.AddArg(v2) 26031 v0.AddArg(v1) 26032 v0.AddArg(y) 26033 return true 26034 } 26035 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26036 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26037 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26038 for { 26039 or := v.Args[0] 26040 if or.Op != OpS390XOR { 26041 break 26042 } 26043 s0 := or.Args[0] 26044 if s0.Op != OpS390XSLDconst { 26045 break 26046 } 26047 j0 := s0.AuxInt 26048 x0 := s0.Args[0] 26049 if x0.Op != OpS390XMOVBZloadidx { 26050 break 26051 } 26052 i0 := x0.AuxInt 26053 s := x0.Aux 26054 p := x0.Args[0] 26055 idx := x0.Args[1] 26056 mem := x0.Args[2] 26057 y := or.Args[1] 26058 s1 := v.Args[1] 26059 if s1.Op != OpS390XSLDconst { 26060 break 26061 } 26062 j1 := s1.AuxInt 26063 x1 := s1.Args[0] 26064 if x1.Op != OpS390XMOVBZloadidx { 26065 break 26066 } 26067 i1 := x1.AuxInt 26068 if x1.Aux != s { 26069 break 26070 } 26071 if idx != x1.Args[0] { 26072 break 26073 } 26074 if p != x1.Args[1] { 26075 break 26076 } 26077 if mem != x1.Args[2] { 26078 break 26079 } 26080 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26081 break 26082 } 26083 b = mergePoint(b, x0, x1) 26084 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26085 v.reset(OpCopy) 26086 v.AddArg(v0) 26087 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26088 v1.AuxInt = j0 26089 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26090 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26091 v3.AuxInt = i0 26092 v3.Aux = s 26093 v3.AddArg(p) 26094 v3.AddArg(idx) 26095 v3.AddArg(mem) 26096 v2.AddArg(v3) 26097 v1.AddArg(v2) 26098 v0.AddArg(v1) 26099 v0.AddArg(y) 26100 return true 26101 } 26102 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26103 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26104 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26105 for { 26106 or := v.Args[0] 26107 if or.Op != OpS390XOR { 26108 break 26109 } 26110 s0 := or.Args[0] 26111 if s0.Op != OpS390XSLDconst { 26112 break 26113 } 26114 j0 := s0.AuxInt 26115 x0 := s0.Args[0] 26116 if x0.Op != OpS390XMOVBZloadidx { 26117 break 26118 } 26119 i0 := x0.AuxInt 26120 s := x0.Aux 26121 idx := x0.Args[0] 26122 p := x0.Args[1] 26123 mem := x0.Args[2] 26124 y := or.Args[1] 26125 s1 := v.Args[1] 26126 if s1.Op != OpS390XSLDconst { 26127 break 26128 } 26129 j1 := s1.AuxInt 26130 x1 := s1.Args[0] 26131 if x1.Op != OpS390XMOVBZloadidx { 26132 break 26133 } 26134 i1 := x1.AuxInt 26135 if x1.Aux != s { 26136 break 26137 } 26138 if idx != x1.Args[0] { 26139 break 26140 } 26141 if p != x1.Args[1] { 26142 break 26143 } 26144 if mem != x1.Args[2] { 26145 break 26146 } 26147 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26148 break 26149 } 26150 b = mergePoint(b, x0, x1) 26151 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26152 v.reset(OpCopy) 26153 v.AddArg(v0) 26154 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26155 v1.AuxInt = j0 26156 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26157 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26158 v3.AuxInt = i0 26159 v3.Aux = s 26160 v3.AddArg(p) 26161 v3.AddArg(idx) 26162 v3.AddArg(mem) 26163 v2.AddArg(v3) 26164 v1.AddArg(v2) 26165 v0.AddArg(v1) 26166 v0.AddArg(y) 26167 return true 26168 } 26169 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26170 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26171 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26172 for { 26173 or := v.Args[0] 26174 if or.Op != OpS390XOR { 26175 break 26176 } 26177 y := or.Args[0] 26178 s0 := or.Args[1] 26179 if s0.Op != OpS390XSLDconst { 26180 break 26181 } 26182 j0 := s0.AuxInt 26183 x0 := s0.Args[0] 26184 if x0.Op != OpS390XMOVBZloadidx { 26185 break 26186 } 26187 i0 := x0.AuxInt 26188 s := x0.Aux 26189 p := x0.Args[0] 26190 idx := x0.Args[1] 26191 mem := x0.Args[2] 26192 s1 := v.Args[1] 26193 if s1.Op != OpS390XSLDconst { 26194 break 26195 } 26196 j1 := s1.AuxInt 26197 x1 := s1.Args[0] 26198 if x1.Op != OpS390XMOVBZloadidx { 26199 break 26200 } 26201 i1 := x1.AuxInt 26202 if x1.Aux != s { 26203 break 26204 } 26205 if idx != x1.Args[0] { 26206 break 26207 } 26208 if p != x1.Args[1] { 26209 break 26210 } 26211 if mem != x1.Args[2] { 26212 break 26213 } 26214 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26215 break 26216 } 26217 b = mergePoint(b, x0, x1) 26218 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26219 v.reset(OpCopy) 26220 v.AddArg(v0) 26221 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26222 v1.AuxInt = j0 26223 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26224 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26225 v3.AuxInt = i0 26226 v3.Aux = s 26227 v3.AddArg(p) 26228 v3.AddArg(idx) 26229 v3.AddArg(mem) 26230 v2.AddArg(v3) 26231 v1.AddArg(v2) 26232 v0.AddArg(v1) 26233 v0.AddArg(y) 26234 return true 26235 } 26236 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26237 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26238 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26239 for { 26240 or := v.Args[0] 26241 if or.Op != OpS390XOR { 26242 break 26243 } 26244 y := or.Args[0] 26245 s0 := or.Args[1] 26246 if s0.Op != OpS390XSLDconst { 26247 break 26248 } 26249 j0 := s0.AuxInt 26250 x0 := s0.Args[0] 26251 if x0.Op != OpS390XMOVBZloadidx { 26252 break 26253 } 26254 i0 := x0.AuxInt 26255 s := x0.Aux 26256 idx := x0.Args[0] 26257 p := x0.Args[1] 26258 mem := x0.Args[2] 26259 s1 := v.Args[1] 26260 if s1.Op != OpS390XSLDconst { 26261 break 26262 } 26263 j1 := s1.AuxInt 26264 x1 := s1.Args[0] 26265 if x1.Op != OpS390XMOVBZloadidx { 26266 break 26267 } 26268 i1 := x1.AuxInt 26269 if x1.Aux != s { 26270 break 26271 } 26272 if idx != x1.Args[0] { 26273 break 26274 } 26275 if p != x1.Args[1] { 26276 break 26277 } 26278 if mem != x1.Args[2] { 26279 break 26280 } 26281 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26282 break 26283 } 26284 b = mergePoint(b, x0, x1) 26285 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26286 v.reset(OpCopy) 26287 v.AddArg(v0) 26288 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26289 v1.AuxInt = j0 26290 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26291 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26292 v3.AuxInt = i0 26293 v3.Aux = s 26294 v3.AddArg(p) 26295 v3.AddArg(idx) 26296 v3.AddArg(mem) 26297 v2.AddArg(v3) 26298 v1.AddArg(v2) 26299 v0.AddArg(v1) 26300 v0.AddArg(y) 26301 return true 26302 } 26303 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) 26304 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26305 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26306 for { 26307 s1 := v.Args[0] 26308 if s1.Op != OpS390XSLDconst { 26309 break 26310 } 26311 j1 := s1.AuxInt 26312 r1 := s1.Args[0] 26313 if r1.Op != OpS390XMOVHZreg { 26314 break 26315 } 26316 x1 := r1.Args[0] 26317 if x1.Op != OpS390XMOVHBRloadidx { 26318 break 26319 } 26320 i1 := x1.AuxInt 26321 s := x1.Aux 26322 p := x1.Args[0] 26323 idx := x1.Args[1] 26324 mem := x1.Args[2] 26325 or := v.Args[1] 26326 if or.Op != OpS390XOR { 26327 break 26328 } 26329 s0 := or.Args[0] 26330 if s0.Op != OpS390XSLDconst { 26331 break 26332 } 26333 j0 := s0.AuxInt 26334 r0 := s0.Args[0] 26335 if r0.Op != OpS390XMOVHZreg { 26336 break 26337 } 26338 x0 := r0.Args[0] 26339 if x0.Op != OpS390XMOVHBRloadidx { 26340 break 26341 } 26342 i0 := x0.AuxInt 26343 if x0.Aux != s { 26344 break 26345 } 26346 if p != x0.Args[0] { 26347 break 26348 } 26349 if idx != x0.Args[1] { 26350 break 26351 } 26352 if mem != x0.Args[2] { 26353 break 26354 } 26355 y := or.Args[1] 26356 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26357 break 26358 } 26359 b = mergePoint(b, x0, x1) 26360 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26361 v.reset(OpCopy) 26362 v.AddArg(v0) 26363 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26364 v1.AuxInt = j0 26365 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26366 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26367 v3.AuxInt = i0 26368 v3.Aux = s 26369 v3.AddArg(p) 26370 v3.AddArg(idx) 26371 v3.AddArg(mem) 26372 v2.AddArg(v3) 26373 v1.AddArg(v2) 26374 v0.AddArg(v1) 26375 v0.AddArg(y) 26376 return true 26377 } 26378 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) 26379 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26380 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26381 for { 26382 s1 := v.Args[0] 26383 if s1.Op != OpS390XSLDconst { 26384 break 26385 } 26386 j1 := s1.AuxInt 26387 r1 := s1.Args[0] 26388 if r1.Op != OpS390XMOVHZreg { 26389 break 26390 } 26391 x1 := r1.Args[0] 26392 if x1.Op != OpS390XMOVHBRloadidx { 26393 break 26394 } 26395 i1 := x1.AuxInt 26396 s := x1.Aux 26397 idx := x1.Args[0] 26398 p := x1.Args[1] 26399 mem := x1.Args[2] 26400 or := v.Args[1] 26401 if or.Op != OpS390XOR { 26402 break 26403 } 26404 s0 := or.Args[0] 26405 if s0.Op != OpS390XSLDconst { 26406 break 26407 } 26408 j0 := s0.AuxInt 26409 r0 := s0.Args[0] 26410 if r0.Op != OpS390XMOVHZreg { 26411 break 26412 } 26413 x0 := r0.Args[0] 26414 if x0.Op != OpS390XMOVHBRloadidx { 26415 break 26416 } 26417 i0 := x0.AuxInt 26418 if x0.Aux != s { 26419 break 26420 } 26421 if p != x0.Args[0] { 26422 break 26423 } 26424 if idx != x0.Args[1] { 26425 break 26426 } 26427 if mem != x0.Args[2] { 26428 break 26429 } 26430 y := or.Args[1] 26431 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26432 break 26433 } 26434 b = mergePoint(b, x0, x1) 26435 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26436 v.reset(OpCopy) 26437 v.AddArg(v0) 26438 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26439 v1.AuxInt = j0 26440 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26441 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26442 v3.AuxInt = i0 26443 v3.Aux = s 26444 v3.AddArg(p) 26445 v3.AddArg(idx) 26446 v3.AddArg(mem) 26447 v2.AddArg(v3) 26448 v1.AddArg(v2) 26449 v0.AddArg(v1) 26450 v0.AddArg(y) 26451 return true 26452 } 26453 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y)) 26454 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26455 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26456 for { 26457 s1 := v.Args[0] 26458 if s1.Op != OpS390XSLDconst { 26459 break 26460 } 26461 j1 := s1.AuxInt 26462 r1 := s1.Args[0] 26463 if r1.Op != OpS390XMOVHZreg { 26464 break 26465 } 26466 x1 := r1.Args[0] 26467 if x1.Op != OpS390XMOVHBRloadidx { 26468 break 26469 } 26470 i1 := x1.AuxInt 26471 s := x1.Aux 26472 p := x1.Args[0] 26473 idx := x1.Args[1] 26474 mem := x1.Args[2] 26475 or := v.Args[1] 26476 if or.Op != OpS390XOR { 26477 break 26478 } 26479 s0 := or.Args[0] 26480 if s0.Op != OpS390XSLDconst { 26481 break 26482 } 26483 j0 := s0.AuxInt 26484 r0 := s0.Args[0] 26485 if r0.Op != OpS390XMOVHZreg { 26486 break 26487 } 26488 x0 := r0.Args[0] 26489 if x0.Op != OpS390XMOVHBRloadidx { 26490 break 26491 } 26492 i0 := x0.AuxInt 26493 if x0.Aux != s { 26494 break 26495 } 26496 if idx != x0.Args[0] { 26497 break 26498 } 26499 if p != x0.Args[1] { 26500 break 26501 } 26502 if mem != x0.Args[2] { 26503 break 26504 } 26505 y := or.Args[1] 26506 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26507 break 26508 } 26509 b = mergePoint(b, x0, x1) 26510 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26511 v.reset(OpCopy) 26512 v.AddArg(v0) 26513 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26514 v1.AuxInt = j0 26515 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26516 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26517 v3.AuxInt = i0 26518 v3.Aux = s 26519 v3.AddArg(p) 26520 v3.AddArg(idx) 26521 v3.AddArg(mem) 26522 v2.AddArg(v3) 26523 v1.AddArg(v2) 26524 v0.AddArg(v1) 26525 v0.AddArg(y) 26526 return true 26527 } 26528 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y)) 26529 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26530 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26531 for { 26532 s1 := v.Args[0] 26533 if s1.Op != OpS390XSLDconst { 26534 break 26535 } 26536 j1 := s1.AuxInt 26537 r1 := s1.Args[0] 26538 if r1.Op != OpS390XMOVHZreg { 26539 break 26540 } 26541 x1 := r1.Args[0] 26542 if x1.Op != OpS390XMOVHBRloadidx { 26543 break 26544 } 26545 i1 := x1.AuxInt 26546 s := x1.Aux 26547 idx := x1.Args[0] 26548 p := x1.Args[1] 26549 mem := x1.Args[2] 26550 or := v.Args[1] 26551 if or.Op != OpS390XOR { 26552 break 26553 } 26554 s0 := or.Args[0] 26555 if s0.Op != OpS390XSLDconst { 26556 break 26557 } 26558 j0 := s0.AuxInt 26559 r0 := s0.Args[0] 26560 if r0.Op != OpS390XMOVHZreg { 26561 break 26562 } 26563 x0 := r0.Args[0] 26564 if x0.Op != OpS390XMOVHBRloadidx { 26565 break 26566 } 26567 i0 := x0.AuxInt 26568 if x0.Aux != s { 26569 break 26570 } 26571 if idx != x0.Args[0] { 26572 break 26573 } 26574 if p != x0.Args[1] { 26575 break 26576 } 26577 if mem != x0.Args[2] { 26578 break 26579 } 26580 y := or.Args[1] 26581 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26582 break 26583 } 26584 b = mergePoint(b, x0, x1) 26585 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26586 v.reset(OpCopy) 26587 v.AddArg(v0) 26588 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26589 v1.AuxInt = j0 26590 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26591 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26592 v3.AuxInt = i0 26593 v3.Aux = s 26594 v3.AddArg(p) 26595 v3.AddArg(idx) 26596 v3.AddArg(mem) 26597 v2.AddArg(v3) 26598 v1.AddArg(v2) 26599 v0.AddArg(v1) 26600 v0.AddArg(y) 26601 return true 26602 } 26603 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))))) 26604 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26605 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26606 for { 26607 s1 := v.Args[0] 26608 if s1.Op != OpS390XSLDconst { 26609 break 26610 } 26611 j1 := s1.AuxInt 26612 r1 := s1.Args[0] 26613 if r1.Op != OpS390XMOVHZreg { 26614 break 26615 } 26616 x1 := r1.Args[0] 26617 if x1.Op != OpS390XMOVHBRloadidx { 26618 break 26619 } 26620 i1 := x1.AuxInt 26621 s := x1.Aux 26622 p := x1.Args[0] 26623 idx := x1.Args[1] 26624 mem := x1.Args[2] 26625 or := v.Args[1] 26626 if or.Op != OpS390XOR { 26627 break 26628 } 26629 y := or.Args[0] 26630 s0 := or.Args[1] 26631 if s0.Op != OpS390XSLDconst { 26632 break 26633 } 26634 j0 := s0.AuxInt 26635 r0 := s0.Args[0] 26636 if r0.Op != OpS390XMOVHZreg { 26637 break 26638 } 26639 x0 := r0.Args[0] 26640 if x0.Op != OpS390XMOVHBRloadidx { 26641 break 26642 } 26643 i0 := x0.AuxInt 26644 if x0.Aux != s { 26645 break 26646 } 26647 if p != x0.Args[0] { 26648 break 26649 } 26650 if idx != x0.Args[1] { 26651 break 26652 } 26653 if mem != x0.Args[2] { 26654 break 26655 } 26656 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26657 break 26658 } 26659 b = mergePoint(b, x0, x1) 26660 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26661 v.reset(OpCopy) 26662 v.AddArg(v0) 26663 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26664 v1.AuxInt = j0 26665 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26666 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26667 v3.AuxInt = i0 26668 v3.Aux = s 26669 v3.AddArg(p) 26670 v3.AddArg(idx) 26671 v3.AddArg(mem) 26672 v2.AddArg(v3) 26673 v1.AddArg(v2) 26674 v0.AddArg(v1) 26675 v0.AddArg(y) 26676 return true 26677 } 26678 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))))) 26679 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26680 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26681 for { 26682 s1 := v.Args[0] 26683 if s1.Op != OpS390XSLDconst { 26684 break 26685 } 26686 j1 := s1.AuxInt 26687 r1 := s1.Args[0] 26688 if r1.Op != OpS390XMOVHZreg { 26689 break 26690 } 26691 x1 := r1.Args[0] 26692 if x1.Op != OpS390XMOVHBRloadidx { 26693 break 26694 } 26695 i1 := x1.AuxInt 26696 s := x1.Aux 26697 idx := x1.Args[0] 26698 p := x1.Args[1] 26699 mem := x1.Args[2] 26700 or := v.Args[1] 26701 if or.Op != OpS390XOR { 26702 break 26703 } 26704 y := or.Args[0] 26705 s0 := or.Args[1] 26706 if s0.Op != OpS390XSLDconst { 26707 break 26708 } 26709 j0 := s0.AuxInt 26710 r0 := s0.Args[0] 26711 if r0.Op != OpS390XMOVHZreg { 26712 break 26713 } 26714 x0 := r0.Args[0] 26715 if x0.Op != OpS390XMOVHBRloadidx { 26716 break 26717 } 26718 i0 := x0.AuxInt 26719 if x0.Aux != s { 26720 break 26721 } 26722 if p != x0.Args[0] { 26723 break 26724 } 26725 if idx != x0.Args[1] { 26726 break 26727 } 26728 if mem != x0.Args[2] { 26729 break 26730 } 26731 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26732 break 26733 } 26734 b = mergePoint(b, x0, x1) 26735 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26736 v.reset(OpCopy) 26737 v.AddArg(v0) 26738 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26739 v1.AuxInt = j0 26740 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26741 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26742 v3.AuxInt = i0 26743 v3.Aux = s 26744 v3.AddArg(p) 26745 v3.AddArg(idx) 26746 v3.AddArg(mem) 26747 v2.AddArg(v3) 26748 v1.AddArg(v2) 26749 v0.AddArg(v1) 26750 v0.AddArg(y) 26751 return true 26752 } 26753 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))))) 26754 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26755 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26756 for { 26757 s1 := v.Args[0] 26758 if s1.Op != OpS390XSLDconst { 26759 break 26760 } 26761 j1 := s1.AuxInt 26762 r1 := s1.Args[0] 26763 if r1.Op != OpS390XMOVHZreg { 26764 break 26765 } 26766 x1 := r1.Args[0] 26767 if x1.Op != OpS390XMOVHBRloadidx { 26768 break 26769 } 26770 i1 := x1.AuxInt 26771 s := x1.Aux 26772 p := x1.Args[0] 26773 idx := x1.Args[1] 26774 mem := x1.Args[2] 26775 or := v.Args[1] 26776 if or.Op != OpS390XOR { 26777 break 26778 } 26779 y := or.Args[0] 26780 s0 := or.Args[1] 26781 if s0.Op != OpS390XSLDconst { 26782 break 26783 } 26784 j0 := s0.AuxInt 26785 r0 := s0.Args[0] 26786 if r0.Op != OpS390XMOVHZreg { 26787 break 26788 } 26789 x0 := r0.Args[0] 26790 if x0.Op != OpS390XMOVHBRloadidx { 26791 break 26792 } 26793 i0 := x0.AuxInt 26794 if x0.Aux != s { 26795 break 26796 } 26797 if idx != x0.Args[0] { 26798 break 26799 } 26800 if p != x0.Args[1] { 26801 break 26802 } 26803 if mem != x0.Args[2] { 26804 break 26805 } 26806 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26807 break 26808 } 26809 b = mergePoint(b, x0, x1) 26810 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26811 v.reset(OpCopy) 26812 v.AddArg(v0) 26813 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26814 v1.AuxInt = j0 26815 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26816 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26817 v3.AuxInt = i0 26818 v3.Aux = s 26819 v3.AddArg(p) 26820 v3.AddArg(idx) 26821 v3.AddArg(mem) 26822 v2.AddArg(v3) 26823 v1.AddArg(v2) 26824 v0.AddArg(v1) 26825 v0.AddArg(y) 26826 return true 26827 } 26828 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))))) 26829 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26830 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26831 for { 26832 s1 := v.Args[0] 26833 if s1.Op != OpS390XSLDconst { 26834 break 26835 } 26836 j1 := s1.AuxInt 26837 r1 := s1.Args[0] 26838 if r1.Op != OpS390XMOVHZreg { 26839 break 26840 } 26841 x1 := r1.Args[0] 26842 if x1.Op != OpS390XMOVHBRloadidx { 26843 break 26844 } 26845 i1 := x1.AuxInt 26846 s := x1.Aux 26847 idx := x1.Args[0] 26848 p := x1.Args[1] 26849 mem := x1.Args[2] 26850 or := v.Args[1] 26851 if or.Op != OpS390XOR { 26852 break 26853 } 26854 y := or.Args[0] 26855 s0 := or.Args[1] 26856 if s0.Op != OpS390XSLDconst { 26857 break 26858 } 26859 j0 := s0.AuxInt 26860 r0 := s0.Args[0] 26861 if r0.Op != OpS390XMOVHZreg { 26862 break 26863 } 26864 x0 := r0.Args[0] 26865 if x0.Op != OpS390XMOVHBRloadidx { 26866 break 26867 } 26868 i0 := x0.AuxInt 26869 if x0.Aux != s { 26870 break 26871 } 26872 if idx != x0.Args[0] { 26873 break 26874 } 26875 if p != x0.Args[1] { 26876 break 26877 } 26878 if mem != x0.Args[2] { 26879 break 26880 } 26881 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26882 break 26883 } 26884 b = mergePoint(b, x0, x1) 26885 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26886 v.reset(OpCopy) 26887 v.AddArg(v0) 26888 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26889 v1.AuxInt = j0 26890 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26891 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26892 v3.AuxInt = i0 26893 v3.Aux = s 26894 v3.AddArg(p) 26895 v3.AddArg(idx) 26896 v3.AddArg(mem) 26897 v2.AddArg(v3) 26898 v1.AddArg(v2) 26899 v0.AddArg(v1) 26900 v0.AddArg(y) 26901 return true 26902 } 26903 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 26904 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26905 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26906 for { 26907 or := v.Args[0] 26908 if or.Op != OpS390XOR { 26909 break 26910 } 26911 s0 := or.Args[0] 26912 if s0.Op != OpS390XSLDconst { 26913 break 26914 } 26915 j0 := s0.AuxInt 26916 r0 := s0.Args[0] 26917 if r0.Op != OpS390XMOVHZreg { 26918 break 26919 } 26920 x0 := r0.Args[0] 26921 if x0.Op != OpS390XMOVHBRloadidx { 26922 break 26923 } 26924 i0 := x0.AuxInt 26925 s := x0.Aux 26926 p := x0.Args[0] 26927 idx := x0.Args[1] 26928 mem := x0.Args[2] 26929 y := or.Args[1] 26930 s1 := v.Args[1] 26931 if s1.Op != OpS390XSLDconst { 26932 break 26933 } 26934 j1 := s1.AuxInt 26935 r1 := s1.Args[0] 26936 if r1.Op != OpS390XMOVHZreg { 26937 break 26938 } 26939 x1 := r1.Args[0] 26940 if x1.Op != OpS390XMOVHBRloadidx { 26941 break 26942 } 26943 i1 := x1.AuxInt 26944 if x1.Aux != s { 26945 break 26946 } 26947 if p != x1.Args[0] { 26948 break 26949 } 26950 if idx != x1.Args[1] { 26951 break 26952 } 26953 if mem != x1.Args[2] { 26954 break 26955 } 26956 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26957 break 26958 } 26959 b = mergePoint(b, x0, x1) 26960 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26961 v.reset(OpCopy) 26962 v.AddArg(v0) 26963 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26964 v1.AuxInt = j0 26965 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26966 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26967 v3.AuxInt = i0 26968 v3.Aux = s 26969 v3.AddArg(p) 26970 v3.AddArg(idx) 26971 v3.AddArg(mem) 26972 v2.AddArg(v3) 26973 v1.AddArg(v2) 26974 v0.AddArg(v1) 26975 v0.AddArg(y) 26976 return true 26977 } 26978 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 26979 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26980 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26981 for { 26982 or := v.Args[0] 26983 if or.Op != OpS390XOR { 26984 break 26985 } 26986 s0 := or.Args[0] 26987 if s0.Op != OpS390XSLDconst { 26988 break 26989 } 26990 j0 := s0.AuxInt 26991 r0 := s0.Args[0] 26992 if r0.Op != OpS390XMOVHZreg { 26993 break 26994 } 26995 x0 := r0.Args[0] 26996 if x0.Op != OpS390XMOVHBRloadidx { 26997 break 26998 } 26999 i0 := x0.AuxInt 27000 s := x0.Aux 27001 idx := x0.Args[0] 27002 p := x0.Args[1] 27003 mem := x0.Args[2] 27004 y := or.Args[1] 27005 s1 := v.Args[1] 27006 if s1.Op != OpS390XSLDconst { 27007 break 27008 } 27009 j1 := s1.AuxInt 27010 r1 := s1.Args[0] 27011 if r1.Op != OpS390XMOVHZreg { 27012 break 27013 } 27014 x1 := r1.Args[0] 27015 if x1.Op != OpS390XMOVHBRloadidx { 27016 break 27017 } 27018 i1 := x1.AuxInt 27019 if x1.Aux != s { 27020 break 27021 } 27022 if p != x1.Args[0] { 27023 break 27024 } 27025 if idx != x1.Args[1] { 27026 break 27027 } 27028 if mem != x1.Args[2] { 27029 break 27030 } 27031 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27032 break 27033 } 27034 b = mergePoint(b, x0, x1) 27035 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27036 v.reset(OpCopy) 27037 v.AddArg(v0) 27038 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27039 v1.AuxInt = j0 27040 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27041 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27042 v3.AuxInt = i0 27043 v3.Aux = s 27044 v3.AddArg(p) 27045 v3.AddArg(idx) 27046 v3.AddArg(mem) 27047 v2.AddArg(v3) 27048 v1.AddArg(v2) 27049 v0.AddArg(v1) 27050 v0.AddArg(y) 27051 return true 27052 } 27053 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27054 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27055 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27056 for { 27057 or := v.Args[0] 27058 if or.Op != OpS390XOR { 27059 break 27060 } 27061 y := or.Args[0] 27062 s0 := or.Args[1] 27063 if s0.Op != OpS390XSLDconst { 27064 break 27065 } 27066 j0 := s0.AuxInt 27067 r0 := s0.Args[0] 27068 if r0.Op != OpS390XMOVHZreg { 27069 break 27070 } 27071 x0 := r0.Args[0] 27072 if x0.Op != OpS390XMOVHBRloadidx { 27073 break 27074 } 27075 i0 := x0.AuxInt 27076 s := x0.Aux 27077 p := x0.Args[0] 27078 idx := x0.Args[1] 27079 mem := x0.Args[2] 27080 s1 := v.Args[1] 27081 if s1.Op != OpS390XSLDconst { 27082 break 27083 } 27084 j1 := s1.AuxInt 27085 r1 := s1.Args[0] 27086 if r1.Op != OpS390XMOVHZreg { 27087 break 27088 } 27089 x1 := r1.Args[0] 27090 if x1.Op != OpS390XMOVHBRloadidx { 27091 break 27092 } 27093 i1 := x1.AuxInt 27094 if x1.Aux != s { 27095 break 27096 } 27097 if p != x1.Args[0] { 27098 break 27099 } 27100 if idx != x1.Args[1] { 27101 break 27102 } 27103 if mem != x1.Args[2] { 27104 break 27105 } 27106 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27107 break 27108 } 27109 b = mergePoint(b, x0, x1) 27110 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27111 v.reset(OpCopy) 27112 v.AddArg(v0) 27113 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27114 v1.AuxInt = j0 27115 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27116 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27117 v3.AuxInt = i0 27118 v3.Aux = s 27119 v3.AddArg(p) 27120 v3.AddArg(idx) 27121 v3.AddArg(mem) 27122 v2.AddArg(v3) 27123 v1.AddArg(v2) 27124 v0.AddArg(v1) 27125 v0.AddArg(y) 27126 return true 27127 } 27128 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27129 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27130 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27131 for { 27132 or := v.Args[0] 27133 if or.Op != OpS390XOR { 27134 break 27135 } 27136 y := or.Args[0] 27137 s0 := or.Args[1] 27138 if s0.Op != OpS390XSLDconst { 27139 break 27140 } 27141 j0 := s0.AuxInt 27142 r0 := s0.Args[0] 27143 if r0.Op != OpS390XMOVHZreg { 27144 break 27145 } 27146 x0 := r0.Args[0] 27147 if x0.Op != OpS390XMOVHBRloadidx { 27148 break 27149 } 27150 i0 := x0.AuxInt 27151 s := x0.Aux 27152 idx := x0.Args[0] 27153 p := x0.Args[1] 27154 mem := x0.Args[2] 27155 s1 := v.Args[1] 27156 if s1.Op != OpS390XSLDconst { 27157 break 27158 } 27159 j1 := s1.AuxInt 27160 r1 := s1.Args[0] 27161 if r1.Op != OpS390XMOVHZreg { 27162 break 27163 } 27164 x1 := r1.Args[0] 27165 if x1.Op != OpS390XMOVHBRloadidx { 27166 break 27167 } 27168 i1 := x1.AuxInt 27169 if x1.Aux != s { 27170 break 27171 } 27172 if p != x1.Args[0] { 27173 break 27174 } 27175 if idx != x1.Args[1] { 27176 break 27177 } 27178 if mem != x1.Args[2] { 27179 break 27180 } 27181 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27182 break 27183 } 27184 b = mergePoint(b, x0, x1) 27185 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27186 v.reset(OpCopy) 27187 v.AddArg(v0) 27188 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27189 v1.AuxInt = j0 27190 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27191 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27192 v3.AuxInt = i0 27193 v3.Aux = s 27194 v3.AddArg(p) 27195 v3.AddArg(idx) 27196 v3.AddArg(mem) 27197 v2.AddArg(v3) 27198 v1.AddArg(v2) 27199 v0.AddArg(v1) 27200 v0.AddArg(y) 27201 return true 27202 } 27203 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27204 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27205 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27206 for { 27207 or := v.Args[0] 27208 if or.Op != OpS390XOR { 27209 break 27210 } 27211 s0 := or.Args[0] 27212 if s0.Op != OpS390XSLDconst { 27213 break 27214 } 27215 j0 := s0.AuxInt 27216 r0 := s0.Args[0] 27217 if r0.Op != OpS390XMOVHZreg { 27218 break 27219 } 27220 x0 := r0.Args[0] 27221 if x0.Op != OpS390XMOVHBRloadidx { 27222 break 27223 } 27224 i0 := x0.AuxInt 27225 s := x0.Aux 27226 p := x0.Args[0] 27227 idx := x0.Args[1] 27228 mem := x0.Args[2] 27229 y := or.Args[1] 27230 s1 := v.Args[1] 27231 if s1.Op != OpS390XSLDconst { 27232 break 27233 } 27234 j1 := s1.AuxInt 27235 r1 := s1.Args[0] 27236 if r1.Op != OpS390XMOVHZreg { 27237 break 27238 } 27239 x1 := r1.Args[0] 27240 if x1.Op != OpS390XMOVHBRloadidx { 27241 break 27242 } 27243 i1 := x1.AuxInt 27244 if x1.Aux != s { 27245 break 27246 } 27247 if idx != x1.Args[0] { 27248 break 27249 } 27250 if p != x1.Args[1] { 27251 break 27252 } 27253 if mem != x1.Args[2] { 27254 break 27255 } 27256 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27257 break 27258 } 27259 b = mergePoint(b, x0, x1) 27260 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27261 v.reset(OpCopy) 27262 v.AddArg(v0) 27263 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27264 v1.AuxInt = j0 27265 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27266 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27267 v3.AuxInt = i0 27268 v3.Aux = s 27269 v3.AddArg(p) 27270 v3.AddArg(idx) 27271 v3.AddArg(mem) 27272 v2.AddArg(v3) 27273 v1.AddArg(v2) 27274 v0.AddArg(v1) 27275 v0.AddArg(y) 27276 return true 27277 } 27278 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27279 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27280 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27281 for { 27282 or := v.Args[0] 27283 if or.Op != OpS390XOR { 27284 break 27285 } 27286 s0 := or.Args[0] 27287 if s0.Op != OpS390XSLDconst { 27288 break 27289 } 27290 j0 := s0.AuxInt 27291 r0 := s0.Args[0] 27292 if r0.Op != OpS390XMOVHZreg { 27293 break 27294 } 27295 x0 := r0.Args[0] 27296 if x0.Op != OpS390XMOVHBRloadidx { 27297 break 27298 } 27299 i0 := x0.AuxInt 27300 s := x0.Aux 27301 idx := x0.Args[0] 27302 p := x0.Args[1] 27303 mem := x0.Args[2] 27304 y := or.Args[1] 27305 s1 := v.Args[1] 27306 if s1.Op != OpS390XSLDconst { 27307 break 27308 } 27309 j1 := s1.AuxInt 27310 r1 := s1.Args[0] 27311 if r1.Op != OpS390XMOVHZreg { 27312 break 27313 } 27314 x1 := r1.Args[0] 27315 if x1.Op != OpS390XMOVHBRloadidx { 27316 break 27317 } 27318 i1 := x1.AuxInt 27319 if x1.Aux != s { 27320 break 27321 } 27322 if idx != x1.Args[0] { 27323 break 27324 } 27325 if p != x1.Args[1] { 27326 break 27327 } 27328 if mem != x1.Args[2] { 27329 break 27330 } 27331 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27332 break 27333 } 27334 b = mergePoint(b, x0, x1) 27335 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27336 v.reset(OpCopy) 27337 v.AddArg(v0) 27338 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27339 v1.AuxInt = j0 27340 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27341 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27342 v3.AuxInt = i0 27343 v3.Aux = s 27344 v3.AddArg(p) 27345 v3.AddArg(idx) 27346 v3.AddArg(mem) 27347 v2.AddArg(v3) 27348 v1.AddArg(v2) 27349 v0.AddArg(v1) 27350 v0.AddArg(y) 27351 return true 27352 } 27353 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27354 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27355 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27356 for { 27357 or := v.Args[0] 27358 if or.Op != OpS390XOR { 27359 break 27360 } 27361 y := or.Args[0] 27362 s0 := or.Args[1] 27363 if s0.Op != OpS390XSLDconst { 27364 break 27365 } 27366 j0 := s0.AuxInt 27367 r0 := s0.Args[0] 27368 if r0.Op != OpS390XMOVHZreg { 27369 break 27370 } 27371 x0 := r0.Args[0] 27372 if x0.Op != OpS390XMOVHBRloadidx { 27373 break 27374 } 27375 i0 := x0.AuxInt 27376 s := x0.Aux 27377 p := x0.Args[0] 27378 idx := x0.Args[1] 27379 mem := x0.Args[2] 27380 s1 := v.Args[1] 27381 if s1.Op != OpS390XSLDconst { 27382 break 27383 } 27384 j1 := s1.AuxInt 27385 r1 := s1.Args[0] 27386 if r1.Op != OpS390XMOVHZreg { 27387 break 27388 } 27389 x1 := r1.Args[0] 27390 if x1.Op != OpS390XMOVHBRloadidx { 27391 break 27392 } 27393 i1 := x1.AuxInt 27394 if x1.Aux != s { 27395 break 27396 } 27397 if idx != x1.Args[0] { 27398 break 27399 } 27400 if p != x1.Args[1] { 27401 break 27402 } 27403 if mem != x1.Args[2] { 27404 break 27405 } 27406 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27407 break 27408 } 27409 b = mergePoint(b, x0, x1) 27410 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27411 v.reset(OpCopy) 27412 v.AddArg(v0) 27413 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27414 v1.AuxInt = j0 27415 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27416 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27417 v3.AuxInt = i0 27418 v3.Aux = s 27419 v3.AddArg(p) 27420 v3.AddArg(idx) 27421 v3.AddArg(mem) 27422 v2.AddArg(v3) 27423 v1.AddArg(v2) 27424 v0.AddArg(v1) 27425 v0.AddArg(y) 27426 return true 27427 } 27428 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27429 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27430 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27431 for { 27432 or := v.Args[0] 27433 if or.Op != OpS390XOR { 27434 break 27435 } 27436 y := or.Args[0] 27437 s0 := or.Args[1] 27438 if s0.Op != OpS390XSLDconst { 27439 break 27440 } 27441 j0 := s0.AuxInt 27442 r0 := s0.Args[0] 27443 if r0.Op != OpS390XMOVHZreg { 27444 break 27445 } 27446 x0 := r0.Args[0] 27447 if x0.Op != OpS390XMOVHBRloadidx { 27448 break 27449 } 27450 i0 := x0.AuxInt 27451 s := x0.Aux 27452 idx := x0.Args[0] 27453 p := x0.Args[1] 27454 mem := x0.Args[2] 27455 s1 := v.Args[1] 27456 if s1.Op != OpS390XSLDconst { 27457 break 27458 } 27459 j1 := s1.AuxInt 27460 r1 := s1.Args[0] 27461 if r1.Op != OpS390XMOVHZreg { 27462 break 27463 } 27464 x1 := r1.Args[0] 27465 if x1.Op != OpS390XMOVHBRloadidx { 27466 break 27467 } 27468 i1 := x1.AuxInt 27469 if x1.Aux != s { 27470 break 27471 } 27472 if idx != x1.Args[0] { 27473 break 27474 } 27475 if p != x1.Args[1] { 27476 break 27477 } 27478 if mem != x1.Args[2] { 27479 break 27480 } 27481 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27482 break 27483 } 27484 b = mergePoint(b, x0, x1) 27485 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27486 v.reset(OpCopy) 27487 v.AddArg(v0) 27488 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27489 v1.AuxInt = j0 27490 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27491 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27492 v3.AuxInt = i0 27493 v3.Aux = s 27494 v3.AddArg(p) 27495 v3.AddArg(idx) 27496 v3.AddArg(mem) 27497 v2.AddArg(v3) 27498 v1.AddArg(v2) 27499 v0.AddArg(v1) 27500 v0.AddArg(y) 27501 return true 27502 } 27503 return false 27504 } 27505 func rewriteValueS390X_OpS390XORW(v *Value) bool { 27506 b := v.Block 27507 _ = b 27508 types := &b.Func.Config.Types 27509 _ = types 27510 // match: (ORW x (MOVDconst [c])) 27511 // cond: 27512 // result: (ORWconst [c] x) 27513 for { 27514 x := v.Args[0] 27515 v_1 := v.Args[1] 27516 if v_1.Op != OpS390XMOVDconst { 27517 break 27518 } 27519 c := v_1.AuxInt 27520 v.reset(OpS390XORWconst) 27521 v.AuxInt = c 27522 v.AddArg(x) 27523 return true 27524 } 27525 // match: (ORW (MOVDconst [c]) x) 27526 // cond: 27527 // result: (ORWconst [c] x) 27528 for { 27529 v_0 := v.Args[0] 27530 if v_0.Op != OpS390XMOVDconst { 27531 break 27532 } 27533 c := v_0.AuxInt 27534 x := v.Args[1] 27535 v.reset(OpS390XORWconst) 27536 v.AuxInt = c 27537 v.AddArg(x) 27538 return true 27539 } 27540 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 27541 // cond: d == 32-c 27542 // result: (RLLconst [c] x) 27543 for { 27544 v_0 := v.Args[0] 27545 if v_0.Op != OpS390XSLWconst { 27546 break 27547 } 27548 c := v_0.AuxInt 27549 x := v_0.Args[0] 27550 v_1 := v.Args[1] 27551 if v_1.Op != OpS390XSRWconst { 27552 break 27553 } 27554 d := v_1.AuxInt 27555 if x != v_1.Args[0] { 27556 break 27557 } 27558 if !(d == 32-c) { 27559 break 27560 } 27561 v.reset(OpS390XRLLconst) 27562 v.AuxInt = c 27563 v.AddArg(x) 27564 return true 27565 } 27566 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 27567 // cond: d == 32-c 27568 // result: (RLLconst [c] x) 27569 for { 27570 v_0 := v.Args[0] 27571 if v_0.Op != OpS390XSRWconst { 27572 break 27573 } 27574 d := v_0.AuxInt 27575 x := v_0.Args[0] 27576 v_1 := v.Args[1] 27577 if v_1.Op != OpS390XSLWconst { 27578 break 27579 } 27580 c := v_1.AuxInt 27581 if x != v_1.Args[0] { 27582 break 27583 } 27584 if !(d == 32-c) { 27585 break 27586 } 27587 v.reset(OpS390XRLLconst) 27588 v.AuxInt = c 27589 v.AddArg(x) 27590 return true 27591 } 27592 // match: (ORW x x) 27593 // cond: 27594 // result: x 27595 for { 27596 x := v.Args[0] 27597 if x != v.Args[1] { 27598 break 27599 } 27600 v.reset(OpCopy) 27601 v.Type = x.Type 27602 v.AddArg(x) 27603 return true 27604 } 27605 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 27606 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27607 // result: (ORWload <t> [off] {sym} x ptr mem) 27608 for { 27609 t := v.Type 27610 x := v.Args[0] 27611 g := v.Args[1] 27612 if g.Op != OpS390XMOVWload { 27613 break 27614 } 27615 off := g.AuxInt 27616 sym := g.Aux 27617 ptr := g.Args[0] 27618 mem := g.Args[1] 27619 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27620 break 27621 } 27622 v.reset(OpS390XORWload) 27623 v.Type = t 27624 v.AuxInt = off 27625 v.Aux = sym 27626 v.AddArg(x) 27627 v.AddArg(ptr) 27628 v.AddArg(mem) 27629 return true 27630 } 27631 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 27632 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27633 // result: (ORWload <t> [off] {sym} x ptr mem) 27634 for { 27635 t := v.Type 27636 g := v.Args[0] 27637 if g.Op != OpS390XMOVWload { 27638 break 27639 } 27640 off := g.AuxInt 27641 sym := g.Aux 27642 ptr := g.Args[0] 27643 mem := g.Args[1] 27644 x := v.Args[1] 27645 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27646 break 27647 } 27648 v.reset(OpS390XORWload) 27649 v.Type = t 27650 v.AuxInt = off 27651 v.Aux = sym 27652 v.AddArg(x) 27653 v.AddArg(ptr) 27654 v.AddArg(mem) 27655 return true 27656 } 27657 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 27658 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27659 // result: (ORWload <t> [off] {sym} x ptr mem) 27660 for { 27661 t := v.Type 27662 g := v.Args[0] 27663 if g.Op != OpS390XMOVWload { 27664 break 27665 } 27666 off := g.AuxInt 27667 sym := g.Aux 27668 ptr := g.Args[0] 27669 mem := g.Args[1] 27670 x := v.Args[1] 27671 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27672 break 27673 } 27674 v.reset(OpS390XORWload) 27675 v.Type = t 27676 v.AuxInt = off 27677 v.Aux = sym 27678 v.AddArg(x) 27679 v.AddArg(ptr) 27680 v.AddArg(mem) 27681 return true 27682 } 27683 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 27684 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27685 // result: (ORWload <t> [off] {sym} x ptr mem) 27686 for { 27687 t := v.Type 27688 x := v.Args[0] 27689 g := v.Args[1] 27690 if g.Op != OpS390XMOVWload { 27691 break 27692 } 27693 off := g.AuxInt 27694 sym := g.Aux 27695 ptr := g.Args[0] 27696 mem := g.Args[1] 27697 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27698 break 27699 } 27700 v.reset(OpS390XORWload) 27701 v.Type = t 27702 v.AuxInt = off 27703 v.Aux = sym 27704 v.AddArg(x) 27705 v.AddArg(ptr) 27706 v.AddArg(mem) 27707 return true 27708 } 27709 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 27710 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27711 // result: (ORWload <t> [off] {sym} x ptr mem) 27712 for { 27713 t := v.Type 27714 x := v.Args[0] 27715 g := v.Args[1] 27716 if g.Op != OpS390XMOVWZload { 27717 break 27718 } 27719 off := g.AuxInt 27720 sym := g.Aux 27721 ptr := g.Args[0] 27722 mem := g.Args[1] 27723 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27724 break 27725 } 27726 v.reset(OpS390XORWload) 27727 v.Type = t 27728 v.AuxInt = off 27729 v.Aux = sym 27730 v.AddArg(x) 27731 v.AddArg(ptr) 27732 v.AddArg(mem) 27733 return true 27734 } 27735 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 27736 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27737 // result: (ORWload <t> [off] {sym} x ptr mem) 27738 for { 27739 t := v.Type 27740 g := v.Args[0] 27741 if g.Op != OpS390XMOVWZload { 27742 break 27743 } 27744 off := g.AuxInt 27745 sym := g.Aux 27746 ptr := g.Args[0] 27747 mem := g.Args[1] 27748 x := v.Args[1] 27749 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27750 break 27751 } 27752 v.reset(OpS390XORWload) 27753 v.Type = t 27754 v.AuxInt = off 27755 v.Aux = sym 27756 v.AddArg(x) 27757 v.AddArg(ptr) 27758 v.AddArg(mem) 27759 return true 27760 } 27761 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 27762 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27763 // result: (ORWload <t> [off] {sym} x ptr mem) 27764 for { 27765 t := v.Type 27766 g := v.Args[0] 27767 if g.Op != OpS390XMOVWZload { 27768 break 27769 } 27770 off := g.AuxInt 27771 sym := g.Aux 27772 ptr := g.Args[0] 27773 mem := g.Args[1] 27774 x := v.Args[1] 27775 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27776 break 27777 } 27778 v.reset(OpS390XORWload) 27779 v.Type = t 27780 v.AuxInt = off 27781 v.Aux = sym 27782 v.AddArg(x) 27783 v.AddArg(ptr) 27784 v.AddArg(mem) 27785 return true 27786 } 27787 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 27788 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27789 // result: (ORWload <t> [off] {sym} x ptr mem) 27790 for { 27791 t := v.Type 27792 x := v.Args[0] 27793 g := v.Args[1] 27794 if g.Op != OpS390XMOVWZload { 27795 break 27796 } 27797 off := g.AuxInt 27798 sym := g.Aux 27799 ptr := g.Args[0] 27800 mem := g.Args[1] 27801 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27802 break 27803 } 27804 v.reset(OpS390XORWload) 27805 v.Type = t 27806 v.AuxInt = off 27807 v.Aux = sym 27808 v.AddArg(x) 27809 v.AddArg(ptr) 27810 v.AddArg(mem) 27811 return true 27812 } 27813 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 27814 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 27815 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 27816 for { 27817 x1 := v.Args[0] 27818 if x1.Op != OpS390XMOVBZload { 27819 break 27820 } 27821 i1 := x1.AuxInt 27822 s := x1.Aux 27823 p := x1.Args[0] 27824 mem := x1.Args[1] 27825 sh := v.Args[1] 27826 if sh.Op != OpS390XSLWconst { 27827 break 27828 } 27829 if sh.AuxInt != 8 { 27830 break 27831 } 27832 x0 := sh.Args[0] 27833 if x0.Op != OpS390XMOVBZload { 27834 break 27835 } 27836 i0 := x0.AuxInt 27837 if x0.Aux != s { 27838 break 27839 } 27840 if p != x0.Args[0] { 27841 break 27842 } 27843 if mem != x0.Args[1] { 27844 break 27845 } 27846 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 27847 break 27848 } 27849 b = mergePoint(b, x0, x1) 27850 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 27851 v.reset(OpCopy) 27852 v.AddArg(v0) 27853 v0.AuxInt = i0 27854 v0.Aux = s 27855 v0.AddArg(p) 27856 v0.AddArg(mem) 27857 return true 27858 } 27859 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 27860 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 27861 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 27862 for { 27863 sh := v.Args[0] 27864 if sh.Op != OpS390XSLWconst { 27865 break 27866 } 27867 if sh.AuxInt != 8 { 27868 break 27869 } 27870 x0 := sh.Args[0] 27871 if x0.Op != OpS390XMOVBZload { 27872 break 27873 } 27874 i0 := x0.AuxInt 27875 s := x0.Aux 27876 p := x0.Args[0] 27877 mem := x0.Args[1] 27878 x1 := v.Args[1] 27879 if x1.Op != OpS390XMOVBZload { 27880 break 27881 } 27882 i1 := x1.AuxInt 27883 if x1.Aux != s { 27884 break 27885 } 27886 if p != x1.Args[0] { 27887 break 27888 } 27889 if mem != x1.Args[1] { 27890 break 27891 } 27892 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 27893 break 27894 } 27895 b = mergePoint(b, x0, x1) 27896 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 27897 v.reset(OpCopy) 27898 v.AddArg(v0) 27899 v0.AuxInt = i0 27900 v0.Aux = s 27901 v0.AddArg(p) 27902 v0.AddArg(mem) 27903 return true 27904 } 27905 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 27906 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 27907 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 27908 for { 27909 x1 := v.Args[0] 27910 if x1.Op != OpS390XMOVHZload { 27911 break 27912 } 27913 i1 := x1.AuxInt 27914 s := x1.Aux 27915 p := x1.Args[0] 27916 mem := x1.Args[1] 27917 sh := v.Args[1] 27918 if sh.Op != OpS390XSLWconst { 27919 break 27920 } 27921 if sh.AuxInt != 16 { 27922 break 27923 } 27924 x0 := sh.Args[0] 27925 if x0.Op != OpS390XMOVHZload { 27926 break 27927 } 27928 i0 := x0.AuxInt 27929 if x0.Aux != s { 27930 break 27931 } 27932 if p != x0.Args[0] { 27933 break 27934 } 27935 if mem != x0.Args[1] { 27936 break 27937 } 27938 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 27939 break 27940 } 27941 b = mergePoint(b, x0, x1) 27942 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 27943 v.reset(OpCopy) 27944 v.AddArg(v0) 27945 v0.AuxInt = i0 27946 v0.Aux = s 27947 v0.AddArg(p) 27948 v0.AddArg(mem) 27949 return true 27950 } 27951 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 27952 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 27953 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 27954 for { 27955 sh := v.Args[0] 27956 if sh.Op != OpS390XSLWconst { 27957 break 27958 } 27959 if sh.AuxInt != 16 { 27960 break 27961 } 27962 x0 := sh.Args[0] 27963 if x0.Op != OpS390XMOVHZload { 27964 break 27965 } 27966 i0 := x0.AuxInt 27967 s := x0.Aux 27968 p := x0.Args[0] 27969 mem := x0.Args[1] 27970 x1 := v.Args[1] 27971 if x1.Op != OpS390XMOVHZload { 27972 break 27973 } 27974 i1 := x1.AuxInt 27975 if x1.Aux != s { 27976 break 27977 } 27978 if p != x1.Args[0] { 27979 break 27980 } 27981 if mem != x1.Args[1] { 27982 break 27983 } 27984 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 27985 break 27986 } 27987 b = mergePoint(b, x0, x1) 27988 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 27989 v.reset(OpCopy) 27990 v.AddArg(v0) 27991 v0.AuxInt = i0 27992 v0.Aux = s 27993 v0.AddArg(p) 27994 v0.AddArg(mem) 27995 return true 27996 } 27997 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 27998 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 27999 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28000 for { 28001 s0 := v.Args[0] 28002 if s0.Op != OpS390XSLWconst { 28003 break 28004 } 28005 j0 := s0.AuxInt 28006 x0 := s0.Args[0] 28007 if x0.Op != OpS390XMOVBZload { 28008 break 28009 } 28010 i0 := x0.AuxInt 28011 s := x0.Aux 28012 p := x0.Args[0] 28013 mem := x0.Args[1] 28014 or := v.Args[1] 28015 if or.Op != OpS390XORW { 28016 break 28017 } 28018 s1 := or.Args[0] 28019 if s1.Op != OpS390XSLWconst { 28020 break 28021 } 28022 j1 := s1.AuxInt 28023 x1 := s1.Args[0] 28024 if x1.Op != OpS390XMOVBZload { 28025 break 28026 } 28027 i1 := x1.AuxInt 28028 if x1.Aux != s { 28029 break 28030 } 28031 if p != x1.Args[0] { 28032 break 28033 } 28034 if mem != x1.Args[1] { 28035 break 28036 } 28037 y := or.Args[1] 28038 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28039 break 28040 } 28041 b = mergePoint(b, x0, x1) 28042 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28043 v.reset(OpCopy) 28044 v.AddArg(v0) 28045 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28046 v1.AuxInt = j1 28047 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28048 v2.AuxInt = i0 28049 v2.Aux = s 28050 v2.AddArg(p) 28051 v2.AddArg(mem) 28052 v1.AddArg(v2) 28053 v0.AddArg(v1) 28054 v0.AddArg(y) 28055 return true 28056 } 28057 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 28058 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28059 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28060 for { 28061 s0 := v.Args[0] 28062 if s0.Op != OpS390XSLWconst { 28063 break 28064 } 28065 j0 := s0.AuxInt 28066 x0 := s0.Args[0] 28067 if x0.Op != OpS390XMOVBZload { 28068 break 28069 } 28070 i0 := x0.AuxInt 28071 s := x0.Aux 28072 p := x0.Args[0] 28073 mem := x0.Args[1] 28074 or := v.Args[1] 28075 if or.Op != OpS390XORW { 28076 break 28077 } 28078 y := or.Args[0] 28079 s1 := or.Args[1] 28080 if s1.Op != OpS390XSLWconst { 28081 break 28082 } 28083 j1 := s1.AuxInt 28084 x1 := s1.Args[0] 28085 if x1.Op != OpS390XMOVBZload { 28086 break 28087 } 28088 i1 := x1.AuxInt 28089 if x1.Aux != s { 28090 break 28091 } 28092 if p != x1.Args[0] { 28093 break 28094 } 28095 if mem != x1.Args[1] { 28096 break 28097 } 28098 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28099 break 28100 } 28101 b = mergePoint(b, x0, x1) 28102 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28103 v.reset(OpCopy) 28104 v.AddArg(v0) 28105 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28106 v1.AuxInt = j1 28107 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28108 v2.AuxInt = i0 28109 v2.Aux = s 28110 v2.AddArg(p) 28111 v2.AddArg(mem) 28112 v1.AddArg(v2) 28113 v0.AddArg(v1) 28114 v0.AddArg(y) 28115 return true 28116 } 28117 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 28118 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28119 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28120 for { 28121 or := v.Args[0] 28122 if or.Op != OpS390XORW { 28123 break 28124 } 28125 s1 := or.Args[0] 28126 if s1.Op != OpS390XSLWconst { 28127 break 28128 } 28129 j1 := s1.AuxInt 28130 x1 := s1.Args[0] 28131 if x1.Op != OpS390XMOVBZload { 28132 break 28133 } 28134 i1 := x1.AuxInt 28135 s := x1.Aux 28136 p := x1.Args[0] 28137 mem := x1.Args[1] 28138 y := or.Args[1] 28139 s0 := v.Args[1] 28140 if s0.Op != OpS390XSLWconst { 28141 break 28142 } 28143 j0 := s0.AuxInt 28144 x0 := s0.Args[0] 28145 if x0.Op != OpS390XMOVBZload { 28146 break 28147 } 28148 i0 := x0.AuxInt 28149 if x0.Aux != s { 28150 break 28151 } 28152 if p != x0.Args[0] { 28153 break 28154 } 28155 if mem != x0.Args[1] { 28156 break 28157 } 28158 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28159 break 28160 } 28161 b = mergePoint(b, x0, x1) 28162 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28163 v.reset(OpCopy) 28164 v.AddArg(v0) 28165 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28166 v1.AuxInt = j1 28167 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28168 v2.AuxInt = i0 28169 v2.Aux = s 28170 v2.AddArg(p) 28171 v2.AddArg(mem) 28172 v1.AddArg(v2) 28173 v0.AddArg(v1) 28174 v0.AddArg(y) 28175 return true 28176 } 28177 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 28178 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28179 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28180 for { 28181 or := v.Args[0] 28182 if or.Op != OpS390XORW { 28183 break 28184 } 28185 y := or.Args[0] 28186 s1 := or.Args[1] 28187 if s1.Op != OpS390XSLWconst { 28188 break 28189 } 28190 j1 := s1.AuxInt 28191 x1 := s1.Args[0] 28192 if x1.Op != OpS390XMOVBZload { 28193 break 28194 } 28195 i1 := x1.AuxInt 28196 s := x1.Aux 28197 p := x1.Args[0] 28198 mem := x1.Args[1] 28199 s0 := v.Args[1] 28200 if s0.Op != OpS390XSLWconst { 28201 break 28202 } 28203 j0 := s0.AuxInt 28204 x0 := s0.Args[0] 28205 if x0.Op != OpS390XMOVBZload { 28206 break 28207 } 28208 i0 := x0.AuxInt 28209 if x0.Aux != s { 28210 break 28211 } 28212 if p != x0.Args[0] { 28213 break 28214 } 28215 if mem != x0.Args[1] { 28216 break 28217 } 28218 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28219 break 28220 } 28221 b = mergePoint(b, x0, x1) 28222 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28223 v.reset(OpCopy) 28224 v.AddArg(v0) 28225 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28226 v1.AuxInt = j1 28227 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28228 v2.AuxInt = i0 28229 v2.Aux = s 28230 v2.AddArg(p) 28231 v2.AddArg(mem) 28232 v1.AddArg(v2) 28233 v0.AddArg(v1) 28234 v0.AddArg(y) 28235 return true 28236 } 28237 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 28238 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28239 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28240 for { 28241 x1 := v.Args[0] 28242 if x1.Op != OpS390XMOVBZloadidx { 28243 break 28244 } 28245 i1 := x1.AuxInt 28246 s := x1.Aux 28247 p := x1.Args[0] 28248 idx := x1.Args[1] 28249 mem := x1.Args[2] 28250 sh := v.Args[1] 28251 if sh.Op != OpS390XSLWconst { 28252 break 28253 } 28254 if sh.AuxInt != 8 { 28255 break 28256 } 28257 x0 := sh.Args[0] 28258 if x0.Op != OpS390XMOVBZloadidx { 28259 break 28260 } 28261 i0 := x0.AuxInt 28262 if x0.Aux != s { 28263 break 28264 } 28265 if p != x0.Args[0] { 28266 break 28267 } 28268 if idx != x0.Args[1] { 28269 break 28270 } 28271 if mem != x0.Args[2] { 28272 break 28273 } 28274 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28275 break 28276 } 28277 b = mergePoint(b, x0, x1) 28278 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28279 v.reset(OpCopy) 28280 v.AddArg(v0) 28281 v0.AuxInt = i0 28282 v0.Aux = s 28283 v0.AddArg(p) 28284 v0.AddArg(idx) 28285 v0.AddArg(mem) 28286 return true 28287 } 28288 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 28289 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28290 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28291 for { 28292 x1 := v.Args[0] 28293 if x1.Op != OpS390XMOVBZloadidx { 28294 break 28295 } 28296 i1 := x1.AuxInt 28297 s := x1.Aux 28298 idx := x1.Args[0] 28299 p := x1.Args[1] 28300 mem := x1.Args[2] 28301 sh := v.Args[1] 28302 if sh.Op != OpS390XSLWconst { 28303 break 28304 } 28305 if sh.AuxInt != 8 { 28306 break 28307 } 28308 x0 := sh.Args[0] 28309 if x0.Op != OpS390XMOVBZloadidx { 28310 break 28311 } 28312 i0 := x0.AuxInt 28313 if x0.Aux != s { 28314 break 28315 } 28316 if p != x0.Args[0] { 28317 break 28318 } 28319 if idx != x0.Args[1] { 28320 break 28321 } 28322 if mem != x0.Args[2] { 28323 break 28324 } 28325 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28326 break 28327 } 28328 b = mergePoint(b, x0, x1) 28329 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28330 v.reset(OpCopy) 28331 v.AddArg(v0) 28332 v0.AuxInt = i0 28333 v0.Aux = s 28334 v0.AddArg(p) 28335 v0.AddArg(idx) 28336 v0.AddArg(mem) 28337 return true 28338 } 28339 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 28340 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28341 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28342 for { 28343 x1 := v.Args[0] 28344 if x1.Op != OpS390XMOVBZloadidx { 28345 break 28346 } 28347 i1 := x1.AuxInt 28348 s := x1.Aux 28349 p := x1.Args[0] 28350 idx := x1.Args[1] 28351 mem := x1.Args[2] 28352 sh := v.Args[1] 28353 if sh.Op != OpS390XSLWconst { 28354 break 28355 } 28356 if sh.AuxInt != 8 { 28357 break 28358 } 28359 x0 := sh.Args[0] 28360 if x0.Op != OpS390XMOVBZloadidx { 28361 break 28362 } 28363 i0 := x0.AuxInt 28364 if x0.Aux != s { 28365 break 28366 } 28367 if idx != x0.Args[0] { 28368 break 28369 } 28370 if p != x0.Args[1] { 28371 break 28372 } 28373 if mem != x0.Args[2] { 28374 break 28375 } 28376 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28377 break 28378 } 28379 b = mergePoint(b, x0, x1) 28380 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28381 v.reset(OpCopy) 28382 v.AddArg(v0) 28383 v0.AuxInt = i0 28384 v0.Aux = s 28385 v0.AddArg(p) 28386 v0.AddArg(idx) 28387 v0.AddArg(mem) 28388 return true 28389 } 28390 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 28391 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28392 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28393 for { 28394 x1 := v.Args[0] 28395 if x1.Op != OpS390XMOVBZloadidx { 28396 break 28397 } 28398 i1 := x1.AuxInt 28399 s := x1.Aux 28400 idx := x1.Args[0] 28401 p := x1.Args[1] 28402 mem := x1.Args[2] 28403 sh := v.Args[1] 28404 if sh.Op != OpS390XSLWconst { 28405 break 28406 } 28407 if sh.AuxInt != 8 { 28408 break 28409 } 28410 x0 := sh.Args[0] 28411 if x0.Op != OpS390XMOVBZloadidx { 28412 break 28413 } 28414 i0 := x0.AuxInt 28415 if x0.Aux != s { 28416 break 28417 } 28418 if idx != x0.Args[0] { 28419 break 28420 } 28421 if p != x0.Args[1] { 28422 break 28423 } 28424 if mem != x0.Args[2] { 28425 break 28426 } 28427 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28428 break 28429 } 28430 b = mergePoint(b, x0, x1) 28431 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28432 v.reset(OpCopy) 28433 v.AddArg(v0) 28434 v0.AuxInt = i0 28435 v0.Aux = s 28436 v0.AddArg(p) 28437 v0.AddArg(idx) 28438 v0.AddArg(mem) 28439 return true 28440 } 28441 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 28442 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28443 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28444 for { 28445 sh := v.Args[0] 28446 if sh.Op != OpS390XSLWconst { 28447 break 28448 } 28449 if sh.AuxInt != 8 { 28450 break 28451 } 28452 x0 := sh.Args[0] 28453 if x0.Op != OpS390XMOVBZloadidx { 28454 break 28455 } 28456 i0 := x0.AuxInt 28457 s := x0.Aux 28458 p := x0.Args[0] 28459 idx := x0.Args[1] 28460 mem := x0.Args[2] 28461 x1 := v.Args[1] 28462 if x1.Op != OpS390XMOVBZloadidx { 28463 break 28464 } 28465 i1 := x1.AuxInt 28466 if x1.Aux != s { 28467 break 28468 } 28469 if p != x1.Args[0] { 28470 break 28471 } 28472 if idx != x1.Args[1] { 28473 break 28474 } 28475 if mem != x1.Args[2] { 28476 break 28477 } 28478 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28479 break 28480 } 28481 b = mergePoint(b, x0, x1) 28482 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28483 v.reset(OpCopy) 28484 v.AddArg(v0) 28485 v0.AuxInt = i0 28486 v0.Aux = s 28487 v0.AddArg(p) 28488 v0.AddArg(idx) 28489 v0.AddArg(mem) 28490 return true 28491 } 28492 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 28493 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28494 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28495 for { 28496 sh := v.Args[0] 28497 if sh.Op != OpS390XSLWconst { 28498 break 28499 } 28500 if sh.AuxInt != 8 { 28501 break 28502 } 28503 x0 := sh.Args[0] 28504 if x0.Op != OpS390XMOVBZloadidx { 28505 break 28506 } 28507 i0 := x0.AuxInt 28508 s := x0.Aux 28509 idx := x0.Args[0] 28510 p := x0.Args[1] 28511 mem := x0.Args[2] 28512 x1 := v.Args[1] 28513 if x1.Op != OpS390XMOVBZloadidx { 28514 break 28515 } 28516 i1 := x1.AuxInt 28517 if x1.Aux != s { 28518 break 28519 } 28520 if p != x1.Args[0] { 28521 break 28522 } 28523 if idx != x1.Args[1] { 28524 break 28525 } 28526 if mem != x1.Args[2] { 28527 break 28528 } 28529 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28530 break 28531 } 28532 b = mergePoint(b, x0, x1) 28533 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28534 v.reset(OpCopy) 28535 v.AddArg(v0) 28536 v0.AuxInt = i0 28537 v0.Aux = s 28538 v0.AddArg(p) 28539 v0.AddArg(idx) 28540 v0.AddArg(mem) 28541 return true 28542 } 28543 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 28544 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28545 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28546 for { 28547 sh := v.Args[0] 28548 if sh.Op != OpS390XSLWconst { 28549 break 28550 } 28551 if sh.AuxInt != 8 { 28552 break 28553 } 28554 x0 := sh.Args[0] 28555 if x0.Op != OpS390XMOVBZloadidx { 28556 break 28557 } 28558 i0 := x0.AuxInt 28559 s := x0.Aux 28560 p := x0.Args[0] 28561 idx := x0.Args[1] 28562 mem := x0.Args[2] 28563 x1 := v.Args[1] 28564 if x1.Op != OpS390XMOVBZloadidx { 28565 break 28566 } 28567 i1 := x1.AuxInt 28568 if x1.Aux != s { 28569 break 28570 } 28571 if idx != x1.Args[0] { 28572 break 28573 } 28574 if p != x1.Args[1] { 28575 break 28576 } 28577 if mem != x1.Args[2] { 28578 break 28579 } 28580 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28581 break 28582 } 28583 b = mergePoint(b, x0, x1) 28584 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28585 v.reset(OpCopy) 28586 v.AddArg(v0) 28587 v0.AuxInt = i0 28588 v0.Aux = s 28589 v0.AddArg(p) 28590 v0.AddArg(idx) 28591 v0.AddArg(mem) 28592 return true 28593 } 28594 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 28595 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28596 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28597 for { 28598 sh := v.Args[0] 28599 if sh.Op != OpS390XSLWconst { 28600 break 28601 } 28602 if sh.AuxInt != 8 { 28603 break 28604 } 28605 x0 := sh.Args[0] 28606 if x0.Op != OpS390XMOVBZloadidx { 28607 break 28608 } 28609 i0 := x0.AuxInt 28610 s := x0.Aux 28611 idx := x0.Args[0] 28612 p := x0.Args[1] 28613 mem := x0.Args[2] 28614 x1 := v.Args[1] 28615 if x1.Op != OpS390XMOVBZloadidx { 28616 break 28617 } 28618 i1 := x1.AuxInt 28619 if x1.Aux != s { 28620 break 28621 } 28622 if idx != x1.Args[0] { 28623 break 28624 } 28625 if p != x1.Args[1] { 28626 break 28627 } 28628 if mem != x1.Args[2] { 28629 break 28630 } 28631 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28632 break 28633 } 28634 b = mergePoint(b, x0, x1) 28635 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28636 v.reset(OpCopy) 28637 v.AddArg(v0) 28638 v0.AuxInt = i0 28639 v0.Aux = s 28640 v0.AddArg(p) 28641 v0.AddArg(idx) 28642 v0.AddArg(mem) 28643 return true 28644 } 28645 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 28646 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28647 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28648 for { 28649 x1 := v.Args[0] 28650 if x1.Op != OpS390XMOVHZloadidx { 28651 break 28652 } 28653 i1 := x1.AuxInt 28654 s := x1.Aux 28655 p := x1.Args[0] 28656 idx := x1.Args[1] 28657 mem := x1.Args[2] 28658 sh := v.Args[1] 28659 if sh.Op != OpS390XSLWconst { 28660 break 28661 } 28662 if sh.AuxInt != 16 { 28663 break 28664 } 28665 x0 := sh.Args[0] 28666 if x0.Op != OpS390XMOVHZloadidx { 28667 break 28668 } 28669 i0 := x0.AuxInt 28670 if x0.Aux != s { 28671 break 28672 } 28673 if p != x0.Args[0] { 28674 break 28675 } 28676 if idx != x0.Args[1] { 28677 break 28678 } 28679 if mem != x0.Args[2] { 28680 break 28681 } 28682 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28683 break 28684 } 28685 b = mergePoint(b, x0, x1) 28686 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28687 v.reset(OpCopy) 28688 v.AddArg(v0) 28689 v0.AuxInt = i0 28690 v0.Aux = s 28691 v0.AddArg(p) 28692 v0.AddArg(idx) 28693 v0.AddArg(mem) 28694 return true 28695 } 28696 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 28697 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28698 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28699 for { 28700 x1 := v.Args[0] 28701 if x1.Op != OpS390XMOVHZloadidx { 28702 break 28703 } 28704 i1 := x1.AuxInt 28705 s := x1.Aux 28706 idx := x1.Args[0] 28707 p := x1.Args[1] 28708 mem := x1.Args[2] 28709 sh := v.Args[1] 28710 if sh.Op != OpS390XSLWconst { 28711 break 28712 } 28713 if sh.AuxInt != 16 { 28714 break 28715 } 28716 x0 := sh.Args[0] 28717 if x0.Op != OpS390XMOVHZloadidx { 28718 break 28719 } 28720 i0 := x0.AuxInt 28721 if x0.Aux != s { 28722 break 28723 } 28724 if p != x0.Args[0] { 28725 break 28726 } 28727 if idx != x0.Args[1] { 28728 break 28729 } 28730 if mem != x0.Args[2] { 28731 break 28732 } 28733 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28734 break 28735 } 28736 b = mergePoint(b, x0, x1) 28737 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28738 v.reset(OpCopy) 28739 v.AddArg(v0) 28740 v0.AuxInt = i0 28741 v0.Aux = s 28742 v0.AddArg(p) 28743 v0.AddArg(idx) 28744 v0.AddArg(mem) 28745 return true 28746 } 28747 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 28748 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28749 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28750 for { 28751 x1 := v.Args[0] 28752 if x1.Op != OpS390XMOVHZloadidx { 28753 break 28754 } 28755 i1 := x1.AuxInt 28756 s := x1.Aux 28757 p := x1.Args[0] 28758 idx := x1.Args[1] 28759 mem := x1.Args[2] 28760 sh := v.Args[1] 28761 if sh.Op != OpS390XSLWconst { 28762 break 28763 } 28764 if sh.AuxInt != 16 { 28765 break 28766 } 28767 x0 := sh.Args[0] 28768 if x0.Op != OpS390XMOVHZloadidx { 28769 break 28770 } 28771 i0 := x0.AuxInt 28772 if x0.Aux != s { 28773 break 28774 } 28775 if idx != x0.Args[0] { 28776 break 28777 } 28778 if p != x0.Args[1] { 28779 break 28780 } 28781 if mem != x0.Args[2] { 28782 break 28783 } 28784 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28785 break 28786 } 28787 b = mergePoint(b, x0, x1) 28788 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28789 v.reset(OpCopy) 28790 v.AddArg(v0) 28791 v0.AuxInt = i0 28792 v0.Aux = s 28793 v0.AddArg(p) 28794 v0.AddArg(idx) 28795 v0.AddArg(mem) 28796 return true 28797 } 28798 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 28799 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28800 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28801 for { 28802 x1 := v.Args[0] 28803 if x1.Op != OpS390XMOVHZloadidx { 28804 break 28805 } 28806 i1 := x1.AuxInt 28807 s := x1.Aux 28808 idx := x1.Args[0] 28809 p := x1.Args[1] 28810 mem := x1.Args[2] 28811 sh := v.Args[1] 28812 if sh.Op != OpS390XSLWconst { 28813 break 28814 } 28815 if sh.AuxInt != 16 { 28816 break 28817 } 28818 x0 := sh.Args[0] 28819 if x0.Op != OpS390XMOVHZloadidx { 28820 break 28821 } 28822 i0 := x0.AuxInt 28823 if x0.Aux != s { 28824 break 28825 } 28826 if idx != x0.Args[0] { 28827 break 28828 } 28829 if p != x0.Args[1] { 28830 break 28831 } 28832 if mem != x0.Args[2] { 28833 break 28834 } 28835 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28836 break 28837 } 28838 b = mergePoint(b, x0, x1) 28839 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28840 v.reset(OpCopy) 28841 v.AddArg(v0) 28842 v0.AuxInt = i0 28843 v0.Aux = s 28844 v0.AddArg(p) 28845 v0.AddArg(idx) 28846 v0.AddArg(mem) 28847 return true 28848 } 28849 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 28850 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28851 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28852 for { 28853 sh := v.Args[0] 28854 if sh.Op != OpS390XSLWconst { 28855 break 28856 } 28857 if sh.AuxInt != 16 { 28858 break 28859 } 28860 x0 := sh.Args[0] 28861 if x0.Op != OpS390XMOVHZloadidx { 28862 break 28863 } 28864 i0 := x0.AuxInt 28865 s := x0.Aux 28866 p := x0.Args[0] 28867 idx := x0.Args[1] 28868 mem := x0.Args[2] 28869 x1 := v.Args[1] 28870 if x1.Op != OpS390XMOVHZloadidx { 28871 break 28872 } 28873 i1 := x1.AuxInt 28874 if x1.Aux != s { 28875 break 28876 } 28877 if p != x1.Args[0] { 28878 break 28879 } 28880 if idx != x1.Args[1] { 28881 break 28882 } 28883 if mem != x1.Args[2] { 28884 break 28885 } 28886 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28887 break 28888 } 28889 b = mergePoint(b, x0, x1) 28890 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28891 v.reset(OpCopy) 28892 v.AddArg(v0) 28893 v0.AuxInt = i0 28894 v0.Aux = s 28895 v0.AddArg(p) 28896 v0.AddArg(idx) 28897 v0.AddArg(mem) 28898 return true 28899 } 28900 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 28901 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28902 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28903 for { 28904 sh := v.Args[0] 28905 if sh.Op != OpS390XSLWconst { 28906 break 28907 } 28908 if sh.AuxInt != 16 { 28909 break 28910 } 28911 x0 := sh.Args[0] 28912 if x0.Op != OpS390XMOVHZloadidx { 28913 break 28914 } 28915 i0 := x0.AuxInt 28916 s := x0.Aux 28917 idx := x0.Args[0] 28918 p := x0.Args[1] 28919 mem := x0.Args[2] 28920 x1 := v.Args[1] 28921 if x1.Op != OpS390XMOVHZloadidx { 28922 break 28923 } 28924 i1 := x1.AuxInt 28925 if x1.Aux != s { 28926 break 28927 } 28928 if p != x1.Args[0] { 28929 break 28930 } 28931 if idx != x1.Args[1] { 28932 break 28933 } 28934 if mem != x1.Args[2] { 28935 break 28936 } 28937 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28938 break 28939 } 28940 b = mergePoint(b, x0, x1) 28941 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28942 v.reset(OpCopy) 28943 v.AddArg(v0) 28944 v0.AuxInt = i0 28945 v0.Aux = s 28946 v0.AddArg(p) 28947 v0.AddArg(idx) 28948 v0.AddArg(mem) 28949 return true 28950 } 28951 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 28952 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28953 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28954 for { 28955 sh := v.Args[0] 28956 if sh.Op != OpS390XSLWconst { 28957 break 28958 } 28959 if sh.AuxInt != 16 { 28960 break 28961 } 28962 x0 := sh.Args[0] 28963 if x0.Op != OpS390XMOVHZloadidx { 28964 break 28965 } 28966 i0 := x0.AuxInt 28967 s := x0.Aux 28968 p := x0.Args[0] 28969 idx := x0.Args[1] 28970 mem := x0.Args[2] 28971 x1 := v.Args[1] 28972 if x1.Op != OpS390XMOVHZloadidx { 28973 break 28974 } 28975 i1 := x1.AuxInt 28976 if x1.Aux != s { 28977 break 28978 } 28979 if idx != x1.Args[0] { 28980 break 28981 } 28982 if p != x1.Args[1] { 28983 break 28984 } 28985 if mem != x1.Args[2] { 28986 break 28987 } 28988 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28989 break 28990 } 28991 b = mergePoint(b, x0, x1) 28992 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28993 v.reset(OpCopy) 28994 v.AddArg(v0) 28995 v0.AuxInt = i0 28996 v0.Aux = s 28997 v0.AddArg(p) 28998 v0.AddArg(idx) 28999 v0.AddArg(mem) 29000 return true 29001 } 29002 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 29003 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 29004 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 29005 for { 29006 sh := v.Args[0] 29007 if sh.Op != OpS390XSLWconst { 29008 break 29009 } 29010 if sh.AuxInt != 16 { 29011 break 29012 } 29013 x0 := sh.Args[0] 29014 if x0.Op != OpS390XMOVHZloadidx { 29015 break 29016 } 29017 i0 := x0.AuxInt 29018 s := x0.Aux 29019 idx := x0.Args[0] 29020 p := x0.Args[1] 29021 mem := x0.Args[2] 29022 x1 := v.Args[1] 29023 if x1.Op != OpS390XMOVHZloadidx { 29024 break 29025 } 29026 i1 := x1.AuxInt 29027 if x1.Aux != s { 29028 break 29029 } 29030 if idx != x1.Args[0] { 29031 break 29032 } 29033 if p != x1.Args[1] { 29034 break 29035 } 29036 if mem != x1.Args[2] { 29037 break 29038 } 29039 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 29040 break 29041 } 29042 b = mergePoint(b, x0, x1) 29043 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 29044 v.reset(OpCopy) 29045 v.AddArg(v0) 29046 v0.AuxInt = i0 29047 v0.Aux = s 29048 v0.AddArg(p) 29049 v0.AddArg(idx) 29050 v0.AddArg(mem) 29051 return true 29052 } 29053 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 29054 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29055 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29056 for { 29057 s0 := v.Args[0] 29058 if s0.Op != OpS390XSLWconst { 29059 break 29060 } 29061 j0 := s0.AuxInt 29062 x0 := s0.Args[0] 29063 if x0.Op != OpS390XMOVBZloadidx { 29064 break 29065 } 29066 i0 := x0.AuxInt 29067 s := x0.Aux 29068 p := x0.Args[0] 29069 idx := x0.Args[1] 29070 mem := x0.Args[2] 29071 or := v.Args[1] 29072 if or.Op != OpS390XORW { 29073 break 29074 } 29075 s1 := or.Args[0] 29076 if s1.Op != OpS390XSLWconst { 29077 break 29078 } 29079 j1 := s1.AuxInt 29080 x1 := s1.Args[0] 29081 if x1.Op != OpS390XMOVBZloadidx { 29082 break 29083 } 29084 i1 := x1.AuxInt 29085 if x1.Aux != s { 29086 break 29087 } 29088 if p != x1.Args[0] { 29089 break 29090 } 29091 if idx != x1.Args[1] { 29092 break 29093 } 29094 if mem != x1.Args[2] { 29095 break 29096 } 29097 y := or.Args[1] 29098 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29099 break 29100 } 29101 b = mergePoint(b, x0, x1) 29102 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29103 v.reset(OpCopy) 29104 v.AddArg(v0) 29105 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29106 v1.AuxInt = j1 29107 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29108 v2.AuxInt = i0 29109 v2.Aux = s 29110 v2.AddArg(p) 29111 v2.AddArg(idx) 29112 v2.AddArg(mem) 29113 v1.AddArg(v2) 29114 v0.AddArg(v1) 29115 v0.AddArg(y) 29116 return true 29117 } 29118 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 29119 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29120 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29121 for { 29122 s0 := v.Args[0] 29123 if s0.Op != OpS390XSLWconst { 29124 break 29125 } 29126 j0 := s0.AuxInt 29127 x0 := s0.Args[0] 29128 if x0.Op != OpS390XMOVBZloadidx { 29129 break 29130 } 29131 i0 := x0.AuxInt 29132 s := x0.Aux 29133 idx := x0.Args[0] 29134 p := x0.Args[1] 29135 mem := x0.Args[2] 29136 or := v.Args[1] 29137 if or.Op != OpS390XORW { 29138 break 29139 } 29140 s1 := or.Args[0] 29141 if s1.Op != OpS390XSLWconst { 29142 break 29143 } 29144 j1 := s1.AuxInt 29145 x1 := s1.Args[0] 29146 if x1.Op != OpS390XMOVBZloadidx { 29147 break 29148 } 29149 i1 := x1.AuxInt 29150 if x1.Aux != s { 29151 break 29152 } 29153 if p != x1.Args[0] { 29154 break 29155 } 29156 if idx != x1.Args[1] { 29157 break 29158 } 29159 if mem != x1.Args[2] { 29160 break 29161 } 29162 y := or.Args[1] 29163 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29164 break 29165 } 29166 b = mergePoint(b, x0, x1) 29167 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29168 v.reset(OpCopy) 29169 v.AddArg(v0) 29170 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29171 v1.AuxInt = j1 29172 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29173 v2.AuxInt = i0 29174 v2.Aux = s 29175 v2.AddArg(p) 29176 v2.AddArg(idx) 29177 v2.AddArg(mem) 29178 v1.AddArg(v2) 29179 v0.AddArg(v1) 29180 v0.AddArg(y) 29181 return true 29182 } 29183 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 29184 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29185 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29186 for { 29187 s0 := v.Args[0] 29188 if s0.Op != OpS390XSLWconst { 29189 break 29190 } 29191 j0 := s0.AuxInt 29192 x0 := s0.Args[0] 29193 if x0.Op != OpS390XMOVBZloadidx { 29194 break 29195 } 29196 i0 := x0.AuxInt 29197 s := x0.Aux 29198 p := x0.Args[0] 29199 idx := x0.Args[1] 29200 mem := x0.Args[2] 29201 or := v.Args[1] 29202 if or.Op != OpS390XORW { 29203 break 29204 } 29205 s1 := or.Args[0] 29206 if s1.Op != OpS390XSLWconst { 29207 break 29208 } 29209 j1 := s1.AuxInt 29210 x1 := s1.Args[0] 29211 if x1.Op != OpS390XMOVBZloadidx { 29212 break 29213 } 29214 i1 := x1.AuxInt 29215 if x1.Aux != s { 29216 break 29217 } 29218 if idx != x1.Args[0] { 29219 break 29220 } 29221 if p != x1.Args[1] { 29222 break 29223 } 29224 if mem != x1.Args[2] { 29225 break 29226 } 29227 y := or.Args[1] 29228 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29229 break 29230 } 29231 b = mergePoint(b, x0, x1) 29232 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29233 v.reset(OpCopy) 29234 v.AddArg(v0) 29235 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29236 v1.AuxInt = j1 29237 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29238 v2.AuxInt = i0 29239 v2.Aux = s 29240 v2.AddArg(p) 29241 v2.AddArg(idx) 29242 v2.AddArg(mem) 29243 v1.AddArg(v2) 29244 v0.AddArg(v1) 29245 v0.AddArg(y) 29246 return true 29247 } 29248 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 29249 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29250 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29251 for { 29252 s0 := v.Args[0] 29253 if s0.Op != OpS390XSLWconst { 29254 break 29255 } 29256 j0 := s0.AuxInt 29257 x0 := s0.Args[0] 29258 if x0.Op != OpS390XMOVBZloadidx { 29259 break 29260 } 29261 i0 := x0.AuxInt 29262 s := x0.Aux 29263 idx := x0.Args[0] 29264 p := x0.Args[1] 29265 mem := x0.Args[2] 29266 or := v.Args[1] 29267 if or.Op != OpS390XORW { 29268 break 29269 } 29270 s1 := or.Args[0] 29271 if s1.Op != OpS390XSLWconst { 29272 break 29273 } 29274 j1 := s1.AuxInt 29275 x1 := s1.Args[0] 29276 if x1.Op != OpS390XMOVBZloadidx { 29277 break 29278 } 29279 i1 := x1.AuxInt 29280 if x1.Aux != s { 29281 break 29282 } 29283 if idx != x1.Args[0] { 29284 break 29285 } 29286 if p != x1.Args[1] { 29287 break 29288 } 29289 if mem != x1.Args[2] { 29290 break 29291 } 29292 y := or.Args[1] 29293 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29294 break 29295 } 29296 b = mergePoint(b, x0, x1) 29297 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29298 v.reset(OpCopy) 29299 v.AddArg(v0) 29300 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29301 v1.AuxInt = j1 29302 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29303 v2.AuxInt = i0 29304 v2.Aux = s 29305 v2.AddArg(p) 29306 v2.AddArg(idx) 29307 v2.AddArg(mem) 29308 v1.AddArg(v2) 29309 v0.AddArg(v1) 29310 v0.AddArg(y) 29311 return true 29312 } 29313 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 29314 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29315 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29316 for { 29317 s0 := v.Args[0] 29318 if s0.Op != OpS390XSLWconst { 29319 break 29320 } 29321 j0 := s0.AuxInt 29322 x0 := s0.Args[0] 29323 if x0.Op != OpS390XMOVBZloadidx { 29324 break 29325 } 29326 i0 := x0.AuxInt 29327 s := x0.Aux 29328 p := x0.Args[0] 29329 idx := x0.Args[1] 29330 mem := x0.Args[2] 29331 or := v.Args[1] 29332 if or.Op != OpS390XORW { 29333 break 29334 } 29335 y := or.Args[0] 29336 s1 := or.Args[1] 29337 if s1.Op != OpS390XSLWconst { 29338 break 29339 } 29340 j1 := s1.AuxInt 29341 x1 := s1.Args[0] 29342 if x1.Op != OpS390XMOVBZloadidx { 29343 break 29344 } 29345 i1 := x1.AuxInt 29346 if x1.Aux != s { 29347 break 29348 } 29349 if p != x1.Args[0] { 29350 break 29351 } 29352 if idx != x1.Args[1] { 29353 break 29354 } 29355 if mem != x1.Args[2] { 29356 break 29357 } 29358 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29359 break 29360 } 29361 b = mergePoint(b, x0, x1) 29362 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29363 v.reset(OpCopy) 29364 v.AddArg(v0) 29365 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29366 v1.AuxInt = j1 29367 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29368 v2.AuxInt = i0 29369 v2.Aux = s 29370 v2.AddArg(p) 29371 v2.AddArg(idx) 29372 v2.AddArg(mem) 29373 v1.AddArg(v2) 29374 v0.AddArg(v1) 29375 v0.AddArg(y) 29376 return true 29377 } 29378 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 29379 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29380 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29381 for { 29382 s0 := v.Args[0] 29383 if s0.Op != OpS390XSLWconst { 29384 break 29385 } 29386 j0 := s0.AuxInt 29387 x0 := s0.Args[0] 29388 if x0.Op != OpS390XMOVBZloadidx { 29389 break 29390 } 29391 i0 := x0.AuxInt 29392 s := x0.Aux 29393 idx := x0.Args[0] 29394 p := x0.Args[1] 29395 mem := x0.Args[2] 29396 or := v.Args[1] 29397 if or.Op != OpS390XORW { 29398 break 29399 } 29400 y := or.Args[0] 29401 s1 := or.Args[1] 29402 if s1.Op != OpS390XSLWconst { 29403 break 29404 } 29405 j1 := s1.AuxInt 29406 x1 := s1.Args[0] 29407 if x1.Op != OpS390XMOVBZloadidx { 29408 break 29409 } 29410 i1 := x1.AuxInt 29411 if x1.Aux != s { 29412 break 29413 } 29414 if p != x1.Args[0] { 29415 break 29416 } 29417 if idx != x1.Args[1] { 29418 break 29419 } 29420 if mem != x1.Args[2] { 29421 break 29422 } 29423 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29424 break 29425 } 29426 b = mergePoint(b, x0, x1) 29427 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29428 v.reset(OpCopy) 29429 v.AddArg(v0) 29430 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29431 v1.AuxInt = j1 29432 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29433 v2.AuxInt = i0 29434 v2.Aux = s 29435 v2.AddArg(p) 29436 v2.AddArg(idx) 29437 v2.AddArg(mem) 29438 v1.AddArg(v2) 29439 v0.AddArg(v1) 29440 v0.AddArg(y) 29441 return true 29442 } 29443 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 29444 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29445 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29446 for { 29447 s0 := v.Args[0] 29448 if s0.Op != OpS390XSLWconst { 29449 break 29450 } 29451 j0 := s0.AuxInt 29452 x0 := s0.Args[0] 29453 if x0.Op != OpS390XMOVBZloadidx { 29454 break 29455 } 29456 i0 := x0.AuxInt 29457 s := x0.Aux 29458 p := x0.Args[0] 29459 idx := x0.Args[1] 29460 mem := x0.Args[2] 29461 or := v.Args[1] 29462 if or.Op != OpS390XORW { 29463 break 29464 } 29465 y := or.Args[0] 29466 s1 := or.Args[1] 29467 if s1.Op != OpS390XSLWconst { 29468 break 29469 } 29470 j1 := s1.AuxInt 29471 x1 := s1.Args[0] 29472 if x1.Op != OpS390XMOVBZloadidx { 29473 break 29474 } 29475 i1 := x1.AuxInt 29476 if x1.Aux != s { 29477 break 29478 } 29479 if idx != x1.Args[0] { 29480 break 29481 } 29482 if p != x1.Args[1] { 29483 break 29484 } 29485 if mem != x1.Args[2] { 29486 break 29487 } 29488 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29489 break 29490 } 29491 b = mergePoint(b, x0, x1) 29492 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29493 v.reset(OpCopy) 29494 v.AddArg(v0) 29495 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29496 v1.AuxInt = j1 29497 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29498 v2.AuxInt = i0 29499 v2.Aux = s 29500 v2.AddArg(p) 29501 v2.AddArg(idx) 29502 v2.AddArg(mem) 29503 v1.AddArg(v2) 29504 v0.AddArg(v1) 29505 v0.AddArg(y) 29506 return true 29507 } 29508 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 29509 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29510 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29511 for { 29512 s0 := v.Args[0] 29513 if s0.Op != OpS390XSLWconst { 29514 break 29515 } 29516 j0 := s0.AuxInt 29517 x0 := s0.Args[0] 29518 if x0.Op != OpS390XMOVBZloadidx { 29519 break 29520 } 29521 i0 := x0.AuxInt 29522 s := x0.Aux 29523 idx := x0.Args[0] 29524 p := x0.Args[1] 29525 mem := x0.Args[2] 29526 or := v.Args[1] 29527 if or.Op != OpS390XORW { 29528 break 29529 } 29530 y := or.Args[0] 29531 s1 := or.Args[1] 29532 if s1.Op != OpS390XSLWconst { 29533 break 29534 } 29535 j1 := s1.AuxInt 29536 x1 := s1.Args[0] 29537 if x1.Op != OpS390XMOVBZloadidx { 29538 break 29539 } 29540 i1 := x1.AuxInt 29541 if x1.Aux != s { 29542 break 29543 } 29544 if idx != x1.Args[0] { 29545 break 29546 } 29547 if p != x1.Args[1] { 29548 break 29549 } 29550 if mem != x1.Args[2] { 29551 break 29552 } 29553 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29554 break 29555 } 29556 b = mergePoint(b, x0, x1) 29557 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29558 v.reset(OpCopy) 29559 v.AddArg(v0) 29560 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29561 v1.AuxInt = j1 29562 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29563 v2.AuxInt = i0 29564 v2.Aux = s 29565 v2.AddArg(p) 29566 v2.AddArg(idx) 29567 v2.AddArg(mem) 29568 v1.AddArg(v2) 29569 v0.AddArg(v1) 29570 v0.AddArg(y) 29571 return true 29572 } 29573 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29574 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29575 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29576 for { 29577 or := v.Args[0] 29578 if or.Op != OpS390XORW { 29579 break 29580 } 29581 s1 := or.Args[0] 29582 if s1.Op != OpS390XSLWconst { 29583 break 29584 } 29585 j1 := s1.AuxInt 29586 x1 := s1.Args[0] 29587 if x1.Op != OpS390XMOVBZloadidx { 29588 break 29589 } 29590 i1 := x1.AuxInt 29591 s := x1.Aux 29592 p := x1.Args[0] 29593 idx := x1.Args[1] 29594 mem := x1.Args[2] 29595 y := or.Args[1] 29596 s0 := v.Args[1] 29597 if s0.Op != OpS390XSLWconst { 29598 break 29599 } 29600 j0 := s0.AuxInt 29601 x0 := s0.Args[0] 29602 if x0.Op != OpS390XMOVBZloadidx { 29603 break 29604 } 29605 i0 := x0.AuxInt 29606 if x0.Aux != s { 29607 break 29608 } 29609 if p != x0.Args[0] { 29610 break 29611 } 29612 if idx != x0.Args[1] { 29613 break 29614 } 29615 if mem != x0.Args[2] { 29616 break 29617 } 29618 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29619 break 29620 } 29621 b = mergePoint(b, x0, x1) 29622 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29623 v.reset(OpCopy) 29624 v.AddArg(v0) 29625 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29626 v1.AuxInt = j1 29627 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29628 v2.AuxInt = i0 29629 v2.Aux = s 29630 v2.AddArg(p) 29631 v2.AddArg(idx) 29632 v2.AddArg(mem) 29633 v1.AddArg(v2) 29634 v0.AddArg(v1) 29635 v0.AddArg(y) 29636 return true 29637 } 29638 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29639 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29640 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29641 for { 29642 or := v.Args[0] 29643 if or.Op != OpS390XORW { 29644 break 29645 } 29646 s1 := or.Args[0] 29647 if s1.Op != OpS390XSLWconst { 29648 break 29649 } 29650 j1 := s1.AuxInt 29651 x1 := s1.Args[0] 29652 if x1.Op != OpS390XMOVBZloadidx { 29653 break 29654 } 29655 i1 := x1.AuxInt 29656 s := x1.Aux 29657 idx := x1.Args[0] 29658 p := x1.Args[1] 29659 mem := x1.Args[2] 29660 y := or.Args[1] 29661 s0 := v.Args[1] 29662 if s0.Op != OpS390XSLWconst { 29663 break 29664 } 29665 j0 := s0.AuxInt 29666 x0 := s0.Args[0] 29667 if x0.Op != OpS390XMOVBZloadidx { 29668 break 29669 } 29670 i0 := x0.AuxInt 29671 if x0.Aux != s { 29672 break 29673 } 29674 if p != x0.Args[0] { 29675 break 29676 } 29677 if idx != x0.Args[1] { 29678 break 29679 } 29680 if mem != x0.Args[2] { 29681 break 29682 } 29683 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29684 break 29685 } 29686 b = mergePoint(b, x0, x1) 29687 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29688 v.reset(OpCopy) 29689 v.AddArg(v0) 29690 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29691 v1.AuxInt = j1 29692 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29693 v2.AuxInt = i0 29694 v2.Aux = s 29695 v2.AddArg(p) 29696 v2.AddArg(idx) 29697 v2.AddArg(mem) 29698 v1.AddArg(v2) 29699 v0.AddArg(v1) 29700 v0.AddArg(y) 29701 return true 29702 } 29703 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29704 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29705 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29706 for { 29707 or := v.Args[0] 29708 if or.Op != OpS390XORW { 29709 break 29710 } 29711 y := or.Args[0] 29712 s1 := or.Args[1] 29713 if s1.Op != OpS390XSLWconst { 29714 break 29715 } 29716 j1 := s1.AuxInt 29717 x1 := s1.Args[0] 29718 if x1.Op != OpS390XMOVBZloadidx { 29719 break 29720 } 29721 i1 := x1.AuxInt 29722 s := x1.Aux 29723 p := x1.Args[0] 29724 idx := x1.Args[1] 29725 mem := x1.Args[2] 29726 s0 := v.Args[1] 29727 if s0.Op != OpS390XSLWconst { 29728 break 29729 } 29730 j0 := s0.AuxInt 29731 x0 := s0.Args[0] 29732 if x0.Op != OpS390XMOVBZloadidx { 29733 break 29734 } 29735 i0 := x0.AuxInt 29736 if x0.Aux != s { 29737 break 29738 } 29739 if p != x0.Args[0] { 29740 break 29741 } 29742 if idx != x0.Args[1] { 29743 break 29744 } 29745 if mem != x0.Args[2] { 29746 break 29747 } 29748 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29749 break 29750 } 29751 b = mergePoint(b, x0, x1) 29752 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29753 v.reset(OpCopy) 29754 v.AddArg(v0) 29755 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29756 v1.AuxInt = j1 29757 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29758 v2.AuxInt = i0 29759 v2.Aux = s 29760 v2.AddArg(p) 29761 v2.AddArg(idx) 29762 v2.AddArg(mem) 29763 v1.AddArg(v2) 29764 v0.AddArg(v1) 29765 v0.AddArg(y) 29766 return true 29767 } 29768 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29769 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29770 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29771 for { 29772 or := v.Args[0] 29773 if or.Op != OpS390XORW { 29774 break 29775 } 29776 y := or.Args[0] 29777 s1 := or.Args[1] 29778 if s1.Op != OpS390XSLWconst { 29779 break 29780 } 29781 j1 := s1.AuxInt 29782 x1 := s1.Args[0] 29783 if x1.Op != OpS390XMOVBZloadidx { 29784 break 29785 } 29786 i1 := x1.AuxInt 29787 s := x1.Aux 29788 idx := x1.Args[0] 29789 p := x1.Args[1] 29790 mem := x1.Args[2] 29791 s0 := v.Args[1] 29792 if s0.Op != OpS390XSLWconst { 29793 break 29794 } 29795 j0 := s0.AuxInt 29796 x0 := s0.Args[0] 29797 if x0.Op != OpS390XMOVBZloadidx { 29798 break 29799 } 29800 i0 := x0.AuxInt 29801 if x0.Aux != s { 29802 break 29803 } 29804 if p != x0.Args[0] { 29805 break 29806 } 29807 if idx != x0.Args[1] { 29808 break 29809 } 29810 if mem != x0.Args[2] { 29811 break 29812 } 29813 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29814 break 29815 } 29816 b = mergePoint(b, x0, x1) 29817 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29818 v.reset(OpCopy) 29819 v.AddArg(v0) 29820 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29821 v1.AuxInt = j1 29822 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29823 v2.AuxInt = i0 29824 v2.Aux = s 29825 v2.AddArg(p) 29826 v2.AddArg(idx) 29827 v2.AddArg(mem) 29828 v1.AddArg(v2) 29829 v0.AddArg(v1) 29830 v0.AddArg(y) 29831 return true 29832 } 29833 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29834 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29835 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29836 for { 29837 or := v.Args[0] 29838 if or.Op != OpS390XORW { 29839 break 29840 } 29841 s1 := or.Args[0] 29842 if s1.Op != OpS390XSLWconst { 29843 break 29844 } 29845 j1 := s1.AuxInt 29846 x1 := s1.Args[0] 29847 if x1.Op != OpS390XMOVBZloadidx { 29848 break 29849 } 29850 i1 := x1.AuxInt 29851 s := x1.Aux 29852 p := x1.Args[0] 29853 idx := x1.Args[1] 29854 mem := x1.Args[2] 29855 y := or.Args[1] 29856 s0 := v.Args[1] 29857 if s0.Op != OpS390XSLWconst { 29858 break 29859 } 29860 j0 := s0.AuxInt 29861 x0 := s0.Args[0] 29862 if x0.Op != OpS390XMOVBZloadidx { 29863 break 29864 } 29865 i0 := x0.AuxInt 29866 if x0.Aux != s { 29867 break 29868 } 29869 if idx != x0.Args[0] { 29870 break 29871 } 29872 if p != x0.Args[1] { 29873 break 29874 } 29875 if mem != x0.Args[2] { 29876 break 29877 } 29878 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29879 break 29880 } 29881 b = mergePoint(b, x0, x1) 29882 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29883 v.reset(OpCopy) 29884 v.AddArg(v0) 29885 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29886 v1.AuxInt = j1 29887 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29888 v2.AuxInt = i0 29889 v2.Aux = s 29890 v2.AddArg(p) 29891 v2.AddArg(idx) 29892 v2.AddArg(mem) 29893 v1.AddArg(v2) 29894 v0.AddArg(v1) 29895 v0.AddArg(y) 29896 return true 29897 } 29898 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29899 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29900 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29901 for { 29902 or := v.Args[0] 29903 if or.Op != OpS390XORW { 29904 break 29905 } 29906 s1 := or.Args[0] 29907 if s1.Op != OpS390XSLWconst { 29908 break 29909 } 29910 j1 := s1.AuxInt 29911 x1 := s1.Args[0] 29912 if x1.Op != OpS390XMOVBZloadidx { 29913 break 29914 } 29915 i1 := x1.AuxInt 29916 s := x1.Aux 29917 idx := x1.Args[0] 29918 p := x1.Args[1] 29919 mem := x1.Args[2] 29920 y := or.Args[1] 29921 s0 := v.Args[1] 29922 if s0.Op != OpS390XSLWconst { 29923 break 29924 } 29925 j0 := s0.AuxInt 29926 x0 := s0.Args[0] 29927 if x0.Op != OpS390XMOVBZloadidx { 29928 break 29929 } 29930 i0 := x0.AuxInt 29931 if x0.Aux != s { 29932 break 29933 } 29934 if idx != x0.Args[0] { 29935 break 29936 } 29937 if p != x0.Args[1] { 29938 break 29939 } 29940 if mem != x0.Args[2] { 29941 break 29942 } 29943 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29944 break 29945 } 29946 b = mergePoint(b, x0, x1) 29947 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29948 v.reset(OpCopy) 29949 v.AddArg(v0) 29950 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29951 v1.AuxInt = j1 29952 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29953 v2.AuxInt = i0 29954 v2.Aux = s 29955 v2.AddArg(p) 29956 v2.AddArg(idx) 29957 v2.AddArg(mem) 29958 v1.AddArg(v2) 29959 v0.AddArg(v1) 29960 v0.AddArg(y) 29961 return true 29962 } 29963 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29964 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29965 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29966 for { 29967 or := v.Args[0] 29968 if or.Op != OpS390XORW { 29969 break 29970 } 29971 y := or.Args[0] 29972 s1 := or.Args[1] 29973 if s1.Op != OpS390XSLWconst { 29974 break 29975 } 29976 j1 := s1.AuxInt 29977 x1 := s1.Args[0] 29978 if x1.Op != OpS390XMOVBZloadidx { 29979 break 29980 } 29981 i1 := x1.AuxInt 29982 s := x1.Aux 29983 p := x1.Args[0] 29984 idx := x1.Args[1] 29985 mem := x1.Args[2] 29986 s0 := v.Args[1] 29987 if s0.Op != OpS390XSLWconst { 29988 break 29989 } 29990 j0 := s0.AuxInt 29991 x0 := s0.Args[0] 29992 if x0.Op != OpS390XMOVBZloadidx { 29993 break 29994 } 29995 i0 := x0.AuxInt 29996 if x0.Aux != s { 29997 break 29998 } 29999 if idx != x0.Args[0] { 30000 break 30001 } 30002 if p != x0.Args[1] { 30003 break 30004 } 30005 if mem != x0.Args[2] { 30006 break 30007 } 30008 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30009 break 30010 } 30011 b = mergePoint(b, x0, x1) 30012 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30013 v.reset(OpCopy) 30014 v.AddArg(v0) 30015 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30016 v1.AuxInt = j1 30017 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30018 v2.AuxInt = i0 30019 v2.Aux = s 30020 v2.AddArg(p) 30021 v2.AddArg(idx) 30022 v2.AddArg(mem) 30023 v1.AddArg(v2) 30024 v0.AddArg(v1) 30025 v0.AddArg(y) 30026 return true 30027 } 30028 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 30029 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30030 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30031 for { 30032 or := v.Args[0] 30033 if or.Op != OpS390XORW { 30034 break 30035 } 30036 y := or.Args[0] 30037 s1 := or.Args[1] 30038 if s1.Op != OpS390XSLWconst { 30039 break 30040 } 30041 j1 := s1.AuxInt 30042 x1 := s1.Args[0] 30043 if x1.Op != OpS390XMOVBZloadidx { 30044 break 30045 } 30046 i1 := x1.AuxInt 30047 s := x1.Aux 30048 idx := x1.Args[0] 30049 p := x1.Args[1] 30050 mem := x1.Args[2] 30051 s0 := v.Args[1] 30052 if s0.Op != OpS390XSLWconst { 30053 break 30054 } 30055 j0 := s0.AuxInt 30056 x0 := s0.Args[0] 30057 if x0.Op != OpS390XMOVBZloadidx { 30058 break 30059 } 30060 i0 := x0.AuxInt 30061 if x0.Aux != s { 30062 break 30063 } 30064 if idx != x0.Args[0] { 30065 break 30066 } 30067 if p != x0.Args[1] { 30068 break 30069 } 30070 if mem != x0.Args[2] { 30071 break 30072 } 30073 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30074 break 30075 } 30076 b = mergePoint(b, x0, x1) 30077 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30078 v.reset(OpCopy) 30079 v.AddArg(v0) 30080 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30081 v1.AuxInt = j1 30082 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30083 v2.AuxInt = i0 30084 v2.Aux = s 30085 v2.AddArg(p) 30086 v2.AddArg(idx) 30087 v2.AddArg(mem) 30088 v1.AddArg(v2) 30089 v0.AddArg(v1) 30090 v0.AddArg(y) 30091 return true 30092 } 30093 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 30094 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30095 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 30096 for { 30097 x0 := v.Args[0] 30098 if x0.Op != OpS390XMOVBZload { 30099 break 30100 } 30101 i0 := x0.AuxInt 30102 s := x0.Aux 30103 p := x0.Args[0] 30104 mem := x0.Args[1] 30105 sh := v.Args[1] 30106 if sh.Op != OpS390XSLWconst { 30107 break 30108 } 30109 if sh.AuxInt != 8 { 30110 break 30111 } 30112 x1 := sh.Args[0] 30113 if x1.Op != OpS390XMOVBZload { 30114 break 30115 } 30116 i1 := x1.AuxInt 30117 if x1.Aux != s { 30118 break 30119 } 30120 if p != x1.Args[0] { 30121 break 30122 } 30123 if mem != x1.Args[1] { 30124 break 30125 } 30126 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30127 break 30128 } 30129 b = mergePoint(b, x0, x1) 30130 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30131 v.reset(OpCopy) 30132 v.AddArg(v0) 30133 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30134 v1.AuxInt = i0 30135 v1.Aux = s 30136 v1.AddArg(p) 30137 v1.AddArg(mem) 30138 v0.AddArg(v1) 30139 return true 30140 } 30141 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 30142 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30143 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 30144 for { 30145 sh := v.Args[0] 30146 if sh.Op != OpS390XSLWconst { 30147 break 30148 } 30149 if sh.AuxInt != 8 { 30150 break 30151 } 30152 x1 := sh.Args[0] 30153 if x1.Op != OpS390XMOVBZload { 30154 break 30155 } 30156 i1 := x1.AuxInt 30157 s := x1.Aux 30158 p := x1.Args[0] 30159 mem := x1.Args[1] 30160 x0 := v.Args[1] 30161 if x0.Op != OpS390XMOVBZload { 30162 break 30163 } 30164 i0 := x0.AuxInt 30165 if x0.Aux != s { 30166 break 30167 } 30168 if p != x0.Args[0] { 30169 break 30170 } 30171 if mem != x0.Args[1] { 30172 break 30173 } 30174 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30175 break 30176 } 30177 b = mergePoint(b, x0, x1) 30178 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30179 v.reset(OpCopy) 30180 v.AddArg(v0) 30181 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30182 v1.AuxInt = i0 30183 v1.Aux = s 30184 v1.AddArg(p) 30185 v1.AddArg(mem) 30186 v0.AddArg(v1) 30187 return true 30188 } 30189 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 30190 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 30191 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 30192 for { 30193 r0 := v.Args[0] 30194 if r0.Op != OpS390XMOVHZreg { 30195 break 30196 } 30197 x0 := r0.Args[0] 30198 if x0.Op != OpS390XMOVHBRload { 30199 break 30200 } 30201 i0 := x0.AuxInt 30202 s := x0.Aux 30203 p := x0.Args[0] 30204 mem := x0.Args[1] 30205 sh := v.Args[1] 30206 if sh.Op != OpS390XSLWconst { 30207 break 30208 } 30209 if sh.AuxInt != 16 { 30210 break 30211 } 30212 r1 := sh.Args[0] 30213 if r1.Op != OpS390XMOVHZreg { 30214 break 30215 } 30216 x1 := r1.Args[0] 30217 if x1.Op != OpS390XMOVHBRload { 30218 break 30219 } 30220 i1 := x1.AuxInt 30221 if x1.Aux != s { 30222 break 30223 } 30224 if p != x1.Args[0] { 30225 break 30226 } 30227 if mem != x1.Args[1] { 30228 break 30229 } 30230 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 30231 break 30232 } 30233 b = mergePoint(b, x0, x1) 30234 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 30235 v.reset(OpCopy) 30236 v.AddArg(v0) 30237 v0.AuxInt = i0 30238 v0.Aux = s 30239 v0.AddArg(p) 30240 v0.AddArg(mem) 30241 return true 30242 } 30243 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 30244 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 30245 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 30246 for { 30247 sh := v.Args[0] 30248 if sh.Op != OpS390XSLWconst { 30249 break 30250 } 30251 if sh.AuxInt != 16 { 30252 break 30253 } 30254 r1 := sh.Args[0] 30255 if r1.Op != OpS390XMOVHZreg { 30256 break 30257 } 30258 x1 := r1.Args[0] 30259 if x1.Op != OpS390XMOVHBRload { 30260 break 30261 } 30262 i1 := x1.AuxInt 30263 s := x1.Aux 30264 p := x1.Args[0] 30265 mem := x1.Args[1] 30266 r0 := v.Args[1] 30267 if r0.Op != OpS390XMOVHZreg { 30268 break 30269 } 30270 x0 := r0.Args[0] 30271 if x0.Op != OpS390XMOVHBRload { 30272 break 30273 } 30274 i0 := x0.AuxInt 30275 if x0.Aux != s { 30276 break 30277 } 30278 if p != x0.Args[0] { 30279 break 30280 } 30281 if mem != x0.Args[1] { 30282 break 30283 } 30284 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 30285 break 30286 } 30287 b = mergePoint(b, x0, x1) 30288 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 30289 v.reset(OpCopy) 30290 v.AddArg(v0) 30291 v0.AuxInt = i0 30292 v0.Aux = s 30293 v0.AddArg(p) 30294 v0.AddArg(mem) 30295 return true 30296 } 30297 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 30298 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30299 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30300 for { 30301 s1 := v.Args[0] 30302 if s1.Op != OpS390XSLWconst { 30303 break 30304 } 30305 j1 := s1.AuxInt 30306 x1 := s1.Args[0] 30307 if x1.Op != OpS390XMOVBZload { 30308 break 30309 } 30310 i1 := x1.AuxInt 30311 s := x1.Aux 30312 p := x1.Args[0] 30313 mem := x1.Args[1] 30314 or := v.Args[1] 30315 if or.Op != OpS390XORW { 30316 break 30317 } 30318 s0 := or.Args[0] 30319 if s0.Op != OpS390XSLWconst { 30320 break 30321 } 30322 j0 := s0.AuxInt 30323 x0 := s0.Args[0] 30324 if x0.Op != OpS390XMOVBZload { 30325 break 30326 } 30327 i0 := x0.AuxInt 30328 if x0.Aux != s { 30329 break 30330 } 30331 if p != x0.Args[0] { 30332 break 30333 } 30334 if mem != x0.Args[1] { 30335 break 30336 } 30337 y := or.Args[1] 30338 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30339 break 30340 } 30341 b = mergePoint(b, x0, x1) 30342 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30343 v.reset(OpCopy) 30344 v.AddArg(v0) 30345 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30346 v1.AuxInt = j0 30347 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30348 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30349 v3.AuxInt = i0 30350 v3.Aux = s 30351 v3.AddArg(p) 30352 v3.AddArg(mem) 30353 v2.AddArg(v3) 30354 v1.AddArg(v2) 30355 v0.AddArg(v1) 30356 v0.AddArg(y) 30357 return true 30358 } 30359 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 30360 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30361 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30362 for { 30363 s1 := v.Args[0] 30364 if s1.Op != OpS390XSLWconst { 30365 break 30366 } 30367 j1 := s1.AuxInt 30368 x1 := s1.Args[0] 30369 if x1.Op != OpS390XMOVBZload { 30370 break 30371 } 30372 i1 := x1.AuxInt 30373 s := x1.Aux 30374 p := x1.Args[0] 30375 mem := x1.Args[1] 30376 or := v.Args[1] 30377 if or.Op != OpS390XORW { 30378 break 30379 } 30380 y := or.Args[0] 30381 s0 := or.Args[1] 30382 if s0.Op != OpS390XSLWconst { 30383 break 30384 } 30385 j0 := s0.AuxInt 30386 x0 := s0.Args[0] 30387 if x0.Op != OpS390XMOVBZload { 30388 break 30389 } 30390 i0 := x0.AuxInt 30391 if x0.Aux != s { 30392 break 30393 } 30394 if p != x0.Args[0] { 30395 break 30396 } 30397 if mem != x0.Args[1] { 30398 break 30399 } 30400 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30401 break 30402 } 30403 b = mergePoint(b, x0, x1) 30404 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30405 v.reset(OpCopy) 30406 v.AddArg(v0) 30407 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30408 v1.AuxInt = j0 30409 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30410 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30411 v3.AuxInt = i0 30412 v3.Aux = s 30413 v3.AddArg(p) 30414 v3.AddArg(mem) 30415 v2.AddArg(v3) 30416 v1.AddArg(v2) 30417 v0.AddArg(v1) 30418 v0.AddArg(y) 30419 return true 30420 } 30421 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 30422 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30423 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30424 for { 30425 or := v.Args[0] 30426 if or.Op != OpS390XORW { 30427 break 30428 } 30429 s0 := or.Args[0] 30430 if s0.Op != OpS390XSLWconst { 30431 break 30432 } 30433 j0 := s0.AuxInt 30434 x0 := s0.Args[0] 30435 if x0.Op != OpS390XMOVBZload { 30436 break 30437 } 30438 i0 := x0.AuxInt 30439 s := x0.Aux 30440 p := x0.Args[0] 30441 mem := x0.Args[1] 30442 y := or.Args[1] 30443 s1 := v.Args[1] 30444 if s1.Op != OpS390XSLWconst { 30445 break 30446 } 30447 j1 := s1.AuxInt 30448 x1 := s1.Args[0] 30449 if x1.Op != OpS390XMOVBZload { 30450 break 30451 } 30452 i1 := x1.AuxInt 30453 if x1.Aux != s { 30454 break 30455 } 30456 if p != x1.Args[0] { 30457 break 30458 } 30459 if mem != x1.Args[1] { 30460 break 30461 } 30462 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30463 break 30464 } 30465 b = mergePoint(b, x0, x1) 30466 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30467 v.reset(OpCopy) 30468 v.AddArg(v0) 30469 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30470 v1.AuxInt = j0 30471 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30472 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30473 v3.AuxInt = i0 30474 v3.Aux = s 30475 v3.AddArg(p) 30476 v3.AddArg(mem) 30477 v2.AddArg(v3) 30478 v1.AddArg(v2) 30479 v0.AddArg(v1) 30480 v0.AddArg(y) 30481 return true 30482 } 30483 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 30484 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30485 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30486 for { 30487 or := v.Args[0] 30488 if or.Op != OpS390XORW { 30489 break 30490 } 30491 y := or.Args[0] 30492 s0 := or.Args[1] 30493 if s0.Op != OpS390XSLWconst { 30494 break 30495 } 30496 j0 := s0.AuxInt 30497 x0 := s0.Args[0] 30498 if x0.Op != OpS390XMOVBZload { 30499 break 30500 } 30501 i0 := x0.AuxInt 30502 s := x0.Aux 30503 p := x0.Args[0] 30504 mem := x0.Args[1] 30505 s1 := v.Args[1] 30506 if s1.Op != OpS390XSLWconst { 30507 break 30508 } 30509 j1 := s1.AuxInt 30510 x1 := s1.Args[0] 30511 if x1.Op != OpS390XMOVBZload { 30512 break 30513 } 30514 i1 := x1.AuxInt 30515 if x1.Aux != s { 30516 break 30517 } 30518 if p != x1.Args[0] { 30519 break 30520 } 30521 if mem != x1.Args[1] { 30522 break 30523 } 30524 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30525 break 30526 } 30527 b = mergePoint(b, x0, x1) 30528 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30529 v.reset(OpCopy) 30530 v.AddArg(v0) 30531 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30532 v1.AuxInt = j0 30533 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30534 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30535 v3.AuxInt = i0 30536 v3.Aux = s 30537 v3.AddArg(p) 30538 v3.AddArg(mem) 30539 v2.AddArg(v3) 30540 v1.AddArg(v2) 30541 v0.AddArg(v1) 30542 v0.AddArg(y) 30543 return true 30544 } 30545 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 30546 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30547 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30548 for { 30549 x0 := v.Args[0] 30550 if x0.Op != OpS390XMOVBZloadidx { 30551 break 30552 } 30553 i0 := x0.AuxInt 30554 s := x0.Aux 30555 p := x0.Args[0] 30556 idx := x0.Args[1] 30557 mem := x0.Args[2] 30558 sh := v.Args[1] 30559 if sh.Op != OpS390XSLWconst { 30560 break 30561 } 30562 if sh.AuxInt != 8 { 30563 break 30564 } 30565 x1 := sh.Args[0] 30566 if x1.Op != OpS390XMOVBZloadidx { 30567 break 30568 } 30569 i1 := x1.AuxInt 30570 if x1.Aux != s { 30571 break 30572 } 30573 if p != x1.Args[0] { 30574 break 30575 } 30576 if idx != x1.Args[1] { 30577 break 30578 } 30579 if mem != x1.Args[2] { 30580 break 30581 } 30582 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30583 break 30584 } 30585 b = mergePoint(b, x0, x1) 30586 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30587 v.reset(OpCopy) 30588 v.AddArg(v0) 30589 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30590 v1.AuxInt = i0 30591 v1.Aux = s 30592 v1.AddArg(p) 30593 v1.AddArg(idx) 30594 v1.AddArg(mem) 30595 v0.AddArg(v1) 30596 return true 30597 } 30598 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 30599 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30600 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30601 for { 30602 x0 := v.Args[0] 30603 if x0.Op != OpS390XMOVBZloadidx { 30604 break 30605 } 30606 i0 := x0.AuxInt 30607 s := x0.Aux 30608 idx := x0.Args[0] 30609 p := x0.Args[1] 30610 mem := x0.Args[2] 30611 sh := v.Args[1] 30612 if sh.Op != OpS390XSLWconst { 30613 break 30614 } 30615 if sh.AuxInt != 8 { 30616 break 30617 } 30618 x1 := sh.Args[0] 30619 if x1.Op != OpS390XMOVBZloadidx { 30620 break 30621 } 30622 i1 := x1.AuxInt 30623 if x1.Aux != s { 30624 break 30625 } 30626 if p != x1.Args[0] { 30627 break 30628 } 30629 if idx != x1.Args[1] { 30630 break 30631 } 30632 if mem != x1.Args[2] { 30633 break 30634 } 30635 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30636 break 30637 } 30638 b = mergePoint(b, x0, x1) 30639 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30640 v.reset(OpCopy) 30641 v.AddArg(v0) 30642 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30643 v1.AuxInt = i0 30644 v1.Aux = s 30645 v1.AddArg(p) 30646 v1.AddArg(idx) 30647 v1.AddArg(mem) 30648 v0.AddArg(v1) 30649 return true 30650 } 30651 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 30652 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30653 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30654 for { 30655 x0 := v.Args[0] 30656 if x0.Op != OpS390XMOVBZloadidx { 30657 break 30658 } 30659 i0 := x0.AuxInt 30660 s := x0.Aux 30661 p := x0.Args[0] 30662 idx := x0.Args[1] 30663 mem := x0.Args[2] 30664 sh := v.Args[1] 30665 if sh.Op != OpS390XSLWconst { 30666 break 30667 } 30668 if sh.AuxInt != 8 { 30669 break 30670 } 30671 x1 := sh.Args[0] 30672 if x1.Op != OpS390XMOVBZloadidx { 30673 break 30674 } 30675 i1 := x1.AuxInt 30676 if x1.Aux != s { 30677 break 30678 } 30679 if idx != x1.Args[0] { 30680 break 30681 } 30682 if p != x1.Args[1] { 30683 break 30684 } 30685 if mem != x1.Args[2] { 30686 break 30687 } 30688 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30689 break 30690 } 30691 b = mergePoint(b, x0, x1) 30692 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30693 v.reset(OpCopy) 30694 v.AddArg(v0) 30695 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30696 v1.AuxInt = i0 30697 v1.Aux = s 30698 v1.AddArg(p) 30699 v1.AddArg(idx) 30700 v1.AddArg(mem) 30701 v0.AddArg(v1) 30702 return true 30703 } 30704 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 30705 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30706 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30707 for { 30708 x0 := v.Args[0] 30709 if x0.Op != OpS390XMOVBZloadidx { 30710 break 30711 } 30712 i0 := x0.AuxInt 30713 s := x0.Aux 30714 idx := x0.Args[0] 30715 p := x0.Args[1] 30716 mem := x0.Args[2] 30717 sh := v.Args[1] 30718 if sh.Op != OpS390XSLWconst { 30719 break 30720 } 30721 if sh.AuxInt != 8 { 30722 break 30723 } 30724 x1 := sh.Args[0] 30725 if x1.Op != OpS390XMOVBZloadidx { 30726 break 30727 } 30728 i1 := x1.AuxInt 30729 if x1.Aux != s { 30730 break 30731 } 30732 if idx != x1.Args[0] { 30733 break 30734 } 30735 if p != x1.Args[1] { 30736 break 30737 } 30738 if mem != x1.Args[2] { 30739 break 30740 } 30741 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30742 break 30743 } 30744 b = mergePoint(b, x0, x1) 30745 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30746 v.reset(OpCopy) 30747 v.AddArg(v0) 30748 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30749 v1.AuxInt = i0 30750 v1.Aux = s 30751 v1.AddArg(p) 30752 v1.AddArg(idx) 30753 v1.AddArg(mem) 30754 v0.AddArg(v1) 30755 return true 30756 } 30757 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 30758 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30759 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30760 for { 30761 sh := v.Args[0] 30762 if sh.Op != OpS390XSLWconst { 30763 break 30764 } 30765 if sh.AuxInt != 8 { 30766 break 30767 } 30768 x1 := sh.Args[0] 30769 if x1.Op != OpS390XMOVBZloadidx { 30770 break 30771 } 30772 i1 := x1.AuxInt 30773 s := x1.Aux 30774 p := x1.Args[0] 30775 idx := x1.Args[1] 30776 mem := x1.Args[2] 30777 x0 := v.Args[1] 30778 if x0.Op != OpS390XMOVBZloadidx { 30779 break 30780 } 30781 i0 := x0.AuxInt 30782 if x0.Aux != s { 30783 break 30784 } 30785 if p != x0.Args[0] { 30786 break 30787 } 30788 if idx != x0.Args[1] { 30789 break 30790 } 30791 if mem != x0.Args[2] { 30792 break 30793 } 30794 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30795 break 30796 } 30797 b = mergePoint(b, x0, x1) 30798 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30799 v.reset(OpCopy) 30800 v.AddArg(v0) 30801 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30802 v1.AuxInt = i0 30803 v1.Aux = s 30804 v1.AddArg(p) 30805 v1.AddArg(idx) 30806 v1.AddArg(mem) 30807 v0.AddArg(v1) 30808 return true 30809 } 30810 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 30811 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30812 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30813 for { 30814 sh := v.Args[0] 30815 if sh.Op != OpS390XSLWconst { 30816 break 30817 } 30818 if sh.AuxInt != 8 { 30819 break 30820 } 30821 x1 := sh.Args[0] 30822 if x1.Op != OpS390XMOVBZloadidx { 30823 break 30824 } 30825 i1 := x1.AuxInt 30826 s := x1.Aux 30827 idx := x1.Args[0] 30828 p := x1.Args[1] 30829 mem := x1.Args[2] 30830 x0 := v.Args[1] 30831 if x0.Op != OpS390XMOVBZloadidx { 30832 break 30833 } 30834 i0 := x0.AuxInt 30835 if x0.Aux != s { 30836 break 30837 } 30838 if p != x0.Args[0] { 30839 break 30840 } 30841 if idx != x0.Args[1] { 30842 break 30843 } 30844 if mem != x0.Args[2] { 30845 break 30846 } 30847 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30848 break 30849 } 30850 b = mergePoint(b, x0, x1) 30851 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30852 v.reset(OpCopy) 30853 v.AddArg(v0) 30854 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30855 v1.AuxInt = i0 30856 v1.Aux = s 30857 v1.AddArg(p) 30858 v1.AddArg(idx) 30859 v1.AddArg(mem) 30860 v0.AddArg(v1) 30861 return true 30862 } 30863 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 30864 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30865 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30866 for { 30867 sh := v.Args[0] 30868 if sh.Op != OpS390XSLWconst { 30869 break 30870 } 30871 if sh.AuxInt != 8 { 30872 break 30873 } 30874 x1 := sh.Args[0] 30875 if x1.Op != OpS390XMOVBZloadidx { 30876 break 30877 } 30878 i1 := x1.AuxInt 30879 s := x1.Aux 30880 p := x1.Args[0] 30881 idx := x1.Args[1] 30882 mem := x1.Args[2] 30883 x0 := v.Args[1] 30884 if x0.Op != OpS390XMOVBZloadidx { 30885 break 30886 } 30887 i0 := x0.AuxInt 30888 if x0.Aux != s { 30889 break 30890 } 30891 if idx != x0.Args[0] { 30892 break 30893 } 30894 if p != x0.Args[1] { 30895 break 30896 } 30897 if mem != x0.Args[2] { 30898 break 30899 } 30900 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30901 break 30902 } 30903 b = mergePoint(b, x0, x1) 30904 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30905 v.reset(OpCopy) 30906 v.AddArg(v0) 30907 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30908 v1.AuxInt = i0 30909 v1.Aux = s 30910 v1.AddArg(p) 30911 v1.AddArg(idx) 30912 v1.AddArg(mem) 30913 v0.AddArg(v1) 30914 return true 30915 } 30916 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 30917 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30918 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30919 for { 30920 sh := v.Args[0] 30921 if sh.Op != OpS390XSLWconst { 30922 break 30923 } 30924 if sh.AuxInt != 8 { 30925 break 30926 } 30927 x1 := sh.Args[0] 30928 if x1.Op != OpS390XMOVBZloadidx { 30929 break 30930 } 30931 i1 := x1.AuxInt 30932 s := x1.Aux 30933 idx := x1.Args[0] 30934 p := x1.Args[1] 30935 mem := x1.Args[2] 30936 x0 := v.Args[1] 30937 if x0.Op != OpS390XMOVBZloadidx { 30938 break 30939 } 30940 i0 := x0.AuxInt 30941 if x0.Aux != s { 30942 break 30943 } 30944 if idx != x0.Args[0] { 30945 break 30946 } 30947 if p != x0.Args[1] { 30948 break 30949 } 30950 if mem != x0.Args[2] { 30951 break 30952 } 30953 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30954 break 30955 } 30956 b = mergePoint(b, x0, x1) 30957 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30958 v.reset(OpCopy) 30959 v.AddArg(v0) 30960 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30961 v1.AuxInt = i0 30962 v1.Aux = s 30963 v1.AddArg(p) 30964 v1.AddArg(idx) 30965 v1.AddArg(mem) 30966 v0.AddArg(v1) 30967 return true 30968 } 30969 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 30970 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 30971 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 30972 for { 30973 r0 := v.Args[0] 30974 if r0.Op != OpS390XMOVHZreg { 30975 break 30976 } 30977 x0 := r0.Args[0] 30978 if x0.Op != OpS390XMOVHBRloadidx { 30979 break 30980 } 30981 i0 := x0.AuxInt 30982 s := x0.Aux 30983 p := x0.Args[0] 30984 idx := x0.Args[1] 30985 mem := x0.Args[2] 30986 sh := v.Args[1] 30987 if sh.Op != OpS390XSLWconst { 30988 break 30989 } 30990 if sh.AuxInt != 16 { 30991 break 30992 } 30993 r1 := sh.Args[0] 30994 if r1.Op != OpS390XMOVHZreg { 30995 break 30996 } 30997 x1 := r1.Args[0] 30998 if x1.Op != OpS390XMOVHBRloadidx { 30999 break 31000 } 31001 i1 := x1.AuxInt 31002 if x1.Aux != s { 31003 break 31004 } 31005 if p != x1.Args[0] { 31006 break 31007 } 31008 if idx != x1.Args[1] { 31009 break 31010 } 31011 if mem != x1.Args[2] { 31012 break 31013 } 31014 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31015 break 31016 } 31017 b = mergePoint(b, x0, x1) 31018 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31019 v.reset(OpCopy) 31020 v.AddArg(v0) 31021 v0.AuxInt = i0 31022 v0.Aux = s 31023 v0.AddArg(p) 31024 v0.AddArg(idx) 31025 v0.AddArg(mem) 31026 return true 31027 } 31028 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 31029 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31030 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31031 for { 31032 r0 := v.Args[0] 31033 if r0.Op != OpS390XMOVHZreg { 31034 break 31035 } 31036 x0 := r0.Args[0] 31037 if x0.Op != OpS390XMOVHBRloadidx { 31038 break 31039 } 31040 i0 := x0.AuxInt 31041 s := x0.Aux 31042 idx := x0.Args[0] 31043 p := x0.Args[1] 31044 mem := x0.Args[2] 31045 sh := v.Args[1] 31046 if sh.Op != OpS390XSLWconst { 31047 break 31048 } 31049 if sh.AuxInt != 16 { 31050 break 31051 } 31052 r1 := sh.Args[0] 31053 if r1.Op != OpS390XMOVHZreg { 31054 break 31055 } 31056 x1 := r1.Args[0] 31057 if x1.Op != OpS390XMOVHBRloadidx { 31058 break 31059 } 31060 i1 := x1.AuxInt 31061 if x1.Aux != s { 31062 break 31063 } 31064 if p != x1.Args[0] { 31065 break 31066 } 31067 if idx != x1.Args[1] { 31068 break 31069 } 31070 if mem != x1.Args[2] { 31071 break 31072 } 31073 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31074 break 31075 } 31076 b = mergePoint(b, x0, x1) 31077 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31078 v.reset(OpCopy) 31079 v.AddArg(v0) 31080 v0.AuxInt = i0 31081 v0.Aux = s 31082 v0.AddArg(p) 31083 v0.AddArg(idx) 31084 v0.AddArg(mem) 31085 return true 31086 } 31087 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 31088 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31089 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31090 for { 31091 r0 := v.Args[0] 31092 if r0.Op != OpS390XMOVHZreg { 31093 break 31094 } 31095 x0 := r0.Args[0] 31096 if x0.Op != OpS390XMOVHBRloadidx { 31097 break 31098 } 31099 i0 := x0.AuxInt 31100 s := x0.Aux 31101 p := x0.Args[0] 31102 idx := x0.Args[1] 31103 mem := x0.Args[2] 31104 sh := v.Args[1] 31105 if sh.Op != OpS390XSLWconst { 31106 break 31107 } 31108 if sh.AuxInt != 16 { 31109 break 31110 } 31111 r1 := sh.Args[0] 31112 if r1.Op != OpS390XMOVHZreg { 31113 break 31114 } 31115 x1 := r1.Args[0] 31116 if x1.Op != OpS390XMOVHBRloadidx { 31117 break 31118 } 31119 i1 := x1.AuxInt 31120 if x1.Aux != s { 31121 break 31122 } 31123 if idx != x1.Args[0] { 31124 break 31125 } 31126 if p != x1.Args[1] { 31127 break 31128 } 31129 if mem != x1.Args[2] { 31130 break 31131 } 31132 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31133 break 31134 } 31135 b = mergePoint(b, x0, x1) 31136 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31137 v.reset(OpCopy) 31138 v.AddArg(v0) 31139 v0.AuxInt = i0 31140 v0.Aux = s 31141 v0.AddArg(p) 31142 v0.AddArg(idx) 31143 v0.AddArg(mem) 31144 return true 31145 } 31146 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 31147 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31148 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31149 for { 31150 r0 := v.Args[0] 31151 if r0.Op != OpS390XMOVHZreg { 31152 break 31153 } 31154 x0 := r0.Args[0] 31155 if x0.Op != OpS390XMOVHBRloadidx { 31156 break 31157 } 31158 i0 := x0.AuxInt 31159 s := x0.Aux 31160 idx := x0.Args[0] 31161 p := x0.Args[1] 31162 mem := x0.Args[2] 31163 sh := v.Args[1] 31164 if sh.Op != OpS390XSLWconst { 31165 break 31166 } 31167 if sh.AuxInt != 16 { 31168 break 31169 } 31170 r1 := sh.Args[0] 31171 if r1.Op != OpS390XMOVHZreg { 31172 break 31173 } 31174 x1 := r1.Args[0] 31175 if x1.Op != OpS390XMOVHBRloadidx { 31176 break 31177 } 31178 i1 := x1.AuxInt 31179 if x1.Aux != s { 31180 break 31181 } 31182 if idx != x1.Args[0] { 31183 break 31184 } 31185 if p != x1.Args[1] { 31186 break 31187 } 31188 if mem != x1.Args[2] { 31189 break 31190 } 31191 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31192 break 31193 } 31194 b = mergePoint(b, x0, x1) 31195 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31196 v.reset(OpCopy) 31197 v.AddArg(v0) 31198 v0.AuxInt = i0 31199 v0.Aux = s 31200 v0.AddArg(p) 31201 v0.AddArg(idx) 31202 v0.AddArg(mem) 31203 return true 31204 } 31205 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 31206 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31207 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31208 for { 31209 sh := v.Args[0] 31210 if sh.Op != OpS390XSLWconst { 31211 break 31212 } 31213 if sh.AuxInt != 16 { 31214 break 31215 } 31216 r1 := sh.Args[0] 31217 if r1.Op != OpS390XMOVHZreg { 31218 break 31219 } 31220 x1 := r1.Args[0] 31221 if x1.Op != OpS390XMOVHBRloadidx { 31222 break 31223 } 31224 i1 := x1.AuxInt 31225 s := x1.Aux 31226 p := x1.Args[0] 31227 idx := x1.Args[1] 31228 mem := x1.Args[2] 31229 r0 := v.Args[1] 31230 if r0.Op != OpS390XMOVHZreg { 31231 break 31232 } 31233 x0 := r0.Args[0] 31234 if x0.Op != OpS390XMOVHBRloadidx { 31235 break 31236 } 31237 i0 := x0.AuxInt 31238 if x0.Aux != s { 31239 break 31240 } 31241 if p != x0.Args[0] { 31242 break 31243 } 31244 if idx != x0.Args[1] { 31245 break 31246 } 31247 if mem != x0.Args[2] { 31248 break 31249 } 31250 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31251 break 31252 } 31253 b = mergePoint(b, x0, x1) 31254 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31255 v.reset(OpCopy) 31256 v.AddArg(v0) 31257 v0.AuxInt = i0 31258 v0.Aux = s 31259 v0.AddArg(p) 31260 v0.AddArg(idx) 31261 v0.AddArg(mem) 31262 return true 31263 } 31264 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 31265 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31266 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31267 for { 31268 sh := v.Args[0] 31269 if sh.Op != OpS390XSLWconst { 31270 break 31271 } 31272 if sh.AuxInt != 16 { 31273 break 31274 } 31275 r1 := sh.Args[0] 31276 if r1.Op != OpS390XMOVHZreg { 31277 break 31278 } 31279 x1 := r1.Args[0] 31280 if x1.Op != OpS390XMOVHBRloadidx { 31281 break 31282 } 31283 i1 := x1.AuxInt 31284 s := x1.Aux 31285 idx := x1.Args[0] 31286 p := x1.Args[1] 31287 mem := x1.Args[2] 31288 r0 := v.Args[1] 31289 if r0.Op != OpS390XMOVHZreg { 31290 break 31291 } 31292 x0 := r0.Args[0] 31293 if x0.Op != OpS390XMOVHBRloadidx { 31294 break 31295 } 31296 i0 := x0.AuxInt 31297 if x0.Aux != s { 31298 break 31299 } 31300 if p != x0.Args[0] { 31301 break 31302 } 31303 if idx != x0.Args[1] { 31304 break 31305 } 31306 if mem != x0.Args[2] { 31307 break 31308 } 31309 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31310 break 31311 } 31312 b = mergePoint(b, x0, x1) 31313 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31314 v.reset(OpCopy) 31315 v.AddArg(v0) 31316 v0.AuxInt = i0 31317 v0.Aux = s 31318 v0.AddArg(p) 31319 v0.AddArg(idx) 31320 v0.AddArg(mem) 31321 return true 31322 } 31323 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 31324 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31325 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31326 for { 31327 sh := v.Args[0] 31328 if sh.Op != OpS390XSLWconst { 31329 break 31330 } 31331 if sh.AuxInt != 16 { 31332 break 31333 } 31334 r1 := sh.Args[0] 31335 if r1.Op != OpS390XMOVHZreg { 31336 break 31337 } 31338 x1 := r1.Args[0] 31339 if x1.Op != OpS390XMOVHBRloadidx { 31340 break 31341 } 31342 i1 := x1.AuxInt 31343 s := x1.Aux 31344 p := x1.Args[0] 31345 idx := x1.Args[1] 31346 mem := x1.Args[2] 31347 r0 := v.Args[1] 31348 if r0.Op != OpS390XMOVHZreg { 31349 break 31350 } 31351 x0 := r0.Args[0] 31352 if x0.Op != OpS390XMOVHBRloadidx { 31353 break 31354 } 31355 i0 := x0.AuxInt 31356 if x0.Aux != s { 31357 break 31358 } 31359 if idx != x0.Args[0] { 31360 break 31361 } 31362 if p != x0.Args[1] { 31363 break 31364 } 31365 if mem != x0.Args[2] { 31366 break 31367 } 31368 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31369 break 31370 } 31371 b = mergePoint(b, x0, x1) 31372 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31373 v.reset(OpCopy) 31374 v.AddArg(v0) 31375 v0.AuxInt = i0 31376 v0.Aux = s 31377 v0.AddArg(p) 31378 v0.AddArg(idx) 31379 v0.AddArg(mem) 31380 return true 31381 } 31382 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 31383 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31384 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31385 for { 31386 sh := v.Args[0] 31387 if sh.Op != OpS390XSLWconst { 31388 break 31389 } 31390 if sh.AuxInt != 16 { 31391 break 31392 } 31393 r1 := sh.Args[0] 31394 if r1.Op != OpS390XMOVHZreg { 31395 break 31396 } 31397 x1 := r1.Args[0] 31398 if x1.Op != OpS390XMOVHBRloadidx { 31399 break 31400 } 31401 i1 := x1.AuxInt 31402 s := x1.Aux 31403 idx := x1.Args[0] 31404 p := x1.Args[1] 31405 mem := x1.Args[2] 31406 r0 := v.Args[1] 31407 if r0.Op != OpS390XMOVHZreg { 31408 break 31409 } 31410 x0 := r0.Args[0] 31411 if x0.Op != OpS390XMOVHBRloadidx { 31412 break 31413 } 31414 i0 := x0.AuxInt 31415 if x0.Aux != s { 31416 break 31417 } 31418 if idx != x0.Args[0] { 31419 break 31420 } 31421 if p != x0.Args[1] { 31422 break 31423 } 31424 if mem != x0.Args[2] { 31425 break 31426 } 31427 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31428 break 31429 } 31430 b = mergePoint(b, x0, x1) 31431 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31432 v.reset(OpCopy) 31433 v.AddArg(v0) 31434 v0.AuxInt = i0 31435 v0.Aux = s 31436 v0.AddArg(p) 31437 v0.AddArg(idx) 31438 v0.AddArg(mem) 31439 return true 31440 } 31441 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 31442 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31443 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31444 for { 31445 s1 := v.Args[0] 31446 if s1.Op != OpS390XSLWconst { 31447 break 31448 } 31449 j1 := s1.AuxInt 31450 x1 := s1.Args[0] 31451 if x1.Op != OpS390XMOVBZloadidx { 31452 break 31453 } 31454 i1 := x1.AuxInt 31455 s := x1.Aux 31456 p := x1.Args[0] 31457 idx := x1.Args[1] 31458 mem := x1.Args[2] 31459 or := v.Args[1] 31460 if or.Op != OpS390XORW { 31461 break 31462 } 31463 s0 := or.Args[0] 31464 if s0.Op != OpS390XSLWconst { 31465 break 31466 } 31467 j0 := s0.AuxInt 31468 x0 := s0.Args[0] 31469 if x0.Op != OpS390XMOVBZloadidx { 31470 break 31471 } 31472 i0 := x0.AuxInt 31473 if x0.Aux != s { 31474 break 31475 } 31476 if p != x0.Args[0] { 31477 break 31478 } 31479 if idx != x0.Args[1] { 31480 break 31481 } 31482 if mem != x0.Args[2] { 31483 break 31484 } 31485 y := or.Args[1] 31486 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31487 break 31488 } 31489 b = mergePoint(b, x0, x1) 31490 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31491 v.reset(OpCopy) 31492 v.AddArg(v0) 31493 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31494 v1.AuxInt = j0 31495 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31496 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31497 v3.AuxInt = i0 31498 v3.Aux = s 31499 v3.AddArg(p) 31500 v3.AddArg(idx) 31501 v3.AddArg(mem) 31502 v2.AddArg(v3) 31503 v1.AddArg(v2) 31504 v0.AddArg(v1) 31505 v0.AddArg(y) 31506 return true 31507 } 31508 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 31509 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31510 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31511 for { 31512 s1 := v.Args[0] 31513 if s1.Op != OpS390XSLWconst { 31514 break 31515 } 31516 j1 := s1.AuxInt 31517 x1 := s1.Args[0] 31518 if x1.Op != OpS390XMOVBZloadidx { 31519 break 31520 } 31521 i1 := x1.AuxInt 31522 s := x1.Aux 31523 idx := x1.Args[0] 31524 p := x1.Args[1] 31525 mem := x1.Args[2] 31526 or := v.Args[1] 31527 if or.Op != OpS390XORW { 31528 break 31529 } 31530 s0 := or.Args[0] 31531 if s0.Op != OpS390XSLWconst { 31532 break 31533 } 31534 j0 := s0.AuxInt 31535 x0 := s0.Args[0] 31536 if x0.Op != OpS390XMOVBZloadidx { 31537 break 31538 } 31539 i0 := x0.AuxInt 31540 if x0.Aux != s { 31541 break 31542 } 31543 if p != x0.Args[0] { 31544 break 31545 } 31546 if idx != x0.Args[1] { 31547 break 31548 } 31549 if mem != x0.Args[2] { 31550 break 31551 } 31552 y := or.Args[1] 31553 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31554 break 31555 } 31556 b = mergePoint(b, x0, x1) 31557 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31558 v.reset(OpCopy) 31559 v.AddArg(v0) 31560 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31561 v1.AuxInt = j0 31562 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31563 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31564 v3.AuxInt = i0 31565 v3.Aux = s 31566 v3.AddArg(p) 31567 v3.AddArg(idx) 31568 v3.AddArg(mem) 31569 v2.AddArg(v3) 31570 v1.AddArg(v2) 31571 v0.AddArg(v1) 31572 v0.AddArg(y) 31573 return true 31574 } 31575 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 31576 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31577 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31578 for { 31579 s1 := v.Args[0] 31580 if s1.Op != OpS390XSLWconst { 31581 break 31582 } 31583 j1 := s1.AuxInt 31584 x1 := s1.Args[0] 31585 if x1.Op != OpS390XMOVBZloadidx { 31586 break 31587 } 31588 i1 := x1.AuxInt 31589 s := x1.Aux 31590 p := x1.Args[0] 31591 idx := x1.Args[1] 31592 mem := x1.Args[2] 31593 or := v.Args[1] 31594 if or.Op != OpS390XORW { 31595 break 31596 } 31597 s0 := or.Args[0] 31598 if s0.Op != OpS390XSLWconst { 31599 break 31600 } 31601 j0 := s0.AuxInt 31602 x0 := s0.Args[0] 31603 if x0.Op != OpS390XMOVBZloadidx { 31604 break 31605 } 31606 i0 := x0.AuxInt 31607 if x0.Aux != s { 31608 break 31609 } 31610 if idx != x0.Args[0] { 31611 break 31612 } 31613 if p != x0.Args[1] { 31614 break 31615 } 31616 if mem != x0.Args[2] { 31617 break 31618 } 31619 y := or.Args[1] 31620 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31621 break 31622 } 31623 b = mergePoint(b, x0, x1) 31624 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31625 v.reset(OpCopy) 31626 v.AddArg(v0) 31627 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31628 v1.AuxInt = j0 31629 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31630 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31631 v3.AuxInt = i0 31632 v3.Aux = s 31633 v3.AddArg(p) 31634 v3.AddArg(idx) 31635 v3.AddArg(mem) 31636 v2.AddArg(v3) 31637 v1.AddArg(v2) 31638 v0.AddArg(v1) 31639 v0.AddArg(y) 31640 return true 31641 } 31642 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 31643 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31644 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31645 for { 31646 s1 := v.Args[0] 31647 if s1.Op != OpS390XSLWconst { 31648 break 31649 } 31650 j1 := s1.AuxInt 31651 x1 := s1.Args[0] 31652 if x1.Op != OpS390XMOVBZloadidx { 31653 break 31654 } 31655 i1 := x1.AuxInt 31656 s := x1.Aux 31657 idx := x1.Args[0] 31658 p := x1.Args[1] 31659 mem := x1.Args[2] 31660 or := v.Args[1] 31661 if or.Op != OpS390XORW { 31662 break 31663 } 31664 s0 := or.Args[0] 31665 if s0.Op != OpS390XSLWconst { 31666 break 31667 } 31668 j0 := s0.AuxInt 31669 x0 := s0.Args[0] 31670 if x0.Op != OpS390XMOVBZloadidx { 31671 break 31672 } 31673 i0 := x0.AuxInt 31674 if x0.Aux != s { 31675 break 31676 } 31677 if idx != x0.Args[0] { 31678 break 31679 } 31680 if p != x0.Args[1] { 31681 break 31682 } 31683 if mem != x0.Args[2] { 31684 break 31685 } 31686 y := or.Args[1] 31687 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31688 break 31689 } 31690 b = mergePoint(b, x0, x1) 31691 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31692 v.reset(OpCopy) 31693 v.AddArg(v0) 31694 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31695 v1.AuxInt = j0 31696 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31697 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31698 v3.AuxInt = i0 31699 v3.Aux = s 31700 v3.AddArg(p) 31701 v3.AddArg(idx) 31702 v3.AddArg(mem) 31703 v2.AddArg(v3) 31704 v1.AddArg(v2) 31705 v0.AddArg(v1) 31706 v0.AddArg(y) 31707 return true 31708 } 31709 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 31710 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31711 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31712 for { 31713 s1 := v.Args[0] 31714 if s1.Op != OpS390XSLWconst { 31715 break 31716 } 31717 j1 := s1.AuxInt 31718 x1 := s1.Args[0] 31719 if x1.Op != OpS390XMOVBZloadidx { 31720 break 31721 } 31722 i1 := x1.AuxInt 31723 s := x1.Aux 31724 p := x1.Args[0] 31725 idx := x1.Args[1] 31726 mem := x1.Args[2] 31727 or := v.Args[1] 31728 if or.Op != OpS390XORW { 31729 break 31730 } 31731 y := or.Args[0] 31732 s0 := or.Args[1] 31733 if s0.Op != OpS390XSLWconst { 31734 break 31735 } 31736 j0 := s0.AuxInt 31737 x0 := s0.Args[0] 31738 if x0.Op != OpS390XMOVBZloadidx { 31739 break 31740 } 31741 i0 := x0.AuxInt 31742 if x0.Aux != s { 31743 break 31744 } 31745 if p != x0.Args[0] { 31746 break 31747 } 31748 if idx != x0.Args[1] { 31749 break 31750 } 31751 if mem != x0.Args[2] { 31752 break 31753 } 31754 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31755 break 31756 } 31757 b = mergePoint(b, x0, x1) 31758 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31759 v.reset(OpCopy) 31760 v.AddArg(v0) 31761 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31762 v1.AuxInt = j0 31763 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31764 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31765 v3.AuxInt = i0 31766 v3.Aux = s 31767 v3.AddArg(p) 31768 v3.AddArg(idx) 31769 v3.AddArg(mem) 31770 v2.AddArg(v3) 31771 v1.AddArg(v2) 31772 v0.AddArg(v1) 31773 v0.AddArg(y) 31774 return true 31775 } 31776 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 31777 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31778 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31779 for { 31780 s1 := v.Args[0] 31781 if s1.Op != OpS390XSLWconst { 31782 break 31783 } 31784 j1 := s1.AuxInt 31785 x1 := s1.Args[0] 31786 if x1.Op != OpS390XMOVBZloadidx { 31787 break 31788 } 31789 i1 := x1.AuxInt 31790 s := x1.Aux 31791 idx := x1.Args[0] 31792 p := x1.Args[1] 31793 mem := x1.Args[2] 31794 or := v.Args[1] 31795 if or.Op != OpS390XORW { 31796 break 31797 } 31798 y := or.Args[0] 31799 s0 := or.Args[1] 31800 if s0.Op != OpS390XSLWconst { 31801 break 31802 } 31803 j0 := s0.AuxInt 31804 x0 := s0.Args[0] 31805 if x0.Op != OpS390XMOVBZloadidx { 31806 break 31807 } 31808 i0 := x0.AuxInt 31809 if x0.Aux != s { 31810 break 31811 } 31812 if p != x0.Args[0] { 31813 break 31814 } 31815 if idx != x0.Args[1] { 31816 break 31817 } 31818 if mem != x0.Args[2] { 31819 break 31820 } 31821 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31822 break 31823 } 31824 b = mergePoint(b, x0, x1) 31825 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31826 v.reset(OpCopy) 31827 v.AddArg(v0) 31828 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31829 v1.AuxInt = j0 31830 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31831 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31832 v3.AuxInt = i0 31833 v3.Aux = s 31834 v3.AddArg(p) 31835 v3.AddArg(idx) 31836 v3.AddArg(mem) 31837 v2.AddArg(v3) 31838 v1.AddArg(v2) 31839 v0.AddArg(v1) 31840 v0.AddArg(y) 31841 return true 31842 } 31843 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 31844 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31845 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31846 for { 31847 s1 := v.Args[0] 31848 if s1.Op != OpS390XSLWconst { 31849 break 31850 } 31851 j1 := s1.AuxInt 31852 x1 := s1.Args[0] 31853 if x1.Op != OpS390XMOVBZloadidx { 31854 break 31855 } 31856 i1 := x1.AuxInt 31857 s := x1.Aux 31858 p := x1.Args[0] 31859 idx := x1.Args[1] 31860 mem := x1.Args[2] 31861 or := v.Args[1] 31862 if or.Op != OpS390XORW { 31863 break 31864 } 31865 y := or.Args[0] 31866 s0 := or.Args[1] 31867 if s0.Op != OpS390XSLWconst { 31868 break 31869 } 31870 j0 := s0.AuxInt 31871 x0 := s0.Args[0] 31872 if x0.Op != OpS390XMOVBZloadidx { 31873 break 31874 } 31875 i0 := x0.AuxInt 31876 if x0.Aux != s { 31877 break 31878 } 31879 if idx != x0.Args[0] { 31880 break 31881 } 31882 if p != x0.Args[1] { 31883 break 31884 } 31885 if mem != x0.Args[2] { 31886 break 31887 } 31888 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31889 break 31890 } 31891 b = mergePoint(b, x0, x1) 31892 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31893 v.reset(OpCopy) 31894 v.AddArg(v0) 31895 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31896 v1.AuxInt = j0 31897 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31898 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31899 v3.AuxInt = i0 31900 v3.Aux = s 31901 v3.AddArg(p) 31902 v3.AddArg(idx) 31903 v3.AddArg(mem) 31904 v2.AddArg(v3) 31905 v1.AddArg(v2) 31906 v0.AddArg(v1) 31907 v0.AddArg(y) 31908 return true 31909 } 31910 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 31911 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31912 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31913 for { 31914 s1 := v.Args[0] 31915 if s1.Op != OpS390XSLWconst { 31916 break 31917 } 31918 j1 := s1.AuxInt 31919 x1 := s1.Args[0] 31920 if x1.Op != OpS390XMOVBZloadidx { 31921 break 31922 } 31923 i1 := x1.AuxInt 31924 s := x1.Aux 31925 idx := x1.Args[0] 31926 p := x1.Args[1] 31927 mem := x1.Args[2] 31928 or := v.Args[1] 31929 if or.Op != OpS390XORW { 31930 break 31931 } 31932 y := or.Args[0] 31933 s0 := or.Args[1] 31934 if s0.Op != OpS390XSLWconst { 31935 break 31936 } 31937 j0 := s0.AuxInt 31938 x0 := s0.Args[0] 31939 if x0.Op != OpS390XMOVBZloadidx { 31940 break 31941 } 31942 i0 := x0.AuxInt 31943 if x0.Aux != s { 31944 break 31945 } 31946 if idx != x0.Args[0] { 31947 break 31948 } 31949 if p != x0.Args[1] { 31950 break 31951 } 31952 if mem != x0.Args[2] { 31953 break 31954 } 31955 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31956 break 31957 } 31958 b = mergePoint(b, x0, x1) 31959 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31960 v.reset(OpCopy) 31961 v.AddArg(v0) 31962 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31963 v1.AuxInt = j0 31964 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31965 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31966 v3.AuxInt = i0 31967 v3.Aux = s 31968 v3.AddArg(p) 31969 v3.AddArg(idx) 31970 v3.AddArg(mem) 31971 v2.AddArg(v3) 31972 v1.AddArg(v2) 31973 v0.AddArg(v1) 31974 v0.AddArg(y) 31975 return true 31976 } 31977 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 31978 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31979 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31980 for { 31981 or := v.Args[0] 31982 if or.Op != OpS390XORW { 31983 break 31984 } 31985 s0 := or.Args[0] 31986 if s0.Op != OpS390XSLWconst { 31987 break 31988 } 31989 j0 := s0.AuxInt 31990 x0 := s0.Args[0] 31991 if x0.Op != OpS390XMOVBZloadidx { 31992 break 31993 } 31994 i0 := x0.AuxInt 31995 s := x0.Aux 31996 p := x0.Args[0] 31997 idx := x0.Args[1] 31998 mem := x0.Args[2] 31999 y := or.Args[1] 32000 s1 := v.Args[1] 32001 if s1.Op != OpS390XSLWconst { 32002 break 32003 } 32004 j1 := s1.AuxInt 32005 x1 := s1.Args[0] 32006 if x1.Op != OpS390XMOVBZloadidx { 32007 break 32008 } 32009 i1 := x1.AuxInt 32010 if x1.Aux != s { 32011 break 32012 } 32013 if p != x1.Args[0] { 32014 break 32015 } 32016 if idx != x1.Args[1] { 32017 break 32018 } 32019 if mem != x1.Args[2] { 32020 break 32021 } 32022 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32023 break 32024 } 32025 b = mergePoint(b, x0, x1) 32026 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32027 v.reset(OpCopy) 32028 v.AddArg(v0) 32029 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32030 v1.AuxInt = j0 32031 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32032 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32033 v3.AuxInt = i0 32034 v3.Aux = s 32035 v3.AddArg(p) 32036 v3.AddArg(idx) 32037 v3.AddArg(mem) 32038 v2.AddArg(v3) 32039 v1.AddArg(v2) 32040 v0.AddArg(v1) 32041 v0.AddArg(y) 32042 return true 32043 } 32044 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32045 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32046 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32047 for { 32048 or := v.Args[0] 32049 if or.Op != OpS390XORW { 32050 break 32051 } 32052 s0 := or.Args[0] 32053 if s0.Op != OpS390XSLWconst { 32054 break 32055 } 32056 j0 := s0.AuxInt 32057 x0 := s0.Args[0] 32058 if x0.Op != OpS390XMOVBZloadidx { 32059 break 32060 } 32061 i0 := x0.AuxInt 32062 s := x0.Aux 32063 idx := x0.Args[0] 32064 p := x0.Args[1] 32065 mem := x0.Args[2] 32066 y := or.Args[1] 32067 s1 := v.Args[1] 32068 if s1.Op != OpS390XSLWconst { 32069 break 32070 } 32071 j1 := s1.AuxInt 32072 x1 := s1.Args[0] 32073 if x1.Op != OpS390XMOVBZloadidx { 32074 break 32075 } 32076 i1 := x1.AuxInt 32077 if x1.Aux != s { 32078 break 32079 } 32080 if p != x1.Args[0] { 32081 break 32082 } 32083 if idx != x1.Args[1] { 32084 break 32085 } 32086 if mem != x1.Args[2] { 32087 break 32088 } 32089 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32090 break 32091 } 32092 b = mergePoint(b, x0, x1) 32093 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32094 v.reset(OpCopy) 32095 v.AddArg(v0) 32096 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32097 v1.AuxInt = j0 32098 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32099 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32100 v3.AuxInt = i0 32101 v3.Aux = s 32102 v3.AddArg(p) 32103 v3.AddArg(idx) 32104 v3.AddArg(mem) 32105 v2.AddArg(v3) 32106 v1.AddArg(v2) 32107 v0.AddArg(v1) 32108 v0.AddArg(y) 32109 return true 32110 } 32111 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32112 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32113 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32114 for { 32115 or := v.Args[0] 32116 if or.Op != OpS390XORW { 32117 break 32118 } 32119 y := or.Args[0] 32120 s0 := or.Args[1] 32121 if s0.Op != OpS390XSLWconst { 32122 break 32123 } 32124 j0 := s0.AuxInt 32125 x0 := s0.Args[0] 32126 if x0.Op != OpS390XMOVBZloadidx { 32127 break 32128 } 32129 i0 := x0.AuxInt 32130 s := x0.Aux 32131 p := x0.Args[0] 32132 idx := x0.Args[1] 32133 mem := x0.Args[2] 32134 s1 := v.Args[1] 32135 if s1.Op != OpS390XSLWconst { 32136 break 32137 } 32138 j1 := s1.AuxInt 32139 x1 := s1.Args[0] 32140 if x1.Op != OpS390XMOVBZloadidx { 32141 break 32142 } 32143 i1 := x1.AuxInt 32144 if x1.Aux != s { 32145 break 32146 } 32147 if p != x1.Args[0] { 32148 break 32149 } 32150 if idx != x1.Args[1] { 32151 break 32152 } 32153 if mem != x1.Args[2] { 32154 break 32155 } 32156 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32157 break 32158 } 32159 b = mergePoint(b, x0, x1) 32160 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32161 v.reset(OpCopy) 32162 v.AddArg(v0) 32163 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32164 v1.AuxInt = j0 32165 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32166 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32167 v3.AuxInt = i0 32168 v3.Aux = s 32169 v3.AddArg(p) 32170 v3.AddArg(idx) 32171 v3.AddArg(mem) 32172 v2.AddArg(v3) 32173 v1.AddArg(v2) 32174 v0.AddArg(v1) 32175 v0.AddArg(y) 32176 return true 32177 } 32178 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32179 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32180 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32181 for { 32182 or := v.Args[0] 32183 if or.Op != OpS390XORW { 32184 break 32185 } 32186 y := or.Args[0] 32187 s0 := or.Args[1] 32188 if s0.Op != OpS390XSLWconst { 32189 break 32190 } 32191 j0 := s0.AuxInt 32192 x0 := s0.Args[0] 32193 if x0.Op != OpS390XMOVBZloadidx { 32194 break 32195 } 32196 i0 := x0.AuxInt 32197 s := x0.Aux 32198 idx := x0.Args[0] 32199 p := x0.Args[1] 32200 mem := x0.Args[2] 32201 s1 := v.Args[1] 32202 if s1.Op != OpS390XSLWconst { 32203 break 32204 } 32205 j1 := s1.AuxInt 32206 x1 := s1.Args[0] 32207 if x1.Op != OpS390XMOVBZloadidx { 32208 break 32209 } 32210 i1 := x1.AuxInt 32211 if x1.Aux != s { 32212 break 32213 } 32214 if p != x1.Args[0] { 32215 break 32216 } 32217 if idx != x1.Args[1] { 32218 break 32219 } 32220 if mem != x1.Args[2] { 32221 break 32222 } 32223 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32224 break 32225 } 32226 b = mergePoint(b, x0, x1) 32227 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32228 v.reset(OpCopy) 32229 v.AddArg(v0) 32230 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32231 v1.AuxInt = j0 32232 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32233 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32234 v3.AuxInt = i0 32235 v3.Aux = s 32236 v3.AddArg(p) 32237 v3.AddArg(idx) 32238 v3.AddArg(mem) 32239 v2.AddArg(v3) 32240 v1.AddArg(v2) 32241 v0.AddArg(v1) 32242 v0.AddArg(y) 32243 return true 32244 } 32245 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32246 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32247 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32248 for { 32249 or := v.Args[0] 32250 if or.Op != OpS390XORW { 32251 break 32252 } 32253 s0 := or.Args[0] 32254 if s0.Op != OpS390XSLWconst { 32255 break 32256 } 32257 j0 := s0.AuxInt 32258 x0 := s0.Args[0] 32259 if x0.Op != OpS390XMOVBZloadidx { 32260 break 32261 } 32262 i0 := x0.AuxInt 32263 s := x0.Aux 32264 p := x0.Args[0] 32265 idx := x0.Args[1] 32266 mem := x0.Args[2] 32267 y := or.Args[1] 32268 s1 := v.Args[1] 32269 if s1.Op != OpS390XSLWconst { 32270 break 32271 } 32272 j1 := s1.AuxInt 32273 x1 := s1.Args[0] 32274 if x1.Op != OpS390XMOVBZloadidx { 32275 break 32276 } 32277 i1 := x1.AuxInt 32278 if x1.Aux != s { 32279 break 32280 } 32281 if idx != x1.Args[0] { 32282 break 32283 } 32284 if p != x1.Args[1] { 32285 break 32286 } 32287 if mem != x1.Args[2] { 32288 break 32289 } 32290 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32291 break 32292 } 32293 b = mergePoint(b, x0, x1) 32294 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32295 v.reset(OpCopy) 32296 v.AddArg(v0) 32297 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32298 v1.AuxInt = j0 32299 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32300 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32301 v3.AuxInt = i0 32302 v3.Aux = s 32303 v3.AddArg(p) 32304 v3.AddArg(idx) 32305 v3.AddArg(mem) 32306 v2.AddArg(v3) 32307 v1.AddArg(v2) 32308 v0.AddArg(v1) 32309 v0.AddArg(y) 32310 return true 32311 } 32312 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32313 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32314 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32315 for { 32316 or := v.Args[0] 32317 if or.Op != OpS390XORW { 32318 break 32319 } 32320 s0 := or.Args[0] 32321 if s0.Op != OpS390XSLWconst { 32322 break 32323 } 32324 j0 := s0.AuxInt 32325 x0 := s0.Args[0] 32326 if x0.Op != OpS390XMOVBZloadidx { 32327 break 32328 } 32329 i0 := x0.AuxInt 32330 s := x0.Aux 32331 idx := x0.Args[0] 32332 p := x0.Args[1] 32333 mem := x0.Args[2] 32334 y := or.Args[1] 32335 s1 := v.Args[1] 32336 if s1.Op != OpS390XSLWconst { 32337 break 32338 } 32339 j1 := s1.AuxInt 32340 x1 := s1.Args[0] 32341 if x1.Op != OpS390XMOVBZloadidx { 32342 break 32343 } 32344 i1 := x1.AuxInt 32345 if x1.Aux != s { 32346 break 32347 } 32348 if idx != x1.Args[0] { 32349 break 32350 } 32351 if p != x1.Args[1] { 32352 break 32353 } 32354 if mem != x1.Args[2] { 32355 break 32356 } 32357 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32358 break 32359 } 32360 b = mergePoint(b, x0, x1) 32361 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32362 v.reset(OpCopy) 32363 v.AddArg(v0) 32364 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32365 v1.AuxInt = j0 32366 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32367 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32368 v3.AuxInt = i0 32369 v3.Aux = s 32370 v3.AddArg(p) 32371 v3.AddArg(idx) 32372 v3.AddArg(mem) 32373 v2.AddArg(v3) 32374 v1.AddArg(v2) 32375 v0.AddArg(v1) 32376 v0.AddArg(y) 32377 return true 32378 } 32379 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32380 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32381 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32382 for { 32383 or := v.Args[0] 32384 if or.Op != OpS390XORW { 32385 break 32386 } 32387 y := or.Args[0] 32388 s0 := or.Args[1] 32389 if s0.Op != OpS390XSLWconst { 32390 break 32391 } 32392 j0 := s0.AuxInt 32393 x0 := s0.Args[0] 32394 if x0.Op != OpS390XMOVBZloadidx { 32395 break 32396 } 32397 i0 := x0.AuxInt 32398 s := x0.Aux 32399 p := x0.Args[0] 32400 idx := x0.Args[1] 32401 mem := x0.Args[2] 32402 s1 := v.Args[1] 32403 if s1.Op != OpS390XSLWconst { 32404 break 32405 } 32406 j1 := s1.AuxInt 32407 x1 := s1.Args[0] 32408 if x1.Op != OpS390XMOVBZloadidx { 32409 break 32410 } 32411 i1 := x1.AuxInt 32412 if x1.Aux != s { 32413 break 32414 } 32415 if idx != x1.Args[0] { 32416 break 32417 } 32418 if p != x1.Args[1] { 32419 break 32420 } 32421 if mem != x1.Args[2] { 32422 break 32423 } 32424 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32425 break 32426 } 32427 b = mergePoint(b, x0, x1) 32428 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32429 v.reset(OpCopy) 32430 v.AddArg(v0) 32431 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32432 v1.AuxInt = j0 32433 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32434 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32435 v3.AuxInt = i0 32436 v3.Aux = s 32437 v3.AddArg(p) 32438 v3.AddArg(idx) 32439 v3.AddArg(mem) 32440 v2.AddArg(v3) 32441 v1.AddArg(v2) 32442 v0.AddArg(v1) 32443 v0.AddArg(y) 32444 return true 32445 } 32446 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32447 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32448 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32449 for { 32450 or := v.Args[0] 32451 if or.Op != OpS390XORW { 32452 break 32453 } 32454 y := or.Args[0] 32455 s0 := or.Args[1] 32456 if s0.Op != OpS390XSLWconst { 32457 break 32458 } 32459 j0 := s0.AuxInt 32460 x0 := s0.Args[0] 32461 if x0.Op != OpS390XMOVBZloadidx { 32462 break 32463 } 32464 i0 := x0.AuxInt 32465 s := x0.Aux 32466 idx := x0.Args[0] 32467 p := x0.Args[1] 32468 mem := x0.Args[2] 32469 s1 := v.Args[1] 32470 if s1.Op != OpS390XSLWconst { 32471 break 32472 } 32473 j1 := s1.AuxInt 32474 x1 := s1.Args[0] 32475 if x1.Op != OpS390XMOVBZloadidx { 32476 break 32477 } 32478 i1 := x1.AuxInt 32479 if x1.Aux != s { 32480 break 32481 } 32482 if idx != x1.Args[0] { 32483 break 32484 } 32485 if p != x1.Args[1] { 32486 break 32487 } 32488 if mem != x1.Args[2] { 32489 break 32490 } 32491 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32492 break 32493 } 32494 b = mergePoint(b, x0, x1) 32495 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32496 v.reset(OpCopy) 32497 v.AddArg(v0) 32498 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32499 v1.AuxInt = j0 32500 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32501 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32502 v3.AuxInt = i0 32503 v3.Aux = s 32504 v3.AddArg(p) 32505 v3.AddArg(idx) 32506 v3.AddArg(mem) 32507 v2.AddArg(v3) 32508 v1.AddArg(v2) 32509 v0.AddArg(v1) 32510 v0.AddArg(y) 32511 return true 32512 } 32513 return false 32514 } 32515 func rewriteValueS390X_OpS390XORWconst(v *Value) bool { 32516 // match: (ORWconst [c] x) 32517 // cond: int32(c)==0 32518 // result: x 32519 for { 32520 c := v.AuxInt 32521 x := v.Args[0] 32522 if !(int32(c) == 0) { 32523 break 32524 } 32525 v.reset(OpCopy) 32526 v.Type = x.Type 32527 v.AddArg(x) 32528 return true 32529 } 32530 // match: (ORWconst [c] _) 32531 // cond: int32(c)==-1 32532 // result: (MOVDconst [-1]) 32533 for { 32534 c := v.AuxInt 32535 if !(int32(c) == -1) { 32536 break 32537 } 32538 v.reset(OpS390XMOVDconst) 32539 v.AuxInt = -1 32540 return true 32541 } 32542 // match: (ORWconst [c] (MOVDconst [d])) 32543 // cond: 32544 // result: (MOVDconst [c|d]) 32545 for { 32546 c := v.AuxInt 32547 v_0 := v.Args[0] 32548 if v_0.Op != OpS390XMOVDconst { 32549 break 32550 } 32551 d := v_0.AuxInt 32552 v.reset(OpS390XMOVDconst) 32553 v.AuxInt = c | d 32554 return true 32555 } 32556 return false 32557 } 32558 func rewriteValueS390X_OpS390XORconst(v *Value) bool { 32559 // match: (ORconst [0] x) 32560 // cond: 32561 // result: x 32562 for { 32563 if v.AuxInt != 0 { 32564 break 32565 } 32566 x := v.Args[0] 32567 v.reset(OpCopy) 32568 v.Type = x.Type 32569 v.AddArg(x) 32570 return true 32571 } 32572 // match: (ORconst [-1] _) 32573 // cond: 32574 // result: (MOVDconst [-1]) 32575 for { 32576 if v.AuxInt != -1 { 32577 break 32578 } 32579 v.reset(OpS390XMOVDconst) 32580 v.AuxInt = -1 32581 return true 32582 } 32583 // match: (ORconst [c] (MOVDconst [d])) 32584 // cond: 32585 // result: (MOVDconst [c|d]) 32586 for { 32587 c := v.AuxInt 32588 v_0 := v.Args[0] 32589 if v_0.Op != OpS390XMOVDconst { 32590 break 32591 } 32592 d := v_0.AuxInt 32593 v.reset(OpS390XMOVDconst) 32594 v.AuxInt = c | d 32595 return true 32596 } 32597 return false 32598 } 32599 func rewriteValueS390X_OpS390XSLD(v *Value) bool { 32600 // match: (SLD x (MOVDconst [c])) 32601 // cond: 32602 // result: (SLDconst [c&63] x) 32603 for { 32604 x := v.Args[0] 32605 v_1 := v.Args[1] 32606 if v_1.Op != OpS390XMOVDconst { 32607 break 32608 } 32609 c := v_1.AuxInt 32610 v.reset(OpS390XSLDconst) 32611 v.AuxInt = c & 63 32612 v.AddArg(x) 32613 return true 32614 } 32615 // match: (SLD x (ANDconst [63] y)) 32616 // cond: 32617 // result: (SLD x y) 32618 for { 32619 x := v.Args[0] 32620 v_1 := v.Args[1] 32621 if v_1.Op != OpS390XANDconst { 32622 break 32623 } 32624 if v_1.AuxInt != 63 { 32625 break 32626 } 32627 y := v_1.Args[0] 32628 v.reset(OpS390XSLD) 32629 v.AddArg(x) 32630 v.AddArg(y) 32631 return true 32632 } 32633 return false 32634 } 32635 func rewriteValueS390X_OpS390XSLW(v *Value) bool { 32636 // match: (SLW x (MOVDconst [c])) 32637 // cond: 32638 // result: (SLWconst [c&63] x) 32639 for { 32640 x := v.Args[0] 32641 v_1 := v.Args[1] 32642 if v_1.Op != OpS390XMOVDconst { 32643 break 32644 } 32645 c := v_1.AuxInt 32646 v.reset(OpS390XSLWconst) 32647 v.AuxInt = c & 63 32648 v.AddArg(x) 32649 return true 32650 } 32651 // match: (SLW x (ANDWconst [63] y)) 32652 // cond: 32653 // result: (SLW x y) 32654 for { 32655 x := v.Args[0] 32656 v_1 := v.Args[1] 32657 if v_1.Op != OpS390XANDWconst { 32658 break 32659 } 32660 if v_1.AuxInt != 63 { 32661 break 32662 } 32663 y := v_1.Args[0] 32664 v.reset(OpS390XSLW) 32665 v.AddArg(x) 32666 v.AddArg(y) 32667 return true 32668 } 32669 return false 32670 } 32671 func rewriteValueS390X_OpS390XSRAD(v *Value) bool { 32672 // match: (SRAD x (MOVDconst [c])) 32673 // cond: 32674 // result: (SRADconst [c&63] x) 32675 for { 32676 x := v.Args[0] 32677 v_1 := v.Args[1] 32678 if v_1.Op != OpS390XMOVDconst { 32679 break 32680 } 32681 c := v_1.AuxInt 32682 v.reset(OpS390XSRADconst) 32683 v.AuxInt = c & 63 32684 v.AddArg(x) 32685 return true 32686 } 32687 // match: (SRAD x (ANDconst [63] y)) 32688 // cond: 32689 // result: (SRAD x y) 32690 for { 32691 x := v.Args[0] 32692 v_1 := v.Args[1] 32693 if v_1.Op != OpS390XANDconst { 32694 break 32695 } 32696 if v_1.AuxInt != 63 { 32697 break 32698 } 32699 y := v_1.Args[0] 32700 v.reset(OpS390XSRAD) 32701 v.AddArg(x) 32702 v.AddArg(y) 32703 return true 32704 } 32705 return false 32706 } 32707 func rewriteValueS390X_OpS390XSRADconst(v *Value) bool { 32708 // match: (SRADconst [c] (MOVDconst [d])) 32709 // cond: 32710 // result: (MOVDconst [d>>uint64(c)]) 32711 for { 32712 c := v.AuxInt 32713 v_0 := v.Args[0] 32714 if v_0.Op != OpS390XMOVDconst { 32715 break 32716 } 32717 d := v_0.AuxInt 32718 v.reset(OpS390XMOVDconst) 32719 v.AuxInt = d >> uint64(c) 32720 return true 32721 } 32722 return false 32723 } 32724 func rewriteValueS390X_OpS390XSRAW(v *Value) bool { 32725 // match: (SRAW x (MOVDconst [c])) 32726 // cond: 32727 // result: (SRAWconst [c&63] x) 32728 for { 32729 x := v.Args[0] 32730 v_1 := v.Args[1] 32731 if v_1.Op != OpS390XMOVDconst { 32732 break 32733 } 32734 c := v_1.AuxInt 32735 v.reset(OpS390XSRAWconst) 32736 v.AuxInt = c & 63 32737 v.AddArg(x) 32738 return true 32739 } 32740 // match: (SRAW x (ANDWconst [63] y)) 32741 // cond: 32742 // result: (SRAW x y) 32743 for { 32744 x := v.Args[0] 32745 v_1 := v.Args[1] 32746 if v_1.Op != OpS390XANDWconst { 32747 break 32748 } 32749 if v_1.AuxInt != 63 { 32750 break 32751 } 32752 y := v_1.Args[0] 32753 v.reset(OpS390XSRAW) 32754 v.AddArg(x) 32755 v.AddArg(y) 32756 return true 32757 } 32758 return false 32759 } 32760 func rewriteValueS390X_OpS390XSRAWconst(v *Value) bool { 32761 // match: (SRAWconst [c] (MOVDconst [d])) 32762 // cond: 32763 // result: (MOVDconst [d>>uint64(c)]) 32764 for { 32765 c := v.AuxInt 32766 v_0 := v.Args[0] 32767 if v_0.Op != OpS390XMOVDconst { 32768 break 32769 } 32770 d := v_0.AuxInt 32771 v.reset(OpS390XMOVDconst) 32772 v.AuxInt = d >> uint64(c) 32773 return true 32774 } 32775 return false 32776 } 32777 func rewriteValueS390X_OpS390XSRD(v *Value) bool { 32778 // match: (SRD x (MOVDconst [c])) 32779 // cond: 32780 // result: (SRDconst [c&63] x) 32781 for { 32782 x := v.Args[0] 32783 v_1 := v.Args[1] 32784 if v_1.Op != OpS390XMOVDconst { 32785 break 32786 } 32787 c := v_1.AuxInt 32788 v.reset(OpS390XSRDconst) 32789 v.AuxInt = c & 63 32790 v.AddArg(x) 32791 return true 32792 } 32793 // match: (SRD x (ANDconst [63] y)) 32794 // cond: 32795 // result: (SRD x y) 32796 for { 32797 x := v.Args[0] 32798 v_1 := v.Args[1] 32799 if v_1.Op != OpS390XANDconst { 32800 break 32801 } 32802 if v_1.AuxInt != 63 { 32803 break 32804 } 32805 y := v_1.Args[0] 32806 v.reset(OpS390XSRD) 32807 v.AddArg(x) 32808 v.AddArg(y) 32809 return true 32810 } 32811 return false 32812 } 32813 func rewriteValueS390X_OpS390XSRW(v *Value) bool { 32814 // match: (SRW x (MOVDconst [c])) 32815 // cond: 32816 // result: (SRWconst [c&63] x) 32817 for { 32818 x := v.Args[0] 32819 v_1 := v.Args[1] 32820 if v_1.Op != OpS390XMOVDconst { 32821 break 32822 } 32823 c := v_1.AuxInt 32824 v.reset(OpS390XSRWconst) 32825 v.AuxInt = c & 63 32826 v.AddArg(x) 32827 return true 32828 } 32829 // match: (SRW x (ANDWconst [63] y)) 32830 // cond: 32831 // result: (SRW x y) 32832 for { 32833 x := v.Args[0] 32834 v_1 := v.Args[1] 32835 if v_1.Op != OpS390XANDWconst { 32836 break 32837 } 32838 if v_1.AuxInt != 63 { 32839 break 32840 } 32841 y := v_1.Args[0] 32842 v.reset(OpS390XSRW) 32843 v.AddArg(x) 32844 v.AddArg(y) 32845 return true 32846 } 32847 return false 32848 } 32849 func rewriteValueS390X_OpS390XSTM2(v *Value) bool { 32850 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 32851 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 32852 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 32853 for { 32854 i := v.AuxInt 32855 s := v.Aux 32856 p := v.Args[0] 32857 w2 := v.Args[1] 32858 w3 := v.Args[2] 32859 x := v.Args[3] 32860 if x.Op != OpS390XSTM2 { 32861 break 32862 } 32863 if x.AuxInt != i-8 { 32864 break 32865 } 32866 if x.Aux != s { 32867 break 32868 } 32869 if p != x.Args[0] { 32870 break 32871 } 32872 w0 := x.Args[1] 32873 w1 := x.Args[2] 32874 mem := x.Args[3] 32875 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 32876 break 32877 } 32878 v.reset(OpS390XSTM4) 32879 v.AuxInt = i - 8 32880 v.Aux = s 32881 v.AddArg(p) 32882 v.AddArg(w0) 32883 v.AddArg(w1) 32884 v.AddArg(w2) 32885 v.AddArg(w3) 32886 v.AddArg(mem) 32887 return true 32888 } 32889 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 32890 // cond: 32891 // result: (MOVDstore [i] {s} p x mem) 32892 for { 32893 i := v.AuxInt 32894 s := v.Aux 32895 p := v.Args[0] 32896 v_1 := v.Args[1] 32897 if v_1.Op != OpS390XSRDconst { 32898 break 32899 } 32900 if v_1.AuxInt != 32 { 32901 break 32902 } 32903 x := v_1.Args[0] 32904 if x != v.Args[2] { 32905 break 32906 } 32907 mem := v.Args[3] 32908 v.reset(OpS390XMOVDstore) 32909 v.AuxInt = i 32910 v.Aux = s 32911 v.AddArg(p) 32912 v.AddArg(x) 32913 v.AddArg(mem) 32914 return true 32915 } 32916 return false 32917 } 32918 func rewriteValueS390X_OpS390XSTMG2(v *Value) bool { 32919 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 32920 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 32921 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 32922 for { 32923 i := v.AuxInt 32924 s := v.Aux 32925 p := v.Args[0] 32926 w2 := v.Args[1] 32927 w3 := v.Args[2] 32928 x := v.Args[3] 32929 if x.Op != OpS390XSTMG2 { 32930 break 32931 } 32932 if x.AuxInt != i-16 { 32933 break 32934 } 32935 if x.Aux != s { 32936 break 32937 } 32938 if p != x.Args[0] { 32939 break 32940 } 32941 w0 := x.Args[1] 32942 w1 := x.Args[2] 32943 mem := x.Args[3] 32944 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 32945 break 32946 } 32947 v.reset(OpS390XSTMG4) 32948 v.AuxInt = i - 16 32949 v.Aux = s 32950 v.AddArg(p) 32951 v.AddArg(w0) 32952 v.AddArg(w1) 32953 v.AddArg(w2) 32954 v.AddArg(w3) 32955 v.AddArg(mem) 32956 return true 32957 } 32958 return false 32959 } 32960 func rewriteValueS390X_OpS390XSUB(v *Value) bool { 32961 b := v.Block 32962 _ = b 32963 // match: (SUB x (MOVDconst [c])) 32964 // cond: is32Bit(c) 32965 // result: (SUBconst x [c]) 32966 for { 32967 x := v.Args[0] 32968 v_1 := v.Args[1] 32969 if v_1.Op != OpS390XMOVDconst { 32970 break 32971 } 32972 c := v_1.AuxInt 32973 if !(is32Bit(c)) { 32974 break 32975 } 32976 v.reset(OpS390XSUBconst) 32977 v.AuxInt = c 32978 v.AddArg(x) 32979 return true 32980 } 32981 // match: (SUB (MOVDconst [c]) x) 32982 // cond: is32Bit(c) 32983 // result: (NEG (SUBconst <v.Type> x [c])) 32984 for { 32985 v_0 := v.Args[0] 32986 if v_0.Op != OpS390XMOVDconst { 32987 break 32988 } 32989 c := v_0.AuxInt 32990 x := v.Args[1] 32991 if !(is32Bit(c)) { 32992 break 32993 } 32994 v.reset(OpS390XNEG) 32995 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 32996 v0.AuxInt = c 32997 v0.AddArg(x) 32998 v.AddArg(v0) 32999 return true 33000 } 33001 // match: (SUB x x) 33002 // cond: 33003 // result: (MOVDconst [0]) 33004 for { 33005 x := v.Args[0] 33006 if x != v.Args[1] { 33007 break 33008 } 33009 v.reset(OpS390XMOVDconst) 33010 v.AuxInt = 0 33011 return true 33012 } 33013 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 33014 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33015 // result: (SUBload <t> [off] {sym} x ptr mem) 33016 for { 33017 t := v.Type 33018 x := v.Args[0] 33019 g := v.Args[1] 33020 if g.Op != OpS390XMOVDload { 33021 break 33022 } 33023 off := g.AuxInt 33024 sym := g.Aux 33025 ptr := g.Args[0] 33026 mem := g.Args[1] 33027 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33028 break 33029 } 33030 v.reset(OpS390XSUBload) 33031 v.Type = t 33032 v.AuxInt = off 33033 v.Aux = sym 33034 v.AddArg(x) 33035 v.AddArg(ptr) 33036 v.AddArg(mem) 33037 return true 33038 } 33039 return false 33040 } 33041 func rewriteValueS390X_OpS390XSUBEWcarrymask(v *Value) bool { 33042 // match: (SUBEWcarrymask (FlagEQ)) 33043 // cond: 33044 // result: (MOVDconst [-1]) 33045 for { 33046 v_0 := v.Args[0] 33047 if v_0.Op != OpS390XFlagEQ { 33048 break 33049 } 33050 v.reset(OpS390XMOVDconst) 33051 v.AuxInt = -1 33052 return true 33053 } 33054 // match: (SUBEWcarrymask (FlagLT)) 33055 // cond: 33056 // result: (MOVDconst [-1]) 33057 for { 33058 v_0 := v.Args[0] 33059 if v_0.Op != OpS390XFlagLT { 33060 break 33061 } 33062 v.reset(OpS390XMOVDconst) 33063 v.AuxInt = -1 33064 return true 33065 } 33066 // match: (SUBEWcarrymask (FlagGT)) 33067 // cond: 33068 // result: (MOVDconst [0]) 33069 for { 33070 v_0 := v.Args[0] 33071 if v_0.Op != OpS390XFlagGT { 33072 break 33073 } 33074 v.reset(OpS390XMOVDconst) 33075 v.AuxInt = 0 33076 return true 33077 } 33078 return false 33079 } 33080 func rewriteValueS390X_OpS390XSUBEcarrymask(v *Value) bool { 33081 // match: (SUBEcarrymask (FlagEQ)) 33082 // cond: 33083 // result: (MOVDconst [-1]) 33084 for { 33085 v_0 := v.Args[0] 33086 if v_0.Op != OpS390XFlagEQ { 33087 break 33088 } 33089 v.reset(OpS390XMOVDconst) 33090 v.AuxInt = -1 33091 return true 33092 } 33093 // match: (SUBEcarrymask (FlagLT)) 33094 // cond: 33095 // result: (MOVDconst [-1]) 33096 for { 33097 v_0 := v.Args[0] 33098 if v_0.Op != OpS390XFlagLT { 33099 break 33100 } 33101 v.reset(OpS390XMOVDconst) 33102 v.AuxInt = -1 33103 return true 33104 } 33105 // match: (SUBEcarrymask (FlagGT)) 33106 // cond: 33107 // result: (MOVDconst [0]) 33108 for { 33109 v_0 := v.Args[0] 33110 if v_0.Op != OpS390XFlagGT { 33111 break 33112 } 33113 v.reset(OpS390XMOVDconst) 33114 v.AuxInt = 0 33115 return true 33116 } 33117 return false 33118 } 33119 func rewriteValueS390X_OpS390XSUBW(v *Value) bool { 33120 b := v.Block 33121 _ = b 33122 // match: (SUBW x (MOVDconst [c])) 33123 // cond: 33124 // result: (SUBWconst x [c]) 33125 for { 33126 x := v.Args[0] 33127 v_1 := v.Args[1] 33128 if v_1.Op != OpS390XMOVDconst { 33129 break 33130 } 33131 c := v_1.AuxInt 33132 v.reset(OpS390XSUBWconst) 33133 v.AuxInt = c 33134 v.AddArg(x) 33135 return true 33136 } 33137 // match: (SUBW (MOVDconst [c]) x) 33138 // cond: 33139 // result: (NEGW (SUBWconst <v.Type> x [c])) 33140 for { 33141 v_0 := v.Args[0] 33142 if v_0.Op != OpS390XMOVDconst { 33143 break 33144 } 33145 c := v_0.AuxInt 33146 x := v.Args[1] 33147 v.reset(OpS390XNEGW) 33148 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 33149 v0.AuxInt = c 33150 v0.AddArg(x) 33151 v.AddArg(v0) 33152 return true 33153 } 33154 // match: (SUBW x x) 33155 // cond: 33156 // result: (MOVDconst [0]) 33157 for { 33158 x := v.Args[0] 33159 if x != v.Args[1] { 33160 break 33161 } 33162 v.reset(OpS390XMOVDconst) 33163 v.AuxInt = 0 33164 return true 33165 } 33166 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 33167 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33168 // result: (SUBWload <t> [off] {sym} x ptr mem) 33169 for { 33170 t := v.Type 33171 x := v.Args[0] 33172 g := v.Args[1] 33173 if g.Op != OpS390XMOVWload { 33174 break 33175 } 33176 off := g.AuxInt 33177 sym := g.Aux 33178 ptr := g.Args[0] 33179 mem := g.Args[1] 33180 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33181 break 33182 } 33183 v.reset(OpS390XSUBWload) 33184 v.Type = t 33185 v.AuxInt = off 33186 v.Aux = sym 33187 v.AddArg(x) 33188 v.AddArg(ptr) 33189 v.AddArg(mem) 33190 return true 33191 } 33192 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33193 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33194 // result: (SUBWload <t> [off] {sym} x ptr mem) 33195 for { 33196 t := v.Type 33197 x := v.Args[0] 33198 g := v.Args[1] 33199 if g.Op != OpS390XMOVWZload { 33200 break 33201 } 33202 off := g.AuxInt 33203 sym := g.Aux 33204 ptr := g.Args[0] 33205 mem := g.Args[1] 33206 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33207 break 33208 } 33209 v.reset(OpS390XSUBWload) 33210 v.Type = t 33211 v.AuxInt = off 33212 v.Aux = sym 33213 v.AddArg(x) 33214 v.AddArg(ptr) 33215 v.AddArg(mem) 33216 return true 33217 } 33218 return false 33219 } 33220 func rewriteValueS390X_OpS390XSUBWconst(v *Value) bool { 33221 // match: (SUBWconst [c] x) 33222 // cond: int32(c) == 0 33223 // result: x 33224 for { 33225 c := v.AuxInt 33226 x := v.Args[0] 33227 if !(int32(c) == 0) { 33228 break 33229 } 33230 v.reset(OpCopy) 33231 v.Type = x.Type 33232 v.AddArg(x) 33233 return true 33234 } 33235 // match: (SUBWconst [c] x) 33236 // cond: 33237 // result: (ADDWconst [int64(int32(-c))] x) 33238 for { 33239 c := v.AuxInt 33240 x := v.Args[0] 33241 v.reset(OpS390XADDWconst) 33242 v.AuxInt = int64(int32(-c)) 33243 v.AddArg(x) 33244 return true 33245 } 33246 } 33247 func rewriteValueS390X_OpS390XSUBconst(v *Value) bool { 33248 // match: (SUBconst [0] x) 33249 // cond: 33250 // result: x 33251 for { 33252 if v.AuxInt != 0 { 33253 break 33254 } 33255 x := v.Args[0] 33256 v.reset(OpCopy) 33257 v.Type = x.Type 33258 v.AddArg(x) 33259 return true 33260 } 33261 // match: (SUBconst [c] x) 33262 // cond: c != -(1<<31) 33263 // result: (ADDconst [-c] x) 33264 for { 33265 c := v.AuxInt 33266 x := v.Args[0] 33267 if !(c != -(1 << 31)) { 33268 break 33269 } 33270 v.reset(OpS390XADDconst) 33271 v.AuxInt = -c 33272 v.AddArg(x) 33273 return true 33274 } 33275 // match: (SUBconst (MOVDconst [d]) [c]) 33276 // cond: 33277 // result: (MOVDconst [d-c]) 33278 for { 33279 c := v.AuxInt 33280 v_0 := v.Args[0] 33281 if v_0.Op != OpS390XMOVDconst { 33282 break 33283 } 33284 d := v_0.AuxInt 33285 v.reset(OpS390XMOVDconst) 33286 v.AuxInt = d - c 33287 return true 33288 } 33289 // match: (SUBconst (SUBconst x [d]) [c]) 33290 // cond: is32Bit(-c-d) 33291 // result: (ADDconst [-c-d] x) 33292 for { 33293 c := v.AuxInt 33294 v_0 := v.Args[0] 33295 if v_0.Op != OpS390XSUBconst { 33296 break 33297 } 33298 d := v_0.AuxInt 33299 x := v_0.Args[0] 33300 if !(is32Bit(-c - d)) { 33301 break 33302 } 33303 v.reset(OpS390XADDconst) 33304 v.AuxInt = -c - d 33305 v.AddArg(x) 33306 return true 33307 } 33308 return false 33309 } 33310 func rewriteValueS390X_OpS390XXOR(v *Value) bool { 33311 // match: (XOR x (MOVDconst [c])) 33312 // cond: isU32Bit(c) 33313 // result: (XORconst [c] x) 33314 for { 33315 x := v.Args[0] 33316 v_1 := v.Args[1] 33317 if v_1.Op != OpS390XMOVDconst { 33318 break 33319 } 33320 c := v_1.AuxInt 33321 if !(isU32Bit(c)) { 33322 break 33323 } 33324 v.reset(OpS390XXORconst) 33325 v.AuxInt = c 33326 v.AddArg(x) 33327 return true 33328 } 33329 // match: (XOR (MOVDconst [c]) x) 33330 // cond: isU32Bit(c) 33331 // result: (XORconst [c] x) 33332 for { 33333 v_0 := v.Args[0] 33334 if v_0.Op != OpS390XMOVDconst { 33335 break 33336 } 33337 c := v_0.AuxInt 33338 x := v.Args[1] 33339 if !(isU32Bit(c)) { 33340 break 33341 } 33342 v.reset(OpS390XXORconst) 33343 v.AuxInt = c 33344 v.AddArg(x) 33345 return true 33346 } 33347 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 33348 // cond: d == 64-c 33349 // result: (RLLGconst [c] x) 33350 for { 33351 v_0 := v.Args[0] 33352 if v_0.Op != OpS390XSLDconst { 33353 break 33354 } 33355 c := v_0.AuxInt 33356 x := v_0.Args[0] 33357 v_1 := v.Args[1] 33358 if v_1.Op != OpS390XSRDconst { 33359 break 33360 } 33361 d := v_1.AuxInt 33362 if x != v_1.Args[0] { 33363 break 33364 } 33365 if !(d == 64-c) { 33366 break 33367 } 33368 v.reset(OpS390XRLLGconst) 33369 v.AuxInt = c 33370 v.AddArg(x) 33371 return true 33372 } 33373 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 33374 // cond: d == 64-c 33375 // result: (RLLGconst [c] x) 33376 for { 33377 v_0 := v.Args[0] 33378 if v_0.Op != OpS390XSRDconst { 33379 break 33380 } 33381 d := v_0.AuxInt 33382 x := v_0.Args[0] 33383 v_1 := v.Args[1] 33384 if v_1.Op != OpS390XSLDconst { 33385 break 33386 } 33387 c := v_1.AuxInt 33388 if x != v_1.Args[0] { 33389 break 33390 } 33391 if !(d == 64-c) { 33392 break 33393 } 33394 v.reset(OpS390XRLLGconst) 33395 v.AuxInt = c 33396 v.AddArg(x) 33397 return true 33398 } 33399 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 33400 // cond: 33401 // result: (MOVDconst [c^d]) 33402 for { 33403 v_0 := v.Args[0] 33404 if v_0.Op != OpS390XMOVDconst { 33405 break 33406 } 33407 c := v_0.AuxInt 33408 v_1 := v.Args[1] 33409 if v_1.Op != OpS390XMOVDconst { 33410 break 33411 } 33412 d := v_1.AuxInt 33413 v.reset(OpS390XMOVDconst) 33414 v.AuxInt = c ^ d 33415 return true 33416 } 33417 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 33418 // cond: 33419 // result: (MOVDconst [c^d]) 33420 for { 33421 v_0 := v.Args[0] 33422 if v_0.Op != OpS390XMOVDconst { 33423 break 33424 } 33425 d := v_0.AuxInt 33426 v_1 := v.Args[1] 33427 if v_1.Op != OpS390XMOVDconst { 33428 break 33429 } 33430 c := v_1.AuxInt 33431 v.reset(OpS390XMOVDconst) 33432 v.AuxInt = c ^ d 33433 return true 33434 } 33435 // match: (XOR x x) 33436 // cond: 33437 // result: (MOVDconst [0]) 33438 for { 33439 x := v.Args[0] 33440 if x != v.Args[1] { 33441 break 33442 } 33443 v.reset(OpS390XMOVDconst) 33444 v.AuxInt = 0 33445 return true 33446 } 33447 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 33448 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33449 // result: (XORload <t> [off] {sym} x ptr mem) 33450 for { 33451 t := v.Type 33452 x := v.Args[0] 33453 g := v.Args[1] 33454 if g.Op != OpS390XMOVDload { 33455 break 33456 } 33457 off := g.AuxInt 33458 sym := g.Aux 33459 ptr := g.Args[0] 33460 mem := g.Args[1] 33461 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33462 break 33463 } 33464 v.reset(OpS390XXORload) 33465 v.Type = t 33466 v.AuxInt = off 33467 v.Aux = sym 33468 v.AddArg(x) 33469 v.AddArg(ptr) 33470 v.AddArg(mem) 33471 return true 33472 } 33473 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 33474 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33475 // result: (XORload <t> [off] {sym} x ptr mem) 33476 for { 33477 t := v.Type 33478 g := v.Args[0] 33479 if g.Op != OpS390XMOVDload { 33480 break 33481 } 33482 off := g.AuxInt 33483 sym := g.Aux 33484 ptr := g.Args[0] 33485 mem := g.Args[1] 33486 x := v.Args[1] 33487 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33488 break 33489 } 33490 v.reset(OpS390XXORload) 33491 v.Type = t 33492 v.AuxInt = off 33493 v.Aux = sym 33494 v.AddArg(x) 33495 v.AddArg(ptr) 33496 v.AddArg(mem) 33497 return true 33498 } 33499 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 33500 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33501 // result: (XORload <t> [off] {sym} x ptr mem) 33502 for { 33503 t := v.Type 33504 g := v.Args[0] 33505 if g.Op != OpS390XMOVDload { 33506 break 33507 } 33508 off := g.AuxInt 33509 sym := g.Aux 33510 ptr := g.Args[0] 33511 mem := g.Args[1] 33512 x := v.Args[1] 33513 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33514 break 33515 } 33516 v.reset(OpS390XXORload) 33517 v.Type = t 33518 v.AuxInt = off 33519 v.Aux = sym 33520 v.AddArg(x) 33521 v.AddArg(ptr) 33522 v.AddArg(mem) 33523 return true 33524 } 33525 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 33526 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33527 // result: (XORload <t> [off] {sym} x ptr mem) 33528 for { 33529 t := v.Type 33530 x := v.Args[0] 33531 g := v.Args[1] 33532 if g.Op != OpS390XMOVDload { 33533 break 33534 } 33535 off := g.AuxInt 33536 sym := g.Aux 33537 ptr := g.Args[0] 33538 mem := g.Args[1] 33539 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33540 break 33541 } 33542 v.reset(OpS390XXORload) 33543 v.Type = t 33544 v.AuxInt = off 33545 v.Aux = sym 33546 v.AddArg(x) 33547 v.AddArg(ptr) 33548 v.AddArg(mem) 33549 return true 33550 } 33551 return false 33552 } 33553 func rewriteValueS390X_OpS390XXORW(v *Value) bool { 33554 // match: (XORW x (MOVDconst [c])) 33555 // cond: 33556 // result: (XORWconst [c] x) 33557 for { 33558 x := v.Args[0] 33559 v_1 := v.Args[1] 33560 if v_1.Op != OpS390XMOVDconst { 33561 break 33562 } 33563 c := v_1.AuxInt 33564 v.reset(OpS390XXORWconst) 33565 v.AuxInt = c 33566 v.AddArg(x) 33567 return true 33568 } 33569 // match: (XORW (MOVDconst [c]) x) 33570 // cond: 33571 // result: (XORWconst [c] x) 33572 for { 33573 v_0 := v.Args[0] 33574 if v_0.Op != OpS390XMOVDconst { 33575 break 33576 } 33577 c := v_0.AuxInt 33578 x := v.Args[1] 33579 v.reset(OpS390XXORWconst) 33580 v.AuxInt = c 33581 v.AddArg(x) 33582 return true 33583 } 33584 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 33585 // cond: d == 32-c 33586 // result: (RLLconst [c] x) 33587 for { 33588 v_0 := v.Args[0] 33589 if v_0.Op != OpS390XSLWconst { 33590 break 33591 } 33592 c := v_0.AuxInt 33593 x := v_0.Args[0] 33594 v_1 := v.Args[1] 33595 if v_1.Op != OpS390XSRWconst { 33596 break 33597 } 33598 d := v_1.AuxInt 33599 if x != v_1.Args[0] { 33600 break 33601 } 33602 if !(d == 32-c) { 33603 break 33604 } 33605 v.reset(OpS390XRLLconst) 33606 v.AuxInt = c 33607 v.AddArg(x) 33608 return true 33609 } 33610 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 33611 // cond: d == 32-c 33612 // result: (RLLconst [c] x) 33613 for { 33614 v_0 := v.Args[0] 33615 if v_0.Op != OpS390XSRWconst { 33616 break 33617 } 33618 d := v_0.AuxInt 33619 x := v_0.Args[0] 33620 v_1 := v.Args[1] 33621 if v_1.Op != OpS390XSLWconst { 33622 break 33623 } 33624 c := v_1.AuxInt 33625 if x != v_1.Args[0] { 33626 break 33627 } 33628 if !(d == 32-c) { 33629 break 33630 } 33631 v.reset(OpS390XRLLconst) 33632 v.AuxInt = c 33633 v.AddArg(x) 33634 return true 33635 } 33636 // match: (XORW x x) 33637 // cond: 33638 // result: (MOVDconst [0]) 33639 for { 33640 x := v.Args[0] 33641 if x != v.Args[1] { 33642 break 33643 } 33644 v.reset(OpS390XMOVDconst) 33645 v.AuxInt = 0 33646 return true 33647 } 33648 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33649 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33650 // result: (XORWload <t> [off] {sym} x ptr mem) 33651 for { 33652 t := v.Type 33653 x := v.Args[0] 33654 g := v.Args[1] 33655 if g.Op != OpS390XMOVWload { 33656 break 33657 } 33658 off := g.AuxInt 33659 sym := g.Aux 33660 ptr := g.Args[0] 33661 mem := g.Args[1] 33662 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33663 break 33664 } 33665 v.reset(OpS390XXORWload) 33666 v.Type = t 33667 v.AuxInt = off 33668 v.Aux = sym 33669 v.AddArg(x) 33670 v.AddArg(ptr) 33671 v.AddArg(mem) 33672 return true 33673 } 33674 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33675 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33676 // result: (XORWload <t> [off] {sym} x ptr mem) 33677 for { 33678 t := v.Type 33679 g := v.Args[0] 33680 if g.Op != OpS390XMOVWload { 33681 break 33682 } 33683 off := g.AuxInt 33684 sym := g.Aux 33685 ptr := g.Args[0] 33686 mem := g.Args[1] 33687 x := v.Args[1] 33688 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33689 break 33690 } 33691 v.reset(OpS390XXORWload) 33692 v.Type = t 33693 v.AuxInt = off 33694 v.Aux = sym 33695 v.AddArg(x) 33696 v.AddArg(ptr) 33697 v.AddArg(mem) 33698 return true 33699 } 33700 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33701 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33702 // result: (XORWload <t> [off] {sym} x ptr mem) 33703 for { 33704 t := v.Type 33705 g := v.Args[0] 33706 if g.Op != OpS390XMOVWload { 33707 break 33708 } 33709 off := g.AuxInt 33710 sym := g.Aux 33711 ptr := g.Args[0] 33712 mem := g.Args[1] 33713 x := v.Args[1] 33714 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33715 break 33716 } 33717 v.reset(OpS390XXORWload) 33718 v.Type = t 33719 v.AuxInt = off 33720 v.Aux = sym 33721 v.AddArg(x) 33722 v.AddArg(ptr) 33723 v.AddArg(mem) 33724 return true 33725 } 33726 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33727 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33728 // result: (XORWload <t> [off] {sym} x ptr mem) 33729 for { 33730 t := v.Type 33731 x := v.Args[0] 33732 g := v.Args[1] 33733 if g.Op != OpS390XMOVWload { 33734 break 33735 } 33736 off := g.AuxInt 33737 sym := g.Aux 33738 ptr := g.Args[0] 33739 mem := g.Args[1] 33740 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33741 break 33742 } 33743 v.reset(OpS390XXORWload) 33744 v.Type = t 33745 v.AuxInt = off 33746 v.Aux = sym 33747 v.AddArg(x) 33748 v.AddArg(ptr) 33749 v.AddArg(mem) 33750 return true 33751 } 33752 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33753 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33754 // result: (XORWload <t> [off] {sym} x ptr mem) 33755 for { 33756 t := v.Type 33757 x := v.Args[0] 33758 g := v.Args[1] 33759 if g.Op != OpS390XMOVWZload { 33760 break 33761 } 33762 off := g.AuxInt 33763 sym := g.Aux 33764 ptr := g.Args[0] 33765 mem := g.Args[1] 33766 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33767 break 33768 } 33769 v.reset(OpS390XXORWload) 33770 v.Type = t 33771 v.AuxInt = off 33772 v.Aux = sym 33773 v.AddArg(x) 33774 v.AddArg(ptr) 33775 v.AddArg(mem) 33776 return true 33777 } 33778 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 33779 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33780 // result: (XORWload <t> [off] {sym} x ptr mem) 33781 for { 33782 t := v.Type 33783 g := v.Args[0] 33784 if g.Op != OpS390XMOVWZload { 33785 break 33786 } 33787 off := g.AuxInt 33788 sym := g.Aux 33789 ptr := g.Args[0] 33790 mem := g.Args[1] 33791 x := v.Args[1] 33792 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33793 break 33794 } 33795 v.reset(OpS390XXORWload) 33796 v.Type = t 33797 v.AuxInt = off 33798 v.Aux = sym 33799 v.AddArg(x) 33800 v.AddArg(ptr) 33801 v.AddArg(mem) 33802 return true 33803 } 33804 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 33805 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33806 // result: (XORWload <t> [off] {sym} x ptr mem) 33807 for { 33808 t := v.Type 33809 g := v.Args[0] 33810 if g.Op != OpS390XMOVWZload { 33811 break 33812 } 33813 off := g.AuxInt 33814 sym := g.Aux 33815 ptr := g.Args[0] 33816 mem := g.Args[1] 33817 x := v.Args[1] 33818 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33819 break 33820 } 33821 v.reset(OpS390XXORWload) 33822 v.Type = t 33823 v.AuxInt = off 33824 v.Aux = sym 33825 v.AddArg(x) 33826 v.AddArg(ptr) 33827 v.AddArg(mem) 33828 return true 33829 } 33830 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33831 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33832 // result: (XORWload <t> [off] {sym} x ptr mem) 33833 for { 33834 t := v.Type 33835 x := v.Args[0] 33836 g := v.Args[1] 33837 if g.Op != OpS390XMOVWZload { 33838 break 33839 } 33840 off := g.AuxInt 33841 sym := g.Aux 33842 ptr := g.Args[0] 33843 mem := g.Args[1] 33844 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33845 break 33846 } 33847 v.reset(OpS390XXORWload) 33848 v.Type = t 33849 v.AuxInt = off 33850 v.Aux = sym 33851 v.AddArg(x) 33852 v.AddArg(ptr) 33853 v.AddArg(mem) 33854 return true 33855 } 33856 return false 33857 } 33858 func rewriteValueS390X_OpS390XXORWconst(v *Value) bool { 33859 // match: (XORWconst [c] x) 33860 // cond: int32(c)==0 33861 // result: x 33862 for { 33863 c := v.AuxInt 33864 x := v.Args[0] 33865 if !(int32(c) == 0) { 33866 break 33867 } 33868 v.reset(OpCopy) 33869 v.Type = x.Type 33870 v.AddArg(x) 33871 return true 33872 } 33873 // match: (XORWconst [c] (MOVDconst [d])) 33874 // cond: 33875 // result: (MOVDconst [c^d]) 33876 for { 33877 c := v.AuxInt 33878 v_0 := v.Args[0] 33879 if v_0.Op != OpS390XMOVDconst { 33880 break 33881 } 33882 d := v_0.AuxInt 33883 v.reset(OpS390XMOVDconst) 33884 v.AuxInt = c ^ d 33885 return true 33886 } 33887 return false 33888 } 33889 func rewriteValueS390X_OpS390XXORconst(v *Value) bool { 33890 // match: (XORconst [0] x) 33891 // cond: 33892 // result: x 33893 for { 33894 if v.AuxInt != 0 { 33895 break 33896 } 33897 x := v.Args[0] 33898 v.reset(OpCopy) 33899 v.Type = x.Type 33900 v.AddArg(x) 33901 return true 33902 } 33903 // match: (XORconst [c] (MOVDconst [d])) 33904 // cond: 33905 // result: (MOVDconst [c^d]) 33906 for { 33907 c := v.AuxInt 33908 v_0 := v.Args[0] 33909 if v_0.Op != OpS390XMOVDconst { 33910 break 33911 } 33912 d := v_0.AuxInt 33913 v.reset(OpS390XMOVDconst) 33914 v.AuxInt = c ^ d 33915 return true 33916 } 33917 return false 33918 } 33919 func rewriteValueS390X_OpSelect0(v *Value) bool { 33920 b := v.Block 33921 _ = b 33922 // match: (Select0 <t> (AddTupleFirst32 tuple val)) 33923 // cond: 33924 // result: (ADDW val (Select0 <t> tuple)) 33925 for { 33926 t := v.Type 33927 v_0 := v.Args[0] 33928 if v_0.Op != OpS390XAddTupleFirst32 { 33929 break 33930 } 33931 tuple := v_0.Args[0] 33932 val := v_0.Args[1] 33933 v.reset(OpS390XADDW) 33934 v.AddArg(val) 33935 v0 := b.NewValue0(v.Pos, OpSelect0, t) 33936 v0.AddArg(tuple) 33937 v.AddArg(v0) 33938 return true 33939 } 33940 // match: (Select0 <t> (AddTupleFirst64 tuple val)) 33941 // cond: 33942 // result: (ADD val (Select0 <t> tuple)) 33943 for { 33944 t := v.Type 33945 v_0 := v.Args[0] 33946 if v_0.Op != OpS390XAddTupleFirst64 { 33947 break 33948 } 33949 tuple := v_0.Args[0] 33950 val := v_0.Args[1] 33951 v.reset(OpS390XADD) 33952 v.AddArg(val) 33953 v0 := b.NewValue0(v.Pos, OpSelect0, t) 33954 v0.AddArg(tuple) 33955 v.AddArg(v0) 33956 return true 33957 } 33958 return false 33959 } 33960 func rewriteValueS390X_OpSelect1(v *Value) bool { 33961 // match: (Select1 (AddTupleFirst32 tuple _)) 33962 // cond: 33963 // result: (Select1 tuple) 33964 for { 33965 v_0 := v.Args[0] 33966 if v_0.Op != OpS390XAddTupleFirst32 { 33967 break 33968 } 33969 tuple := v_0.Args[0] 33970 v.reset(OpSelect1) 33971 v.AddArg(tuple) 33972 return true 33973 } 33974 // match: (Select1 (AddTupleFirst64 tuple _)) 33975 // cond: 33976 // result: (Select1 tuple) 33977 for { 33978 v_0 := v.Args[0] 33979 if v_0.Op != OpS390XAddTupleFirst64 { 33980 break 33981 } 33982 tuple := v_0.Args[0] 33983 v.reset(OpSelect1) 33984 v.AddArg(tuple) 33985 return true 33986 } 33987 return false 33988 } 33989 func rewriteValueS390X_OpSignExt16to32(v *Value) bool { 33990 // match: (SignExt16to32 x) 33991 // cond: 33992 // result: (MOVHreg x) 33993 for { 33994 x := v.Args[0] 33995 v.reset(OpS390XMOVHreg) 33996 v.AddArg(x) 33997 return true 33998 } 33999 } 34000 func rewriteValueS390X_OpSignExt16to64(v *Value) bool { 34001 // match: (SignExt16to64 x) 34002 // cond: 34003 // result: (MOVHreg x) 34004 for { 34005 x := v.Args[0] 34006 v.reset(OpS390XMOVHreg) 34007 v.AddArg(x) 34008 return true 34009 } 34010 } 34011 func rewriteValueS390X_OpSignExt32to64(v *Value) bool { 34012 // match: (SignExt32to64 x) 34013 // cond: 34014 // result: (MOVWreg x) 34015 for { 34016 x := v.Args[0] 34017 v.reset(OpS390XMOVWreg) 34018 v.AddArg(x) 34019 return true 34020 } 34021 } 34022 func rewriteValueS390X_OpSignExt8to16(v *Value) bool { 34023 // match: (SignExt8to16 x) 34024 // cond: 34025 // result: (MOVBreg x) 34026 for { 34027 x := v.Args[0] 34028 v.reset(OpS390XMOVBreg) 34029 v.AddArg(x) 34030 return true 34031 } 34032 } 34033 func rewriteValueS390X_OpSignExt8to32(v *Value) bool { 34034 // match: (SignExt8to32 x) 34035 // cond: 34036 // result: (MOVBreg x) 34037 for { 34038 x := v.Args[0] 34039 v.reset(OpS390XMOVBreg) 34040 v.AddArg(x) 34041 return true 34042 } 34043 } 34044 func rewriteValueS390X_OpSignExt8to64(v *Value) bool { 34045 // match: (SignExt8to64 x) 34046 // cond: 34047 // result: (MOVBreg x) 34048 for { 34049 x := v.Args[0] 34050 v.reset(OpS390XMOVBreg) 34051 v.AddArg(x) 34052 return true 34053 } 34054 } 34055 func rewriteValueS390X_OpSlicemask(v *Value) bool { 34056 b := v.Block 34057 _ = b 34058 // match: (Slicemask <t> x) 34059 // cond: 34060 // result: (SRADconst (NEG <t> x) [63]) 34061 for { 34062 t := v.Type 34063 x := v.Args[0] 34064 v.reset(OpS390XSRADconst) 34065 v.AuxInt = 63 34066 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 34067 v0.AddArg(x) 34068 v.AddArg(v0) 34069 return true 34070 } 34071 } 34072 func rewriteValueS390X_OpSqrt(v *Value) bool { 34073 // match: (Sqrt x) 34074 // cond: 34075 // result: (FSQRT x) 34076 for { 34077 x := v.Args[0] 34078 v.reset(OpS390XFSQRT) 34079 v.AddArg(x) 34080 return true 34081 } 34082 } 34083 func rewriteValueS390X_OpStaticCall(v *Value) bool { 34084 // match: (StaticCall [argwid] {target} mem) 34085 // cond: 34086 // result: (CALLstatic [argwid] {target} mem) 34087 for { 34088 argwid := v.AuxInt 34089 target := v.Aux 34090 mem := v.Args[0] 34091 v.reset(OpS390XCALLstatic) 34092 v.AuxInt = argwid 34093 v.Aux = target 34094 v.AddArg(mem) 34095 return true 34096 } 34097 } 34098 func rewriteValueS390X_OpStore(v *Value) bool { 34099 // match: (Store {t} ptr val mem) 34100 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 34101 // result: (FMOVDstore ptr val mem) 34102 for { 34103 t := v.Aux 34104 ptr := v.Args[0] 34105 val := v.Args[1] 34106 mem := v.Args[2] 34107 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 34108 break 34109 } 34110 v.reset(OpS390XFMOVDstore) 34111 v.AddArg(ptr) 34112 v.AddArg(val) 34113 v.AddArg(mem) 34114 return true 34115 } 34116 // match: (Store {t} ptr val mem) 34117 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 34118 // result: (FMOVSstore ptr val mem) 34119 for { 34120 t := v.Aux 34121 ptr := v.Args[0] 34122 val := v.Args[1] 34123 mem := v.Args[2] 34124 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 34125 break 34126 } 34127 v.reset(OpS390XFMOVSstore) 34128 v.AddArg(ptr) 34129 v.AddArg(val) 34130 v.AddArg(mem) 34131 return true 34132 } 34133 // match: (Store {t} ptr val mem) 34134 // cond: t.(Type).Size() == 8 34135 // result: (MOVDstore ptr val mem) 34136 for { 34137 t := v.Aux 34138 ptr := v.Args[0] 34139 val := v.Args[1] 34140 mem := v.Args[2] 34141 if !(t.(Type).Size() == 8) { 34142 break 34143 } 34144 v.reset(OpS390XMOVDstore) 34145 v.AddArg(ptr) 34146 v.AddArg(val) 34147 v.AddArg(mem) 34148 return true 34149 } 34150 // match: (Store {t} ptr val mem) 34151 // cond: t.(Type).Size() == 4 34152 // result: (MOVWstore ptr val mem) 34153 for { 34154 t := v.Aux 34155 ptr := v.Args[0] 34156 val := v.Args[1] 34157 mem := v.Args[2] 34158 if !(t.(Type).Size() == 4) { 34159 break 34160 } 34161 v.reset(OpS390XMOVWstore) 34162 v.AddArg(ptr) 34163 v.AddArg(val) 34164 v.AddArg(mem) 34165 return true 34166 } 34167 // match: (Store {t} ptr val mem) 34168 // cond: t.(Type).Size() == 2 34169 // result: (MOVHstore ptr val mem) 34170 for { 34171 t := v.Aux 34172 ptr := v.Args[0] 34173 val := v.Args[1] 34174 mem := v.Args[2] 34175 if !(t.(Type).Size() == 2) { 34176 break 34177 } 34178 v.reset(OpS390XMOVHstore) 34179 v.AddArg(ptr) 34180 v.AddArg(val) 34181 v.AddArg(mem) 34182 return true 34183 } 34184 // match: (Store {t} ptr val mem) 34185 // cond: t.(Type).Size() == 1 34186 // result: (MOVBstore ptr val mem) 34187 for { 34188 t := v.Aux 34189 ptr := v.Args[0] 34190 val := v.Args[1] 34191 mem := v.Args[2] 34192 if !(t.(Type).Size() == 1) { 34193 break 34194 } 34195 v.reset(OpS390XMOVBstore) 34196 v.AddArg(ptr) 34197 v.AddArg(val) 34198 v.AddArg(mem) 34199 return true 34200 } 34201 return false 34202 } 34203 func rewriteValueS390X_OpSub16(v *Value) bool { 34204 // match: (Sub16 x y) 34205 // cond: 34206 // result: (SUBW x y) 34207 for { 34208 x := v.Args[0] 34209 y := v.Args[1] 34210 v.reset(OpS390XSUBW) 34211 v.AddArg(x) 34212 v.AddArg(y) 34213 return true 34214 } 34215 } 34216 func rewriteValueS390X_OpSub32(v *Value) bool { 34217 // match: (Sub32 x y) 34218 // cond: 34219 // result: (SUBW x y) 34220 for { 34221 x := v.Args[0] 34222 y := v.Args[1] 34223 v.reset(OpS390XSUBW) 34224 v.AddArg(x) 34225 v.AddArg(y) 34226 return true 34227 } 34228 } 34229 func rewriteValueS390X_OpSub32F(v *Value) bool { 34230 // match: (Sub32F x y) 34231 // cond: 34232 // result: (FSUBS x y) 34233 for { 34234 x := v.Args[0] 34235 y := v.Args[1] 34236 v.reset(OpS390XFSUBS) 34237 v.AddArg(x) 34238 v.AddArg(y) 34239 return true 34240 } 34241 } 34242 func rewriteValueS390X_OpSub64(v *Value) bool { 34243 // match: (Sub64 x y) 34244 // cond: 34245 // result: (SUB x y) 34246 for { 34247 x := v.Args[0] 34248 y := v.Args[1] 34249 v.reset(OpS390XSUB) 34250 v.AddArg(x) 34251 v.AddArg(y) 34252 return true 34253 } 34254 } 34255 func rewriteValueS390X_OpSub64F(v *Value) bool { 34256 // match: (Sub64F x y) 34257 // cond: 34258 // result: (FSUB x y) 34259 for { 34260 x := v.Args[0] 34261 y := v.Args[1] 34262 v.reset(OpS390XFSUB) 34263 v.AddArg(x) 34264 v.AddArg(y) 34265 return true 34266 } 34267 } 34268 func rewriteValueS390X_OpSub8(v *Value) bool { 34269 // match: (Sub8 x y) 34270 // cond: 34271 // result: (SUBW x y) 34272 for { 34273 x := v.Args[0] 34274 y := v.Args[1] 34275 v.reset(OpS390XSUBW) 34276 v.AddArg(x) 34277 v.AddArg(y) 34278 return true 34279 } 34280 } 34281 func rewriteValueS390X_OpSubPtr(v *Value) bool { 34282 // match: (SubPtr x y) 34283 // cond: 34284 // result: (SUB x y) 34285 for { 34286 x := v.Args[0] 34287 y := v.Args[1] 34288 v.reset(OpS390XSUB) 34289 v.AddArg(x) 34290 v.AddArg(y) 34291 return true 34292 } 34293 } 34294 func rewriteValueS390X_OpTrunc16to8(v *Value) bool { 34295 // match: (Trunc16to8 x) 34296 // cond: 34297 // result: x 34298 for { 34299 x := v.Args[0] 34300 v.reset(OpCopy) 34301 v.Type = x.Type 34302 v.AddArg(x) 34303 return true 34304 } 34305 } 34306 func rewriteValueS390X_OpTrunc32to16(v *Value) bool { 34307 // match: (Trunc32to16 x) 34308 // cond: 34309 // result: x 34310 for { 34311 x := v.Args[0] 34312 v.reset(OpCopy) 34313 v.Type = x.Type 34314 v.AddArg(x) 34315 return true 34316 } 34317 } 34318 func rewriteValueS390X_OpTrunc32to8(v *Value) bool { 34319 // match: (Trunc32to8 x) 34320 // cond: 34321 // result: x 34322 for { 34323 x := v.Args[0] 34324 v.reset(OpCopy) 34325 v.Type = x.Type 34326 v.AddArg(x) 34327 return true 34328 } 34329 } 34330 func rewriteValueS390X_OpTrunc64to16(v *Value) bool { 34331 // match: (Trunc64to16 x) 34332 // cond: 34333 // result: x 34334 for { 34335 x := v.Args[0] 34336 v.reset(OpCopy) 34337 v.Type = x.Type 34338 v.AddArg(x) 34339 return true 34340 } 34341 } 34342 func rewriteValueS390X_OpTrunc64to32(v *Value) bool { 34343 // match: (Trunc64to32 x) 34344 // cond: 34345 // result: x 34346 for { 34347 x := v.Args[0] 34348 v.reset(OpCopy) 34349 v.Type = x.Type 34350 v.AddArg(x) 34351 return true 34352 } 34353 } 34354 func rewriteValueS390X_OpTrunc64to8(v *Value) bool { 34355 // match: (Trunc64to8 x) 34356 // cond: 34357 // result: x 34358 for { 34359 x := v.Args[0] 34360 v.reset(OpCopy) 34361 v.Type = x.Type 34362 v.AddArg(x) 34363 return true 34364 } 34365 } 34366 func rewriteValueS390X_OpXor16(v *Value) bool { 34367 // match: (Xor16 x y) 34368 // cond: 34369 // result: (XORW x y) 34370 for { 34371 x := v.Args[0] 34372 y := v.Args[1] 34373 v.reset(OpS390XXORW) 34374 v.AddArg(x) 34375 v.AddArg(y) 34376 return true 34377 } 34378 } 34379 func rewriteValueS390X_OpXor32(v *Value) bool { 34380 // match: (Xor32 x y) 34381 // cond: 34382 // result: (XORW x y) 34383 for { 34384 x := v.Args[0] 34385 y := v.Args[1] 34386 v.reset(OpS390XXORW) 34387 v.AddArg(x) 34388 v.AddArg(y) 34389 return true 34390 } 34391 } 34392 func rewriteValueS390X_OpXor64(v *Value) bool { 34393 // match: (Xor64 x y) 34394 // cond: 34395 // result: (XOR x y) 34396 for { 34397 x := v.Args[0] 34398 y := v.Args[1] 34399 v.reset(OpS390XXOR) 34400 v.AddArg(x) 34401 v.AddArg(y) 34402 return true 34403 } 34404 } 34405 func rewriteValueS390X_OpXor8(v *Value) bool { 34406 // match: (Xor8 x y) 34407 // cond: 34408 // result: (XORW x y) 34409 for { 34410 x := v.Args[0] 34411 y := v.Args[1] 34412 v.reset(OpS390XXORW) 34413 v.AddArg(x) 34414 v.AddArg(y) 34415 return true 34416 } 34417 } 34418 func rewriteValueS390X_OpZero(v *Value) bool { 34419 b := v.Block 34420 _ = b 34421 // match: (Zero [0] _ mem) 34422 // cond: 34423 // result: mem 34424 for { 34425 if v.AuxInt != 0 { 34426 break 34427 } 34428 mem := v.Args[1] 34429 v.reset(OpCopy) 34430 v.Type = mem.Type 34431 v.AddArg(mem) 34432 return true 34433 } 34434 // match: (Zero [1] destptr mem) 34435 // cond: 34436 // result: (MOVBstoreconst [0] destptr mem) 34437 for { 34438 if v.AuxInt != 1 { 34439 break 34440 } 34441 destptr := v.Args[0] 34442 mem := v.Args[1] 34443 v.reset(OpS390XMOVBstoreconst) 34444 v.AuxInt = 0 34445 v.AddArg(destptr) 34446 v.AddArg(mem) 34447 return true 34448 } 34449 // match: (Zero [2] destptr mem) 34450 // cond: 34451 // result: (MOVHstoreconst [0] destptr mem) 34452 for { 34453 if v.AuxInt != 2 { 34454 break 34455 } 34456 destptr := v.Args[0] 34457 mem := v.Args[1] 34458 v.reset(OpS390XMOVHstoreconst) 34459 v.AuxInt = 0 34460 v.AddArg(destptr) 34461 v.AddArg(mem) 34462 return true 34463 } 34464 // match: (Zero [4] destptr mem) 34465 // cond: 34466 // result: (MOVWstoreconst [0] destptr mem) 34467 for { 34468 if v.AuxInt != 4 { 34469 break 34470 } 34471 destptr := v.Args[0] 34472 mem := v.Args[1] 34473 v.reset(OpS390XMOVWstoreconst) 34474 v.AuxInt = 0 34475 v.AddArg(destptr) 34476 v.AddArg(mem) 34477 return true 34478 } 34479 // match: (Zero [8] destptr mem) 34480 // cond: 34481 // result: (MOVDstoreconst [0] destptr mem) 34482 for { 34483 if v.AuxInt != 8 { 34484 break 34485 } 34486 destptr := v.Args[0] 34487 mem := v.Args[1] 34488 v.reset(OpS390XMOVDstoreconst) 34489 v.AuxInt = 0 34490 v.AddArg(destptr) 34491 v.AddArg(mem) 34492 return true 34493 } 34494 // match: (Zero [3] destptr mem) 34495 // cond: 34496 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 34497 for { 34498 if v.AuxInt != 3 { 34499 break 34500 } 34501 destptr := v.Args[0] 34502 mem := v.Args[1] 34503 v.reset(OpS390XMOVBstoreconst) 34504 v.AuxInt = makeValAndOff(0, 2) 34505 v.AddArg(destptr) 34506 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, TypeMem) 34507 v0.AuxInt = 0 34508 v0.AddArg(destptr) 34509 v0.AddArg(mem) 34510 v.AddArg(v0) 34511 return true 34512 } 34513 // match: (Zero [5] destptr mem) 34514 // cond: 34515 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 34516 for { 34517 if v.AuxInt != 5 { 34518 break 34519 } 34520 destptr := v.Args[0] 34521 mem := v.Args[1] 34522 v.reset(OpS390XMOVBstoreconst) 34523 v.AuxInt = makeValAndOff(0, 4) 34524 v.AddArg(destptr) 34525 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, TypeMem) 34526 v0.AuxInt = 0 34527 v0.AddArg(destptr) 34528 v0.AddArg(mem) 34529 v.AddArg(v0) 34530 return true 34531 } 34532 // match: (Zero [6] destptr mem) 34533 // cond: 34534 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 34535 for { 34536 if v.AuxInt != 6 { 34537 break 34538 } 34539 destptr := v.Args[0] 34540 mem := v.Args[1] 34541 v.reset(OpS390XMOVHstoreconst) 34542 v.AuxInt = makeValAndOff(0, 4) 34543 v.AddArg(destptr) 34544 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, TypeMem) 34545 v0.AuxInt = 0 34546 v0.AddArg(destptr) 34547 v0.AddArg(mem) 34548 v.AddArg(v0) 34549 return true 34550 } 34551 // match: (Zero [7] destptr mem) 34552 // cond: 34553 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 34554 for { 34555 if v.AuxInt != 7 { 34556 break 34557 } 34558 destptr := v.Args[0] 34559 mem := v.Args[1] 34560 v.reset(OpS390XMOVWstoreconst) 34561 v.AuxInt = makeValAndOff(0, 3) 34562 v.AddArg(destptr) 34563 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, TypeMem) 34564 v0.AuxInt = 0 34565 v0.AddArg(destptr) 34566 v0.AddArg(mem) 34567 v.AddArg(v0) 34568 return true 34569 } 34570 // match: (Zero [s] destptr mem) 34571 // cond: s > 0 && s <= 1024 34572 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 34573 for { 34574 s := v.AuxInt 34575 destptr := v.Args[0] 34576 mem := v.Args[1] 34577 if !(s > 0 && s <= 1024) { 34578 break 34579 } 34580 v.reset(OpS390XCLEAR) 34581 v.AuxInt = makeValAndOff(s, 0) 34582 v.AddArg(destptr) 34583 v.AddArg(mem) 34584 return true 34585 } 34586 // match: (Zero [s] destptr mem) 34587 // cond: s > 1024 34588 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 34589 for { 34590 s := v.AuxInt 34591 destptr := v.Args[0] 34592 mem := v.Args[1] 34593 if !(s > 1024) { 34594 break 34595 } 34596 v.reset(OpS390XLoweredZero) 34597 v.AuxInt = s % 256 34598 v.AddArg(destptr) 34599 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 34600 v0.AuxInt = (s / 256) * 256 34601 v0.AddArg(destptr) 34602 v.AddArg(v0) 34603 v.AddArg(mem) 34604 return true 34605 } 34606 return false 34607 } 34608 func rewriteValueS390X_OpZeroExt16to32(v *Value) bool { 34609 // match: (ZeroExt16to32 x) 34610 // cond: 34611 // result: (MOVHZreg x) 34612 for { 34613 x := v.Args[0] 34614 v.reset(OpS390XMOVHZreg) 34615 v.AddArg(x) 34616 return true 34617 } 34618 } 34619 func rewriteValueS390X_OpZeroExt16to64(v *Value) bool { 34620 // match: (ZeroExt16to64 x) 34621 // cond: 34622 // result: (MOVHZreg x) 34623 for { 34624 x := v.Args[0] 34625 v.reset(OpS390XMOVHZreg) 34626 v.AddArg(x) 34627 return true 34628 } 34629 } 34630 func rewriteValueS390X_OpZeroExt32to64(v *Value) bool { 34631 // match: (ZeroExt32to64 x) 34632 // cond: 34633 // result: (MOVWZreg x) 34634 for { 34635 x := v.Args[0] 34636 v.reset(OpS390XMOVWZreg) 34637 v.AddArg(x) 34638 return true 34639 } 34640 } 34641 func rewriteValueS390X_OpZeroExt8to16(v *Value) bool { 34642 // match: (ZeroExt8to16 x) 34643 // cond: 34644 // result: (MOVBZreg x) 34645 for { 34646 x := v.Args[0] 34647 v.reset(OpS390XMOVBZreg) 34648 v.AddArg(x) 34649 return true 34650 } 34651 } 34652 func rewriteValueS390X_OpZeroExt8to32(v *Value) bool { 34653 // match: (ZeroExt8to32 x) 34654 // cond: 34655 // result: (MOVBZreg x) 34656 for { 34657 x := v.Args[0] 34658 v.reset(OpS390XMOVBZreg) 34659 v.AddArg(x) 34660 return true 34661 } 34662 } 34663 func rewriteValueS390X_OpZeroExt8to64(v *Value) bool { 34664 // match: (ZeroExt8to64 x) 34665 // cond: 34666 // result: (MOVBZreg x) 34667 for { 34668 x := v.Args[0] 34669 v.reset(OpS390XMOVBZreg) 34670 v.AddArg(x) 34671 return true 34672 } 34673 } 34674 func rewriteBlockS390X(b *Block) bool { 34675 config := b.Func.Config 34676 _ = config 34677 fe := b.Func.fe 34678 _ = fe 34679 types := &config.Types 34680 _ = types 34681 switch b.Kind { 34682 case BlockS390XEQ: 34683 // match: (EQ (InvertFlags cmp) yes no) 34684 // cond: 34685 // result: (EQ cmp yes no) 34686 for { 34687 v := b.Control 34688 if v.Op != OpS390XInvertFlags { 34689 break 34690 } 34691 cmp := v.Args[0] 34692 yes := b.Succs[0] 34693 no := b.Succs[1] 34694 b.Kind = BlockS390XEQ 34695 b.SetControl(cmp) 34696 _ = yes 34697 _ = no 34698 return true 34699 } 34700 // match: (EQ (FlagEQ) yes no) 34701 // cond: 34702 // result: (First nil yes no) 34703 for { 34704 v := b.Control 34705 if v.Op != OpS390XFlagEQ { 34706 break 34707 } 34708 yes := b.Succs[0] 34709 no := b.Succs[1] 34710 b.Kind = BlockFirst 34711 b.SetControl(nil) 34712 _ = yes 34713 _ = no 34714 return true 34715 } 34716 // match: (EQ (FlagLT) yes no) 34717 // cond: 34718 // result: (First nil no yes) 34719 for { 34720 v := b.Control 34721 if v.Op != OpS390XFlagLT { 34722 break 34723 } 34724 yes := b.Succs[0] 34725 no := b.Succs[1] 34726 b.Kind = BlockFirst 34727 b.SetControl(nil) 34728 b.swapSuccessors() 34729 _ = no 34730 _ = yes 34731 return true 34732 } 34733 // match: (EQ (FlagGT) yes no) 34734 // cond: 34735 // result: (First nil no yes) 34736 for { 34737 v := b.Control 34738 if v.Op != OpS390XFlagGT { 34739 break 34740 } 34741 yes := b.Succs[0] 34742 no := b.Succs[1] 34743 b.Kind = BlockFirst 34744 b.SetControl(nil) 34745 b.swapSuccessors() 34746 _ = no 34747 _ = yes 34748 return true 34749 } 34750 case BlockS390XGE: 34751 // match: (GE (InvertFlags cmp) yes no) 34752 // cond: 34753 // result: (LE cmp yes no) 34754 for { 34755 v := b.Control 34756 if v.Op != OpS390XInvertFlags { 34757 break 34758 } 34759 cmp := v.Args[0] 34760 yes := b.Succs[0] 34761 no := b.Succs[1] 34762 b.Kind = BlockS390XLE 34763 b.SetControl(cmp) 34764 _ = yes 34765 _ = no 34766 return true 34767 } 34768 // match: (GE (FlagEQ) yes no) 34769 // cond: 34770 // result: (First nil yes no) 34771 for { 34772 v := b.Control 34773 if v.Op != OpS390XFlagEQ { 34774 break 34775 } 34776 yes := b.Succs[0] 34777 no := b.Succs[1] 34778 b.Kind = BlockFirst 34779 b.SetControl(nil) 34780 _ = yes 34781 _ = no 34782 return true 34783 } 34784 // match: (GE (FlagLT) yes no) 34785 // cond: 34786 // result: (First nil no yes) 34787 for { 34788 v := b.Control 34789 if v.Op != OpS390XFlagLT { 34790 break 34791 } 34792 yes := b.Succs[0] 34793 no := b.Succs[1] 34794 b.Kind = BlockFirst 34795 b.SetControl(nil) 34796 b.swapSuccessors() 34797 _ = no 34798 _ = yes 34799 return true 34800 } 34801 // match: (GE (FlagGT) yes no) 34802 // cond: 34803 // result: (First nil yes no) 34804 for { 34805 v := b.Control 34806 if v.Op != OpS390XFlagGT { 34807 break 34808 } 34809 yes := b.Succs[0] 34810 no := b.Succs[1] 34811 b.Kind = BlockFirst 34812 b.SetControl(nil) 34813 _ = yes 34814 _ = no 34815 return true 34816 } 34817 case BlockS390XGT: 34818 // match: (GT (InvertFlags cmp) yes no) 34819 // cond: 34820 // result: (LT cmp yes no) 34821 for { 34822 v := b.Control 34823 if v.Op != OpS390XInvertFlags { 34824 break 34825 } 34826 cmp := v.Args[0] 34827 yes := b.Succs[0] 34828 no := b.Succs[1] 34829 b.Kind = BlockS390XLT 34830 b.SetControl(cmp) 34831 _ = yes 34832 _ = no 34833 return true 34834 } 34835 // match: (GT (FlagEQ) yes no) 34836 // cond: 34837 // result: (First nil no yes) 34838 for { 34839 v := b.Control 34840 if v.Op != OpS390XFlagEQ { 34841 break 34842 } 34843 yes := b.Succs[0] 34844 no := b.Succs[1] 34845 b.Kind = BlockFirst 34846 b.SetControl(nil) 34847 b.swapSuccessors() 34848 _ = no 34849 _ = yes 34850 return true 34851 } 34852 // match: (GT (FlagLT) yes no) 34853 // cond: 34854 // result: (First nil no yes) 34855 for { 34856 v := b.Control 34857 if v.Op != OpS390XFlagLT { 34858 break 34859 } 34860 yes := b.Succs[0] 34861 no := b.Succs[1] 34862 b.Kind = BlockFirst 34863 b.SetControl(nil) 34864 b.swapSuccessors() 34865 _ = no 34866 _ = yes 34867 return true 34868 } 34869 // match: (GT (FlagGT) yes no) 34870 // cond: 34871 // result: (First nil yes no) 34872 for { 34873 v := b.Control 34874 if v.Op != OpS390XFlagGT { 34875 break 34876 } 34877 yes := b.Succs[0] 34878 no := b.Succs[1] 34879 b.Kind = BlockFirst 34880 b.SetControl(nil) 34881 _ = yes 34882 _ = no 34883 return true 34884 } 34885 case BlockIf: 34886 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 34887 // cond: 34888 // result: (LT cmp yes no) 34889 for { 34890 v := b.Control 34891 if v.Op != OpS390XMOVDLT { 34892 break 34893 } 34894 v_0 := v.Args[0] 34895 if v_0.Op != OpS390XMOVDconst { 34896 break 34897 } 34898 if v_0.AuxInt != 0 { 34899 break 34900 } 34901 v_1 := v.Args[1] 34902 if v_1.Op != OpS390XMOVDconst { 34903 break 34904 } 34905 if v_1.AuxInt != 1 { 34906 break 34907 } 34908 cmp := v.Args[2] 34909 yes := b.Succs[0] 34910 no := b.Succs[1] 34911 b.Kind = BlockS390XLT 34912 b.SetControl(cmp) 34913 _ = yes 34914 _ = no 34915 return true 34916 } 34917 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 34918 // cond: 34919 // result: (LE cmp yes no) 34920 for { 34921 v := b.Control 34922 if v.Op != OpS390XMOVDLE { 34923 break 34924 } 34925 v_0 := v.Args[0] 34926 if v_0.Op != OpS390XMOVDconst { 34927 break 34928 } 34929 if v_0.AuxInt != 0 { 34930 break 34931 } 34932 v_1 := v.Args[1] 34933 if v_1.Op != OpS390XMOVDconst { 34934 break 34935 } 34936 if v_1.AuxInt != 1 { 34937 break 34938 } 34939 cmp := v.Args[2] 34940 yes := b.Succs[0] 34941 no := b.Succs[1] 34942 b.Kind = BlockS390XLE 34943 b.SetControl(cmp) 34944 _ = yes 34945 _ = no 34946 return true 34947 } 34948 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 34949 // cond: 34950 // result: (GT cmp yes no) 34951 for { 34952 v := b.Control 34953 if v.Op != OpS390XMOVDGT { 34954 break 34955 } 34956 v_0 := v.Args[0] 34957 if v_0.Op != OpS390XMOVDconst { 34958 break 34959 } 34960 if v_0.AuxInt != 0 { 34961 break 34962 } 34963 v_1 := v.Args[1] 34964 if v_1.Op != OpS390XMOVDconst { 34965 break 34966 } 34967 if v_1.AuxInt != 1 { 34968 break 34969 } 34970 cmp := v.Args[2] 34971 yes := b.Succs[0] 34972 no := b.Succs[1] 34973 b.Kind = BlockS390XGT 34974 b.SetControl(cmp) 34975 _ = yes 34976 _ = no 34977 return true 34978 } 34979 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 34980 // cond: 34981 // result: (GE cmp yes no) 34982 for { 34983 v := b.Control 34984 if v.Op != OpS390XMOVDGE { 34985 break 34986 } 34987 v_0 := v.Args[0] 34988 if v_0.Op != OpS390XMOVDconst { 34989 break 34990 } 34991 if v_0.AuxInt != 0 { 34992 break 34993 } 34994 v_1 := v.Args[1] 34995 if v_1.Op != OpS390XMOVDconst { 34996 break 34997 } 34998 if v_1.AuxInt != 1 { 34999 break 35000 } 35001 cmp := v.Args[2] 35002 yes := b.Succs[0] 35003 no := b.Succs[1] 35004 b.Kind = BlockS390XGE 35005 b.SetControl(cmp) 35006 _ = yes 35007 _ = no 35008 return true 35009 } 35010 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35011 // cond: 35012 // result: (EQ cmp yes no) 35013 for { 35014 v := b.Control 35015 if v.Op != OpS390XMOVDEQ { 35016 break 35017 } 35018 v_0 := v.Args[0] 35019 if v_0.Op != OpS390XMOVDconst { 35020 break 35021 } 35022 if v_0.AuxInt != 0 { 35023 break 35024 } 35025 v_1 := v.Args[1] 35026 if v_1.Op != OpS390XMOVDconst { 35027 break 35028 } 35029 if v_1.AuxInt != 1 { 35030 break 35031 } 35032 cmp := v.Args[2] 35033 yes := b.Succs[0] 35034 no := b.Succs[1] 35035 b.Kind = BlockS390XEQ 35036 b.SetControl(cmp) 35037 _ = yes 35038 _ = no 35039 return true 35040 } 35041 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35042 // cond: 35043 // result: (NE cmp yes no) 35044 for { 35045 v := b.Control 35046 if v.Op != OpS390XMOVDNE { 35047 break 35048 } 35049 v_0 := v.Args[0] 35050 if v_0.Op != OpS390XMOVDconst { 35051 break 35052 } 35053 if v_0.AuxInt != 0 { 35054 break 35055 } 35056 v_1 := v.Args[1] 35057 if v_1.Op != OpS390XMOVDconst { 35058 break 35059 } 35060 if v_1.AuxInt != 1 { 35061 break 35062 } 35063 cmp := v.Args[2] 35064 yes := b.Succs[0] 35065 no := b.Succs[1] 35066 b.Kind = BlockS390XNE 35067 b.SetControl(cmp) 35068 _ = yes 35069 _ = no 35070 return true 35071 } 35072 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35073 // cond: 35074 // result: (GTF cmp yes no) 35075 for { 35076 v := b.Control 35077 if v.Op != OpS390XMOVDGTnoinv { 35078 break 35079 } 35080 v_0 := v.Args[0] 35081 if v_0.Op != OpS390XMOVDconst { 35082 break 35083 } 35084 if v_0.AuxInt != 0 { 35085 break 35086 } 35087 v_1 := v.Args[1] 35088 if v_1.Op != OpS390XMOVDconst { 35089 break 35090 } 35091 if v_1.AuxInt != 1 { 35092 break 35093 } 35094 cmp := v.Args[2] 35095 yes := b.Succs[0] 35096 no := b.Succs[1] 35097 b.Kind = BlockS390XGTF 35098 b.SetControl(cmp) 35099 _ = yes 35100 _ = no 35101 return true 35102 } 35103 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35104 // cond: 35105 // result: (GEF cmp yes no) 35106 for { 35107 v := b.Control 35108 if v.Op != OpS390XMOVDGEnoinv { 35109 break 35110 } 35111 v_0 := v.Args[0] 35112 if v_0.Op != OpS390XMOVDconst { 35113 break 35114 } 35115 if v_0.AuxInt != 0 { 35116 break 35117 } 35118 v_1 := v.Args[1] 35119 if v_1.Op != OpS390XMOVDconst { 35120 break 35121 } 35122 if v_1.AuxInt != 1 { 35123 break 35124 } 35125 cmp := v.Args[2] 35126 yes := b.Succs[0] 35127 no := b.Succs[1] 35128 b.Kind = BlockS390XGEF 35129 b.SetControl(cmp) 35130 _ = yes 35131 _ = no 35132 return true 35133 } 35134 // match: (If cond yes no) 35135 // cond: 35136 // result: (NE (CMPWconst [0] (MOVBZreg <types.Bool> cond)) yes no) 35137 for { 35138 v := b.Control 35139 _ = v 35140 cond := b.Control 35141 yes := b.Succs[0] 35142 no := b.Succs[1] 35143 b.Kind = BlockS390XNE 35144 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, TypeFlags) 35145 v0.AuxInt = 0 35146 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.Bool) 35147 v1.AddArg(cond) 35148 v0.AddArg(v1) 35149 b.SetControl(v0) 35150 _ = yes 35151 _ = no 35152 return true 35153 } 35154 case BlockS390XLE: 35155 // match: (LE (InvertFlags cmp) yes no) 35156 // cond: 35157 // result: (GE cmp yes no) 35158 for { 35159 v := b.Control 35160 if v.Op != OpS390XInvertFlags { 35161 break 35162 } 35163 cmp := v.Args[0] 35164 yes := b.Succs[0] 35165 no := b.Succs[1] 35166 b.Kind = BlockS390XGE 35167 b.SetControl(cmp) 35168 _ = yes 35169 _ = no 35170 return true 35171 } 35172 // match: (LE (FlagEQ) yes no) 35173 // cond: 35174 // result: (First nil yes no) 35175 for { 35176 v := b.Control 35177 if v.Op != OpS390XFlagEQ { 35178 break 35179 } 35180 yes := b.Succs[0] 35181 no := b.Succs[1] 35182 b.Kind = BlockFirst 35183 b.SetControl(nil) 35184 _ = yes 35185 _ = no 35186 return true 35187 } 35188 // match: (LE (FlagLT) yes no) 35189 // cond: 35190 // result: (First nil yes no) 35191 for { 35192 v := b.Control 35193 if v.Op != OpS390XFlagLT { 35194 break 35195 } 35196 yes := b.Succs[0] 35197 no := b.Succs[1] 35198 b.Kind = BlockFirst 35199 b.SetControl(nil) 35200 _ = yes 35201 _ = no 35202 return true 35203 } 35204 // match: (LE (FlagGT) yes no) 35205 // cond: 35206 // result: (First nil no yes) 35207 for { 35208 v := b.Control 35209 if v.Op != OpS390XFlagGT { 35210 break 35211 } 35212 yes := b.Succs[0] 35213 no := b.Succs[1] 35214 b.Kind = BlockFirst 35215 b.SetControl(nil) 35216 b.swapSuccessors() 35217 _ = no 35218 _ = yes 35219 return true 35220 } 35221 case BlockS390XLT: 35222 // match: (LT (InvertFlags cmp) yes no) 35223 // cond: 35224 // result: (GT cmp yes no) 35225 for { 35226 v := b.Control 35227 if v.Op != OpS390XInvertFlags { 35228 break 35229 } 35230 cmp := v.Args[0] 35231 yes := b.Succs[0] 35232 no := b.Succs[1] 35233 b.Kind = BlockS390XGT 35234 b.SetControl(cmp) 35235 _ = yes 35236 _ = no 35237 return true 35238 } 35239 // match: (LT (FlagEQ) yes no) 35240 // cond: 35241 // result: (First nil no yes) 35242 for { 35243 v := b.Control 35244 if v.Op != OpS390XFlagEQ { 35245 break 35246 } 35247 yes := b.Succs[0] 35248 no := b.Succs[1] 35249 b.Kind = BlockFirst 35250 b.SetControl(nil) 35251 b.swapSuccessors() 35252 _ = no 35253 _ = yes 35254 return true 35255 } 35256 // match: (LT (FlagLT) yes no) 35257 // cond: 35258 // result: (First nil yes no) 35259 for { 35260 v := b.Control 35261 if v.Op != OpS390XFlagLT { 35262 break 35263 } 35264 yes := b.Succs[0] 35265 no := b.Succs[1] 35266 b.Kind = BlockFirst 35267 b.SetControl(nil) 35268 _ = yes 35269 _ = no 35270 return true 35271 } 35272 // match: (LT (FlagGT) yes no) 35273 // cond: 35274 // result: (First nil no yes) 35275 for { 35276 v := b.Control 35277 if v.Op != OpS390XFlagGT { 35278 break 35279 } 35280 yes := b.Succs[0] 35281 no := b.Succs[1] 35282 b.Kind = BlockFirst 35283 b.SetControl(nil) 35284 b.swapSuccessors() 35285 _ = no 35286 _ = yes 35287 return true 35288 } 35289 case BlockS390XNE: 35290 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35291 // cond: 35292 // result: (LT cmp yes no) 35293 for { 35294 v := b.Control 35295 if v.Op != OpS390XCMPWconst { 35296 break 35297 } 35298 if v.AuxInt != 0 { 35299 break 35300 } 35301 v_0 := v.Args[0] 35302 if v_0.Op != OpS390XMOVDLT { 35303 break 35304 } 35305 v_0_0 := v_0.Args[0] 35306 if v_0_0.Op != OpS390XMOVDconst { 35307 break 35308 } 35309 if v_0_0.AuxInt != 0 { 35310 break 35311 } 35312 v_0_1 := v_0.Args[1] 35313 if v_0_1.Op != OpS390XMOVDconst { 35314 break 35315 } 35316 if v_0_1.AuxInt != 1 { 35317 break 35318 } 35319 cmp := v_0.Args[2] 35320 yes := b.Succs[0] 35321 no := b.Succs[1] 35322 b.Kind = BlockS390XLT 35323 b.SetControl(cmp) 35324 _ = yes 35325 _ = no 35326 return true 35327 } 35328 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35329 // cond: 35330 // result: (LE cmp yes no) 35331 for { 35332 v := b.Control 35333 if v.Op != OpS390XCMPWconst { 35334 break 35335 } 35336 if v.AuxInt != 0 { 35337 break 35338 } 35339 v_0 := v.Args[0] 35340 if v_0.Op != OpS390XMOVDLE { 35341 break 35342 } 35343 v_0_0 := v_0.Args[0] 35344 if v_0_0.Op != OpS390XMOVDconst { 35345 break 35346 } 35347 if v_0_0.AuxInt != 0 { 35348 break 35349 } 35350 v_0_1 := v_0.Args[1] 35351 if v_0_1.Op != OpS390XMOVDconst { 35352 break 35353 } 35354 if v_0_1.AuxInt != 1 { 35355 break 35356 } 35357 cmp := v_0.Args[2] 35358 yes := b.Succs[0] 35359 no := b.Succs[1] 35360 b.Kind = BlockS390XLE 35361 b.SetControl(cmp) 35362 _ = yes 35363 _ = no 35364 return true 35365 } 35366 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35367 // cond: 35368 // result: (GT cmp yes no) 35369 for { 35370 v := b.Control 35371 if v.Op != OpS390XCMPWconst { 35372 break 35373 } 35374 if v.AuxInt != 0 { 35375 break 35376 } 35377 v_0 := v.Args[0] 35378 if v_0.Op != OpS390XMOVDGT { 35379 break 35380 } 35381 v_0_0 := v_0.Args[0] 35382 if v_0_0.Op != OpS390XMOVDconst { 35383 break 35384 } 35385 if v_0_0.AuxInt != 0 { 35386 break 35387 } 35388 v_0_1 := v_0.Args[1] 35389 if v_0_1.Op != OpS390XMOVDconst { 35390 break 35391 } 35392 if v_0_1.AuxInt != 1 { 35393 break 35394 } 35395 cmp := v_0.Args[2] 35396 yes := b.Succs[0] 35397 no := b.Succs[1] 35398 b.Kind = BlockS390XGT 35399 b.SetControl(cmp) 35400 _ = yes 35401 _ = no 35402 return true 35403 } 35404 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35405 // cond: 35406 // result: (GE cmp yes no) 35407 for { 35408 v := b.Control 35409 if v.Op != OpS390XCMPWconst { 35410 break 35411 } 35412 if v.AuxInt != 0 { 35413 break 35414 } 35415 v_0 := v.Args[0] 35416 if v_0.Op != OpS390XMOVDGE { 35417 break 35418 } 35419 v_0_0 := v_0.Args[0] 35420 if v_0_0.Op != OpS390XMOVDconst { 35421 break 35422 } 35423 if v_0_0.AuxInt != 0 { 35424 break 35425 } 35426 v_0_1 := v_0.Args[1] 35427 if v_0_1.Op != OpS390XMOVDconst { 35428 break 35429 } 35430 if v_0_1.AuxInt != 1 { 35431 break 35432 } 35433 cmp := v_0.Args[2] 35434 yes := b.Succs[0] 35435 no := b.Succs[1] 35436 b.Kind = BlockS390XGE 35437 b.SetControl(cmp) 35438 _ = yes 35439 _ = no 35440 return true 35441 } 35442 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35443 // cond: 35444 // result: (EQ cmp yes no) 35445 for { 35446 v := b.Control 35447 if v.Op != OpS390XCMPWconst { 35448 break 35449 } 35450 if v.AuxInt != 0 { 35451 break 35452 } 35453 v_0 := v.Args[0] 35454 if v_0.Op != OpS390XMOVDEQ { 35455 break 35456 } 35457 v_0_0 := v_0.Args[0] 35458 if v_0_0.Op != OpS390XMOVDconst { 35459 break 35460 } 35461 if v_0_0.AuxInt != 0 { 35462 break 35463 } 35464 v_0_1 := v_0.Args[1] 35465 if v_0_1.Op != OpS390XMOVDconst { 35466 break 35467 } 35468 if v_0_1.AuxInt != 1 { 35469 break 35470 } 35471 cmp := v_0.Args[2] 35472 yes := b.Succs[0] 35473 no := b.Succs[1] 35474 b.Kind = BlockS390XEQ 35475 b.SetControl(cmp) 35476 _ = yes 35477 _ = no 35478 return true 35479 } 35480 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35481 // cond: 35482 // result: (NE cmp yes no) 35483 for { 35484 v := b.Control 35485 if v.Op != OpS390XCMPWconst { 35486 break 35487 } 35488 if v.AuxInt != 0 { 35489 break 35490 } 35491 v_0 := v.Args[0] 35492 if v_0.Op != OpS390XMOVDNE { 35493 break 35494 } 35495 v_0_0 := v_0.Args[0] 35496 if v_0_0.Op != OpS390XMOVDconst { 35497 break 35498 } 35499 if v_0_0.AuxInt != 0 { 35500 break 35501 } 35502 v_0_1 := v_0.Args[1] 35503 if v_0_1.Op != OpS390XMOVDconst { 35504 break 35505 } 35506 if v_0_1.AuxInt != 1 { 35507 break 35508 } 35509 cmp := v_0.Args[2] 35510 yes := b.Succs[0] 35511 no := b.Succs[1] 35512 b.Kind = BlockS390XNE 35513 b.SetControl(cmp) 35514 _ = yes 35515 _ = no 35516 return true 35517 } 35518 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35519 // cond: 35520 // result: (GTF cmp yes no) 35521 for { 35522 v := b.Control 35523 if v.Op != OpS390XCMPWconst { 35524 break 35525 } 35526 if v.AuxInt != 0 { 35527 break 35528 } 35529 v_0 := v.Args[0] 35530 if v_0.Op != OpS390XMOVDGTnoinv { 35531 break 35532 } 35533 v_0_0 := v_0.Args[0] 35534 if v_0_0.Op != OpS390XMOVDconst { 35535 break 35536 } 35537 if v_0_0.AuxInt != 0 { 35538 break 35539 } 35540 v_0_1 := v_0.Args[1] 35541 if v_0_1.Op != OpS390XMOVDconst { 35542 break 35543 } 35544 if v_0_1.AuxInt != 1 { 35545 break 35546 } 35547 cmp := v_0.Args[2] 35548 yes := b.Succs[0] 35549 no := b.Succs[1] 35550 b.Kind = BlockS390XGTF 35551 b.SetControl(cmp) 35552 _ = yes 35553 _ = no 35554 return true 35555 } 35556 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35557 // cond: 35558 // result: (GEF cmp yes no) 35559 for { 35560 v := b.Control 35561 if v.Op != OpS390XCMPWconst { 35562 break 35563 } 35564 if v.AuxInt != 0 { 35565 break 35566 } 35567 v_0 := v.Args[0] 35568 if v_0.Op != OpS390XMOVDGEnoinv { 35569 break 35570 } 35571 v_0_0 := v_0.Args[0] 35572 if v_0_0.Op != OpS390XMOVDconst { 35573 break 35574 } 35575 if v_0_0.AuxInt != 0 { 35576 break 35577 } 35578 v_0_1 := v_0.Args[1] 35579 if v_0_1.Op != OpS390XMOVDconst { 35580 break 35581 } 35582 if v_0_1.AuxInt != 1 { 35583 break 35584 } 35585 cmp := v_0.Args[2] 35586 yes := b.Succs[0] 35587 no := b.Succs[1] 35588 b.Kind = BlockS390XGEF 35589 b.SetControl(cmp) 35590 _ = yes 35591 _ = no 35592 return true 35593 } 35594 // match: (NE (InvertFlags cmp) yes no) 35595 // cond: 35596 // result: (NE cmp yes no) 35597 for { 35598 v := b.Control 35599 if v.Op != OpS390XInvertFlags { 35600 break 35601 } 35602 cmp := v.Args[0] 35603 yes := b.Succs[0] 35604 no := b.Succs[1] 35605 b.Kind = BlockS390XNE 35606 b.SetControl(cmp) 35607 _ = yes 35608 _ = no 35609 return true 35610 } 35611 // match: (NE (FlagEQ) yes no) 35612 // cond: 35613 // result: (First nil no yes) 35614 for { 35615 v := b.Control 35616 if v.Op != OpS390XFlagEQ { 35617 break 35618 } 35619 yes := b.Succs[0] 35620 no := b.Succs[1] 35621 b.Kind = BlockFirst 35622 b.SetControl(nil) 35623 b.swapSuccessors() 35624 _ = no 35625 _ = yes 35626 return true 35627 } 35628 // match: (NE (FlagLT) yes no) 35629 // cond: 35630 // result: (First nil yes no) 35631 for { 35632 v := b.Control 35633 if v.Op != OpS390XFlagLT { 35634 break 35635 } 35636 yes := b.Succs[0] 35637 no := b.Succs[1] 35638 b.Kind = BlockFirst 35639 b.SetControl(nil) 35640 _ = yes 35641 _ = no 35642 return true 35643 } 35644 // match: (NE (FlagGT) yes no) 35645 // cond: 35646 // result: (First nil yes no) 35647 for { 35648 v := b.Control 35649 if v.Op != OpS390XFlagGT { 35650 break 35651 } 35652 yes := b.Succs[0] 35653 no := b.Succs[1] 35654 b.Kind = BlockFirst 35655 b.SetControl(nil) 35656 _ = yes 35657 _ = no 35658 return true 35659 } 35660 } 35661 return false 35662 }