Home | History | Annotate | Download | only in ssa
      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 import "cmd/internal/objabi"
      9 import "cmd/compile/internal/types"
     10 
     11 var _ = math.MinInt8  // in case not otherwise used
     12 var _ = obj.ANOP      // in case not otherwise used
     13 var _ = objabi.GOROOT // in case not otherwise used
     14 var _ = types.TypeMem // in case not otherwise used
     15 
     16 func rewriteValueS390X(v *Value) bool {
     17 	switch v.Op {
     18 	case OpAdd16:
     19 		return rewriteValueS390X_OpAdd16_0(v)
     20 	case OpAdd32:
     21 		return rewriteValueS390X_OpAdd32_0(v)
     22 	case OpAdd32F:
     23 		return rewriteValueS390X_OpAdd32F_0(v)
     24 	case OpAdd64:
     25 		return rewriteValueS390X_OpAdd64_0(v)
     26 	case OpAdd64F:
     27 		return rewriteValueS390X_OpAdd64F_0(v)
     28 	case OpAdd8:
     29 		return rewriteValueS390X_OpAdd8_0(v)
     30 	case OpAddPtr:
     31 		return rewriteValueS390X_OpAddPtr_0(v)
     32 	case OpAddr:
     33 		return rewriteValueS390X_OpAddr_0(v)
     34 	case OpAnd16:
     35 		return rewriteValueS390X_OpAnd16_0(v)
     36 	case OpAnd32:
     37 		return rewriteValueS390X_OpAnd32_0(v)
     38 	case OpAnd64:
     39 		return rewriteValueS390X_OpAnd64_0(v)
     40 	case OpAnd8:
     41 		return rewriteValueS390X_OpAnd8_0(v)
     42 	case OpAndB:
     43 		return rewriteValueS390X_OpAndB_0(v)
     44 	case OpAtomicAdd32:
     45 		return rewriteValueS390X_OpAtomicAdd32_0(v)
     46 	case OpAtomicAdd64:
     47 		return rewriteValueS390X_OpAtomicAdd64_0(v)
     48 	case OpAtomicCompareAndSwap32:
     49 		return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v)
     50 	case OpAtomicCompareAndSwap64:
     51 		return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v)
     52 	case OpAtomicExchange32:
     53 		return rewriteValueS390X_OpAtomicExchange32_0(v)
     54 	case OpAtomicExchange64:
     55 		return rewriteValueS390X_OpAtomicExchange64_0(v)
     56 	case OpAtomicLoad32:
     57 		return rewriteValueS390X_OpAtomicLoad32_0(v)
     58 	case OpAtomicLoad64:
     59 		return rewriteValueS390X_OpAtomicLoad64_0(v)
     60 	case OpAtomicLoadPtr:
     61 		return rewriteValueS390X_OpAtomicLoadPtr_0(v)
     62 	case OpAtomicStore32:
     63 		return rewriteValueS390X_OpAtomicStore32_0(v)
     64 	case OpAtomicStore64:
     65 		return rewriteValueS390X_OpAtomicStore64_0(v)
     66 	case OpAtomicStorePtrNoWB:
     67 		return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v)
     68 	case OpAvg64u:
     69 		return rewriteValueS390X_OpAvg64u_0(v)
     70 	case OpBitLen64:
     71 		return rewriteValueS390X_OpBitLen64_0(v)
     72 	case OpBswap32:
     73 		return rewriteValueS390X_OpBswap32_0(v)
     74 	case OpBswap64:
     75 		return rewriteValueS390X_OpBswap64_0(v)
     76 	case OpCeil:
     77 		return rewriteValueS390X_OpCeil_0(v)
     78 	case OpClosureCall:
     79 		return rewriteValueS390X_OpClosureCall_0(v)
     80 	case OpCom16:
     81 		return rewriteValueS390X_OpCom16_0(v)
     82 	case OpCom32:
     83 		return rewriteValueS390X_OpCom32_0(v)
     84 	case OpCom64:
     85 		return rewriteValueS390X_OpCom64_0(v)
     86 	case OpCom8:
     87 		return rewriteValueS390X_OpCom8_0(v)
     88 	case OpConst16:
     89 		return rewriteValueS390X_OpConst16_0(v)
     90 	case OpConst32:
     91 		return rewriteValueS390X_OpConst32_0(v)
     92 	case OpConst32F:
     93 		return rewriteValueS390X_OpConst32F_0(v)
     94 	case OpConst64:
     95 		return rewriteValueS390X_OpConst64_0(v)
     96 	case OpConst64F:
     97 		return rewriteValueS390X_OpConst64F_0(v)
     98 	case OpConst8:
     99 		return rewriteValueS390X_OpConst8_0(v)
    100 	case OpConstBool:
    101 		return rewriteValueS390X_OpConstBool_0(v)
    102 	case OpConstNil:
    103 		return rewriteValueS390X_OpConstNil_0(v)
    104 	case OpConvert:
    105 		return rewriteValueS390X_OpConvert_0(v)
    106 	case OpCtz32:
    107 		return rewriteValueS390X_OpCtz32_0(v)
    108 	case OpCtz64:
    109 		return rewriteValueS390X_OpCtz64_0(v)
    110 	case OpCvt32Fto32:
    111 		return rewriteValueS390X_OpCvt32Fto32_0(v)
    112 	case OpCvt32Fto64:
    113 		return rewriteValueS390X_OpCvt32Fto64_0(v)
    114 	case OpCvt32Fto64F:
    115 		return rewriteValueS390X_OpCvt32Fto64F_0(v)
    116 	case OpCvt32to32F:
    117 		return rewriteValueS390X_OpCvt32to32F_0(v)
    118 	case OpCvt32to64F:
    119 		return rewriteValueS390X_OpCvt32to64F_0(v)
    120 	case OpCvt64Fto32:
    121 		return rewriteValueS390X_OpCvt64Fto32_0(v)
    122 	case OpCvt64Fto32F:
    123 		return rewriteValueS390X_OpCvt64Fto32F_0(v)
    124 	case OpCvt64Fto64:
    125 		return rewriteValueS390X_OpCvt64Fto64_0(v)
    126 	case OpCvt64to32F:
    127 		return rewriteValueS390X_OpCvt64to32F_0(v)
    128 	case OpCvt64to64F:
    129 		return rewriteValueS390X_OpCvt64to64F_0(v)
    130 	case OpDiv16:
    131 		return rewriteValueS390X_OpDiv16_0(v)
    132 	case OpDiv16u:
    133 		return rewriteValueS390X_OpDiv16u_0(v)
    134 	case OpDiv32:
    135 		return rewriteValueS390X_OpDiv32_0(v)
    136 	case OpDiv32F:
    137 		return rewriteValueS390X_OpDiv32F_0(v)
    138 	case OpDiv32u:
    139 		return rewriteValueS390X_OpDiv32u_0(v)
    140 	case OpDiv64:
    141 		return rewriteValueS390X_OpDiv64_0(v)
    142 	case OpDiv64F:
    143 		return rewriteValueS390X_OpDiv64F_0(v)
    144 	case OpDiv64u:
    145 		return rewriteValueS390X_OpDiv64u_0(v)
    146 	case OpDiv8:
    147 		return rewriteValueS390X_OpDiv8_0(v)
    148 	case OpDiv8u:
    149 		return rewriteValueS390X_OpDiv8u_0(v)
    150 	case OpEq16:
    151 		return rewriteValueS390X_OpEq16_0(v)
    152 	case OpEq32:
    153 		return rewriteValueS390X_OpEq32_0(v)
    154 	case OpEq32F:
    155 		return rewriteValueS390X_OpEq32F_0(v)
    156 	case OpEq64:
    157 		return rewriteValueS390X_OpEq64_0(v)
    158 	case OpEq64F:
    159 		return rewriteValueS390X_OpEq64F_0(v)
    160 	case OpEq8:
    161 		return rewriteValueS390X_OpEq8_0(v)
    162 	case OpEqB:
    163 		return rewriteValueS390X_OpEqB_0(v)
    164 	case OpEqPtr:
    165 		return rewriteValueS390X_OpEqPtr_0(v)
    166 	case OpFloor:
    167 		return rewriteValueS390X_OpFloor_0(v)
    168 	case OpGeq16:
    169 		return rewriteValueS390X_OpGeq16_0(v)
    170 	case OpGeq16U:
    171 		return rewriteValueS390X_OpGeq16U_0(v)
    172 	case OpGeq32:
    173 		return rewriteValueS390X_OpGeq32_0(v)
    174 	case OpGeq32F:
    175 		return rewriteValueS390X_OpGeq32F_0(v)
    176 	case OpGeq32U:
    177 		return rewriteValueS390X_OpGeq32U_0(v)
    178 	case OpGeq64:
    179 		return rewriteValueS390X_OpGeq64_0(v)
    180 	case OpGeq64F:
    181 		return rewriteValueS390X_OpGeq64F_0(v)
    182 	case OpGeq64U:
    183 		return rewriteValueS390X_OpGeq64U_0(v)
    184 	case OpGeq8:
    185 		return rewriteValueS390X_OpGeq8_0(v)
    186 	case OpGeq8U:
    187 		return rewriteValueS390X_OpGeq8U_0(v)
    188 	case OpGetCallerSP:
    189 		return rewriteValueS390X_OpGetCallerSP_0(v)
    190 	case OpGetClosurePtr:
    191 		return rewriteValueS390X_OpGetClosurePtr_0(v)
    192 	case OpGetG:
    193 		return rewriteValueS390X_OpGetG_0(v)
    194 	case OpGreater16:
    195 		return rewriteValueS390X_OpGreater16_0(v)
    196 	case OpGreater16U:
    197 		return rewriteValueS390X_OpGreater16U_0(v)
    198 	case OpGreater32:
    199 		return rewriteValueS390X_OpGreater32_0(v)
    200 	case OpGreater32F:
    201 		return rewriteValueS390X_OpGreater32F_0(v)
    202 	case OpGreater32U:
    203 		return rewriteValueS390X_OpGreater32U_0(v)
    204 	case OpGreater64:
    205 		return rewriteValueS390X_OpGreater64_0(v)
    206 	case OpGreater64F:
    207 		return rewriteValueS390X_OpGreater64F_0(v)
    208 	case OpGreater64U:
    209 		return rewriteValueS390X_OpGreater64U_0(v)
    210 	case OpGreater8:
    211 		return rewriteValueS390X_OpGreater8_0(v)
    212 	case OpGreater8U:
    213 		return rewriteValueS390X_OpGreater8U_0(v)
    214 	case OpHmul32:
    215 		return rewriteValueS390X_OpHmul32_0(v)
    216 	case OpHmul32u:
    217 		return rewriteValueS390X_OpHmul32u_0(v)
    218 	case OpHmul64:
    219 		return rewriteValueS390X_OpHmul64_0(v)
    220 	case OpHmul64u:
    221 		return rewriteValueS390X_OpHmul64u_0(v)
    222 	case OpITab:
    223 		return rewriteValueS390X_OpITab_0(v)
    224 	case OpInterCall:
    225 		return rewriteValueS390X_OpInterCall_0(v)
    226 	case OpIsInBounds:
    227 		return rewriteValueS390X_OpIsInBounds_0(v)
    228 	case OpIsNonNil:
    229 		return rewriteValueS390X_OpIsNonNil_0(v)
    230 	case OpIsSliceInBounds:
    231 		return rewriteValueS390X_OpIsSliceInBounds_0(v)
    232 	case OpLeq16:
    233 		return rewriteValueS390X_OpLeq16_0(v)
    234 	case OpLeq16U:
    235 		return rewriteValueS390X_OpLeq16U_0(v)
    236 	case OpLeq32:
    237 		return rewriteValueS390X_OpLeq32_0(v)
    238 	case OpLeq32F:
    239 		return rewriteValueS390X_OpLeq32F_0(v)
    240 	case OpLeq32U:
    241 		return rewriteValueS390X_OpLeq32U_0(v)
    242 	case OpLeq64:
    243 		return rewriteValueS390X_OpLeq64_0(v)
    244 	case OpLeq64F:
    245 		return rewriteValueS390X_OpLeq64F_0(v)
    246 	case OpLeq64U:
    247 		return rewriteValueS390X_OpLeq64U_0(v)
    248 	case OpLeq8:
    249 		return rewriteValueS390X_OpLeq8_0(v)
    250 	case OpLeq8U:
    251 		return rewriteValueS390X_OpLeq8U_0(v)
    252 	case OpLess16:
    253 		return rewriteValueS390X_OpLess16_0(v)
    254 	case OpLess16U:
    255 		return rewriteValueS390X_OpLess16U_0(v)
    256 	case OpLess32:
    257 		return rewriteValueS390X_OpLess32_0(v)
    258 	case OpLess32F:
    259 		return rewriteValueS390X_OpLess32F_0(v)
    260 	case OpLess32U:
    261 		return rewriteValueS390X_OpLess32U_0(v)
    262 	case OpLess64:
    263 		return rewriteValueS390X_OpLess64_0(v)
    264 	case OpLess64F:
    265 		return rewriteValueS390X_OpLess64F_0(v)
    266 	case OpLess64U:
    267 		return rewriteValueS390X_OpLess64U_0(v)
    268 	case OpLess8:
    269 		return rewriteValueS390X_OpLess8_0(v)
    270 	case OpLess8U:
    271 		return rewriteValueS390X_OpLess8U_0(v)
    272 	case OpLoad:
    273 		return rewriteValueS390X_OpLoad_0(v)
    274 	case OpLsh16x16:
    275 		return rewriteValueS390X_OpLsh16x16_0(v)
    276 	case OpLsh16x32:
    277 		return rewriteValueS390X_OpLsh16x32_0(v)
    278 	case OpLsh16x64:
    279 		return rewriteValueS390X_OpLsh16x64_0(v)
    280 	case OpLsh16x8:
    281 		return rewriteValueS390X_OpLsh16x8_0(v)
    282 	case OpLsh32x16:
    283 		return rewriteValueS390X_OpLsh32x16_0(v)
    284 	case OpLsh32x32:
    285 		return rewriteValueS390X_OpLsh32x32_0(v)
    286 	case OpLsh32x64:
    287 		return rewriteValueS390X_OpLsh32x64_0(v)
    288 	case OpLsh32x8:
    289 		return rewriteValueS390X_OpLsh32x8_0(v)
    290 	case OpLsh64x16:
    291 		return rewriteValueS390X_OpLsh64x16_0(v)
    292 	case OpLsh64x32:
    293 		return rewriteValueS390X_OpLsh64x32_0(v)
    294 	case OpLsh64x64:
    295 		return rewriteValueS390X_OpLsh64x64_0(v)
    296 	case OpLsh64x8:
    297 		return rewriteValueS390X_OpLsh64x8_0(v)
    298 	case OpLsh8x16:
    299 		return rewriteValueS390X_OpLsh8x16_0(v)
    300 	case OpLsh8x32:
    301 		return rewriteValueS390X_OpLsh8x32_0(v)
    302 	case OpLsh8x64:
    303 		return rewriteValueS390X_OpLsh8x64_0(v)
    304 	case OpLsh8x8:
    305 		return rewriteValueS390X_OpLsh8x8_0(v)
    306 	case OpMod16:
    307 		return rewriteValueS390X_OpMod16_0(v)
    308 	case OpMod16u:
    309 		return rewriteValueS390X_OpMod16u_0(v)
    310 	case OpMod32:
    311 		return rewriteValueS390X_OpMod32_0(v)
    312 	case OpMod32u:
    313 		return rewriteValueS390X_OpMod32u_0(v)
    314 	case OpMod64:
    315 		return rewriteValueS390X_OpMod64_0(v)
    316 	case OpMod64u:
    317 		return rewriteValueS390X_OpMod64u_0(v)
    318 	case OpMod8:
    319 		return rewriteValueS390X_OpMod8_0(v)
    320 	case OpMod8u:
    321 		return rewriteValueS390X_OpMod8u_0(v)
    322 	case OpMove:
    323 		return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v)
    324 	case OpMul16:
    325 		return rewriteValueS390X_OpMul16_0(v)
    326 	case OpMul32:
    327 		return rewriteValueS390X_OpMul32_0(v)
    328 	case OpMul32F:
    329 		return rewriteValueS390X_OpMul32F_0(v)
    330 	case OpMul64:
    331 		return rewriteValueS390X_OpMul64_0(v)
    332 	case OpMul64F:
    333 		return rewriteValueS390X_OpMul64F_0(v)
    334 	case OpMul8:
    335 		return rewriteValueS390X_OpMul8_0(v)
    336 	case OpNeg16:
    337 		return rewriteValueS390X_OpNeg16_0(v)
    338 	case OpNeg32:
    339 		return rewriteValueS390X_OpNeg32_0(v)
    340 	case OpNeg32F:
    341 		return rewriteValueS390X_OpNeg32F_0(v)
    342 	case OpNeg64:
    343 		return rewriteValueS390X_OpNeg64_0(v)
    344 	case OpNeg64F:
    345 		return rewriteValueS390X_OpNeg64F_0(v)
    346 	case OpNeg8:
    347 		return rewriteValueS390X_OpNeg8_0(v)
    348 	case OpNeq16:
    349 		return rewriteValueS390X_OpNeq16_0(v)
    350 	case OpNeq32:
    351 		return rewriteValueS390X_OpNeq32_0(v)
    352 	case OpNeq32F:
    353 		return rewriteValueS390X_OpNeq32F_0(v)
    354 	case OpNeq64:
    355 		return rewriteValueS390X_OpNeq64_0(v)
    356 	case OpNeq64F:
    357 		return rewriteValueS390X_OpNeq64F_0(v)
    358 	case OpNeq8:
    359 		return rewriteValueS390X_OpNeq8_0(v)
    360 	case OpNeqB:
    361 		return rewriteValueS390X_OpNeqB_0(v)
    362 	case OpNeqPtr:
    363 		return rewriteValueS390X_OpNeqPtr_0(v)
    364 	case OpNilCheck:
    365 		return rewriteValueS390X_OpNilCheck_0(v)
    366 	case OpNot:
    367 		return rewriteValueS390X_OpNot_0(v)
    368 	case OpOffPtr:
    369 		return rewriteValueS390X_OpOffPtr_0(v)
    370 	case OpOr16:
    371 		return rewriteValueS390X_OpOr16_0(v)
    372 	case OpOr32:
    373 		return rewriteValueS390X_OpOr32_0(v)
    374 	case OpOr64:
    375 		return rewriteValueS390X_OpOr64_0(v)
    376 	case OpOr8:
    377 		return rewriteValueS390X_OpOr8_0(v)
    378 	case OpOrB:
    379 		return rewriteValueS390X_OpOrB_0(v)
    380 	case OpRound:
    381 		return rewriteValueS390X_OpRound_0(v)
    382 	case OpRound32F:
    383 		return rewriteValueS390X_OpRound32F_0(v)
    384 	case OpRound64F:
    385 		return rewriteValueS390X_OpRound64F_0(v)
    386 	case OpRoundToEven:
    387 		return rewriteValueS390X_OpRoundToEven_0(v)
    388 	case OpRsh16Ux16:
    389 		return rewriteValueS390X_OpRsh16Ux16_0(v)
    390 	case OpRsh16Ux32:
    391 		return rewriteValueS390X_OpRsh16Ux32_0(v)
    392 	case OpRsh16Ux64:
    393 		return rewriteValueS390X_OpRsh16Ux64_0(v)
    394 	case OpRsh16Ux8:
    395 		return rewriteValueS390X_OpRsh16Ux8_0(v)
    396 	case OpRsh16x16:
    397 		return rewriteValueS390X_OpRsh16x16_0(v)
    398 	case OpRsh16x32:
    399 		return rewriteValueS390X_OpRsh16x32_0(v)
    400 	case OpRsh16x64:
    401 		return rewriteValueS390X_OpRsh16x64_0(v)
    402 	case OpRsh16x8:
    403 		return rewriteValueS390X_OpRsh16x8_0(v)
    404 	case OpRsh32Ux16:
    405 		return rewriteValueS390X_OpRsh32Ux16_0(v)
    406 	case OpRsh32Ux32:
    407 		return rewriteValueS390X_OpRsh32Ux32_0(v)
    408 	case OpRsh32Ux64:
    409 		return rewriteValueS390X_OpRsh32Ux64_0(v)
    410 	case OpRsh32Ux8:
    411 		return rewriteValueS390X_OpRsh32Ux8_0(v)
    412 	case OpRsh32x16:
    413 		return rewriteValueS390X_OpRsh32x16_0(v)
    414 	case OpRsh32x32:
    415 		return rewriteValueS390X_OpRsh32x32_0(v)
    416 	case OpRsh32x64:
    417 		return rewriteValueS390X_OpRsh32x64_0(v)
    418 	case OpRsh32x8:
    419 		return rewriteValueS390X_OpRsh32x8_0(v)
    420 	case OpRsh64Ux16:
    421 		return rewriteValueS390X_OpRsh64Ux16_0(v)
    422 	case OpRsh64Ux32:
    423 		return rewriteValueS390X_OpRsh64Ux32_0(v)
    424 	case OpRsh64Ux64:
    425 		return rewriteValueS390X_OpRsh64Ux64_0(v)
    426 	case OpRsh64Ux8:
    427 		return rewriteValueS390X_OpRsh64Ux8_0(v)
    428 	case OpRsh64x16:
    429 		return rewriteValueS390X_OpRsh64x16_0(v)
    430 	case OpRsh64x32:
    431 		return rewriteValueS390X_OpRsh64x32_0(v)
    432 	case OpRsh64x64:
    433 		return rewriteValueS390X_OpRsh64x64_0(v)
    434 	case OpRsh64x8:
    435 		return rewriteValueS390X_OpRsh64x8_0(v)
    436 	case OpRsh8Ux16:
    437 		return rewriteValueS390X_OpRsh8Ux16_0(v)
    438 	case OpRsh8Ux32:
    439 		return rewriteValueS390X_OpRsh8Ux32_0(v)
    440 	case OpRsh8Ux64:
    441 		return rewriteValueS390X_OpRsh8Ux64_0(v)
    442 	case OpRsh8Ux8:
    443 		return rewriteValueS390X_OpRsh8Ux8_0(v)
    444 	case OpRsh8x16:
    445 		return rewriteValueS390X_OpRsh8x16_0(v)
    446 	case OpRsh8x32:
    447 		return rewriteValueS390X_OpRsh8x32_0(v)
    448 	case OpRsh8x64:
    449 		return rewriteValueS390X_OpRsh8x64_0(v)
    450 	case OpRsh8x8:
    451 		return rewriteValueS390X_OpRsh8x8_0(v)
    452 	case OpS390XADD:
    453 		return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v)
    454 	case OpS390XADDW:
    455 		return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v)
    456 	case OpS390XADDWconst:
    457 		return rewriteValueS390X_OpS390XADDWconst_0(v)
    458 	case OpS390XADDWload:
    459 		return rewriteValueS390X_OpS390XADDWload_0(v)
    460 	case OpS390XADDconst:
    461 		return rewriteValueS390X_OpS390XADDconst_0(v)
    462 	case OpS390XADDload:
    463 		return rewriteValueS390X_OpS390XADDload_0(v)
    464 	case OpS390XAND:
    465 		return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v)
    466 	case OpS390XANDW:
    467 		return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v)
    468 	case OpS390XANDWconst:
    469 		return rewriteValueS390X_OpS390XANDWconst_0(v)
    470 	case OpS390XANDWload:
    471 		return rewriteValueS390X_OpS390XANDWload_0(v)
    472 	case OpS390XANDconst:
    473 		return rewriteValueS390X_OpS390XANDconst_0(v)
    474 	case OpS390XANDload:
    475 		return rewriteValueS390X_OpS390XANDload_0(v)
    476 	case OpS390XCMP:
    477 		return rewriteValueS390X_OpS390XCMP_0(v)
    478 	case OpS390XCMPU:
    479 		return rewriteValueS390X_OpS390XCMPU_0(v)
    480 	case OpS390XCMPUconst:
    481 		return rewriteValueS390X_OpS390XCMPUconst_0(v)
    482 	case OpS390XCMPW:
    483 		return rewriteValueS390X_OpS390XCMPW_0(v)
    484 	case OpS390XCMPWU:
    485 		return rewriteValueS390X_OpS390XCMPWU_0(v)
    486 	case OpS390XCMPWUconst:
    487 		return rewriteValueS390X_OpS390XCMPWUconst_0(v)
    488 	case OpS390XCMPWconst:
    489 		return rewriteValueS390X_OpS390XCMPWconst_0(v)
    490 	case OpS390XCMPconst:
    491 		return rewriteValueS390X_OpS390XCMPconst_0(v)
    492 	case OpS390XCPSDR:
    493 		return rewriteValueS390X_OpS390XCPSDR_0(v)
    494 	case OpS390XFADD:
    495 		return rewriteValueS390X_OpS390XFADD_0(v)
    496 	case OpS390XFADDS:
    497 		return rewriteValueS390X_OpS390XFADDS_0(v)
    498 	case OpS390XFMOVDload:
    499 		return rewriteValueS390X_OpS390XFMOVDload_0(v)
    500 	case OpS390XFMOVDloadidx:
    501 		return rewriteValueS390X_OpS390XFMOVDloadidx_0(v)
    502 	case OpS390XFMOVDstore:
    503 		return rewriteValueS390X_OpS390XFMOVDstore_0(v)
    504 	case OpS390XFMOVDstoreidx:
    505 		return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v)
    506 	case OpS390XFMOVSload:
    507 		return rewriteValueS390X_OpS390XFMOVSload_0(v)
    508 	case OpS390XFMOVSloadidx:
    509 		return rewriteValueS390X_OpS390XFMOVSloadidx_0(v)
    510 	case OpS390XFMOVSstore:
    511 		return rewriteValueS390X_OpS390XFMOVSstore_0(v)
    512 	case OpS390XFMOVSstoreidx:
    513 		return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v)
    514 	case OpS390XFNEG:
    515 		return rewriteValueS390X_OpS390XFNEG_0(v)
    516 	case OpS390XFNEGS:
    517 		return rewriteValueS390X_OpS390XFNEGS_0(v)
    518 	case OpS390XFSUB:
    519 		return rewriteValueS390X_OpS390XFSUB_0(v)
    520 	case OpS390XFSUBS:
    521 		return rewriteValueS390X_OpS390XFSUBS_0(v)
    522 	case OpS390XLDGR:
    523 		return rewriteValueS390X_OpS390XLDGR_0(v)
    524 	case OpS390XLEDBR:
    525 		return rewriteValueS390X_OpS390XLEDBR_0(v)
    526 	case OpS390XLGDR:
    527 		return rewriteValueS390X_OpS390XLGDR_0(v)
    528 	case OpS390XLoweredRound32F:
    529 		return rewriteValueS390X_OpS390XLoweredRound32F_0(v)
    530 	case OpS390XLoweredRound64F:
    531 		return rewriteValueS390X_OpS390XLoweredRound64F_0(v)
    532 	case OpS390XMOVBZload:
    533 		return rewriteValueS390X_OpS390XMOVBZload_0(v)
    534 	case OpS390XMOVBZloadidx:
    535 		return rewriteValueS390X_OpS390XMOVBZloadidx_0(v)
    536 	case OpS390XMOVBZreg:
    537 		return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v)
    538 	case OpS390XMOVBload:
    539 		return rewriteValueS390X_OpS390XMOVBload_0(v)
    540 	case OpS390XMOVBloadidx:
    541 		return rewriteValueS390X_OpS390XMOVBloadidx_0(v)
    542 	case OpS390XMOVBreg:
    543 		return rewriteValueS390X_OpS390XMOVBreg_0(v)
    544 	case OpS390XMOVBstore:
    545 		return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v)
    546 	case OpS390XMOVBstoreconst:
    547 		return rewriteValueS390X_OpS390XMOVBstoreconst_0(v)
    548 	case OpS390XMOVBstoreidx:
    549 		return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v)
    550 	case OpS390XMOVDEQ:
    551 		return rewriteValueS390X_OpS390XMOVDEQ_0(v)
    552 	case OpS390XMOVDGE:
    553 		return rewriteValueS390X_OpS390XMOVDGE_0(v)
    554 	case OpS390XMOVDGT:
    555 		return rewriteValueS390X_OpS390XMOVDGT_0(v)
    556 	case OpS390XMOVDLE:
    557 		return rewriteValueS390X_OpS390XMOVDLE_0(v)
    558 	case OpS390XMOVDLT:
    559 		return rewriteValueS390X_OpS390XMOVDLT_0(v)
    560 	case OpS390XMOVDNE:
    561 		return rewriteValueS390X_OpS390XMOVDNE_0(v)
    562 	case OpS390XMOVDaddridx:
    563 		return rewriteValueS390X_OpS390XMOVDaddridx_0(v)
    564 	case OpS390XMOVDload:
    565 		return rewriteValueS390X_OpS390XMOVDload_0(v)
    566 	case OpS390XMOVDloadidx:
    567 		return rewriteValueS390X_OpS390XMOVDloadidx_0(v)
    568 	case OpS390XMOVDnop:
    569 		return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v)
    570 	case OpS390XMOVDreg:
    571 		return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v)
    572 	case OpS390XMOVDstore:
    573 		return rewriteValueS390X_OpS390XMOVDstore_0(v)
    574 	case OpS390XMOVDstoreconst:
    575 		return rewriteValueS390X_OpS390XMOVDstoreconst_0(v)
    576 	case OpS390XMOVDstoreidx:
    577 		return rewriteValueS390X_OpS390XMOVDstoreidx_0(v)
    578 	case OpS390XMOVHBRstore:
    579 		return rewriteValueS390X_OpS390XMOVHBRstore_0(v)
    580 	case OpS390XMOVHBRstoreidx:
    581 		return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v)
    582 	case OpS390XMOVHZload:
    583 		return rewriteValueS390X_OpS390XMOVHZload_0(v)
    584 	case OpS390XMOVHZloadidx:
    585 		return rewriteValueS390X_OpS390XMOVHZloadidx_0(v)
    586 	case OpS390XMOVHZreg:
    587 		return rewriteValueS390X_OpS390XMOVHZreg_0(v)
    588 	case OpS390XMOVHload:
    589 		return rewriteValueS390X_OpS390XMOVHload_0(v)
    590 	case OpS390XMOVHloadidx:
    591 		return rewriteValueS390X_OpS390XMOVHloadidx_0(v)
    592 	case OpS390XMOVHreg:
    593 		return rewriteValueS390X_OpS390XMOVHreg_0(v) || rewriteValueS390X_OpS390XMOVHreg_10(v)
    594 	case OpS390XMOVHstore:
    595 		return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v)
    596 	case OpS390XMOVHstoreconst:
    597 		return rewriteValueS390X_OpS390XMOVHstoreconst_0(v)
    598 	case OpS390XMOVHstoreidx:
    599 		return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v)
    600 	case OpS390XMOVWBRstore:
    601 		return rewriteValueS390X_OpS390XMOVWBRstore_0(v)
    602 	case OpS390XMOVWBRstoreidx:
    603 		return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v)
    604 	case OpS390XMOVWZload:
    605 		return rewriteValueS390X_OpS390XMOVWZload_0(v)
    606 	case OpS390XMOVWZloadidx:
    607 		return rewriteValueS390X_OpS390XMOVWZloadidx_0(v)
    608 	case OpS390XMOVWZreg:
    609 		return rewriteValueS390X_OpS390XMOVWZreg_0(v) || rewriteValueS390X_OpS390XMOVWZreg_10(v)
    610 	case OpS390XMOVWload:
    611 		return rewriteValueS390X_OpS390XMOVWload_0(v)
    612 	case OpS390XMOVWloadidx:
    613 		return rewriteValueS390X_OpS390XMOVWloadidx_0(v)
    614 	case OpS390XMOVWreg:
    615 		return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v)
    616 	case OpS390XMOVWstore:
    617 		return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v)
    618 	case OpS390XMOVWstoreconst:
    619 		return rewriteValueS390X_OpS390XMOVWstoreconst_0(v)
    620 	case OpS390XMOVWstoreidx:
    621 		return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v)
    622 	case OpS390XMULLD:
    623 		return rewriteValueS390X_OpS390XMULLD_0(v)
    624 	case OpS390XMULLDconst:
    625 		return rewriteValueS390X_OpS390XMULLDconst_0(v)
    626 	case OpS390XMULLDload:
    627 		return rewriteValueS390X_OpS390XMULLDload_0(v)
    628 	case OpS390XMULLW:
    629 		return rewriteValueS390X_OpS390XMULLW_0(v)
    630 	case OpS390XMULLWconst:
    631 		return rewriteValueS390X_OpS390XMULLWconst_0(v)
    632 	case OpS390XMULLWload:
    633 		return rewriteValueS390X_OpS390XMULLWload_0(v)
    634 	case OpS390XNEG:
    635 		return rewriteValueS390X_OpS390XNEG_0(v)
    636 	case OpS390XNEGW:
    637 		return rewriteValueS390X_OpS390XNEGW_0(v)
    638 	case OpS390XNOT:
    639 		return rewriteValueS390X_OpS390XNOT_0(v)
    640 	case OpS390XNOTW:
    641 		return rewriteValueS390X_OpS390XNOTW_0(v)
    642 	case OpS390XOR:
    643 		return rewriteValueS390X_OpS390XOR_0(v) || rewriteValueS390X_OpS390XOR_10(v) || rewriteValueS390X_OpS390XOR_20(v) || rewriteValueS390X_OpS390XOR_30(v) || rewriteValueS390X_OpS390XOR_40(v) || rewriteValueS390X_OpS390XOR_50(v) || rewriteValueS390X_OpS390XOR_60(v) || rewriteValueS390X_OpS390XOR_70(v) || rewriteValueS390X_OpS390XOR_80(v) || rewriteValueS390X_OpS390XOR_90(v) || rewriteValueS390X_OpS390XOR_100(v) || rewriteValueS390X_OpS390XOR_110(v) || rewriteValueS390X_OpS390XOR_120(v) || rewriteValueS390X_OpS390XOR_130(v) || rewriteValueS390X_OpS390XOR_140(v) || rewriteValueS390X_OpS390XOR_150(v)
    644 	case OpS390XORW:
    645 		return rewriteValueS390X_OpS390XORW_0(v) || rewriteValueS390X_OpS390XORW_10(v) || rewriteValueS390X_OpS390XORW_20(v) || rewriteValueS390X_OpS390XORW_30(v) || rewriteValueS390X_OpS390XORW_40(v) || rewriteValueS390X_OpS390XORW_50(v) || rewriteValueS390X_OpS390XORW_60(v) || rewriteValueS390X_OpS390XORW_70(v) || rewriteValueS390X_OpS390XORW_80(v) || rewriteValueS390X_OpS390XORW_90(v)
    646 	case OpS390XORWconst:
    647 		return rewriteValueS390X_OpS390XORWconst_0(v)
    648 	case OpS390XORWload:
    649 		return rewriteValueS390X_OpS390XORWload_0(v)
    650 	case OpS390XORconst:
    651 		return rewriteValueS390X_OpS390XORconst_0(v)
    652 	case OpS390XORload:
    653 		return rewriteValueS390X_OpS390XORload_0(v)
    654 	case OpS390XSLD:
    655 		return rewriteValueS390X_OpS390XSLD_0(v)
    656 	case OpS390XSLW:
    657 		return rewriteValueS390X_OpS390XSLW_0(v)
    658 	case OpS390XSRAD:
    659 		return rewriteValueS390X_OpS390XSRAD_0(v)
    660 	case OpS390XSRADconst:
    661 		return rewriteValueS390X_OpS390XSRADconst_0(v)
    662 	case OpS390XSRAW:
    663 		return rewriteValueS390X_OpS390XSRAW_0(v)
    664 	case OpS390XSRAWconst:
    665 		return rewriteValueS390X_OpS390XSRAWconst_0(v)
    666 	case OpS390XSRD:
    667 		return rewriteValueS390X_OpS390XSRD_0(v)
    668 	case OpS390XSRDconst:
    669 		return rewriteValueS390X_OpS390XSRDconst_0(v)
    670 	case OpS390XSRW:
    671 		return rewriteValueS390X_OpS390XSRW_0(v)
    672 	case OpS390XSTM2:
    673 		return rewriteValueS390X_OpS390XSTM2_0(v)
    674 	case OpS390XSTMG2:
    675 		return rewriteValueS390X_OpS390XSTMG2_0(v)
    676 	case OpS390XSUB:
    677 		return rewriteValueS390X_OpS390XSUB_0(v)
    678 	case OpS390XSUBEWcarrymask:
    679 		return rewriteValueS390X_OpS390XSUBEWcarrymask_0(v)
    680 	case OpS390XSUBEcarrymask:
    681 		return rewriteValueS390X_OpS390XSUBEcarrymask_0(v)
    682 	case OpS390XSUBW:
    683 		return rewriteValueS390X_OpS390XSUBW_0(v)
    684 	case OpS390XSUBWconst:
    685 		return rewriteValueS390X_OpS390XSUBWconst_0(v)
    686 	case OpS390XSUBWload:
    687 		return rewriteValueS390X_OpS390XSUBWload_0(v)
    688 	case OpS390XSUBconst:
    689 		return rewriteValueS390X_OpS390XSUBconst_0(v)
    690 	case OpS390XSUBload:
    691 		return rewriteValueS390X_OpS390XSUBload_0(v)
    692 	case OpS390XXOR:
    693 		return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v)
    694 	case OpS390XXORW:
    695 		return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v)
    696 	case OpS390XXORWconst:
    697 		return rewriteValueS390X_OpS390XXORWconst_0(v)
    698 	case OpS390XXORWload:
    699 		return rewriteValueS390X_OpS390XXORWload_0(v)
    700 	case OpS390XXORconst:
    701 		return rewriteValueS390X_OpS390XXORconst_0(v)
    702 	case OpS390XXORload:
    703 		return rewriteValueS390X_OpS390XXORload_0(v)
    704 	case OpSelect0:
    705 		return rewriteValueS390X_OpSelect0_0(v)
    706 	case OpSelect1:
    707 		return rewriteValueS390X_OpSelect1_0(v)
    708 	case OpSignExt16to32:
    709 		return rewriteValueS390X_OpSignExt16to32_0(v)
    710 	case OpSignExt16to64:
    711 		return rewriteValueS390X_OpSignExt16to64_0(v)
    712 	case OpSignExt32to64:
    713 		return rewriteValueS390X_OpSignExt32to64_0(v)
    714 	case OpSignExt8to16:
    715 		return rewriteValueS390X_OpSignExt8to16_0(v)
    716 	case OpSignExt8to32:
    717 		return rewriteValueS390X_OpSignExt8to32_0(v)
    718 	case OpSignExt8to64:
    719 		return rewriteValueS390X_OpSignExt8to64_0(v)
    720 	case OpSlicemask:
    721 		return rewriteValueS390X_OpSlicemask_0(v)
    722 	case OpSqrt:
    723 		return rewriteValueS390X_OpSqrt_0(v)
    724 	case OpStaticCall:
    725 		return rewriteValueS390X_OpStaticCall_0(v)
    726 	case OpStore:
    727 		return rewriteValueS390X_OpStore_0(v)
    728 	case OpSub16:
    729 		return rewriteValueS390X_OpSub16_0(v)
    730 	case OpSub32:
    731 		return rewriteValueS390X_OpSub32_0(v)
    732 	case OpSub32F:
    733 		return rewriteValueS390X_OpSub32F_0(v)
    734 	case OpSub64:
    735 		return rewriteValueS390X_OpSub64_0(v)
    736 	case OpSub64F:
    737 		return rewriteValueS390X_OpSub64F_0(v)
    738 	case OpSub8:
    739 		return rewriteValueS390X_OpSub8_0(v)
    740 	case OpSubPtr:
    741 		return rewriteValueS390X_OpSubPtr_0(v)
    742 	case OpTrunc:
    743 		return rewriteValueS390X_OpTrunc_0(v)
    744 	case OpTrunc16to8:
    745 		return rewriteValueS390X_OpTrunc16to8_0(v)
    746 	case OpTrunc32to16:
    747 		return rewriteValueS390X_OpTrunc32to16_0(v)
    748 	case OpTrunc32to8:
    749 		return rewriteValueS390X_OpTrunc32to8_0(v)
    750 	case OpTrunc64to16:
    751 		return rewriteValueS390X_OpTrunc64to16_0(v)
    752 	case OpTrunc64to32:
    753 		return rewriteValueS390X_OpTrunc64to32_0(v)
    754 	case OpTrunc64to8:
    755 		return rewriteValueS390X_OpTrunc64to8_0(v)
    756 	case OpXor16:
    757 		return rewriteValueS390X_OpXor16_0(v)
    758 	case OpXor32:
    759 		return rewriteValueS390X_OpXor32_0(v)
    760 	case OpXor64:
    761 		return rewriteValueS390X_OpXor64_0(v)
    762 	case OpXor8:
    763 		return rewriteValueS390X_OpXor8_0(v)
    764 	case OpZero:
    765 		return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v)
    766 	case OpZeroExt16to32:
    767 		return rewriteValueS390X_OpZeroExt16to32_0(v)
    768 	case OpZeroExt16to64:
    769 		return rewriteValueS390X_OpZeroExt16to64_0(v)
    770 	case OpZeroExt32to64:
    771 		return rewriteValueS390X_OpZeroExt32to64_0(v)
    772 	case OpZeroExt8to16:
    773 		return rewriteValueS390X_OpZeroExt8to16_0(v)
    774 	case OpZeroExt8to32:
    775 		return rewriteValueS390X_OpZeroExt8to32_0(v)
    776 	case OpZeroExt8to64:
    777 		return rewriteValueS390X_OpZeroExt8to64_0(v)
    778 	}
    779 	return false
    780 }
    781 func rewriteValueS390X_OpAdd16_0(v *Value) bool {
    782 	// match: (Add16 x y)
    783 	// cond:
    784 	// result: (ADDW  x y)
    785 	for {
    786 		_ = v.Args[1]
    787 		x := v.Args[0]
    788 		y := v.Args[1]
    789 		v.reset(OpS390XADDW)
    790 		v.AddArg(x)
    791 		v.AddArg(y)
    792 		return true
    793 	}
    794 }
    795 func rewriteValueS390X_OpAdd32_0(v *Value) bool {
    796 	// match: (Add32 x y)
    797 	// cond:
    798 	// result: (ADDW  x y)
    799 	for {
    800 		_ = v.Args[1]
    801 		x := v.Args[0]
    802 		y := v.Args[1]
    803 		v.reset(OpS390XADDW)
    804 		v.AddArg(x)
    805 		v.AddArg(y)
    806 		return true
    807 	}
    808 }
    809 func rewriteValueS390X_OpAdd32F_0(v *Value) bool {
    810 	// match: (Add32F x y)
    811 	// cond:
    812 	// result: (FADDS x y)
    813 	for {
    814 		_ = v.Args[1]
    815 		x := v.Args[0]
    816 		y := v.Args[1]
    817 		v.reset(OpS390XFADDS)
    818 		v.AddArg(x)
    819 		v.AddArg(y)
    820 		return true
    821 	}
    822 }
    823 func rewriteValueS390X_OpAdd64_0(v *Value) bool {
    824 	// match: (Add64 x y)
    825 	// cond:
    826 	// result: (ADD  x y)
    827 	for {
    828 		_ = v.Args[1]
    829 		x := v.Args[0]
    830 		y := v.Args[1]
    831 		v.reset(OpS390XADD)
    832 		v.AddArg(x)
    833 		v.AddArg(y)
    834 		return true
    835 	}
    836 }
    837 func rewriteValueS390X_OpAdd64F_0(v *Value) bool {
    838 	// match: (Add64F x y)
    839 	// cond:
    840 	// result: (FADD x y)
    841 	for {
    842 		_ = v.Args[1]
    843 		x := v.Args[0]
    844 		y := v.Args[1]
    845 		v.reset(OpS390XFADD)
    846 		v.AddArg(x)
    847 		v.AddArg(y)
    848 		return true
    849 	}
    850 }
    851 func rewriteValueS390X_OpAdd8_0(v *Value) bool {
    852 	// match: (Add8 x y)
    853 	// cond:
    854 	// result: (ADDW  x y)
    855 	for {
    856 		_ = v.Args[1]
    857 		x := v.Args[0]
    858 		y := v.Args[1]
    859 		v.reset(OpS390XADDW)
    860 		v.AddArg(x)
    861 		v.AddArg(y)
    862 		return true
    863 	}
    864 }
    865 func rewriteValueS390X_OpAddPtr_0(v *Value) bool {
    866 	// match: (AddPtr x y)
    867 	// cond:
    868 	// result: (ADD  x y)
    869 	for {
    870 		_ = v.Args[1]
    871 		x := v.Args[0]
    872 		y := v.Args[1]
    873 		v.reset(OpS390XADD)
    874 		v.AddArg(x)
    875 		v.AddArg(y)
    876 		return true
    877 	}
    878 }
    879 func rewriteValueS390X_OpAddr_0(v *Value) bool {
    880 	// match: (Addr {sym} base)
    881 	// cond:
    882 	// result: (MOVDaddr {sym} base)
    883 	for {
    884 		sym := v.Aux
    885 		base := v.Args[0]
    886 		v.reset(OpS390XMOVDaddr)
    887 		v.Aux = sym
    888 		v.AddArg(base)
    889 		return true
    890 	}
    891 }
    892 func rewriteValueS390X_OpAnd16_0(v *Value) bool {
    893 	// match: (And16 x y)
    894 	// cond:
    895 	// result: (ANDW x y)
    896 	for {
    897 		_ = v.Args[1]
    898 		x := v.Args[0]
    899 		y := v.Args[1]
    900 		v.reset(OpS390XANDW)
    901 		v.AddArg(x)
    902 		v.AddArg(y)
    903 		return true
    904 	}
    905 }
    906 func rewriteValueS390X_OpAnd32_0(v *Value) bool {
    907 	// match: (And32 x y)
    908 	// cond:
    909 	// result: (ANDW x y)
    910 	for {
    911 		_ = v.Args[1]
    912 		x := v.Args[0]
    913 		y := v.Args[1]
    914 		v.reset(OpS390XANDW)
    915 		v.AddArg(x)
    916 		v.AddArg(y)
    917 		return true
    918 	}
    919 }
    920 func rewriteValueS390X_OpAnd64_0(v *Value) bool {
    921 	// match: (And64 x y)
    922 	// cond:
    923 	// result: (AND x y)
    924 	for {
    925 		_ = v.Args[1]
    926 		x := v.Args[0]
    927 		y := v.Args[1]
    928 		v.reset(OpS390XAND)
    929 		v.AddArg(x)
    930 		v.AddArg(y)
    931 		return true
    932 	}
    933 }
    934 func rewriteValueS390X_OpAnd8_0(v *Value) bool {
    935 	// match: (And8 x y)
    936 	// cond:
    937 	// result: (ANDW x y)
    938 	for {
    939 		_ = v.Args[1]
    940 		x := v.Args[0]
    941 		y := v.Args[1]
    942 		v.reset(OpS390XANDW)
    943 		v.AddArg(x)
    944 		v.AddArg(y)
    945 		return true
    946 	}
    947 }
    948 func rewriteValueS390X_OpAndB_0(v *Value) bool {
    949 	// match: (AndB x y)
    950 	// cond:
    951 	// result: (ANDW x y)
    952 	for {
    953 		_ = v.Args[1]
    954 		x := v.Args[0]
    955 		y := v.Args[1]
    956 		v.reset(OpS390XANDW)
    957 		v.AddArg(x)
    958 		v.AddArg(y)
    959 		return true
    960 	}
    961 }
    962 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool {
    963 	b := v.Block
    964 	_ = b
    965 	typ := &b.Func.Config.Types
    966 	_ = typ
    967 	// match: (AtomicAdd32 ptr val mem)
    968 	// cond:
    969 	// result: (AddTupleFirst32 val (LAA ptr val mem))
    970 	for {
    971 		_ = v.Args[2]
    972 		ptr := v.Args[0]
    973 		val := v.Args[1]
    974 		mem := v.Args[2]
    975 		v.reset(OpS390XAddTupleFirst32)
    976 		v.AddArg(val)
    977 		v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem))
    978 		v0.AddArg(ptr)
    979 		v0.AddArg(val)
    980 		v0.AddArg(mem)
    981 		v.AddArg(v0)
    982 		return true
    983 	}
    984 }
    985 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool {
    986 	b := v.Block
    987 	_ = b
    988 	typ := &b.Func.Config.Types
    989 	_ = typ
    990 	// match: (AtomicAdd64 ptr val mem)
    991 	// cond:
    992 	// result: (AddTupleFirst64 val (LAAG ptr val mem))
    993 	for {
    994 		_ = v.Args[2]
    995 		ptr := v.Args[0]
    996 		val := v.Args[1]
    997 		mem := v.Args[2]
    998 		v.reset(OpS390XAddTupleFirst64)
    999 		v.AddArg(val)
   1000 		v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem))
   1001 		v0.AddArg(ptr)
   1002 		v0.AddArg(val)
   1003 		v0.AddArg(mem)
   1004 		v.AddArg(v0)
   1005 		return true
   1006 	}
   1007 }
   1008 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool {
   1009 	// match: (AtomicCompareAndSwap32 ptr old new_ mem)
   1010 	// cond:
   1011 	// result: (LoweredAtomicCas32 ptr old new_ mem)
   1012 	for {
   1013 		_ = v.Args[3]
   1014 		ptr := v.Args[0]
   1015 		old := v.Args[1]
   1016 		new_ := v.Args[2]
   1017 		mem := v.Args[3]
   1018 		v.reset(OpS390XLoweredAtomicCas32)
   1019 		v.AddArg(ptr)
   1020 		v.AddArg(old)
   1021 		v.AddArg(new_)
   1022 		v.AddArg(mem)
   1023 		return true
   1024 	}
   1025 }
   1026 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool {
   1027 	// match: (AtomicCompareAndSwap64 ptr old new_ mem)
   1028 	// cond:
   1029 	// result: (LoweredAtomicCas64 ptr old new_ mem)
   1030 	for {
   1031 		_ = v.Args[3]
   1032 		ptr := v.Args[0]
   1033 		old := v.Args[1]
   1034 		new_ := v.Args[2]
   1035 		mem := v.Args[3]
   1036 		v.reset(OpS390XLoweredAtomicCas64)
   1037 		v.AddArg(ptr)
   1038 		v.AddArg(old)
   1039 		v.AddArg(new_)
   1040 		v.AddArg(mem)
   1041 		return true
   1042 	}
   1043 }
   1044 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool {
   1045 	// match: (AtomicExchange32 ptr val mem)
   1046 	// cond:
   1047 	// result: (LoweredAtomicExchange32 ptr val mem)
   1048 	for {
   1049 		_ = v.Args[2]
   1050 		ptr := v.Args[0]
   1051 		val := v.Args[1]
   1052 		mem := v.Args[2]
   1053 		v.reset(OpS390XLoweredAtomicExchange32)
   1054 		v.AddArg(ptr)
   1055 		v.AddArg(val)
   1056 		v.AddArg(mem)
   1057 		return true
   1058 	}
   1059 }
   1060 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool {
   1061 	// match: (AtomicExchange64 ptr val mem)
   1062 	// cond:
   1063 	// result: (LoweredAtomicExchange64 ptr val mem)
   1064 	for {
   1065 		_ = v.Args[2]
   1066 		ptr := v.Args[0]
   1067 		val := v.Args[1]
   1068 		mem := v.Args[2]
   1069 		v.reset(OpS390XLoweredAtomicExchange64)
   1070 		v.AddArg(ptr)
   1071 		v.AddArg(val)
   1072 		v.AddArg(mem)
   1073 		return true
   1074 	}
   1075 }
   1076 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool {
   1077 	// match: (AtomicLoad32 ptr mem)
   1078 	// cond:
   1079 	// result: (MOVWZatomicload ptr mem)
   1080 	for {
   1081 		_ = v.Args[1]
   1082 		ptr := v.Args[0]
   1083 		mem := v.Args[1]
   1084 		v.reset(OpS390XMOVWZatomicload)
   1085 		v.AddArg(ptr)
   1086 		v.AddArg(mem)
   1087 		return true
   1088 	}
   1089 }
   1090 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool {
   1091 	// match: (AtomicLoad64 ptr mem)
   1092 	// cond:
   1093 	// result: (MOVDatomicload ptr mem)
   1094 	for {
   1095 		_ = v.Args[1]
   1096 		ptr := v.Args[0]
   1097 		mem := v.Args[1]
   1098 		v.reset(OpS390XMOVDatomicload)
   1099 		v.AddArg(ptr)
   1100 		v.AddArg(mem)
   1101 		return true
   1102 	}
   1103 }
   1104 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool {
   1105 	// match: (AtomicLoadPtr ptr mem)
   1106 	// cond:
   1107 	// result: (MOVDatomicload ptr mem)
   1108 	for {
   1109 		_ = v.Args[1]
   1110 		ptr := v.Args[0]
   1111 		mem := v.Args[1]
   1112 		v.reset(OpS390XMOVDatomicload)
   1113 		v.AddArg(ptr)
   1114 		v.AddArg(mem)
   1115 		return true
   1116 	}
   1117 }
   1118 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool {
   1119 	// match: (AtomicStore32 ptr val mem)
   1120 	// cond:
   1121 	// result: (MOVWatomicstore ptr val mem)
   1122 	for {
   1123 		_ = v.Args[2]
   1124 		ptr := v.Args[0]
   1125 		val := v.Args[1]
   1126 		mem := v.Args[2]
   1127 		v.reset(OpS390XMOVWatomicstore)
   1128 		v.AddArg(ptr)
   1129 		v.AddArg(val)
   1130 		v.AddArg(mem)
   1131 		return true
   1132 	}
   1133 }
   1134 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool {
   1135 	// match: (AtomicStore64 ptr val mem)
   1136 	// cond:
   1137 	// result: (MOVDatomicstore ptr val mem)
   1138 	for {
   1139 		_ = v.Args[2]
   1140 		ptr := v.Args[0]
   1141 		val := v.Args[1]
   1142 		mem := v.Args[2]
   1143 		v.reset(OpS390XMOVDatomicstore)
   1144 		v.AddArg(ptr)
   1145 		v.AddArg(val)
   1146 		v.AddArg(mem)
   1147 		return true
   1148 	}
   1149 }
   1150 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool {
   1151 	// match: (AtomicStorePtrNoWB ptr val mem)
   1152 	// cond:
   1153 	// result: (MOVDatomicstore ptr val mem)
   1154 	for {
   1155 		_ = v.Args[2]
   1156 		ptr := v.Args[0]
   1157 		val := v.Args[1]
   1158 		mem := v.Args[2]
   1159 		v.reset(OpS390XMOVDatomicstore)
   1160 		v.AddArg(ptr)
   1161 		v.AddArg(val)
   1162 		v.AddArg(mem)
   1163 		return true
   1164 	}
   1165 }
   1166 func rewriteValueS390X_OpAvg64u_0(v *Value) bool {
   1167 	b := v.Block
   1168 	_ = b
   1169 	// match: (Avg64u <t> x y)
   1170 	// cond:
   1171 	// result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y)
   1172 	for {
   1173 		t := v.Type
   1174 		_ = v.Args[1]
   1175 		x := v.Args[0]
   1176 		y := v.Args[1]
   1177 		v.reset(OpS390XADD)
   1178 		v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t)
   1179 		v0.AuxInt = 1
   1180 		v1 := b.NewValue0(v.Pos, OpS390XSUB, t)
   1181 		v1.AddArg(x)
   1182 		v1.AddArg(y)
   1183 		v0.AddArg(v1)
   1184 		v.AddArg(v0)
   1185 		v.AddArg(y)
   1186 		return true
   1187 	}
   1188 }
   1189 func rewriteValueS390X_OpBitLen64_0(v *Value) bool {
   1190 	b := v.Block
   1191 	_ = b
   1192 	typ := &b.Func.Config.Types
   1193 	_ = typ
   1194 	// match: (BitLen64 x)
   1195 	// cond:
   1196 	// result: (SUB (MOVDconst [64]) (FLOGR x))
   1197 	for {
   1198 		x := v.Args[0]
   1199 		v.reset(OpS390XSUB)
   1200 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1201 		v0.AuxInt = 64
   1202 		v.AddArg(v0)
   1203 		v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64)
   1204 		v1.AddArg(x)
   1205 		v.AddArg(v1)
   1206 		return true
   1207 	}
   1208 }
   1209 func rewriteValueS390X_OpBswap32_0(v *Value) bool {
   1210 	// match: (Bswap32 x)
   1211 	// cond:
   1212 	// result: (MOVWBR x)
   1213 	for {
   1214 		x := v.Args[0]
   1215 		v.reset(OpS390XMOVWBR)
   1216 		v.AddArg(x)
   1217 		return true
   1218 	}
   1219 }
   1220 func rewriteValueS390X_OpBswap64_0(v *Value) bool {
   1221 	// match: (Bswap64 x)
   1222 	// cond:
   1223 	// result: (MOVDBR x)
   1224 	for {
   1225 		x := v.Args[0]
   1226 		v.reset(OpS390XMOVDBR)
   1227 		v.AddArg(x)
   1228 		return true
   1229 	}
   1230 }
   1231 func rewriteValueS390X_OpCeil_0(v *Value) bool {
   1232 	// match: (Ceil x)
   1233 	// cond:
   1234 	// result: (FIDBR [6] x)
   1235 	for {
   1236 		x := v.Args[0]
   1237 		v.reset(OpS390XFIDBR)
   1238 		v.AuxInt = 6
   1239 		v.AddArg(x)
   1240 		return true
   1241 	}
   1242 }
   1243 func rewriteValueS390X_OpClosureCall_0(v *Value) bool {
   1244 	// match: (ClosureCall [argwid] entry closure mem)
   1245 	// cond:
   1246 	// result: (CALLclosure [argwid] entry closure mem)
   1247 	for {
   1248 		argwid := v.AuxInt
   1249 		_ = v.Args[2]
   1250 		entry := v.Args[0]
   1251 		closure := v.Args[1]
   1252 		mem := v.Args[2]
   1253 		v.reset(OpS390XCALLclosure)
   1254 		v.AuxInt = argwid
   1255 		v.AddArg(entry)
   1256 		v.AddArg(closure)
   1257 		v.AddArg(mem)
   1258 		return true
   1259 	}
   1260 }
   1261 func rewriteValueS390X_OpCom16_0(v *Value) bool {
   1262 	// match: (Com16 x)
   1263 	// cond:
   1264 	// result: (NOTW x)
   1265 	for {
   1266 		x := v.Args[0]
   1267 		v.reset(OpS390XNOTW)
   1268 		v.AddArg(x)
   1269 		return true
   1270 	}
   1271 }
   1272 func rewriteValueS390X_OpCom32_0(v *Value) bool {
   1273 	// match: (Com32 x)
   1274 	// cond:
   1275 	// result: (NOTW x)
   1276 	for {
   1277 		x := v.Args[0]
   1278 		v.reset(OpS390XNOTW)
   1279 		v.AddArg(x)
   1280 		return true
   1281 	}
   1282 }
   1283 func rewriteValueS390X_OpCom64_0(v *Value) bool {
   1284 	// match: (Com64 x)
   1285 	// cond:
   1286 	// result: (NOT x)
   1287 	for {
   1288 		x := v.Args[0]
   1289 		v.reset(OpS390XNOT)
   1290 		v.AddArg(x)
   1291 		return true
   1292 	}
   1293 }
   1294 func rewriteValueS390X_OpCom8_0(v *Value) bool {
   1295 	// match: (Com8 x)
   1296 	// cond:
   1297 	// result: (NOTW x)
   1298 	for {
   1299 		x := v.Args[0]
   1300 		v.reset(OpS390XNOTW)
   1301 		v.AddArg(x)
   1302 		return true
   1303 	}
   1304 }
   1305 func rewriteValueS390X_OpConst16_0(v *Value) bool {
   1306 	// match: (Const16 [val])
   1307 	// cond:
   1308 	// result: (MOVDconst [val])
   1309 	for {
   1310 		val := v.AuxInt
   1311 		v.reset(OpS390XMOVDconst)
   1312 		v.AuxInt = val
   1313 		return true
   1314 	}
   1315 }
   1316 func rewriteValueS390X_OpConst32_0(v *Value) bool {
   1317 	// match: (Const32 [val])
   1318 	// cond:
   1319 	// result: (MOVDconst [val])
   1320 	for {
   1321 		val := v.AuxInt
   1322 		v.reset(OpS390XMOVDconst)
   1323 		v.AuxInt = val
   1324 		return true
   1325 	}
   1326 }
   1327 func rewriteValueS390X_OpConst32F_0(v *Value) bool {
   1328 	// match: (Const32F [val])
   1329 	// cond:
   1330 	// result: (FMOVSconst [val])
   1331 	for {
   1332 		val := v.AuxInt
   1333 		v.reset(OpS390XFMOVSconst)
   1334 		v.AuxInt = val
   1335 		return true
   1336 	}
   1337 }
   1338 func rewriteValueS390X_OpConst64_0(v *Value) bool {
   1339 	// match: (Const64 [val])
   1340 	// cond:
   1341 	// result: (MOVDconst [val])
   1342 	for {
   1343 		val := v.AuxInt
   1344 		v.reset(OpS390XMOVDconst)
   1345 		v.AuxInt = val
   1346 		return true
   1347 	}
   1348 }
   1349 func rewriteValueS390X_OpConst64F_0(v *Value) bool {
   1350 	// match: (Const64F [val])
   1351 	// cond:
   1352 	// result: (FMOVDconst [val])
   1353 	for {
   1354 		val := v.AuxInt
   1355 		v.reset(OpS390XFMOVDconst)
   1356 		v.AuxInt = val
   1357 		return true
   1358 	}
   1359 }
   1360 func rewriteValueS390X_OpConst8_0(v *Value) bool {
   1361 	// match: (Const8 [val])
   1362 	// cond:
   1363 	// result: (MOVDconst [val])
   1364 	for {
   1365 		val := v.AuxInt
   1366 		v.reset(OpS390XMOVDconst)
   1367 		v.AuxInt = val
   1368 		return true
   1369 	}
   1370 }
   1371 func rewriteValueS390X_OpConstBool_0(v *Value) bool {
   1372 	// match: (ConstBool [b])
   1373 	// cond:
   1374 	// result: (MOVDconst [b])
   1375 	for {
   1376 		b := v.AuxInt
   1377 		v.reset(OpS390XMOVDconst)
   1378 		v.AuxInt = b
   1379 		return true
   1380 	}
   1381 }
   1382 func rewriteValueS390X_OpConstNil_0(v *Value) bool {
   1383 	// match: (ConstNil)
   1384 	// cond:
   1385 	// result: (MOVDconst [0])
   1386 	for {
   1387 		v.reset(OpS390XMOVDconst)
   1388 		v.AuxInt = 0
   1389 		return true
   1390 	}
   1391 }
   1392 func rewriteValueS390X_OpConvert_0(v *Value) bool {
   1393 	// match: (Convert <t> x mem)
   1394 	// cond:
   1395 	// result: (MOVDconvert <t> x mem)
   1396 	for {
   1397 		t := v.Type
   1398 		_ = v.Args[1]
   1399 		x := v.Args[0]
   1400 		mem := v.Args[1]
   1401 		v.reset(OpS390XMOVDconvert)
   1402 		v.Type = t
   1403 		v.AddArg(x)
   1404 		v.AddArg(mem)
   1405 		return true
   1406 	}
   1407 }
   1408 func rewriteValueS390X_OpCtz32_0(v *Value) bool {
   1409 	b := v.Block
   1410 	_ = b
   1411 	typ := &b.Func.Config.Types
   1412 	_ = typ
   1413 	// match: (Ctz32 <t> x)
   1414 	// cond:
   1415 	// result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x)))))
   1416 	for {
   1417 		t := v.Type
   1418 		x := v.Args[0]
   1419 		v.reset(OpS390XSUB)
   1420 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1421 		v0.AuxInt = 64
   1422 		v.AddArg(v0)
   1423 		v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64)
   1424 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   1425 		v3 := b.NewValue0(v.Pos, OpS390XANDW, t)
   1426 		v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t)
   1427 		v4.AuxInt = 1
   1428 		v4.AddArg(x)
   1429 		v3.AddArg(v4)
   1430 		v5 := b.NewValue0(v.Pos, OpS390XNOTW, t)
   1431 		v5.AddArg(x)
   1432 		v3.AddArg(v5)
   1433 		v2.AddArg(v3)
   1434 		v1.AddArg(v2)
   1435 		v.AddArg(v1)
   1436 		return true
   1437 	}
   1438 }
   1439 func rewriteValueS390X_OpCtz64_0(v *Value) bool {
   1440 	b := v.Block
   1441 	_ = b
   1442 	typ := &b.Func.Config.Types
   1443 	_ = typ
   1444 	// match: (Ctz64 <t> x)
   1445 	// cond:
   1446 	// result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x))))
   1447 	for {
   1448 		t := v.Type
   1449 		x := v.Args[0]
   1450 		v.reset(OpS390XSUB)
   1451 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1452 		v0.AuxInt = 64
   1453 		v.AddArg(v0)
   1454 		v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64)
   1455 		v2 := b.NewValue0(v.Pos, OpS390XAND, t)
   1456 		v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t)
   1457 		v3.AuxInt = 1
   1458 		v3.AddArg(x)
   1459 		v2.AddArg(v3)
   1460 		v4 := b.NewValue0(v.Pos, OpS390XNOT, t)
   1461 		v4.AddArg(x)
   1462 		v2.AddArg(v4)
   1463 		v1.AddArg(v2)
   1464 		v.AddArg(v1)
   1465 		return true
   1466 	}
   1467 }
   1468 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool {
   1469 	// match: (Cvt32Fto32 x)
   1470 	// cond:
   1471 	// result: (CFEBRA x)
   1472 	for {
   1473 		x := v.Args[0]
   1474 		v.reset(OpS390XCFEBRA)
   1475 		v.AddArg(x)
   1476 		return true
   1477 	}
   1478 }
   1479 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool {
   1480 	// match: (Cvt32Fto64 x)
   1481 	// cond:
   1482 	// result: (CGEBRA x)
   1483 	for {
   1484 		x := v.Args[0]
   1485 		v.reset(OpS390XCGEBRA)
   1486 		v.AddArg(x)
   1487 		return true
   1488 	}
   1489 }
   1490 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool {
   1491 	// match: (Cvt32Fto64F x)
   1492 	// cond:
   1493 	// result: (LDEBR x)
   1494 	for {
   1495 		x := v.Args[0]
   1496 		v.reset(OpS390XLDEBR)
   1497 		v.AddArg(x)
   1498 		return true
   1499 	}
   1500 }
   1501 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool {
   1502 	// match: (Cvt32to32F x)
   1503 	// cond:
   1504 	// result: (CEFBRA x)
   1505 	for {
   1506 		x := v.Args[0]
   1507 		v.reset(OpS390XCEFBRA)
   1508 		v.AddArg(x)
   1509 		return true
   1510 	}
   1511 }
   1512 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool {
   1513 	// match: (Cvt32to64F x)
   1514 	// cond:
   1515 	// result: (CDFBRA x)
   1516 	for {
   1517 		x := v.Args[0]
   1518 		v.reset(OpS390XCDFBRA)
   1519 		v.AddArg(x)
   1520 		return true
   1521 	}
   1522 }
   1523 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool {
   1524 	// match: (Cvt64Fto32 x)
   1525 	// cond:
   1526 	// result: (CFDBRA x)
   1527 	for {
   1528 		x := v.Args[0]
   1529 		v.reset(OpS390XCFDBRA)
   1530 		v.AddArg(x)
   1531 		return true
   1532 	}
   1533 }
   1534 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool {
   1535 	// match: (Cvt64Fto32F x)
   1536 	// cond:
   1537 	// result: (LEDBR x)
   1538 	for {
   1539 		x := v.Args[0]
   1540 		v.reset(OpS390XLEDBR)
   1541 		v.AddArg(x)
   1542 		return true
   1543 	}
   1544 }
   1545 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool {
   1546 	// match: (Cvt64Fto64 x)
   1547 	// cond:
   1548 	// result: (CGDBRA x)
   1549 	for {
   1550 		x := v.Args[0]
   1551 		v.reset(OpS390XCGDBRA)
   1552 		v.AddArg(x)
   1553 		return true
   1554 	}
   1555 }
   1556 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool {
   1557 	// match: (Cvt64to32F x)
   1558 	// cond:
   1559 	// result: (CEGBRA x)
   1560 	for {
   1561 		x := v.Args[0]
   1562 		v.reset(OpS390XCEGBRA)
   1563 		v.AddArg(x)
   1564 		return true
   1565 	}
   1566 }
   1567 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool {
   1568 	// match: (Cvt64to64F x)
   1569 	// cond:
   1570 	// result: (CDGBRA x)
   1571 	for {
   1572 		x := v.Args[0]
   1573 		v.reset(OpS390XCDGBRA)
   1574 		v.AddArg(x)
   1575 		return true
   1576 	}
   1577 }
   1578 func rewriteValueS390X_OpDiv16_0(v *Value) bool {
   1579 	b := v.Block
   1580 	_ = b
   1581 	typ := &b.Func.Config.Types
   1582 	_ = typ
   1583 	// match: (Div16 x y)
   1584 	// cond:
   1585 	// result: (DIVW  (MOVHreg x) (MOVHreg y))
   1586 	for {
   1587 		_ = v.Args[1]
   1588 		x := v.Args[0]
   1589 		y := v.Args[1]
   1590 		v.reset(OpS390XDIVW)
   1591 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   1592 		v0.AddArg(x)
   1593 		v.AddArg(v0)
   1594 		v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   1595 		v1.AddArg(y)
   1596 		v.AddArg(v1)
   1597 		return true
   1598 	}
   1599 }
   1600 func rewriteValueS390X_OpDiv16u_0(v *Value) bool {
   1601 	b := v.Block
   1602 	_ = b
   1603 	typ := &b.Func.Config.Types
   1604 	_ = typ
   1605 	// match: (Div16u x y)
   1606 	// cond:
   1607 	// result: (DIVWU (MOVHZreg x) (MOVHZreg y))
   1608 	for {
   1609 		_ = v.Args[1]
   1610 		x := v.Args[0]
   1611 		y := v.Args[1]
   1612 		v.reset(OpS390XDIVWU)
   1613 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   1614 		v0.AddArg(x)
   1615 		v.AddArg(v0)
   1616 		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   1617 		v1.AddArg(y)
   1618 		v.AddArg(v1)
   1619 		return true
   1620 	}
   1621 }
   1622 func rewriteValueS390X_OpDiv32_0(v *Value) bool {
   1623 	b := v.Block
   1624 	_ = b
   1625 	typ := &b.Func.Config.Types
   1626 	_ = typ
   1627 	// match: (Div32 x y)
   1628 	// cond:
   1629 	// result: (DIVW  (MOVWreg x) y)
   1630 	for {
   1631 		_ = v.Args[1]
   1632 		x := v.Args[0]
   1633 		y := v.Args[1]
   1634 		v.reset(OpS390XDIVW)
   1635 		v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
   1636 		v0.AddArg(x)
   1637 		v.AddArg(v0)
   1638 		v.AddArg(y)
   1639 		return true
   1640 	}
   1641 }
   1642 func rewriteValueS390X_OpDiv32F_0(v *Value) bool {
   1643 	// match: (Div32F x y)
   1644 	// cond:
   1645 	// result: (FDIVS x y)
   1646 	for {
   1647 		_ = v.Args[1]
   1648 		x := v.Args[0]
   1649 		y := v.Args[1]
   1650 		v.reset(OpS390XFDIVS)
   1651 		v.AddArg(x)
   1652 		v.AddArg(y)
   1653 		return true
   1654 	}
   1655 }
   1656 func rewriteValueS390X_OpDiv32u_0(v *Value) bool {
   1657 	b := v.Block
   1658 	_ = b
   1659 	typ := &b.Func.Config.Types
   1660 	_ = typ
   1661 	// match: (Div32u x y)
   1662 	// cond:
   1663 	// result: (DIVWU (MOVWZreg x) y)
   1664 	for {
   1665 		_ = v.Args[1]
   1666 		x := v.Args[0]
   1667 		y := v.Args[1]
   1668 		v.reset(OpS390XDIVWU)
   1669 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   1670 		v0.AddArg(x)
   1671 		v.AddArg(v0)
   1672 		v.AddArg(y)
   1673 		return true
   1674 	}
   1675 }
   1676 func rewriteValueS390X_OpDiv64_0(v *Value) bool {
   1677 	// match: (Div64 x y)
   1678 	// cond:
   1679 	// result: (DIVD  x y)
   1680 	for {
   1681 		_ = v.Args[1]
   1682 		x := v.Args[0]
   1683 		y := v.Args[1]
   1684 		v.reset(OpS390XDIVD)
   1685 		v.AddArg(x)
   1686 		v.AddArg(y)
   1687 		return true
   1688 	}
   1689 }
   1690 func rewriteValueS390X_OpDiv64F_0(v *Value) bool {
   1691 	// match: (Div64F x y)
   1692 	// cond:
   1693 	// result: (FDIV x y)
   1694 	for {
   1695 		_ = v.Args[1]
   1696 		x := v.Args[0]
   1697 		y := v.Args[1]
   1698 		v.reset(OpS390XFDIV)
   1699 		v.AddArg(x)
   1700 		v.AddArg(y)
   1701 		return true
   1702 	}
   1703 }
   1704 func rewriteValueS390X_OpDiv64u_0(v *Value) bool {
   1705 	// match: (Div64u x y)
   1706 	// cond:
   1707 	// result: (DIVDU x y)
   1708 	for {
   1709 		_ = v.Args[1]
   1710 		x := v.Args[0]
   1711 		y := v.Args[1]
   1712 		v.reset(OpS390XDIVDU)
   1713 		v.AddArg(x)
   1714 		v.AddArg(y)
   1715 		return true
   1716 	}
   1717 }
   1718 func rewriteValueS390X_OpDiv8_0(v *Value) bool {
   1719 	b := v.Block
   1720 	_ = b
   1721 	typ := &b.Func.Config.Types
   1722 	_ = typ
   1723 	// match: (Div8 x y)
   1724 	// cond:
   1725 	// result: (DIVW  (MOVBreg x) (MOVBreg y))
   1726 	for {
   1727 		_ = v.Args[1]
   1728 		x := v.Args[0]
   1729 		y := v.Args[1]
   1730 		v.reset(OpS390XDIVW)
   1731 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   1732 		v0.AddArg(x)
   1733 		v.AddArg(v0)
   1734 		v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   1735 		v1.AddArg(y)
   1736 		v.AddArg(v1)
   1737 		return true
   1738 	}
   1739 }
   1740 func rewriteValueS390X_OpDiv8u_0(v *Value) bool {
   1741 	b := v.Block
   1742 	_ = b
   1743 	typ := &b.Func.Config.Types
   1744 	_ = typ
   1745 	// match: (Div8u x y)
   1746 	// cond:
   1747 	// result: (DIVWU (MOVBZreg x) (MOVBZreg y))
   1748 	for {
   1749 		_ = v.Args[1]
   1750 		x := v.Args[0]
   1751 		y := v.Args[1]
   1752 		v.reset(OpS390XDIVWU)
   1753 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   1754 		v0.AddArg(x)
   1755 		v.AddArg(v0)
   1756 		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   1757 		v1.AddArg(y)
   1758 		v.AddArg(v1)
   1759 		return true
   1760 	}
   1761 }
   1762 func rewriteValueS390X_OpEq16_0(v *Value) bool {
   1763 	b := v.Block
   1764 	_ = b
   1765 	typ := &b.Func.Config.Types
   1766 	_ = typ
   1767 	// match: (Eq16 x y)
   1768 	// cond:
   1769 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y)))
   1770 	for {
   1771 		_ = v.Args[1]
   1772 		x := v.Args[0]
   1773 		y := v.Args[1]
   1774 		v.reset(OpS390XMOVDEQ)
   1775 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1776 		v0.AuxInt = 0
   1777 		v.AddArg(v0)
   1778 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1779 		v1.AuxInt = 1
   1780 		v.AddArg(v1)
   1781 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   1782 		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   1783 		v3.AddArg(x)
   1784 		v2.AddArg(v3)
   1785 		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   1786 		v4.AddArg(y)
   1787 		v2.AddArg(v4)
   1788 		v.AddArg(v2)
   1789 		return true
   1790 	}
   1791 }
   1792 func rewriteValueS390X_OpEq32_0(v *Value) bool {
   1793 	b := v.Block
   1794 	_ = b
   1795 	typ := &b.Func.Config.Types
   1796 	_ = typ
   1797 	// match: (Eq32 x y)
   1798 	// cond:
   1799 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
   1800 	for {
   1801 		_ = v.Args[1]
   1802 		x := v.Args[0]
   1803 		y := v.Args[1]
   1804 		v.reset(OpS390XMOVDEQ)
   1805 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1806 		v0.AuxInt = 0
   1807 		v.AddArg(v0)
   1808 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1809 		v1.AuxInt = 1
   1810 		v.AddArg(v1)
   1811 		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
   1812 		v2.AddArg(x)
   1813 		v2.AddArg(y)
   1814 		v.AddArg(v2)
   1815 		return true
   1816 	}
   1817 }
   1818 func rewriteValueS390X_OpEq32F_0(v *Value) bool {
   1819 	b := v.Block
   1820 	_ = b
   1821 	typ := &b.Func.Config.Types
   1822 	_ = typ
   1823 	// match: (Eq32F x y)
   1824 	// cond:
   1825 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
   1826 	for {
   1827 		_ = v.Args[1]
   1828 		x := v.Args[0]
   1829 		y := v.Args[1]
   1830 		v.reset(OpS390XMOVDEQ)
   1831 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1832 		v0.AuxInt = 0
   1833 		v.AddArg(v0)
   1834 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1835 		v1.AuxInt = 1
   1836 		v.AddArg(v1)
   1837 		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
   1838 		v2.AddArg(x)
   1839 		v2.AddArg(y)
   1840 		v.AddArg(v2)
   1841 		return true
   1842 	}
   1843 }
   1844 func rewriteValueS390X_OpEq64_0(v *Value) bool {
   1845 	b := v.Block
   1846 	_ = b
   1847 	typ := &b.Func.Config.Types
   1848 	_ = typ
   1849 	// match: (Eq64 x y)
   1850 	// cond:
   1851 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   1852 	for {
   1853 		_ = v.Args[1]
   1854 		x := v.Args[0]
   1855 		y := v.Args[1]
   1856 		v.reset(OpS390XMOVDEQ)
   1857 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1858 		v0.AuxInt = 0
   1859 		v.AddArg(v0)
   1860 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1861 		v1.AuxInt = 1
   1862 		v.AddArg(v1)
   1863 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   1864 		v2.AddArg(x)
   1865 		v2.AddArg(y)
   1866 		v.AddArg(v2)
   1867 		return true
   1868 	}
   1869 }
   1870 func rewriteValueS390X_OpEq64F_0(v *Value) bool {
   1871 	b := v.Block
   1872 	_ = b
   1873 	typ := &b.Func.Config.Types
   1874 	_ = typ
   1875 	// match: (Eq64F x y)
   1876 	// cond:
   1877 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
   1878 	for {
   1879 		_ = v.Args[1]
   1880 		x := v.Args[0]
   1881 		y := v.Args[1]
   1882 		v.reset(OpS390XMOVDEQ)
   1883 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1884 		v0.AuxInt = 0
   1885 		v.AddArg(v0)
   1886 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1887 		v1.AuxInt = 1
   1888 		v.AddArg(v1)
   1889 		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
   1890 		v2.AddArg(x)
   1891 		v2.AddArg(y)
   1892 		v.AddArg(v2)
   1893 		return true
   1894 	}
   1895 }
   1896 func rewriteValueS390X_OpEq8_0(v *Value) bool {
   1897 	b := v.Block
   1898 	_ = b
   1899 	typ := &b.Func.Config.Types
   1900 	_ = typ
   1901 	// match: (Eq8 x y)
   1902 	// cond:
   1903 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   1904 	for {
   1905 		_ = v.Args[1]
   1906 		x := v.Args[0]
   1907 		y := v.Args[1]
   1908 		v.reset(OpS390XMOVDEQ)
   1909 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1910 		v0.AuxInt = 0
   1911 		v.AddArg(v0)
   1912 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1913 		v1.AuxInt = 1
   1914 		v.AddArg(v1)
   1915 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   1916 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   1917 		v3.AddArg(x)
   1918 		v2.AddArg(v3)
   1919 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   1920 		v4.AddArg(y)
   1921 		v2.AddArg(v4)
   1922 		v.AddArg(v2)
   1923 		return true
   1924 	}
   1925 }
   1926 func rewriteValueS390X_OpEqB_0(v *Value) bool {
   1927 	b := v.Block
   1928 	_ = b
   1929 	typ := &b.Func.Config.Types
   1930 	_ = typ
   1931 	// match: (EqB x y)
   1932 	// cond:
   1933 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   1934 	for {
   1935 		_ = v.Args[1]
   1936 		x := v.Args[0]
   1937 		y := v.Args[1]
   1938 		v.reset(OpS390XMOVDEQ)
   1939 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1940 		v0.AuxInt = 0
   1941 		v.AddArg(v0)
   1942 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1943 		v1.AuxInt = 1
   1944 		v.AddArg(v1)
   1945 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   1946 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   1947 		v3.AddArg(x)
   1948 		v2.AddArg(v3)
   1949 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   1950 		v4.AddArg(y)
   1951 		v2.AddArg(v4)
   1952 		v.AddArg(v2)
   1953 		return true
   1954 	}
   1955 }
   1956 func rewriteValueS390X_OpEqPtr_0(v *Value) bool {
   1957 	b := v.Block
   1958 	_ = b
   1959 	typ := &b.Func.Config.Types
   1960 	_ = typ
   1961 	// match: (EqPtr x y)
   1962 	// cond:
   1963 	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   1964 	for {
   1965 		_ = v.Args[1]
   1966 		x := v.Args[0]
   1967 		y := v.Args[1]
   1968 		v.reset(OpS390XMOVDEQ)
   1969 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1970 		v0.AuxInt = 0
   1971 		v.AddArg(v0)
   1972 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   1973 		v1.AuxInt = 1
   1974 		v.AddArg(v1)
   1975 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   1976 		v2.AddArg(x)
   1977 		v2.AddArg(y)
   1978 		v.AddArg(v2)
   1979 		return true
   1980 	}
   1981 }
   1982 func rewriteValueS390X_OpFloor_0(v *Value) bool {
   1983 	// match: (Floor x)
   1984 	// cond:
   1985 	// result: (FIDBR [7] x)
   1986 	for {
   1987 		x := v.Args[0]
   1988 		v.reset(OpS390XFIDBR)
   1989 		v.AuxInt = 7
   1990 		v.AddArg(x)
   1991 		return true
   1992 	}
   1993 }
   1994 func rewriteValueS390X_OpGeq16_0(v *Value) bool {
   1995 	b := v.Block
   1996 	_ = b
   1997 	typ := &b.Func.Config.Types
   1998 	_ = typ
   1999 	// match: (Geq16 x y)
   2000 	// cond:
   2001 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y)))
   2002 	for {
   2003 		_ = v.Args[1]
   2004 		x := v.Args[0]
   2005 		y := v.Args[1]
   2006 		v.reset(OpS390XMOVDGE)
   2007 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2008 		v0.AuxInt = 0
   2009 		v.AddArg(v0)
   2010 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2011 		v1.AuxInt = 1
   2012 		v.AddArg(v1)
   2013 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2014 		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   2015 		v3.AddArg(x)
   2016 		v2.AddArg(v3)
   2017 		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   2018 		v4.AddArg(y)
   2019 		v2.AddArg(v4)
   2020 		v.AddArg(v2)
   2021 		return true
   2022 	}
   2023 }
   2024 func rewriteValueS390X_OpGeq16U_0(v *Value) bool {
   2025 	b := v.Block
   2026 	_ = b
   2027 	typ := &b.Func.Config.Types
   2028 	_ = typ
   2029 	// match: (Geq16U x y)
   2030 	// cond:
   2031 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y)))
   2032 	for {
   2033 		_ = v.Args[1]
   2034 		x := v.Args[0]
   2035 		y := v.Args[1]
   2036 		v.reset(OpS390XMOVDGE)
   2037 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2038 		v0.AuxInt = 0
   2039 		v.AddArg(v0)
   2040 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2041 		v1.AuxInt = 1
   2042 		v.AddArg(v1)
   2043 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2044 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   2045 		v3.AddArg(x)
   2046 		v2.AddArg(v3)
   2047 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   2048 		v4.AddArg(y)
   2049 		v2.AddArg(v4)
   2050 		v.AddArg(v2)
   2051 		return true
   2052 	}
   2053 }
   2054 func rewriteValueS390X_OpGeq32_0(v *Value) bool {
   2055 	b := v.Block
   2056 	_ = b
   2057 	typ := &b.Func.Config.Types
   2058 	_ = typ
   2059 	// match: (Geq32 x y)
   2060 	// cond:
   2061 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
   2062 	for {
   2063 		_ = v.Args[1]
   2064 		x := v.Args[0]
   2065 		y := v.Args[1]
   2066 		v.reset(OpS390XMOVDGE)
   2067 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2068 		v0.AuxInt = 0
   2069 		v.AddArg(v0)
   2070 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2071 		v1.AuxInt = 1
   2072 		v.AddArg(v1)
   2073 		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
   2074 		v2.AddArg(x)
   2075 		v2.AddArg(y)
   2076 		v.AddArg(v2)
   2077 		return true
   2078 	}
   2079 }
   2080 func rewriteValueS390X_OpGeq32F_0(v *Value) bool {
   2081 	b := v.Block
   2082 	_ = b
   2083 	typ := &b.Func.Config.Types
   2084 	_ = typ
   2085 	// match: (Geq32F x y)
   2086 	// cond:
   2087 	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
   2088 	for {
   2089 		_ = v.Args[1]
   2090 		x := v.Args[0]
   2091 		y := v.Args[1]
   2092 		v.reset(OpS390XMOVDGEnoinv)
   2093 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2094 		v0.AuxInt = 0
   2095 		v.AddArg(v0)
   2096 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2097 		v1.AuxInt = 1
   2098 		v.AddArg(v1)
   2099 		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
   2100 		v2.AddArg(x)
   2101 		v2.AddArg(y)
   2102 		v.AddArg(v2)
   2103 		return true
   2104 	}
   2105 }
   2106 func rewriteValueS390X_OpGeq32U_0(v *Value) bool {
   2107 	b := v.Block
   2108 	_ = b
   2109 	typ := &b.Func.Config.Types
   2110 	_ = typ
   2111 	// match: (Geq32U x y)
   2112 	// cond:
   2113 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
   2114 	for {
   2115 		_ = v.Args[1]
   2116 		x := v.Args[0]
   2117 		y := v.Args[1]
   2118 		v.reset(OpS390XMOVDGE)
   2119 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2120 		v0.AuxInt = 0
   2121 		v.AddArg(v0)
   2122 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2123 		v1.AuxInt = 1
   2124 		v.AddArg(v1)
   2125 		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
   2126 		v2.AddArg(x)
   2127 		v2.AddArg(y)
   2128 		v.AddArg(v2)
   2129 		return true
   2130 	}
   2131 }
   2132 func rewriteValueS390X_OpGeq64_0(v *Value) bool {
   2133 	b := v.Block
   2134 	_ = b
   2135 	typ := &b.Func.Config.Types
   2136 	_ = typ
   2137 	// match: (Geq64 x y)
   2138 	// cond:
   2139 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   2140 	for {
   2141 		_ = v.Args[1]
   2142 		x := v.Args[0]
   2143 		y := v.Args[1]
   2144 		v.reset(OpS390XMOVDGE)
   2145 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2146 		v0.AuxInt = 0
   2147 		v.AddArg(v0)
   2148 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2149 		v1.AuxInt = 1
   2150 		v.AddArg(v1)
   2151 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2152 		v2.AddArg(x)
   2153 		v2.AddArg(y)
   2154 		v.AddArg(v2)
   2155 		return true
   2156 	}
   2157 }
   2158 func rewriteValueS390X_OpGeq64F_0(v *Value) bool {
   2159 	b := v.Block
   2160 	_ = b
   2161 	typ := &b.Func.Config.Types
   2162 	_ = typ
   2163 	// match: (Geq64F x y)
   2164 	// cond:
   2165 	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
   2166 	for {
   2167 		_ = v.Args[1]
   2168 		x := v.Args[0]
   2169 		y := v.Args[1]
   2170 		v.reset(OpS390XMOVDGEnoinv)
   2171 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2172 		v0.AuxInt = 0
   2173 		v.AddArg(v0)
   2174 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2175 		v1.AuxInt = 1
   2176 		v.AddArg(v1)
   2177 		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
   2178 		v2.AddArg(x)
   2179 		v2.AddArg(y)
   2180 		v.AddArg(v2)
   2181 		return true
   2182 	}
   2183 }
   2184 func rewriteValueS390X_OpGeq64U_0(v *Value) bool {
   2185 	b := v.Block
   2186 	_ = b
   2187 	typ := &b.Func.Config.Types
   2188 	_ = typ
   2189 	// match: (Geq64U x y)
   2190 	// cond:
   2191 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
   2192 	for {
   2193 		_ = v.Args[1]
   2194 		x := v.Args[0]
   2195 		y := v.Args[1]
   2196 		v.reset(OpS390XMOVDGE)
   2197 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2198 		v0.AuxInt = 0
   2199 		v.AddArg(v0)
   2200 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2201 		v1.AuxInt = 1
   2202 		v.AddArg(v1)
   2203 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2204 		v2.AddArg(x)
   2205 		v2.AddArg(y)
   2206 		v.AddArg(v2)
   2207 		return true
   2208 	}
   2209 }
   2210 func rewriteValueS390X_OpGeq8_0(v *Value) bool {
   2211 	b := v.Block
   2212 	_ = b
   2213 	typ := &b.Func.Config.Types
   2214 	_ = typ
   2215 	// match: (Geq8 x y)
   2216 	// cond:
   2217 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   2218 	for {
   2219 		_ = v.Args[1]
   2220 		x := v.Args[0]
   2221 		y := v.Args[1]
   2222 		v.reset(OpS390XMOVDGE)
   2223 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2224 		v0.AuxInt = 0
   2225 		v.AddArg(v0)
   2226 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2227 		v1.AuxInt = 1
   2228 		v.AddArg(v1)
   2229 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2230 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   2231 		v3.AddArg(x)
   2232 		v2.AddArg(v3)
   2233 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   2234 		v4.AddArg(y)
   2235 		v2.AddArg(v4)
   2236 		v.AddArg(v2)
   2237 		return true
   2238 	}
   2239 }
   2240 func rewriteValueS390X_OpGeq8U_0(v *Value) bool {
   2241 	b := v.Block
   2242 	_ = b
   2243 	typ := &b.Func.Config.Types
   2244 	_ = typ
   2245 	// match: (Geq8U x y)
   2246 	// cond:
   2247 	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y)))
   2248 	for {
   2249 		_ = v.Args[1]
   2250 		x := v.Args[0]
   2251 		y := v.Args[1]
   2252 		v.reset(OpS390XMOVDGE)
   2253 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2254 		v0.AuxInt = 0
   2255 		v.AddArg(v0)
   2256 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2257 		v1.AuxInt = 1
   2258 		v.AddArg(v1)
   2259 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2260 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   2261 		v3.AddArg(x)
   2262 		v2.AddArg(v3)
   2263 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   2264 		v4.AddArg(y)
   2265 		v2.AddArg(v4)
   2266 		v.AddArg(v2)
   2267 		return true
   2268 	}
   2269 }
   2270 func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool {
   2271 	// match: (GetCallerSP)
   2272 	// cond:
   2273 	// result: (LoweredGetCallerSP)
   2274 	for {
   2275 		v.reset(OpS390XLoweredGetCallerSP)
   2276 		return true
   2277 	}
   2278 }
   2279 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool {
   2280 	// match: (GetClosurePtr)
   2281 	// cond:
   2282 	// result: (LoweredGetClosurePtr)
   2283 	for {
   2284 		v.reset(OpS390XLoweredGetClosurePtr)
   2285 		return true
   2286 	}
   2287 }
   2288 func rewriteValueS390X_OpGetG_0(v *Value) bool {
   2289 	// match: (GetG mem)
   2290 	// cond:
   2291 	// result: (LoweredGetG mem)
   2292 	for {
   2293 		mem := v.Args[0]
   2294 		v.reset(OpS390XLoweredGetG)
   2295 		v.AddArg(mem)
   2296 		return true
   2297 	}
   2298 }
   2299 func rewriteValueS390X_OpGreater16_0(v *Value) bool {
   2300 	b := v.Block
   2301 	_ = b
   2302 	typ := &b.Func.Config.Types
   2303 	_ = typ
   2304 	// match: (Greater16 x y)
   2305 	// cond:
   2306 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y)))
   2307 	for {
   2308 		_ = v.Args[1]
   2309 		x := v.Args[0]
   2310 		y := v.Args[1]
   2311 		v.reset(OpS390XMOVDGT)
   2312 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2313 		v0.AuxInt = 0
   2314 		v.AddArg(v0)
   2315 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2316 		v1.AuxInt = 1
   2317 		v.AddArg(v1)
   2318 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2319 		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   2320 		v3.AddArg(x)
   2321 		v2.AddArg(v3)
   2322 		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   2323 		v4.AddArg(y)
   2324 		v2.AddArg(v4)
   2325 		v.AddArg(v2)
   2326 		return true
   2327 	}
   2328 }
   2329 func rewriteValueS390X_OpGreater16U_0(v *Value) bool {
   2330 	b := v.Block
   2331 	_ = b
   2332 	typ := &b.Func.Config.Types
   2333 	_ = typ
   2334 	// match: (Greater16U x y)
   2335 	// cond:
   2336 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y)))
   2337 	for {
   2338 		_ = v.Args[1]
   2339 		x := v.Args[0]
   2340 		y := v.Args[1]
   2341 		v.reset(OpS390XMOVDGT)
   2342 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2343 		v0.AuxInt = 0
   2344 		v.AddArg(v0)
   2345 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2346 		v1.AuxInt = 1
   2347 		v.AddArg(v1)
   2348 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2349 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   2350 		v3.AddArg(x)
   2351 		v2.AddArg(v3)
   2352 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   2353 		v4.AddArg(y)
   2354 		v2.AddArg(v4)
   2355 		v.AddArg(v2)
   2356 		return true
   2357 	}
   2358 }
   2359 func rewriteValueS390X_OpGreater32_0(v *Value) bool {
   2360 	b := v.Block
   2361 	_ = b
   2362 	typ := &b.Func.Config.Types
   2363 	_ = typ
   2364 	// match: (Greater32 x y)
   2365 	// cond:
   2366 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
   2367 	for {
   2368 		_ = v.Args[1]
   2369 		x := v.Args[0]
   2370 		y := v.Args[1]
   2371 		v.reset(OpS390XMOVDGT)
   2372 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2373 		v0.AuxInt = 0
   2374 		v.AddArg(v0)
   2375 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2376 		v1.AuxInt = 1
   2377 		v.AddArg(v1)
   2378 		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
   2379 		v2.AddArg(x)
   2380 		v2.AddArg(y)
   2381 		v.AddArg(v2)
   2382 		return true
   2383 	}
   2384 }
   2385 func rewriteValueS390X_OpGreater32F_0(v *Value) bool {
   2386 	b := v.Block
   2387 	_ = b
   2388 	typ := &b.Func.Config.Types
   2389 	_ = typ
   2390 	// match: (Greater32F x y)
   2391 	// cond:
   2392 	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
   2393 	for {
   2394 		_ = v.Args[1]
   2395 		x := v.Args[0]
   2396 		y := v.Args[1]
   2397 		v.reset(OpS390XMOVDGTnoinv)
   2398 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2399 		v0.AuxInt = 0
   2400 		v.AddArg(v0)
   2401 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2402 		v1.AuxInt = 1
   2403 		v.AddArg(v1)
   2404 		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
   2405 		v2.AddArg(x)
   2406 		v2.AddArg(y)
   2407 		v.AddArg(v2)
   2408 		return true
   2409 	}
   2410 }
   2411 func rewriteValueS390X_OpGreater32U_0(v *Value) bool {
   2412 	b := v.Block
   2413 	_ = b
   2414 	typ := &b.Func.Config.Types
   2415 	_ = typ
   2416 	// match: (Greater32U x y)
   2417 	// cond:
   2418 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
   2419 	for {
   2420 		_ = v.Args[1]
   2421 		x := v.Args[0]
   2422 		y := v.Args[1]
   2423 		v.reset(OpS390XMOVDGT)
   2424 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2425 		v0.AuxInt = 0
   2426 		v.AddArg(v0)
   2427 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2428 		v1.AuxInt = 1
   2429 		v.AddArg(v1)
   2430 		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
   2431 		v2.AddArg(x)
   2432 		v2.AddArg(y)
   2433 		v.AddArg(v2)
   2434 		return true
   2435 	}
   2436 }
   2437 func rewriteValueS390X_OpGreater64_0(v *Value) bool {
   2438 	b := v.Block
   2439 	_ = b
   2440 	typ := &b.Func.Config.Types
   2441 	_ = typ
   2442 	// match: (Greater64 x y)
   2443 	// cond:
   2444 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   2445 	for {
   2446 		_ = v.Args[1]
   2447 		x := v.Args[0]
   2448 		y := v.Args[1]
   2449 		v.reset(OpS390XMOVDGT)
   2450 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2451 		v0.AuxInt = 0
   2452 		v.AddArg(v0)
   2453 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2454 		v1.AuxInt = 1
   2455 		v.AddArg(v1)
   2456 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2457 		v2.AddArg(x)
   2458 		v2.AddArg(y)
   2459 		v.AddArg(v2)
   2460 		return true
   2461 	}
   2462 }
   2463 func rewriteValueS390X_OpGreater64F_0(v *Value) bool {
   2464 	b := v.Block
   2465 	_ = b
   2466 	typ := &b.Func.Config.Types
   2467 	_ = typ
   2468 	// match: (Greater64F x y)
   2469 	// cond:
   2470 	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
   2471 	for {
   2472 		_ = v.Args[1]
   2473 		x := v.Args[0]
   2474 		y := v.Args[1]
   2475 		v.reset(OpS390XMOVDGTnoinv)
   2476 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2477 		v0.AuxInt = 0
   2478 		v.AddArg(v0)
   2479 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2480 		v1.AuxInt = 1
   2481 		v.AddArg(v1)
   2482 		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
   2483 		v2.AddArg(x)
   2484 		v2.AddArg(y)
   2485 		v.AddArg(v2)
   2486 		return true
   2487 	}
   2488 }
   2489 func rewriteValueS390X_OpGreater64U_0(v *Value) bool {
   2490 	b := v.Block
   2491 	_ = b
   2492 	typ := &b.Func.Config.Types
   2493 	_ = typ
   2494 	// match: (Greater64U x y)
   2495 	// cond:
   2496 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
   2497 	for {
   2498 		_ = v.Args[1]
   2499 		x := v.Args[0]
   2500 		y := v.Args[1]
   2501 		v.reset(OpS390XMOVDGT)
   2502 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2503 		v0.AuxInt = 0
   2504 		v.AddArg(v0)
   2505 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2506 		v1.AuxInt = 1
   2507 		v.AddArg(v1)
   2508 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2509 		v2.AddArg(x)
   2510 		v2.AddArg(y)
   2511 		v.AddArg(v2)
   2512 		return true
   2513 	}
   2514 }
   2515 func rewriteValueS390X_OpGreater8_0(v *Value) bool {
   2516 	b := v.Block
   2517 	_ = b
   2518 	typ := &b.Func.Config.Types
   2519 	_ = typ
   2520 	// match: (Greater8 x y)
   2521 	// cond:
   2522 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   2523 	for {
   2524 		_ = v.Args[1]
   2525 		x := v.Args[0]
   2526 		y := v.Args[1]
   2527 		v.reset(OpS390XMOVDGT)
   2528 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2529 		v0.AuxInt = 0
   2530 		v.AddArg(v0)
   2531 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2532 		v1.AuxInt = 1
   2533 		v.AddArg(v1)
   2534 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2535 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   2536 		v3.AddArg(x)
   2537 		v2.AddArg(v3)
   2538 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   2539 		v4.AddArg(y)
   2540 		v2.AddArg(v4)
   2541 		v.AddArg(v2)
   2542 		return true
   2543 	}
   2544 }
   2545 func rewriteValueS390X_OpGreater8U_0(v *Value) bool {
   2546 	b := v.Block
   2547 	_ = b
   2548 	typ := &b.Func.Config.Types
   2549 	_ = typ
   2550 	// match: (Greater8U x y)
   2551 	// cond:
   2552 	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y)))
   2553 	for {
   2554 		_ = v.Args[1]
   2555 		x := v.Args[0]
   2556 		y := v.Args[1]
   2557 		v.reset(OpS390XMOVDGT)
   2558 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2559 		v0.AuxInt = 0
   2560 		v.AddArg(v0)
   2561 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2562 		v1.AuxInt = 1
   2563 		v.AddArg(v1)
   2564 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2565 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   2566 		v3.AddArg(x)
   2567 		v2.AddArg(v3)
   2568 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   2569 		v4.AddArg(y)
   2570 		v2.AddArg(v4)
   2571 		v.AddArg(v2)
   2572 		return true
   2573 	}
   2574 }
   2575 func rewriteValueS390X_OpHmul32_0(v *Value) bool {
   2576 	b := v.Block
   2577 	_ = b
   2578 	typ := &b.Func.Config.Types
   2579 	_ = typ
   2580 	// match: (Hmul32 x y)
   2581 	// cond:
   2582 	// result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y)))
   2583 	for {
   2584 		_ = v.Args[1]
   2585 		x := v.Args[0]
   2586 		y := v.Args[1]
   2587 		v.reset(OpS390XSRDconst)
   2588 		v.AuxInt = 32
   2589 		v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64)
   2590 		v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
   2591 		v1.AddArg(x)
   2592 		v0.AddArg(v1)
   2593 		v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
   2594 		v2.AddArg(y)
   2595 		v0.AddArg(v2)
   2596 		v.AddArg(v0)
   2597 		return true
   2598 	}
   2599 }
   2600 func rewriteValueS390X_OpHmul32u_0(v *Value) bool {
   2601 	b := v.Block
   2602 	_ = b
   2603 	typ := &b.Func.Config.Types
   2604 	_ = typ
   2605 	// match: (Hmul32u x y)
   2606 	// cond:
   2607 	// result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y)))
   2608 	for {
   2609 		_ = v.Args[1]
   2610 		x := v.Args[0]
   2611 		y := v.Args[1]
   2612 		v.reset(OpS390XSRDconst)
   2613 		v.AuxInt = 32
   2614 		v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64)
   2615 		v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   2616 		v1.AddArg(x)
   2617 		v0.AddArg(v1)
   2618 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   2619 		v2.AddArg(y)
   2620 		v0.AddArg(v2)
   2621 		v.AddArg(v0)
   2622 		return true
   2623 	}
   2624 }
   2625 func rewriteValueS390X_OpHmul64_0(v *Value) bool {
   2626 	// match: (Hmul64 x y)
   2627 	// cond:
   2628 	// result: (MULHD  x y)
   2629 	for {
   2630 		_ = v.Args[1]
   2631 		x := v.Args[0]
   2632 		y := v.Args[1]
   2633 		v.reset(OpS390XMULHD)
   2634 		v.AddArg(x)
   2635 		v.AddArg(y)
   2636 		return true
   2637 	}
   2638 }
   2639 func rewriteValueS390X_OpHmul64u_0(v *Value) bool {
   2640 	// match: (Hmul64u x y)
   2641 	// cond:
   2642 	// result: (MULHDU x y)
   2643 	for {
   2644 		_ = v.Args[1]
   2645 		x := v.Args[0]
   2646 		y := v.Args[1]
   2647 		v.reset(OpS390XMULHDU)
   2648 		v.AddArg(x)
   2649 		v.AddArg(y)
   2650 		return true
   2651 	}
   2652 }
   2653 func rewriteValueS390X_OpITab_0(v *Value) bool {
   2654 	// match: (ITab (Load ptr mem))
   2655 	// cond:
   2656 	// result: (MOVDload ptr mem)
   2657 	for {
   2658 		v_0 := v.Args[0]
   2659 		if v_0.Op != OpLoad {
   2660 			break
   2661 		}
   2662 		_ = v_0.Args[1]
   2663 		ptr := v_0.Args[0]
   2664 		mem := v_0.Args[1]
   2665 		v.reset(OpS390XMOVDload)
   2666 		v.AddArg(ptr)
   2667 		v.AddArg(mem)
   2668 		return true
   2669 	}
   2670 	return false
   2671 }
   2672 func rewriteValueS390X_OpInterCall_0(v *Value) bool {
   2673 	// match: (InterCall [argwid] entry mem)
   2674 	// cond:
   2675 	// result: (CALLinter [argwid] entry mem)
   2676 	for {
   2677 		argwid := v.AuxInt
   2678 		_ = v.Args[1]
   2679 		entry := v.Args[0]
   2680 		mem := v.Args[1]
   2681 		v.reset(OpS390XCALLinter)
   2682 		v.AuxInt = argwid
   2683 		v.AddArg(entry)
   2684 		v.AddArg(mem)
   2685 		return true
   2686 	}
   2687 }
   2688 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool {
   2689 	b := v.Block
   2690 	_ = b
   2691 	typ := &b.Func.Config.Types
   2692 	_ = typ
   2693 	// match: (IsInBounds idx len)
   2694 	// cond:
   2695 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len))
   2696 	for {
   2697 		_ = v.Args[1]
   2698 		idx := v.Args[0]
   2699 		len := v.Args[1]
   2700 		v.reset(OpS390XMOVDLT)
   2701 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2702 		v0.AuxInt = 0
   2703 		v.AddArg(v0)
   2704 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2705 		v1.AuxInt = 1
   2706 		v.AddArg(v1)
   2707 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2708 		v2.AddArg(idx)
   2709 		v2.AddArg(len)
   2710 		v.AddArg(v2)
   2711 		return true
   2712 	}
   2713 }
   2714 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool {
   2715 	b := v.Block
   2716 	_ = b
   2717 	typ := &b.Func.Config.Types
   2718 	_ = typ
   2719 	// match: (IsNonNil p)
   2720 	// cond:
   2721 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0]))
   2722 	for {
   2723 		p := v.Args[0]
   2724 		v.reset(OpS390XMOVDNE)
   2725 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2726 		v0.AuxInt = 0
   2727 		v.AddArg(v0)
   2728 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2729 		v1.AuxInt = 1
   2730 		v.AddArg(v1)
   2731 		v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags)
   2732 		v2.AuxInt = 0
   2733 		v2.AddArg(p)
   2734 		v.AddArg(v2)
   2735 		return true
   2736 	}
   2737 }
   2738 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool {
   2739 	b := v.Block
   2740 	_ = b
   2741 	typ := &b.Func.Config.Types
   2742 	_ = typ
   2743 	// match: (IsSliceInBounds idx len)
   2744 	// cond:
   2745 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len))
   2746 	for {
   2747 		_ = v.Args[1]
   2748 		idx := v.Args[0]
   2749 		len := v.Args[1]
   2750 		v.reset(OpS390XMOVDLE)
   2751 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2752 		v0.AuxInt = 0
   2753 		v.AddArg(v0)
   2754 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2755 		v1.AuxInt = 1
   2756 		v.AddArg(v1)
   2757 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2758 		v2.AddArg(idx)
   2759 		v2.AddArg(len)
   2760 		v.AddArg(v2)
   2761 		return true
   2762 	}
   2763 }
   2764 func rewriteValueS390X_OpLeq16_0(v *Value) bool {
   2765 	b := v.Block
   2766 	_ = b
   2767 	typ := &b.Func.Config.Types
   2768 	_ = typ
   2769 	// match: (Leq16 x y)
   2770 	// cond:
   2771 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y)))
   2772 	for {
   2773 		_ = v.Args[1]
   2774 		x := v.Args[0]
   2775 		y := v.Args[1]
   2776 		v.reset(OpS390XMOVDLE)
   2777 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2778 		v0.AuxInt = 0
   2779 		v.AddArg(v0)
   2780 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2781 		v1.AuxInt = 1
   2782 		v.AddArg(v1)
   2783 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2784 		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   2785 		v3.AddArg(x)
   2786 		v2.AddArg(v3)
   2787 		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   2788 		v4.AddArg(y)
   2789 		v2.AddArg(v4)
   2790 		v.AddArg(v2)
   2791 		return true
   2792 	}
   2793 }
   2794 func rewriteValueS390X_OpLeq16U_0(v *Value) bool {
   2795 	b := v.Block
   2796 	_ = b
   2797 	typ := &b.Func.Config.Types
   2798 	_ = typ
   2799 	// match: (Leq16U x y)
   2800 	// cond:
   2801 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y)))
   2802 	for {
   2803 		_ = v.Args[1]
   2804 		x := v.Args[0]
   2805 		y := v.Args[1]
   2806 		v.reset(OpS390XMOVDLE)
   2807 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2808 		v0.AuxInt = 0
   2809 		v.AddArg(v0)
   2810 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2811 		v1.AuxInt = 1
   2812 		v.AddArg(v1)
   2813 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2814 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   2815 		v3.AddArg(x)
   2816 		v2.AddArg(v3)
   2817 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   2818 		v4.AddArg(y)
   2819 		v2.AddArg(v4)
   2820 		v.AddArg(v2)
   2821 		return true
   2822 	}
   2823 }
   2824 func rewriteValueS390X_OpLeq32_0(v *Value) bool {
   2825 	b := v.Block
   2826 	_ = b
   2827 	typ := &b.Func.Config.Types
   2828 	_ = typ
   2829 	// match: (Leq32 x y)
   2830 	// cond:
   2831 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
   2832 	for {
   2833 		_ = v.Args[1]
   2834 		x := v.Args[0]
   2835 		y := v.Args[1]
   2836 		v.reset(OpS390XMOVDLE)
   2837 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2838 		v0.AuxInt = 0
   2839 		v.AddArg(v0)
   2840 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2841 		v1.AuxInt = 1
   2842 		v.AddArg(v1)
   2843 		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
   2844 		v2.AddArg(x)
   2845 		v2.AddArg(y)
   2846 		v.AddArg(v2)
   2847 		return true
   2848 	}
   2849 }
   2850 func rewriteValueS390X_OpLeq32F_0(v *Value) bool {
   2851 	b := v.Block
   2852 	_ = b
   2853 	typ := &b.Func.Config.Types
   2854 	_ = typ
   2855 	// match: (Leq32F x y)
   2856 	// cond:
   2857 	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x))
   2858 	for {
   2859 		_ = v.Args[1]
   2860 		x := v.Args[0]
   2861 		y := v.Args[1]
   2862 		v.reset(OpS390XMOVDGEnoinv)
   2863 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2864 		v0.AuxInt = 0
   2865 		v.AddArg(v0)
   2866 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2867 		v1.AuxInt = 1
   2868 		v.AddArg(v1)
   2869 		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
   2870 		v2.AddArg(y)
   2871 		v2.AddArg(x)
   2872 		v.AddArg(v2)
   2873 		return true
   2874 	}
   2875 }
   2876 func rewriteValueS390X_OpLeq32U_0(v *Value) bool {
   2877 	b := v.Block
   2878 	_ = b
   2879 	typ := &b.Func.Config.Types
   2880 	_ = typ
   2881 	// match: (Leq32U x y)
   2882 	// cond:
   2883 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
   2884 	for {
   2885 		_ = v.Args[1]
   2886 		x := v.Args[0]
   2887 		y := v.Args[1]
   2888 		v.reset(OpS390XMOVDLE)
   2889 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2890 		v0.AuxInt = 0
   2891 		v.AddArg(v0)
   2892 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2893 		v1.AuxInt = 1
   2894 		v.AddArg(v1)
   2895 		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
   2896 		v2.AddArg(x)
   2897 		v2.AddArg(y)
   2898 		v.AddArg(v2)
   2899 		return true
   2900 	}
   2901 }
   2902 func rewriteValueS390X_OpLeq64_0(v *Value) bool {
   2903 	b := v.Block
   2904 	_ = b
   2905 	typ := &b.Func.Config.Types
   2906 	_ = typ
   2907 	// match: (Leq64 x y)
   2908 	// cond:
   2909 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   2910 	for {
   2911 		_ = v.Args[1]
   2912 		x := v.Args[0]
   2913 		y := v.Args[1]
   2914 		v.reset(OpS390XMOVDLE)
   2915 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2916 		v0.AuxInt = 0
   2917 		v.AddArg(v0)
   2918 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2919 		v1.AuxInt = 1
   2920 		v.AddArg(v1)
   2921 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   2922 		v2.AddArg(x)
   2923 		v2.AddArg(y)
   2924 		v.AddArg(v2)
   2925 		return true
   2926 	}
   2927 }
   2928 func rewriteValueS390X_OpLeq64F_0(v *Value) bool {
   2929 	b := v.Block
   2930 	_ = b
   2931 	typ := &b.Func.Config.Types
   2932 	_ = typ
   2933 	// match: (Leq64F x y)
   2934 	// cond:
   2935 	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x))
   2936 	for {
   2937 		_ = v.Args[1]
   2938 		x := v.Args[0]
   2939 		y := v.Args[1]
   2940 		v.reset(OpS390XMOVDGEnoinv)
   2941 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2942 		v0.AuxInt = 0
   2943 		v.AddArg(v0)
   2944 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2945 		v1.AuxInt = 1
   2946 		v.AddArg(v1)
   2947 		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
   2948 		v2.AddArg(y)
   2949 		v2.AddArg(x)
   2950 		v.AddArg(v2)
   2951 		return true
   2952 	}
   2953 }
   2954 func rewriteValueS390X_OpLeq64U_0(v *Value) bool {
   2955 	b := v.Block
   2956 	_ = b
   2957 	typ := &b.Func.Config.Types
   2958 	_ = typ
   2959 	// match: (Leq64U x y)
   2960 	// cond:
   2961 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
   2962 	for {
   2963 		_ = v.Args[1]
   2964 		x := v.Args[0]
   2965 		y := v.Args[1]
   2966 		v.reset(OpS390XMOVDLE)
   2967 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2968 		v0.AuxInt = 0
   2969 		v.AddArg(v0)
   2970 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2971 		v1.AuxInt = 1
   2972 		v.AddArg(v1)
   2973 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   2974 		v2.AddArg(x)
   2975 		v2.AddArg(y)
   2976 		v.AddArg(v2)
   2977 		return true
   2978 	}
   2979 }
   2980 func rewriteValueS390X_OpLeq8_0(v *Value) bool {
   2981 	b := v.Block
   2982 	_ = b
   2983 	typ := &b.Func.Config.Types
   2984 	_ = typ
   2985 	// match: (Leq8 x y)
   2986 	// cond:
   2987 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   2988 	for {
   2989 		_ = v.Args[1]
   2990 		x := v.Args[0]
   2991 		y := v.Args[1]
   2992 		v.reset(OpS390XMOVDLE)
   2993 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2994 		v0.AuxInt = 0
   2995 		v.AddArg(v0)
   2996 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   2997 		v1.AuxInt = 1
   2998 		v.AddArg(v1)
   2999 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   3000 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   3001 		v3.AddArg(x)
   3002 		v2.AddArg(v3)
   3003 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   3004 		v4.AddArg(y)
   3005 		v2.AddArg(v4)
   3006 		v.AddArg(v2)
   3007 		return true
   3008 	}
   3009 }
   3010 func rewriteValueS390X_OpLeq8U_0(v *Value) bool {
   3011 	b := v.Block
   3012 	_ = b
   3013 	typ := &b.Func.Config.Types
   3014 	_ = typ
   3015 	// match: (Leq8U x y)
   3016 	// cond:
   3017 	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y)))
   3018 	for {
   3019 		_ = v.Args[1]
   3020 		x := v.Args[0]
   3021 		y := v.Args[1]
   3022 		v.reset(OpS390XMOVDLE)
   3023 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3024 		v0.AuxInt = 0
   3025 		v.AddArg(v0)
   3026 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3027 		v1.AuxInt = 1
   3028 		v.AddArg(v1)
   3029 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   3030 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3031 		v3.AddArg(x)
   3032 		v2.AddArg(v3)
   3033 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3034 		v4.AddArg(y)
   3035 		v2.AddArg(v4)
   3036 		v.AddArg(v2)
   3037 		return true
   3038 	}
   3039 }
   3040 func rewriteValueS390X_OpLess16_0(v *Value) bool {
   3041 	b := v.Block
   3042 	_ = b
   3043 	typ := &b.Func.Config.Types
   3044 	_ = typ
   3045 	// match: (Less16 x y)
   3046 	// cond:
   3047 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y)))
   3048 	for {
   3049 		_ = v.Args[1]
   3050 		x := v.Args[0]
   3051 		y := v.Args[1]
   3052 		v.reset(OpS390XMOVDLT)
   3053 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3054 		v0.AuxInt = 0
   3055 		v.AddArg(v0)
   3056 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3057 		v1.AuxInt = 1
   3058 		v.AddArg(v1)
   3059 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   3060 		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   3061 		v3.AddArg(x)
   3062 		v2.AddArg(v3)
   3063 		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   3064 		v4.AddArg(y)
   3065 		v2.AddArg(v4)
   3066 		v.AddArg(v2)
   3067 		return true
   3068 	}
   3069 }
   3070 func rewriteValueS390X_OpLess16U_0(v *Value) bool {
   3071 	b := v.Block
   3072 	_ = b
   3073 	typ := &b.Func.Config.Types
   3074 	_ = typ
   3075 	// match: (Less16U x y)
   3076 	// cond:
   3077 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y)))
   3078 	for {
   3079 		_ = v.Args[1]
   3080 		x := v.Args[0]
   3081 		y := v.Args[1]
   3082 		v.reset(OpS390XMOVDLT)
   3083 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3084 		v0.AuxInt = 0
   3085 		v.AddArg(v0)
   3086 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3087 		v1.AuxInt = 1
   3088 		v.AddArg(v1)
   3089 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   3090 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3091 		v3.AddArg(x)
   3092 		v2.AddArg(v3)
   3093 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3094 		v4.AddArg(y)
   3095 		v2.AddArg(v4)
   3096 		v.AddArg(v2)
   3097 		return true
   3098 	}
   3099 }
   3100 func rewriteValueS390X_OpLess32_0(v *Value) bool {
   3101 	b := v.Block
   3102 	_ = b
   3103 	typ := &b.Func.Config.Types
   3104 	_ = typ
   3105 	// match: (Less32 x y)
   3106 	// cond:
   3107 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
   3108 	for {
   3109 		_ = v.Args[1]
   3110 		x := v.Args[0]
   3111 		y := v.Args[1]
   3112 		v.reset(OpS390XMOVDLT)
   3113 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3114 		v0.AuxInt = 0
   3115 		v.AddArg(v0)
   3116 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3117 		v1.AuxInt = 1
   3118 		v.AddArg(v1)
   3119 		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
   3120 		v2.AddArg(x)
   3121 		v2.AddArg(y)
   3122 		v.AddArg(v2)
   3123 		return true
   3124 	}
   3125 }
   3126 func rewriteValueS390X_OpLess32F_0(v *Value) bool {
   3127 	b := v.Block
   3128 	_ = b
   3129 	typ := &b.Func.Config.Types
   3130 	_ = typ
   3131 	// match: (Less32F x y)
   3132 	// cond:
   3133 	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x))
   3134 	for {
   3135 		_ = v.Args[1]
   3136 		x := v.Args[0]
   3137 		y := v.Args[1]
   3138 		v.reset(OpS390XMOVDGTnoinv)
   3139 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3140 		v0.AuxInt = 0
   3141 		v.AddArg(v0)
   3142 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3143 		v1.AuxInt = 1
   3144 		v.AddArg(v1)
   3145 		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
   3146 		v2.AddArg(y)
   3147 		v2.AddArg(x)
   3148 		v.AddArg(v2)
   3149 		return true
   3150 	}
   3151 }
   3152 func rewriteValueS390X_OpLess32U_0(v *Value) bool {
   3153 	b := v.Block
   3154 	_ = b
   3155 	typ := &b.Func.Config.Types
   3156 	_ = typ
   3157 	// match: (Less32U x y)
   3158 	// cond:
   3159 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
   3160 	for {
   3161 		_ = v.Args[1]
   3162 		x := v.Args[0]
   3163 		y := v.Args[1]
   3164 		v.reset(OpS390XMOVDLT)
   3165 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3166 		v0.AuxInt = 0
   3167 		v.AddArg(v0)
   3168 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3169 		v1.AuxInt = 1
   3170 		v.AddArg(v1)
   3171 		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
   3172 		v2.AddArg(x)
   3173 		v2.AddArg(y)
   3174 		v.AddArg(v2)
   3175 		return true
   3176 	}
   3177 }
   3178 func rewriteValueS390X_OpLess64_0(v *Value) bool {
   3179 	b := v.Block
   3180 	_ = b
   3181 	typ := &b.Func.Config.Types
   3182 	_ = typ
   3183 	// match: (Less64 x y)
   3184 	// cond:
   3185 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   3186 	for {
   3187 		_ = v.Args[1]
   3188 		x := v.Args[0]
   3189 		y := v.Args[1]
   3190 		v.reset(OpS390XMOVDLT)
   3191 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3192 		v0.AuxInt = 0
   3193 		v.AddArg(v0)
   3194 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3195 		v1.AuxInt = 1
   3196 		v.AddArg(v1)
   3197 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   3198 		v2.AddArg(x)
   3199 		v2.AddArg(y)
   3200 		v.AddArg(v2)
   3201 		return true
   3202 	}
   3203 }
   3204 func rewriteValueS390X_OpLess64F_0(v *Value) bool {
   3205 	b := v.Block
   3206 	_ = b
   3207 	typ := &b.Func.Config.Types
   3208 	_ = typ
   3209 	// match: (Less64F x y)
   3210 	// cond:
   3211 	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x))
   3212 	for {
   3213 		_ = v.Args[1]
   3214 		x := v.Args[0]
   3215 		y := v.Args[1]
   3216 		v.reset(OpS390XMOVDGTnoinv)
   3217 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3218 		v0.AuxInt = 0
   3219 		v.AddArg(v0)
   3220 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3221 		v1.AuxInt = 1
   3222 		v.AddArg(v1)
   3223 		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
   3224 		v2.AddArg(y)
   3225 		v2.AddArg(x)
   3226 		v.AddArg(v2)
   3227 		return true
   3228 	}
   3229 }
   3230 func rewriteValueS390X_OpLess64U_0(v *Value) bool {
   3231 	b := v.Block
   3232 	_ = b
   3233 	typ := &b.Func.Config.Types
   3234 	_ = typ
   3235 	// match: (Less64U x y)
   3236 	// cond:
   3237 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
   3238 	for {
   3239 		_ = v.Args[1]
   3240 		x := v.Args[0]
   3241 		y := v.Args[1]
   3242 		v.reset(OpS390XMOVDLT)
   3243 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3244 		v0.AuxInt = 0
   3245 		v.AddArg(v0)
   3246 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3247 		v1.AuxInt = 1
   3248 		v.AddArg(v1)
   3249 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   3250 		v2.AddArg(x)
   3251 		v2.AddArg(y)
   3252 		v.AddArg(v2)
   3253 		return true
   3254 	}
   3255 }
   3256 func rewriteValueS390X_OpLess8_0(v *Value) bool {
   3257 	b := v.Block
   3258 	_ = b
   3259 	typ := &b.Func.Config.Types
   3260 	_ = typ
   3261 	// match: (Less8 x y)
   3262 	// cond:
   3263 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   3264 	for {
   3265 		_ = v.Args[1]
   3266 		x := v.Args[0]
   3267 		y := v.Args[1]
   3268 		v.reset(OpS390XMOVDLT)
   3269 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3270 		v0.AuxInt = 0
   3271 		v.AddArg(v0)
   3272 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3273 		v1.AuxInt = 1
   3274 		v.AddArg(v1)
   3275 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   3276 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   3277 		v3.AddArg(x)
   3278 		v2.AddArg(v3)
   3279 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   3280 		v4.AddArg(y)
   3281 		v2.AddArg(v4)
   3282 		v.AddArg(v2)
   3283 		return true
   3284 	}
   3285 }
   3286 func rewriteValueS390X_OpLess8U_0(v *Value) bool {
   3287 	b := v.Block
   3288 	_ = b
   3289 	typ := &b.Func.Config.Types
   3290 	_ = typ
   3291 	// match: (Less8U x y)
   3292 	// cond:
   3293 	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y)))
   3294 	for {
   3295 		_ = v.Args[1]
   3296 		x := v.Args[0]
   3297 		y := v.Args[1]
   3298 		v.reset(OpS390XMOVDLT)
   3299 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3300 		v0.AuxInt = 0
   3301 		v.AddArg(v0)
   3302 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   3303 		v1.AuxInt = 1
   3304 		v.AddArg(v1)
   3305 		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
   3306 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3307 		v3.AddArg(x)
   3308 		v2.AddArg(v3)
   3309 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3310 		v4.AddArg(y)
   3311 		v2.AddArg(v4)
   3312 		v.AddArg(v2)
   3313 		return true
   3314 	}
   3315 }
   3316 func rewriteValueS390X_OpLoad_0(v *Value) bool {
   3317 	// match: (Load <t> ptr mem)
   3318 	// cond: (is64BitInt(t) || isPtr(t))
   3319 	// result: (MOVDload ptr mem)
   3320 	for {
   3321 		t := v.Type
   3322 		_ = v.Args[1]
   3323 		ptr := v.Args[0]
   3324 		mem := v.Args[1]
   3325 		if !(is64BitInt(t) || isPtr(t)) {
   3326 			break
   3327 		}
   3328 		v.reset(OpS390XMOVDload)
   3329 		v.AddArg(ptr)
   3330 		v.AddArg(mem)
   3331 		return true
   3332 	}
   3333 	// match: (Load <t> ptr mem)
   3334 	// cond: is32BitInt(t) && isSigned(t)
   3335 	// result: (MOVWload ptr mem)
   3336 	for {
   3337 		t := v.Type
   3338 		_ = v.Args[1]
   3339 		ptr := v.Args[0]
   3340 		mem := v.Args[1]
   3341 		if !(is32BitInt(t) && isSigned(t)) {
   3342 			break
   3343 		}
   3344 		v.reset(OpS390XMOVWload)
   3345 		v.AddArg(ptr)
   3346 		v.AddArg(mem)
   3347 		return true
   3348 	}
   3349 	// match: (Load <t> ptr mem)
   3350 	// cond: is32BitInt(t) && !isSigned(t)
   3351 	// result: (MOVWZload ptr mem)
   3352 	for {
   3353 		t := v.Type
   3354 		_ = v.Args[1]
   3355 		ptr := v.Args[0]
   3356 		mem := v.Args[1]
   3357 		if !(is32BitInt(t) && !isSigned(t)) {
   3358 			break
   3359 		}
   3360 		v.reset(OpS390XMOVWZload)
   3361 		v.AddArg(ptr)
   3362 		v.AddArg(mem)
   3363 		return true
   3364 	}
   3365 	// match: (Load <t> ptr mem)
   3366 	// cond: is16BitInt(t) && isSigned(t)
   3367 	// result: (MOVHload ptr mem)
   3368 	for {
   3369 		t := v.Type
   3370 		_ = v.Args[1]
   3371 		ptr := v.Args[0]
   3372 		mem := v.Args[1]
   3373 		if !(is16BitInt(t) && isSigned(t)) {
   3374 			break
   3375 		}
   3376 		v.reset(OpS390XMOVHload)
   3377 		v.AddArg(ptr)
   3378 		v.AddArg(mem)
   3379 		return true
   3380 	}
   3381 	// match: (Load <t> ptr mem)
   3382 	// cond: is16BitInt(t) && !isSigned(t)
   3383 	// result: (MOVHZload ptr mem)
   3384 	for {
   3385 		t := v.Type
   3386 		_ = v.Args[1]
   3387 		ptr := v.Args[0]
   3388 		mem := v.Args[1]
   3389 		if !(is16BitInt(t) && !isSigned(t)) {
   3390 			break
   3391 		}
   3392 		v.reset(OpS390XMOVHZload)
   3393 		v.AddArg(ptr)
   3394 		v.AddArg(mem)
   3395 		return true
   3396 	}
   3397 	// match: (Load <t> ptr mem)
   3398 	// cond: is8BitInt(t) && isSigned(t)
   3399 	// result: (MOVBload ptr mem)
   3400 	for {
   3401 		t := v.Type
   3402 		_ = v.Args[1]
   3403 		ptr := v.Args[0]
   3404 		mem := v.Args[1]
   3405 		if !(is8BitInt(t) && isSigned(t)) {
   3406 			break
   3407 		}
   3408 		v.reset(OpS390XMOVBload)
   3409 		v.AddArg(ptr)
   3410 		v.AddArg(mem)
   3411 		return true
   3412 	}
   3413 	// match: (Load <t> ptr mem)
   3414 	// cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t)))
   3415 	// result: (MOVBZload ptr mem)
   3416 	for {
   3417 		t := v.Type
   3418 		_ = v.Args[1]
   3419 		ptr := v.Args[0]
   3420 		mem := v.Args[1]
   3421 		if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) {
   3422 			break
   3423 		}
   3424 		v.reset(OpS390XMOVBZload)
   3425 		v.AddArg(ptr)
   3426 		v.AddArg(mem)
   3427 		return true
   3428 	}
   3429 	// match: (Load <t> ptr mem)
   3430 	// cond: is32BitFloat(t)
   3431 	// result: (FMOVSload ptr mem)
   3432 	for {
   3433 		t := v.Type
   3434 		_ = v.Args[1]
   3435 		ptr := v.Args[0]
   3436 		mem := v.Args[1]
   3437 		if !(is32BitFloat(t)) {
   3438 			break
   3439 		}
   3440 		v.reset(OpS390XFMOVSload)
   3441 		v.AddArg(ptr)
   3442 		v.AddArg(mem)
   3443 		return true
   3444 	}
   3445 	// match: (Load <t> ptr mem)
   3446 	// cond: is64BitFloat(t)
   3447 	// result: (FMOVDload ptr mem)
   3448 	for {
   3449 		t := v.Type
   3450 		_ = v.Args[1]
   3451 		ptr := v.Args[0]
   3452 		mem := v.Args[1]
   3453 		if !(is64BitFloat(t)) {
   3454 			break
   3455 		}
   3456 		v.reset(OpS390XFMOVDload)
   3457 		v.AddArg(ptr)
   3458 		v.AddArg(mem)
   3459 		return true
   3460 	}
   3461 	return false
   3462 }
   3463 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool {
   3464 	b := v.Block
   3465 	_ = b
   3466 	typ := &b.Func.Config.Types
   3467 	_ = typ
   3468 	// match: (Lsh16x16 <t> x y)
   3469 	// cond:
   3470 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31])))
   3471 	for {
   3472 		t := v.Type
   3473 		_ = v.Args[1]
   3474 		x := v.Args[0]
   3475 		y := v.Args[1]
   3476 		v.reset(OpS390XANDW)
   3477 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3478 		v0.AddArg(x)
   3479 		v0.AddArg(y)
   3480 		v.AddArg(v0)
   3481 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3482 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3483 		v2.AuxInt = 31
   3484 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3485 		v3.AddArg(y)
   3486 		v2.AddArg(v3)
   3487 		v1.AddArg(v2)
   3488 		v.AddArg(v1)
   3489 		return true
   3490 	}
   3491 }
   3492 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool {
   3493 	b := v.Block
   3494 	_ = b
   3495 	// match: (Lsh16x32 <t> x y)
   3496 	// cond:
   3497 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31])))
   3498 	for {
   3499 		t := v.Type
   3500 		_ = v.Args[1]
   3501 		x := v.Args[0]
   3502 		y := v.Args[1]
   3503 		v.reset(OpS390XANDW)
   3504 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3505 		v0.AddArg(x)
   3506 		v0.AddArg(y)
   3507 		v.AddArg(v0)
   3508 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3509 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3510 		v2.AuxInt = 31
   3511 		v2.AddArg(y)
   3512 		v1.AddArg(v2)
   3513 		v.AddArg(v1)
   3514 		return true
   3515 	}
   3516 }
   3517 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool {
   3518 	b := v.Block
   3519 	_ = b
   3520 	// match: (Lsh16x64 <t> x y)
   3521 	// cond:
   3522 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31])))
   3523 	for {
   3524 		t := v.Type
   3525 		_ = v.Args[1]
   3526 		x := v.Args[0]
   3527 		y := v.Args[1]
   3528 		v.reset(OpS390XANDW)
   3529 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3530 		v0.AddArg(x)
   3531 		v0.AddArg(y)
   3532 		v.AddArg(v0)
   3533 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3534 		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   3535 		v2.AuxInt = 31
   3536 		v2.AddArg(y)
   3537 		v1.AddArg(v2)
   3538 		v.AddArg(v1)
   3539 		return true
   3540 	}
   3541 }
   3542 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool {
   3543 	b := v.Block
   3544 	_ = b
   3545 	typ := &b.Func.Config.Types
   3546 	_ = typ
   3547 	// match: (Lsh16x8 <t> x y)
   3548 	// cond:
   3549 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31])))
   3550 	for {
   3551 		t := v.Type
   3552 		_ = v.Args[1]
   3553 		x := v.Args[0]
   3554 		y := v.Args[1]
   3555 		v.reset(OpS390XANDW)
   3556 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3557 		v0.AddArg(x)
   3558 		v0.AddArg(y)
   3559 		v.AddArg(v0)
   3560 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3561 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3562 		v2.AuxInt = 31
   3563 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3564 		v3.AddArg(y)
   3565 		v2.AddArg(v3)
   3566 		v1.AddArg(v2)
   3567 		v.AddArg(v1)
   3568 		return true
   3569 	}
   3570 }
   3571 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool {
   3572 	b := v.Block
   3573 	_ = b
   3574 	typ := &b.Func.Config.Types
   3575 	_ = typ
   3576 	// match: (Lsh32x16 <t> x y)
   3577 	// cond:
   3578 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31])))
   3579 	for {
   3580 		t := v.Type
   3581 		_ = v.Args[1]
   3582 		x := v.Args[0]
   3583 		y := v.Args[1]
   3584 		v.reset(OpS390XANDW)
   3585 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3586 		v0.AddArg(x)
   3587 		v0.AddArg(y)
   3588 		v.AddArg(v0)
   3589 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3590 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3591 		v2.AuxInt = 31
   3592 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3593 		v3.AddArg(y)
   3594 		v2.AddArg(v3)
   3595 		v1.AddArg(v2)
   3596 		v.AddArg(v1)
   3597 		return true
   3598 	}
   3599 }
   3600 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool {
   3601 	b := v.Block
   3602 	_ = b
   3603 	// match: (Lsh32x32 <t> x y)
   3604 	// cond:
   3605 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31])))
   3606 	for {
   3607 		t := v.Type
   3608 		_ = v.Args[1]
   3609 		x := v.Args[0]
   3610 		y := v.Args[1]
   3611 		v.reset(OpS390XANDW)
   3612 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3613 		v0.AddArg(x)
   3614 		v0.AddArg(y)
   3615 		v.AddArg(v0)
   3616 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3617 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3618 		v2.AuxInt = 31
   3619 		v2.AddArg(y)
   3620 		v1.AddArg(v2)
   3621 		v.AddArg(v1)
   3622 		return true
   3623 	}
   3624 }
   3625 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool {
   3626 	b := v.Block
   3627 	_ = b
   3628 	// match: (Lsh32x64 <t> x y)
   3629 	// cond:
   3630 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31])))
   3631 	for {
   3632 		t := v.Type
   3633 		_ = v.Args[1]
   3634 		x := v.Args[0]
   3635 		y := v.Args[1]
   3636 		v.reset(OpS390XANDW)
   3637 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3638 		v0.AddArg(x)
   3639 		v0.AddArg(y)
   3640 		v.AddArg(v0)
   3641 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3642 		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   3643 		v2.AuxInt = 31
   3644 		v2.AddArg(y)
   3645 		v1.AddArg(v2)
   3646 		v.AddArg(v1)
   3647 		return true
   3648 	}
   3649 }
   3650 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool {
   3651 	b := v.Block
   3652 	_ = b
   3653 	typ := &b.Func.Config.Types
   3654 	_ = typ
   3655 	// match: (Lsh32x8 <t> x y)
   3656 	// cond:
   3657 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31])))
   3658 	for {
   3659 		t := v.Type
   3660 		_ = v.Args[1]
   3661 		x := v.Args[0]
   3662 		y := v.Args[1]
   3663 		v.reset(OpS390XANDW)
   3664 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3665 		v0.AddArg(x)
   3666 		v0.AddArg(y)
   3667 		v.AddArg(v0)
   3668 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3669 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3670 		v2.AuxInt = 31
   3671 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3672 		v3.AddArg(y)
   3673 		v2.AddArg(v3)
   3674 		v1.AddArg(v2)
   3675 		v.AddArg(v1)
   3676 		return true
   3677 	}
   3678 }
   3679 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool {
   3680 	b := v.Block
   3681 	_ = b
   3682 	typ := &b.Func.Config.Types
   3683 	_ = typ
   3684 	// match: (Lsh64x16 <t> x y)
   3685 	// cond:
   3686 	// result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63])))
   3687 	for {
   3688 		t := v.Type
   3689 		_ = v.Args[1]
   3690 		x := v.Args[0]
   3691 		y := v.Args[1]
   3692 		v.reset(OpS390XAND)
   3693 		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
   3694 		v0.AddArg(x)
   3695 		v0.AddArg(y)
   3696 		v.AddArg(v0)
   3697 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   3698 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3699 		v2.AuxInt = 63
   3700 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3701 		v3.AddArg(y)
   3702 		v2.AddArg(v3)
   3703 		v1.AddArg(v2)
   3704 		v.AddArg(v1)
   3705 		return true
   3706 	}
   3707 }
   3708 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool {
   3709 	b := v.Block
   3710 	_ = b
   3711 	// match: (Lsh64x32 <t> x y)
   3712 	// cond:
   3713 	// result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63])))
   3714 	for {
   3715 		t := v.Type
   3716 		_ = v.Args[1]
   3717 		x := v.Args[0]
   3718 		y := v.Args[1]
   3719 		v.reset(OpS390XAND)
   3720 		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
   3721 		v0.AddArg(x)
   3722 		v0.AddArg(y)
   3723 		v.AddArg(v0)
   3724 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   3725 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3726 		v2.AuxInt = 63
   3727 		v2.AddArg(y)
   3728 		v1.AddArg(v2)
   3729 		v.AddArg(v1)
   3730 		return true
   3731 	}
   3732 }
   3733 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool {
   3734 	b := v.Block
   3735 	_ = b
   3736 	// match: (Lsh64x64 <t> x y)
   3737 	// cond:
   3738 	// result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63])))
   3739 	for {
   3740 		t := v.Type
   3741 		_ = v.Args[1]
   3742 		x := v.Args[0]
   3743 		y := v.Args[1]
   3744 		v.reset(OpS390XAND)
   3745 		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
   3746 		v0.AddArg(x)
   3747 		v0.AddArg(y)
   3748 		v.AddArg(v0)
   3749 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   3750 		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   3751 		v2.AuxInt = 63
   3752 		v2.AddArg(y)
   3753 		v1.AddArg(v2)
   3754 		v.AddArg(v1)
   3755 		return true
   3756 	}
   3757 }
   3758 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool {
   3759 	b := v.Block
   3760 	_ = b
   3761 	typ := &b.Func.Config.Types
   3762 	_ = typ
   3763 	// match: (Lsh64x8 <t> x y)
   3764 	// cond:
   3765 	// result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63])))
   3766 	for {
   3767 		t := v.Type
   3768 		_ = v.Args[1]
   3769 		x := v.Args[0]
   3770 		y := v.Args[1]
   3771 		v.reset(OpS390XAND)
   3772 		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
   3773 		v0.AddArg(x)
   3774 		v0.AddArg(y)
   3775 		v.AddArg(v0)
   3776 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   3777 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3778 		v2.AuxInt = 63
   3779 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3780 		v3.AddArg(y)
   3781 		v2.AddArg(v3)
   3782 		v1.AddArg(v2)
   3783 		v.AddArg(v1)
   3784 		return true
   3785 	}
   3786 }
   3787 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool {
   3788 	b := v.Block
   3789 	_ = b
   3790 	typ := &b.Func.Config.Types
   3791 	_ = typ
   3792 	// match: (Lsh8x16 <t> x y)
   3793 	// cond:
   3794 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31])))
   3795 	for {
   3796 		t := v.Type
   3797 		_ = v.Args[1]
   3798 		x := v.Args[0]
   3799 		y := v.Args[1]
   3800 		v.reset(OpS390XANDW)
   3801 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3802 		v0.AddArg(x)
   3803 		v0.AddArg(y)
   3804 		v.AddArg(v0)
   3805 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3806 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3807 		v2.AuxInt = 31
   3808 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3809 		v3.AddArg(y)
   3810 		v2.AddArg(v3)
   3811 		v1.AddArg(v2)
   3812 		v.AddArg(v1)
   3813 		return true
   3814 	}
   3815 }
   3816 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool {
   3817 	b := v.Block
   3818 	_ = b
   3819 	// match: (Lsh8x32 <t> x y)
   3820 	// cond:
   3821 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31])))
   3822 	for {
   3823 		t := v.Type
   3824 		_ = v.Args[1]
   3825 		x := v.Args[0]
   3826 		y := v.Args[1]
   3827 		v.reset(OpS390XANDW)
   3828 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3829 		v0.AddArg(x)
   3830 		v0.AddArg(y)
   3831 		v.AddArg(v0)
   3832 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3833 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3834 		v2.AuxInt = 31
   3835 		v2.AddArg(y)
   3836 		v1.AddArg(v2)
   3837 		v.AddArg(v1)
   3838 		return true
   3839 	}
   3840 }
   3841 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool {
   3842 	b := v.Block
   3843 	_ = b
   3844 	// match: (Lsh8x64 <t> x y)
   3845 	// cond:
   3846 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31])))
   3847 	for {
   3848 		t := v.Type
   3849 		_ = v.Args[1]
   3850 		x := v.Args[0]
   3851 		y := v.Args[1]
   3852 		v.reset(OpS390XANDW)
   3853 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3854 		v0.AddArg(x)
   3855 		v0.AddArg(y)
   3856 		v.AddArg(v0)
   3857 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3858 		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   3859 		v2.AuxInt = 31
   3860 		v2.AddArg(y)
   3861 		v1.AddArg(v2)
   3862 		v.AddArg(v1)
   3863 		return true
   3864 	}
   3865 }
   3866 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool {
   3867 	b := v.Block
   3868 	_ = b
   3869 	typ := &b.Func.Config.Types
   3870 	_ = typ
   3871 	// match: (Lsh8x8 <t> x y)
   3872 	// cond:
   3873 	// result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31])))
   3874 	for {
   3875 		t := v.Type
   3876 		_ = v.Args[1]
   3877 		x := v.Args[0]
   3878 		y := v.Args[1]
   3879 		v.reset(OpS390XANDW)
   3880 		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
   3881 		v0.AddArg(x)
   3882 		v0.AddArg(y)
   3883 		v.AddArg(v0)
   3884 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   3885 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   3886 		v2.AuxInt = 31
   3887 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   3888 		v3.AddArg(y)
   3889 		v2.AddArg(v3)
   3890 		v1.AddArg(v2)
   3891 		v.AddArg(v1)
   3892 		return true
   3893 	}
   3894 }
   3895 func rewriteValueS390X_OpMod16_0(v *Value) bool {
   3896 	b := v.Block
   3897 	_ = b
   3898 	typ := &b.Func.Config.Types
   3899 	_ = typ
   3900 	// match: (Mod16 x y)
   3901 	// cond:
   3902 	// result: (MODW  (MOVHreg x) (MOVHreg y))
   3903 	for {
   3904 		_ = v.Args[1]
   3905 		x := v.Args[0]
   3906 		y := v.Args[1]
   3907 		v.reset(OpS390XMODW)
   3908 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   3909 		v0.AddArg(x)
   3910 		v.AddArg(v0)
   3911 		v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   3912 		v1.AddArg(y)
   3913 		v.AddArg(v1)
   3914 		return true
   3915 	}
   3916 }
   3917 func rewriteValueS390X_OpMod16u_0(v *Value) bool {
   3918 	b := v.Block
   3919 	_ = b
   3920 	typ := &b.Func.Config.Types
   3921 	_ = typ
   3922 	// match: (Mod16u x y)
   3923 	// cond:
   3924 	// result: (MODWU (MOVHZreg x) (MOVHZreg y))
   3925 	for {
   3926 		_ = v.Args[1]
   3927 		x := v.Args[0]
   3928 		y := v.Args[1]
   3929 		v.reset(OpS390XMODWU)
   3930 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3931 		v0.AddArg(x)
   3932 		v.AddArg(v0)
   3933 		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   3934 		v1.AddArg(y)
   3935 		v.AddArg(v1)
   3936 		return true
   3937 	}
   3938 }
   3939 func rewriteValueS390X_OpMod32_0(v *Value) bool {
   3940 	b := v.Block
   3941 	_ = b
   3942 	typ := &b.Func.Config.Types
   3943 	_ = typ
   3944 	// match: (Mod32 x y)
   3945 	// cond:
   3946 	// result: (MODW  (MOVWreg x) y)
   3947 	for {
   3948 		_ = v.Args[1]
   3949 		x := v.Args[0]
   3950 		y := v.Args[1]
   3951 		v.reset(OpS390XMODW)
   3952 		v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
   3953 		v0.AddArg(x)
   3954 		v.AddArg(v0)
   3955 		v.AddArg(y)
   3956 		return true
   3957 	}
   3958 }
   3959 func rewriteValueS390X_OpMod32u_0(v *Value) bool {
   3960 	b := v.Block
   3961 	_ = b
   3962 	typ := &b.Func.Config.Types
   3963 	_ = typ
   3964 	// match: (Mod32u x y)
   3965 	// cond:
   3966 	// result: (MODWU (MOVWZreg x) y)
   3967 	for {
   3968 		_ = v.Args[1]
   3969 		x := v.Args[0]
   3970 		y := v.Args[1]
   3971 		v.reset(OpS390XMODWU)
   3972 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   3973 		v0.AddArg(x)
   3974 		v.AddArg(v0)
   3975 		v.AddArg(y)
   3976 		return true
   3977 	}
   3978 }
   3979 func rewriteValueS390X_OpMod64_0(v *Value) bool {
   3980 	// match: (Mod64 x y)
   3981 	// cond:
   3982 	// result: (MODD  x y)
   3983 	for {
   3984 		_ = v.Args[1]
   3985 		x := v.Args[0]
   3986 		y := v.Args[1]
   3987 		v.reset(OpS390XMODD)
   3988 		v.AddArg(x)
   3989 		v.AddArg(y)
   3990 		return true
   3991 	}
   3992 }
   3993 func rewriteValueS390X_OpMod64u_0(v *Value) bool {
   3994 	// match: (Mod64u x y)
   3995 	// cond:
   3996 	// result: (MODDU x y)
   3997 	for {
   3998 		_ = v.Args[1]
   3999 		x := v.Args[0]
   4000 		y := v.Args[1]
   4001 		v.reset(OpS390XMODDU)
   4002 		v.AddArg(x)
   4003 		v.AddArg(y)
   4004 		return true
   4005 	}
   4006 }
   4007 func rewriteValueS390X_OpMod8_0(v *Value) bool {
   4008 	b := v.Block
   4009 	_ = b
   4010 	typ := &b.Func.Config.Types
   4011 	_ = typ
   4012 	// match: (Mod8 x y)
   4013 	// cond:
   4014 	// result: (MODW  (MOVBreg x) (MOVBreg y))
   4015 	for {
   4016 		_ = v.Args[1]
   4017 		x := v.Args[0]
   4018 		y := v.Args[1]
   4019 		v.reset(OpS390XMODW)
   4020 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4021 		v0.AddArg(x)
   4022 		v.AddArg(v0)
   4023 		v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4024 		v1.AddArg(y)
   4025 		v.AddArg(v1)
   4026 		return true
   4027 	}
   4028 }
   4029 func rewriteValueS390X_OpMod8u_0(v *Value) bool {
   4030 	b := v.Block
   4031 	_ = b
   4032 	typ := &b.Func.Config.Types
   4033 	_ = typ
   4034 	// match: (Mod8u x y)
   4035 	// cond:
   4036 	// result: (MODWU (MOVBZreg x) (MOVBZreg y))
   4037 	for {
   4038 		_ = v.Args[1]
   4039 		x := v.Args[0]
   4040 		y := v.Args[1]
   4041 		v.reset(OpS390XMODWU)
   4042 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   4043 		v0.AddArg(x)
   4044 		v.AddArg(v0)
   4045 		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   4046 		v1.AddArg(y)
   4047 		v.AddArg(v1)
   4048 		return true
   4049 	}
   4050 }
   4051 func rewriteValueS390X_OpMove_0(v *Value) bool {
   4052 	b := v.Block
   4053 	_ = b
   4054 	typ := &b.Func.Config.Types
   4055 	_ = typ
   4056 	// match: (Move [0] _ _ mem)
   4057 	// cond:
   4058 	// result: mem
   4059 	for {
   4060 		if v.AuxInt != 0 {
   4061 			break
   4062 		}
   4063 		_ = v.Args[2]
   4064 		mem := v.Args[2]
   4065 		v.reset(OpCopy)
   4066 		v.Type = mem.Type
   4067 		v.AddArg(mem)
   4068 		return true
   4069 	}
   4070 	// match: (Move [1] dst src mem)
   4071 	// cond:
   4072 	// result: (MOVBstore dst (MOVBZload src mem) mem)
   4073 	for {
   4074 		if v.AuxInt != 1 {
   4075 			break
   4076 		}
   4077 		_ = v.Args[2]
   4078 		dst := v.Args[0]
   4079 		src := v.Args[1]
   4080 		mem := v.Args[2]
   4081 		v.reset(OpS390XMOVBstore)
   4082 		v.AddArg(dst)
   4083 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
   4084 		v0.AddArg(src)
   4085 		v0.AddArg(mem)
   4086 		v.AddArg(v0)
   4087 		v.AddArg(mem)
   4088 		return true
   4089 	}
   4090 	// match: (Move [2] dst src mem)
   4091 	// cond:
   4092 	// result: (MOVHstore dst (MOVHZload src mem) mem)
   4093 	for {
   4094 		if v.AuxInt != 2 {
   4095 			break
   4096 		}
   4097 		_ = v.Args[2]
   4098 		dst := v.Args[0]
   4099 		src := v.Args[1]
   4100 		mem := v.Args[2]
   4101 		v.reset(OpS390XMOVHstore)
   4102 		v.AddArg(dst)
   4103 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   4104 		v0.AddArg(src)
   4105 		v0.AddArg(mem)
   4106 		v.AddArg(v0)
   4107 		v.AddArg(mem)
   4108 		return true
   4109 	}
   4110 	// match: (Move [4] dst src mem)
   4111 	// cond:
   4112 	// result: (MOVWstore dst (MOVWZload src mem) mem)
   4113 	for {
   4114 		if v.AuxInt != 4 {
   4115 			break
   4116 		}
   4117 		_ = v.Args[2]
   4118 		dst := v.Args[0]
   4119 		src := v.Args[1]
   4120 		mem := v.Args[2]
   4121 		v.reset(OpS390XMOVWstore)
   4122 		v.AddArg(dst)
   4123 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   4124 		v0.AddArg(src)
   4125 		v0.AddArg(mem)
   4126 		v.AddArg(v0)
   4127 		v.AddArg(mem)
   4128 		return true
   4129 	}
   4130 	// match: (Move [8] dst src mem)
   4131 	// cond:
   4132 	// result: (MOVDstore dst (MOVDload src mem) mem)
   4133 	for {
   4134 		if v.AuxInt != 8 {
   4135 			break
   4136 		}
   4137 		_ = v.Args[2]
   4138 		dst := v.Args[0]
   4139 		src := v.Args[1]
   4140 		mem := v.Args[2]
   4141 		v.reset(OpS390XMOVDstore)
   4142 		v.AddArg(dst)
   4143 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   4144 		v0.AddArg(src)
   4145 		v0.AddArg(mem)
   4146 		v.AddArg(v0)
   4147 		v.AddArg(mem)
   4148 		return true
   4149 	}
   4150 	// match: (Move [16] dst src mem)
   4151 	// cond:
   4152 	// result: (MOVDstore [8] dst (MOVDload [8] src mem) 		(MOVDstore dst (MOVDload src mem) mem))
   4153 	for {
   4154 		if v.AuxInt != 16 {
   4155 			break
   4156 		}
   4157 		_ = v.Args[2]
   4158 		dst := v.Args[0]
   4159 		src := v.Args[1]
   4160 		mem := v.Args[2]
   4161 		v.reset(OpS390XMOVDstore)
   4162 		v.AuxInt = 8
   4163 		v.AddArg(dst)
   4164 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   4165 		v0.AuxInt = 8
   4166 		v0.AddArg(src)
   4167 		v0.AddArg(mem)
   4168 		v.AddArg(v0)
   4169 		v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem)
   4170 		v1.AddArg(dst)
   4171 		v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   4172 		v2.AddArg(src)
   4173 		v2.AddArg(mem)
   4174 		v1.AddArg(v2)
   4175 		v1.AddArg(mem)
   4176 		v.AddArg(v1)
   4177 		return true
   4178 	}
   4179 	// match: (Move [24] dst src mem)
   4180 	// cond:
   4181 	// result: (MOVDstore [16] dst (MOVDload [16] src mem) 	        (MOVDstore [8] dst (MOVDload [8] src mem)                 (MOVDstore dst (MOVDload src mem) mem)))
   4182 	for {
   4183 		if v.AuxInt != 24 {
   4184 			break
   4185 		}
   4186 		_ = v.Args[2]
   4187 		dst := v.Args[0]
   4188 		src := v.Args[1]
   4189 		mem := v.Args[2]
   4190 		v.reset(OpS390XMOVDstore)
   4191 		v.AuxInt = 16
   4192 		v.AddArg(dst)
   4193 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   4194 		v0.AuxInt = 16
   4195 		v0.AddArg(src)
   4196 		v0.AddArg(mem)
   4197 		v.AddArg(v0)
   4198 		v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem)
   4199 		v1.AuxInt = 8
   4200 		v1.AddArg(dst)
   4201 		v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   4202 		v2.AuxInt = 8
   4203 		v2.AddArg(src)
   4204 		v2.AddArg(mem)
   4205 		v1.AddArg(v2)
   4206 		v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem)
   4207 		v3.AddArg(dst)
   4208 		v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   4209 		v4.AddArg(src)
   4210 		v4.AddArg(mem)
   4211 		v3.AddArg(v4)
   4212 		v3.AddArg(mem)
   4213 		v1.AddArg(v3)
   4214 		v.AddArg(v1)
   4215 		return true
   4216 	}
   4217 	// match: (Move [3] dst src mem)
   4218 	// cond:
   4219 	// result: (MOVBstore [2] dst (MOVBZload [2] src mem) 		(MOVHstore dst (MOVHZload src mem) mem))
   4220 	for {
   4221 		if v.AuxInt != 3 {
   4222 			break
   4223 		}
   4224 		_ = v.Args[2]
   4225 		dst := v.Args[0]
   4226 		src := v.Args[1]
   4227 		mem := v.Args[2]
   4228 		v.reset(OpS390XMOVBstore)
   4229 		v.AuxInt = 2
   4230 		v.AddArg(dst)
   4231 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
   4232 		v0.AuxInt = 2
   4233 		v0.AddArg(src)
   4234 		v0.AddArg(mem)
   4235 		v.AddArg(v0)
   4236 		v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem)
   4237 		v1.AddArg(dst)
   4238 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   4239 		v2.AddArg(src)
   4240 		v2.AddArg(mem)
   4241 		v1.AddArg(v2)
   4242 		v1.AddArg(mem)
   4243 		v.AddArg(v1)
   4244 		return true
   4245 	}
   4246 	// match: (Move [5] dst src mem)
   4247 	// cond:
   4248 	// result: (MOVBstore [4] dst (MOVBZload [4] src mem) 		(MOVWstore dst (MOVWZload src mem) mem))
   4249 	for {
   4250 		if v.AuxInt != 5 {
   4251 			break
   4252 		}
   4253 		_ = v.Args[2]
   4254 		dst := v.Args[0]
   4255 		src := v.Args[1]
   4256 		mem := v.Args[2]
   4257 		v.reset(OpS390XMOVBstore)
   4258 		v.AuxInt = 4
   4259 		v.AddArg(dst)
   4260 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
   4261 		v0.AuxInt = 4
   4262 		v0.AddArg(src)
   4263 		v0.AddArg(mem)
   4264 		v.AddArg(v0)
   4265 		v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem)
   4266 		v1.AddArg(dst)
   4267 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   4268 		v2.AddArg(src)
   4269 		v2.AddArg(mem)
   4270 		v1.AddArg(v2)
   4271 		v1.AddArg(mem)
   4272 		v.AddArg(v1)
   4273 		return true
   4274 	}
   4275 	// match: (Move [6] dst src mem)
   4276 	// cond:
   4277 	// result: (MOVHstore [4] dst (MOVHZload [4] src mem) 		(MOVWstore dst (MOVWZload src mem) mem))
   4278 	for {
   4279 		if v.AuxInt != 6 {
   4280 			break
   4281 		}
   4282 		_ = v.Args[2]
   4283 		dst := v.Args[0]
   4284 		src := v.Args[1]
   4285 		mem := v.Args[2]
   4286 		v.reset(OpS390XMOVHstore)
   4287 		v.AuxInt = 4
   4288 		v.AddArg(dst)
   4289 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   4290 		v0.AuxInt = 4
   4291 		v0.AddArg(src)
   4292 		v0.AddArg(mem)
   4293 		v.AddArg(v0)
   4294 		v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem)
   4295 		v1.AddArg(dst)
   4296 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   4297 		v2.AddArg(src)
   4298 		v2.AddArg(mem)
   4299 		v1.AddArg(v2)
   4300 		v1.AddArg(mem)
   4301 		v.AddArg(v1)
   4302 		return true
   4303 	}
   4304 	return false
   4305 }
   4306 func rewriteValueS390X_OpMove_10(v *Value) bool {
   4307 	b := v.Block
   4308 	_ = b
   4309 	typ := &b.Func.Config.Types
   4310 	_ = typ
   4311 	// match: (Move [7] dst src mem)
   4312 	// cond:
   4313 	// result: (MOVBstore [6] dst (MOVBZload [6] src mem) 		(MOVHstore [4] dst (MOVHZload [4] src mem) 			(MOVWstore dst (MOVWZload src mem) mem)))
   4314 	for {
   4315 		if v.AuxInt != 7 {
   4316 			break
   4317 		}
   4318 		_ = v.Args[2]
   4319 		dst := v.Args[0]
   4320 		src := v.Args[1]
   4321 		mem := v.Args[2]
   4322 		v.reset(OpS390XMOVBstore)
   4323 		v.AuxInt = 6
   4324 		v.AddArg(dst)
   4325 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
   4326 		v0.AuxInt = 6
   4327 		v0.AddArg(src)
   4328 		v0.AddArg(mem)
   4329 		v.AddArg(v0)
   4330 		v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem)
   4331 		v1.AuxInt = 4
   4332 		v1.AddArg(dst)
   4333 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   4334 		v2.AuxInt = 4
   4335 		v2.AddArg(src)
   4336 		v2.AddArg(mem)
   4337 		v1.AddArg(v2)
   4338 		v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem)
   4339 		v3.AddArg(dst)
   4340 		v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   4341 		v4.AddArg(src)
   4342 		v4.AddArg(mem)
   4343 		v3.AddArg(v4)
   4344 		v3.AddArg(mem)
   4345 		v1.AddArg(v3)
   4346 		v.AddArg(v1)
   4347 		return true
   4348 	}
   4349 	// match: (Move [s] dst src mem)
   4350 	// cond: s > 0 && s <= 256
   4351 	// result: (MVC [makeValAndOff(s, 0)] dst src mem)
   4352 	for {
   4353 		s := v.AuxInt
   4354 		_ = v.Args[2]
   4355 		dst := v.Args[0]
   4356 		src := v.Args[1]
   4357 		mem := v.Args[2]
   4358 		if !(s > 0 && s <= 256) {
   4359 			break
   4360 		}
   4361 		v.reset(OpS390XMVC)
   4362 		v.AuxInt = makeValAndOff(s, 0)
   4363 		v.AddArg(dst)
   4364 		v.AddArg(src)
   4365 		v.AddArg(mem)
   4366 		return true
   4367 	}
   4368 	// match: (Move [s] dst src mem)
   4369 	// cond: s > 256 && s <= 512
   4370 	// result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))
   4371 	for {
   4372 		s := v.AuxInt
   4373 		_ = v.Args[2]
   4374 		dst := v.Args[0]
   4375 		src := v.Args[1]
   4376 		mem := v.Args[2]
   4377 		if !(s > 256 && s <= 512) {
   4378 			break
   4379 		}
   4380 		v.reset(OpS390XMVC)
   4381 		v.AuxInt = makeValAndOff(s-256, 256)
   4382 		v.AddArg(dst)
   4383 		v.AddArg(src)
   4384 		v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
   4385 		v0.AuxInt = makeValAndOff(256, 0)
   4386 		v0.AddArg(dst)
   4387 		v0.AddArg(src)
   4388 		v0.AddArg(mem)
   4389 		v.AddArg(v0)
   4390 		return true
   4391 	}
   4392 	// match: (Move [s] dst src mem)
   4393 	// cond: s > 512 && s <= 768
   4394 	// result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))
   4395 	for {
   4396 		s := v.AuxInt
   4397 		_ = v.Args[2]
   4398 		dst := v.Args[0]
   4399 		src := v.Args[1]
   4400 		mem := v.Args[2]
   4401 		if !(s > 512 && s <= 768) {
   4402 			break
   4403 		}
   4404 		v.reset(OpS390XMVC)
   4405 		v.AuxInt = makeValAndOff(s-512, 512)
   4406 		v.AddArg(dst)
   4407 		v.AddArg(src)
   4408 		v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
   4409 		v0.AuxInt = makeValAndOff(256, 256)
   4410 		v0.AddArg(dst)
   4411 		v0.AddArg(src)
   4412 		v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
   4413 		v1.AuxInt = makeValAndOff(256, 0)
   4414 		v1.AddArg(dst)
   4415 		v1.AddArg(src)
   4416 		v1.AddArg(mem)
   4417 		v0.AddArg(v1)
   4418 		v.AddArg(v0)
   4419 		return true
   4420 	}
   4421 	// match: (Move [s] dst src mem)
   4422 	// cond: s > 768 && s <= 1024
   4423 	// 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))))
   4424 	for {
   4425 		s := v.AuxInt
   4426 		_ = v.Args[2]
   4427 		dst := v.Args[0]
   4428 		src := v.Args[1]
   4429 		mem := v.Args[2]
   4430 		if !(s > 768 && s <= 1024) {
   4431 			break
   4432 		}
   4433 		v.reset(OpS390XMVC)
   4434 		v.AuxInt = makeValAndOff(s-768, 768)
   4435 		v.AddArg(dst)
   4436 		v.AddArg(src)
   4437 		v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
   4438 		v0.AuxInt = makeValAndOff(256, 512)
   4439 		v0.AddArg(dst)
   4440 		v0.AddArg(src)
   4441 		v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
   4442 		v1.AuxInt = makeValAndOff(256, 256)
   4443 		v1.AddArg(dst)
   4444 		v1.AddArg(src)
   4445 		v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
   4446 		v2.AuxInt = makeValAndOff(256, 0)
   4447 		v2.AddArg(dst)
   4448 		v2.AddArg(src)
   4449 		v2.AddArg(mem)
   4450 		v1.AddArg(v2)
   4451 		v0.AddArg(v1)
   4452 		v.AddArg(v0)
   4453 		return true
   4454 	}
   4455 	// match: (Move [s] dst src mem)
   4456 	// cond: s > 1024
   4457 	// result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem)
   4458 	for {
   4459 		s := v.AuxInt
   4460 		_ = v.Args[2]
   4461 		dst := v.Args[0]
   4462 		src := v.Args[1]
   4463 		mem := v.Args[2]
   4464 		if !(s > 1024) {
   4465 			break
   4466 		}
   4467 		v.reset(OpS390XLoweredMove)
   4468 		v.AuxInt = s % 256
   4469 		v.AddArg(dst)
   4470 		v.AddArg(src)
   4471 		v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type)
   4472 		v0.AuxInt = (s / 256) * 256
   4473 		v0.AddArg(src)
   4474 		v.AddArg(v0)
   4475 		v.AddArg(mem)
   4476 		return true
   4477 	}
   4478 	return false
   4479 }
   4480 func rewriteValueS390X_OpMul16_0(v *Value) bool {
   4481 	// match: (Mul16 x y)
   4482 	// cond:
   4483 	// result: (MULLW  x y)
   4484 	for {
   4485 		_ = v.Args[1]
   4486 		x := v.Args[0]
   4487 		y := v.Args[1]
   4488 		v.reset(OpS390XMULLW)
   4489 		v.AddArg(x)
   4490 		v.AddArg(y)
   4491 		return true
   4492 	}
   4493 }
   4494 func rewriteValueS390X_OpMul32_0(v *Value) bool {
   4495 	// match: (Mul32 x y)
   4496 	// cond:
   4497 	// result: (MULLW  x y)
   4498 	for {
   4499 		_ = v.Args[1]
   4500 		x := v.Args[0]
   4501 		y := v.Args[1]
   4502 		v.reset(OpS390XMULLW)
   4503 		v.AddArg(x)
   4504 		v.AddArg(y)
   4505 		return true
   4506 	}
   4507 }
   4508 func rewriteValueS390X_OpMul32F_0(v *Value) bool {
   4509 	// match: (Mul32F x y)
   4510 	// cond:
   4511 	// result: (FMULS x y)
   4512 	for {
   4513 		_ = v.Args[1]
   4514 		x := v.Args[0]
   4515 		y := v.Args[1]
   4516 		v.reset(OpS390XFMULS)
   4517 		v.AddArg(x)
   4518 		v.AddArg(y)
   4519 		return true
   4520 	}
   4521 }
   4522 func rewriteValueS390X_OpMul64_0(v *Value) bool {
   4523 	// match: (Mul64 x y)
   4524 	// cond:
   4525 	// result: (MULLD  x y)
   4526 	for {
   4527 		_ = v.Args[1]
   4528 		x := v.Args[0]
   4529 		y := v.Args[1]
   4530 		v.reset(OpS390XMULLD)
   4531 		v.AddArg(x)
   4532 		v.AddArg(y)
   4533 		return true
   4534 	}
   4535 }
   4536 func rewriteValueS390X_OpMul64F_0(v *Value) bool {
   4537 	// match: (Mul64F x y)
   4538 	// cond:
   4539 	// result: (FMUL x y)
   4540 	for {
   4541 		_ = v.Args[1]
   4542 		x := v.Args[0]
   4543 		y := v.Args[1]
   4544 		v.reset(OpS390XFMUL)
   4545 		v.AddArg(x)
   4546 		v.AddArg(y)
   4547 		return true
   4548 	}
   4549 }
   4550 func rewriteValueS390X_OpMul8_0(v *Value) bool {
   4551 	// match: (Mul8 x y)
   4552 	// cond:
   4553 	// result: (MULLW  x y)
   4554 	for {
   4555 		_ = v.Args[1]
   4556 		x := v.Args[0]
   4557 		y := v.Args[1]
   4558 		v.reset(OpS390XMULLW)
   4559 		v.AddArg(x)
   4560 		v.AddArg(y)
   4561 		return true
   4562 	}
   4563 }
   4564 func rewriteValueS390X_OpNeg16_0(v *Value) bool {
   4565 	b := v.Block
   4566 	_ = b
   4567 	typ := &b.Func.Config.Types
   4568 	_ = typ
   4569 	// match: (Neg16 x)
   4570 	// cond:
   4571 	// result: (NEGW (MOVHreg x))
   4572 	for {
   4573 		x := v.Args[0]
   4574 		v.reset(OpS390XNEGW)
   4575 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   4576 		v0.AddArg(x)
   4577 		v.AddArg(v0)
   4578 		return true
   4579 	}
   4580 }
   4581 func rewriteValueS390X_OpNeg32_0(v *Value) bool {
   4582 	// match: (Neg32 x)
   4583 	// cond:
   4584 	// result: (NEGW x)
   4585 	for {
   4586 		x := v.Args[0]
   4587 		v.reset(OpS390XNEGW)
   4588 		v.AddArg(x)
   4589 		return true
   4590 	}
   4591 }
   4592 func rewriteValueS390X_OpNeg32F_0(v *Value) bool {
   4593 	// match: (Neg32F x)
   4594 	// cond:
   4595 	// result: (FNEGS x)
   4596 	for {
   4597 		x := v.Args[0]
   4598 		v.reset(OpS390XFNEGS)
   4599 		v.AddArg(x)
   4600 		return true
   4601 	}
   4602 }
   4603 func rewriteValueS390X_OpNeg64_0(v *Value) bool {
   4604 	// match: (Neg64 x)
   4605 	// cond:
   4606 	// result: (NEG x)
   4607 	for {
   4608 		x := v.Args[0]
   4609 		v.reset(OpS390XNEG)
   4610 		v.AddArg(x)
   4611 		return true
   4612 	}
   4613 }
   4614 func rewriteValueS390X_OpNeg64F_0(v *Value) bool {
   4615 	// match: (Neg64F x)
   4616 	// cond:
   4617 	// result: (FNEG x)
   4618 	for {
   4619 		x := v.Args[0]
   4620 		v.reset(OpS390XFNEG)
   4621 		v.AddArg(x)
   4622 		return true
   4623 	}
   4624 }
   4625 func rewriteValueS390X_OpNeg8_0(v *Value) bool {
   4626 	b := v.Block
   4627 	_ = b
   4628 	typ := &b.Func.Config.Types
   4629 	_ = typ
   4630 	// match: (Neg8 x)
   4631 	// cond:
   4632 	// result: (NEGW (MOVBreg x))
   4633 	for {
   4634 		x := v.Args[0]
   4635 		v.reset(OpS390XNEGW)
   4636 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4637 		v0.AddArg(x)
   4638 		v.AddArg(v0)
   4639 		return true
   4640 	}
   4641 }
   4642 func rewriteValueS390X_OpNeq16_0(v *Value) bool {
   4643 	b := v.Block
   4644 	_ = b
   4645 	typ := &b.Func.Config.Types
   4646 	_ = typ
   4647 	// match: (Neq16 x y)
   4648 	// cond:
   4649 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y)))
   4650 	for {
   4651 		_ = v.Args[1]
   4652 		x := v.Args[0]
   4653 		y := v.Args[1]
   4654 		v.reset(OpS390XMOVDNE)
   4655 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4656 		v0.AuxInt = 0
   4657 		v.AddArg(v0)
   4658 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4659 		v1.AuxInt = 1
   4660 		v.AddArg(v1)
   4661 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   4662 		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   4663 		v3.AddArg(x)
   4664 		v2.AddArg(v3)
   4665 		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   4666 		v4.AddArg(y)
   4667 		v2.AddArg(v4)
   4668 		v.AddArg(v2)
   4669 		return true
   4670 	}
   4671 }
   4672 func rewriteValueS390X_OpNeq32_0(v *Value) bool {
   4673 	b := v.Block
   4674 	_ = b
   4675 	typ := &b.Func.Config.Types
   4676 	_ = typ
   4677 	// match: (Neq32 x y)
   4678 	// cond:
   4679 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
   4680 	for {
   4681 		_ = v.Args[1]
   4682 		x := v.Args[0]
   4683 		y := v.Args[1]
   4684 		v.reset(OpS390XMOVDNE)
   4685 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4686 		v0.AuxInt = 0
   4687 		v.AddArg(v0)
   4688 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4689 		v1.AuxInt = 1
   4690 		v.AddArg(v1)
   4691 		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
   4692 		v2.AddArg(x)
   4693 		v2.AddArg(y)
   4694 		v.AddArg(v2)
   4695 		return true
   4696 	}
   4697 }
   4698 func rewriteValueS390X_OpNeq32F_0(v *Value) bool {
   4699 	b := v.Block
   4700 	_ = b
   4701 	typ := &b.Func.Config.Types
   4702 	_ = typ
   4703 	// match: (Neq32F x y)
   4704 	// cond:
   4705 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
   4706 	for {
   4707 		_ = v.Args[1]
   4708 		x := v.Args[0]
   4709 		y := v.Args[1]
   4710 		v.reset(OpS390XMOVDNE)
   4711 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4712 		v0.AuxInt = 0
   4713 		v.AddArg(v0)
   4714 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4715 		v1.AuxInt = 1
   4716 		v.AddArg(v1)
   4717 		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
   4718 		v2.AddArg(x)
   4719 		v2.AddArg(y)
   4720 		v.AddArg(v2)
   4721 		return true
   4722 	}
   4723 }
   4724 func rewriteValueS390X_OpNeq64_0(v *Value) bool {
   4725 	b := v.Block
   4726 	_ = b
   4727 	typ := &b.Func.Config.Types
   4728 	_ = typ
   4729 	// match: (Neq64 x y)
   4730 	// cond:
   4731 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   4732 	for {
   4733 		_ = v.Args[1]
   4734 		x := v.Args[0]
   4735 		y := v.Args[1]
   4736 		v.reset(OpS390XMOVDNE)
   4737 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4738 		v0.AuxInt = 0
   4739 		v.AddArg(v0)
   4740 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4741 		v1.AuxInt = 1
   4742 		v.AddArg(v1)
   4743 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   4744 		v2.AddArg(x)
   4745 		v2.AddArg(y)
   4746 		v.AddArg(v2)
   4747 		return true
   4748 	}
   4749 }
   4750 func rewriteValueS390X_OpNeq64F_0(v *Value) bool {
   4751 	b := v.Block
   4752 	_ = b
   4753 	typ := &b.Func.Config.Types
   4754 	_ = typ
   4755 	// match: (Neq64F x y)
   4756 	// cond:
   4757 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
   4758 	for {
   4759 		_ = v.Args[1]
   4760 		x := v.Args[0]
   4761 		y := v.Args[1]
   4762 		v.reset(OpS390XMOVDNE)
   4763 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4764 		v0.AuxInt = 0
   4765 		v.AddArg(v0)
   4766 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4767 		v1.AuxInt = 1
   4768 		v.AddArg(v1)
   4769 		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
   4770 		v2.AddArg(x)
   4771 		v2.AddArg(y)
   4772 		v.AddArg(v2)
   4773 		return true
   4774 	}
   4775 }
   4776 func rewriteValueS390X_OpNeq8_0(v *Value) bool {
   4777 	b := v.Block
   4778 	_ = b
   4779 	typ := &b.Func.Config.Types
   4780 	_ = typ
   4781 	// match: (Neq8 x y)
   4782 	// cond:
   4783 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   4784 	for {
   4785 		_ = v.Args[1]
   4786 		x := v.Args[0]
   4787 		y := v.Args[1]
   4788 		v.reset(OpS390XMOVDNE)
   4789 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4790 		v0.AuxInt = 0
   4791 		v.AddArg(v0)
   4792 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4793 		v1.AuxInt = 1
   4794 		v.AddArg(v1)
   4795 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   4796 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4797 		v3.AddArg(x)
   4798 		v2.AddArg(v3)
   4799 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4800 		v4.AddArg(y)
   4801 		v2.AddArg(v4)
   4802 		v.AddArg(v2)
   4803 		return true
   4804 	}
   4805 }
   4806 func rewriteValueS390X_OpNeqB_0(v *Value) bool {
   4807 	b := v.Block
   4808 	_ = b
   4809 	typ := &b.Func.Config.Types
   4810 	_ = typ
   4811 	// match: (NeqB x y)
   4812 	// cond:
   4813 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y)))
   4814 	for {
   4815 		_ = v.Args[1]
   4816 		x := v.Args[0]
   4817 		y := v.Args[1]
   4818 		v.reset(OpS390XMOVDNE)
   4819 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4820 		v0.AuxInt = 0
   4821 		v.AddArg(v0)
   4822 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4823 		v1.AuxInt = 1
   4824 		v.AddArg(v1)
   4825 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   4826 		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4827 		v3.AddArg(x)
   4828 		v2.AddArg(v3)
   4829 		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   4830 		v4.AddArg(y)
   4831 		v2.AddArg(v4)
   4832 		v.AddArg(v2)
   4833 		return true
   4834 	}
   4835 }
   4836 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool {
   4837 	b := v.Block
   4838 	_ = b
   4839 	typ := &b.Func.Config.Types
   4840 	_ = typ
   4841 	// match: (NeqPtr x y)
   4842 	// cond:
   4843 	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
   4844 	for {
   4845 		_ = v.Args[1]
   4846 		x := v.Args[0]
   4847 		y := v.Args[1]
   4848 		v.reset(OpS390XMOVDNE)
   4849 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4850 		v0.AuxInt = 0
   4851 		v.AddArg(v0)
   4852 		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4853 		v1.AuxInt = 1
   4854 		v.AddArg(v1)
   4855 		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
   4856 		v2.AddArg(x)
   4857 		v2.AddArg(y)
   4858 		v.AddArg(v2)
   4859 		return true
   4860 	}
   4861 }
   4862 func rewriteValueS390X_OpNilCheck_0(v *Value) bool {
   4863 	// match: (NilCheck ptr mem)
   4864 	// cond:
   4865 	// result: (LoweredNilCheck ptr mem)
   4866 	for {
   4867 		_ = v.Args[1]
   4868 		ptr := v.Args[0]
   4869 		mem := v.Args[1]
   4870 		v.reset(OpS390XLoweredNilCheck)
   4871 		v.AddArg(ptr)
   4872 		v.AddArg(mem)
   4873 		return true
   4874 	}
   4875 }
   4876 func rewriteValueS390X_OpNot_0(v *Value) bool {
   4877 	// match: (Not x)
   4878 	// cond:
   4879 	// result: (XORWconst [1] x)
   4880 	for {
   4881 		x := v.Args[0]
   4882 		v.reset(OpS390XXORWconst)
   4883 		v.AuxInt = 1
   4884 		v.AddArg(x)
   4885 		return true
   4886 	}
   4887 }
   4888 func rewriteValueS390X_OpOffPtr_0(v *Value) bool {
   4889 	b := v.Block
   4890 	_ = b
   4891 	typ := &b.Func.Config.Types
   4892 	_ = typ
   4893 	// match: (OffPtr [off] ptr:(SP))
   4894 	// cond:
   4895 	// result: (MOVDaddr [off] ptr)
   4896 	for {
   4897 		off := v.AuxInt
   4898 		ptr := v.Args[0]
   4899 		if ptr.Op != OpSP {
   4900 			break
   4901 		}
   4902 		v.reset(OpS390XMOVDaddr)
   4903 		v.AuxInt = off
   4904 		v.AddArg(ptr)
   4905 		return true
   4906 	}
   4907 	// match: (OffPtr [off] ptr)
   4908 	// cond: is32Bit(off)
   4909 	// result: (ADDconst [off] ptr)
   4910 	for {
   4911 		off := v.AuxInt
   4912 		ptr := v.Args[0]
   4913 		if !(is32Bit(off)) {
   4914 			break
   4915 		}
   4916 		v.reset(OpS390XADDconst)
   4917 		v.AuxInt = off
   4918 		v.AddArg(ptr)
   4919 		return true
   4920 	}
   4921 	// match: (OffPtr [off] ptr)
   4922 	// cond:
   4923 	// result: (ADD (MOVDconst [off]) ptr)
   4924 	for {
   4925 		off := v.AuxInt
   4926 		ptr := v.Args[0]
   4927 		v.reset(OpS390XADD)
   4928 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   4929 		v0.AuxInt = off
   4930 		v.AddArg(v0)
   4931 		v.AddArg(ptr)
   4932 		return true
   4933 	}
   4934 }
   4935 func rewriteValueS390X_OpOr16_0(v *Value) bool {
   4936 	// match: (Or16 x y)
   4937 	// cond:
   4938 	// result: (ORW x y)
   4939 	for {
   4940 		_ = v.Args[1]
   4941 		x := v.Args[0]
   4942 		y := v.Args[1]
   4943 		v.reset(OpS390XORW)
   4944 		v.AddArg(x)
   4945 		v.AddArg(y)
   4946 		return true
   4947 	}
   4948 }
   4949 func rewriteValueS390X_OpOr32_0(v *Value) bool {
   4950 	// match: (Or32 x y)
   4951 	// cond:
   4952 	// result: (ORW x y)
   4953 	for {
   4954 		_ = v.Args[1]
   4955 		x := v.Args[0]
   4956 		y := v.Args[1]
   4957 		v.reset(OpS390XORW)
   4958 		v.AddArg(x)
   4959 		v.AddArg(y)
   4960 		return true
   4961 	}
   4962 }
   4963 func rewriteValueS390X_OpOr64_0(v *Value) bool {
   4964 	// match: (Or64 x y)
   4965 	// cond:
   4966 	// result: (OR x y)
   4967 	for {
   4968 		_ = v.Args[1]
   4969 		x := v.Args[0]
   4970 		y := v.Args[1]
   4971 		v.reset(OpS390XOR)
   4972 		v.AddArg(x)
   4973 		v.AddArg(y)
   4974 		return true
   4975 	}
   4976 }
   4977 func rewriteValueS390X_OpOr8_0(v *Value) bool {
   4978 	// match: (Or8 x y)
   4979 	// cond:
   4980 	// result: (ORW x y)
   4981 	for {
   4982 		_ = v.Args[1]
   4983 		x := v.Args[0]
   4984 		y := v.Args[1]
   4985 		v.reset(OpS390XORW)
   4986 		v.AddArg(x)
   4987 		v.AddArg(y)
   4988 		return true
   4989 	}
   4990 }
   4991 func rewriteValueS390X_OpOrB_0(v *Value) bool {
   4992 	// match: (OrB x y)
   4993 	// cond:
   4994 	// result: (ORW x y)
   4995 	for {
   4996 		_ = v.Args[1]
   4997 		x := v.Args[0]
   4998 		y := v.Args[1]
   4999 		v.reset(OpS390XORW)
   5000 		v.AddArg(x)
   5001 		v.AddArg(y)
   5002 		return true
   5003 	}
   5004 }
   5005 func rewriteValueS390X_OpRound_0(v *Value) bool {
   5006 	// match: (Round x)
   5007 	// cond:
   5008 	// result: (FIDBR [1] x)
   5009 	for {
   5010 		x := v.Args[0]
   5011 		v.reset(OpS390XFIDBR)
   5012 		v.AuxInt = 1
   5013 		v.AddArg(x)
   5014 		return true
   5015 	}
   5016 }
   5017 func rewriteValueS390X_OpRound32F_0(v *Value) bool {
   5018 	// match: (Round32F x)
   5019 	// cond:
   5020 	// result: (LoweredRound32F x)
   5021 	for {
   5022 		x := v.Args[0]
   5023 		v.reset(OpS390XLoweredRound32F)
   5024 		v.AddArg(x)
   5025 		return true
   5026 	}
   5027 }
   5028 func rewriteValueS390X_OpRound64F_0(v *Value) bool {
   5029 	// match: (Round64F x)
   5030 	// cond:
   5031 	// result: (LoweredRound64F x)
   5032 	for {
   5033 		x := v.Args[0]
   5034 		v.reset(OpS390XLoweredRound64F)
   5035 		v.AddArg(x)
   5036 		return true
   5037 	}
   5038 }
   5039 func rewriteValueS390X_OpRoundToEven_0(v *Value) bool {
   5040 	// match: (RoundToEven x)
   5041 	// cond:
   5042 	// result: (FIDBR [4] x)
   5043 	for {
   5044 		x := v.Args[0]
   5045 		v.reset(OpS390XFIDBR)
   5046 		v.AuxInt = 4
   5047 		v.AddArg(x)
   5048 		return true
   5049 	}
   5050 }
   5051 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool {
   5052 	b := v.Block
   5053 	_ = b
   5054 	typ := &b.Func.Config.Types
   5055 	_ = typ
   5056 	// match: (Rsh16Ux16 <t> x y)
   5057 	// cond:
   5058 	// result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15])))
   5059 	for {
   5060 		t := v.Type
   5061 		_ = v.Args[1]
   5062 		x := v.Args[0]
   5063 		y := v.Args[1]
   5064 		v.reset(OpS390XANDW)
   5065 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5066 		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5067 		v1.AddArg(x)
   5068 		v0.AddArg(v1)
   5069 		v0.AddArg(y)
   5070 		v.AddArg(v0)
   5071 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5072 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5073 		v3.AuxInt = 15
   5074 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5075 		v4.AddArg(y)
   5076 		v3.AddArg(v4)
   5077 		v2.AddArg(v3)
   5078 		v.AddArg(v2)
   5079 		return true
   5080 	}
   5081 }
   5082 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool {
   5083 	b := v.Block
   5084 	_ = b
   5085 	typ := &b.Func.Config.Types
   5086 	_ = typ
   5087 	// match: (Rsh16Ux32 <t> x y)
   5088 	// cond:
   5089 	// result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15])))
   5090 	for {
   5091 		t := v.Type
   5092 		_ = v.Args[1]
   5093 		x := v.Args[0]
   5094 		y := v.Args[1]
   5095 		v.reset(OpS390XANDW)
   5096 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5097 		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5098 		v1.AddArg(x)
   5099 		v0.AddArg(v1)
   5100 		v0.AddArg(y)
   5101 		v.AddArg(v0)
   5102 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5103 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5104 		v3.AuxInt = 15
   5105 		v3.AddArg(y)
   5106 		v2.AddArg(v3)
   5107 		v.AddArg(v2)
   5108 		return true
   5109 	}
   5110 }
   5111 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool {
   5112 	b := v.Block
   5113 	_ = b
   5114 	typ := &b.Func.Config.Types
   5115 	_ = typ
   5116 	// match: (Rsh16Ux64 <t> x y)
   5117 	// cond:
   5118 	// result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15])))
   5119 	for {
   5120 		t := v.Type
   5121 		_ = v.Args[1]
   5122 		x := v.Args[0]
   5123 		y := v.Args[1]
   5124 		v.reset(OpS390XANDW)
   5125 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5126 		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5127 		v1.AddArg(x)
   5128 		v0.AddArg(v1)
   5129 		v0.AddArg(y)
   5130 		v.AddArg(v0)
   5131 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5132 		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5133 		v3.AuxInt = 15
   5134 		v3.AddArg(y)
   5135 		v2.AddArg(v3)
   5136 		v.AddArg(v2)
   5137 		return true
   5138 	}
   5139 }
   5140 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool {
   5141 	b := v.Block
   5142 	_ = b
   5143 	typ := &b.Func.Config.Types
   5144 	_ = typ
   5145 	// match: (Rsh16Ux8 <t> x y)
   5146 	// cond:
   5147 	// result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15])))
   5148 	for {
   5149 		t := v.Type
   5150 		_ = v.Args[1]
   5151 		x := v.Args[0]
   5152 		y := v.Args[1]
   5153 		v.reset(OpS390XANDW)
   5154 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5155 		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5156 		v1.AddArg(x)
   5157 		v0.AddArg(v1)
   5158 		v0.AddArg(y)
   5159 		v.AddArg(v0)
   5160 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5161 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5162 		v3.AuxInt = 15
   5163 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5164 		v4.AddArg(y)
   5165 		v3.AddArg(v4)
   5166 		v2.AddArg(v3)
   5167 		v.AddArg(v2)
   5168 		return true
   5169 	}
   5170 }
   5171 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool {
   5172 	b := v.Block
   5173 	_ = b
   5174 	typ := &b.Func.Config.Types
   5175 	_ = typ
   5176 	// match: (Rsh16x16 <t> x y)
   5177 	// cond:
   5178 	// result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15])))))
   5179 	for {
   5180 		t := v.Type
   5181 		_ = v.Args[1]
   5182 		x := v.Args[0]
   5183 		y := v.Args[1]
   5184 		v.reset(OpS390XSRAW)
   5185 		v.Type = t
   5186 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   5187 		v0.AddArg(x)
   5188 		v.AddArg(v0)
   5189 		v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5190 		v1.AddArg(y)
   5191 		v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5192 		v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5193 		v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5194 		v4.AuxInt = 15
   5195 		v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5196 		v5.AddArg(y)
   5197 		v4.AddArg(v5)
   5198 		v3.AddArg(v4)
   5199 		v2.AddArg(v3)
   5200 		v1.AddArg(v2)
   5201 		v.AddArg(v1)
   5202 		return true
   5203 	}
   5204 }
   5205 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool {
   5206 	b := v.Block
   5207 	_ = b
   5208 	typ := &b.Func.Config.Types
   5209 	_ = typ
   5210 	// match: (Rsh16x32 <t> x y)
   5211 	// cond:
   5212 	// result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15])))))
   5213 	for {
   5214 		t := v.Type
   5215 		_ = v.Args[1]
   5216 		x := v.Args[0]
   5217 		y := v.Args[1]
   5218 		v.reset(OpS390XSRAW)
   5219 		v.Type = t
   5220 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   5221 		v0.AddArg(x)
   5222 		v.AddArg(v0)
   5223 		v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5224 		v1.AddArg(y)
   5225 		v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5226 		v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5227 		v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5228 		v4.AuxInt = 15
   5229 		v4.AddArg(y)
   5230 		v3.AddArg(v4)
   5231 		v2.AddArg(v3)
   5232 		v1.AddArg(v2)
   5233 		v.AddArg(v1)
   5234 		return true
   5235 	}
   5236 }
   5237 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool {
   5238 	b := v.Block
   5239 	_ = b
   5240 	typ := &b.Func.Config.Types
   5241 	_ = typ
   5242 	// match: (Rsh16x64 <t> x y)
   5243 	// cond:
   5244 	// result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15])))))
   5245 	for {
   5246 		t := v.Type
   5247 		_ = v.Args[1]
   5248 		x := v.Args[0]
   5249 		y := v.Args[1]
   5250 		v.reset(OpS390XSRAW)
   5251 		v.Type = t
   5252 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   5253 		v0.AddArg(x)
   5254 		v.AddArg(v0)
   5255 		v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type)
   5256 		v1.AddArg(y)
   5257 		v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type)
   5258 		v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type)
   5259 		v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5260 		v4.AuxInt = 15
   5261 		v4.AddArg(y)
   5262 		v3.AddArg(v4)
   5263 		v2.AddArg(v3)
   5264 		v1.AddArg(v2)
   5265 		v.AddArg(v1)
   5266 		return true
   5267 	}
   5268 }
   5269 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool {
   5270 	b := v.Block
   5271 	_ = b
   5272 	typ := &b.Func.Config.Types
   5273 	_ = typ
   5274 	// match: (Rsh16x8 <t> x y)
   5275 	// cond:
   5276 	// result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15])))))
   5277 	for {
   5278 		t := v.Type
   5279 		_ = v.Args[1]
   5280 		x := v.Args[0]
   5281 		y := v.Args[1]
   5282 		v.reset(OpS390XSRAW)
   5283 		v.Type = t
   5284 		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
   5285 		v0.AddArg(x)
   5286 		v.AddArg(v0)
   5287 		v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5288 		v1.AddArg(y)
   5289 		v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5290 		v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5291 		v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5292 		v4.AuxInt = 15
   5293 		v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5294 		v5.AddArg(y)
   5295 		v4.AddArg(v5)
   5296 		v3.AddArg(v4)
   5297 		v2.AddArg(v3)
   5298 		v1.AddArg(v2)
   5299 		v.AddArg(v1)
   5300 		return true
   5301 	}
   5302 }
   5303 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool {
   5304 	b := v.Block
   5305 	_ = b
   5306 	typ := &b.Func.Config.Types
   5307 	_ = typ
   5308 	// match: (Rsh32Ux16 <t> x y)
   5309 	// cond:
   5310 	// result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31])))
   5311 	for {
   5312 		t := v.Type
   5313 		_ = v.Args[1]
   5314 		x := v.Args[0]
   5315 		y := v.Args[1]
   5316 		v.reset(OpS390XANDW)
   5317 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5318 		v0.AddArg(x)
   5319 		v0.AddArg(y)
   5320 		v.AddArg(v0)
   5321 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5322 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5323 		v2.AuxInt = 31
   5324 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.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_OpRsh32Ux32_0(v *Value) bool {
   5333 	b := v.Block
   5334 	_ = b
   5335 	// match: (Rsh32Ux32 <t> x y)
   5336 	// cond:
   5337 	// result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31])))
   5338 	for {
   5339 		t := v.Type
   5340 		_ = v.Args[1]
   5341 		x := v.Args[0]
   5342 		y := v.Args[1]
   5343 		v.reset(OpS390XANDW)
   5344 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5345 		v0.AddArg(x)
   5346 		v0.AddArg(y)
   5347 		v.AddArg(v0)
   5348 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5349 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5350 		v2.AuxInt = 31
   5351 		v2.AddArg(y)
   5352 		v1.AddArg(v2)
   5353 		v.AddArg(v1)
   5354 		return true
   5355 	}
   5356 }
   5357 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool {
   5358 	b := v.Block
   5359 	_ = b
   5360 	// match: (Rsh32Ux64 <t> x y)
   5361 	// cond:
   5362 	// result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31])))
   5363 	for {
   5364 		t := v.Type
   5365 		_ = v.Args[1]
   5366 		x := v.Args[0]
   5367 		y := v.Args[1]
   5368 		v.reset(OpS390XANDW)
   5369 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5370 		v0.AddArg(x)
   5371 		v0.AddArg(y)
   5372 		v.AddArg(v0)
   5373 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5374 		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5375 		v2.AuxInt = 31
   5376 		v2.AddArg(y)
   5377 		v1.AddArg(v2)
   5378 		v.AddArg(v1)
   5379 		return true
   5380 	}
   5381 }
   5382 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool {
   5383 	b := v.Block
   5384 	_ = b
   5385 	typ := &b.Func.Config.Types
   5386 	_ = typ
   5387 	// match: (Rsh32Ux8 <t> x y)
   5388 	// cond:
   5389 	// result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31])))
   5390 	for {
   5391 		t := v.Type
   5392 		_ = v.Args[1]
   5393 		x := v.Args[0]
   5394 		y := v.Args[1]
   5395 		v.reset(OpS390XANDW)
   5396 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5397 		v0.AddArg(x)
   5398 		v0.AddArg(y)
   5399 		v.AddArg(v0)
   5400 		v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5401 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5402 		v2.AuxInt = 31
   5403 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5404 		v3.AddArg(y)
   5405 		v2.AddArg(v3)
   5406 		v1.AddArg(v2)
   5407 		v.AddArg(v1)
   5408 		return true
   5409 	}
   5410 }
   5411 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool {
   5412 	b := v.Block
   5413 	_ = b
   5414 	typ := &b.Func.Config.Types
   5415 	_ = typ
   5416 	// match: (Rsh32x16 <t> x y)
   5417 	// cond:
   5418 	// result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31])))))
   5419 	for {
   5420 		t := v.Type
   5421 		_ = v.Args[1]
   5422 		x := v.Args[0]
   5423 		y := v.Args[1]
   5424 		v.reset(OpS390XSRAW)
   5425 		v.Type = t
   5426 		v.AddArg(x)
   5427 		v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5428 		v0.AddArg(y)
   5429 		v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5430 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5431 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5432 		v3.AuxInt = 31
   5433 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5434 		v4.AddArg(y)
   5435 		v3.AddArg(v4)
   5436 		v2.AddArg(v3)
   5437 		v1.AddArg(v2)
   5438 		v0.AddArg(v1)
   5439 		v.AddArg(v0)
   5440 		return true
   5441 	}
   5442 }
   5443 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool {
   5444 	b := v.Block
   5445 	_ = b
   5446 	// match: (Rsh32x32 <t> x y)
   5447 	// cond:
   5448 	// result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31])))))
   5449 	for {
   5450 		t := v.Type
   5451 		_ = v.Args[1]
   5452 		x := v.Args[0]
   5453 		y := v.Args[1]
   5454 		v.reset(OpS390XSRAW)
   5455 		v.Type = t
   5456 		v.AddArg(x)
   5457 		v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5458 		v0.AddArg(y)
   5459 		v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5460 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5461 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5462 		v3.AuxInt = 31
   5463 		v3.AddArg(y)
   5464 		v2.AddArg(v3)
   5465 		v1.AddArg(v2)
   5466 		v0.AddArg(v1)
   5467 		v.AddArg(v0)
   5468 		return true
   5469 	}
   5470 }
   5471 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool {
   5472 	b := v.Block
   5473 	_ = b
   5474 	// match: (Rsh32x64 <t> x y)
   5475 	// cond:
   5476 	// result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31])))))
   5477 	for {
   5478 		t := v.Type
   5479 		_ = v.Args[1]
   5480 		x := v.Args[0]
   5481 		y := v.Args[1]
   5482 		v.reset(OpS390XSRAW)
   5483 		v.Type = t
   5484 		v.AddArg(x)
   5485 		v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type)
   5486 		v0.AddArg(y)
   5487 		v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type)
   5488 		v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type)
   5489 		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5490 		v3.AuxInt = 31
   5491 		v3.AddArg(y)
   5492 		v2.AddArg(v3)
   5493 		v1.AddArg(v2)
   5494 		v0.AddArg(v1)
   5495 		v.AddArg(v0)
   5496 		return true
   5497 	}
   5498 }
   5499 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool {
   5500 	b := v.Block
   5501 	_ = b
   5502 	typ := &b.Func.Config.Types
   5503 	_ = typ
   5504 	// match: (Rsh32x8 <t> x y)
   5505 	// cond:
   5506 	// result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31])))))
   5507 	for {
   5508 		t := v.Type
   5509 		_ = v.Args[1]
   5510 		x := v.Args[0]
   5511 		y := v.Args[1]
   5512 		v.reset(OpS390XSRAW)
   5513 		v.Type = t
   5514 		v.AddArg(x)
   5515 		v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5516 		v0.AddArg(y)
   5517 		v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5518 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5519 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5520 		v3.AuxInt = 31
   5521 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5522 		v4.AddArg(y)
   5523 		v3.AddArg(v4)
   5524 		v2.AddArg(v3)
   5525 		v1.AddArg(v2)
   5526 		v0.AddArg(v1)
   5527 		v.AddArg(v0)
   5528 		return true
   5529 	}
   5530 }
   5531 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool {
   5532 	b := v.Block
   5533 	_ = b
   5534 	typ := &b.Func.Config.Types
   5535 	_ = typ
   5536 	// match: (Rsh64Ux16 <t> x y)
   5537 	// cond:
   5538 	// result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63])))
   5539 	for {
   5540 		t := v.Type
   5541 		_ = v.Args[1]
   5542 		x := v.Args[0]
   5543 		y := v.Args[1]
   5544 		v.reset(OpS390XAND)
   5545 		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
   5546 		v0.AddArg(x)
   5547 		v0.AddArg(y)
   5548 		v.AddArg(v0)
   5549 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   5550 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5551 		v2.AuxInt = 63
   5552 		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5553 		v3.AddArg(y)
   5554 		v2.AddArg(v3)
   5555 		v1.AddArg(v2)
   5556 		v.AddArg(v1)
   5557 		return true
   5558 	}
   5559 }
   5560 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool {
   5561 	b := v.Block
   5562 	_ = b
   5563 	// match: (Rsh64Ux32 <t> x y)
   5564 	// cond:
   5565 	// result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63])))
   5566 	for {
   5567 		t := v.Type
   5568 		_ = v.Args[1]
   5569 		x := v.Args[0]
   5570 		y := v.Args[1]
   5571 		v.reset(OpS390XAND)
   5572 		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
   5573 		v0.AddArg(x)
   5574 		v0.AddArg(y)
   5575 		v.AddArg(v0)
   5576 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   5577 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5578 		v2.AuxInt = 63
   5579 		v2.AddArg(y)
   5580 		v1.AddArg(v2)
   5581 		v.AddArg(v1)
   5582 		return true
   5583 	}
   5584 }
   5585 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool {
   5586 	b := v.Block
   5587 	_ = b
   5588 	// match: (Rsh64Ux64 <t> x y)
   5589 	// cond:
   5590 	// result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63])))
   5591 	for {
   5592 		t := v.Type
   5593 		_ = v.Args[1]
   5594 		x := v.Args[0]
   5595 		y := v.Args[1]
   5596 		v.reset(OpS390XAND)
   5597 		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
   5598 		v0.AddArg(x)
   5599 		v0.AddArg(y)
   5600 		v.AddArg(v0)
   5601 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   5602 		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5603 		v2.AuxInt = 63
   5604 		v2.AddArg(y)
   5605 		v1.AddArg(v2)
   5606 		v.AddArg(v1)
   5607 		return true
   5608 	}
   5609 }
   5610 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool {
   5611 	b := v.Block
   5612 	_ = b
   5613 	typ := &b.Func.Config.Types
   5614 	_ = typ
   5615 	// match: (Rsh64Ux8 <t> x y)
   5616 	// cond:
   5617 	// result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63])))
   5618 	for {
   5619 		t := v.Type
   5620 		_ = v.Args[1]
   5621 		x := v.Args[0]
   5622 		y := v.Args[1]
   5623 		v.reset(OpS390XAND)
   5624 		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
   5625 		v0.AddArg(x)
   5626 		v0.AddArg(y)
   5627 		v.AddArg(v0)
   5628 		v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t)
   5629 		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5630 		v2.AuxInt = 63
   5631 		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5632 		v3.AddArg(y)
   5633 		v2.AddArg(v3)
   5634 		v1.AddArg(v2)
   5635 		v.AddArg(v1)
   5636 		return true
   5637 	}
   5638 }
   5639 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool {
   5640 	b := v.Block
   5641 	_ = b
   5642 	typ := &b.Func.Config.Types
   5643 	_ = typ
   5644 	// match: (Rsh64x16 <t> x y)
   5645 	// cond:
   5646 	// result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63])))))
   5647 	for {
   5648 		t := v.Type
   5649 		_ = v.Args[1]
   5650 		x := v.Args[0]
   5651 		y := v.Args[1]
   5652 		v.reset(OpS390XSRAD)
   5653 		v.Type = t
   5654 		v.AddArg(x)
   5655 		v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5656 		v0.AddArg(y)
   5657 		v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5658 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5659 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5660 		v3.AuxInt = 63
   5661 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5662 		v4.AddArg(y)
   5663 		v3.AddArg(v4)
   5664 		v2.AddArg(v3)
   5665 		v1.AddArg(v2)
   5666 		v0.AddArg(v1)
   5667 		v.AddArg(v0)
   5668 		return true
   5669 	}
   5670 }
   5671 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool {
   5672 	b := v.Block
   5673 	_ = b
   5674 	// match: (Rsh64x32 <t> x y)
   5675 	// cond:
   5676 	// result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63])))))
   5677 	for {
   5678 		t := v.Type
   5679 		_ = v.Args[1]
   5680 		x := v.Args[0]
   5681 		y := v.Args[1]
   5682 		v.reset(OpS390XSRAD)
   5683 		v.Type = t
   5684 		v.AddArg(x)
   5685 		v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5686 		v0.AddArg(y)
   5687 		v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5688 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5689 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5690 		v3.AuxInt = 63
   5691 		v3.AddArg(y)
   5692 		v2.AddArg(v3)
   5693 		v1.AddArg(v2)
   5694 		v0.AddArg(v1)
   5695 		v.AddArg(v0)
   5696 		return true
   5697 	}
   5698 }
   5699 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool {
   5700 	b := v.Block
   5701 	_ = b
   5702 	// match: (Rsh64x64 <t> x y)
   5703 	// cond:
   5704 	// result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63])))))
   5705 	for {
   5706 		t := v.Type
   5707 		_ = v.Args[1]
   5708 		x := v.Args[0]
   5709 		y := v.Args[1]
   5710 		v.reset(OpS390XSRAD)
   5711 		v.Type = t
   5712 		v.AddArg(x)
   5713 		v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type)
   5714 		v0.AddArg(y)
   5715 		v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type)
   5716 		v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type)
   5717 		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5718 		v3.AuxInt = 63
   5719 		v3.AddArg(y)
   5720 		v2.AddArg(v3)
   5721 		v1.AddArg(v2)
   5722 		v0.AddArg(v1)
   5723 		v.AddArg(v0)
   5724 		return true
   5725 	}
   5726 }
   5727 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool {
   5728 	b := v.Block
   5729 	_ = b
   5730 	typ := &b.Func.Config.Types
   5731 	_ = typ
   5732 	// match: (Rsh64x8 <t> x y)
   5733 	// cond:
   5734 	// result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63])))))
   5735 	for {
   5736 		t := v.Type
   5737 		_ = v.Args[1]
   5738 		x := v.Args[0]
   5739 		y := v.Args[1]
   5740 		v.reset(OpS390XSRAD)
   5741 		v.Type = t
   5742 		v.AddArg(x)
   5743 		v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5744 		v0.AddArg(y)
   5745 		v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5746 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5747 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5748 		v3.AuxInt = 63
   5749 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5750 		v4.AddArg(y)
   5751 		v3.AddArg(v4)
   5752 		v2.AddArg(v3)
   5753 		v1.AddArg(v2)
   5754 		v0.AddArg(v1)
   5755 		v.AddArg(v0)
   5756 		return true
   5757 	}
   5758 }
   5759 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool {
   5760 	b := v.Block
   5761 	_ = b
   5762 	typ := &b.Func.Config.Types
   5763 	_ = typ
   5764 	// match: (Rsh8Ux16 <t> x y)
   5765 	// cond:
   5766 	// result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7])))
   5767 	for {
   5768 		t := v.Type
   5769 		_ = v.Args[1]
   5770 		x := v.Args[0]
   5771 		y := v.Args[1]
   5772 		v.reset(OpS390XANDW)
   5773 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5774 		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5775 		v1.AddArg(x)
   5776 		v0.AddArg(v1)
   5777 		v0.AddArg(y)
   5778 		v.AddArg(v0)
   5779 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5780 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5781 		v3.AuxInt = 7
   5782 		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5783 		v4.AddArg(y)
   5784 		v3.AddArg(v4)
   5785 		v2.AddArg(v3)
   5786 		v.AddArg(v2)
   5787 		return true
   5788 	}
   5789 }
   5790 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool {
   5791 	b := v.Block
   5792 	_ = b
   5793 	typ := &b.Func.Config.Types
   5794 	_ = typ
   5795 	// match: (Rsh8Ux32 <t> x y)
   5796 	// cond:
   5797 	// result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7])))
   5798 	for {
   5799 		t := v.Type
   5800 		_ = v.Args[1]
   5801 		x := v.Args[0]
   5802 		y := v.Args[1]
   5803 		v.reset(OpS390XANDW)
   5804 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5805 		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5806 		v1.AddArg(x)
   5807 		v0.AddArg(v1)
   5808 		v0.AddArg(y)
   5809 		v.AddArg(v0)
   5810 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5811 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5812 		v3.AuxInt = 7
   5813 		v3.AddArg(y)
   5814 		v2.AddArg(v3)
   5815 		v.AddArg(v2)
   5816 		return true
   5817 	}
   5818 }
   5819 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool {
   5820 	b := v.Block
   5821 	_ = b
   5822 	typ := &b.Func.Config.Types
   5823 	_ = typ
   5824 	// match: (Rsh8Ux64 <t> x y)
   5825 	// cond:
   5826 	// result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7])))
   5827 	for {
   5828 		t := v.Type
   5829 		_ = v.Args[1]
   5830 		x := v.Args[0]
   5831 		y := v.Args[1]
   5832 		v.reset(OpS390XANDW)
   5833 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5834 		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5835 		v1.AddArg(x)
   5836 		v0.AddArg(v1)
   5837 		v0.AddArg(y)
   5838 		v.AddArg(v0)
   5839 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5840 		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5841 		v3.AuxInt = 7
   5842 		v3.AddArg(y)
   5843 		v2.AddArg(v3)
   5844 		v.AddArg(v2)
   5845 		return true
   5846 	}
   5847 }
   5848 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool {
   5849 	b := v.Block
   5850 	_ = b
   5851 	typ := &b.Func.Config.Types
   5852 	_ = typ
   5853 	// match: (Rsh8Ux8 <t> x y)
   5854 	// cond:
   5855 	// result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7])))
   5856 	for {
   5857 		t := v.Type
   5858 		_ = v.Args[1]
   5859 		x := v.Args[0]
   5860 		y := v.Args[1]
   5861 		v.reset(OpS390XANDW)
   5862 		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
   5863 		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5864 		v1.AddArg(x)
   5865 		v0.AddArg(v1)
   5866 		v0.AddArg(y)
   5867 		v.AddArg(v0)
   5868 		v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t)
   5869 		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5870 		v3.AuxInt = 7
   5871 		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   5872 		v4.AddArg(y)
   5873 		v3.AddArg(v4)
   5874 		v2.AddArg(v3)
   5875 		v.AddArg(v2)
   5876 		return true
   5877 	}
   5878 }
   5879 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool {
   5880 	b := v.Block
   5881 	_ = b
   5882 	typ := &b.Func.Config.Types
   5883 	_ = typ
   5884 	// match: (Rsh8x16 <t> x y)
   5885 	// cond:
   5886 	// result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7])))))
   5887 	for {
   5888 		t := v.Type
   5889 		_ = v.Args[1]
   5890 		x := v.Args[0]
   5891 		y := v.Args[1]
   5892 		v.reset(OpS390XSRAW)
   5893 		v.Type = t
   5894 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   5895 		v0.AddArg(x)
   5896 		v.AddArg(v0)
   5897 		v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5898 		v1.AddArg(y)
   5899 		v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5900 		v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5901 		v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5902 		v4.AuxInt = 7
   5903 		v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   5904 		v5.AddArg(y)
   5905 		v4.AddArg(v5)
   5906 		v3.AddArg(v4)
   5907 		v2.AddArg(v3)
   5908 		v1.AddArg(v2)
   5909 		v.AddArg(v1)
   5910 		return true
   5911 	}
   5912 }
   5913 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool {
   5914 	b := v.Block
   5915 	_ = b
   5916 	typ := &b.Func.Config.Types
   5917 	_ = typ
   5918 	// match: (Rsh8x32 <t> x y)
   5919 	// cond:
   5920 	// result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7])))))
   5921 	for {
   5922 		t := v.Type
   5923 		_ = v.Args[1]
   5924 		x := v.Args[0]
   5925 		y := v.Args[1]
   5926 		v.reset(OpS390XSRAW)
   5927 		v.Type = t
   5928 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   5929 		v0.AddArg(x)
   5930 		v.AddArg(v0)
   5931 		v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5932 		v1.AddArg(y)
   5933 		v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5934 		v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5935 		v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   5936 		v4.AuxInt = 7
   5937 		v4.AddArg(y)
   5938 		v3.AddArg(v4)
   5939 		v2.AddArg(v3)
   5940 		v1.AddArg(v2)
   5941 		v.AddArg(v1)
   5942 		return true
   5943 	}
   5944 }
   5945 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool {
   5946 	b := v.Block
   5947 	_ = b
   5948 	typ := &b.Func.Config.Types
   5949 	_ = typ
   5950 	// match: (Rsh8x64 <t> x y)
   5951 	// cond:
   5952 	// result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7])))))
   5953 	for {
   5954 		t := v.Type
   5955 		_ = v.Args[1]
   5956 		x := v.Args[0]
   5957 		y := v.Args[1]
   5958 		v.reset(OpS390XSRAW)
   5959 		v.Type = t
   5960 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   5961 		v0.AddArg(x)
   5962 		v.AddArg(v0)
   5963 		v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type)
   5964 		v1.AddArg(y)
   5965 		v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type)
   5966 		v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type)
   5967 		v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   5968 		v4.AuxInt = 7
   5969 		v4.AddArg(y)
   5970 		v3.AddArg(v4)
   5971 		v2.AddArg(v3)
   5972 		v1.AddArg(v2)
   5973 		v.AddArg(v1)
   5974 		return true
   5975 	}
   5976 }
   5977 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool {
   5978 	b := v.Block
   5979 	_ = b
   5980 	typ := &b.Func.Config.Types
   5981 	_ = typ
   5982 	// match: (Rsh8x8 <t> x y)
   5983 	// cond:
   5984 	// result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7])))))
   5985 	for {
   5986 		t := v.Type
   5987 		_ = v.Args[1]
   5988 		x := v.Args[0]
   5989 		y := v.Args[1]
   5990 		v.reset(OpS390XSRAW)
   5991 		v.Type = t
   5992 		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
   5993 		v0.AddArg(x)
   5994 		v.AddArg(v0)
   5995 		v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type)
   5996 		v1.AddArg(y)
   5997 		v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type)
   5998 		v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type)
   5999 		v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   6000 		v4.AuxInt = 7
   6001 		v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
   6002 		v5.AddArg(y)
   6003 		v4.AddArg(v5)
   6004 		v3.AddArg(v4)
   6005 		v2.AddArg(v3)
   6006 		v1.AddArg(v2)
   6007 		v.AddArg(v1)
   6008 		return true
   6009 	}
   6010 }
   6011 func rewriteValueS390X_OpS390XADD_0(v *Value) bool {
   6012 	// match: (ADD x (MOVDconst [c]))
   6013 	// cond: is32Bit(c)
   6014 	// result: (ADDconst [c] x)
   6015 	for {
   6016 		_ = v.Args[1]
   6017 		x := v.Args[0]
   6018 		v_1 := v.Args[1]
   6019 		if v_1.Op != OpS390XMOVDconst {
   6020 			break
   6021 		}
   6022 		c := v_1.AuxInt
   6023 		if !(is32Bit(c)) {
   6024 			break
   6025 		}
   6026 		v.reset(OpS390XADDconst)
   6027 		v.AuxInt = c
   6028 		v.AddArg(x)
   6029 		return true
   6030 	}
   6031 	// match: (ADD (MOVDconst [c]) x)
   6032 	// cond: is32Bit(c)
   6033 	// result: (ADDconst [c] x)
   6034 	for {
   6035 		_ = v.Args[1]
   6036 		v_0 := v.Args[0]
   6037 		if v_0.Op != OpS390XMOVDconst {
   6038 			break
   6039 		}
   6040 		c := v_0.AuxInt
   6041 		x := v.Args[1]
   6042 		if !(is32Bit(c)) {
   6043 			break
   6044 		}
   6045 		v.reset(OpS390XADDconst)
   6046 		v.AuxInt = c
   6047 		v.AddArg(x)
   6048 		return true
   6049 	}
   6050 	// match: (ADD (SLDconst x [c]) (SRDconst x [d]))
   6051 	// cond: d == 64-c
   6052 	// result: (RLLGconst [c] x)
   6053 	for {
   6054 		_ = v.Args[1]
   6055 		v_0 := v.Args[0]
   6056 		if v_0.Op != OpS390XSLDconst {
   6057 			break
   6058 		}
   6059 		c := v_0.AuxInt
   6060 		x := v_0.Args[0]
   6061 		v_1 := v.Args[1]
   6062 		if v_1.Op != OpS390XSRDconst {
   6063 			break
   6064 		}
   6065 		d := v_1.AuxInt
   6066 		if x != v_1.Args[0] {
   6067 			break
   6068 		}
   6069 		if !(d == 64-c) {
   6070 			break
   6071 		}
   6072 		v.reset(OpS390XRLLGconst)
   6073 		v.AuxInt = c
   6074 		v.AddArg(x)
   6075 		return true
   6076 	}
   6077 	// match: (ADD (SRDconst x [d]) (SLDconst x [c]))
   6078 	// cond: d == 64-c
   6079 	// result: (RLLGconst [c] x)
   6080 	for {
   6081 		_ = v.Args[1]
   6082 		v_0 := v.Args[0]
   6083 		if v_0.Op != OpS390XSRDconst {
   6084 			break
   6085 		}
   6086 		d := v_0.AuxInt
   6087 		x := v_0.Args[0]
   6088 		v_1 := v.Args[1]
   6089 		if v_1.Op != OpS390XSLDconst {
   6090 			break
   6091 		}
   6092 		c := v_1.AuxInt
   6093 		if x != v_1.Args[0] {
   6094 			break
   6095 		}
   6096 		if !(d == 64-c) {
   6097 			break
   6098 		}
   6099 		v.reset(OpS390XRLLGconst)
   6100 		v.AuxInt = c
   6101 		v.AddArg(x)
   6102 		return true
   6103 	}
   6104 	// match: (ADD idx (MOVDaddr [c] {s} ptr))
   6105 	// cond: ptr.Op != OpSB && idx.Op != OpSB
   6106 	// result: (MOVDaddridx [c] {s} ptr idx)
   6107 	for {
   6108 		_ = v.Args[1]
   6109 		idx := v.Args[0]
   6110 		v_1 := v.Args[1]
   6111 		if v_1.Op != OpS390XMOVDaddr {
   6112 			break
   6113 		}
   6114 		c := v_1.AuxInt
   6115 		s := v_1.Aux
   6116 		ptr := v_1.Args[0]
   6117 		if !(ptr.Op != OpSB && idx.Op != OpSB) {
   6118 			break
   6119 		}
   6120 		v.reset(OpS390XMOVDaddridx)
   6121 		v.AuxInt = c
   6122 		v.Aux = s
   6123 		v.AddArg(ptr)
   6124 		v.AddArg(idx)
   6125 		return true
   6126 	}
   6127 	// match: (ADD (MOVDaddr [c] {s} ptr) idx)
   6128 	// cond: ptr.Op != OpSB && idx.Op != OpSB
   6129 	// result: (MOVDaddridx [c] {s} ptr idx)
   6130 	for {
   6131 		_ = v.Args[1]
   6132 		v_0 := v.Args[0]
   6133 		if v_0.Op != OpS390XMOVDaddr {
   6134 			break
   6135 		}
   6136 		c := v_0.AuxInt
   6137 		s := v_0.Aux
   6138 		ptr := v_0.Args[0]
   6139 		idx := v.Args[1]
   6140 		if !(ptr.Op != OpSB && idx.Op != OpSB) {
   6141 			break
   6142 		}
   6143 		v.reset(OpS390XMOVDaddridx)
   6144 		v.AuxInt = c
   6145 		v.Aux = s
   6146 		v.AddArg(ptr)
   6147 		v.AddArg(idx)
   6148 		return true
   6149 	}
   6150 	// match: (ADD x (NEG y))
   6151 	// cond:
   6152 	// result: (SUB x y)
   6153 	for {
   6154 		_ = v.Args[1]
   6155 		x := v.Args[0]
   6156 		v_1 := v.Args[1]
   6157 		if v_1.Op != OpS390XNEG {
   6158 			break
   6159 		}
   6160 		y := v_1.Args[0]
   6161 		v.reset(OpS390XSUB)
   6162 		v.AddArg(x)
   6163 		v.AddArg(y)
   6164 		return true
   6165 	}
   6166 	// match: (ADD (NEG y) x)
   6167 	// cond:
   6168 	// result: (SUB x y)
   6169 	for {
   6170 		_ = v.Args[1]
   6171 		v_0 := v.Args[0]
   6172 		if v_0.Op != OpS390XNEG {
   6173 			break
   6174 		}
   6175 		y := v_0.Args[0]
   6176 		x := v.Args[1]
   6177 		v.reset(OpS390XSUB)
   6178 		v.AddArg(x)
   6179 		v.AddArg(y)
   6180 		return true
   6181 	}
   6182 	// match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem))
   6183 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6184 	// result: (ADDload <t> [off] {sym} x ptr mem)
   6185 	for {
   6186 		t := v.Type
   6187 		_ = v.Args[1]
   6188 		x := v.Args[0]
   6189 		g := v.Args[1]
   6190 		if g.Op != OpS390XMOVDload {
   6191 			break
   6192 		}
   6193 		off := g.AuxInt
   6194 		sym := g.Aux
   6195 		_ = g.Args[1]
   6196 		ptr := g.Args[0]
   6197 		mem := g.Args[1]
   6198 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6199 			break
   6200 		}
   6201 		v.reset(OpS390XADDload)
   6202 		v.Type = t
   6203 		v.AuxInt = off
   6204 		v.Aux = sym
   6205 		v.AddArg(x)
   6206 		v.AddArg(ptr)
   6207 		v.AddArg(mem)
   6208 		return true
   6209 	}
   6210 	// match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x)
   6211 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6212 	// result: (ADDload <t> [off] {sym} x ptr mem)
   6213 	for {
   6214 		t := v.Type
   6215 		_ = v.Args[1]
   6216 		g := v.Args[0]
   6217 		if g.Op != OpS390XMOVDload {
   6218 			break
   6219 		}
   6220 		off := g.AuxInt
   6221 		sym := g.Aux
   6222 		_ = g.Args[1]
   6223 		ptr := g.Args[0]
   6224 		mem := g.Args[1]
   6225 		x := v.Args[1]
   6226 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6227 			break
   6228 		}
   6229 		v.reset(OpS390XADDload)
   6230 		v.Type = t
   6231 		v.AuxInt = off
   6232 		v.Aux = sym
   6233 		v.AddArg(x)
   6234 		v.AddArg(ptr)
   6235 		v.AddArg(mem)
   6236 		return true
   6237 	}
   6238 	return false
   6239 }
   6240 func rewriteValueS390X_OpS390XADD_10(v *Value) bool {
   6241 	// match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x)
   6242 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6243 	// result: (ADDload <t> [off] {sym} x ptr mem)
   6244 	for {
   6245 		t := v.Type
   6246 		_ = v.Args[1]
   6247 		g := v.Args[0]
   6248 		if g.Op != OpS390XMOVDload {
   6249 			break
   6250 		}
   6251 		off := g.AuxInt
   6252 		sym := g.Aux
   6253 		_ = g.Args[1]
   6254 		ptr := g.Args[0]
   6255 		mem := g.Args[1]
   6256 		x := v.Args[1]
   6257 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6258 			break
   6259 		}
   6260 		v.reset(OpS390XADDload)
   6261 		v.Type = t
   6262 		v.AuxInt = off
   6263 		v.Aux = sym
   6264 		v.AddArg(x)
   6265 		v.AddArg(ptr)
   6266 		v.AddArg(mem)
   6267 		return true
   6268 	}
   6269 	// match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem))
   6270 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6271 	// result: (ADDload <t> [off] {sym} x ptr mem)
   6272 	for {
   6273 		t := v.Type
   6274 		_ = v.Args[1]
   6275 		x := v.Args[0]
   6276 		g := v.Args[1]
   6277 		if g.Op != OpS390XMOVDload {
   6278 			break
   6279 		}
   6280 		off := g.AuxInt
   6281 		sym := g.Aux
   6282 		_ = g.Args[1]
   6283 		ptr := g.Args[0]
   6284 		mem := g.Args[1]
   6285 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6286 			break
   6287 		}
   6288 		v.reset(OpS390XADDload)
   6289 		v.Type = t
   6290 		v.AuxInt = off
   6291 		v.Aux = sym
   6292 		v.AddArg(x)
   6293 		v.AddArg(ptr)
   6294 		v.AddArg(mem)
   6295 		return true
   6296 	}
   6297 	return false
   6298 }
   6299 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool {
   6300 	// match: (ADDW x (MOVDconst [c]))
   6301 	// cond:
   6302 	// result: (ADDWconst [int64(int32(c))] x)
   6303 	for {
   6304 		_ = v.Args[1]
   6305 		x := v.Args[0]
   6306 		v_1 := v.Args[1]
   6307 		if v_1.Op != OpS390XMOVDconst {
   6308 			break
   6309 		}
   6310 		c := v_1.AuxInt
   6311 		v.reset(OpS390XADDWconst)
   6312 		v.AuxInt = int64(int32(c))
   6313 		v.AddArg(x)
   6314 		return true
   6315 	}
   6316 	// match: (ADDW (MOVDconst [c]) x)
   6317 	// cond:
   6318 	// result: (ADDWconst [int64(int32(c))] x)
   6319 	for {
   6320 		_ = v.Args[1]
   6321 		v_0 := v.Args[0]
   6322 		if v_0.Op != OpS390XMOVDconst {
   6323 			break
   6324 		}
   6325 		c := v_0.AuxInt
   6326 		x := v.Args[1]
   6327 		v.reset(OpS390XADDWconst)
   6328 		v.AuxInt = int64(int32(c))
   6329 		v.AddArg(x)
   6330 		return true
   6331 	}
   6332 	// match: (ADDW (SLWconst x [c]) (SRWconst x [d]))
   6333 	// cond: d == 32-c
   6334 	// result: (RLLconst [c] x)
   6335 	for {
   6336 		_ = v.Args[1]
   6337 		v_0 := v.Args[0]
   6338 		if v_0.Op != OpS390XSLWconst {
   6339 			break
   6340 		}
   6341 		c := v_0.AuxInt
   6342 		x := v_0.Args[0]
   6343 		v_1 := v.Args[1]
   6344 		if v_1.Op != OpS390XSRWconst {
   6345 			break
   6346 		}
   6347 		d := v_1.AuxInt
   6348 		if x != v_1.Args[0] {
   6349 			break
   6350 		}
   6351 		if !(d == 32-c) {
   6352 			break
   6353 		}
   6354 		v.reset(OpS390XRLLconst)
   6355 		v.AuxInt = c
   6356 		v.AddArg(x)
   6357 		return true
   6358 	}
   6359 	// match: (ADDW (SRWconst x [d]) (SLWconst x [c]))
   6360 	// cond: d == 32-c
   6361 	// result: (RLLconst [c] x)
   6362 	for {
   6363 		_ = v.Args[1]
   6364 		v_0 := v.Args[0]
   6365 		if v_0.Op != OpS390XSRWconst {
   6366 			break
   6367 		}
   6368 		d := v_0.AuxInt
   6369 		x := v_0.Args[0]
   6370 		v_1 := v.Args[1]
   6371 		if v_1.Op != OpS390XSLWconst {
   6372 			break
   6373 		}
   6374 		c := v_1.AuxInt
   6375 		if x != v_1.Args[0] {
   6376 			break
   6377 		}
   6378 		if !(d == 32-c) {
   6379 			break
   6380 		}
   6381 		v.reset(OpS390XRLLconst)
   6382 		v.AuxInt = c
   6383 		v.AddArg(x)
   6384 		return true
   6385 	}
   6386 	// match: (ADDW x (NEGW y))
   6387 	// cond:
   6388 	// result: (SUBW x y)
   6389 	for {
   6390 		_ = v.Args[1]
   6391 		x := v.Args[0]
   6392 		v_1 := v.Args[1]
   6393 		if v_1.Op != OpS390XNEGW {
   6394 			break
   6395 		}
   6396 		y := v_1.Args[0]
   6397 		v.reset(OpS390XSUBW)
   6398 		v.AddArg(x)
   6399 		v.AddArg(y)
   6400 		return true
   6401 	}
   6402 	// match: (ADDW (NEGW y) x)
   6403 	// cond:
   6404 	// result: (SUBW x y)
   6405 	for {
   6406 		_ = v.Args[1]
   6407 		v_0 := v.Args[0]
   6408 		if v_0.Op != OpS390XNEGW {
   6409 			break
   6410 		}
   6411 		y := v_0.Args[0]
   6412 		x := v.Args[1]
   6413 		v.reset(OpS390XSUBW)
   6414 		v.AddArg(x)
   6415 		v.AddArg(y)
   6416 		return true
   6417 	}
   6418 	// match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem))
   6419 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6420 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6421 	for {
   6422 		t := v.Type
   6423 		_ = v.Args[1]
   6424 		x := v.Args[0]
   6425 		g := v.Args[1]
   6426 		if g.Op != OpS390XMOVWload {
   6427 			break
   6428 		}
   6429 		off := g.AuxInt
   6430 		sym := g.Aux
   6431 		_ = g.Args[1]
   6432 		ptr := g.Args[0]
   6433 		mem := g.Args[1]
   6434 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6435 			break
   6436 		}
   6437 		v.reset(OpS390XADDWload)
   6438 		v.Type = t
   6439 		v.AuxInt = off
   6440 		v.Aux = sym
   6441 		v.AddArg(x)
   6442 		v.AddArg(ptr)
   6443 		v.AddArg(mem)
   6444 		return true
   6445 	}
   6446 	// match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x)
   6447 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6448 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6449 	for {
   6450 		t := v.Type
   6451 		_ = v.Args[1]
   6452 		g := v.Args[0]
   6453 		if g.Op != OpS390XMOVWload {
   6454 			break
   6455 		}
   6456 		off := g.AuxInt
   6457 		sym := g.Aux
   6458 		_ = g.Args[1]
   6459 		ptr := g.Args[0]
   6460 		mem := g.Args[1]
   6461 		x := v.Args[1]
   6462 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6463 			break
   6464 		}
   6465 		v.reset(OpS390XADDWload)
   6466 		v.Type = t
   6467 		v.AuxInt = off
   6468 		v.Aux = sym
   6469 		v.AddArg(x)
   6470 		v.AddArg(ptr)
   6471 		v.AddArg(mem)
   6472 		return true
   6473 	}
   6474 	// match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x)
   6475 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6476 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6477 	for {
   6478 		t := v.Type
   6479 		_ = v.Args[1]
   6480 		g := v.Args[0]
   6481 		if g.Op != OpS390XMOVWload {
   6482 			break
   6483 		}
   6484 		off := g.AuxInt
   6485 		sym := g.Aux
   6486 		_ = g.Args[1]
   6487 		ptr := g.Args[0]
   6488 		mem := g.Args[1]
   6489 		x := v.Args[1]
   6490 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6491 			break
   6492 		}
   6493 		v.reset(OpS390XADDWload)
   6494 		v.Type = t
   6495 		v.AuxInt = off
   6496 		v.Aux = sym
   6497 		v.AddArg(x)
   6498 		v.AddArg(ptr)
   6499 		v.AddArg(mem)
   6500 		return true
   6501 	}
   6502 	// match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem))
   6503 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6504 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6505 	for {
   6506 		t := v.Type
   6507 		_ = v.Args[1]
   6508 		x := v.Args[0]
   6509 		g := v.Args[1]
   6510 		if g.Op != OpS390XMOVWload {
   6511 			break
   6512 		}
   6513 		off := g.AuxInt
   6514 		sym := g.Aux
   6515 		_ = g.Args[1]
   6516 		ptr := g.Args[0]
   6517 		mem := g.Args[1]
   6518 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6519 			break
   6520 		}
   6521 		v.reset(OpS390XADDWload)
   6522 		v.Type = t
   6523 		v.AuxInt = off
   6524 		v.Aux = sym
   6525 		v.AddArg(x)
   6526 		v.AddArg(ptr)
   6527 		v.AddArg(mem)
   6528 		return true
   6529 	}
   6530 	return false
   6531 }
   6532 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool {
   6533 	// match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem))
   6534 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6535 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6536 	for {
   6537 		t := v.Type
   6538 		_ = v.Args[1]
   6539 		x := v.Args[0]
   6540 		g := v.Args[1]
   6541 		if g.Op != OpS390XMOVWZload {
   6542 			break
   6543 		}
   6544 		off := g.AuxInt
   6545 		sym := g.Aux
   6546 		_ = g.Args[1]
   6547 		ptr := g.Args[0]
   6548 		mem := g.Args[1]
   6549 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6550 			break
   6551 		}
   6552 		v.reset(OpS390XADDWload)
   6553 		v.Type = t
   6554 		v.AuxInt = off
   6555 		v.Aux = sym
   6556 		v.AddArg(x)
   6557 		v.AddArg(ptr)
   6558 		v.AddArg(mem)
   6559 		return true
   6560 	}
   6561 	// match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   6562 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6563 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6564 	for {
   6565 		t := v.Type
   6566 		_ = v.Args[1]
   6567 		g := v.Args[0]
   6568 		if g.Op != OpS390XMOVWZload {
   6569 			break
   6570 		}
   6571 		off := g.AuxInt
   6572 		sym := g.Aux
   6573 		_ = g.Args[1]
   6574 		ptr := g.Args[0]
   6575 		mem := g.Args[1]
   6576 		x := v.Args[1]
   6577 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6578 			break
   6579 		}
   6580 		v.reset(OpS390XADDWload)
   6581 		v.Type = t
   6582 		v.AuxInt = off
   6583 		v.Aux = sym
   6584 		v.AddArg(x)
   6585 		v.AddArg(ptr)
   6586 		v.AddArg(mem)
   6587 		return true
   6588 	}
   6589 	// match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   6590 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6591 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6592 	for {
   6593 		t := v.Type
   6594 		_ = v.Args[1]
   6595 		g := v.Args[0]
   6596 		if g.Op != OpS390XMOVWZload {
   6597 			break
   6598 		}
   6599 		off := g.AuxInt
   6600 		sym := g.Aux
   6601 		_ = g.Args[1]
   6602 		ptr := g.Args[0]
   6603 		mem := g.Args[1]
   6604 		x := v.Args[1]
   6605 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6606 			break
   6607 		}
   6608 		v.reset(OpS390XADDWload)
   6609 		v.Type = t
   6610 		v.AuxInt = off
   6611 		v.Aux = sym
   6612 		v.AddArg(x)
   6613 		v.AddArg(ptr)
   6614 		v.AddArg(mem)
   6615 		return true
   6616 	}
   6617 	// match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem))
   6618 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   6619 	// result: (ADDWload <t> [off] {sym} x ptr mem)
   6620 	for {
   6621 		t := v.Type
   6622 		_ = v.Args[1]
   6623 		x := v.Args[0]
   6624 		g := v.Args[1]
   6625 		if g.Op != OpS390XMOVWZload {
   6626 			break
   6627 		}
   6628 		off := g.AuxInt
   6629 		sym := g.Aux
   6630 		_ = g.Args[1]
   6631 		ptr := g.Args[0]
   6632 		mem := g.Args[1]
   6633 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   6634 			break
   6635 		}
   6636 		v.reset(OpS390XADDWload)
   6637 		v.Type = t
   6638 		v.AuxInt = off
   6639 		v.Aux = sym
   6640 		v.AddArg(x)
   6641 		v.AddArg(ptr)
   6642 		v.AddArg(mem)
   6643 		return true
   6644 	}
   6645 	return false
   6646 }
   6647 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool {
   6648 	// match: (ADDWconst [c] x)
   6649 	// cond: int32(c)==0
   6650 	// result: x
   6651 	for {
   6652 		c := v.AuxInt
   6653 		x := v.Args[0]
   6654 		if !(int32(c) == 0) {
   6655 			break
   6656 		}
   6657 		v.reset(OpCopy)
   6658 		v.Type = x.Type
   6659 		v.AddArg(x)
   6660 		return true
   6661 	}
   6662 	// match: (ADDWconst [c] (MOVDconst [d]))
   6663 	// cond:
   6664 	// result: (MOVDconst [int64(int32(c+d))])
   6665 	for {
   6666 		c := v.AuxInt
   6667 		v_0 := v.Args[0]
   6668 		if v_0.Op != OpS390XMOVDconst {
   6669 			break
   6670 		}
   6671 		d := v_0.AuxInt
   6672 		v.reset(OpS390XMOVDconst)
   6673 		v.AuxInt = int64(int32(c + d))
   6674 		return true
   6675 	}
   6676 	// match: (ADDWconst [c] (ADDWconst [d] x))
   6677 	// cond:
   6678 	// result: (ADDWconst [int64(int32(c+d))] x)
   6679 	for {
   6680 		c := v.AuxInt
   6681 		v_0 := v.Args[0]
   6682 		if v_0.Op != OpS390XADDWconst {
   6683 			break
   6684 		}
   6685 		d := v_0.AuxInt
   6686 		x := v_0.Args[0]
   6687 		v.reset(OpS390XADDWconst)
   6688 		v.AuxInt = int64(int32(c + d))
   6689 		v.AddArg(x)
   6690 		return true
   6691 	}
   6692 	return false
   6693 }
   6694 func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool {
   6695 	// match: (ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem)
   6696 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   6697 	// result: (ADDWload  [off1+off2] {sym} x ptr mem)
   6698 	for {
   6699 		off1 := v.AuxInt
   6700 		sym := v.Aux
   6701 		_ = v.Args[2]
   6702 		x := v.Args[0]
   6703 		v_1 := v.Args[1]
   6704 		if v_1.Op != OpS390XADDconst {
   6705 			break
   6706 		}
   6707 		off2 := v_1.AuxInt
   6708 		ptr := v_1.Args[0]
   6709 		mem := v.Args[2]
   6710 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   6711 			break
   6712 		}
   6713 		v.reset(OpS390XADDWload)
   6714 		v.AuxInt = off1 + off2
   6715 		v.Aux = sym
   6716 		v.AddArg(x)
   6717 		v.AddArg(ptr)
   6718 		v.AddArg(mem)
   6719 		return true
   6720 	}
   6721 	// match: (ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   6722 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   6723 	// result: (ADDWload  [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   6724 	for {
   6725 		o1 := v.AuxInt
   6726 		s1 := v.Aux
   6727 		_ = v.Args[2]
   6728 		x := v.Args[0]
   6729 		v_1 := v.Args[1]
   6730 		if v_1.Op != OpS390XMOVDaddr {
   6731 			break
   6732 		}
   6733 		o2 := v_1.AuxInt
   6734 		s2 := v_1.Aux
   6735 		ptr := v_1.Args[0]
   6736 		mem := v.Args[2]
   6737 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   6738 			break
   6739 		}
   6740 		v.reset(OpS390XADDWload)
   6741 		v.AuxInt = o1 + o2
   6742 		v.Aux = mergeSym(s1, s2)
   6743 		v.AddArg(x)
   6744 		v.AddArg(ptr)
   6745 		v.AddArg(mem)
   6746 		return true
   6747 	}
   6748 	return false
   6749 }
   6750 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool {
   6751 	// match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB)))
   6752 	// cond: ((c+d)&1 == 0) && is32Bit(c+d)
   6753 	// result: (MOVDaddr [c+d] {s} x)
   6754 	for {
   6755 		c := v.AuxInt
   6756 		v_0 := v.Args[0]
   6757 		if v_0.Op != OpS390XMOVDaddr {
   6758 			break
   6759 		}
   6760 		d := v_0.AuxInt
   6761 		s := v_0.Aux
   6762 		x := v_0.Args[0]
   6763 		if x.Op != OpSB {
   6764 			break
   6765 		}
   6766 		if !(((c+d)&1 == 0) && is32Bit(c+d)) {
   6767 			break
   6768 		}
   6769 		v.reset(OpS390XMOVDaddr)
   6770 		v.AuxInt = c + d
   6771 		v.Aux = s
   6772 		v.AddArg(x)
   6773 		return true
   6774 	}
   6775 	// match: (ADDconst [c] (MOVDaddr [d] {s} x))
   6776 	// cond: x.Op != OpSB && is20Bit(c+d)
   6777 	// result: (MOVDaddr [c+d] {s} x)
   6778 	for {
   6779 		c := v.AuxInt
   6780 		v_0 := v.Args[0]
   6781 		if v_0.Op != OpS390XMOVDaddr {
   6782 			break
   6783 		}
   6784 		d := v_0.AuxInt
   6785 		s := v_0.Aux
   6786 		x := v_0.Args[0]
   6787 		if !(x.Op != OpSB && is20Bit(c+d)) {
   6788 			break
   6789 		}
   6790 		v.reset(OpS390XMOVDaddr)
   6791 		v.AuxInt = c + d
   6792 		v.Aux = s
   6793 		v.AddArg(x)
   6794 		return true
   6795 	}
   6796 	// match: (ADDconst [c] (MOVDaddridx [d] {s} x y))
   6797 	// cond: is20Bit(c+d)
   6798 	// result: (MOVDaddridx [c+d] {s} x y)
   6799 	for {
   6800 		c := v.AuxInt
   6801 		v_0 := v.Args[0]
   6802 		if v_0.Op != OpS390XMOVDaddridx {
   6803 			break
   6804 		}
   6805 		d := v_0.AuxInt
   6806 		s := v_0.Aux
   6807 		_ = v_0.Args[1]
   6808 		x := v_0.Args[0]
   6809 		y := v_0.Args[1]
   6810 		if !(is20Bit(c + d)) {
   6811 			break
   6812 		}
   6813 		v.reset(OpS390XMOVDaddridx)
   6814 		v.AuxInt = c + d
   6815 		v.Aux = s
   6816 		v.AddArg(x)
   6817 		v.AddArg(y)
   6818 		return true
   6819 	}
   6820 	// match: (ADDconst [0] x)
   6821 	// cond:
   6822 	// result: x
   6823 	for {
   6824 		if v.AuxInt != 0 {
   6825 			break
   6826 		}
   6827 		x := v.Args[0]
   6828 		v.reset(OpCopy)
   6829 		v.Type = x.Type
   6830 		v.AddArg(x)
   6831 		return true
   6832 	}
   6833 	// match: (ADDconst [c] (MOVDconst [d]))
   6834 	// cond:
   6835 	// result: (MOVDconst [c+d])
   6836 	for {
   6837 		c := v.AuxInt
   6838 		v_0 := v.Args[0]
   6839 		if v_0.Op != OpS390XMOVDconst {
   6840 			break
   6841 		}
   6842 		d := v_0.AuxInt
   6843 		v.reset(OpS390XMOVDconst)
   6844 		v.AuxInt = c + d
   6845 		return true
   6846 	}
   6847 	// match: (ADDconst [c] (ADDconst [d] x))
   6848 	// cond: is32Bit(c+d)
   6849 	// result: (ADDconst [c+d] x)
   6850 	for {
   6851 		c := v.AuxInt
   6852 		v_0 := v.Args[0]
   6853 		if v_0.Op != OpS390XADDconst {
   6854 			break
   6855 		}
   6856 		d := v_0.AuxInt
   6857 		x := v_0.Args[0]
   6858 		if !(is32Bit(c + d)) {
   6859 			break
   6860 		}
   6861 		v.reset(OpS390XADDconst)
   6862 		v.AuxInt = c + d
   6863 		v.AddArg(x)
   6864 		return true
   6865 	}
   6866 	return false
   6867 }
   6868 func rewriteValueS390X_OpS390XADDload_0(v *Value) bool {
   6869 	b := v.Block
   6870 	_ = b
   6871 	// match: (ADDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
   6872 	// cond: isSamePtr(ptr1, ptr2)
   6873 	// result: (ADD   x (LGDR <t> y))
   6874 	for {
   6875 		t := v.Type
   6876 		off := v.AuxInt
   6877 		sym := v.Aux
   6878 		_ = v.Args[2]
   6879 		x := v.Args[0]
   6880 		ptr1 := v.Args[1]
   6881 		v_2 := v.Args[2]
   6882 		if v_2.Op != OpS390XFMOVDstore {
   6883 			break
   6884 		}
   6885 		if v_2.AuxInt != off {
   6886 			break
   6887 		}
   6888 		if v_2.Aux != sym {
   6889 			break
   6890 		}
   6891 		_ = v_2.Args[2]
   6892 		ptr2 := v_2.Args[0]
   6893 		y := v_2.Args[1]
   6894 		if !(isSamePtr(ptr1, ptr2)) {
   6895 			break
   6896 		}
   6897 		v.reset(OpS390XADD)
   6898 		v.AddArg(x)
   6899 		v0 := b.NewValue0(v.Pos, OpS390XLGDR, t)
   6900 		v0.AddArg(y)
   6901 		v.AddArg(v0)
   6902 		return true
   6903 	}
   6904 	// match: (ADDload [off1] {sym} x (ADDconst [off2] ptr) mem)
   6905 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   6906 	// result: (ADDload   [off1+off2] {sym} x ptr mem)
   6907 	for {
   6908 		off1 := v.AuxInt
   6909 		sym := v.Aux
   6910 		_ = v.Args[2]
   6911 		x := v.Args[0]
   6912 		v_1 := v.Args[1]
   6913 		if v_1.Op != OpS390XADDconst {
   6914 			break
   6915 		}
   6916 		off2 := v_1.AuxInt
   6917 		ptr := v_1.Args[0]
   6918 		mem := v.Args[2]
   6919 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   6920 			break
   6921 		}
   6922 		v.reset(OpS390XADDload)
   6923 		v.AuxInt = off1 + off2
   6924 		v.Aux = sym
   6925 		v.AddArg(x)
   6926 		v.AddArg(ptr)
   6927 		v.AddArg(mem)
   6928 		return true
   6929 	}
   6930 	// match: (ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   6931 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   6932 	// result: (ADDload   [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   6933 	for {
   6934 		o1 := v.AuxInt
   6935 		s1 := v.Aux
   6936 		_ = v.Args[2]
   6937 		x := v.Args[0]
   6938 		v_1 := v.Args[1]
   6939 		if v_1.Op != OpS390XMOVDaddr {
   6940 			break
   6941 		}
   6942 		o2 := v_1.AuxInt
   6943 		s2 := v_1.Aux
   6944 		ptr := v_1.Args[0]
   6945 		mem := v.Args[2]
   6946 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   6947 			break
   6948 		}
   6949 		v.reset(OpS390XADDload)
   6950 		v.AuxInt = o1 + o2
   6951 		v.Aux = mergeSym(s1, s2)
   6952 		v.AddArg(x)
   6953 		v.AddArg(ptr)
   6954 		v.AddArg(mem)
   6955 		return true
   6956 	}
   6957 	return false
   6958 }
   6959 func rewriteValueS390X_OpS390XAND_0(v *Value) bool {
   6960 	// match: (AND x (MOVDconst [c]))
   6961 	// cond: is32Bit(c) && c < 0
   6962 	// result: (ANDconst [c] x)
   6963 	for {
   6964 		_ = v.Args[1]
   6965 		x := v.Args[0]
   6966 		v_1 := v.Args[1]
   6967 		if v_1.Op != OpS390XMOVDconst {
   6968 			break
   6969 		}
   6970 		c := v_1.AuxInt
   6971 		if !(is32Bit(c) && c < 0) {
   6972 			break
   6973 		}
   6974 		v.reset(OpS390XANDconst)
   6975 		v.AuxInt = c
   6976 		v.AddArg(x)
   6977 		return true
   6978 	}
   6979 	// match: (AND (MOVDconst [c]) x)
   6980 	// cond: is32Bit(c) && c < 0
   6981 	// result: (ANDconst [c] x)
   6982 	for {
   6983 		_ = v.Args[1]
   6984 		v_0 := v.Args[0]
   6985 		if v_0.Op != OpS390XMOVDconst {
   6986 			break
   6987 		}
   6988 		c := v_0.AuxInt
   6989 		x := v.Args[1]
   6990 		if !(is32Bit(c) && c < 0) {
   6991 			break
   6992 		}
   6993 		v.reset(OpS390XANDconst)
   6994 		v.AuxInt = c
   6995 		v.AddArg(x)
   6996 		return true
   6997 	}
   6998 	// match: (AND x (MOVDconst [0xFF]))
   6999 	// cond:
   7000 	// result: (MOVBZreg x)
   7001 	for {
   7002 		_ = v.Args[1]
   7003 		x := v.Args[0]
   7004 		v_1 := v.Args[1]
   7005 		if v_1.Op != OpS390XMOVDconst {
   7006 			break
   7007 		}
   7008 		if v_1.AuxInt != 0xFF {
   7009 			break
   7010 		}
   7011 		v.reset(OpS390XMOVBZreg)
   7012 		v.AddArg(x)
   7013 		return true
   7014 	}
   7015 	// match: (AND (MOVDconst [0xFF]) x)
   7016 	// cond:
   7017 	// result: (MOVBZreg x)
   7018 	for {
   7019 		_ = v.Args[1]
   7020 		v_0 := v.Args[0]
   7021 		if v_0.Op != OpS390XMOVDconst {
   7022 			break
   7023 		}
   7024 		if v_0.AuxInt != 0xFF {
   7025 			break
   7026 		}
   7027 		x := v.Args[1]
   7028 		v.reset(OpS390XMOVBZreg)
   7029 		v.AddArg(x)
   7030 		return true
   7031 	}
   7032 	// match: (AND x (MOVDconst [0xFFFF]))
   7033 	// cond:
   7034 	// result: (MOVHZreg x)
   7035 	for {
   7036 		_ = v.Args[1]
   7037 		x := v.Args[0]
   7038 		v_1 := v.Args[1]
   7039 		if v_1.Op != OpS390XMOVDconst {
   7040 			break
   7041 		}
   7042 		if v_1.AuxInt != 0xFFFF {
   7043 			break
   7044 		}
   7045 		v.reset(OpS390XMOVHZreg)
   7046 		v.AddArg(x)
   7047 		return true
   7048 	}
   7049 	// match: (AND (MOVDconst [0xFFFF]) x)
   7050 	// cond:
   7051 	// result: (MOVHZreg x)
   7052 	for {
   7053 		_ = v.Args[1]
   7054 		v_0 := v.Args[0]
   7055 		if v_0.Op != OpS390XMOVDconst {
   7056 			break
   7057 		}
   7058 		if v_0.AuxInt != 0xFFFF {
   7059 			break
   7060 		}
   7061 		x := v.Args[1]
   7062 		v.reset(OpS390XMOVHZreg)
   7063 		v.AddArg(x)
   7064 		return true
   7065 	}
   7066 	// match: (AND x (MOVDconst [0xFFFFFFFF]))
   7067 	// cond:
   7068 	// result: (MOVWZreg x)
   7069 	for {
   7070 		_ = v.Args[1]
   7071 		x := v.Args[0]
   7072 		v_1 := v.Args[1]
   7073 		if v_1.Op != OpS390XMOVDconst {
   7074 			break
   7075 		}
   7076 		if v_1.AuxInt != 0xFFFFFFFF {
   7077 			break
   7078 		}
   7079 		v.reset(OpS390XMOVWZreg)
   7080 		v.AddArg(x)
   7081 		return true
   7082 	}
   7083 	// match: (AND (MOVDconst [0xFFFFFFFF]) x)
   7084 	// cond:
   7085 	// result: (MOVWZreg x)
   7086 	for {
   7087 		_ = v.Args[1]
   7088 		v_0 := v.Args[0]
   7089 		if v_0.Op != OpS390XMOVDconst {
   7090 			break
   7091 		}
   7092 		if v_0.AuxInt != 0xFFFFFFFF {
   7093 			break
   7094 		}
   7095 		x := v.Args[1]
   7096 		v.reset(OpS390XMOVWZreg)
   7097 		v.AddArg(x)
   7098 		return true
   7099 	}
   7100 	// match: (AND (MOVDconst [c]) (MOVDconst [d]))
   7101 	// cond:
   7102 	// result: (MOVDconst [c&d])
   7103 	for {
   7104 		_ = v.Args[1]
   7105 		v_0 := v.Args[0]
   7106 		if v_0.Op != OpS390XMOVDconst {
   7107 			break
   7108 		}
   7109 		c := v_0.AuxInt
   7110 		v_1 := v.Args[1]
   7111 		if v_1.Op != OpS390XMOVDconst {
   7112 			break
   7113 		}
   7114 		d := v_1.AuxInt
   7115 		v.reset(OpS390XMOVDconst)
   7116 		v.AuxInt = c & d
   7117 		return true
   7118 	}
   7119 	// match: (AND (MOVDconst [d]) (MOVDconst [c]))
   7120 	// cond:
   7121 	// result: (MOVDconst [c&d])
   7122 	for {
   7123 		_ = v.Args[1]
   7124 		v_0 := v.Args[0]
   7125 		if v_0.Op != OpS390XMOVDconst {
   7126 			break
   7127 		}
   7128 		d := v_0.AuxInt
   7129 		v_1 := v.Args[1]
   7130 		if v_1.Op != OpS390XMOVDconst {
   7131 			break
   7132 		}
   7133 		c := v_1.AuxInt
   7134 		v.reset(OpS390XMOVDconst)
   7135 		v.AuxInt = c & d
   7136 		return true
   7137 	}
   7138 	return false
   7139 }
   7140 func rewriteValueS390X_OpS390XAND_10(v *Value) bool {
   7141 	// match: (AND x x)
   7142 	// cond:
   7143 	// result: x
   7144 	for {
   7145 		_ = v.Args[1]
   7146 		x := v.Args[0]
   7147 		if x != v.Args[1] {
   7148 			break
   7149 		}
   7150 		v.reset(OpCopy)
   7151 		v.Type = x.Type
   7152 		v.AddArg(x)
   7153 		return true
   7154 	}
   7155 	// match: (AND <t> x g:(MOVDload [off] {sym} ptr mem))
   7156 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7157 	// result: (ANDload <t> [off] {sym} x ptr mem)
   7158 	for {
   7159 		t := v.Type
   7160 		_ = v.Args[1]
   7161 		x := v.Args[0]
   7162 		g := v.Args[1]
   7163 		if g.Op != OpS390XMOVDload {
   7164 			break
   7165 		}
   7166 		off := g.AuxInt
   7167 		sym := g.Aux
   7168 		_ = g.Args[1]
   7169 		ptr := g.Args[0]
   7170 		mem := g.Args[1]
   7171 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7172 			break
   7173 		}
   7174 		v.reset(OpS390XANDload)
   7175 		v.Type = t
   7176 		v.AuxInt = off
   7177 		v.Aux = sym
   7178 		v.AddArg(x)
   7179 		v.AddArg(ptr)
   7180 		v.AddArg(mem)
   7181 		return true
   7182 	}
   7183 	// match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x)
   7184 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7185 	// result: (ANDload <t> [off] {sym} x ptr mem)
   7186 	for {
   7187 		t := v.Type
   7188 		_ = v.Args[1]
   7189 		g := v.Args[0]
   7190 		if g.Op != OpS390XMOVDload {
   7191 			break
   7192 		}
   7193 		off := g.AuxInt
   7194 		sym := g.Aux
   7195 		_ = g.Args[1]
   7196 		ptr := g.Args[0]
   7197 		mem := g.Args[1]
   7198 		x := v.Args[1]
   7199 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7200 			break
   7201 		}
   7202 		v.reset(OpS390XANDload)
   7203 		v.Type = t
   7204 		v.AuxInt = off
   7205 		v.Aux = sym
   7206 		v.AddArg(x)
   7207 		v.AddArg(ptr)
   7208 		v.AddArg(mem)
   7209 		return true
   7210 	}
   7211 	// match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x)
   7212 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7213 	// result: (ANDload <t> [off] {sym} x ptr mem)
   7214 	for {
   7215 		t := v.Type
   7216 		_ = v.Args[1]
   7217 		g := v.Args[0]
   7218 		if g.Op != OpS390XMOVDload {
   7219 			break
   7220 		}
   7221 		off := g.AuxInt
   7222 		sym := g.Aux
   7223 		_ = g.Args[1]
   7224 		ptr := g.Args[0]
   7225 		mem := g.Args[1]
   7226 		x := v.Args[1]
   7227 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7228 			break
   7229 		}
   7230 		v.reset(OpS390XANDload)
   7231 		v.Type = t
   7232 		v.AuxInt = off
   7233 		v.Aux = sym
   7234 		v.AddArg(x)
   7235 		v.AddArg(ptr)
   7236 		v.AddArg(mem)
   7237 		return true
   7238 	}
   7239 	// match: (AND <t> x g:(MOVDload [off] {sym} ptr mem))
   7240 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7241 	// result: (ANDload <t> [off] {sym} x ptr mem)
   7242 	for {
   7243 		t := v.Type
   7244 		_ = v.Args[1]
   7245 		x := v.Args[0]
   7246 		g := v.Args[1]
   7247 		if g.Op != OpS390XMOVDload {
   7248 			break
   7249 		}
   7250 		off := g.AuxInt
   7251 		sym := g.Aux
   7252 		_ = g.Args[1]
   7253 		ptr := g.Args[0]
   7254 		mem := g.Args[1]
   7255 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7256 			break
   7257 		}
   7258 		v.reset(OpS390XANDload)
   7259 		v.Type = t
   7260 		v.AuxInt = off
   7261 		v.Aux = sym
   7262 		v.AddArg(x)
   7263 		v.AddArg(ptr)
   7264 		v.AddArg(mem)
   7265 		return true
   7266 	}
   7267 	return false
   7268 }
   7269 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool {
   7270 	// match: (ANDW x (MOVDconst [c]))
   7271 	// cond:
   7272 	// result: (ANDWconst [int64(int32(c))] x)
   7273 	for {
   7274 		_ = v.Args[1]
   7275 		x := v.Args[0]
   7276 		v_1 := v.Args[1]
   7277 		if v_1.Op != OpS390XMOVDconst {
   7278 			break
   7279 		}
   7280 		c := v_1.AuxInt
   7281 		v.reset(OpS390XANDWconst)
   7282 		v.AuxInt = int64(int32(c))
   7283 		v.AddArg(x)
   7284 		return true
   7285 	}
   7286 	// match: (ANDW (MOVDconst [c]) x)
   7287 	// cond:
   7288 	// result: (ANDWconst [int64(int32(c))] x)
   7289 	for {
   7290 		_ = v.Args[1]
   7291 		v_0 := v.Args[0]
   7292 		if v_0.Op != OpS390XMOVDconst {
   7293 			break
   7294 		}
   7295 		c := v_0.AuxInt
   7296 		x := v.Args[1]
   7297 		v.reset(OpS390XANDWconst)
   7298 		v.AuxInt = int64(int32(c))
   7299 		v.AddArg(x)
   7300 		return true
   7301 	}
   7302 	// match: (ANDW x x)
   7303 	// cond:
   7304 	// result: x
   7305 	for {
   7306 		_ = v.Args[1]
   7307 		x := v.Args[0]
   7308 		if x != v.Args[1] {
   7309 			break
   7310 		}
   7311 		v.reset(OpCopy)
   7312 		v.Type = x.Type
   7313 		v.AddArg(x)
   7314 		return true
   7315 	}
   7316 	// match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem))
   7317 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7318 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7319 	for {
   7320 		t := v.Type
   7321 		_ = v.Args[1]
   7322 		x := v.Args[0]
   7323 		g := v.Args[1]
   7324 		if g.Op != OpS390XMOVWload {
   7325 			break
   7326 		}
   7327 		off := g.AuxInt
   7328 		sym := g.Aux
   7329 		_ = g.Args[1]
   7330 		ptr := g.Args[0]
   7331 		mem := g.Args[1]
   7332 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7333 			break
   7334 		}
   7335 		v.reset(OpS390XANDWload)
   7336 		v.Type = t
   7337 		v.AuxInt = off
   7338 		v.Aux = sym
   7339 		v.AddArg(x)
   7340 		v.AddArg(ptr)
   7341 		v.AddArg(mem)
   7342 		return true
   7343 	}
   7344 	// match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x)
   7345 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7346 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7347 	for {
   7348 		t := v.Type
   7349 		_ = v.Args[1]
   7350 		g := v.Args[0]
   7351 		if g.Op != OpS390XMOVWload {
   7352 			break
   7353 		}
   7354 		off := g.AuxInt
   7355 		sym := g.Aux
   7356 		_ = g.Args[1]
   7357 		ptr := g.Args[0]
   7358 		mem := g.Args[1]
   7359 		x := v.Args[1]
   7360 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7361 			break
   7362 		}
   7363 		v.reset(OpS390XANDWload)
   7364 		v.Type = t
   7365 		v.AuxInt = off
   7366 		v.Aux = sym
   7367 		v.AddArg(x)
   7368 		v.AddArg(ptr)
   7369 		v.AddArg(mem)
   7370 		return true
   7371 	}
   7372 	// match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x)
   7373 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7374 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7375 	for {
   7376 		t := v.Type
   7377 		_ = v.Args[1]
   7378 		g := v.Args[0]
   7379 		if g.Op != OpS390XMOVWload {
   7380 			break
   7381 		}
   7382 		off := g.AuxInt
   7383 		sym := g.Aux
   7384 		_ = g.Args[1]
   7385 		ptr := g.Args[0]
   7386 		mem := g.Args[1]
   7387 		x := v.Args[1]
   7388 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7389 			break
   7390 		}
   7391 		v.reset(OpS390XANDWload)
   7392 		v.Type = t
   7393 		v.AuxInt = off
   7394 		v.Aux = sym
   7395 		v.AddArg(x)
   7396 		v.AddArg(ptr)
   7397 		v.AddArg(mem)
   7398 		return true
   7399 	}
   7400 	// match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem))
   7401 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7402 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7403 	for {
   7404 		t := v.Type
   7405 		_ = v.Args[1]
   7406 		x := v.Args[0]
   7407 		g := v.Args[1]
   7408 		if g.Op != OpS390XMOVWload {
   7409 			break
   7410 		}
   7411 		off := g.AuxInt
   7412 		sym := g.Aux
   7413 		_ = g.Args[1]
   7414 		ptr := g.Args[0]
   7415 		mem := g.Args[1]
   7416 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7417 			break
   7418 		}
   7419 		v.reset(OpS390XANDWload)
   7420 		v.Type = t
   7421 		v.AuxInt = off
   7422 		v.Aux = sym
   7423 		v.AddArg(x)
   7424 		v.AddArg(ptr)
   7425 		v.AddArg(mem)
   7426 		return true
   7427 	}
   7428 	// match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem))
   7429 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7430 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7431 	for {
   7432 		t := v.Type
   7433 		_ = v.Args[1]
   7434 		x := v.Args[0]
   7435 		g := v.Args[1]
   7436 		if g.Op != OpS390XMOVWZload {
   7437 			break
   7438 		}
   7439 		off := g.AuxInt
   7440 		sym := g.Aux
   7441 		_ = g.Args[1]
   7442 		ptr := g.Args[0]
   7443 		mem := g.Args[1]
   7444 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7445 			break
   7446 		}
   7447 		v.reset(OpS390XANDWload)
   7448 		v.Type = t
   7449 		v.AuxInt = off
   7450 		v.Aux = sym
   7451 		v.AddArg(x)
   7452 		v.AddArg(ptr)
   7453 		v.AddArg(mem)
   7454 		return true
   7455 	}
   7456 	// match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   7457 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7458 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7459 	for {
   7460 		t := v.Type
   7461 		_ = v.Args[1]
   7462 		g := v.Args[0]
   7463 		if g.Op != OpS390XMOVWZload {
   7464 			break
   7465 		}
   7466 		off := g.AuxInt
   7467 		sym := g.Aux
   7468 		_ = g.Args[1]
   7469 		ptr := g.Args[0]
   7470 		mem := g.Args[1]
   7471 		x := v.Args[1]
   7472 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7473 			break
   7474 		}
   7475 		v.reset(OpS390XANDWload)
   7476 		v.Type = t
   7477 		v.AuxInt = off
   7478 		v.Aux = sym
   7479 		v.AddArg(x)
   7480 		v.AddArg(ptr)
   7481 		v.AddArg(mem)
   7482 		return true
   7483 	}
   7484 	// match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   7485 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7486 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7487 	for {
   7488 		t := v.Type
   7489 		_ = v.Args[1]
   7490 		g := v.Args[0]
   7491 		if g.Op != OpS390XMOVWZload {
   7492 			break
   7493 		}
   7494 		off := g.AuxInt
   7495 		sym := g.Aux
   7496 		_ = g.Args[1]
   7497 		ptr := g.Args[0]
   7498 		mem := g.Args[1]
   7499 		x := v.Args[1]
   7500 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7501 			break
   7502 		}
   7503 		v.reset(OpS390XANDWload)
   7504 		v.Type = t
   7505 		v.AuxInt = off
   7506 		v.Aux = sym
   7507 		v.AddArg(x)
   7508 		v.AddArg(ptr)
   7509 		v.AddArg(mem)
   7510 		return true
   7511 	}
   7512 	return false
   7513 }
   7514 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool {
   7515 	// match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem))
   7516 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   7517 	// result: (ANDWload <t> [off] {sym} x ptr mem)
   7518 	for {
   7519 		t := v.Type
   7520 		_ = v.Args[1]
   7521 		x := v.Args[0]
   7522 		g := v.Args[1]
   7523 		if g.Op != OpS390XMOVWZload {
   7524 			break
   7525 		}
   7526 		off := g.AuxInt
   7527 		sym := g.Aux
   7528 		_ = g.Args[1]
   7529 		ptr := g.Args[0]
   7530 		mem := g.Args[1]
   7531 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   7532 			break
   7533 		}
   7534 		v.reset(OpS390XANDWload)
   7535 		v.Type = t
   7536 		v.AuxInt = off
   7537 		v.Aux = sym
   7538 		v.AddArg(x)
   7539 		v.AddArg(ptr)
   7540 		v.AddArg(mem)
   7541 		return true
   7542 	}
   7543 	return false
   7544 }
   7545 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool {
   7546 	// match: (ANDWconst [c] (ANDWconst [d] x))
   7547 	// cond:
   7548 	// result: (ANDWconst [c & d] x)
   7549 	for {
   7550 		c := v.AuxInt
   7551 		v_0 := v.Args[0]
   7552 		if v_0.Op != OpS390XANDWconst {
   7553 			break
   7554 		}
   7555 		d := v_0.AuxInt
   7556 		x := v_0.Args[0]
   7557 		v.reset(OpS390XANDWconst)
   7558 		v.AuxInt = c & d
   7559 		v.AddArg(x)
   7560 		return true
   7561 	}
   7562 	// match: (ANDWconst [0xFF] x)
   7563 	// cond:
   7564 	// result: (MOVBZreg x)
   7565 	for {
   7566 		if v.AuxInt != 0xFF {
   7567 			break
   7568 		}
   7569 		x := v.Args[0]
   7570 		v.reset(OpS390XMOVBZreg)
   7571 		v.AddArg(x)
   7572 		return true
   7573 	}
   7574 	// match: (ANDWconst [0xFFFF] x)
   7575 	// cond:
   7576 	// result: (MOVHZreg x)
   7577 	for {
   7578 		if v.AuxInt != 0xFFFF {
   7579 			break
   7580 		}
   7581 		x := v.Args[0]
   7582 		v.reset(OpS390XMOVHZreg)
   7583 		v.AddArg(x)
   7584 		return true
   7585 	}
   7586 	// match: (ANDWconst [c] _)
   7587 	// cond: int32(c)==0
   7588 	// result: (MOVDconst [0])
   7589 	for {
   7590 		c := v.AuxInt
   7591 		if !(int32(c) == 0) {
   7592 			break
   7593 		}
   7594 		v.reset(OpS390XMOVDconst)
   7595 		v.AuxInt = 0
   7596 		return true
   7597 	}
   7598 	// match: (ANDWconst [c] x)
   7599 	// cond: int32(c)==-1
   7600 	// result: x
   7601 	for {
   7602 		c := v.AuxInt
   7603 		x := v.Args[0]
   7604 		if !(int32(c) == -1) {
   7605 			break
   7606 		}
   7607 		v.reset(OpCopy)
   7608 		v.Type = x.Type
   7609 		v.AddArg(x)
   7610 		return true
   7611 	}
   7612 	// match: (ANDWconst [c] (MOVDconst [d]))
   7613 	// cond:
   7614 	// result: (MOVDconst [c&d])
   7615 	for {
   7616 		c := v.AuxInt
   7617 		v_0 := v.Args[0]
   7618 		if v_0.Op != OpS390XMOVDconst {
   7619 			break
   7620 		}
   7621 		d := v_0.AuxInt
   7622 		v.reset(OpS390XMOVDconst)
   7623 		v.AuxInt = c & d
   7624 		return true
   7625 	}
   7626 	return false
   7627 }
   7628 func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool {
   7629 	// match: (ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem)
   7630 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   7631 	// result: (ANDWload  [off1+off2] {sym} x ptr mem)
   7632 	for {
   7633 		off1 := v.AuxInt
   7634 		sym := v.Aux
   7635 		_ = v.Args[2]
   7636 		x := v.Args[0]
   7637 		v_1 := v.Args[1]
   7638 		if v_1.Op != OpS390XADDconst {
   7639 			break
   7640 		}
   7641 		off2 := v_1.AuxInt
   7642 		ptr := v_1.Args[0]
   7643 		mem := v.Args[2]
   7644 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   7645 			break
   7646 		}
   7647 		v.reset(OpS390XANDWload)
   7648 		v.AuxInt = off1 + off2
   7649 		v.Aux = sym
   7650 		v.AddArg(x)
   7651 		v.AddArg(ptr)
   7652 		v.AddArg(mem)
   7653 		return true
   7654 	}
   7655 	// match: (ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   7656 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   7657 	// result: (ANDWload  [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   7658 	for {
   7659 		o1 := v.AuxInt
   7660 		s1 := v.Aux
   7661 		_ = v.Args[2]
   7662 		x := v.Args[0]
   7663 		v_1 := v.Args[1]
   7664 		if v_1.Op != OpS390XMOVDaddr {
   7665 			break
   7666 		}
   7667 		o2 := v_1.AuxInt
   7668 		s2 := v_1.Aux
   7669 		ptr := v_1.Args[0]
   7670 		mem := v.Args[2]
   7671 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   7672 			break
   7673 		}
   7674 		v.reset(OpS390XANDWload)
   7675 		v.AuxInt = o1 + o2
   7676 		v.Aux = mergeSym(s1, s2)
   7677 		v.AddArg(x)
   7678 		v.AddArg(ptr)
   7679 		v.AddArg(mem)
   7680 		return true
   7681 	}
   7682 	return false
   7683 }
   7684 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool {
   7685 	// match: (ANDconst [c] (ANDconst [d] x))
   7686 	// cond:
   7687 	// result: (ANDconst [c & d] x)
   7688 	for {
   7689 		c := v.AuxInt
   7690 		v_0 := v.Args[0]
   7691 		if v_0.Op != OpS390XANDconst {
   7692 			break
   7693 		}
   7694 		d := v_0.AuxInt
   7695 		x := v_0.Args[0]
   7696 		v.reset(OpS390XANDconst)
   7697 		v.AuxInt = c & d
   7698 		v.AddArg(x)
   7699 		return true
   7700 	}
   7701 	// match: (ANDconst [0] _)
   7702 	// cond:
   7703 	// result: (MOVDconst [0])
   7704 	for {
   7705 		if v.AuxInt != 0 {
   7706 			break
   7707 		}
   7708 		v.reset(OpS390XMOVDconst)
   7709 		v.AuxInt = 0
   7710 		return true
   7711 	}
   7712 	// match: (ANDconst [-1] x)
   7713 	// cond:
   7714 	// result: x
   7715 	for {
   7716 		if v.AuxInt != -1 {
   7717 			break
   7718 		}
   7719 		x := v.Args[0]
   7720 		v.reset(OpCopy)
   7721 		v.Type = x.Type
   7722 		v.AddArg(x)
   7723 		return true
   7724 	}
   7725 	// match: (ANDconst [c] (MOVDconst [d]))
   7726 	// cond:
   7727 	// result: (MOVDconst [c&d])
   7728 	for {
   7729 		c := v.AuxInt
   7730 		v_0 := v.Args[0]
   7731 		if v_0.Op != OpS390XMOVDconst {
   7732 			break
   7733 		}
   7734 		d := v_0.AuxInt
   7735 		v.reset(OpS390XMOVDconst)
   7736 		v.AuxInt = c & d
   7737 		return true
   7738 	}
   7739 	return false
   7740 }
   7741 func rewriteValueS390X_OpS390XANDload_0(v *Value) bool {
   7742 	b := v.Block
   7743 	_ = b
   7744 	// match: (ANDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
   7745 	// cond: isSamePtr(ptr1, ptr2)
   7746 	// result: (AND   x (LGDR <t> y))
   7747 	for {
   7748 		t := v.Type
   7749 		off := v.AuxInt
   7750 		sym := v.Aux
   7751 		_ = v.Args[2]
   7752 		x := v.Args[0]
   7753 		ptr1 := v.Args[1]
   7754 		v_2 := v.Args[2]
   7755 		if v_2.Op != OpS390XFMOVDstore {
   7756 			break
   7757 		}
   7758 		if v_2.AuxInt != off {
   7759 			break
   7760 		}
   7761 		if v_2.Aux != sym {
   7762 			break
   7763 		}
   7764 		_ = v_2.Args[2]
   7765 		ptr2 := v_2.Args[0]
   7766 		y := v_2.Args[1]
   7767 		if !(isSamePtr(ptr1, ptr2)) {
   7768 			break
   7769 		}
   7770 		v.reset(OpS390XAND)
   7771 		v.AddArg(x)
   7772 		v0 := b.NewValue0(v.Pos, OpS390XLGDR, t)
   7773 		v0.AddArg(y)
   7774 		v.AddArg(v0)
   7775 		return true
   7776 	}
   7777 	// match: (ANDload [off1] {sym} x (ADDconst [off2] ptr) mem)
   7778 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   7779 	// result: (ANDload   [off1+off2] {sym} x ptr mem)
   7780 	for {
   7781 		off1 := v.AuxInt
   7782 		sym := v.Aux
   7783 		_ = v.Args[2]
   7784 		x := v.Args[0]
   7785 		v_1 := v.Args[1]
   7786 		if v_1.Op != OpS390XADDconst {
   7787 			break
   7788 		}
   7789 		off2 := v_1.AuxInt
   7790 		ptr := v_1.Args[0]
   7791 		mem := v.Args[2]
   7792 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   7793 			break
   7794 		}
   7795 		v.reset(OpS390XANDload)
   7796 		v.AuxInt = off1 + off2
   7797 		v.Aux = sym
   7798 		v.AddArg(x)
   7799 		v.AddArg(ptr)
   7800 		v.AddArg(mem)
   7801 		return true
   7802 	}
   7803 	// match: (ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   7804 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   7805 	// result: (ANDload   [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   7806 	for {
   7807 		o1 := v.AuxInt
   7808 		s1 := v.Aux
   7809 		_ = v.Args[2]
   7810 		x := v.Args[0]
   7811 		v_1 := v.Args[1]
   7812 		if v_1.Op != OpS390XMOVDaddr {
   7813 			break
   7814 		}
   7815 		o2 := v_1.AuxInt
   7816 		s2 := v_1.Aux
   7817 		ptr := v_1.Args[0]
   7818 		mem := v.Args[2]
   7819 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   7820 			break
   7821 		}
   7822 		v.reset(OpS390XANDload)
   7823 		v.AuxInt = o1 + o2
   7824 		v.Aux = mergeSym(s1, s2)
   7825 		v.AddArg(x)
   7826 		v.AddArg(ptr)
   7827 		v.AddArg(mem)
   7828 		return true
   7829 	}
   7830 	return false
   7831 }
   7832 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool {
   7833 	b := v.Block
   7834 	_ = b
   7835 	// match: (CMP x (MOVDconst [c]))
   7836 	// cond: is32Bit(c)
   7837 	// result: (CMPconst x [c])
   7838 	for {
   7839 		_ = v.Args[1]
   7840 		x := v.Args[0]
   7841 		v_1 := v.Args[1]
   7842 		if v_1.Op != OpS390XMOVDconst {
   7843 			break
   7844 		}
   7845 		c := v_1.AuxInt
   7846 		if !(is32Bit(c)) {
   7847 			break
   7848 		}
   7849 		v.reset(OpS390XCMPconst)
   7850 		v.AuxInt = c
   7851 		v.AddArg(x)
   7852 		return true
   7853 	}
   7854 	// match: (CMP (MOVDconst [c]) x)
   7855 	// cond: is32Bit(c)
   7856 	// result: (InvertFlags (CMPconst x [c]))
   7857 	for {
   7858 		_ = v.Args[1]
   7859 		v_0 := v.Args[0]
   7860 		if v_0.Op != OpS390XMOVDconst {
   7861 			break
   7862 		}
   7863 		c := v_0.AuxInt
   7864 		x := v.Args[1]
   7865 		if !(is32Bit(c)) {
   7866 			break
   7867 		}
   7868 		v.reset(OpS390XInvertFlags)
   7869 		v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags)
   7870 		v0.AuxInt = c
   7871 		v0.AddArg(x)
   7872 		v.AddArg(v0)
   7873 		return true
   7874 	}
   7875 	return false
   7876 }
   7877 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool {
   7878 	b := v.Block
   7879 	_ = b
   7880 	// match: (CMPU x (MOVDconst [c]))
   7881 	// cond: isU32Bit(c)
   7882 	// result: (CMPUconst x [int64(int32(c))])
   7883 	for {
   7884 		_ = v.Args[1]
   7885 		x := v.Args[0]
   7886 		v_1 := v.Args[1]
   7887 		if v_1.Op != OpS390XMOVDconst {
   7888 			break
   7889 		}
   7890 		c := v_1.AuxInt
   7891 		if !(isU32Bit(c)) {
   7892 			break
   7893 		}
   7894 		v.reset(OpS390XCMPUconst)
   7895 		v.AuxInt = int64(int32(c))
   7896 		v.AddArg(x)
   7897 		return true
   7898 	}
   7899 	// match: (CMPU (MOVDconst [c]) x)
   7900 	// cond: isU32Bit(c)
   7901 	// result: (InvertFlags (CMPUconst x [int64(int32(c))]))
   7902 	for {
   7903 		_ = v.Args[1]
   7904 		v_0 := v.Args[0]
   7905 		if v_0.Op != OpS390XMOVDconst {
   7906 			break
   7907 		}
   7908 		c := v_0.AuxInt
   7909 		x := v.Args[1]
   7910 		if !(isU32Bit(c)) {
   7911 			break
   7912 		}
   7913 		v.reset(OpS390XInvertFlags)
   7914 		v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
   7915 		v0.AuxInt = int64(int32(c))
   7916 		v0.AddArg(x)
   7917 		v.AddArg(v0)
   7918 		return true
   7919 	}
   7920 	return false
   7921 }
   7922 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool {
   7923 	// match: (CMPUconst (MOVDconst [x]) [y])
   7924 	// cond: uint64(x)==uint64(y)
   7925 	// result: (FlagEQ)
   7926 	for {
   7927 		y := v.AuxInt
   7928 		v_0 := v.Args[0]
   7929 		if v_0.Op != OpS390XMOVDconst {
   7930 			break
   7931 		}
   7932 		x := v_0.AuxInt
   7933 		if !(uint64(x) == uint64(y)) {
   7934 			break
   7935 		}
   7936 		v.reset(OpS390XFlagEQ)
   7937 		return true
   7938 	}
   7939 	// match: (CMPUconst (MOVDconst [x]) [y])
   7940 	// cond: uint64(x)<uint64(y)
   7941 	// result: (FlagLT)
   7942 	for {
   7943 		y := v.AuxInt
   7944 		v_0 := v.Args[0]
   7945 		if v_0.Op != OpS390XMOVDconst {
   7946 			break
   7947 		}
   7948 		x := v_0.AuxInt
   7949 		if !(uint64(x) < uint64(y)) {
   7950 			break
   7951 		}
   7952 		v.reset(OpS390XFlagLT)
   7953 		return true
   7954 	}
   7955 	// match: (CMPUconst (MOVDconst [x]) [y])
   7956 	// cond: uint64(x)>uint64(y)
   7957 	// result: (FlagGT)
   7958 	for {
   7959 		y := v.AuxInt
   7960 		v_0 := v.Args[0]
   7961 		if v_0.Op != OpS390XMOVDconst {
   7962 			break
   7963 		}
   7964 		x := v_0.AuxInt
   7965 		if !(uint64(x) > uint64(y)) {
   7966 			break
   7967 		}
   7968 		v.reset(OpS390XFlagGT)
   7969 		return true
   7970 	}
   7971 	return false
   7972 }
   7973 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool {
   7974 	b := v.Block
   7975 	_ = b
   7976 	// match: (CMPW x (MOVDconst [c]))
   7977 	// cond:
   7978 	// result: (CMPWconst x [int64(int32(c))])
   7979 	for {
   7980 		_ = v.Args[1]
   7981 		x := v.Args[0]
   7982 		v_1 := v.Args[1]
   7983 		if v_1.Op != OpS390XMOVDconst {
   7984 			break
   7985 		}
   7986 		c := v_1.AuxInt
   7987 		v.reset(OpS390XCMPWconst)
   7988 		v.AuxInt = int64(int32(c))
   7989 		v.AddArg(x)
   7990 		return true
   7991 	}
   7992 	// match: (CMPW (MOVDconst [c]) x)
   7993 	// cond:
   7994 	// result: (InvertFlags (CMPWconst x [int64(int32(c))]))
   7995 	for {
   7996 		_ = v.Args[1]
   7997 		v_0 := v.Args[0]
   7998 		if v_0.Op != OpS390XMOVDconst {
   7999 			break
   8000 		}
   8001 		c := v_0.AuxInt
   8002 		x := v.Args[1]
   8003 		v.reset(OpS390XInvertFlags)
   8004 		v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags)
   8005 		v0.AuxInt = int64(int32(c))
   8006 		v0.AddArg(x)
   8007 		v.AddArg(v0)
   8008 		return true
   8009 	}
   8010 	return false
   8011 }
   8012 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool {
   8013 	b := v.Block
   8014 	_ = b
   8015 	// match: (CMPWU x (MOVDconst [c]))
   8016 	// cond:
   8017 	// result: (CMPWUconst x [int64(int32(c))])
   8018 	for {
   8019 		_ = v.Args[1]
   8020 		x := v.Args[0]
   8021 		v_1 := v.Args[1]
   8022 		if v_1.Op != OpS390XMOVDconst {
   8023 			break
   8024 		}
   8025 		c := v_1.AuxInt
   8026 		v.reset(OpS390XCMPWUconst)
   8027 		v.AuxInt = int64(int32(c))
   8028 		v.AddArg(x)
   8029 		return true
   8030 	}
   8031 	// match: (CMPWU (MOVDconst [c]) x)
   8032 	// cond:
   8033 	// result: (InvertFlags (CMPWUconst x [int64(int32(c))]))
   8034 	for {
   8035 		_ = v.Args[1]
   8036 		v_0 := v.Args[0]
   8037 		if v_0.Op != OpS390XMOVDconst {
   8038 			break
   8039 		}
   8040 		c := v_0.AuxInt
   8041 		x := v.Args[1]
   8042 		v.reset(OpS390XInvertFlags)
   8043 		v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
   8044 		v0.AuxInt = int64(int32(c))
   8045 		v0.AddArg(x)
   8046 		v.AddArg(v0)
   8047 		return true
   8048 	}
   8049 	return false
   8050 }
   8051 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool {
   8052 	// match: (CMPWUconst (MOVDconst [x]) [y])
   8053 	// cond: uint32(x)==uint32(y)
   8054 	// result: (FlagEQ)
   8055 	for {
   8056 		y := v.AuxInt
   8057 		v_0 := v.Args[0]
   8058 		if v_0.Op != OpS390XMOVDconst {
   8059 			break
   8060 		}
   8061 		x := v_0.AuxInt
   8062 		if !(uint32(x) == uint32(y)) {
   8063 			break
   8064 		}
   8065 		v.reset(OpS390XFlagEQ)
   8066 		return true
   8067 	}
   8068 	// match: (CMPWUconst (MOVDconst [x]) [y])
   8069 	// cond: uint32(x)<uint32(y)
   8070 	// result: (FlagLT)
   8071 	for {
   8072 		y := v.AuxInt
   8073 		v_0 := v.Args[0]
   8074 		if v_0.Op != OpS390XMOVDconst {
   8075 			break
   8076 		}
   8077 		x := v_0.AuxInt
   8078 		if !(uint32(x) < uint32(y)) {
   8079 			break
   8080 		}
   8081 		v.reset(OpS390XFlagLT)
   8082 		return true
   8083 	}
   8084 	// match: (CMPWUconst (MOVDconst [x]) [y])
   8085 	// cond: uint32(x)>uint32(y)
   8086 	// result: (FlagGT)
   8087 	for {
   8088 		y := v.AuxInt
   8089 		v_0 := v.Args[0]
   8090 		if v_0.Op != OpS390XMOVDconst {
   8091 			break
   8092 		}
   8093 		x := v_0.AuxInt
   8094 		if !(uint32(x) > uint32(y)) {
   8095 			break
   8096 		}
   8097 		v.reset(OpS390XFlagGT)
   8098 		return true
   8099 	}
   8100 	return false
   8101 }
   8102 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool {
   8103 	// match: (CMPWconst (MOVDconst [x]) [y])
   8104 	// cond: int32(x)==int32(y)
   8105 	// result: (FlagEQ)
   8106 	for {
   8107 		y := v.AuxInt
   8108 		v_0 := v.Args[0]
   8109 		if v_0.Op != OpS390XMOVDconst {
   8110 			break
   8111 		}
   8112 		x := v_0.AuxInt
   8113 		if !(int32(x) == int32(y)) {
   8114 			break
   8115 		}
   8116 		v.reset(OpS390XFlagEQ)
   8117 		return true
   8118 	}
   8119 	// match: (CMPWconst (MOVDconst [x]) [y])
   8120 	// cond: int32(x)<int32(y)
   8121 	// result: (FlagLT)
   8122 	for {
   8123 		y := v.AuxInt
   8124 		v_0 := v.Args[0]
   8125 		if v_0.Op != OpS390XMOVDconst {
   8126 			break
   8127 		}
   8128 		x := v_0.AuxInt
   8129 		if !(int32(x) < int32(y)) {
   8130 			break
   8131 		}
   8132 		v.reset(OpS390XFlagLT)
   8133 		return true
   8134 	}
   8135 	// match: (CMPWconst (MOVDconst [x]) [y])
   8136 	// cond: int32(x)>int32(y)
   8137 	// result: (FlagGT)
   8138 	for {
   8139 		y := v.AuxInt
   8140 		v_0 := v.Args[0]
   8141 		if v_0.Op != OpS390XMOVDconst {
   8142 			break
   8143 		}
   8144 		x := v_0.AuxInt
   8145 		if !(int32(x) > int32(y)) {
   8146 			break
   8147 		}
   8148 		v.reset(OpS390XFlagGT)
   8149 		return true
   8150 	}
   8151 	// match: (CMPWconst (SRWconst _ [c]) [n])
   8152 	// cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)
   8153 	// result: (FlagLT)
   8154 	for {
   8155 		n := v.AuxInt
   8156 		v_0 := v.Args[0]
   8157 		if v_0.Op != OpS390XSRWconst {
   8158 			break
   8159 		}
   8160 		c := v_0.AuxInt
   8161 		if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) {
   8162 			break
   8163 		}
   8164 		v.reset(OpS390XFlagLT)
   8165 		return true
   8166 	}
   8167 	// match: (CMPWconst (ANDWconst _ [m]) [n])
   8168 	// cond: 0 <= int32(m) && int32(m) < int32(n)
   8169 	// result: (FlagLT)
   8170 	for {
   8171 		n := v.AuxInt
   8172 		v_0 := v.Args[0]
   8173 		if v_0.Op != OpS390XANDWconst {
   8174 			break
   8175 		}
   8176 		m := v_0.AuxInt
   8177 		if !(0 <= int32(m) && int32(m) < int32(n)) {
   8178 			break
   8179 		}
   8180 		v.reset(OpS390XFlagLT)
   8181 		return true
   8182 	}
   8183 	return false
   8184 }
   8185 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool {
   8186 	// match: (CMPconst (MOVDconst [x]) [y])
   8187 	// cond: x==y
   8188 	// result: (FlagEQ)
   8189 	for {
   8190 		y := v.AuxInt
   8191 		v_0 := v.Args[0]
   8192 		if v_0.Op != OpS390XMOVDconst {
   8193 			break
   8194 		}
   8195 		x := v_0.AuxInt
   8196 		if !(x == y) {
   8197 			break
   8198 		}
   8199 		v.reset(OpS390XFlagEQ)
   8200 		return true
   8201 	}
   8202 	// match: (CMPconst (MOVDconst [x]) [y])
   8203 	// cond: x<y
   8204 	// result: (FlagLT)
   8205 	for {
   8206 		y := v.AuxInt
   8207 		v_0 := v.Args[0]
   8208 		if v_0.Op != OpS390XMOVDconst {
   8209 			break
   8210 		}
   8211 		x := v_0.AuxInt
   8212 		if !(x < y) {
   8213 			break
   8214 		}
   8215 		v.reset(OpS390XFlagLT)
   8216 		return true
   8217 	}
   8218 	// match: (CMPconst (MOVDconst [x]) [y])
   8219 	// cond: x>y
   8220 	// result: (FlagGT)
   8221 	for {
   8222 		y := v.AuxInt
   8223 		v_0 := v.Args[0]
   8224 		if v_0.Op != OpS390XMOVDconst {
   8225 			break
   8226 		}
   8227 		x := v_0.AuxInt
   8228 		if !(x > y) {
   8229 			break
   8230 		}
   8231 		v.reset(OpS390XFlagGT)
   8232 		return true
   8233 	}
   8234 	// match: (CMPconst (MOVBZreg _) [c])
   8235 	// cond: 0xFF < c
   8236 	// result: (FlagLT)
   8237 	for {
   8238 		c := v.AuxInt
   8239 		v_0 := v.Args[0]
   8240 		if v_0.Op != OpS390XMOVBZreg {
   8241 			break
   8242 		}
   8243 		if !(0xFF < c) {
   8244 			break
   8245 		}
   8246 		v.reset(OpS390XFlagLT)
   8247 		return true
   8248 	}
   8249 	// match: (CMPconst (MOVHZreg _) [c])
   8250 	// cond: 0xFFFF < c
   8251 	// result: (FlagLT)
   8252 	for {
   8253 		c := v.AuxInt
   8254 		v_0 := v.Args[0]
   8255 		if v_0.Op != OpS390XMOVHZreg {
   8256 			break
   8257 		}
   8258 		if !(0xFFFF < c) {
   8259 			break
   8260 		}
   8261 		v.reset(OpS390XFlagLT)
   8262 		return true
   8263 	}
   8264 	// match: (CMPconst (MOVWZreg _) [c])
   8265 	// cond: 0xFFFFFFFF < c
   8266 	// result: (FlagLT)
   8267 	for {
   8268 		c := v.AuxInt
   8269 		v_0 := v.Args[0]
   8270 		if v_0.Op != OpS390XMOVWZreg {
   8271 			break
   8272 		}
   8273 		if !(0xFFFFFFFF < c) {
   8274 			break
   8275 		}
   8276 		v.reset(OpS390XFlagLT)
   8277 		return true
   8278 	}
   8279 	// match: (CMPconst (SRDconst _ [c]) [n])
   8280 	// cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)
   8281 	// result: (FlagLT)
   8282 	for {
   8283 		n := v.AuxInt
   8284 		v_0 := v.Args[0]
   8285 		if v_0.Op != OpS390XSRDconst {
   8286 			break
   8287 		}
   8288 		c := v_0.AuxInt
   8289 		if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) {
   8290 			break
   8291 		}
   8292 		v.reset(OpS390XFlagLT)
   8293 		return true
   8294 	}
   8295 	// match: (CMPconst (ANDconst _ [m]) [n])
   8296 	// cond: 0 <= m && m < n
   8297 	// result: (FlagLT)
   8298 	for {
   8299 		n := v.AuxInt
   8300 		v_0 := v.Args[0]
   8301 		if v_0.Op != OpS390XANDconst {
   8302 			break
   8303 		}
   8304 		m := v_0.AuxInt
   8305 		if !(0 <= m && m < n) {
   8306 			break
   8307 		}
   8308 		v.reset(OpS390XFlagLT)
   8309 		return true
   8310 	}
   8311 	return false
   8312 }
   8313 func rewriteValueS390X_OpS390XCPSDR_0(v *Value) bool {
   8314 	// match: (CPSDR y (FMOVDconst [c]))
   8315 	// cond: c & -1<<63 == 0
   8316 	// result: (LPDFR y)
   8317 	for {
   8318 		_ = v.Args[1]
   8319 		y := v.Args[0]
   8320 		v_1 := v.Args[1]
   8321 		if v_1.Op != OpS390XFMOVDconst {
   8322 			break
   8323 		}
   8324 		c := v_1.AuxInt
   8325 		if !(c&-1<<63 == 0) {
   8326 			break
   8327 		}
   8328 		v.reset(OpS390XLPDFR)
   8329 		v.AddArg(y)
   8330 		return true
   8331 	}
   8332 	// match: (CPSDR y (FMOVDconst [c]))
   8333 	// cond: c & -1<<63 != 0
   8334 	// result: (LNDFR y)
   8335 	for {
   8336 		_ = v.Args[1]
   8337 		y := v.Args[0]
   8338 		v_1 := v.Args[1]
   8339 		if v_1.Op != OpS390XFMOVDconst {
   8340 			break
   8341 		}
   8342 		c := v_1.AuxInt
   8343 		if !(c&-1<<63 != 0) {
   8344 			break
   8345 		}
   8346 		v.reset(OpS390XLNDFR)
   8347 		v.AddArg(y)
   8348 		return true
   8349 	}
   8350 	return false
   8351 }
   8352 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool {
   8353 	// match: (FADD (FMUL y z) x)
   8354 	// cond:
   8355 	// result: (FMADD x y z)
   8356 	for {
   8357 		_ = v.Args[1]
   8358 		v_0 := v.Args[0]
   8359 		if v_0.Op != OpS390XFMUL {
   8360 			break
   8361 		}
   8362 		_ = v_0.Args[1]
   8363 		y := v_0.Args[0]
   8364 		z := v_0.Args[1]
   8365 		x := v.Args[1]
   8366 		v.reset(OpS390XFMADD)
   8367 		v.AddArg(x)
   8368 		v.AddArg(y)
   8369 		v.AddArg(z)
   8370 		return true
   8371 	}
   8372 	// match: (FADD x (FMUL y z))
   8373 	// cond:
   8374 	// result: (FMADD x y z)
   8375 	for {
   8376 		_ = v.Args[1]
   8377 		x := v.Args[0]
   8378 		v_1 := v.Args[1]
   8379 		if v_1.Op != OpS390XFMUL {
   8380 			break
   8381 		}
   8382 		_ = v_1.Args[1]
   8383 		y := v_1.Args[0]
   8384 		z := v_1.Args[1]
   8385 		v.reset(OpS390XFMADD)
   8386 		v.AddArg(x)
   8387 		v.AddArg(y)
   8388 		v.AddArg(z)
   8389 		return true
   8390 	}
   8391 	return false
   8392 }
   8393 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool {
   8394 	// match: (FADDS (FMULS y z) x)
   8395 	// cond:
   8396 	// result: (FMADDS x y z)
   8397 	for {
   8398 		_ = v.Args[1]
   8399 		v_0 := v.Args[0]
   8400 		if v_0.Op != OpS390XFMULS {
   8401 			break
   8402 		}
   8403 		_ = v_0.Args[1]
   8404 		y := v_0.Args[0]
   8405 		z := v_0.Args[1]
   8406 		x := v.Args[1]
   8407 		v.reset(OpS390XFMADDS)
   8408 		v.AddArg(x)
   8409 		v.AddArg(y)
   8410 		v.AddArg(z)
   8411 		return true
   8412 	}
   8413 	// match: (FADDS x (FMULS y z))
   8414 	// cond:
   8415 	// result: (FMADDS x y z)
   8416 	for {
   8417 		_ = v.Args[1]
   8418 		x := v.Args[0]
   8419 		v_1 := v.Args[1]
   8420 		if v_1.Op != OpS390XFMULS {
   8421 			break
   8422 		}
   8423 		_ = v_1.Args[1]
   8424 		y := v_1.Args[0]
   8425 		z := v_1.Args[1]
   8426 		v.reset(OpS390XFMADDS)
   8427 		v.AddArg(x)
   8428 		v.AddArg(y)
   8429 		v.AddArg(z)
   8430 		return true
   8431 	}
   8432 	return false
   8433 }
   8434 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool {
   8435 	// match: (FMOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _))
   8436 	// cond: isSamePtr(ptr1, ptr2)
   8437 	// result: (LDGR x)
   8438 	for {
   8439 		off := v.AuxInt
   8440 		sym := v.Aux
   8441 		_ = v.Args[1]
   8442 		ptr1 := v.Args[0]
   8443 		v_1 := v.Args[1]
   8444 		if v_1.Op != OpS390XMOVDstore {
   8445 			break
   8446 		}
   8447 		if v_1.AuxInt != off {
   8448 			break
   8449 		}
   8450 		if v_1.Aux != sym {
   8451 			break
   8452 		}
   8453 		_ = v_1.Args[2]
   8454 		ptr2 := v_1.Args[0]
   8455 		x := v_1.Args[1]
   8456 		if !(isSamePtr(ptr1, ptr2)) {
   8457 			break
   8458 		}
   8459 		v.reset(OpS390XLDGR)
   8460 		v.AddArg(x)
   8461 		return true
   8462 	}
   8463 	// match: (FMOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _))
   8464 	// cond: isSamePtr(ptr1, ptr2)
   8465 	// result: x
   8466 	for {
   8467 		off := v.AuxInt
   8468 		sym := v.Aux
   8469 		_ = v.Args[1]
   8470 		ptr1 := v.Args[0]
   8471 		v_1 := v.Args[1]
   8472 		if v_1.Op != OpS390XFMOVDstore {
   8473 			break
   8474 		}
   8475 		if v_1.AuxInt != off {
   8476 			break
   8477 		}
   8478 		if v_1.Aux != sym {
   8479 			break
   8480 		}
   8481 		_ = v_1.Args[2]
   8482 		ptr2 := v_1.Args[0]
   8483 		x := v_1.Args[1]
   8484 		if !(isSamePtr(ptr1, ptr2)) {
   8485 			break
   8486 		}
   8487 		v.reset(OpCopy)
   8488 		v.Type = x.Type
   8489 		v.AddArg(x)
   8490 		return true
   8491 	}
   8492 	// match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem)
   8493 	// cond: is20Bit(off1+off2)
   8494 	// result: (FMOVDload [off1+off2] {sym} ptr mem)
   8495 	for {
   8496 		off1 := v.AuxInt
   8497 		sym := v.Aux
   8498 		_ = v.Args[1]
   8499 		v_0 := v.Args[0]
   8500 		if v_0.Op != OpS390XADDconst {
   8501 			break
   8502 		}
   8503 		off2 := v_0.AuxInt
   8504 		ptr := v_0.Args[0]
   8505 		mem := v.Args[1]
   8506 		if !(is20Bit(off1 + off2)) {
   8507 			break
   8508 		}
   8509 		v.reset(OpS390XFMOVDload)
   8510 		v.AuxInt = off1 + off2
   8511 		v.Aux = sym
   8512 		v.AddArg(ptr)
   8513 		v.AddArg(mem)
   8514 		return true
   8515 	}
   8516 	// match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
   8517 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   8518 	// result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem)
   8519 	for {
   8520 		off1 := v.AuxInt
   8521 		sym1 := v.Aux
   8522 		_ = v.Args[1]
   8523 		v_0 := v.Args[0]
   8524 		if v_0.Op != OpS390XMOVDaddr {
   8525 			break
   8526 		}
   8527 		off2 := v_0.AuxInt
   8528 		sym2 := v_0.Aux
   8529 		base := v_0.Args[0]
   8530 		mem := v.Args[1]
   8531 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   8532 			break
   8533 		}
   8534 		v.reset(OpS390XFMOVDload)
   8535 		v.AuxInt = off1 + off2
   8536 		v.Aux = mergeSym(sym1, sym2)
   8537 		v.AddArg(base)
   8538 		v.AddArg(mem)
   8539 		return true
   8540 	}
   8541 	// match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   8542 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   8543 	// result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   8544 	for {
   8545 		off1 := v.AuxInt
   8546 		sym1 := v.Aux
   8547 		_ = v.Args[1]
   8548 		v_0 := v.Args[0]
   8549 		if v_0.Op != OpS390XMOVDaddridx {
   8550 			break
   8551 		}
   8552 		off2 := v_0.AuxInt
   8553 		sym2 := v_0.Aux
   8554 		_ = v_0.Args[1]
   8555 		ptr := v_0.Args[0]
   8556 		idx := v_0.Args[1]
   8557 		mem := v.Args[1]
   8558 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   8559 			break
   8560 		}
   8561 		v.reset(OpS390XFMOVDloadidx)
   8562 		v.AuxInt = off1 + off2
   8563 		v.Aux = mergeSym(sym1, sym2)
   8564 		v.AddArg(ptr)
   8565 		v.AddArg(idx)
   8566 		v.AddArg(mem)
   8567 		return true
   8568 	}
   8569 	// match: (FMOVDload [off] {sym} (ADD ptr idx) mem)
   8570 	// cond: ptr.Op != OpSB
   8571 	// result: (FMOVDloadidx [off] {sym} ptr idx mem)
   8572 	for {
   8573 		off := v.AuxInt
   8574 		sym := v.Aux
   8575 		_ = v.Args[1]
   8576 		v_0 := v.Args[0]
   8577 		if v_0.Op != OpS390XADD {
   8578 			break
   8579 		}
   8580 		_ = v_0.Args[1]
   8581 		ptr := v_0.Args[0]
   8582 		idx := v_0.Args[1]
   8583 		mem := v.Args[1]
   8584 		if !(ptr.Op != OpSB) {
   8585 			break
   8586 		}
   8587 		v.reset(OpS390XFMOVDloadidx)
   8588 		v.AuxInt = off
   8589 		v.Aux = sym
   8590 		v.AddArg(ptr)
   8591 		v.AddArg(idx)
   8592 		v.AddArg(mem)
   8593 		return true
   8594 	}
   8595 	return false
   8596 }
   8597 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool {
   8598 	// match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   8599 	// cond: is20Bit(c+d)
   8600 	// result: (FMOVDloadidx [c+d] {sym} ptr idx mem)
   8601 	for {
   8602 		c := v.AuxInt
   8603 		sym := v.Aux
   8604 		_ = v.Args[2]
   8605 		v_0 := v.Args[0]
   8606 		if v_0.Op != OpS390XADDconst {
   8607 			break
   8608 		}
   8609 		d := v_0.AuxInt
   8610 		ptr := v_0.Args[0]
   8611 		idx := v.Args[1]
   8612 		mem := v.Args[2]
   8613 		if !(is20Bit(c + d)) {
   8614 			break
   8615 		}
   8616 		v.reset(OpS390XFMOVDloadidx)
   8617 		v.AuxInt = c + d
   8618 		v.Aux = sym
   8619 		v.AddArg(ptr)
   8620 		v.AddArg(idx)
   8621 		v.AddArg(mem)
   8622 		return true
   8623 	}
   8624 	// match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   8625 	// cond: is20Bit(c+d)
   8626 	// result: (FMOVDloadidx [c+d] {sym} ptr idx mem)
   8627 	for {
   8628 		c := v.AuxInt
   8629 		sym := v.Aux
   8630 		_ = v.Args[2]
   8631 		ptr := v.Args[0]
   8632 		v_1 := v.Args[1]
   8633 		if v_1.Op != OpS390XADDconst {
   8634 			break
   8635 		}
   8636 		d := v_1.AuxInt
   8637 		idx := v_1.Args[0]
   8638 		mem := v.Args[2]
   8639 		if !(is20Bit(c + d)) {
   8640 			break
   8641 		}
   8642 		v.reset(OpS390XFMOVDloadidx)
   8643 		v.AuxInt = c + d
   8644 		v.Aux = sym
   8645 		v.AddArg(ptr)
   8646 		v.AddArg(idx)
   8647 		v.AddArg(mem)
   8648 		return true
   8649 	}
   8650 	return false
   8651 }
   8652 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool {
   8653 	// match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem)
   8654 	// cond: is20Bit(off1+off2)
   8655 	// result: (FMOVDstore [off1+off2] {sym} ptr val mem)
   8656 	for {
   8657 		off1 := v.AuxInt
   8658 		sym := v.Aux
   8659 		_ = v.Args[2]
   8660 		v_0 := v.Args[0]
   8661 		if v_0.Op != OpS390XADDconst {
   8662 			break
   8663 		}
   8664 		off2 := v_0.AuxInt
   8665 		ptr := v_0.Args[0]
   8666 		val := v.Args[1]
   8667 		mem := v.Args[2]
   8668 		if !(is20Bit(off1 + off2)) {
   8669 			break
   8670 		}
   8671 		v.reset(OpS390XFMOVDstore)
   8672 		v.AuxInt = off1 + off2
   8673 		v.Aux = sym
   8674 		v.AddArg(ptr)
   8675 		v.AddArg(val)
   8676 		v.AddArg(mem)
   8677 		return true
   8678 	}
   8679 	// match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem)
   8680 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   8681 	// result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
   8682 	for {
   8683 		off1 := v.AuxInt
   8684 		sym1 := v.Aux
   8685 		_ = v.Args[2]
   8686 		v_0 := v.Args[0]
   8687 		if v_0.Op != OpS390XMOVDaddr {
   8688 			break
   8689 		}
   8690 		off2 := v_0.AuxInt
   8691 		sym2 := v_0.Aux
   8692 		base := v_0.Args[0]
   8693 		val := v.Args[1]
   8694 		mem := v.Args[2]
   8695 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   8696 			break
   8697 		}
   8698 		v.reset(OpS390XFMOVDstore)
   8699 		v.AuxInt = off1 + off2
   8700 		v.Aux = mergeSym(sym1, sym2)
   8701 		v.AddArg(base)
   8702 		v.AddArg(val)
   8703 		v.AddArg(mem)
   8704 		return true
   8705 	}
   8706 	// match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
   8707 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   8708 	// result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
   8709 	for {
   8710 		off1 := v.AuxInt
   8711 		sym1 := v.Aux
   8712 		_ = v.Args[2]
   8713 		v_0 := v.Args[0]
   8714 		if v_0.Op != OpS390XMOVDaddridx {
   8715 			break
   8716 		}
   8717 		off2 := v_0.AuxInt
   8718 		sym2 := v_0.Aux
   8719 		_ = v_0.Args[1]
   8720 		ptr := v_0.Args[0]
   8721 		idx := v_0.Args[1]
   8722 		val := v.Args[1]
   8723 		mem := v.Args[2]
   8724 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   8725 			break
   8726 		}
   8727 		v.reset(OpS390XFMOVDstoreidx)
   8728 		v.AuxInt = off1 + off2
   8729 		v.Aux = mergeSym(sym1, sym2)
   8730 		v.AddArg(ptr)
   8731 		v.AddArg(idx)
   8732 		v.AddArg(val)
   8733 		v.AddArg(mem)
   8734 		return true
   8735 	}
   8736 	// match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem)
   8737 	// cond: ptr.Op != OpSB
   8738 	// result: (FMOVDstoreidx [off] {sym} ptr idx val mem)
   8739 	for {
   8740 		off := v.AuxInt
   8741 		sym := v.Aux
   8742 		_ = v.Args[2]
   8743 		v_0 := v.Args[0]
   8744 		if v_0.Op != OpS390XADD {
   8745 			break
   8746 		}
   8747 		_ = v_0.Args[1]
   8748 		ptr := v_0.Args[0]
   8749 		idx := v_0.Args[1]
   8750 		val := v.Args[1]
   8751 		mem := v.Args[2]
   8752 		if !(ptr.Op != OpSB) {
   8753 			break
   8754 		}
   8755 		v.reset(OpS390XFMOVDstoreidx)
   8756 		v.AuxInt = off
   8757 		v.Aux = sym
   8758 		v.AddArg(ptr)
   8759 		v.AddArg(idx)
   8760 		v.AddArg(val)
   8761 		v.AddArg(mem)
   8762 		return true
   8763 	}
   8764 	return false
   8765 }
   8766 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool {
   8767 	// match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
   8768 	// cond: is20Bit(c+d)
   8769 	// result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem)
   8770 	for {
   8771 		c := v.AuxInt
   8772 		sym := v.Aux
   8773 		_ = v.Args[3]
   8774 		v_0 := v.Args[0]
   8775 		if v_0.Op != OpS390XADDconst {
   8776 			break
   8777 		}
   8778 		d := v_0.AuxInt
   8779 		ptr := v_0.Args[0]
   8780 		idx := v.Args[1]
   8781 		val := v.Args[2]
   8782 		mem := v.Args[3]
   8783 		if !(is20Bit(c + d)) {
   8784 			break
   8785 		}
   8786 		v.reset(OpS390XFMOVDstoreidx)
   8787 		v.AuxInt = c + d
   8788 		v.Aux = sym
   8789 		v.AddArg(ptr)
   8790 		v.AddArg(idx)
   8791 		v.AddArg(val)
   8792 		v.AddArg(mem)
   8793 		return true
   8794 	}
   8795 	// match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
   8796 	// cond: is20Bit(c+d)
   8797 	// result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem)
   8798 	for {
   8799 		c := v.AuxInt
   8800 		sym := v.Aux
   8801 		_ = v.Args[3]
   8802 		ptr := v.Args[0]
   8803 		v_1 := v.Args[1]
   8804 		if v_1.Op != OpS390XADDconst {
   8805 			break
   8806 		}
   8807 		d := v_1.AuxInt
   8808 		idx := v_1.Args[0]
   8809 		val := v.Args[2]
   8810 		mem := v.Args[3]
   8811 		if !(is20Bit(c + d)) {
   8812 			break
   8813 		}
   8814 		v.reset(OpS390XFMOVDstoreidx)
   8815 		v.AuxInt = c + d
   8816 		v.Aux = sym
   8817 		v.AddArg(ptr)
   8818 		v.AddArg(idx)
   8819 		v.AddArg(val)
   8820 		v.AddArg(mem)
   8821 		return true
   8822 	}
   8823 	return false
   8824 }
   8825 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool {
   8826 	// match: (FMOVSload [off] {sym} ptr1 (FMOVSstore [off] {sym} ptr2 x _))
   8827 	// cond: isSamePtr(ptr1, ptr2)
   8828 	// result: x
   8829 	for {
   8830 		off := v.AuxInt
   8831 		sym := v.Aux
   8832 		_ = v.Args[1]
   8833 		ptr1 := v.Args[0]
   8834 		v_1 := v.Args[1]
   8835 		if v_1.Op != OpS390XFMOVSstore {
   8836 			break
   8837 		}
   8838 		if v_1.AuxInt != off {
   8839 			break
   8840 		}
   8841 		if v_1.Aux != sym {
   8842 			break
   8843 		}
   8844 		_ = v_1.Args[2]
   8845 		ptr2 := v_1.Args[0]
   8846 		x := v_1.Args[1]
   8847 		if !(isSamePtr(ptr1, ptr2)) {
   8848 			break
   8849 		}
   8850 		v.reset(OpCopy)
   8851 		v.Type = x.Type
   8852 		v.AddArg(x)
   8853 		return true
   8854 	}
   8855 	// match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem)
   8856 	// cond: is20Bit(off1+off2)
   8857 	// result: (FMOVSload [off1+off2] {sym} ptr mem)
   8858 	for {
   8859 		off1 := v.AuxInt
   8860 		sym := v.Aux
   8861 		_ = v.Args[1]
   8862 		v_0 := v.Args[0]
   8863 		if v_0.Op != OpS390XADDconst {
   8864 			break
   8865 		}
   8866 		off2 := v_0.AuxInt
   8867 		ptr := v_0.Args[0]
   8868 		mem := v.Args[1]
   8869 		if !(is20Bit(off1 + off2)) {
   8870 			break
   8871 		}
   8872 		v.reset(OpS390XFMOVSload)
   8873 		v.AuxInt = off1 + off2
   8874 		v.Aux = sym
   8875 		v.AddArg(ptr)
   8876 		v.AddArg(mem)
   8877 		return true
   8878 	}
   8879 	// match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
   8880 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   8881 	// result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem)
   8882 	for {
   8883 		off1 := v.AuxInt
   8884 		sym1 := v.Aux
   8885 		_ = v.Args[1]
   8886 		v_0 := v.Args[0]
   8887 		if v_0.Op != OpS390XMOVDaddr {
   8888 			break
   8889 		}
   8890 		off2 := v_0.AuxInt
   8891 		sym2 := v_0.Aux
   8892 		base := v_0.Args[0]
   8893 		mem := v.Args[1]
   8894 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   8895 			break
   8896 		}
   8897 		v.reset(OpS390XFMOVSload)
   8898 		v.AuxInt = off1 + off2
   8899 		v.Aux = mergeSym(sym1, sym2)
   8900 		v.AddArg(base)
   8901 		v.AddArg(mem)
   8902 		return true
   8903 	}
   8904 	// match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   8905 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   8906 	// result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   8907 	for {
   8908 		off1 := v.AuxInt
   8909 		sym1 := v.Aux
   8910 		_ = v.Args[1]
   8911 		v_0 := v.Args[0]
   8912 		if v_0.Op != OpS390XMOVDaddridx {
   8913 			break
   8914 		}
   8915 		off2 := v_0.AuxInt
   8916 		sym2 := v_0.Aux
   8917 		_ = v_0.Args[1]
   8918 		ptr := v_0.Args[0]
   8919 		idx := v_0.Args[1]
   8920 		mem := v.Args[1]
   8921 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   8922 			break
   8923 		}
   8924 		v.reset(OpS390XFMOVSloadidx)
   8925 		v.AuxInt = off1 + off2
   8926 		v.Aux = mergeSym(sym1, sym2)
   8927 		v.AddArg(ptr)
   8928 		v.AddArg(idx)
   8929 		v.AddArg(mem)
   8930 		return true
   8931 	}
   8932 	// match: (FMOVSload [off] {sym} (ADD ptr idx) mem)
   8933 	// cond: ptr.Op != OpSB
   8934 	// result: (FMOVSloadidx [off] {sym} ptr idx mem)
   8935 	for {
   8936 		off := v.AuxInt
   8937 		sym := v.Aux
   8938 		_ = v.Args[1]
   8939 		v_0 := v.Args[0]
   8940 		if v_0.Op != OpS390XADD {
   8941 			break
   8942 		}
   8943 		_ = v_0.Args[1]
   8944 		ptr := v_0.Args[0]
   8945 		idx := v_0.Args[1]
   8946 		mem := v.Args[1]
   8947 		if !(ptr.Op != OpSB) {
   8948 			break
   8949 		}
   8950 		v.reset(OpS390XFMOVSloadidx)
   8951 		v.AuxInt = off
   8952 		v.Aux = sym
   8953 		v.AddArg(ptr)
   8954 		v.AddArg(idx)
   8955 		v.AddArg(mem)
   8956 		return true
   8957 	}
   8958 	return false
   8959 }
   8960 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool {
   8961 	// match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   8962 	// cond: is20Bit(c+d)
   8963 	// result: (FMOVSloadidx [c+d] {sym} ptr idx mem)
   8964 	for {
   8965 		c := v.AuxInt
   8966 		sym := v.Aux
   8967 		_ = v.Args[2]
   8968 		v_0 := v.Args[0]
   8969 		if v_0.Op != OpS390XADDconst {
   8970 			break
   8971 		}
   8972 		d := v_0.AuxInt
   8973 		ptr := v_0.Args[0]
   8974 		idx := v.Args[1]
   8975 		mem := v.Args[2]
   8976 		if !(is20Bit(c + d)) {
   8977 			break
   8978 		}
   8979 		v.reset(OpS390XFMOVSloadidx)
   8980 		v.AuxInt = c + d
   8981 		v.Aux = sym
   8982 		v.AddArg(ptr)
   8983 		v.AddArg(idx)
   8984 		v.AddArg(mem)
   8985 		return true
   8986 	}
   8987 	// match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   8988 	// cond: is20Bit(c+d)
   8989 	// result: (FMOVSloadidx [c+d] {sym} ptr idx mem)
   8990 	for {
   8991 		c := v.AuxInt
   8992 		sym := v.Aux
   8993 		_ = v.Args[2]
   8994 		ptr := v.Args[0]
   8995 		v_1 := v.Args[1]
   8996 		if v_1.Op != OpS390XADDconst {
   8997 			break
   8998 		}
   8999 		d := v_1.AuxInt
   9000 		idx := v_1.Args[0]
   9001 		mem := v.Args[2]
   9002 		if !(is20Bit(c + d)) {
   9003 			break
   9004 		}
   9005 		v.reset(OpS390XFMOVSloadidx)
   9006 		v.AuxInt = c + d
   9007 		v.Aux = sym
   9008 		v.AddArg(ptr)
   9009 		v.AddArg(idx)
   9010 		v.AddArg(mem)
   9011 		return true
   9012 	}
   9013 	return false
   9014 }
   9015 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool {
   9016 	// match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem)
   9017 	// cond: is20Bit(off1+off2)
   9018 	// result: (FMOVSstore [off1+off2] {sym} ptr val mem)
   9019 	for {
   9020 		off1 := v.AuxInt
   9021 		sym := v.Aux
   9022 		_ = v.Args[2]
   9023 		v_0 := v.Args[0]
   9024 		if v_0.Op != OpS390XADDconst {
   9025 			break
   9026 		}
   9027 		off2 := v_0.AuxInt
   9028 		ptr := v_0.Args[0]
   9029 		val := v.Args[1]
   9030 		mem := v.Args[2]
   9031 		if !(is20Bit(off1 + off2)) {
   9032 			break
   9033 		}
   9034 		v.reset(OpS390XFMOVSstore)
   9035 		v.AuxInt = off1 + off2
   9036 		v.Aux = sym
   9037 		v.AddArg(ptr)
   9038 		v.AddArg(val)
   9039 		v.AddArg(mem)
   9040 		return true
   9041 	}
   9042 	// match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem)
   9043 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   9044 	// result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
   9045 	for {
   9046 		off1 := v.AuxInt
   9047 		sym1 := v.Aux
   9048 		_ = v.Args[2]
   9049 		v_0 := v.Args[0]
   9050 		if v_0.Op != OpS390XMOVDaddr {
   9051 			break
   9052 		}
   9053 		off2 := v_0.AuxInt
   9054 		sym2 := v_0.Aux
   9055 		base := v_0.Args[0]
   9056 		val := v.Args[1]
   9057 		mem := v.Args[2]
   9058 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   9059 			break
   9060 		}
   9061 		v.reset(OpS390XFMOVSstore)
   9062 		v.AuxInt = off1 + off2
   9063 		v.Aux = mergeSym(sym1, sym2)
   9064 		v.AddArg(base)
   9065 		v.AddArg(val)
   9066 		v.AddArg(mem)
   9067 		return true
   9068 	}
   9069 	// match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
   9070 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   9071 	// result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
   9072 	for {
   9073 		off1 := v.AuxInt
   9074 		sym1 := v.Aux
   9075 		_ = v.Args[2]
   9076 		v_0 := v.Args[0]
   9077 		if v_0.Op != OpS390XMOVDaddridx {
   9078 			break
   9079 		}
   9080 		off2 := v_0.AuxInt
   9081 		sym2 := v_0.Aux
   9082 		_ = v_0.Args[1]
   9083 		ptr := v_0.Args[0]
   9084 		idx := v_0.Args[1]
   9085 		val := v.Args[1]
   9086 		mem := v.Args[2]
   9087 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   9088 			break
   9089 		}
   9090 		v.reset(OpS390XFMOVSstoreidx)
   9091 		v.AuxInt = off1 + off2
   9092 		v.Aux = mergeSym(sym1, sym2)
   9093 		v.AddArg(ptr)
   9094 		v.AddArg(idx)
   9095 		v.AddArg(val)
   9096 		v.AddArg(mem)
   9097 		return true
   9098 	}
   9099 	// match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem)
   9100 	// cond: ptr.Op != OpSB
   9101 	// result: (FMOVSstoreidx [off] {sym} ptr idx val mem)
   9102 	for {
   9103 		off := v.AuxInt
   9104 		sym := v.Aux
   9105 		_ = v.Args[2]
   9106 		v_0 := v.Args[0]
   9107 		if v_0.Op != OpS390XADD {
   9108 			break
   9109 		}
   9110 		_ = v_0.Args[1]
   9111 		ptr := v_0.Args[0]
   9112 		idx := v_0.Args[1]
   9113 		val := v.Args[1]
   9114 		mem := v.Args[2]
   9115 		if !(ptr.Op != OpSB) {
   9116 			break
   9117 		}
   9118 		v.reset(OpS390XFMOVSstoreidx)
   9119 		v.AuxInt = off
   9120 		v.Aux = sym
   9121 		v.AddArg(ptr)
   9122 		v.AddArg(idx)
   9123 		v.AddArg(val)
   9124 		v.AddArg(mem)
   9125 		return true
   9126 	}
   9127 	return false
   9128 }
   9129 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool {
   9130 	// match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
   9131 	// cond: is20Bit(c+d)
   9132 	// result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem)
   9133 	for {
   9134 		c := v.AuxInt
   9135 		sym := v.Aux
   9136 		_ = v.Args[3]
   9137 		v_0 := v.Args[0]
   9138 		if v_0.Op != OpS390XADDconst {
   9139 			break
   9140 		}
   9141 		d := v_0.AuxInt
   9142 		ptr := v_0.Args[0]
   9143 		idx := v.Args[1]
   9144 		val := v.Args[2]
   9145 		mem := v.Args[3]
   9146 		if !(is20Bit(c + d)) {
   9147 			break
   9148 		}
   9149 		v.reset(OpS390XFMOVSstoreidx)
   9150 		v.AuxInt = c + d
   9151 		v.Aux = sym
   9152 		v.AddArg(ptr)
   9153 		v.AddArg(idx)
   9154 		v.AddArg(val)
   9155 		v.AddArg(mem)
   9156 		return true
   9157 	}
   9158 	// match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
   9159 	// cond: is20Bit(c+d)
   9160 	// result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem)
   9161 	for {
   9162 		c := v.AuxInt
   9163 		sym := v.Aux
   9164 		_ = v.Args[3]
   9165 		ptr := v.Args[0]
   9166 		v_1 := v.Args[1]
   9167 		if v_1.Op != OpS390XADDconst {
   9168 			break
   9169 		}
   9170 		d := v_1.AuxInt
   9171 		idx := v_1.Args[0]
   9172 		val := v.Args[2]
   9173 		mem := v.Args[3]
   9174 		if !(is20Bit(c + d)) {
   9175 			break
   9176 		}
   9177 		v.reset(OpS390XFMOVSstoreidx)
   9178 		v.AuxInt = c + d
   9179 		v.Aux = sym
   9180 		v.AddArg(ptr)
   9181 		v.AddArg(idx)
   9182 		v.AddArg(val)
   9183 		v.AddArg(mem)
   9184 		return true
   9185 	}
   9186 	return false
   9187 }
   9188 func rewriteValueS390X_OpS390XFNEG_0(v *Value) bool {
   9189 	// match: (FNEG (LPDFR x))
   9190 	// cond:
   9191 	// result: (LNDFR x)
   9192 	for {
   9193 		v_0 := v.Args[0]
   9194 		if v_0.Op != OpS390XLPDFR {
   9195 			break
   9196 		}
   9197 		x := v_0.Args[0]
   9198 		v.reset(OpS390XLNDFR)
   9199 		v.AddArg(x)
   9200 		return true
   9201 	}
   9202 	// match: (FNEG (LNDFR x))
   9203 	// cond:
   9204 	// result: (LPDFR x)
   9205 	for {
   9206 		v_0 := v.Args[0]
   9207 		if v_0.Op != OpS390XLNDFR {
   9208 			break
   9209 		}
   9210 		x := v_0.Args[0]
   9211 		v.reset(OpS390XLPDFR)
   9212 		v.AddArg(x)
   9213 		return true
   9214 	}
   9215 	return false
   9216 }
   9217 func rewriteValueS390X_OpS390XFNEGS_0(v *Value) bool {
   9218 	// match: (FNEGS (LPDFR x))
   9219 	// cond:
   9220 	// result: (LNDFR x)
   9221 	for {
   9222 		v_0 := v.Args[0]
   9223 		if v_0.Op != OpS390XLPDFR {
   9224 			break
   9225 		}
   9226 		x := v_0.Args[0]
   9227 		v.reset(OpS390XLNDFR)
   9228 		v.AddArg(x)
   9229 		return true
   9230 	}
   9231 	// match: (FNEGS (LNDFR x))
   9232 	// cond:
   9233 	// result: (LPDFR x)
   9234 	for {
   9235 		v_0 := v.Args[0]
   9236 		if v_0.Op != OpS390XLNDFR {
   9237 			break
   9238 		}
   9239 		x := v_0.Args[0]
   9240 		v.reset(OpS390XLPDFR)
   9241 		v.AddArg(x)
   9242 		return true
   9243 	}
   9244 	return false
   9245 }
   9246 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool {
   9247 	// match: (FSUB (FMUL y z) x)
   9248 	// cond:
   9249 	// result: (FMSUB x y z)
   9250 	for {
   9251 		_ = v.Args[1]
   9252 		v_0 := v.Args[0]
   9253 		if v_0.Op != OpS390XFMUL {
   9254 			break
   9255 		}
   9256 		_ = v_0.Args[1]
   9257 		y := v_0.Args[0]
   9258 		z := v_0.Args[1]
   9259 		x := v.Args[1]
   9260 		v.reset(OpS390XFMSUB)
   9261 		v.AddArg(x)
   9262 		v.AddArg(y)
   9263 		v.AddArg(z)
   9264 		return true
   9265 	}
   9266 	return false
   9267 }
   9268 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool {
   9269 	// match: (FSUBS (FMULS y z) x)
   9270 	// cond:
   9271 	// result: (FMSUBS x y z)
   9272 	for {
   9273 		_ = v.Args[1]
   9274 		v_0 := v.Args[0]
   9275 		if v_0.Op != OpS390XFMULS {
   9276 			break
   9277 		}
   9278 		_ = v_0.Args[1]
   9279 		y := v_0.Args[0]
   9280 		z := v_0.Args[1]
   9281 		x := v.Args[1]
   9282 		v.reset(OpS390XFMSUBS)
   9283 		v.AddArg(x)
   9284 		v.AddArg(y)
   9285 		v.AddArg(z)
   9286 		return true
   9287 	}
   9288 	return false
   9289 }
   9290 func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool {
   9291 	b := v.Block
   9292 	_ = b
   9293 	// match: (LDGR <t> (SRDconst [1] (SLDconst [1] x)))
   9294 	// cond:
   9295 	// result: (LPDFR (LDGR <t> x))
   9296 	for {
   9297 		t := v.Type
   9298 		v_0 := v.Args[0]
   9299 		if v_0.Op != OpS390XSRDconst {
   9300 			break
   9301 		}
   9302 		if v_0.AuxInt != 1 {
   9303 			break
   9304 		}
   9305 		v_0_0 := v_0.Args[0]
   9306 		if v_0_0.Op != OpS390XSLDconst {
   9307 			break
   9308 		}
   9309 		if v_0_0.AuxInt != 1 {
   9310 			break
   9311 		}
   9312 		x := v_0_0.Args[0]
   9313 		v.reset(OpS390XLPDFR)
   9314 		v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
   9315 		v0.AddArg(x)
   9316 		v.AddArg(v0)
   9317 		return true
   9318 	}
   9319 	// match: (LDGR <t> (OR (MOVDconst [-1<<63]) x))
   9320 	// cond:
   9321 	// result: (LNDFR (LDGR <t> x))
   9322 	for {
   9323 		t := v.Type
   9324 		v_0 := v.Args[0]
   9325 		if v_0.Op != OpS390XOR {
   9326 			break
   9327 		}
   9328 		_ = v_0.Args[1]
   9329 		v_0_0 := v_0.Args[0]
   9330 		if v_0_0.Op != OpS390XMOVDconst {
   9331 			break
   9332 		}
   9333 		if v_0_0.AuxInt != -1<<63 {
   9334 			break
   9335 		}
   9336 		x := v_0.Args[1]
   9337 		v.reset(OpS390XLNDFR)
   9338 		v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
   9339 		v0.AddArg(x)
   9340 		v.AddArg(v0)
   9341 		return true
   9342 	}
   9343 	// match: (LDGR <t> (OR x (MOVDconst [-1<<63])))
   9344 	// cond:
   9345 	// result: (LNDFR (LDGR <t> x))
   9346 	for {
   9347 		t := v.Type
   9348 		v_0 := v.Args[0]
   9349 		if v_0.Op != OpS390XOR {
   9350 			break
   9351 		}
   9352 		_ = v_0.Args[1]
   9353 		x := v_0.Args[0]
   9354 		v_0_1 := v_0.Args[1]
   9355 		if v_0_1.Op != OpS390XMOVDconst {
   9356 			break
   9357 		}
   9358 		if v_0_1.AuxInt != -1<<63 {
   9359 			break
   9360 		}
   9361 		v.reset(OpS390XLNDFR)
   9362 		v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
   9363 		v0.AddArg(x)
   9364 		v.AddArg(v0)
   9365 		return true
   9366 	}
   9367 	// match: (LDGR <t> x:(ORload <t1> [off] {sym} (MOVDconst [-1<<63]) ptr mem))
   9368 	// cond: x.Uses == 1 && clobber(x)
   9369 	// result: @x.Block (LNDFR <t> (LDGR <t> (MOVDload <t1> [off] {sym} ptr mem)))
   9370 	for {
   9371 		t := v.Type
   9372 		x := v.Args[0]
   9373 		if x.Op != OpS390XORload {
   9374 			break
   9375 		}
   9376 		t1 := x.Type
   9377 		off := x.AuxInt
   9378 		sym := x.Aux
   9379 		_ = x.Args[2]
   9380 		x_0 := x.Args[0]
   9381 		if x_0.Op != OpS390XMOVDconst {
   9382 			break
   9383 		}
   9384 		if x_0.AuxInt != -1<<63 {
   9385 			break
   9386 		}
   9387 		ptr := x.Args[1]
   9388 		mem := x.Args[2]
   9389 		if !(x.Uses == 1 && clobber(x)) {
   9390 			break
   9391 		}
   9392 		b = x.Block
   9393 		v0 := b.NewValue0(v.Pos, OpS390XLNDFR, t)
   9394 		v.reset(OpCopy)
   9395 		v.AddArg(v0)
   9396 		v1 := b.NewValue0(v.Pos, OpS390XLDGR, t)
   9397 		v2 := b.NewValue0(v.Pos, OpS390XMOVDload, t1)
   9398 		v2.AuxInt = off
   9399 		v2.Aux = sym
   9400 		v2.AddArg(ptr)
   9401 		v2.AddArg(mem)
   9402 		v1.AddArg(v2)
   9403 		v0.AddArg(v1)
   9404 		return true
   9405 	}
   9406 	// match: (LDGR (LGDR x))
   9407 	// cond:
   9408 	// result: x
   9409 	for {
   9410 		v_0 := v.Args[0]
   9411 		if v_0.Op != OpS390XLGDR {
   9412 			break
   9413 		}
   9414 		x := v_0.Args[0]
   9415 		v.reset(OpCopy)
   9416 		v.Type = x.Type
   9417 		v.AddArg(x)
   9418 		return true
   9419 	}
   9420 	return false
   9421 }
   9422 func rewriteValueS390X_OpS390XLEDBR_0(v *Value) bool {
   9423 	// match: (LEDBR (LPDFR (LDEBR x)))
   9424 	// cond:
   9425 	// result: (LPDFR x)
   9426 	for {
   9427 		v_0 := v.Args[0]
   9428 		if v_0.Op != OpS390XLPDFR {
   9429 			break
   9430 		}
   9431 		v_0_0 := v_0.Args[0]
   9432 		if v_0_0.Op != OpS390XLDEBR {
   9433 			break
   9434 		}
   9435 		x := v_0_0.Args[0]
   9436 		v.reset(OpS390XLPDFR)
   9437 		v.AddArg(x)
   9438 		return true
   9439 	}
   9440 	// match: (LEDBR (LNDFR (LDEBR x)))
   9441 	// cond:
   9442 	// result: (LNDFR x)
   9443 	for {
   9444 		v_0 := v.Args[0]
   9445 		if v_0.Op != OpS390XLNDFR {
   9446 			break
   9447 		}
   9448 		v_0_0 := v_0.Args[0]
   9449 		if v_0_0.Op != OpS390XLDEBR {
   9450 			break
   9451 		}
   9452 		x := v_0_0.Args[0]
   9453 		v.reset(OpS390XLNDFR)
   9454 		v.AddArg(x)
   9455 		return true
   9456 	}
   9457 	return false
   9458 }
   9459 func rewriteValueS390X_OpS390XLGDR_0(v *Value) bool {
   9460 	// match: (LGDR (LDGR x))
   9461 	// cond:
   9462 	// result: (MOVDreg x)
   9463 	for {
   9464 		v_0 := v.Args[0]
   9465 		if v_0.Op != OpS390XLDGR {
   9466 			break
   9467 		}
   9468 		x := v_0.Args[0]
   9469 		v.reset(OpS390XMOVDreg)
   9470 		v.AddArg(x)
   9471 		return true
   9472 	}
   9473 	return false
   9474 }
   9475 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool {
   9476 	// match: (LoweredRound32F x:(FMOVSconst))
   9477 	// cond:
   9478 	// result: x
   9479 	for {
   9480 		x := v.Args[0]
   9481 		if x.Op != OpS390XFMOVSconst {
   9482 			break
   9483 		}
   9484 		v.reset(OpCopy)
   9485 		v.Type = x.Type
   9486 		v.AddArg(x)
   9487 		return true
   9488 	}
   9489 	return false
   9490 }
   9491 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool {
   9492 	// match: (LoweredRound64F x:(FMOVDconst))
   9493 	// cond:
   9494 	// result: x
   9495 	for {
   9496 		x := v.Args[0]
   9497 		if x.Op != OpS390XFMOVDconst {
   9498 			break
   9499 		}
   9500 		v.reset(OpCopy)
   9501 		v.Type = x.Type
   9502 		v.AddArg(x)
   9503 		return true
   9504 	}
   9505 	return false
   9506 }
   9507 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool {
   9508 	// match: (MOVBZload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _))
   9509 	// cond: isSamePtr(ptr1, ptr2)
   9510 	// result: (MOVBZreg x)
   9511 	for {
   9512 		off := v.AuxInt
   9513 		sym := v.Aux
   9514 		_ = v.Args[1]
   9515 		ptr1 := v.Args[0]
   9516 		v_1 := v.Args[1]
   9517 		if v_1.Op != OpS390XMOVBstore {
   9518 			break
   9519 		}
   9520 		if v_1.AuxInt != off {
   9521 			break
   9522 		}
   9523 		if v_1.Aux != sym {
   9524 			break
   9525 		}
   9526 		_ = v_1.Args[2]
   9527 		ptr2 := v_1.Args[0]
   9528 		x := v_1.Args[1]
   9529 		if !(isSamePtr(ptr1, ptr2)) {
   9530 			break
   9531 		}
   9532 		v.reset(OpS390XMOVBZreg)
   9533 		v.AddArg(x)
   9534 		return true
   9535 	}
   9536 	// match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem)
   9537 	// cond: is20Bit(off1+off2)
   9538 	// result: (MOVBZload [off1+off2] {sym} ptr mem)
   9539 	for {
   9540 		off1 := v.AuxInt
   9541 		sym := v.Aux
   9542 		_ = v.Args[1]
   9543 		v_0 := v.Args[0]
   9544 		if v_0.Op != OpS390XADDconst {
   9545 			break
   9546 		}
   9547 		off2 := v_0.AuxInt
   9548 		ptr := v_0.Args[0]
   9549 		mem := v.Args[1]
   9550 		if !(is20Bit(off1 + off2)) {
   9551 			break
   9552 		}
   9553 		v.reset(OpS390XMOVBZload)
   9554 		v.AuxInt = off1 + off2
   9555 		v.Aux = sym
   9556 		v.AddArg(ptr)
   9557 		v.AddArg(mem)
   9558 		return true
   9559 	}
   9560 	// match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
   9561 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   9562 	// result: (MOVBZload  [off1+off2] {mergeSym(sym1,sym2)} base mem)
   9563 	for {
   9564 		off1 := v.AuxInt
   9565 		sym1 := v.Aux
   9566 		_ = v.Args[1]
   9567 		v_0 := v.Args[0]
   9568 		if v_0.Op != OpS390XMOVDaddr {
   9569 			break
   9570 		}
   9571 		off2 := v_0.AuxInt
   9572 		sym2 := v_0.Aux
   9573 		base := v_0.Args[0]
   9574 		mem := v.Args[1]
   9575 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   9576 			break
   9577 		}
   9578 		v.reset(OpS390XMOVBZload)
   9579 		v.AuxInt = off1 + off2
   9580 		v.Aux = mergeSym(sym1, sym2)
   9581 		v.AddArg(base)
   9582 		v.AddArg(mem)
   9583 		return true
   9584 	}
   9585 	// match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   9586 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   9587 	// result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   9588 	for {
   9589 		off1 := v.AuxInt
   9590 		sym1 := v.Aux
   9591 		_ = v.Args[1]
   9592 		v_0 := v.Args[0]
   9593 		if v_0.Op != OpS390XMOVDaddridx {
   9594 			break
   9595 		}
   9596 		off2 := v_0.AuxInt
   9597 		sym2 := v_0.Aux
   9598 		_ = v_0.Args[1]
   9599 		ptr := v_0.Args[0]
   9600 		idx := v_0.Args[1]
   9601 		mem := v.Args[1]
   9602 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   9603 			break
   9604 		}
   9605 		v.reset(OpS390XMOVBZloadidx)
   9606 		v.AuxInt = off1 + off2
   9607 		v.Aux = mergeSym(sym1, sym2)
   9608 		v.AddArg(ptr)
   9609 		v.AddArg(idx)
   9610 		v.AddArg(mem)
   9611 		return true
   9612 	}
   9613 	// match: (MOVBZload [off] {sym} (ADD ptr idx) mem)
   9614 	// cond: ptr.Op != OpSB
   9615 	// result: (MOVBZloadidx [off] {sym} ptr idx mem)
   9616 	for {
   9617 		off := v.AuxInt
   9618 		sym := v.Aux
   9619 		_ = v.Args[1]
   9620 		v_0 := v.Args[0]
   9621 		if v_0.Op != OpS390XADD {
   9622 			break
   9623 		}
   9624 		_ = v_0.Args[1]
   9625 		ptr := v_0.Args[0]
   9626 		idx := v_0.Args[1]
   9627 		mem := v.Args[1]
   9628 		if !(ptr.Op != OpSB) {
   9629 			break
   9630 		}
   9631 		v.reset(OpS390XMOVBZloadidx)
   9632 		v.AuxInt = off
   9633 		v.Aux = sym
   9634 		v.AddArg(ptr)
   9635 		v.AddArg(idx)
   9636 		v.AddArg(mem)
   9637 		return true
   9638 	}
   9639 	return false
   9640 }
   9641 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool {
   9642 	// match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   9643 	// cond: is20Bit(c+d)
   9644 	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
   9645 	for {
   9646 		c := v.AuxInt
   9647 		sym := v.Aux
   9648 		_ = v.Args[2]
   9649 		v_0 := v.Args[0]
   9650 		if v_0.Op != OpS390XADDconst {
   9651 			break
   9652 		}
   9653 		d := v_0.AuxInt
   9654 		ptr := v_0.Args[0]
   9655 		idx := v.Args[1]
   9656 		mem := v.Args[2]
   9657 		if !(is20Bit(c + d)) {
   9658 			break
   9659 		}
   9660 		v.reset(OpS390XMOVBZloadidx)
   9661 		v.AuxInt = c + d
   9662 		v.Aux = sym
   9663 		v.AddArg(ptr)
   9664 		v.AddArg(idx)
   9665 		v.AddArg(mem)
   9666 		return true
   9667 	}
   9668 	// match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   9669 	// cond: is20Bit(c+d)
   9670 	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
   9671 	for {
   9672 		c := v.AuxInt
   9673 		sym := v.Aux
   9674 		_ = v.Args[2]
   9675 		idx := v.Args[0]
   9676 		v_1 := v.Args[1]
   9677 		if v_1.Op != OpS390XADDconst {
   9678 			break
   9679 		}
   9680 		d := v_1.AuxInt
   9681 		ptr := v_1.Args[0]
   9682 		mem := v.Args[2]
   9683 		if !(is20Bit(c + d)) {
   9684 			break
   9685 		}
   9686 		v.reset(OpS390XMOVBZloadidx)
   9687 		v.AuxInt = c + d
   9688 		v.Aux = sym
   9689 		v.AddArg(ptr)
   9690 		v.AddArg(idx)
   9691 		v.AddArg(mem)
   9692 		return true
   9693 	}
   9694 	// match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   9695 	// cond: is20Bit(c+d)
   9696 	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
   9697 	for {
   9698 		c := v.AuxInt
   9699 		sym := v.Aux
   9700 		_ = v.Args[2]
   9701 		ptr := v.Args[0]
   9702 		v_1 := v.Args[1]
   9703 		if v_1.Op != OpS390XADDconst {
   9704 			break
   9705 		}
   9706 		d := v_1.AuxInt
   9707 		idx := v_1.Args[0]
   9708 		mem := v.Args[2]
   9709 		if !(is20Bit(c + d)) {
   9710 			break
   9711 		}
   9712 		v.reset(OpS390XMOVBZloadidx)
   9713 		v.AuxInt = c + d
   9714 		v.Aux = sym
   9715 		v.AddArg(ptr)
   9716 		v.AddArg(idx)
   9717 		v.AddArg(mem)
   9718 		return true
   9719 	}
   9720 	// match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   9721 	// cond: is20Bit(c+d)
   9722 	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
   9723 	for {
   9724 		c := v.AuxInt
   9725 		sym := v.Aux
   9726 		_ = v.Args[2]
   9727 		v_0 := v.Args[0]
   9728 		if v_0.Op != OpS390XADDconst {
   9729 			break
   9730 		}
   9731 		d := v_0.AuxInt
   9732 		idx := v_0.Args[0]
   9733 		ptr := v.Args[1]
   9734 		mem := v.Args[2]
   9735 		if !(is20Bit(c + d)) {
   9736 			break
   9737 		}
   9738 		v.reset(OpS390XMOVBZloadidx)
   9739 		v.AuxInt = c + d
   9740 		v.Aux = sym
   9741 		v.AddArg(ptr)
   9742 		v.AddArg(idx)
   9743 		v.AddArg(mem)
   9744 		return true
   9745 	}
   9746 	return false
   9747 }
   9748 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool {
   9749 	// match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _))
   9750 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9751 	// result: (MOVDreg x)
   9752 	for {
   9753 		x := v.Args[0]
   9754 		if x.Op != OpS390XMOVDLT {
   9755 			break
   9756 		}
   9757 		_ = x.Args[2]
   9758 		x_0 := x.Args[0]
   9759 		if x_0.Op != OpS390XMOVDconst {
   9760 			break
   9761 		}
   9762 		c := x_0.AuxInt
   9763 		x_1 := x.Args[1]
   9764 		if x_1.Op != OpS390XMOVDconst {
   9765 			break
   9766 		}
   9767 		d := x_1.AuxInt
   9768 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9769 			break
   9770 		}
   9771 		v.reset(OpS390XMOVDreg)
   9772 		v.AddArg(x)
   9773 		return true
   9774 	}
   9775 	// match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _))
   9776 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9777 	// result: (MOVDreg x)
   9778 	for {
   9779 		x := v.Args[0]
   9780 		if x.Op != OpS390XMOVDLE {
   9781 			break
   9782 		}
   9783 		_ = x.Args[2]
   9784 		x_0 := x.Args[0]
   9785 		if x_0.Op != OpS390XMOVDconst {
   9786 			break
   9787 		}
   9788 		c := x_0.AuxInt
   9789 		x_1 := x.Args[1]
   9790 		if x_1.Op != OpS390XMOVDconst {
   9791 			break
   9792 		}
   9793 		d := x_1.AuxInt
   9794 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9795 			break
   9796 		}
   9797 		v.reset(OpS390XMOVDreg)
   9798 		v.AddArg(x)
   9799 		return true
   9800 	}
   9801 	// match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _))
   9802 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9803 	// result: (MOVDreg x)
   9804 	for {
   9805 		x := v.Args[0]
   9806 		if x.Op != OpS390XMOVDGT {
   9807 			break
   9808 		}
   9809 		_ = x.Args[2]
   9810 		x_0 := x.Args[0]
   9811 		if x_0.Op != OpS390XMOVDconst {
   9812 			break
   9813 		}
   9814 		c := x_0.AuxInt
   9815 		x_1 := x.Args[1]
   9816 		if x_1.Op != OpS390XMOVDconst {
   9817 			break
   9818 		}
   9819 		d := x_1.AuxInt
   9820 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9821 			break
   9822 		}
   9823 		v.reset(OpS390XMOVDreg)
   9824 		v.AddArg(x)
   9825 		return true
   9826 	}
   9827 	// match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _))
   9828 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9829 	// result: (MOVDreg x)
   9830 	for {
   9831 		x := v.Args[0]
   9832 		if x.Op != OpS390XMOVDGE {
   9833 			break
   9834 		}
   9835 		_ = x.Args[2]
   9836 		x_0 := x.Args[0]
   9837 		if x_0.Op != OpS390XMOVDconst {
   9838 			break
   9839 		}
   9840 		c := x_0.AuxInt
   9841 		x_1 := x.Args[1]
   9842 		if x_1.Op != OpS390XMOVDconst {
   9843 			break
   9844 		}
   9845 		d := x_1.AuxInt
   9846 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9847 			break
   9848 		}
   9849 		v.reset(OpS390XMOVDreg)
   9850 		v.AddArg(x)
   9851 		return true
   9852 	}
   9853 	// match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _))
   9854 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9855 	// result: (MOVDreg x)
   9856 	for {
   9857 		x := v.Args[0]
   9858 		if x.Op != OpS390XMOVDEQ {
   9859 			break
   9860 		}
   9861 		_ = x.Args[2]
   9862 		x_0 := x.Args[0]
   9863 		if x_0.Op != OpS390XMOVDconst {
   9864 			break
   9865 		}
   9866 		c := x_0.AuxInt
   9867 		x_1 := x.Args[1]
   9868 		if x_1.Op != OpS390XMOVDconst {
   9869 			break
   9870 		}
   9871 		d := x_1.AuxInt
   9872 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9873 			break
   9874 		}
   9875 		v.reset(OpS390XMOVDreg)
   9876 		v.AddArg(x)
   9877 		return true
   9878 	}
   9879 	// match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _))
   9880 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9881 	// result: (MOVDreg x)
   9882 	for {
   9883 		x := v.Args[0]
   9884 		if x.Op != OpS390XMOVDNE {
   9885 			break
   9886 		}
   9887 		_ = x.Args[2]
   9888 		x_0 := x.Args[0]
   9889 		if x_0.Op != OpS390XMOVDconst {
   9890 			break
   9891 		}
   9892 		c := x_0.AuxInt
   9893 		x_1 := x.Args[1]
   9894 		if x_1.Op != OpS390XMOVDconst {
   9895 			break
   9896 		}
   9897 		d := x_1.AuxInt
   9898 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9899 			break
   9900 		}
   9901 		v.reset(OpS390XMOVDreg)
   9902 		v.AddArg(x)
   9903 		return true
   9904 	}
   9905 	// match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _))
   9906 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9907 	// result: (MOVDreg x)
   9908 	for {
   9909 		x := v.Args[0]
   9910 		if x.Op != OpS390XMOVDGTnoinv {
   9911 			break
   9912 		}
   9913 		_ = x.Args[2]
   9914 		x_0 := x.Args[0]
   9915 		if x_0.Op != OpS390XMOVDconst {
   9916 			break
   9917 		}
   9918 		c := x_0.AuxInt
   9919 		x_1 := x.Args[1]
   9920 		if x_1.Op != OpS390XMOVDconst {
   9921 			break
   9922 		}
   9923 		d := x_1.AuxInt
   9924 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9925 			break
   9926 		}
   9927 		v.reset(OpS390XMOVDreg)
   9928 		v.AddArg(x)
   9929 		return true
   9930 	}
   9931 	// match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _))
   9932 	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
   9933 	// result: (MOVDreg x)
   9934 	for {
   9935 		x := v.Args[0]
   9936 		if x.Op != OpS390XMOVDGEnoinv {
   9937 			break
   9938 		}
   9939 		_ = x.Args[2]
   9940 		x_0 := x.Args[0]
   9941 		if x_0.Op != OpS390XMOVDconst {
   9942 			break
   9943 		}
   9944 		c := x_0.AuxInt
   9945 		x_1 := x.Args[1]
   9946 		if x_1.Op != OpS390XMOVDconst {
   9947 			break
   9948 		}
   9949 		d := x_1.AuxInt
   9950 		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
   9951 			break
   9952 		}
   9953 		v.reset(OpS390XMOVDreg)
   9954 		v.AddArg(x)
   9955 		return true
   9956 	}
   9957 	// match: (MOVBZreg x:(MOVBZload _ _))
   9958 	// cond:
   9959 	// result: (MOVDreg x)
   9960 	for {
   9961 		x := v.Args[0]
   9962 		if x.Op != OpS390XMOVBZload {
   9963 			break
   9964 		}
   9965 		_ = x.Args[1]
   9966 		v.reset(OpS390XMOVDreg)
   9967 		v.AddArg(x)
   9968 		return true
   9969 	}
   9970 	// match: (MOVBZreg x:(Arg <t>))
   9971 	// cond: is8BitInt(t) && !isSigned(t)
   9972 	// result: (MOVDreg x)
   9973 	for {
   9974 		x := v.Args[0]
   9975 		if x.Op != OpArg {
   9976 			break
   9977 		}
   9978 		t := x.Type
   9979 		if !(is8BitInt(t) && !isSigned(t)) {
   9980 			break
   9981 		}
   9982 		v.reset(OpS390XMOVDreg)
   9983 		v.AddArg(x)
   9984 		return true
   9985 	}
   9986 	return false
   9987 }
   9988 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool {
   9989 	b := v.Block
   9990 	_ = b
   9991 	// match: (MOVBZreg x:(MOVBZreg _))
   9992 	// cond:
   9993 	// result: (MOVDreg x)
   9994 	for {
   9995 		x := v.Args[0]
   9996 		if x.Op != OpS390XMOVBZreg {
   9997 			break
   9998 		}
   9999 		v.reset(OpS390XMOVDreg)
   10000 		v.AddArg(x)
   10001 		return true
   10002 	}
   10003 	// match: (MOVBZreg (MOVDconst [c]))
   10004 	// cond:
   10005 	// result: (MOVDconst [int64(uint8(c))])
   10006 	for {
   10007 		v_0 := v.Args[0]
   10008 		if v_0.Op != OpS390XMOVDconst {
   10009 			break
   10010 		}
   10011 		c := v_0.AuxInt
   10012 		v.reset(OpS390XMOVDconst)
   10013 		v.AuxInt = int64(uint8(c))
   10014 		return true
   10015 	}
   10016 	// match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem))
   10017 	// cond: x.Uses == 1 && clobber(x)
   10018 	// result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem)
   10019 	for {
   10020 		x := v.Args[0]
   10021 		if x.Op != OpS390XMOVBZload {
   10022 			break
   10023 		}
   10024 		off := x.AuxInt
   10025 		sym := x.Aux
   10026 		_ = x.Args[1]
   10027 		ptr := x.Args[0]
   10028 		mem := x.Args[1]
   10029 		if !(x.Uses == 1 && clobber(x)) {
   10030 			break
   10031 		}
   10032 		b = x.Block
   10033 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type)
   10034 		v.reset(OpCopy)
   10035 		v.AddArg(v0)
   10036 		v0.AuxInt = off
   10037 		v0.Aux = sym
   10038 		v0.AddArg(ptr)
   10039 		v0.AddArg(mem)
   10040 		return true
   10041 	}
   10042 	// match: (MOVBZreg x:(MOVBload [off] {sym} ptr mem))
   10043 	// cond: x.Uses == 1 && clobber(x)
   10044 	// result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem)
   10045 	for {
   10046 		x := v.Args[0]
   10047 		if x.Op != OpS390XMOVBload {
   10048 			break
   10049 		}
   10050 		off := x.AuxInt
   10051 		sym := x.Aux
   10052 		_ = x.Args[1]
   10053 		ptr := x.Args[0]
   10054 		mem := x.Args[1]
   10055 		if !(x.Uses == 1 && clobber(x)) {
   10056 			break
   10057 		}
   10058 		b = x.Block
   10059 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type)
   10060 		v.reset(OpCopy)
   10061 		v.AddArg(v0)
   10062 		v0.AuxInt = off
   10063 		v0.Aux = sym
   10064 		v0.AddArg(ptr)
   10065 		v0.AddArg(mem)
   10066 		return true
   10067 	}
   10068 	// match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem))
   10069 	// cond: x.Uses == 1 && clobber(x)
   10070 	// result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem)
   10071 	for {
   10072 		x := v.Args[0]
   10073 		if x.Op != OpS390XMOVBZloadidx {
   10074 			break
   10075 		}
   10076 		off := x.AuxInt
   10077 		sym := x.Aux
   10078 		_ = x.Args[2]
   10079 		ptr := x.Args[0]
   10080 		idx := x.Args[1]
   10081 		mem := x.Args[2]
   10082 		if !(x.Uses == 1 && clobber(x)) {
   10083 			break
   10084 		}
   10085 		b = x.Block
   10086 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type)
   10087 		v.reset(OpCopy)
   10088 		v.AddArg(v0)
   10089 		v0.AuxInt = off
   10090 		v0.Aux = sym
   10091 		v0.AddArg(ptr)
   10092 		v0.AddArg(idx)
   10093 		v0.AddArg(mem)
   10094 		return true
   10095 	}
   10096 	// match: (MOVBZreg x:(MOVBloadidx [off] {sym} ptr idx mem))
   10097 	// cond: x.Uses == 1 && clobber(x)
   10098 	// result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem)
   10099 	for {
   10100 		x := v.Args[0]
   10101 		if x.Op != OpS390XMOVBloadidx {
   10102 			break
   10103 		}
   10104 		off := x.AuxInt
   10105 		sym := x.Aux
   10106 		_ = x.Args[2]
   10107 		ptr := x.Args[0]
   10108 		idx := x.Args[1]
   10109 		mem := x.Args[2]
   10110 		if !(x.Uses == 1 && clobber(x)) {
   10111 			break
   10112 		}
   10113 		b = x.Block
   10114 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type)
   10115 		v.reset(OpCopy)
   10116 		v.AddArg(v0)
   10117 		v0.AuxInt = off
   10118 		v0.Aux = sym
   10119 		v0.AddArg(ptr)
   10120 		v0.AddArg(idx)
   10121 		v0.AddArg(mem)
   10122 		return true
   10123 	}
   10124 	return false
   10125 }
   10126 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool {
   10127 	// match: (MOVBload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _))
   10128 	// cond: isSamePtr(ptr1, ptr2)
   10129 	// result: (MOVBreg x)
   10130 	for {
   10131 		off := v.AuxInt
   10132 		sym := v.Aux
   10133 		_ = v.Args[1]
   10134 		ptr1 := v.Args[0]
   10135 		v_1 := v.Args[1]
   10136 		if v_1.Op != OpS390XMOVBstore {
   10137 			break
   10138 		}
   10139 		if v_1.AuxInt != off {
   10140 			break
   10141 		}
   10142 		if v_1.Aux != sym {
   10143 			break
   10144 		}
   10145 		_ = v_1.Args[2]
   10146 		ptr2 := v_1.Args[0]
   10147 		x := v_1.Args[1]
   10148 		if !(isSamePtr(ptr1, ptr2)) {
   10149 			break
   10150 		}
   10151 		v.reset(OpS390XMOVBreg)
   10152 		v.AddArg(x)
   10153 		return true
   10154 	}
   10155 	// match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem)
   10156 	// cond: is20Bit(off1+off2)
   10157 	// result: (MOVBload  [off1+off2] {sym} ptr mem)
   10158 	for {
   10159 		off1 := v.AuxInt
   10160 		sym := v.Aux
   10161 		_ = v.Args[1]
   10162 		v_0 := v.Args[0]
   10163 		if v_0.Op != OpS390XADDconst {
   10164 			break
   10165 		}
   10166 		off2 := v_0.AuxInt
   10167 		ptr := v_0.Args[0]
   10168 		mem := v.Args[1]
   10169 		if !(is20Bit(off1 + off2)) {
   10170 			break
   10171 		}
   10172 		v.reset(OpS390XMOVBload)
   10173 		v.AuxInt = off1 + off2
   10174 		v.Aux = sym
   10175 		v.AddArg(ptr)
   10176 		v.AddArg(mem)
   10177 		return true
   10178 	}
   10179 	// match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
   10180 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   10181 	// result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem)
   10182 	for {
   10183 		off1 := v.AuxInt
   10184 		sym1 := v.Aux
   10185 		_ = v.Args[1]
   10186 		v_0 := v.Args[0]
   10187 		if v_0.Op != OpS390XMOVDaddr {
   10188 			break
   10189 		}
   10190 		off2 := v_0.AuxInt
   10191 		sym2 := v_0.Aux
   10192 		base := v_0.Args[0]
   10193 		mem := v.Args[1]
   10194 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   10195 			break
   10196 		}
   10197 		v.reset(OpS390XMOVBload)
   10198 		v.AuxInt = off1 + off2
   10199 		v.Aux = mergeSym(sym1, sym2)
   10200 		v.AddArg(base)
   10201 		v.AddArg(mem)
   10202 		return true
   10203 	}
   10204 	// match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   10205 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   10206 	// result: (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   10207 	for {
   10208 		off1 := v.AuxInt
   10209 		sym1 := v.Aux
   10210 		_ = v.Args[1]
   10211 		v_0 := v.Args[0]
   10212 		if v_0.Op != OpS390XMOVDaddridx {
   10213 			break
   10214 		}
   10215 		off2 := v_0.AuxInt
   10216 		sym2 := v_0.Aux
   10217 		_ = v_0.Args[1]
   10218 		ptr := v_0.Args[0]
   10219 		idx := v_0.Args[1]
   10220 		mem := v.Args[1]
   10221 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   10222 			break
   10223 		}
   10224 		v.reset(OpS390XMOVBloadidx)
   10225 		v.AuxInt = off1 + off2
   10226 		v.Aux = mergeSym(sym1, sym2)
   10227 		v.AddArg(ptr)
   10228 		v.AddArg(idx)
   10229 		v.AddArg(mem)
   10230 		return true
   10231 	}
   10232 	// match: (MOVBload [off] {sym} (ADD ptr idx) mem)
   10233 	// cond: ptr.Op != OpSB
   10234 	// result: (MOVBloadidx  [off] {sym} ptr idx mem)
   10235 	for {
   10236 		off := v.AuxInt
   10237 		sym := v.Aux
   10238 		_ = v.Args[1]
   10239 		v_0 := v.Args[0]
   10240 		if v_0.Op != OpS390XADD {
   10241 			break
   10242 		}
   10243 		_ = v_0.Args[1]
   10244 		ptr := v_0.Args[0]
   10245 		idx := v_0.Args[1]
   10246 		mem := v.Args[1]
   10247 		if !(ptr.Op != OpSB) {
   10248 			break
   10249 		}
   10250 		v.reset(OpS390XMOVBloadidx)
   10251 		v.AuxInt = off
   10252 		v.Aux = sym
   10253 		v.AddArg(ptr)
   10254 		v.AddArg(idx)
   10255 		v.AddArg(mem)
   10256 		return true
   10257 	}
   10258 	return false
   10259 }
   10260 func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool {
   10261 	// match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   10262 	// cond: is20Bit(c+d)
   10263 	// result: (MOVBloadidx  [c+d] {sym} ptr idx mem)
   10264 	for {
   10265 		c := v.AuxInt
   10266 		sym := v.Aux
   10267 		_ = v.Args[2]
   10268 		v_0 := v.Args[0]
   10269 		if v_0.Op != OpS390XADDconst {
   10270 			break
   10271 		}
   10272 		d := v_0.AuxInt
   10273 		ptr := v_0.Args[0]
   10274 		idx := v.Args[1]
   10275 		mem := v.Args[2]
   10276 		if !(is20Bit(c + d)) {
   10277 			break
   10278 		}
   10279 		v.reset(OpS390XMOVBloadidx)
   10280 		v.AuxInt = c + d
   10281 		v.Aux = sym
   10282 		v.AddArg(ptr)
   10283 		v.AddArg(idx)
   10284 		v.AddArg(mem)
   10285 		return true
   10286 	}
   10287 	// match: (MOVBloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   10288 	// cond: is20Bit(c+d)
   10289 	// result: (MOVBloadidx  [c+d] {sym} ptr idx mem)
   10290 	for {
   10291 		c := v.AuxInt
   10292 		sym := v.Aux
   10293 		_ = v.Args[2]
   10294 		idx := v.Args[0]
   10295 		v_1 := v.Args[1]
   10296 		if v_1.Op != OpS390XADDconst {
   10297 			break
   10298 		}
   10299 		d := v_1.AuxInt
   10300 		ptr := v_1.Args[0]
   10301 		mem := v.Args[2]
   10302 		if !(is20Bit(c + d)) {
   10303 			break
   10304 		}
   10305 		v.reset(OpS390XMOVBloadidx)
   10306 		v.AuxInt = c + d
   10307 		v.Aux = sym
   10308 		v.AddArg(ptr)
   10309 		v.AddArg(idx)
   10310 		v.AddArg(mem)
   10311 		return true
   10312 	}
   10313 	// match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   10314 	// cond: is20Bit(c+d)
   10315 	// result: (MOVBloadidx  [c+d] {sym} ptr idx mem)
   10316 	for {
   10317 		c := v.AuxInt
   10318 		sym := v.Aux
   10319 		_ = v.Args[2]
   10320 		ptr := v.Args[0]
   10321 		v_1 := v.Args[1]
   10322 		if v_1.Op != OpS390XADDconst {
   10323 			break
   10324 		}
   10325 		d := v_1.AuxInt
   10326 		idx := v_1.Args[0]
   10327 		mem := v.Args[2]
   10328 		if !(is20Bit(c + d)) {
   10329 			break
   10330 		}
   10331 		v.reset(OpS390XMOVBloadidx)
   10332 		v.AuxInt = c + d
   10333 		v.Aux = sym
   10334 		v.AddArg(ptr)
   10335 		v.AddArg(idx)
   10336 		v.AddArg(mem)
   10337 		return true
   10338 	}
   10339 	// match: (MOVBloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   10340 	// cond: is20Bit(c+d)
   10341 	// result: (MOVBloadidx  [c+d] {sym} ptr idx mem)
   10342 	for {
   10343 		c := v.AuxInt
   10344 		sym := v.Aux
   10345 		_ = v.Args[2]
   10346 		v_0 := v.Args[0]
   10347 		if v_0.Op != OpS390XADDconst {
   10348 			break
   10349 		}
   10350 		d := v_0.AuxInt
   10351 		idx := v_0.Args[0]
   10352 		ptr := v.Args[1]
   10353 		mem := v.Args[2]
   10354 		if !(is20Bit(c + d)) {
   10355 			break
   10356 		}
   10357 		v.reset(OpS390XMOVBloadidx)
   10358 		v.AuxInt = c + d
   10359 		v.Aux = sym
   10360 		v.AddArg(ptr)
   10361 		v.AddArg(idx)
   10362 		v.AddArg(mem)
   10363 		return true
   10364 	}
   10365 	return false
   10366 }
   10367 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool {
   10368 	b := v.Block
   10369 	_ = b
   10370 	// match: (MOVBreg x:(MOVBload _ _))
   10371 	// cond:
   10372 	// result: (MOVDreg x)
   10373 	for {
   10374 		x := v.Args[0]
   10375 		if x.Op != OpS390XMOVBload {
   10376 			break
   10377 		}
   10378 		_ = x.Args[1]
   10379 		v.reset(OpS390XMOVDreg)
   10380 		v.AddArg(x)
   10381 		return true
   10382 	}
   10383 	// match: (MOVBreg x:(Arg <t>))
   10384 	// cond: is8BitInt(t) && isSigned(t)
   10385 	// result: (MOVDreg x)
   10386 	for {
   10387 		x := v.Args[0]
   10388 		if x.Op != OpArg {
   10389 			break
   10390 		}
   10391 		t := x.Type
   10392 		if !(is8BitInt(t) && isSigned(t)) {
   10393 			break
   10394 		}
   10395 		v.reset(OpS390XMOVDreg)
   10396 		v.AddArg(x)
   10397 		return true
   10398 	}
   10399 	// match: (MOVBreg x:(MOVBreg _))
   10400 	// cond:
   10401 	// result: (MOVDreg x)
   10402 	for {
   10403 		x := v.Args[0]
   10404 		if x.Op != OpS390XMOVBreg {
   10405 			break
   10406 		}
   10407 		v.reset(OpS390XMOVDreg)
   10408 		v.AddArg(x)
   10409 		return true
   10410 	}
   10411 	// match: (MOVBreg (MOVDconst [c]))
   10412 	// cond:
   10413 	// result: (MOVDconst [int64(int8(c))])
   10414 	for {
   10415 		v_0 := v.Args[0]
   10416 		if v_0.Op != OpS390XMOVDconst {
   10417 			break
   10418 		}
   10419 		c := v_0.AuxInt
   10420 		v.reset(OpS390XMOVDconst)
   10421 		v.AuxInt = int64(int8(c))
   10422 		return true
   10423 	}
   10424 	// match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem))
   10425 	// cond: x.Uses == 1 && clobber(x)
   10426 	// result: @x.Block (MOVBload  <v.Type> [off] {sym} ptr mem)
   10427 	for {
   10428 		x := v.Args[0]
   10429 		if x.Op != OpS390XMOVBZload {
   10430 			break
   10431 		}
   10432 		off := x.AuxInt
   10433 		sym := x.Aux
   10434 		_ = x.Args[1]
   10435 		ptr := x.Args[0]
   10436 		mem := x.Args[1]
   10437 		if !(x.Uses == 1 && clobber(x)) {
   10438 			break
   10439 		}
   10440 		b = x.Block
   10441 		v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type)
   10442 		v.reset(OpCopy)
   10443 		v.AddArg(v0)
   10444 		v0.AuxInt = off
   10445 		v0.Aux = sym
   10446 		v0.AddArg(ptr)
   10447 		v0.AddArg(mem)
   10448 		return true
   10449 	}
   10450 	// match: (MOVBreg x:(MOVBload [off] {sym} ptr mem))
   10451 	// cond: x.Uses == 1 && clobber(x)
   10452 	// result: @x.Block (MOVBload  <v.Type> [off] {sym} ptr mem)
   10453 	for {
   10454 		x := v.Args[0]
   10455 		if x.Op != OpS390XMOVBload {
   10456 			break
   10457 		}
   10458 		off := x.AuxInt
   10459 		sym := x.Aux
   10460 		_ = x.Args[1]
   10461 		ptr := x.Args[0]
   10462 		mem := x.Args[1]
   10463 		if !(x.Uses == 1 && clobber(x)) {
   10464 			break
   10465 		}
   10466 		b = x.Block
   10467 		v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type)
   10468 		v.reset(OpCopy)
   10469 		v.AddArg(v0)
   10470 		v0.AuxInt = off
   10471 		v0.Aux = sym
   10472 		v0.AddArg(ptr)
   10473 		v0.AddArg(mem)
   10474 		return true
   10475 	}
   10476 	// match: (MOVBreg x:(MOVBZloadidx [off] {sym} ptr idx mem))
   10477 	// cond: x.Uses == 1 && clobber(x)
   10478 	// result: @x.Block (MOVBloadidx  <v.Type> [off] {sym} ptr idx mem)
   10479 	for {
   10480 		x := v.Args[0]
   10481 		if x.Op != OpS390XMOVBZloadidx {
   10482 			break
   10483 		}
   10484 		off := x.AuxInt
   10485 		sym := x.Aux
   10486 		_ = x.Args[2]
   10487 		ptr := x.Args[0]
   10488 		idx := x.Args[1]
   10489 		mem := x.Args[2]
   10490 		if !(x.Uses == 1 && clobber(x)) {
   10491 			break
   10492 		}
   10493 		b = x.Block
   10494 		v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type)
   10495 		v.reset(OpCopy)
   10496 		v.AddArg(v0)
   10497 		v0.AuxInt = off
   10498 		v0.Aux = sym
   10499 		v0.AddArg(ptr)
   10500 		v0.AddArg(idx)
   10501 		v0.AddArg(mem)
   10502 		return true
   10503 	}
   10504 	// match: (MOVBreg x:(MOVBloadidx [off] {sym} ptr idx mem))
   10505 	// cond: x.Uses == 1 && clobber(x)
   10506 	// result: @x.Block (MOVBloadidx  <v.Type> [off] {sym} ptr idx mem)
   10507 	for {
   10508 		x := v.Args[0]
   10509 		if x.Op != OpS390XMOVBloadidx {
   10510 			break
   10511 		}
   10512 		off := x.AuxInt
   10513 		sym := x.Aux
   10514 		_ = x.Args[2]
   10515 		ptr := x.Args[0]
   10516 		idx := x.Args[1]
   10517 		mem := x.Args[2]
   10518 		if !(x.Uses == 1 && clobber(x)) {
   10519 			break
   10520 		}
   10521 		b = x.Block
   10522 		v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type)
   10523 		v.reset(OpCopy)
   10524 		v.AddArg(v0)
   10525 		v0.AuxInt = off
   10526 		v0.Aux = sym
   10527 		v0.AddArg(ptr)
   10528 		v0.AddArg(idx)
   10529 		v0.AddArg(mem)
   10530 		return true
   10531 	}
   10532 	return false
   10533 }
   10534 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool {
   10535 	// match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem)
   10536 	// cond:
   10537 	// result: (MOVBstore [off] {sym} ptr x mem)
   10538 	for {
   10539 		off := v.AuxInt
   10540 		sym := v.Aux
   10541 		_ = v.Args[2]
   10542 		ptr := v.Args[0]
   10543 		v_1 := v.Args[1]
   10544 		if v_1.Op != OpS390XMOVBreg {
   10545 			break
   10546 		}
   10547 		x := v_1.Args[0]
   10548 		mem := v.Args[2]
   10549 		v.reset(OpS390XMOVBstore)
   10550 		v.AuxInt = off
   10551 		v.Aux = sym
   10552 		v.AddArg(ptr)
   10553 		v.AddArg(x)
   10554 		v.AddArg(mem)
   10555 		return true
   10556 	}
   10557 	// match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem)
   10558 	// cond:
   10559 	// result: (MOVBstore [off] {sym} ptr x mem)
   10560 	for {
   10561 		off := v.AuxInt
   10562 		sym := v.Aux
   10563 		_ = v.Args[2]
   10564 		ptr := v.Args[0]
   10565 		v_1 := v.Args[1]
   10566 		if v_1.Op != OpS390XMOVBZreg {
   10567 			break
   10568 		}
   10569 		x := v_1.Args[0]
   10570 		mem := v.Args[2]
   10571 		v.reset(OpS390XMOVBstore)
   10572 		v.AuxInt = off
   10573 		v.Aux = sym
   10574 		v.AddArg(ptr)
   10575 		v.AddArg(x)
   10576 		v.AddArg(mem)
   10577 		return true
   10578 	}
   10579 	// match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem)
   10580 	// cond: is20Bit(off1+off2)
   10581 	// result: (MOVBstore  [off1+off2] {sym} ptr val mem)
   10582 	for {
   10583 		off1 := v.AuxInt
   10584 		sym := v.Aux
   10585 		_ = v.Args[2]
   10586 		v_0 := v.Args[0]
   10587 		if v_0.Op != OpS390XADDconst {
   10588 			break
   10589 		}
   10590 		off2 := v_0.AuxInt
   10591 		ptr := v_0.Args[0]
   10592 		val := v.Args[1]
   10593 		mem := v.Args[2]
   10594 		if !(is20Bit(off1 + off2)) {
   10595 			break
   10596 		}
   10597 		v.reset(OpS390XMOVBstore)
   10598 		v.AuxInt = off1 + off2
   10599 		v.Aux = sym
   10600 		v.AddArg(ptr)
   10601 		v.AddArg(val)
   10602 		v.AddArg(mem)
   10603 		return true
   10604 	}
   10605 	// match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem)
   10606 	// cond: is20Bit(off) && ptr.Op != OpSB
   10607 	// result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem)
   10608 	for {
   10609 		off := v.AuxInt
   10610 		sym := v.Aux
   10611 		_ = v.Args[2]
   10612 		ptr := v.Args[0]
   10613 		v_1 := v.Args[1]
   10614 		if v_1.Op != OpS390XMOVDconst {
   10615 			break
   10616 		}
   10617 		c := v_1.AuxInt
   10618 		mem := v.Args[2]
   10619 		if !(is20Bit(off) && ptr.Op != OpSB) {
   10620 			break
   10621 		}
   10622 		v.reset(OpS390XMOVBstoreconst)
   10623 		v.AuxInt = makeValAndOff(int64(int8(c)), off)
   10624 		v.Aux = sym
   10625 		v.AddArg(ptr)
   10626 		v.AddArg(mem)
   10627 		return true
   10628 	}
   10629 	// match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem)
   10630 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   10631 	// result: (MOVBstore  [off1+off2] {mergeSym(sym1,sym2)} base val mem)
   10632 	for {
   10633 		off1 := v.AuxInt
   10634 		sym1 := v.Aux
   10635 		_ = v.Args[2]
   10636 		v_0 := v.Args[0]
   10637 		if v_0.Op != OpS390XMOVDaddr {
   10638 			break
   10639 		}
   10640 		off2 := v_0.AuxInt
   10641 		sym2 := v_0.Aux
   10642 		base := v_0.Args[0]
   10643 		val := v.Args[1]
   10644 		mem := v.Args[2]
   10645 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   10646 			break
   10647 		}
   10648 		v.reset(OpS390XMOVBstore)
   10649 		v.AuxInt = off1 + off2
   10650 		v.Aux = mergeSym(sym1, sym2)
   10651 		v.AddArg(base)
   10652 		v.AddArg(val)
   10653 		v.AddArg(mem)
   10654 		return true
   10655 	}
   10656 	// match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
   10657 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   10658 	// result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
   10659 	for {
   10660 		off1 := v.AuxInt
   10661 		sym1 := v.Aux
   10662 		_ = v.Args[2]
   10663 		v_0 := v.Args[0]
   10664 		if v_0.Op != OpS390XMOVDaddridx {
   10665 			break
   10666 		}
   10667 		off2 := v_0.AuxInt
   10668 		sym2 := v_0.Aux
   10669 		_ = v_0.Args[1]
   10670 		ptr := v_0.Args[0]
   10671 		idx := v_0.Args[1]
   10672 		val := v.Args[1]
   10673 		mem := v.Args[2]
   10674 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   10675 			break
   10676 		}
   10677 		v.reset(OpS390XMOVBstoreidx)
   10678 		v.AuxInt = off1 + off2
   10679 		v.Aux = mergeSym(sym1, sym2)
   10680 		v.AddArg(ptr)
   10681 		v.AddArg(idx)
   10682 		v.AddArg(val)
   10683 		v.AddArg(mem)
   10684 		return true
   10685 	}
   10686 	// match: (MOVBstore [off] {sym} (ADD ptr idx) val mem)
   10687 	// cond: ptr.Op != OpSB
   10688 	// result: (MOVBstoreidx  [off] {sym} ptr idx val mem)
   10689 	for {
   10690 		off := v.AuxInt
   10691 		sym := v.Aux
   10692 		_ = v.Args[2]
   10693 		v_0 := v.Args[0]
   10694 		if v_0.Op != OpS390XADD {
   10695 			break
   10696 		}
   10697 		_ = v_0.Args[1]
   10698 		ptr := v_0.Args[0]
   10699 		idx := v_0.Args[1]
   10700 		val := v.Args[1]
   10701 		mem := v.Args[2]
   10702 		if !(ptr.Op != OpSB) {
   10703 			break
   10704 		}
   10705 		v.reset(OpS390XMOVBstoreidx)
   10706 		v.AuxInt = off
   10707 		v.Aux = sym
   10708 		v.AddArg(ptr)
   10709 		v.AddArg(idx)
   10710 		v.AddArg(val)
   10711 		v.AddArg(mem)
   10712 		return true
   10713 	}
   10714 	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem))
   10715 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   10716 	// result: (MOVHstore [i-1] {s} p w mem)
   10717 	for {
   10718 		i := v.AuxInt
   10719 		s := v.Aux
   10720 		_ = v.Args[2]
   10721 		p := v.Args[0]
   10722 		w := v.Args[1]
   10723 		x := v.Args[2]
   10724 		if x.Op != OpS390XMOVBstore {
   10725 			break
   10726 		}
   10727 		if x.AuxInt != i-1 {
   10728 			break
   10729 		}
   10730 		if x.Aux != s {
   10731 			break
   10732 		}
   10733 		_ = x.Args[2]
   10734 		if p != x.Args[0] {
   10735 			break
   10736 		}
   10737 		x_1 := x.Args[1]
   10738 		if x_1.Op != OpS390XSRDconst {
   10739 			break
   10740 		}
   10741 		if x_1.AuxInt != 8 {
   10742 			break
   10743 		}
   10744 		if w != x_1.Args[0] {
   10745 			break
   10746 		}
   10747 		mem := x.Args[2]
   10748 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   10749 			break
   10750 		}
   10751 		v.reset(OpS390XMOVHstore)
   10752 		v.AuxInt = i - 1
   10753 		v.Aux = s
   10754 		v.AddArg(p)
   10755 		v.AddArg(w)
   10756 		v.AddArg(mem)
   10757 		return true
   10758 	}
   10759 	// match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem))
   10760 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   10761 	// result: (MOVHstore [i-1] {s} p w0 mem)
   10762 	for {
   10763 		i := v.AuxInt
   10764 		s := v.Aux
   10765 		_ = v.Args[2]
   10766 		p := v.Args[0]
   10767 		w0 := v.Args[1]
   10768 		if w0.Op != OpS390XSRDconst {
   10769 			break
   10770 		}
   10771 		j := w0.AuxInt
   10772 		w := w0.Args[0]
   10773 		x := v.Args[2]
   10774 		if x.Op != OpS390XMOVBstore {
   10775 			break
   10776 		}
   10777 		if x.AuxInt != i-1 {
   10778 			break
   10779 		}
   10780 		if x.Aux != s {
   10781 			break
   10782 		}
   10783 		_ = x.Args[2]
   10784 		if p != x.Args[0] {
   10785 			break
   10786 		}
   10787 		x_1 := x.Args[1]
   10788 		if x_1.Op != OpS390XSRDconst {
   10789 			break
   10790 		}
   10791 		if x_1.AuxInt != j+8 {
   10792 			break
   10793 		}
   10794 		if w != x_1.Args[0] {
   10795 			break
   10796 		}
   10797 		mem := x.Args[2]
   10798 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   10799 			break
   10800 		}
   10801 		v.reset(OpS390XMOVHstore)
   10802 		v.AuxInt = i - 1
   10803 		v.Aux = s
   10804 		v.AddArg(p)
   10805 		v.AddArg(w0)
   10806 		v.AddArg(mem)
   10807 		return true
   10808 	}
   10809 	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem))
   10810 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   10811 	// result: (MOVHstore [i-1] {s} p w mem)
   10812 	for {
   10813 		i := v.AuxInt
   10814 		s := v.Aux
   10815 		_ = v.Args[2]
   10816 		p := v.Args[0]
   10817 		w := v.Args[1]
   10818 		x := v.Args[2]
   10819 		if x.Op != OpS390XMOVBstore {
   10820 			break
   10821 		}
   10822 		if x.AuxInt != i-1 {
   10823 			break
   10824 		}
   10825 		if x.Aux != s {
   10826 			break
   10827 		}
   10828 		_ = x.Args[2]
   10829 		if p != x.Args[0] {
   10830 			break
   10831 		}
   10832 		x_1 := x.Args[1]
   10833 		if x_1.Op != OpS390XSRWconst {
   10834 			break
   10835 		}
   10836 		if x_1.AuxInt != 8 {
   10837 			break
   10838 		}
   10839 		if w != x_1.Args[0] {
   10840 			break
   10841 		}
   10842 		mem := x.Args[2]
   10843 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   10844 			break
   10845 		}
   10846 		v.reset(OpS390XMOVHstore)
   10847 		v.AuxInt = i - 1
   10848 		v.Aux = s
   10849 		v.AddArg(p)
   10850 		v.AddArg(w)
   10851 		v.AddArg(mem)
   10852 		return true
   10853 	}
   10854 	return false
   10855 }
   10856 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool {
   10857 	// match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem))
   10858 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   10859 	// result: (MOVHstore [i-1] {s} p w0 mem)
   10860 	for {
   10861 		i := v.AuxInt
   10862 		s := v.Aux
   10863 		_ = v.Args[2]
   10864 		p := v.Args[0]
   10865 		w0 := v.Args[1]
   10866 		if w0.Op != OpS390XSRWconst {
   10867 			break
   10868 		}
   10869 		j := w0.AuxInt
   10870 		w := w0.Args[0]
   10871 		x := v.Args[2]
   10872 		if x.Op != OpS390XMOVBstore {
   10873 			break
   10874 		}
   10875 		if x.AuxInt != i-1 {
   10876 			break
   10877 		}
   10878 		if x.Aux != s {
   10879 			break
   10880 		}
   10881 		_ = x.Args[2]
   10882 		if p != x.Args[0] {
   10883 			break
   10884 		}
   10885 		x_1 := x.Args[1]
   10886 		if x_1.Op != OpS390XSRWconst {
   10887 			break
   10888 		}
   10889 		if x_1.AuxInt != j+8 {
   10890 			break
   10891 		}
   10892 		if w != x_1.Args[0] {
   10893 			break
   10894 		}
   10895 		mem := x.Args[2]
   10896 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   10897 			break
   10898 		}
   10899 		v.reset(OpS390XMOVHstore)
   10900 		v.AuxInt = i - 1
   10901 		v.Aux = s
   10902 		v.AddArg(p)
   10903 		v.AddArg(w0)
   10904 		v.AddArg(mem)
   10905 		return true
   10906 	}
   10907 	// match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
   10908 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   10909 	// result: (MOVHBRstore [i-1] {s} p w mem)
   10910 	for {
   10911 		i := v.AuxInt
   10912 		s := v.Aux
   10913 		_ = v.Args[2]
   10914 		p := v.Args[0]
   10915 		v_1 := v.Args[1]
   10916 		if v_1.Op != OpS390XSRDconst {
   10917 			break
   10918 		}
   10919 		if v_1.AuxInt != 8 {
   10920 			break
   10921 		}
   10922 		w := v_1.Args[0]
   10923 		x := v.Args[2]
   10924 		if x.Op != OpS390XMOVBstore {
   10925 			break
   10926 		}
   10927 		if x.AuxInt != i-1 {
   10928 			break
   10929 		}
   10930 		if x.Aux != s {
   10931 			break
   10932 		}
   10933 		_ = x.Args[2]
   10934 		if p != x.Args[0] {
   10935 			break
   10936 		}
   10937 		if w != x.Args[1] {
   10938 			break
   10939 		}
   10940 		mem := x.Args[2]
   10941 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   10942 			break
   10943 		}
   10944 		v.reset(OpS390XMOVHBRstore)
   10945 		v.AuxInt = i - 1
   10946 		v.Aux = s
   10947 		v.AddArg(p)
   10948 		v.AddArg(w)
   10949 		v.AddArg(mem)
   10950 		return true
   10951 	}
   10952 	// match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem))
   10953 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   10954 	// result: (MOVHBRstore [i-1] {s} p w0 mem)
   10955 	for {
   10956 		i := v.AuxInt
   10957 		s := v.Aux
   10958 		_ = v.Args[2]
   10959 		p := v.Args[0]
   10960 		v_1 := v.Args[1]
   10961 		if v_1.Op != OpS390XSRDconst {
   10962 			break
   10963 		}
   10964 		j := v_1.AuxInt
   10965 		w := v_1.Args[0]
   10966 		x := v.Args[2]
   10967 		if x.Op != OpS390XMOVBstore {
   10968 			break
   10969 		}
   10970 		if x.AuxInt != i-1 {
   10971 			break
   10972 		}
   10973 		if x.Aux != s {
   10974 			break
   10975 		}
   10976 		_ = x.Args[2]
   10977 		if p != x.Args[0] {
   10978 			break
   10979 		}
   10980 		w0 := x.Args[1]
   10981 		if w0.Op != OpS390XSRDconst {
   10982 			break
   10983 		}
   10984 		if w0.AuxInt != j-8 {
   10985 			break
   10986 		}
   10987 		if w != w0.Args[0] {
   10988 			break
   10989 		}
   10990 		mem := x.Args[2]
   10991 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   10992 			break
   10993 		}
   10994 		v.reset(OpS390XMOVHBRstore)
   10995 		v.AuxInt = i - 1
   10996 		v.Aux = s
   10997 		v.AddArg(p)
   10998 		v.AddArg(w0)
   10999 		v.AddArg(mem)
   11000 		return true
   11001 	}
   11002 	// match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
   11003 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   11004 	// result: (MOVHBRstore [i-1] {s} p w mem)
   11005 	for {
   11006 		i := v.AuxInt
   11007 		s := v.Aux
   11008 		_ = v.Args[2]
   11009 		p := v.Args[0]
   11010 		v_1 := v.Args[1]
   11011 		if v_1.Op != OpS390XSRWconst {
   11012 			break
   11013 		}
   11014 		if v_1.AuxInt != 8 {
   11015 			break
   11016 		}
   11017 		w := v_1.Args[0]
   11018 		x := v.Args[2]
   11019 		if x.Op != OpS390XMOVBstore {
   11020 			break
   11021 		}
   11022 		if x.AuxInt != i-1 {
   11023 			break
   11024 		}
   11025 		if x.Aux != s {
   11026 			break
   11027 		}
   11028 		_ = x.Args[2]
   11029 		if p != x.Args[0] {
   11030 			break
   11031 		}
   11032 		if w != x.Args[1] {
   11033 			break
   11034 		}
   11035 		mem := x.Args[2]
   11036 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   11037 			break
   11038 		}
   11039 		v.reset(OpS390XMOVHBRstore)
   11040 		v.AuxInt = i - 1
   11041 		v.Aux = s
   11042 		v.AddArg(p)
   11043 		v.AddArg(w)
   11044 		v.AddArg(mem)
   11045 		return true
   11046 	}
   11047 	// match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem))
   11048 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   11049 	// result: (MOVHBRstore [i-1] {s} p w0 mem)
   11050 	for {
   11051 		i := v.AuxInt
   11052 		s := v.Aux
   11053 		_ = v.Args[2]
   11054 		p := v.Args[0]
   11055 		v_1 := v.Args[1]
   11056 		if v_1.Op != OpS390XSRWconst {
   11057 			break
   11058 		}
   11059 		j := v_1.AuxInt
   11060 		w := v_1.Args[0]
   11061 		x := v.Args[2]
   11062 		if x.Op != OpS390XMOVBstore {
   11063 			break
   11064 		}
   11065 		if x.AuxInt != i-1 {
   11066 			break
   11067 		}
   11068 		if x.Aux != s {
   11069 			break
   11070 		}
   11071 		_ = x.Args[2]
   11072 		if p != x.Args[0] {
   11073 			break
   11074 		}
   11075 		w0 := x.Args[1]
   11076 		if w0.Op != OpS390XSRWconst {
   11077 			break
   11078 		}
   11079 		if w0.AuxInt != j-8 {
   11080 			break
   11081 		}
   11082 		if w != w0.Args[0] {
   11083 			break
   11084 		}
   11085 		mem := x.Args[2]
   11086 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   11087 			break
   11088 		}
   11089 		v.reset(OpS390XMOVHBRstore)
   11090 		v.AuxInt = i - 1
   11091 		v.Aux = s
   11092 		v.AddArg(p)
   11093 		v.AddArg(w0)
   11094 		v.AddArg(mem)
   11095 		return true
   11096 	}
   11097 	return false
   11098 }
   11099 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool {
   11100 	// match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem)
   11101 	// cond: is20Bit(ValAndOff(sc).Off()+off)
   11102 	// result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem)
   11103 	for {
   11104 		sc := v.AuxInt
   11105 		s := v.Aux
   11106 		_ = v.Args[1]
   11107 		v_0 := v.Args[0]
   11108 		if v_0.Op != OpS390XADDconst {
   11109 			break
   11110 		}
   11111 		off := v_0.AuxInt
   11112 		ptr := v_0.Args[0]
   11113 		mem := v.Args[1]
   11114 		if !(is20Bit(ValAndOff(sc).Off() + off)) {
   11115 			break
   11116 		}
   11117 		v.reset(OpS390XMOVBstoreconst)
   11118 		v.AuxInt = ValAndOff(sc).add(off)
   11119 		v.Aux = s
   11120 		v.AddArg(ptr)
   11121 		v.AddArg(mem)
   11122 		return true
   11123 	}
   11124 	// match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem)
   11125 	// cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)
   11126 	// result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem)
   11127 	for {
   11128 		sc := v.AuxInt
   11129 		sym1 := v.Aux
   11130 		_ = v.Args[1]
   11131 		v_0 := v.Args[0]
   11132 		if v_0.Op != OpS390XMOVDaddr {
   11133 			break
   11134 		}
   11135 		off := v_0.AuxInt
   11136 		sym2 := v_0.Aux
   11137 		ptr := v_0.Args[0]
   11138 		mem := v.Args[1]
   11139 		if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) {
   11140 			break
   11141 		}
   11142 		v.reset(OpS390XMOVBstoreconst)
   11143 		v.AuxInt = ValAndOff(sc).add(off)
   11144 		v.Aux = mergeSym(sym1, sym2)
   11145 		v.AddArg(ptr)
   11146 		v.AddArg(mem)
   11147 		return true
   11148 	}
   11149 	// match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem))
   11150 	// cond: p.Op != OpSB   && x.Uses == 1   && ValAndOff(a).Off() + 1 == ValAndOff(c).Off()   && clobber(x)
   11151 	// result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem)
   11152 	for {
   11153 		c := v.AuxInt
   11154 		s := v.Aux
   11155 		_ = v.Args[1]
   11156 		p := v.Args[0]
   11157 		x := v.Args[1]
   11158 		if x.Op != OpS390XMOVBstoreconst {
   11159 			break
   11160 		}
   11161 		a := x.AuxInt
   11162 		if x.Aux != s {
   11163 			break
   11164 		}
   11165 		_ = x.Args[1]
   11166 		if p != x.Args[0] {
   11167 			break
   11168 		}
   11169 		mem := x.Args[1]
   11170 		if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) {
   11171 			break
   11172 		}
   11173 		v.reset(OpS390XMOVHstoreconst)
   11174 		v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off())
   11175 		v.Aux = s
   11176 		v.AddArg(p)
   11177 		v.AddArg(mem)
   11178 		return true
   11179 	}
   11180 	return false
   11181 }
   11182 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool {
   11183 	// match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
   11184 	// cond: is20Bit(c+d)
   11185 	// result: (MOVBstoreidx  [c+d] {sym} ptr idx val mem)
   11186 	for {
   11187 		c := v.AuxInt
   11188 		sym := v.Aux
   11189 		_ = v.Args[3]
   11190 		v_0 := v.Args[0]
   11191 		if v_0.Op != OpS390XADDconst {
   11192 			break
   11193 		}
   11194 		d := v_0.AuxInt
   11195 		ptr := v_0.Args[0]
   11196 		idx := v.Args[1]
   11197 		val := v.Args[2]
   11198 		mem := v.Args[3]
   11199 		if !(is20Bit(c + d)) {
   11200 			break
   11201 		}
   11202 		v.reset(OpS390XMOVBstoreidx)
   11203 		v.AuxInt = c + d
   11204 		v.Aux = sym
   11205 		v.AddArg(ptr)
   11206 		v.AddArg(idx)
   11207 		v.AddArg(val)
   11208 		v.AddArg(mem)
   11209 		return true
   11210 	}
   11211 	// match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem)
   11212 	// cond: is20Bit(c+d)
   11213 	// result: (MOVBstoreidx  [c+d] {sym} ptr idx val mem)
   11214 	for {
   11215 		c := v.AuxInt
   11216 		sym := v.Aux
   11217 		_ = v.Args[3]
   11218 		idx := v.Args[0]
   11219 		v_1 := v.Args[1]
   11220 		if v_1.Op != OpS390XADDconst {
   11221 			break
   11222 		}
   11223 		d := v_1.AuxInt
   11224 		ptr := v_1.Args[0]
   11225 		val := v.Args[2]
   11226 		mem := v.Args[3]
   11227 		if !(is20Bit(c + d)) {
   11228 			break
   11229 		}
   11230 		v.reset(OpS390XMOVBstoreidx)
   11231 		v.AuxInt = c + d
   11232 		v.Aux = sym
   11233 		v.AddArg(ptr)
   11234 		v.AddArg(idx)
   11235 		v.AddArg(val)
   11236 		v.AddArg(mem)
   11237 		return true
   11238 	}
   11239 	// match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
   11240 	// cond: is20Bit(c+d)
   11241 	// result: (MOVBstoreidx  [c+d] {sym} ptr idx val mem)
   11242 	for {
   11243 		c := v.AuxInt
   11244 		sym := v.Aux
   11245 		_ = v.Args[3]
   11246 		ptr := v.Args[0]
   11247 		v_1 := v.Args[1]
   11248 		if v_1.Op != OpS390XADDconst {
   11249 			break
   11250 		}
   11251 		d := v_1.AuxInt
   11252 		idx := v_1.Args[0]
   11253 		val := v.Args[2]
   11254 		mem := v.Args[3]
   11255 		if !(is20Bit(c + d)) {
   11256 			break
   11257 		}
   11258 		v.reset(OpS390XMOVBstoreidx)
   11259 		v.AuxInt = c + d
   11260 		v.Aux = sym
   11261 		v.AddArg(ptr)
   11262 		v.AddArg(idx)
   11263 		v.AddArg(val)
   11264 		v.AddArg(mem)
   11265 		return true
   11266 	}
   11267 	// match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem)
   11268 	// cond: is20Bit(c+d)
   11269 	// result: (MOVBstoreidx  [c+d] {sym} ptr idx val mem)
   11270 	for {
   11271 		c := v.AuxInt
   11272 		sym := v.Aux
   11273 		_ = v.Args[3]
   11274 		v_0 := v.Args[0]
   11275 		if v_0.Op != OpS390XADDconst {
   11276 			break
   11277 		}
   11278 		d := v_0.AuxInt
   11279 		idx := v_0.Args[0]
   11280 		ptr := v.Args[1]
   11281 		val := v.Args[2]
   11282 		mem := v.Args[3]
   11283 		if !(is20Bit(c + d)) {
   11284 			break
   11285 		}
   11286 		v.reset(OpS390XMOVBstoreidx)
   11287 		v.AuxInt = c + d
   11288 		v.Aux = sym
   11289 		v.AddArg(ptr)
   11290 		v.AddArg(idx)
   11291 		v.AddArg(val)
   11292 		v.AddArg(mem)
   11293 		return true
   11294 	}
   11295 	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem))
   11296 	// cond: x.Uses == 1   && clobber(x)
   11297 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11298 	for {
   11299 		i := v.AuxInt
   11300 		s := v.Aux
   11301 		_ = v.Args[3]
   11302 		p := v.Args[0]
   11303 		idx := v.Args[1]
   11304 		w := v.Args[2]
   11305 		x := v.Args[3]
   11306 		if x.Op != OpS390XMOVBstoreidx {
   11307 			break
   11308 		}
   11309 		if x.AuxInt != i-1 {
   11310 			break
   11311 		}
   11312 		if x.Aux != s {
   11313 			break
   11314 		}
   11315 		_ = x.Args[3]
   11316 		if p != x.Args[0] {
   11317 			break
   11318 		}
   11319 		if idx != x.Args[1] {
   11320 			break
   11321 		}
   11322 		x_2 := x.Args[2]
   11323 		if x_2.Op != OpS390XSRDconst {
   11324 			break
   11325 		}
   11326 		if x_2.AuxInt != 8 {
   11327 			break
   11328 		}
   11329 		if w != x_2.Args[0] {
   11330 			break
   11331 		}
   11332 		mem := x.Args[3]
   11333 		if !(x.Uses == 1 && clobber(x)) {
   11334 			break
   11335 		}
   11336 		v.reset(OpS390XMOVHstoreidx)
   11337 		v.AuxInt = i - 1
   11338 		v.Aux = s
   11339 		v.AddArg(p)
   11340 		v.AddArg(idx)
   11341 		v.AddArg(w)
   11342 		v.AddArg(mem)
   11343 		return true
   11344 	}
   11345 	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem))
   11346 	// cond: x.Uses == 1   && clobber(x)
   11347 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11348 	for {
   11349 		i := v.AuxInt
   11350 		s := v.Aux
   11351 		_ = v.Args[3]
   11352 		p := v.Args[0]
   11353 		idx := v.Args[1]
   11354 		w := v.Args[2]
   11355 		x := v.Args[3]
   11356 		if x.Op != OpS390XMOVBstoreidx {
   11357 			break
   11358 		}
   11359 		if x.AuxInt != i-1 {
   11360 			break
   11361 		}
   11362 		if x.Aux != s {
   11363 			break
   11364 		}
   11365 		_ = x.Args[3]
   11366 		if idx != x.Args[0] {
   11367 			break
   11368 		}
   11369 		if p != x.Args[1] {
   11370 			break
   11371 		}
   11372 		x_2 := x.Args[2]
   11373 		if x_2.Op != OpS390XSRDconst {
   11374 			break
   11375 		}
   11376 		if x_2.AuxInt != 8 {
   11377 			break
   11378 		}
   11379 		if w != x_2.Args[0] {
   11380 			break
   11381 		}
   11382 		mem := x.Args[3]
   11383 		if !(x.Uses == 1 && clobber(x)) {
   11384 			break
   11385 		}
   11386 		v.reset(OpS390XMOVHstoreidx)
   11387 		v.AuxInt = i - 1
   11388 		v.Aux = s
   11389 		v.AddArg(p)
   11390 		v.AddArg(idx)
   11391 		v.AddArg(w)
   11392 		v.AddArg(mem)
   11393 		return true
   11394 	}
   11395 	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem))
   11396 	// cond: x.Uses == 1   && clobber(x)
   11397 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11398 	for {
   11399 		i := v.AuxInt
   11400 		s := v.Aux
   11401 		_ = v.Args[3]
   11402 		idx := v.Args[0]
   11403 		p := v.Args[1]
   11404 		w := v.Args[2]
   11405 		x := v.Args[3]
   11406 		if x.Op != OpS390XMOVBstoreidx {
   11407 			break
   11408 		}
   11409 		if x.AuxInt != i-1 {
   11410 			break
   11411 		}
   11412 		if x.Aux != s {
   11413 			break
   11414 		}
   11415 		_ = x.Args[3]
   11416 		if p != x.Args[0] {
   11417 			break
   11418 		}
   11419 		if idx != x.Args[1] {
   11420 			break
   11421 		}
   11422 		x_2 := x.Args[2]
   11423 		if x_2.Op != OpS390XSRDconst {
   11424 			break
   11425 		}
   11426 		if x_2.AuxInt != 8 {
   11427 			break
   11428 		}
   11429 		if w != x_2.Args[0] {
   11430 			break
   11431 		}
   11432 		mem := x.Args[3]
   11433 		if !(x.Uses == 1 && clobber(x)) {
   11434 			break
   11435 		}
   11436 		v.reset(OpS390XMOVHstoreidx)
   11437 		v.AuxInt = i - 1
   11438 		v.Aux = s
   11439 		v.AddArg(p)
   11440 		v.AddArg(idx)
   11441 		v.AddArg(w)
   11442 		v.AddArg(mem)
   11443 		return true
   11444 	}
   11445 	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem))
   11446 	// cond: x.Uses == 1   && clobber(x)
   11447 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11448 	for {
   11449 		i := v.AuxInt
   11450 		s := v.Aux
   11451 		_ = v.Args[3]
   11452 		idx := v.Args[0]
   11453 		p := v.Args[1]
   11454 		w := v.Args[2]
   11455 		x := v.Args[3]
   11456 		if x.Op != OpS390XMOVBstoreidx {
   11457 			break
   11458 		}
   11459 		if x.AuxInt != i-1 {
   11460 			break
   11461 		}
   11462 		if x.Aux != s {
   11463 			break
   11464 		}
   11465 		_ = x.Args[3]
   11466 		if idx != x.Args[0] {
   11467 			break
   11468 		}
   11469 		if p != x.Args[1] {
   11470 			break
   11471 		}
   11472 		x_2 := x.Args[2]
   11473 		if x_2.Op != OpS390XSRDconst {
   11474 			break
   11475 		}
   11476 		if x_2.AuxInt != 8 {
   11477 			break
   11478 		}
   11479 		if w != x_2.Args[0] {
   11480 			break
   11481 		}
   11482 		mem := x.Args[3]
   11483 		if !(x.Uses == 1 && clobber(x)) {
   11484 			break
   11485 		}
   11486 		v.reset(OpS390XMOVHstoreidx)
   11487 		v.AuxInt = i - 1
   11488 		v.Aux = s
   11489 		v.AddArg(p)
   11490 		v.AddArg(idx)
   11491 		v.AddArg(w)
   11492 		v.AddArg(mem)
   11493 		return true
   11494 	}
   11495 	// match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem))
   11496 	// cond: x.Uses == 1   && clobber(x)
   11497 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   11498 	for {
   11499 		i := v.AuxInt
   11500 		s := v.Aux
   11501 		_ = v.Args[3]
   11502 		p := v.Args[0]
   11503 		idx := v.Args[1]
   11504 		w0 := v.Args[2]
   11505 		if w0.Op != OpS390XSRDconst {
   11506 			break
   11507 		}
   11508 		j := w0.AuxInt
   11509 		w := w0.Args[0]
   11510 		x := v.Args[3]
   11511 		if x.Op != OpS390XMOVBstoreidx {
   11512 			break
   11513 		}
   11514 		if x.AuxInt != i-1 {
   11515 			break
   11516 		}
   11517 		if x.Aux != s {
   11518 			break
   11519 		}
   11520 		_ = x.Args[3]
   11521 		if p != x.Args[0] {
   11522 			break
   11523 		}
   11524 		if idx != x.Args[1] {
   11525 			break
   11526 		}
   11527 		x_2 := x.Args[2]
   11528 		if x_2.Op != OpS390XSRDconst {
   11529 			break
   11530 		}
   11531 		if x_2.AuxInt != j+8 {
   11532 			break
   11533 		}
   11534 		if w != x_2.Args[0] {
   11535 			break
   11536 		}
   11537 		mem := x.Args[3]
   11538 		if !(x.Uses == 1 && clobber(x)) {
   11539 			break
   11540 		}
   11541 		v.reset(OpS390XMOVHstoreidx)
   11542 		v.AuxInt = i - 1
   11543 		v.Aux = s
   11544 		v.AddArg(p)
   11545 		v.AddArg(idx)
   11546 		v.AddArg(w0)
   11547 		v.AddArg(mem)
   11548 		return true
   11549 	}
   11550 	// match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem))
   11551 	// cond: x.Uses == 1   && clobber(x)
   11552 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   11553 	for {
   11554 		i := v.AuxInt
   11555 		s := v.Aux
   11556 		_ = v.Args[3]
   11557 		p := v.Args[0]
   11558 		idx := v.Args[1]
   11559 		w0 := v.Args[2]
   11560 		if w0.Op != OpS390XSRDconst {
   11561 			break
   11562 		}
   11563 		j := w0.AuxInt
   11564 		w := w0.Args[0]
   11565 		x := v.Args[3]
   11566 		if x.Op != OpS390XMOVBstoreidx {
   11567 			break
   11568 		}
   11569 		if x.AuxInt != i-1 {
   11570 			break
   11571 		}
   11572 		if x.Aux != s {
   11573 			break
   11574 		}
   11575 		_ = x.Args[3]
   11576 		if idx != x.Args[0] {
   11577 			break
   11578 		}
   11579 		if p != x.Args[1] {
   11580 			break
   11581 		}
   11582 		x_2 := x.Args[2]
   11583 		if x_2.Op != OpS390XSRDconst {
   11584 			break
   11585 		}
   11586 		if x_2.AuxInt != j+8 {
   11587 			break
   11588 		}
   11589 		if w != x_2.Args[0] {
   11590 			break
   11591 		}
   11592 		mem := x.Args[3]
   11593 		if !(x.Uses == 1 && clobber(x)) {
   11594 			break
   11595 		}
   11596 		v.reset(OpS390XMOVHstoreidx)
   11597 		v.AuxInt = i - 1
   11598 		v.Aux = s
   11599 		v.AddArg(p)
   11600 		v.AddArg(idx)
   11601 		v.AddArg(w0)
   11602 		v.AddArg(mem)
   11603 		return true
   11604 	}
   11605 	return false
   11606 }
   11607 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool {
   11608 	// match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem))
   11609 	// cond: x.Uses == 1   && clobber(x)
   11610 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   11611 	for {
   11612 		i := v.AuxInt
   11613 		s := v.Aux
   11614 		_ = v.Args[3]
   11615 		idx := v.Args[0]
   11616 		p := v.Args[1]
   11617 		w0 := v.Args[2]
   11618 		if w0.Op != OpS390XSRDconst {
   11619 			break
   11620 		}
   11621 		j := w0.AuxInt
   11622 		w := w0.Args[0]
   11623 		x := v.Args[3]
   11624 		if x.Op != OpS390XMOVBstoreidx {
   11625 			break
   11626 		}
   11627 		if x.AuxInt != i-1 {
   11628 			break
   11629 		}
   11630 		if x.Aux != s {
   11631 			break
   11632 		}
   11633 		_ = x.Args[3]
   11634 		if p != x.Args[0] {
   11635 			break
   11636 		}
   11637 		if idx != x.Args[1] {
   11638 			break
   11639 		}
   11640 		x_2 := x.Args[2]
   11641 		if x_2.Op != OpS390XSRDconst {
   11642 			break
   11643 		}
   11644 		if x_2.AuxInt != j+8 {
   11645 			break
   11646 		}
   11647 		if w != x_2.Args[0] {
   11648 			break
   11649 		}
   11650 		mem := x.Args[3]
   11651 		if !(x.Uses == 1 && clobber(x)) {
   11652 			break
   11653 		}
   11654 		v.reset(OpS390XMOVHstoreidx)
   11655 		v.AuxInt = i - 1
   11656 		v.Aux = s
   11657 		v.AddArg(p)
   11658 		v.AddArg(idx)
   11659 		v.AddArg(w0)
   11660 		v.AddArg(mem)
   11661 		return true
   11662 	}
   11663 	// match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem))
   11664 	// cond: x.Uses == 1   && clobber(x)
   11665 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   11666 	for {
   11667 		i := v.AuxInt
   11668 		s := v.Aux
   11669 		_ = v.Args[3]
   11670 		idx := v.Args[0]
   11671 		p := v.Args[1]
   11672 		w0 := v.Args[2]
   11673 		if w0.Op != OpS390XSRDconst {
   11674 			break
   11675 		}
   11676 		j := w0.AuxInt
   11677 		w := w0.Args[0]
   11678 		x := v.Args[3]
   11679 		if x.Op != OpS390XMOVBstoreidx {
   11680 			break
   11681 		}
   11682 		if x.AuxInt != i-1 {
   11683 			break
   11684 		}
   11685 		if x.Aux != s {
   11686 			break
   11687 		}
   11688 		_ = x.Args[3]
   11689 		if idx != x.Args[0] {
   11690 			break
   11691 		}
   11692 		if p != x.Args[1] {
   11693 			break
   11694 		}
   11695 		x_2 := x.Args[2]
   11696 		if x_2.Op != OpS390XSRDconst {
   11697 			break
   11698 		}
   11699 		if x_2.AuxInt != j+8 {
   11700 			break
   11701 		}
   11702 		if w != x_2.Args[0] {
   11703 			break
   11704 		}
   11705 		mem := x.Args[3]
   11706 		if !(x.Uses == 1 && clobber(x)) {
   11707 			break
   11708 		}
   11709 		v.reset(OpS390XMOVHstoreidx)
   11710 		v.AuxInt = i - 1
   11711 		v.Aux = s
   11712 		v.AddArg(p)
   11713 		v.AddArg(idx)
   11714 		v.AddArg(w0)
   11715 		v.AddArg(mem)
   11716 		return true
   11717 	}
   11718 	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem))
   11719 	// cond: x.Uses == 1   && clobber(x)
   11720 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11721 	for {
   11722 		i := v.AuxInt
   11723 		s := v.Aux
   11724 		_ = v.Args[3]
   11725 		p := v.Args[0]
   11726 		idx := v.Args[1]
   11727 		w := v.Args[2]
   11728 		x := v.Args[3]
   11729 		if x.Op != OpS390XMOVBstoreidx {
   11730 			break
   11731 		}
   11732 		if x.AuxInt != i-1 {
   11733 			break
   11734 		}
   11735 		if x.Aux != s {
   11736 			break
   11737 		}
   11738 		_ = x.Args[3]
   11739 		if p != x.Args[0] {
   11740 			break
   11741 		}
   11742 		if idx != x.Args[1] {
   11743 			break
   11744 		}
   11745 		x_2 := x.Args[2]
   11746 		if x_2.Op != OpS390XSRWconst {
   11747 			break
   11748 		}
   11749 		if x_2.AuxInt != 8 {
   11750 			break
   11751 		}
   11752 		if w != x_2.Args[0] {
   11753 			break
   11754 		}
   11755 		mem := x.Args[3]
   11756 		if !(x.Uses == 1 && clobber(x)) {
   11757 			break
   11758 		}
   11759 		v.reset(OpS390XMOVHstoreidx)
   11760 		v.AuxInt = i - 1
   11761 		v.Aux = s
   11762 		v.AddArg(p)
   11763 		v.AddArg(idx)
   11764 		v.AddArg(w)
   11765 		v.AddArg(mem)
   11766 		return true
   11767 	}
   11768 	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem))
   11769 	// cond: x.Uses == 1   && clobber(x)
   11770 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11771 	for {
   11772 		i := v.AuxInt
   11773 		s := v.Aux
   11774 		_ = v.Args[3]
   11775 		p := v.Args[0]
   11776 		idx := v.Args[1]
   11777 		w := v.Args[2]
   11778 		x := v.Args[3]
   11779 		if x.Op != OpS390XMOVBstoreidx {
   11780 			break
   11781 		}
   11782 		if x.AuxInt != i-1 {
   11783 			break
   11784 		}
   11785 		if x.Aux != s {
   11786 			break
   11787 		}
   11788 		_ = x.Args[3]
   11789 		if idx != x.Args[0] {
   11790 			break
   11791 		}
   11792 		if p != x.Args[1] {
   11793 			break
   11794 		}
   11795 		x_2 := x.Args[2]
   11796 		if x_2.Op != OpS390XSRWconst {
   11797 			break
   11798 		}
   11799 		if x_2.AuxInt != 8 {
   11800 			break
   11801 		}
   11802 		if w != x_2.Args[0] {
   11803 			break
   11804 		}
   11805 		mem := x.Args[3]
   11806 		if !(x.Uses == 1 && clobber(x)) {
   11807 			break
   11808 		}
   11809 		v.reset(OpS390XMOVHstoreidx)
   11810 		v.AuxInt = i - 1
   11811 		v.Aux = s
   11812 		v.AddArg(p)
   11813 		v.AddArg(idx)
   11814 		v.AddArg(w)
   11815 		v.AddArg(mem)
   11816 		return true
   11817 	}
   11818 	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem))
   11819 	// cond: x.Uses == 1   && clobber(x)
   11820 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11821 	for {
   11822 		i := v.AuxInt
   11823 		s := v.Aux
   11824 		_ = v.Args[3]
   11825 		idx := v.Args[0]
   11826 		p := v.Args[1]
   11827 		w := v.Args[2]
   11828 		x := v.Args[3]
   11829 		if x.Op != OpS390XMOVBstoreidx {
   11830 			break
   11831 		}
   11832 		if x.AuxInt != i-1 {
   11833 			break
   11834 		}
   11835 		if x.Aux != s {
   11836 			break
   11837 		}
   11838 		_ = x.Args[3]
   11839 		if p != x.Args[0] {
   11840 			break
   11841 		}
   11842 		if idx != x.Args[1] {
   11843 			break
   11844 		}
   11845 		x_2 := x.Args[2]
   11846 		if x_2.Op != OpS390XSRWconst {
   11847 			break
   11848 		}
   11849 		if x_2.AuxInt != 8 {
   11850 			break
   11851 		}
   11852 		if w != x_2.Args[0] {
   11853 			break
   11854 		}
   11855 		mem := x.Args[3]
   11856 		if !(x.Uses == 1 && clobber(x)) {
   11857 			break
   11858 		}
   11859 		v.reset(OpS390XMOVHstoreidx)
   11860 		v.AuxInt = i - 1
   11861 		v.Aux = s
   11862 		v.AddArg(p)
   11863 		v.AddArg(idx)
   11864 		v.AddArg(w)
   11865 		v.AddArg(mem)
   11866 		return true
   11867 	}
   11868 	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem))
   11869 	// cond: x.Uses == 1   && clobber(x)
   11870 	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
   11871 	for {
   11872 		i := v.AuxInt
   11873 		s := v.Aux
   11874 		_ = v.Args[3]
   11875 		idx := v.Args[0]
   11876 		p := v.Args[1]
   11877 		w := v.Args[2]
   11878 		x := v.Args[3]
   11879 		if x.Op != OpS390XMOVBstoreidx {
   11880 			break
   11881 		}
   11882 		if x.AuxInt != i-1 {
   11883 			break
   11884 		}
   11885 		if x.Aux != s {
   11886 			break
   11887 		}
   11888 		_ = x.Args[3]
   11889 		if idx != x.Args[0] {
   11890 			break
   11891 		}
   11892 		if p != x.Args[1] {
   11893 			break
   11894 		}
   11895 		x_2 := x.Args[2]
   11896 		if x_2.Op != OpS390XSRWconst {
   11897 			break
   11898 		}
   11899 		if x_2.AuxInt != 8 {
   11900 			break
   11901 		}
   11902 		if w != x_2.Args[0] {
   11903 			break
   11904 		}
   11905 		mem := x.Args[3]
   11906 		if !(x.Uses == 1 && clobber(x)) {
   11907 			break
   11908 		}
   11909 		v.reset(OpS390XMOVHstoreidx)
   11910 		v.AuxInt = i - 1
   11911 		v.Aux = s
   11912 		v.AddArg(p)
   11913 		v.AddArg(idx)
   11914 		v.AddArg(w)
   11915 		v.AddArg(mem)
   11916 		return true
   11917 	}
   11918 	// match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem))
   11919 	// cond: x.Uses == 1   && clobber(x)
   11920 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   11921 	for {
   11922 		i := v.AuxInt
   11923 		s := v.Aux
   11924 		_ = v.Args[3]
   11925 		p := v.Args[0]
   11926 		idx := v.Args[1]
   11927 		w0 := v.Args[2]
   11928 		if w0.Op != OpS390XSRWconst {
   11929 			break
   11930 		}
   11931 		j := w0.AuxInt
   11932 		w := w0.Args[0]
   11933 		x := v.Args[3]
   11934 		if x.Op != OpS390XMOVBstoreidx {
   11935 			break
   11936 		}
   11937 		if x.AuxInt != i-1 {
   11938 			break
   11939 		}
   11940 		if x.Aux != s {
   11941 			break
   11942 		}
   11943 		_ = x.Args[3]
   11944 		if p != x.Args[0] {
   11945 			break
   11946 		}
   11947 		if idx != x.Args[1] {
   11948 			break
   11949 		}
   11950 		x_2 := x.Args[2]
   11951 		if x_2.Op != OpS390XSRWconst {
   11952 			break
   11953 		}
   11954 		if x_2.AuxInt != j+8 {
   11955 			break
   11956 		}
   11957 		if w != x_2.Args[0] {
   11958 			break
   11959 		}
   11960 		mem := x.Args[3]
   11961 		if !(x.Uses == 1 && clobber(x)) {
   11962 			break
   11963 		}
   11964 		v.reset(OpS390XMOVHstoreidx)
   11965 		v.AuxInt = i - 1
   11966 		v.Aux = s
   11967 		v.AddArg(p)
   11968 		v.AddArg(idx)
   11969 		v.AddArg(w0)
   11970 		v.AddArg(mem)
   11971 		return true
   11972 	}
   11973 	// match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem))
   11974 	// cond: x.Uses == 1   && clobber(x)
   11975 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   11976 	for {
   11977 		i := v.AuxInt
   11978 		s := v.Aux
   11979 		_ = v.Args[3]
   11980 		p := v.Args[0]
   11981 		idx := v.Args[1]
   11982 		w0 := v.Args[2]
   11983 		if w0.Op != OpS390XSRWconst {
   11984 			break
   11985 		}
   11986 		j := w0.AuxInt
   11987 		w := w0.Args[0]
   11988 		x := v.Args[3]
   11989 		if x.Op != OpS390XMOVBstoreidx {
   11990 			break
   11991 		}
   11992 		if x.AuxInt != i-1 {
   11993 			break
   11994 		}
   11995 		if x.Aux != s {
   11996 			break
   11997 		}
   11998 		_ = x.Args[3]
   11999 		if idx != x.Args[0] {
   12000 			break
   12001 		}
   12002 		if p != x.Args[1] {
   12003 			break
   12004 		}
   12005 		x_2 := x.Args[2]
   12006 		if x_2.Op != OpS390XSRWconst {
   12007 			break
   12008 		}
   12009 		if x_2.AuxInt != j+8 {
   12010 			break
   12011 		}
   12012 		if w != x_2.Args[0] {
   12013 			break
   12014 		}
   12015 		mem := x.Args[3]
   12016 		if !(x.Uses == 1 && clobber(x)) {
   12017 			break
   12018 		}
   12019 		v.reset(OpS390XMOVHstoreidx)
   12020 		v.AuxInt = i - 1
   12021 		v.Aux = s
   12022 		v.AddArg(p)
   12023 		v.AddArg(idx)
   12024 		v.AddArg(w0)
   12025 		v.AddArg(mem)
   12026 		return true
   12027 	}
   12028 	// match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem))
   12029 	// cond: x.Uses == 1   && clobber(x)
   12030 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   12031 	for {
   12032 		i := v.AuxInt
   12033 		s := v.Aux
   12034 		_ = v.Args[3]
   12035 		idx := v.Args[0]
   12036 		p := v.Args[1]
   12037 		w0 := v.Args[2]
   12038 		if w0.Op != OpS390XSRWconst {
   12039 			break
   12040 		}
   12041 		j := w0.AuxInt
   12042 		w := w0.Args[0]
   12043 		x := v.Args[3]
   12044 		if x.Op != OpS390XMOVBstoreidx {
   12045 			break
   12046 		}
   12047 		if x.AuxInt != i-1 {
   12048 			break
   12049 		}
   12050 		if x.Aux != s {
   12051 			break
   12052 		}
   12053 		_ = x.Args[3]
   12054 		if p != x.Args[0] {
   12055 			break
   12056 		}
   12057 		if idx != x.Args[1] {
   12058 			break
   12059 		}
   12060 		x_2 := x.Args[2]
   12061 		if x_2.Op != OpS390XSRWconst {
   12062 			break
   12063 		}
   12064 		if x_2.AuxInt != j+8 {
   12065 			break
   12066 		}
   12067 		if w != x_2.Args[0] {
   12068 			break
   12069 		}
   12070 		mem := x.Args[3]
   12071 		if !(x.Uses == 1 && clobber(x)) {
   12072 			break
   12073 		}
   12074 		v.reset(OpS390XMOVHstoreidx)
   12075 		v.AuxInt = i - 1
   12076 		v.Aux = s
   12077 		v.AddArg(p)
   12078 		v.AddArg(idx)
   12079 		v.AddArg(w0)
   12080 		v.AddArg(mem)
   12081 		return true
   12082 	}
   12083 	// match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem))
   12084 	// cond: x.Uses == 1   && clobber(x)
   12085 	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
   12086 	for {
   12087 		i := v.AuxInt
   12088 		s := v.Aux
   12089 		_ = v.Args[3]
   12090 		idx := v.Args[0]
   12091 		p := v.Args[1]
   12092 		w0 := v.Args[2]
   12093 		if w0.Op != OpS390XSRWconst {
   12094 			break
   12095 		}
   12096 		j := w0.AuxInt
   12097 		w := w0.Args[0]
   12098 		x := v.Args[3]
   12099 		if x.Op != OpS390XMOVBstoreidx {
   12100 			break
   12101 		}
   12102 		if x.AuxInt != i-1 {
   12103 			break
   12104 		}
   12105 		if x.Aux != s {
   12106 			break
   12107 		}
   12108 		_ = x.Args[3]
   12109 		if idx != x.Args[0] {
   12110 			break
   12111 		}
   12112 		if p != x.Args[1] {
   12113 			break
   12114 		}
   12115 		x_2 := x.Args[2]
   12116 		if x_2.Op != OpS390XSRWconst {
   12117 			break
   12118 		}
   12119 		if x_2.AuxInt != j+8 {
   12120 			break
   12121 		}
   12122 		if w != x_2.Args[0] {
   12123 			break
   12124 		}
   12125 		mem := x.Args[3]
   12126 		if !(x.Uses == 1 && clobber(x)) {
   12127 			break
   12128 		}
   12129 		v.reset(OpS390XMOVHstoreidx)
   12130 		v.AuxInt = i - 1
   12131 		v.Aux = s
   12132 		v.AddArg(p)
   12133 		v.AddArg(idx)
   12134 		v.AddArg(w0)
   12135 		v.AddArg(mem)
   12136 		return true
   12137 	}
   12138 	return false
   12139 }
   12140 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool {
   12141 	// match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem))
   12142 	// cond: x.Uses == 1   && clobber(x)
   12143 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12144 	for {
   12145 		i := v.AuxInt
   12146 		s := v.Aux
   12147 		_ = v.Args[3]
   12148 		p := v.Args[0]
   12149 		idx := v.Args[1]
   12150 		v_2 := v.Args[2]
   12151 		if v_2.Op != OpS390XSRDconst {
   12152 			break
   12153 		}
   12154 		if v_2.AuxInt != 8 {
   12155 			break
   12156 		}
   12157 		w := v_2.Args[0]
   12158 		x := v.Args[3]
   12159 		if x.Op != OpS390XMOVBstoreidx {
   12160 			break
   12161 		}
   12162 		if x.AuxInt != i-1 {
   12163 			break
   12164 		}
   12165 		if x.Aux != s {
   12166 			break
   12167 		}
   12168 		_ = x.Args[3]
   12169 		if p != x.Args[0] {
   12170 			break
   12171 		}
   12172 		if idx != x.Args[1] {
   12173 			break
   12174 		}
   12175 		if w != x.Args[2] {
   12176 			break
   12177 		}
   12178 		mem := x.Args[3]
   12179 		if !(x.Uses == 1 && clobber(x)) {
   12180 			break
   12181 		}
   12182 		v.reset(OpS390XMOVHBRstoreidx)
   12183 		v.AuxInt = i - 1
   12184 		v.Aux = s
   12185 		v.AddArg(p)
   12186 		v.AddArg(idx)
   12187 		v.AddArg(w)
   12188 		v.AddArg(mem)
   12189 		return true
   12190 	}
   12191 	// match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem))
   12192 	// cond: x.Uses == 1   && clobber(x)
   12193 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12194 	for {
   12195 		i := v.AuxInt
   12196 		s := v.Aux
   12197 		_ = v.Args[3]
   12198 		p := v.Args[0]
   12199 		idx := v.Args[1]
   12200 		v_2 := v.Args[2]
   12201 		if v_2.Op != OpS390XSRDconst {
   12202 			break
   12203 		}
   12204 		if v_2.AuxInt != 8 {
   12205 			break
   12206 		}
   12207 		w := v_2.Args[0]
   12208 		x := v.Args[3]
   12209 		if x.Op != OpS390XMOVBstoreidx {
   12210 			break
   12211 		}
   12212 		if x.AuxInt != i-1 {
   12213 			break
   12214 		}
   12215 		if x.Aux != s {
   12216 			break
   12217 		}
   12218 		_ = x.Args[3]
   12219 		if idx != x.Args[0] {
   12220 			break
   12221 		}
   12222 		if p != x.Args[1] {
   12223 			break
   12224 		}
   12225 		if w != x.Args[2] {
   12226 			break
   12227 		}
   12228 		mem := x.Args[3]
   12229 		if !(x.Uses == 1 && clobber(x)) {
   12230 			break
   12231 		}
   12232 		v.reset(OpS390XMOVHBRstoreidx)
   12233 		v.AuxInt = i - 1
   12234 		v.Aux = s
   12235 		v.AddArg(p)
   12236 		v.AddArg(idx)
   12237 		v.AddArg(w)
   12238 		v.AddArg(mem)
   12239 		return true
   12240 	}
   12241 	// match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem))
   12242 	// cond: x.Uses == 1   && clobber(x)
   12243 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12244 	for {
   12245 		i := v.AuxInt
   12246 		s := v.Aux
   12247 		_ = v.Args[3]
   12248 		idx := v.Args[0]
   12249 		p := v.Args[1]
   12250 		v_2 := v.Args[2]
   12251 		if v_2.Op != OpS390XSRDconst {
   12252 			break
   12253 		}
   12254 		if v_2.AuxInt != 8 {
   12255 			break
   12256 		}
   12257 		w := v_2.Args[0]
   12258 		x := v.Args[3]
   12259 		if x.Op != OpS390XMOVBstoreidx {
   12260 			break
   12261 		}
   12262 		if x.AuxInt != i-1 {
   12263 			break
   12264 		}
   12265 		if x.Aux != s {
   12266 			break
   12267 		}
   12268 		_ = x.Args[3]
   12269 		if p != x.Args[0] {
   12270 			break
   12271 		}
   12272 		if idx != x.Args[1] {
   12273 			break
   12274 		}
   12275 		if w != x.Args[2] {
   12276 			break
   12277 		}
   12278 		mem := x.Args[3]
   12279 		if !(x.Uses == 1 && clobber(x)) {
   12280 			break
   12281 		}
   12282 		v.reset(OpS390XMOVHBRstoreidx)
   12283 		v.AuxInt = i - 1
   12284 		v.Aux = s
   12285 		v.AddArg(p)
   12286 		v.AddArg(idx)
   12287 		v.AddArg(w)
   12288 		v.AddArg(mem)
   12289 		return true
   12290 	}
   12291 	// match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem))
   12292 	// cond: x.Uses == 1   && clobber(x)
   12293 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12294 	for {
   12295 		i := v.AuxInt
   12296 		s := v.Aux
   12297 		_ = v.Args[3]
   12298 		idx := v.Args[0]
   12299 		p := v.Args[1]
   12300 		v_2 := v.Args[2]
   12301 		if v_2.Op != OpS390XSRDconst {
   12302 			break
   12303 		}
   12304 		if v_2.AuxInt != 8 {
   12305 			break
   12306 		}
   12307 		w := v_2.Args[0]
   12308 		x := v.Args[3]
   12309 		if x.Op != OpS390XMOVBstoreidx {
   12310 			break
   12311 		}
   12312 		if x.AuxInt != i-1 {
   12313 			break
   12314 		}
   12315 		if x.Aux != s {
   12316 			break
   12317 		}
   12318 		_ = x.Args[3]
   12319 		if idx != x.Args[0] {
   12320 			break
   12321 		}
   12322 		if p != x.Args[1] {
   12323 			break
   12324 		}
   12325 		if w != x.Args[2] {
   12326 			break
   12327 		}
   12328 		mem := x.Args[3]
   12329 		if !(x.Uses == 1 && clobber(x)) {
   12330 			break
   12331 		}
   12332 		v.reset(OpS390XMOVHBRstoreidx)
   12333 		v.AuxInt = i - 1
   12334 		v.Aux = s
   12335 		v.AddArg(p)
   12336 		v.AddArg(idx)
   12337 		v.AddArg(w)
   12338 		v.AddArg(mem)
   12339 		return true
   12340 	}
   12341 	// match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem))
   12342 	// cond: x.Uses == 1   && clobber(x)
   12343 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12344 	for {
   12345 		i := v.AuxInt
   12346 		s := v.Aux
   12347 		_ = v.Args[3]
   12348 		p := v.Args[0]
   12349 		idx := v.Args[1]
   12350 		v_2 := v.Args[2]
   12351 		if v_2.Op != OpS390XSRDconst {
   12352 			break
   12353 		}
   12354 		j := v_2.AuxInt
   12355 		w := v_2.Args[0]
   12356 		x := v.Args[3]
   12357 		if x.Op != OpS390XMOVBstoreidx {
   12358 			break
   12359 		}
   12360 		if x.AuxInt != i-1 {
   12361 			break
   12362 		}
   12363 		if x.Aux != s {
   12364 			break
   12365 		}
   12366 		_ = x.Args[3]
   12367 		if p != x.Args[0] {
   12368 			break
   12369 		}
   12370 		if idx != x.Args[1] {
   12371 			break
   12372 		}
   12373 		w0 := x.Args[2]
   12374 		if w0.Op != OpS390XSRDconst {
   12375 			break
   12376 		}
   12377 		if w0.AuxInt != j-8 {
   12378 			break
   12379 		}
   12380 		if w != w0.Args[0] {
   12381 			break
   12382 		}
   12383 		mem := x.Args[3]
   12384 		if !(x.Uses == 1 && clobber(x)) {
   12385 			break
   12386 		}
   12387 		v.reset(OpS390XMOVHBRstoreidx)
   12388 		v.AuxInt = i - 1
   12389 		v.Aux = s
   12390 		v.AddArg(p)
   12391 		v.AddArg(idx)
   12392 		v.AddArg(w0)
   12393 		v.AddArg(mem)
   12394 		return true
   12395 	}
   12396 	// match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem))
   12397 	// cond: x.Uses == 1   && clobber(x)
   12398 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12399 	for {
   12400 		i := v.AuxInt
   12401 		s := v.Aux
   12402 		_ = v.Args[3]
   12403 		p := v.Args[0]
   12404 		idx := v.Args[1]
   12405 		v_2 := v.Args[2]
   12406 		if v_2.Op != OpS390XSRDconst {
   12407 			break
   12408 		}
   12409 		j := v_2.AuxInt
   12410 		w := v_2.Args[0]
   12411 		x := v.Args[3]
   12412 		if x.Op != OpS390XMOVBstoreidx {
   12413 			break
   12414 		}
   12415 		if x.AuxInt != i-1 {
   12416 			break
   12417 		}
   12418 		if x.Aux != s {
   12419 			break
   12420 		}
   12421 		_ = x.Args[3]
   12422 		if idx != x.Args[0] {
   12423 			break
   12424 		}
   12425 		if p != x.Args[1] {
   12426 			break
   12427 		}
   12428 		w0 := x.Args[2]
   12429 		if w0.Op != OpS390XSRDconst {
   12430 			break
   12431 		}
   12432 		if w0.AuxInt != j-8 {
   12433 			break
   12434 		}
   12435 		if w != w0.Args[0] {
   12436 			break
   12437 		}
   12438 		mem := x.Args[3]
   12439 		if !(x.Uses == 1 && clobber(x)) {
   12440 			break
   12441 		}
   12442 		v.reset(OpS390XMOVHBRstoreidx)
   12443 		v.AuxInt = i - 1
   12444 		v.Aux = s
   12445 		v.AddArg(p)
   12446 		v.AddArg(idx)
   12447 		v.AddArg(w0)
   12448 		v.AddArg(mem)
   12449 		return true
   12450 	}
   12451 	// match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem))
   12452 	// cond: x.Uses == 1   && clobber(x)
   12453 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12454 	for {
   12455 		i := v.AuxInt
   12456 		s := v.Aux
   12457 		_ = v.Args[3]
   12458 		idx := v.Args[0]
   12459 		p := v.Args[1]
   12460 		v_2 := v.Args[2]
   12461 		if v_2.Op != OpS390XSRDconst {
   12462 			break
   12463 		}
   12464 		j := v_2.AuxInt
   12465 		w := v_2.Args[0]
   12466 		x := v.Args[3]
   12467 		if x.Op != OpS390XMOVBstoreidx {
   12468 			break
   12469 		}
   12470 		if x.AuxInt != i-1 {
   12471 			break
   12472 		}
   12473 		if x.Aux != s {
   12474 			break
   12475 		}
   12476 		_ = x.Args[3]
   12477 		if p != x.Args[0] {
   12478 			break
   12479 		}
   12480 		if idx != x.Args[1] {
   12481 			break
   12482 		}
   12483 		w0 := x.Args[2]
   12484 		if w0.Op != OpS390XSRDconst {
   12485 			break
   12486 		}
   12487 		if w0.AuxInt != j-8 {
   12488 			break
   12489 		}
   12490 		if w != w0.Args[0] {
   12491 			break
   12492 		}
   12493 		mem := x.Args[3]
   12494 		if !(x.Uses == 1 && clobber(x)) {
   12495 			break
   12496 		}
   12497 		v.reset(OpS390XMOVHBRstoreidx)
   12498 		v.AuxInt = i - 1
   12499 		v.Aux = s
   12500 		v.AddArg(p)
   12501 		v.AddArg(idx)
   12502 		v.AddArg(w0)
   12503 		v.AddArg(mem)
   12504 		return true
   12505 	}
   12506 	// match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem))
   12507 	// cond: x.Uses == 1   && clobber(x)
   12508 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12509 	for {
   12510 		i := v.AuxInt
   12511 		s := v.Aux
   12512 		_ = v.Args[3]
   12513 		idx := v.Args[0]
   12514 		p := v.Args[1]
   12515 		v_2 := v.Args[2]
   12516 		if v_2.Op != OpS390XSRDconst {
   12517 			break
   12518 		}
   12519 		j := v_2.AuxInt
   12520 		w := v_2.Args[0]
   12521 		x := v.Args[3]
   12522 		if x.Op != OpS390XMOVBstoreidx {
   12523 			break
   12524 		}
   12525 		if x.AuxInt != i-1 {
   12526 			break
   12527 		}
   12528 		if x.Aux != s {
   12529 			break
   12530 		}
   12531 		_ = x.Args[3]
   12532 		if idx != x.Args[0] {
   12533 			break
   12534 		}
   12535 		if p != x.Args[1] {
   12536 			break
   12537 		}
   12538 		w0 := x.Args[2]
   12539 		if w0.Op != OpS390XSRDconst {
   12540 			break
   12541 		}
   12542 		if w0.AuxInt != j-8 {
   12543 			break
   12544 		}
   12545 		if w != w0.Args[0] {
   12546 			break
   12547 		}
   12548 		mem := x.Args[3]
   12549 		if !(x.Uses == 1 && clobber(x)) {
   12550 			break
   12551 		}
   12552 		v.reset(OpS390XMOVHBRstoreidx)
   12553 		v.AuxInt = i - 1
   12554 		v.Aux = s
   12555 		v.AddArg(p)
   12556 		v.AddArg(idx)
   12557 		v.AddArg(w0)
   12558 		v.AddArg(mem)
   12559 		return true
   12560 	}
   12561 	// match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem))
   12562 	// cond: x.Uses == 1   && clobber(x)
   12563 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12564 	for {
   12565 		i := v.AuxInt
   12566 		s := v.Aux
   12567 		_ = v.Args[3]
   12568 		p := v.Args[0]
   12569 		idx := v.Args[1]
   12570 		v_2 := v.Args[2]
   12571 		if v_2.Op != OpS390XSRWconst {
   12572 			break
   12573 		}
   12574 		if v_2.AuxInt != 8 {
   12575 			break
   12576 		}
   12577 		w := v_2.Args[0]
   12578 		x := v.Args[3]
   12579 		if x.Op != OpS390XMOVBstoreidx {
   12580 			break
   12581 		}
   12582 		if x.AuxInt != i-1 {
   12583 			break
   12584 		}
   12585 		if x.Aux != s {
   12586 			break
   12587 		}
   12588 		_ = x.Args[3]
   12589 		if p != x.Args[0] {
   12590 			break
   12591 		}
   12592 		if idx != x.Args[1] {
   12593 			break
   12594 		}
   12595 		if w != x.Args[2] {
   12596 			break
   12597 		}
   12598 		mem := x.Args[3]
   12599 		if !(x.Uses == 1 && clobber(x)) {
   12600 			break
   12601 		}
   12602 		v.reset(OpS390XMOVHBRstoreidx)
   12603 		v.AuxInt = i - 1
   12604 		v.Aux = s
   12605 		v.AddArg(p)
   12606 		v.AddArg(idx)
   12607 		v.AddArg(w)
   12608 		v.AddArg(mem)
   12609 		return true
   12610 	}
   12611 	// match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem))
   12612 	// cond: x.Uses == 1   && clobber(x)
   12613 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12614 	for {
   12615 		i := v.AuxInt
   12616 		s := v.Aux
   12617 		_ = v.Args[3]
   12618 		p := v.Args[0]
   12619 		idx := v.Args[1]
   12620 		v_2 := v.Args[2]
   12621 		if v_2.Op != OpS390XSRWconst {
   12622 			break
   12623 		}
   12624 		if v_2.AuxInt != 8 {
   12625 			break
   12626 		}
   12627 		w := v_2.Args[0]
   12628 		x := v.Args[3]
   12629 		if x.Op != OpS390XMOVBstoreidx {
   12630 			break
   12631 		}
   12632 		if x.AuxInt != i-1 {
   12633 			break
   12634 		}
   12635 		if x.Aux != s {
   12636 			break
   12637 		}
   12638 		_ = x.Args[3]
   12639 		if idx != x.Args[0] {
   12640 			break
   12641 		}
   12642 		if p != x.Args[1] {
   12643 			break
   12644 		}
   12645 		if w != x.Args[2] {
   12646 			break
   12647 		}
   12648 		mem := x.Args[3]
   12649 		if !(x.Uses == 1 && clobber(x)) {
   12650 			break
   12651 		}
   12652 		v.reset(OpS390XMOVHBRstoreidx)
   12653 		v.AuxInt = i - 1
   12654 		v.Aux = s
   12655 		v.AddArg(p)
   12656 		v.AddArg(idx)
   12657 		v.AddArg(w)
   12658 		v.AddArg(mem)
   12659 		return true
   12660 	}
   12661 	return false
   12662 }
   12663 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool {
   12664 	// match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem))
   12665 	// cond: x.Uses == 1   && clobber(x)
   12666 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12667 	for {
   12668 		i := v.AuxInt
   12669 		s := v.Aux
   12670 		_ = v.Args[3]
   12671 		idx := v.Args[0]
   12672 		p := v.Args[1]
   12673 		v_2 := v.Args[2]
   12674 		if v_2.Op != OpS390XSRWconst {
   12675 			break
   12676 		}
   12677 		if v_2.AuxInt != 8 {
   12678 			break
   12679 		}
   12680 		w := v_2.Args[0]
   12681 		x := v.Args[3]
   12682 		if x.Op != OpS390XMOVBstoreidx {
   12683 			break
   12684 		}
   12685 		if x.AuxInt != i-1 {
   12686 			break
   12687 		}
   12688 		if x.Aux != s {
   12689 			break
   12690 		}
   12691 		_ = x.Args[3]
   12692 		if p != x.Args[0] {
   12693 			break
   12694 		}
   12695 		if idx != x.Args[1] {
   12696 			break
   12697 		}
   12698 		if w != x.Args[2] {
   12699 			break
   12700 		}
   12701 		mem := x.Args[3]
   12702 		if !(x.Uses == 1 && clobber(x)) {
   12703 			break
   12704 		}
   12705 		v.reset(OpS390XMOVHBRstoreidx)
   12706 		v.AuxInt = i - 1
   12707 		v.Aux = s
   12708 		v.AddArg(p)
   12709 		v.AddArg(idx)
   12710 		v.AddArg(w)
   12711 		v.AddArg(mem)
   12712 		return true
   12713 	}
   12714 	// match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem))
   12715 	// cond: x.Uses == 1   && clobber(x)
   12716 	// result: (MOVHBRstoreidx [i-1] {s} p idx w mem)
   12717 	for {
   12718 		i := v.AuxInt
   12719 		s := v.Aux
   12720 		_ = v.Args[3]
   12721 		idx := v.Args[0]
   12722 		p := v.Args[1]
   12723 		v_2 := v.Args[2]
   12724 		if v_2.Op != OpS390XSRWconst {
   12725 			break
   12726 		}
   12727 		if v_2.AuxInt != 8 {
   12728 			break
   12729 		}
   12730 		w := v_2.Args[0]
   12731 		x := v.Args[3]
   12732 		if x.Op != OpS390XMOVBstoreidx {
   12733 			break
   12734 		}
   12735 		if x.AuxInt != i-1 {
   12736 			break
   12737 		}
   12738 		if x.Aux != s {
   12739 			break
   12740 		}
   12741 		_ = x.Args[3]
   12742 		if idx != x.Args[0] {
   12743 			break
   12744 		}
   12745 		if p != x.Args[1] {
   12746 			break
   12747 		}
   12748 		if w != x.Args[2] {
   12749 			break
   12750 		}
   12751 		mem := x.Args[3]
   12752 		if !(x.Uses == 1 && clobber(x)) {
   12753 			break
   12754 		}
   12755 		v.reset(OpS390XMOVHBRstoreidx)
   12756 		v.AuxInt = i - 1
   12757 		v.Aux = s
   12758 		v.AddArg(p)
   12759 		v.AddArg(idx)
   12760 		v.AddArg(w)
   12761 		v.AddArg(mem)
   12762 		return true
   12763 	}
   12764 	// match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem))
   12765 	// cond: x.Uses == 1   && clobber(x)
   12766 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12767 	for {
   12768 		i := v.AuxInt
   12769 		s := v.Aux
   12770 		_ = v.Args[3]
   12771 		p := v.Args[0]
   12772 		idx := v.Args[1]
   12773 		v_2 := v.Args[2]
   12774 		if v_2.Op != OpS390XSRWconst {
   12775 			break
   12776 		}
   12777 		j := v_2.AuxInt
   12778 		w := v_2.Args[0]
   12779 		x := v.Args[3]
   12780 		if x.Op != OpS390XMOVBstoreidx {
   12781 			break
   12782 		}
   12783 		if x.AuxInt != i-1 {
   12784 			break
   12785 		}
   12786 		if x.Aux != s {
   12787 			break
   12788 		}
   12789 		_ = x.Args[3]
   12790 		if p != x.Args[0] {
   12791 			break
   12792 		}
   12793 		if idx != x.Args[1] {
   12794 			break
   12795 		}
   12796 		w0 := x.Args[2]
   12797 		if w0.Op != OpS390XSRWconst {
   12798 			break
   12799 		}
   12800 		if w0.AuxInt != j-8 {
   12801 			break
   12802 		}
   12803 		if w != w0.Args[0] {
   12804 			break
   12805 		}
   12806 		mem := x.Args[3]
   12807 		if !(x.Uses == 1 && clobber(x)) {
   12808 			break
   12809 		}
   12810 		v.reset(OpS390XMOVHBRstoreidx)
   12811 		v.AuxInt = i - 1
   12812 		v.Aux = s
   12813 		v.AddArg(p)
   12814 		v.AddArg(idx)
   12815 		v.AddArg(w0)
   12816 		v.AddArg(mem)
   12817 		return true
   12818 	}
   12819 	// match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem))
   12820 	// cond: x.Uses == 1   && clobber(x)
   12821 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12822 	for {
   12823 		i := v.AuxInt
   12824 		s := v.Aux
   12825 		_ = v.Args[3]
   12826 		p := v.Args[0]
   12827 		idx := v.Args[1]
   12828 		v_2 := v.Args[2]
   12829 		if v_2.Op != OpS390XSRWconst {
   12830 			break
   12831 		}
   12832 		j := v_2.AuxInt
   12833 		w := v_2.Args[0]
   12834 		x := v.Args[3]
   12835 		if x.Op != OpS390XMOVBstoreidx {
   12836 			break
   12837 		}
   12838 		if x.AuxInt != i-1 {
   12839 			break
   12840 		}
   12841 		if x.Aux != s {
   12842 			break
   12843 		}
   12844 		_ = x.Args[3]
   12845 		if idx != x.Args[0] {
   12846 			break
   12847 		}
   12848 		if p != x.Args[1] {
   12849 			break
   12850 		}
   12851 		w0 := x.Args[2]
   12852 		if w0.Op != OpS390XSRWconst {
   12853 			break
   12854 		}
   12855 		if w0.AuxInt != j-8 {
   12856 			break
   12857 		}
   12858 		if w != w0.Args[0] {
   12859 			break
   12860 		}
   12861 		mem := x.Args[3]
   12862 		if !(x.Uses == 1 && clobber(x)) {
   12863 			break
   12864 		}
   12865 		v.reset(OpS390XMOVHBRstoreidx)
   12866 		v.AuxInt = i - 1
   12867 		v.Aux = s
   12868 		v.AddArg(p)
   12869 		v.AddArg(idx)
   12870 		v.AddArg(w0)
   12871 		v.AddArg(mem)
   12872 		return true
   12873 	}
   12874 	// match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem))
   12875 	// cond: x.Uses == 1   && clobber(x)
   12876 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12877 	for {
   12878 		i := v.AuxInt
   12879 		s := v.Aux
   12880 		_ = v.Args[3]
   12881 		idx := v.Args[0]
   12882 		p := v.Args[1]
   12883 		v_2 := v.Args[2]
   12884 		if v_2.Op != OpS390XSRWconst {
   12885 			break
   12886 		}
   12887 		j := v_2.AuxInt
   12888 		w := v_2.Args[0]
   12889 		x := v.Args[3]
   12890 		if x.Op != OpS390XMOVBstoreidx {
   12891 			break
   12892 		}
   12893 		if x.AuxInt != i-1 {
   12894 			break
   12895 		}
   12896 		if x.Aux != s {
   12897 			break
   12898 		}
   12899 		_ = x.Args[3]
   12900 		if p != x.Args[0] {
   12901 			break
   12902 		}
   12903 		if idx != x.Args[1] {
   12904 			break
   12905 		}
   12906 		w0 := x.Args[2]
   12907 		if w0.Op != OpS390XSRWconst {
   12908 			break
   12909 		}
   12910 		if w0.AuxInt != j-8 {
   12911 			break
   12912 		}
   12913 		if w != w0.Args[0] {
   12914 			break
   12915 		}
   12916 		mem := x.Args[3]
   12917 		if !(x.Uses == 1 && clobber(x)) {
   12918 			break
   12919 		}
   12920 		v.reset(OpS390XMOVHBRstoreidx)
   12921 		v.AuxInt = i - 1
   12922 		v.Aux = s
   12923 		v.AddArg(p)
   12924 		v.AddArg(idx)
   12925 		v.AddArg(w0)
   12926 		v.AddArg(mem)
   12927 		return true
   12928 	}
   12929 	// match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem))
   12930 	// cond: x.Uses == 1   && clobber(x)
   12931 	// result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem)
   12932 	for {
   12933 		i := v.AuxInt
   12934 		s := v.Aux
   12935 		_ = v.Args[3]
   12936 		idx := v.Args[0]
   12937 		p := v.Args[1]
   12938 		v_2 := v.Args[2]
   12939 		if v_2.Op != OpS390XSRWconst {
   12940 			break
   12941 		}
   12942 		j := v_2.AuxInt
   12943 		w := v_2.Args[0]
   12944 		x := v.Args[3]
   12945 		if x.Op != OpS390XMOVBstoreidx {
   12946 			break
   12947 		}
   12948 		if x.AuxInt != i-1 {
   12949 			break
   12950 		}
   12951 		if x.Aux != s {
   12952 			break
   12953 		}
   12954 		_ = x.Args[3]
   12955 		if idx != x.Args[0] {
   12956 			break
   12957 		}
   12958 		if p != x.Args[1] {
   12959 			break
   12960 		}
   12961 		w0 := x.Args[2]
   12962 		if w0.Op != OpS390XSRWconst {
   12963 			break
   12964 		}
   12965 		if w0.AuxInt != j-8 {
   12966 			break
   12967 		}
   12968 		if w != w0.Args[0] {
   12969 			break
   12970 		}
   12971 		mem := x.Args[3]
   12972 		if !(x.Uses == 1 && clobber(x)) {
   12973 			break
   12974 		}
   12975 		v.reset(OpS390XMOVHBRstoreidx)
   12976 		v.AuxInt = i - 1
   12977 		v.Aux = s
   12978 		v.AddArg(p)
   12979 		v.AddArg(idx)
   12980 		v.AddArg(w0)
   12981 		v.AddArg(mem)
   12982 		return true
   12983 	}
   12984 	return false
   12985 }
   12986 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool {
   12987 	// match: (MOVDEQ x y (InvertFlags cmp))
   12988 	// cond:
   12989 	// result: (MOVDEQ x y cmp)
   12990 	for {
   12991 		_ = v.Args[2]
   12992 		x := v.Args[0]
   12993 		y := v.Args[1]
   12994 		v_2 := v.Args[2]
   12995 		if v_2.Op != OpS390XInvertFlags {
   12996 			break
   12997 		}
   12998 		cmp := v_2.Args[0]
   12999 		v.reset(OpS390XMOVDEQ)
   13000 		v.AddArg(x)
   13001 		v.AddArg(y)
   13002 		v.AddArg(cmp)
   13003 		return true
   13004 	}
   13005 	// match: (MOVDEQ _ x (FlagEQ))
   13006 	// cond:
   13007 	// result: x
   13008 	for {
   13009 		_ = v.Args[2]
   13010 		x := v.Args[1]
   13011 		v_2 := v.Args[2]
   13012 		if v_2.Op != OpS390XFlagEQ {
   13013 			break
   13014 		}
   13015 		v.reset(OpCopy)
   13016 		v.Type = x.Type
   13017 		v.AddArg(x)
   13018 		return true
   13019 	}
   13020 	// match: (MOVDEQ y _ (FlagLT))
   13021 	// cond:
   13022 	// result: y
   13023 	for {
   13024 		_ = v.Args[2]
   13025 		y := v.Args[0]
   13026 		v_2 := v.Args[2]
   13027 		if v_2.Op != OpS390XFlagLT {
   13028 			break
   13029 		}
   13030 		v.reset(OpCopy)
   13031 		v.Type = y.Type
   13032 		v.AddArg(y)
   13033 		return true
   13034 	}
   13035 	// match: (MOVDEQ y _ (FlagGT))
   13036 	// cond:
   13037 	// result: y
   13038 	for {
   13039 		_ = v.Args[2]
   13040 		y := v.Args[0]
   13041 		v_2 := v.Args[2]
   13042 		if v_2.Op != OpS390XFlagGT {
   13043 			break
   13044 		}
   13045 		v.reset(OpCopy)
   13046 		v.Type = y.Type
   13047 		v.AddArg(y)
   13048 		return true
   13049 	}
   13050 	return false
   13051 }
   13052 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool {
   13053 	// match: (MOVDGE x y (InvertFlags cmp))
   13054 	// cond:
   13055 	// result: (MOVDLE x y cmp)
   13056 	for {
   13057 		_ = v.Args[2]
   13058 		x := v.Args[0]
   13059 		y := v.Args[1]
   13060 		v_2 := v.Args[2]
   13061 		if v_2.Op != OpS390XInvertFlags {
   13062 			break
   13063 		}
   13064 		cmp := v_2.Args[0]
   13065 		v.reset(OpS390XMOVDLE)
   13066 		v.AddArg(x)
   13067 		v.AddArg(y)
   13068 		v.AddArg(cmp)
   13069 		return true
   13070 	}
   13071 	// match: (MOVDGE _ x (FlagEQ))
   13072 	// cond:
   13073 	// result: x
   13074 	for {
   13075 		_ = v.Args[2]
   13076 		x := v.Args[1]
   13077 		v_2 := v.Args[2]
   13078 		if v_2.Op != OpS390XFlagEQ {
   13079 			break
   13080 		}
   13081 		v.reset(OpCopy)
   13082 		v.Type = x.Type
   13083 		v.AddArg(x)
   13084 		return true
   13085 	}
   13086 	// match: (MOVDGE y _ (FlagLT))
   13087 	// cond:
   13088 	// result: y
   13089 	for {
   13090 		_ = v.Args[2]
   13091 		y := v.Args[0]
   13092 		v_2 := v.Args[2]
   13093 		if v_2.Op != OpS390XFlagLT {
   13094 			break
   13095 		}
   13096 		v.reset(OpCopy)
   13097 		v.Type = y.Type
   13098 		v.AddArg(y)
   13099 		return true
   13100 	}
   13101 	// match: (MOVDGE _ x (FlagGT))
   13102 	// cond:
   13103 	// result: x
   13104 	for {
   13105 		_ = v.Args[2]
   13106 		x := v.Args[1]
   13107 		v_2 := v.Args[2]
   13108 		if v_2.Op != OpS390XFlagGT {
   13109 			break
   13110 		}
   13111 		v.reset(OpCopy)
   13112 		v.Type = x.Type
   13113 		v.AddArg(x)
   13114 		return true
   13115 	}
   13116 	return false
   13117 }
   13118 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool {
   13119 	// match: (MOVDGT x y (InvertFlags cmp))
   13120 	// cond:
   13121 	// result: (MOVDLT x y cmp)
   13122 	for {
   13123 		_ = v.Args[2]
   13124 		x := v.Args[0]
   13125 		y := v.Args[1]
   13126 		v_2 := v.Args[2]
   13127 		if v_2.Op != OpS390XInvertFlags {
   13128 			break
   13129 		}
   13130 		cmp := v_2.Args[0]
   13131 		v.reset(OpS390XMOVDLT)
   13132 		v.AddArg(x)
   13133 		v.AddArg(y)
   13134 		v.AddArg(cmp)
   13135 		return true
   13136 	}
   13137 	// match: (MOVDGT y _ (FlagEQ))
   13138 	// cond:
   13139 	// result: y
   13140 	for {
   13141 		_ = v.Args[2]
   13142 		y := v.Args[0]
   13143 		v_2 := v.Args[2]
   13144 		if v_2.Op != OpS390XFlagEQ {
   13145 			break
   13146 		}
   13147 		v.reset(OpCopy)
   13148 		v.Type = y.Type
   13149 		v.AddArg(y)
   13150 		return true
   13151 	}
   13152 	// match: (MOVDGT y _ (FlagLT))
   13153 	// cond:
   13154 	// result: y
   13155 	for {
   13156 		_ = v.Args[2]
   13157 		y := v.Args[0]
   13158 		v_2 := v.Args[2]
   13159 		if v_2.Op != OpS390XFlagLT {
   13160 			break
   13161 		}
   13162 		v.reset(OpCopy)
   13163 		v.Type = y.Type
   13164 		v.AddArg(y)
   13165 		return true
   13166 	}
   13167 	// match: (MOVDGT _ x (FlagGT))
   13168 	// cond:
   13169 	// result: x
   13170 	for {
   13171 		_ = v.Args[2]
   13172 		x := v.Args[1]
   13173 		v_2 := v.Args[2]
   13174 		if v_2.Op != OpS390XFlagGT {
   13175 			break
   13176 		}
   13177 		v.reset(OpCopy)
   13178 		v.Type = x.Type
   13179 		v.AddArg(x)
   13180 		return true
   13181 	}
   13182 	return false
   13183 }
   13184 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool {
   13185 	// match: (MOVDLE x y (InvertFlags cmp))
   13186 	// cond:
   13187 	// result: (MOVDGE x y cmp)
   13188 	for {
   13189 		_ = v.Args[2]
   13190 		x := v.Args[0]
   13191 		y := v.Args[1]
   13192 		v_2 := v.Args[2]
   13193 		if v_2.Op != OpS390XInvertFlags {
   13194 			break
   13195 		}
   13196 		cmp := v_2.Args[0]
   13197 		v.reset(OpS390XMOVDGE)
   13198 		v.AddArg(x)
   13199 		v.AddArg(y)
   13200 		v.AddArg(cmp)
   13201 		return true
   13202 	}
   13203 	// match: (MOVDLE _ x (FlagEQ))
   13204 	// cond:
   13205 	// result: x
   13206 	for {
   13207 		_ = v.Args[2]
   13208 		x := v.Args[1]
   13209 		v_2 := v.Args[2]
   13210 		if v_2.Op != OpS390XFlagEQ {
   13211 			break
   13212 		}
   13213 		v.reset(OpCopy)
   13214 		v.Type = x.Type
   13215 		v.AddArg(x)
   13216 		return true
   13217 	}
   13218 	// match: (MOVDLE _ x (FlagLT))
   13219 	// cond:
   13220 	// result: x
   13221 	for {
   13222 		_ = v.Args[2]
   13223 		x := v.Args[1]
   13224 		v_2 := v.Args[2]
   13225 		if v_2.Op != OpS390XFlagLT {
   13226 			break
   13227 		}
   13228 		v.reset(OpCopy)
   13229 		v.Type = x.Type
   13230 		v.AddArg(x)
   13231 		return true
   13232 	}
   13233 	// match: (MOVDLE y _ (FlagGT))
   13234 	// cond:
   13235 	// result: y
   13236 	for {
   13237 		_ = v.Args[2]
   13238 		y := v.Args[0]
   13239 		v_2 := v.Args[2]
   13240 		if v_2.Op != OpS390XFlagGT {
   13241 			break
   13242 		}
   13243 		v.reset(OpCopy)
   13244 		v.Type = y.Type
   13245 		v.AddArg(y)
   13246 		return true
   13247 	}
   13248 	return false
   13249 }
   13250 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool {
   13251 	// match: (MOVDLT x y (InvertFlags cmp))
   13252 	// cond:
   13253 	// result: (MOVDGT x y cmp)
   13254 	for {
   13255 		_ = v.Args[2]
   13256 		x := v.Args[0]
   13257 		y := v.Args[1]
   13258 		v_2 := v.Args[2]
   13259 		if v_2.Op != OpS390XInvertFlags {
   13260 			break
   13261 		}
   13262 		cmp := v_2.Args[0]
   13263 		v.reset(OpS390XMOVDGT)
   13264 		v.AddArg(x)
   13265 		v.AddArg(y)
   13266 		v.AddArg(cmp)
   13267 		return true
   13268 	}
   13269 	// match: (MOVDLT y _ (FlagEQ))
   13270 	// cond:
   13271 	// result: y
   13272 	for {
   13273 		_ = v.Args[2]
   13274 		y := v.Args[0]
   13275 		v_2 := v.Args[2]
   13276 		if v_2.Op != OpS390XFlagEQ {
   13277 			break
   13278 		}
   13279 		v.reset(OpCopy)
   13280 		v.Type = y.Type
   13281 		v.AddArg(y)
   13282 		return true
   13283 	}
   13284 	// match: (MOVDLT _ x (FlagLT))
   13285 	// cond:
   13286 	// result: x
   13287 	for {
   13288 		_ = v.Args[2]
   13289 		x := v.Args[1]
   13290 		v_2 := v.Args[2]
   13291 		if v_2.Op != OpS390XFlagLT {
   13292 			break
   13293 		}
   13294 		v.reset(OpCopy)
   13295 		v.Type = x.Type
   13296 		v.AddArg(x)
   13297 		return true
   13298 	}
   13299 	// match: (MOVDLT y _ (FlagGT))
   13300 	// cond:
   13301 	// result: y
   13302 	for {
   13303 		_ = v.Args[2]
   13304 		y := v.Args[0]
   13305 		v_2 := v.Args[2]
   13306 		if v_2.Op != OpS390XFlagGT {
   13307 			break
   13308 		}
   13309 		v.reset(OpCopy)
   13310 		v.Type = y.Type
   13311 		v.AddArg(y)
   13312 		return true
   13313 	}
   13314 	return false
   13315 }
   13316 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool {
   13317 	// match: (MOVDNE x y (InvertFlags cmp))
   13318 	// cond:
   13319 	// result: (MOVDNE x y cmp)
   13320 	for {
   13321 		_ = v.Args[2]
   13322 		x := v.Args[0]
   13323 		y := v.Args[1]
   13324 		v_2 := v.Args[2]
   13325 		if v_2.Op != OpS390XInvertFlags {
   13326 			break
   13327 		}
   13328 		cmp := v_2.Args[0]
   13329 		v.reset(OpS390XMOVDNE)
   13330 		v.AddArg(x)
   13331 		v.AddArg(y)
   13332 		v.AddArg(cmp)
   13333 		return true
   13334 	}
   13335 	// match: (MOVDNE y _ (FlagEQ))
   13336 	// cond:
   13337 	// result: y
   13338 	for {
   13339 		_ = v.Args[2]
   13340 		y := v.Args[0]
   13341 		v_2 := v.Args[2]
   13342 		if v_2.Op != OpS390XFlagEQ {
   13343 			break
   13344 		}
   13345 		v.reset(OpCopy)
   13346 		v.Type = y.Type
   13347 		v.AddArg(y)
   13348 		return true
   13349 	}
   13350 	// match: (MOVDNE _ x (FlagLT))
   13351 	// cond:
   13352 	// result: x
   13353 	for {
   13354 		_ = v.Args[2]
   13355 		x := v.Args[1]
   13356 		v_2 := v.Args[2]
   13357 		if v_2.Op != OpS390XFlagLT {
   13358 			break
   13359 		}
   13360 		v.reset(OpCopy)
   13361 		v.Type = x.Type
   13362 		v.AddArg(x)
   13363 		return true
   13364 	}
   13365 	// match: (MOVDNE _ x (FlagGT))
   13366 	// cond:
   13367 	// result: x
   13368 	for {
   13369 		_ = v.Args[2]
   13370 		x := v.Args[1]
   13371 		v_2 := v.Args[2]
   13372 		if v_2.Op != OpS390XFlagGT {
   13373 			break
   13374 		}
   13375 		v.reset(OpCopy)
   13376 		v.Type = x.Type
   13377 		v.AddArg(x)
   13378 		return true
   13379 	}
   13380 	return false
   13381 }
   13382 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool {
   13383 	// match: (MOVDaddridx [c] {s} (ADDconst [d] x) y)
   13384 	// cond: is20Bit(c+d) && x.Op != OpSB
   13385 	// result: (MOVDaddridx [c+d] {s} x y)
   13386 	for {
   13387 		c := v.AuxInt
   13388 		s := v.Aux
   13389 		_ = v.Args[1]
   13390 		v_0 := v.Args[0]
   13391 		if v_0.Op != OpS390XADDconst {
   13392 			break
   13393 		}
   13394 		d := v_0.AuxInt
   13395 		x := v_0.Args[0]
   13396 		y := v.Args[1]
   13397 		if !(is20Bit(c+d) && x.Op != OpSB) {
   13398 			break
   13399 		}
   13400 		v.reset(OpS390XMOVDaddridx)
   13401 		v.AuxInt = c + d
   13402 		v.Aux = s
   13403 		v.AddArg(x)
   13404 		v.AddArg(y)
   13405 		return true
   13406 	}
   13407 	// match: (MOVDaddridx [c] {s} x (ADDconst [d] y))
   13408 	// cond: is20Bit(c+d) && y.Op != OpSB
   13409 	// result: (MOVDaddridx [c+d] {s} x y)
   13410 	for {
   13411 		c := v.AuxInt
   13412 		s := v.Aux
   13413 		_ = v.Args[1]
   13414 		x := v.Args[0]
   13415 		v_1 := v.Args[1]
   13416 		if v_1.Op != OpS390XADDconst {
   13417 			break
   13418 		}
   13419 		d := v_1.AuxInt
   13420 		y := v_1.Args[0]
   13421 		if !(is20Bit(c+d) && y.Op != OpSB) {
   13422 			break
   13423 		}
   13424 		v.reset(OpS390XMOVDaddridx)
   13425 		v.AuxInt = c + d
   13426 		v.Aux = s
   13427 		v.AddArg(x)
   13428 		v.AddArg(y)
   13429 		return true
   13430 	}
   13431 	// match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y)
   13432 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB
   13433 	// result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y)
   13434 	for {
   13435 		off1 := v.AuxInt
   13436 		sym1 := v.Aux
   13437 		_ = v.Args[1]
   13438 		v_0 := v.Args[0]
   13439 		if v_0.Op != OpS390XMOVDaddr {
   13440 			break
   13441 		}
   13442 		off2 := v_0.AuxInt
   13443 		sym2 := v_0.Aux
   13444 		x := v_0.Args[0]
   13445 		y := v.Args[1]
   13446 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) {
   13447 			break
   13448 		}
   13449 		v.reset(OpS390XMOVDaddridx)
   13450 		v.AuxInt = off1 + off2
   13451 		v.Aux = mergeSym(sym1, sym2)
   13452 		v.AddArg(x)
   13453 		v.AddArg(y)
   13454 		return true
   13455 	}
   13456 	// match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y))
   13457 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB
   13458 	// result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y)
   13459 	for {
   13460 		off1 := v.AuxInt
   13461 		sym1 := v.Aux
   13462 		_ = v.Args[1]
   13463 		x := v.Args[0]
   13464 		v_1 := v.Args[1]
   13465 		if v_1.Op != OpS390XMOVDaddr {
   13466 			break
   13467 		}
   13468 		off2 := v_1.AuxInt
   13469 		sym2 := v_1.Aux
   13470 		y := v_1.Args[0]
   13471 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) {
   13472 			break
   13473 		}
   13474 		v.reset(OpS390XMOVDaddridx)
   13475 		v.AuxInt = off1 + off2
   13476 		v.Aux = mergeSym(sym1, sym2)
   13477 		v.AddArg(x)
   13478 		v.AddArg(y)
   13479 		return true
   13480 	}
   13481 	return false
   13482 }
   13483 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool {
   13484 	// match: (MOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _))
   13485 	// cond: isSamePtr(ptr1, ptr2)
   13486 	// result: (MOVDreg x)
   13487 	for {
   13488 		off := v.AuxInt
   13489 		sym := v.Aux
   13490 		_ = v.Args[1]
   13491 		ptr1 := v.Args[0]
   13492 		v_1 := v.Args[1]
   13493 		if v_1.Op != OpS390XMOVDstore {
   13494 			break
   13495 		}
   13496 		if v_1.AuxInt != off {
   13497 			break
   13498 		}
   13499 		if v_1.Aux != sym {
   13500 			break
   13501 		}
   13502 		_ = v_1.Args[2]
   13503 		ptr2 := v_1.Args[0]
   13504 		x := v_1.Args[1]
   13505 		if !(isSamePtr(ptr1, ptr2)) {
   13506 			break
   13507 		}
   13508 		v.reset(OpS390XMOVDreg)
   13509 		v.AddArg(x)
   13510 		return true
   13511 	}
   13512 	// match: (MOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _))
   13513 	// cond: isSamePtr(ptr1, ptr2)
   13514 	// result: (LGDR x)
   13515 	for {
   13516 		off := v.AuxInt
   13517 		sym := v.Aux
   13518 		_ = v.Args[1]
   13519 		ptr1 := v.Args[0]
   13520 		v_1 := v.Args[1]
   13521 		if v_1.Op != OpS390XFMOVDstore {
   13522 			break
   13523 		}
   13524 		if v_1.AuxInt != off {
   13525 			break
   13526 		}
   13527 		if v_1.Aux != sym {
   13528 			break
   13529 		}
   13530 		_ = v_1.Args[2]
   13531 		ptr2 := v_1.Args[0]
   13532 		x := v_1.Args[1]
   13533 		if !(isSamePtr(ptr1, ptr2)) {
   13534 			break
   13535 		}
   13536 		v.reset(OpS390XLGDR)
   13537 		v.AddArg(x)
   13538 		return true
   13539 	}
   13540 	// match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem)
   13541 	// cond: is20Bit(off1+off2)
   13542 	// result: (MOVDload  [off1+off2] {sym} ptr mem)
   13543 	for {
   13544 		off1 := v.AuxInt
   13545 		sym := v.Aux
   13546 		_ = v.Args[1]
   13547 		v_0 := v.Args[0]
   13548 		if v_0.Op != OpS390XADDconst {
   13549 			break
   13550 		}
   13551 		off2 := v_0.AuxInt
   13552 		ptr := v_0.Args[0]
   13553 		mem := v.Args[1]
   13554 		if !(is20Bit(off1 + off2)) {
   13555 			break
   13556 		}
   13557 		v.reset(OpS390XMOVDload)
   13558 		v.AuxInt = off1 + off2
   13559 		v.Aux = sym
   13560 		v.AddArg(ptr)
   13561 		v.AddArg(mem)
   13562 		return true
   13563 	}
   13564 	// match: (MOVDload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem)
   13565 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))
   13566 	// result: (MOVDload  [off1+off2] {mergeSym(sym1,sym2)} base mem)
   13567 	for {
   13568 		off1 := v.AuxInt
   13569 		sym1 := v.Aux
   13570 		_ = v.Args[1]
   13571 		v_0 := v.Args[0]
   13572 		if v_0.Op != OpS390XMOVDaddr {
   13573 			break
   13574 		}
   13575 		t := v_0.Type
   13576 		off2 := v_0.AuxInt
   13577 		sym2 := v_0.Aux
   13578 		base := v_0.Args[0]
   13579 		mem := v.Args[1]
   13580 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) {
   13581 			break
   13582 		}
   13583 		v.reset(OpS390XMOVDload)
   13584 		v.AuxInt = off1 + off2
   13585 		v.Aux = mergeSym(sym1, sym2)
   13586 		v.AddArg(base)
   13587 		v.AddArg(mem)
   13588 		return true
   13589 	}
   13590 	// match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   13591 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   13592 	// result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   13593 	for {
   13594 		off1 := v.AuxInt
   13595 		sym1 := v.Aux
   13596 		_ = v.Args[1]
   13597 		v_0 := v.Args[0]
   13598 		if v_0.Op != OpS390XMOVDaddridx {
   13599 			break
   13600 		}
   13601 		off2 := v_0.AuxInt
   13602 		sym2 := v_0.Aux
   13603 		_ = v_0.Args[1]
   13604 		ptr := v_0.Args[0]
   13605 		idx := v_0.Args[1]
   13606 		mem := v.Args[1]
   13607 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   13608 			break
   13609 		}
   13610 		v.reset(OpS390XMOVDloadidx)
   13611 		v.AuxInt = off1 + off2
   13612 		v.Aux = mergeSym(sym1, sym2)
   13613 		v.AddArg(ptr)
   13614 		v.AddArg(idx)
   13615 		v.AddArg(mem)
   13616 		return true
   13617 	}
   13618 	// match: (MOVDload [off] {sym} (ADD ptr idx) mem)
   13619 	// cond: ptr.Op != OpSB
   13620 	// result: (MOVDloadidx  [off] {sym} ptr idx mem)
   13621 	for {
   13622 		off := v.AuxInt
   13623 		sym := v.Aux
   13624 		_ = v.Args[1]
   13625 		v_0 := v.Args[0]
   13626 		if v_0.Op != OpS390XADD {
   13627 			break
   13628 		}
   13629 		_ = v_0.Args[1]
   13630 		ptr := v_0.Args[0]
   13631 		idx := v_0.Args[1]
   13632 		mem := v.Args[1]
   13633 		if !(ptr.Op != OpSB) {
   13634 			break
   13635 		}
   13636 		v.reset(OpS390XMOVDloadidx)
   13637 		v.AuxInt = off
   13638 		v.Aux = sym
   13639 		v.AddArg(ptr)
   13640 		v.AddArg(idx)
   13641 		v.AddArg(mem)
   13642 		return true
   13643 	}
   13644 	return false
   13645 }
   13646 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool {
   13647 	// match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   13648 	// cond: is20Bit(c+d)
   13649 	// result: (MOVDloadidx  [c+d] {sym} ptr idx mem)
   13650 	for {
   13651 		c := v.AuxInt
   13652 		sym := v.Aux
   13653 		_ = v.Args[2]
   13654 		v_0 := v.Args[0]
   13655 		if v_0.Op != OpS390XADDconst {
   13656 			break
   13657 		}
   13658 		d := v_0.AuxInt
   13659 		ptr := v_0.Args[0]
   13660 		idx := v.Args[1]
   13661 		mem := v.Args[2]
   13662 		if !(is20Bit(c + d)) {
   13663 			break
   13664 		}
   13665 		v.reset(OpS390XMOVDloadidx)
   13666 		v.AuxInt = c + d
   13667 		v.Aux = sym
   13668 		v.AddArg(ptr)
   13669 		v.AddArg(idx)
   13670 		v.AddArg(mem)
   13671 		return true
   13672 	}
   13673 	// match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   13674 	// cond: is20Bit(c+d)
   13675 	// result: (MOVDloadidx  [c+d] {sym} ptr idx mem)
   13676 	for {
   13677 		c := v.AuxInt
   13678 		sym := v.Aux
   13679 		_ = v.Args[2]
   13680 		idx := v.Args[0]
   13681 		v_1 := v.Args[1]
   13682 		if v_1.Op != OpS390XADDconst {
   13683 			break
   13684 		}
   13685 		d := v_1.AuxInt
   13686 		ptr := v_1.Args[0]
   13687 		mem := v.Args[2]
   13688 		if !(is20Bit(c + d)) {
   13689 			break
   13690 		}
   13691 		v.reset(OpS390XMOVDloadidx)
   13692 		v.AuxInt = c + d
   13693 		v.Aux = sym
   13694 		v.AddArg(ptr)
   13695 		v.AddArg(idx)
   13696 		v.AddArg(mem)
   13697 		return true
   13698 	}
   13699 	// match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   13700 	// cond: is20Bit(c+d)
   13701 	// result: (MOVDloadidx  [c+d] {sym} ptr idx mem)
   13702 	for {
   13703 		c := v.AuxInt
   13704 		sym := v.Aux
   13705 		_ = v.Args[2]
   13706 		ptr := v.Args[0]
   13707 		v_1 := v.Args[1]
   13708 		if v_1.Op != OpS390XADDconst {
   13709 			break
   13710 		}
   13711 		d := v_1.AuxInt
   13712 		idx := v_1.Args[0]
   13713 		mem := v.Args[2]
   13714 		if !(is20Bit(c + d)) {
   13715 			break
   13716 		}
   13717 		v.reset(OpS390XMOVDloadidx)
   13718 		v.AuxInt = c + d
   13719 		v.Aux = sym
   13720 		v.AddArg(ptr)
   13721 		v.AddArg(idx)
   13722 		v.AddArg(mem)
   13723 		return true
   13724 	}
   13725 	// match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   13726 	// cond: is20Bit(c+d)
   13727 	// result: (MOVDloadidx  [c+d] {sym} ptr idx mem)
   13728 	for {
   13729 		c := v.AuxInt
   13730 		sym := v.Aux
   13731 		_ = v.Args[2]
   13732 		v_0 := v.Args[0]
   13733 		if v_0.Op != OpS390XADDconst {
   13734 			break
   13735 		}
   13736 		d := v_0.AuxInt
   13737 		idx := v_0.Args[0]
   13738 		ptr := v.Args[1]
   13739 		mem := v.Args[2]
   13740 		if !(is20Bit(c + d)) {
   13741 			break
   13742 		}
   13743 		v.reset(OpS390XMOVDloadidx)
   13744 		v.AuxInt = c + d
   13745 		v.Aux = sym
   13746 		v.AddArg(ptr)
   13747 		v.AddArg(idx)
   13748 		v.AddArg(mem)
   13749 		return true
   13750 	}
   13751 	return false
   13752 }
   13753 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool {
   13754 	b := v.Block
   13755 	_ = b
   13756 	// match: (MOVDnop <t> x)
   13757 	// cond: t.Compare(x.Type) == types.CMPeq
   13758 	// result: x
   13759 	for {
   13760 		t := v.Type
   13761 		x := v.Args[0]
   13762 		if !(t.Compare(x.Type) == types.CMPeq) {
   13763 			break
   13764 		}
   13765 		v.reset(OpCopy)
   13766 		v.Type = x.Type
   13767 		v.AddArg(x)
   13768 		return true
   13769 	}
   13770 	// match: (MOVDnop (MOVDconst [c]))
   13771 	// cond:
   13772 	// result: (MOVDconst [c])
   13773 	for {
   13774 		v_0 := v.Args[0]
   13775 		if v_0.Op != OpS390XMOVDconst {
   13776 			break
   13777 		}
   13778 		c := v_0.AuxInt
   13779 		v.reset(OpS390XMOVDconst)
   13780 		v.AuxInt = c
   13781 		return true
   13782 	}
   13783 	// match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem))
   13784 	// cond: x.Uses == 1 && clobber(x)
   13785 	// result: @x.Block (MOVBZload <t> [off] {sym} ptr mem)
   13786 	for {
   13787 		t := v.Type
   13788 		x := v.Args[0]
   13789 		if x.Op != OpS390XMOVBZload {
   13790 			break
   13791 		}
   13792 		off := x.AuxInt
   13793 		sym := x.Aux
   13794 		_ = x.Args[1]
   13795 		ptr := x.Args[0]
   13796 		mem := x.Args[1]
   13797 		if !(x.Uses == 1 && clobber(x)) {
   13798 			break
   13799 		}
   13800 		b = x.Block
   13801 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t)
   13802 		v.reset(OpCopy)
   13803 		v.AddArg(v0)
   13804 		v0.AuxInt = off
   13805 		v0.Aux = sym
   13806 		v0.AddArg(ptr)
   13807 		v0.AddArg(mem)
   13808 		return true
   13809 	}
   13810 	// match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem))
   13811 	// cond: x.Uses == 1 && clobber(x)
   13812 	// result: @x.Block (MOVBload  <t> [off] {sym} ptr mem)
   13813 	for {
   13814 		t := v.Type
   13815 		x := v.Args[0]
   13816 		if x.Op != OpS390XMOVBload {
   13817 			break
   13818 		}
   13819 		off := x.AuxInt
   13820 		sym := x.Aux
   13821 		_ = x.Args[1]
   13822 		ptr := x.Args[0]
   13823 		mem := x.Args[1]
   13824 		if !(x.Uses == 1 && clobber(x)) {
   13825 			break
   13826 		}
   13827 		b = x.Block
   13828 		v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t)
   13829 		v.reset(OpCopy)
   13830 		v.AddArg(v0)
   13831 		v0.AuxInt = off
   13832 		v0.Aux = sym
   13833 		v0.AddArg(ptr)
   13834 		v0.AddArg(mem)
   13835 		return true
   13836 	}
   13837 	// match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem))
   13838 	// cond: x.Uses == 1 && clobber(x)
   13839 	// result: @x.Block (MOVHZload <t> [off] {sym} ptr mem)
   13840 	for {
   13841 		t := v.Type
   13842 		x := v.Args[0]
   13843 		if x.Op != OpS390XMOVHZload {
   13844 			break
   13845 		}
   13846 		off := x.AuxInt
   13847 		sym := x.Aux
   13848 		_ = x.Args[1]
   13849 		ptr := x.Args[0]
   13850 		mem := x.Args[1]
   13851 		if !(x.Uses == 1 && clobber(x)) {
   13852 			break
   13853 		}
   13854 		b = x.Block
   13855 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t)
   13856 		v.reset(OpCopy)
   13857 		v.AddArg(v0)
   13858 		v0.AuxInt = off
   13859 		v0.Aux = sym
   13860 		v0.AddArg(ptr)
   13861 		v0.AddArg(mem)
   13862 		return true
   13863 	}
   13864 	// match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem))
   13865 	// cond: x.Uses == 1 && clobber(x)
   13866 	// result: @x.Block (MOVHload  <t> [off] {sym} ptr mem)
   13867 	for {
   13868 		t := v.Type
   13869 		x := v.Args[0]
   13870 		if x.Op != OpS390XMOVHload {
   13871 			break
   13872 		}
   13873 		off := x.AuxInt
   13874 		sym := x.Aux
   13875 		_ = x.Args[1]
   13876 		ptr := x.Args[0]
   13877 		mem := x.Args[1]
   13878 		if !(x.Uses == 1 && clobber(x)) {
   13879 			break
   13880 		}
   13881 		b = x.Block
   13882 		v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t)
   13883 		v.reset(OpCopy)
   13884 		v.AddArg(v0)
   13885 		v0.AuxInt = off
   13886 		v0.Aux = sym
   13887 		v0.AddArg(ptr)
   13888 		v0.AddArg(mem)
   13889 		return true
   13890 	}
   13891 	// match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem))
   13892 	// cond: x.Uses == 1 && clobber(x)
   13893 	// result: @x.Block (MOVWZload <t> [off] {sym} ptr mem)
   13894 	for {
   13895 		t := v.Type
   13896 		x := v.Args[0]
   13897 		if x.Op != OpS390XMOVWZload {
   13898 			break
   13899 		}
   13900 		off := x.AuxInt
   13901 		sym := x.Aux
   13902 		_ = x.Args[1]
   13903 		ptr := x.Args[0]
   13904 		mem := x.Args[1]
   13905 		if !(x.Uses == 1 && clobber(x)) {
   13906 			break
   13907 		}
   13908 		b = x.Block
   13909 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t)
   13910 		v.reset(OpCopy)
   13911 		v.AddArg(v0)
   13912 		v0.AuxInt = off
   13913 		v0.Aux = sym
   13914 		v0.AddArg(ptr)
   13915 		v0.AddArg(mem)
   13916 		return true
   13917 	}
   13918 	// match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem))
   13919 	// cond: x.Uses == 1 && clobber(x)
   13920 	// result: @x.Block (MOVWload  <t> [off] {sym} ptr mem)
   13921 	for {
   13922 		t := v.Type
   13923 		x := v.Args[0]
   13924 		if x.Op != OpS390XMOVWload {
   13925 			break
   13926 		}
   13927 		off := x.AuxInt
   13928 		sym := x.Aux
   13929 		_ = x.Args[1]
   13930 		ptr := x.Args[0]
   13931 		mem := x.Args[1]
   13932 		if !(x.Uses == 1 && clobber(x)) {
   13933 			break
   13934 		}
   13935 		b = x.Block
   13936 		v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t)
   13937 		v.reset(OpCopy)
   13938 		v.AddArg(v0)
   13939 		v0.AuxInt = off
   13940 		v0.Aux = sym
   13941 		v0.AddArg(ptr)
   13942 		v0.AddArg(mem)
   13943 		return true
   13944 	}
   13945 	// match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem))
   13946 	// cond: x.Uses == 1 && clobber(x)
   13947 	// result: @x.Block (MOVDload  <t> [off] {sym} ptr mem)
   13948 	for {
   13949 		t := v.Type
   13950 		x := v.Args[0]
   13951 		if x.Op != OpS390XMOVDload {
   13952 			break
   13953 		}
   13954 		off := x.AuxInt
   13955 		sym := x.Aux
   13956 		_ = x.Args[1]
   13957 		ptr := x.Args[0]
   13958 		mem := x.Args[1]
   13959 		if !(x.Uses == 1 && clobber(x)) {
   13960 			break
   13961 		}
   13962 		b = x.Block
   13963 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t)
   13964 		v.reset(OpCopy)
   13965 		v.AddArg(v0)
   13966 		v0.AuxInt = off
   13967 		v0.Aux = sym
   13968 		v0.AddArg(ptr)
   13969 		v0.AddArg(mem)
   13970 		return true
   13971 	}
   13972 	// match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem))
   13973 	// cond: x.Uses == 1 && clobber(x)
   13974 	// result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem)
   13975 	for {
   13976 		t := v.Type
   13977 		x := v.Args[0]
   13978 		if x.Op != OpS390XMOVBZloadidx {
   13979 			break
   13980 		}
   13981 		off := x.AuxInt
   13982 		sym := x.Aux
   13983 		_ = x.Args[2]
   13984 		ptr := x.Args[0]
   13985 		idx := x.Args[1]
   13986 		mem := x.Args[2]
   13987 		if !(x.Uses == 1 && clobber(x)) {
   13988 			break
   13989 		}
   13990 		b = x.Block
   13991 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t)
   13992 		v.reset(OpCopy)
   13993 		v.AddArg(v0)
   13994 		v0.AuxInt = off
   13995 		v0.Aux = sym
   13996 		v0.AddArg(ptr)
   13997 		v0.AddArg(idx)
   13998 		v0.AddArg(mem)
   13999 		return true
   14000 	}
   14001 	return false
   14002 }
   14003 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool {
   14004 	b := v.Block
   14005 	_ = b
   14006 	// match: (MOVDnop <t> x:(MOVBloadidx [off] {sym} ptr idx mem))
   14007 	// cond: x.Uses == 1 && clobber(x)
   14008 	// result: @x.Block (MOVBloadidx  <t> [off] {sym} ptr idx mem)
   14009 	for {
   14010 		t := v.Type
   14011 		x := v.Args[0]
   14012 		if x.Op != OpS390XMOVBloadidx {
   14013 			break
   14014 		}
   14015 		off := x.AuxInt
   14016 		sym := x.Aux
   14017 		_ = x.Args[2]
   14018 		ptr := x.Args[0]
   14019 		idx := x.Args[1]
   14020 		mem := x.Args[2]
   14021 		if !(x.Uses == 1 && clobber(x)) {
   14022 			break
   14023 		}
   14024 		b = x.Block
   14025 		v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t)
   14026 		v.reset(OpCopy)
   14027 		v.AddArg(v0)
   14028 		v0.AuxInt = off
   14029 		v0.Aux = sym
   14030 		v0.AddArg(ptr)
   14031 		v0.AddArg(idx)
   14032 		v0.AddArg(mem)
   14033 		return true
   14034 	}
   14035 	// match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem))
   14036 	// cond: x.Uses == 1 && clobber(x)
   14037 	// result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem)
   14038 	for {
   14039 		t := v.Type
   14040 		x := v.Args[0]
   14041 		if x.Op != OpS390XMOVHZloadidx {
   14042 			break
   14043 		}
   14044 		off := x.AuxInt
   14045 		sym := x.Aux
   14046 		_ = x.Args[2]
   14047 		ptr := x.Args[0]
   14048 		idx := x.Args[1]
   14049 		mem := x.Args[2]
   14050 		if !(x.Uses == 1 && clobber(x)) {
   14051 			break
   14052 		}
   14053 		b = x.Block
   14054 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t)
   14055 		v.reset(OpCopy)
   14056 		v.AddArg(v0)
   14057 		v0.AuxInt = off
   14058 		v0.Aux = sym
   14059 		v0.AddArg(ptr)
   14060 		v0.AddArg(idx)
   14061 		v0.AddArg(mem)
   14062 		return true
   14063 	}
   14064 	// match: (MOVDnop <t> x:(MOVHloadidx [off] {sym} ptr idx mem))
   14065 	// cond: x.Uses == 1 && clobber(x)
   14066 	// result: @x.Block (MOVHloadidx  <t> [off] {sym} ptr idx mem)
   14067 	for {
   14068 		t := v.Type
   14069 		x := v.Args[0]
   14070 		if x.Op != OpS390XMOVHloadidx {
   14071 			break
   14072 		}
   14073 		off := x.AuxInt
   14074 		sym := x.Aux
   14075 		_ = x.Args[2]
   14076 		ptr := x.Args[0]
   14077 		idx := x.Args[1]
   14078 		mem := x.Args[2]
   14079 		if !(x.Uses == 1 && clobber(x)) {
   14080 			break
   14081 		}
   14082 		b = x.Block
   14083 		v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t)
   14084 		v.reset(OpCopy)
   14085 		v.AddArg(v0)
   14086 		v0.AuxInt = off
   14087 		v0.Aux = sym
   14088 		v0.AddArg(ptr)
   14089 		v0.AddArg(idx)
   14090 		v0.AddArg(mem)
   14091 		return true
   14092 	}
   14093 	// match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem))
   14094 	// cond: x.Uses == 1 && clobber(x)
   14095 	// result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem)
   14096 	for {
   14097 		t := v.Type
   14098 		x := v.Args[0]
   14099 		if x.Op != OpS390XMOVWZloadidx {
   14100 			break
   14101 		}
   14102 		off := x.AuxInt
   14103 		sym := x.Aux
   14104 		_ = x.Args[2]
   14105 		ptr := x.Args[0]
   14106 		idx := x.Args[1]
   14107 		mem := x.Args[2]
   14108 		if !(x.Uses == 1 && clobber(x)) {
   14109 			break
   14110 		}
   14111 		b = x.Block
   14112 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t)
   14113 		v.reset(OpCopy)
   14114 		v.AddArg(v0)
   14115 		v0.AuxInt = off
   14116 		v0.Aux = sym
   14117 		v0.AddArg(ptr)
   14118 		v0.AddArg(idx)
   14119 		v0.AddArg(mem)
   14120 		return true
   14121 	}
   14122 	// match: (MOVDnop <t> x:(MOVWloadidx [off] {sym} ptr idx mem))
   14123 	// cond: x.Uses == 1 && clobber(x)
   14124 	// result: @x.Block (MOVWloadidx  <t> [off] {sym} ptr idx mem)
   14125 	for {
   14126 		t := v.Type
   14127 		x := v.Args[0]
   14128 		if x.Op != OpS390XMOVWloadidx {
   14129 			break
   14130 		}
   14131 		off := x.AuxInt
   14132 		sym := x.Aux
   14133 		_ = x.Args[2]
   14134 		ptr := x.Args[0]
   14135 		idx := x.Args[1]
   14136 		mem := x.Args[2]
   14137 		if !(x.Uses == 1 && clobber(x)) {
   14138 			break
   14139 		}
   14140 		b = x.Block
   14141 		v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t)
   14142 		v.reset(OpCopy)
   14143 		v.AddArg(v0)
   14144 		v0.AuxInt = off
   14145 		v0.Aux = sym
   14146 		v0.AddArg(ptr)
   14147 		v0.AddArg(idx)
   14148 		v0.AddArg(mem)
   14149 		return true
   14150 	}
   14151 	// match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem))
   14152 	// cond: x.Uses == 1 && clobber(x)
   14153 	// result: @x.Block (MOVDloadidx  <t> [off] {sym} ptr idx mem)
   14154 	for {
   14155 		t := v.Type
   14156 		x := v.Args[0]
   14157 		if x.Op != OpS390XMOVDloadidx {
   14158 			break
   14159 		}
   14160 		off := x.AuxInt
   14161 		sym := x.Aux
   14162 		_ = x.Args[2]
   14163 		ptr := x.Args[0]
   14164 		idx := x.Args[1]
   14165 		mem := x.Args[2]
   14166 		if !(x.Uses == 1 && clobber(x)) {
   14167 			break
   14168 		}
   14169 		b = x.Block
   14170 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t)
   14171 		v.reset(OpCopy)
   14172 		v.AddArg(v0)
   14173 		v0.AuxInt = off
   14174 		v0.Aux = sym
   14175 		v0.AddArg(ptr)
   14176 		v0.AddArg(idx)
   14177 		v0.AddArg(mem)
   14178 		return true
   14179 	}
   14180 	return false
   14181 }
   14182 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool {
   14183 	b := v.Block
   14184 	_ = b
   14185 	// match: (MOVDreg <t> x)
   14186 	// cond: t.Compare(x.Type) == types.CMPeq
   14187 	// result: x
   14188 	for {
   14189 		t := v.Type
   14190 		x := v.Args[0]
   14191 		if !(t.Compare(x.Type) == types.CMPeq) {
   14192 			break
   14193 		}
   14194 		v.reset(OpCopy)
   14195 		v.Type = x.Type
   14196 		v.AddArg(x)
   14197 		return true
   14198 	}
   14199 	// match: (MOVDreg (MOVDconst [c]))
   14200 	// cond:
   14201 	// result: (MOVDconst [c])
   14202 	for {
   14203 		v_0 := v.Args[0]
   14204 		if v_0.Op != OpS390XMOVDconst {
   14205 			break
   14206 		}
   14207 		c := v_0.AuxInt
   14208 		v.reset(OpS390XMOVDconst)
   14209 		v.AuxInt = c
   14210 		return true
   14211 	}
   14212 	// match: (MOVDreg x)
   14213 	// cond: x.Uses == 1
   14214 	// result: (MOVDnop x)
   14215 	for {
   14216 		x := v.Args[0]
   14217 		if !(x.Uses == 1) {
   14218 			break
   14219 		}
   14220 		v.reset(OpS390XMOVDnop)
   14221 		v.AddArg(x)
   14222 		return true
   14223 	}
   14224 	// match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem))
   14225 	// cond: x.Uses == 1 && clobber(x)
   14226 	// result: @x.Block (MOVBZload <t> [off] {sym} ptr mem)
   14227 	for {
   14228 		t := v.Type
   14229 		x := v.Args[0]
   14230 		if x.Op != OpS390XMOVBZload {
   14231 			break
   14232 		}
   14233 		off := x.AuxInt
   14234 		sym := x.Aux
   14235 		_ = x.Args[1]
   14236 		ptr := x.Args[0]
   14237 		mem := x.Args[1]
   14238 		if !(x.Uses == 1 && clobber(x)) {
   14239 			break
   14240 		}
   14241 		b = x.Block
   14242 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t)
   14243 		v.reset(OpCopy)
   14244 		v.AddArg(v0)
   14245 		v0.AuxInt = off
   14246 		v0.Aux = sym
   14247 		v0.AddArg(ptr)
   14248 		v0.AddArg(mem)
   14249 		return true
   14250 	}
   14251 	// match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem))
   14252 	// cond: x.Uses == 1 && clobber(x)
   14253 	// result: @x.Block (MOVBload  <t> [off] {sym} ptr mem)
   14254 	for {
   14255 		t := v.Type
   14256 		x := v.Args[0]
   14257 		if x.Op != OpS390XMOVBload {
   14258 			break
   14259 		}
   14260 		off := x.AuxInt
   14261 		sym := x.Aux
   14262 		_ = x.Args[1]
   14263 		ptr := x.Args[0]
   14264 		mem := x.Args[1]
   14265 		if !(x.Uses == 1 && clobber(x)) {
   14266 			break
   14267 		}
   14268 		b = x.Block
   14269 		v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t)
   14270 		v.reset(OpCopy)
   14271 		v.AddArg(v0)
   14272 		v0.AuxInt = off
   14273 		v0.Aux = sym
   14274 		v0.AddArg(ptr)
   14275 		v0.AddArg(mem)
   14276 		return true
   14277 	}
   14278 	// match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem))
   14279 	// cond: x.Uses == 1 && clobber(x)
   14280 	// result: @x.Block (MOVHZload <t> [off] {sym} ptr mem)
   14281 	for {
   14282 		t := v.Type
   14283 		x := v.Args[0]
   14284 		if x.Op != OpS390XMOVHZload {
   14285 			break
   14286 		}
   14287 		off := x.AuxInt
   14288 		sym := x.Aux
   14289 		_ = x.Args[1]
   14290 		ptr := x.Args[0]
   14291 		mem := x.Args[1]
   14292 		if !(x.Uses == 1 && clobber(x)) {
   14293 			break
   14294 		}
   14295 		b = x.Block
   14296 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t)
   14297 		v.reset(OpCopy)
   14298 		v.AddArg(v0)
   14299 		v0.AuxInt = off
   14300 		v0.Aux = sym
   14301 		v0.AddArg(ptr)
   14302 		v0.AddArg(mem)
   14303 		return true
   14304 	}
   14305 	// match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem))
   14306 	// cond: x.Uses == 1 && clobber(x)
   14307 	// result: @x.Block (MOVHload  <t> [off] {sym} ptr mem)
   14308 	for {
   14309 		t := v.Type
   14310 		x := v.Args[0]
   14311 		if x.Op != OpS390XMOVHload {
   14312 			break
   14313 		}
   14314 		off := x.AuxInt
   14315 		sym := x.Aux
   14316 		_ = x.Args[1]
   14317 		ptr := x.Args[0]
   14318 		mem := x.Args[1]
   14319 		if !(x.Uses == 1 && clobber(x)) {
   14320 			break
   14321 		}
   14322 		b = x.Block
   14323 		v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t)
   14324 		v.reset(OpCopy)
   14325 		v.AddArg(v0)
   14326 		v0.AuxInt = off
   14327 		v0.Aux = sym
   14328 		v0.AddArg(ptr)
   14329 		v0.AddArg(mem)
   14330 		return true
   14331 	}
   14332 	// match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem))
   14333 	// cond: x.Uses == 1 && clobber(x)
   14334 	// result: @x.Block (MOVWZload <t> [off] {sym} ptr mem)
   14335 	for {
   14336 		t := v.Type
   14337 		x := v.Args[0]
   14338 		if x.Op != OpS390XMOVWZload {
   14339 			break
   14340 		}
   14341 		off := x.AuxInt
   14342 		sym := x.Aux
   14343 		_ = x.Args[1]
   14344 		ptr := x.Args[0]
   14345 		mem := x.Args[1]
   14346 		if !(x.Uses == 1 && clobber(x)) {
   14347 			break
   14348 		}
   14349 		b = x.Block
   14350 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t)
   14351 		v.reset(OpCopy)
   14352 		v.AddArg(v0)
   14353 		v0.AuxInt = off
   14354 		v0.Aux = sym
   14355 		v0.AddArg(ptr)
   14356 		v0.AddArg(mem)
   14357 		return true
   14358 	}
   14359 	// match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem))
   14360 	// cond: x.Uses == 1 && clobber(x)
   14361 	// result: @x.Block (MOVWload  <t> [off] {sym} ptr mem)
   14362 	for {
   14363 		t := v.Type
   14364 		x := v.Args[0]
   14365 		if x.Op != OpS390XMOVWload {
   14366 			break
   14367 		}
   14368 		off := x.AuxInt
   14369 		sym := x.Aux
   14370 		_ = x.Args[1]
   14371 		ptr := x.Args[0]
   14372 		mem := x.Args[1]
   14373 		if !(x.Uses == 1 && clobber(x)) {
   14374 			break
   14375 		}
   14376 		b = x.Block
   14377 		v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t)
   14378 		v.reset(OpCopy)
   14379 		v.AddArg(v0)
   14380 		v0.AuxInt = off
   14381 		v0.Aux = sym
   14382 		v0.AddArg(ptr)
   14383 		v0.AddArg(mem)
   14384 		return true
   14385 	}
   14386 	// match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem))
   14387 	// cond: x.Uses == 1 && clobber(x)
   14388 	// result: @x.Block (MOVDload  <t> [off] {sym} ptr mem)
   14389 	for {
   14390 		t := v.Type
   14391 		x := v.Args[0]
   14392 		if x.Op != OpS390XMOVDload {
   14393 			break
   14394 		}
   14395 		off := x.AuxInt
   14396 		sym := x.Aux
   14397 		_ = x.Args[1]
   14398 		ptr := x.Args[0]
   14399 		mem := x.Args[1]
   14400 		if !(x.Uses == 1 && clobber(x)) {
   14401 			break
   14402 		}
   14403 		b = x.Block
   14404 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t)
   14405 		v.reset(OpCopy)
   14406 		v.AddArg(v0)
   14407 		v0.AuxInt = off
   14408 		v0.Aux = sym
   14409 		v0.AddArg(ptr)
   14410 		v0.AddArg(mem)
   14411 		return true
   14412 	}
   14413 	return false
   14414 }
   14415 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool {
   14416 	b := v.Block
   14417 	_ = b
   14418 	// match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem))
   14419 	// cond: x.Uses == 1 && clobber(x)
   14420 	// result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem)
   14421 	for {
   14422 		t := v.Type
   14423 		x := v.Args[0]
   14424 		if x.Op != OpS390XMOVBZloadidx {
   14425 			break
   14426 		}
   14427 		off := x.AuxInt
   14428 		sym := x.Aux
   14429 		_ = x.Args[2]
   14430 		ptr := x.Args[0]
   14431 		idx := x.Args[1]
   14432 		mem := x.Args[2]
   14433 		if !(x.Uses == 1 && clobber(x)) {
   14434 			break
   14435 		}
   14436 		b = x.Block
   14437 		v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t)
   14438 		v.reset(OpCopy)
   14439 		v.AddArg(v0)
   14440 		v0.AuxInt = off
   14441 		v0.Aux = sym
   14442 		v0.AddArg(ptr)
   14443 		v0.AddArg(idx)
   14444 		v0.AddArg(mem)
   14445 		return true
   14446 	}
   14447 	// match: (MOVDreg <t> x:(MOVBloadidx [off] {sym} ptr idx mem))
   14448 	// cond: x.Uses == 1 && clobber(x)
   14449 	// result: @x.Block (MOVBloadidx  <t> [off] {sym} ptr idx mem)
   14450 	for {
   14451 		t := v.Type
   14452 		x := v.Args[0]
   14453 		if x.Op != OpS390XMOVBloadidx {
   14454 			break
   14455 		}
   14456 		off := x.AuxInt
   14457 		sym := x.Aux
   14458 		_ = x.Args[2]
   14459 		ptr := x.Args[0]
   14460 		idx := x.Args[1]
   14461 		mem := x.Args[2]
   14462 		if !(x.Uses == 1 && clobber(x)) {
   14463 			break
   14464 		}
   14465 		b = x.Block
   14466 		v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t)
   14467 		v.reset(OpCopy)
   14468 		v.AddArg(v0)
   14469 		v0.AuxInt = off
   14470 		v0.Aux = sym
   14471 		v0.AddArg(ptr)
   14472 		v0.AddArg(idx)
   14473 		v0.AddArg(mem)
   14474 		return true
   14475 	}
   14476 	// match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem))
   14477 	// cond: x.Uses == 1 && clobber(x)
   14478 	// result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem)
   14479 	for {
   14480 		t := v.Type
   14481 		x := v.Args[0]
   14482 		if x.Op != OpS390XMOVHZloadidx {
   14483 			break
   14484 		}
   14485 		off := x.AuxInt
   14486 		sym := x.Aux
   14487 		_ = x.Args[2]
   14488 		ptr := x.Args[0]
   14489 		idx := x.Args[1]
   14490 		mem := x.Args[2]
   14491 		if !(x.Uses == 1 && clobber(x)) {
   14492 			break
   14493 		}
   14494 		b = x.Block
   14495 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t)
   14496 		v.reset(OpCopy)
   14497 		v.AddArg(v0)
   14498 		v0.AuxInt = off
   14499 		v0.Aux = sym
   14500 		v0.AddArg(ptr)
   14501 		v0.AddArg(idx)
   14502 		v0.AddArg(mem)
   14503 		return true
   14504 	}
   14505 	// match: (MOVDreg <t> x:(MOVHloadidx [off] {sym} ptr idx mem))
   14506 	// cond: x.Uses == 1 && clobber(x)
   14507 	// result: @x.Block (MOVHloadidx  <t> [off] {sym} ptr idx mem)
   14508 	for {
   14509 		t := v.Type
   14510 		x := v.Args[0]
   14511 		if x.Op != OpS390XMOVHloadidx {
   14512 			break
   14513 		}
   14514 		off := x.AuxInt
   14515 		sym := x.Aux
   14516 		_ = x.Args[2]
   14517 		ptr := x.Args[0]
   14518 		idx := x.Args[1]
   14519 		mem := x.Args[2]
   14520 		if !(x.Uses == 1 && clobber(x)) {
   14521 			break
   14522 		}
   14523 		b = x.Block
   14524 		v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t)
   14525 		v.reset(OpCopy)
   14526 		v.AddArg(v0)
   14527 		v0.AuxInt = off
   14528 		v0.Aux = sym
   14529 		v0.AddArg(ptr)
   14530 		v0.AddArg(idx)
   14531 		v0.AddArg(mem)
   14532 		return true
   14533 	}
   14534 	// match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem))
   14535 	// cond: x.Uses == 1 && clobber(x)
   14536 	// result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem)
   14537 	for {
   14538 		t := v.Type
   14539 		x := v.Args[0]
   14540 		if x.Op != OpS390XMOVWZloadidx {
   14541 			break
   14542 		}
   14543 		off := x.AuxInt
   14544 		sym := x.Aux
   14545 		_ = x.Args[2]
   14546 		ptr := x.Args[0]
   14547 		idx := x.Args[1]
   14548 		mem := x.Args[2]
   14549 		if !(x.Uses == 1 && clobber(x)) {
   14550 			break
   14551 		}
   14552 		b = x.Block
   14553 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t)
   14554 		v.reset(OpCopy)
   14555 		v.AddArg(v0)
   14556 		v0.AuxInt = off
   14557 		v0.Aux = sym
   14558 		v0.AddArg(ptr)
   14559 		v0.AddArg(idx)
   14560 		v0.AddArg(mem)
   14561 		return true
   14562 	}
   14563 	// match: (MOVDreg <t> x:(MOVWloadidx [off] {sym} ptr idx mem))
   14564 	// cond: x.Uses == 1 && clobber(x)
   14565 	// result: @x.Block (MOVWloadidx  <t> [off] {sym} ptr idx mem)
   14566 	for {
   14567 		t := v.Type
   14568 		x := v.Args[0]
   14569 		if x.Op != OpS390XMOVWloadidx {
   14570 			break
   14571 		}
   14572 		off := x.AuxInt
   14573 		sym := x.Aux
   14574 		_ = x.Args[2]
   14575 		ptr := x.Args[0]
   14576 		idx := x.Args[1]
   14577 		mem := x.Args[2]
   14578 		if !(x.Uses == 1 && clobber(x)) {
   14579 			break
   14580 		}
   14581 		b = x.Block
   14582 		v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t)
   14583 		v.reset(OpCopy)
   14584 		v.AddArg(v0)
   14585 		v0.AuxInt = off
   14586 		v0.Aux = sym
   14587 		v0.AddArg(ptr)
   14588 		v0.AddArg(idx)
   14589 		v0.AddArg(mem)
   14590 		return true
   14591 	}
   14592 	// match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem))
   14593 	// cond: x.Uses == 1 && clobber(x)
   14594 	// result: @x.Block (MOVDloadidx  <t> [off] {sym} ptr idx mem)
   14595 	for {
   14596 		t := v.Type
   14597 		x := v.Args[0]
   14598 		if x.Op != OpS390XMOVDloadidx {
   14599 			break
   14600 		}
   14601 		off := x.AuxInt
   14602 		sym := x.Aux
   14603 		_ = x.Args[2]
   14604 		ptr := x.Args[0]
   14605 		idx := x.Args[1]
   14606 		mem := x.Args[2]
   14607 		if !(x.Uses == 1 && clobber(x)) {
   14608 			break
   14609 		}
   14610 		b = x.Block
   14611 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t)
   14612 		v.reset(OpCopy)
   14613 		v.AddArg(v0)
   14614 		v0.AuxInt = off
   14615 		v0.Aux = sym
   14616 		v0.AddArg(ptr)
   14617 		v0.AddArg(idx)
   14618 		v0.AddArg(mem)
   14619 		return true
   14620 	}
   14621 	return false
   14622 }
   14623 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool {
   14624 	// match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem)
   14625 	// cond: is20Bit(off1+off2)
   14626 	// result: (MOVDstore  [off1+off2] {sym} ptr val mem)
   14627 	for {
   14628 		off1 := v.AuxInt
   14629 		sym := v.Aux
   14630 		_ = v.Args[2]
   14631 		v_0 := v.Args[0]
   14632 		if v_0.Op != OpS390XADDconst {
   14633 			break
   14634 		}
   14635 		off2 := v_0.AuxInt
   14636 		ptr := v_0.Args[0]
   14637 		val := v.Args[1]
   14638 		mem := v.Args[2]
   14639 		if !(is20Bit(off1 + off2)) {
   14640 			break
   14641 		}
   14642 		v.reset(OpS390XMOVDstore)
   14643 		v.AuxInt = off1 + off2
   14644 		v.Aux = sym
   14645 		v.AddArg(ptr)
   14646 		v.AddArg(val)
   14647 		v.AddArg(mem)
   14648 		return true
   14649 	}
   14650 	// match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem)
   14651 	// cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB
   14652 	// result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem)
   14653 	for {
   14654 		off := v.AuxInt
   14655 		sym := v.Aux
   14656 		_ = v.Args[2]
   14657 		ptr := v.Args[0]
   14658 		v_1 := v.Args[1]
   14659 		if v_1.Op != OpS390XMOVDconst {
   14660 			break
   14661 		}
   14662 		c := v_1.AuxInt
   14663 		mem := v.Args[2]
   14664 		if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) {
   14665 			break
   14666 		}
   14667 		v.reset(OpS390XMOVDstoreconst)
   14668 		v.AuxInt = makeValAndOff(c, off)
   14669 		v.Aux = sym
   14670 		v.AddArg(ptr)
   14671 		v.AddArg(mem)
   14672 		return true
   14673 	}
   14674 	// match: (MOVDstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem)
   14675 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))
   14676 	// result: (MOVDstore  [off1+off2] {mergeSym(sym1,sym2)} base val mem)
   14677 	for {
   14678 		off1 := v.AuxInt
   14679 		sym1 := v.Aux
   14680 		_ = v.Args[2]
   14681 		v_0 := v.Args[0]
   14682 		if v_0.Op != OpS390XMOVDaddr {
   14683 			break
   14684 		}
   14685 		t := v_0.Type
   14686 		off2 := v_0.AuxInt
   14687 		sym2 := v_0.Aux
   14688 		base := v_0.Args[0]
   14689 		val := v.Args[1]
   14690 		mem := v.Args[2]
   14691 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) {
   14692 			break
   14693 		}
   14694 		v.reset(OpS390XMOVDstore)
   14695 		v.AuxInt = off1 + off2
   14696 		v.Aux = mergeSym(sym1, sym2)
   14697 		v.AddArg(base)
   14698 		v.AddArg(val)
   14699 		v.AddArg(mem)
   14700 		return true
   14701 	}
   14702 	// match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
   14703 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   14704 	// result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
   14705 	for {
   14706 		off1 := v.AuxInt
   14707 		sym1 := v.Aux
   14708 		_ = v.Args[2]
   14709 		v_0 := v.Args[0]
   14710 		if v_0.Op != OpS390XMOVDaddridx {
   14711 			break
   14712 		}
   14713 		off2 := v_0.AuxInt
   14714 		sym2 := v_0.Aux
   14715 		_ = v_0.Args[1]
   14716 		ptr := v_0.Args[0]
   14717 		idx := v_0.Args[1]
   14718 		val := v.Args[1]
   14719 		mem := v.Args[2]
   14720 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   14721 			break
   14722 		}
   14723 		v.reset(OpS390XMOVDstoreidx)
   14724 		v.AuxInt = off1 + off2
   14725 		v.Aux = mergeSym(sym1, sym2)
   14726 		v.AddArg(ptr)
   14727 		v.AddArg(idx)
   14728 		v.AddArg(val)
   14729 		v.AddArg(mem)
   14730 		return true
   14731 	}
   14732 	// match: (MOVDstore [off] {sym} (ADD ptr idx) val mem)
   14733 	// cond: ptr.Op != OpSB
   14734 	// result: (MOVDstoreidx  [off] {sym} ptr idx val mem)
   14735 	for {
   14736 		off := v.AuxInt
   14737 		sym := v.Aux
   14738 		_ = v.Args[2]
   14739 		v_0 := v.Args[0]
   14740 		if v_0.Op != OpS390XADD {
   14741 			break
   14742 		}
   14743 		_ = v_0.Args[1]
   14744 		ptr := v_0.Args[0]
   14745 		idx := v_0.Args[1]
   14746 		val := v.Args[1]
   14747 		mem := v.Args[2]
   14748 		if !(ptr.Op != OpSB) {
   14749 			break
   14750 		}
   14751 		v.reset(OpS390XMOVDstoreidx)
   14752 		v.AuxInt = off
   14753 		v.Aux = sym
   14754 		v.AddArg(ptr)
   14755 		v.AddArg(idx)
   14756 		v.AddArg(val)
   14757 		v.AddArg(mem)
   14758 		return true
   14759 	}
   14760 	// match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem))
   14761 	// cond: p.Op != OpSB   && x.Uses == 1   && is20Bit(i-8)   && clobber(x)
   14762 	// result: (STMG2 [i-8] {s} p w0 w1 mem)
   14763 	for {
   14764 		i := v.AuxInt
   14765 		s := v.Aux
   14766 		_ = v.Args[2]
   14767 		p := v.Args[0]
   14768 		w1 := v.Args[1]
   14769 		x := v.Args[2]
   14770 		if x.Op != OpS390XMOVDstore {
   14771 			break
   14772 		}
   14773 		if x.AuxInt != i-8 {
   14774 			break
   14775 		}
   14776 		if x.Aux != s {
   14777 			break
   14778 		}
   14779 		_ = x.Args[2]
   14780 		if p != x.Args[0] {
   14781 			break
   14782 		}
   14783 		w0 := x.Args[1]
   14784 		mem := x.Args[2]
   14785 		if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) {
   14786 			break
   14787 		}
   14788 		v.reset(OpS390XSTMG2)
   14789 		v.AuxInt = i - 8
   14790 		v.Aux = s
   14791 		v.AddArg(p)
   14792 		v.AddArg(w0)
   14793 		v.AddArg(w1)
   14794 		v.AddArg(mem)
   14795 		return true
   14796 	}
   14797 	// match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem))
   14798 	// cond: x.Uses == 1   && is20Bit(i-16)   && clobber(x)
   14799 	// result: (STMG3 [i-16] {s} p w0 w1 w2 mem)
   14800 	for {
   14801 		i := v.AuxInt
   14802 		s := v.Aux
   14803 		_ = v.Args[2]
   14804 		p := v.Args[0]
   14805 		w2 := v.Args[1]
   14806 		x := v.Args[2]
   14807 		if x.Op != OpS390XSTMG2 {
   14808 			break
   14809 		}
   14810 		if x.AuxInt != i-16 {
   14811 			break
   14812 		}
   14813 		if x.Aux != s {
   14814 			break
   14815 		}
   14816 		_ = x.Args[3]
   14817 		if p != x.Args[0] {
   14818 			break
   14819 		}
   14820 		w0 := x.Args[1]
   14821 		w1 := x.Args[2]
   14822 		mem := x.Args[3]
   14823 		if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) {
   14824 			break
   14825 		}
   14826 		v.reset(OpS390XSTMG3)
   14827 		v.AuxInt = i - 16
   14828 		v.Aux = s
   14829 		v.AddArg(p)
   14830 		v.AddArg(w0)
   14831 		v.AddArg(w1)
   14832 		v.AddArg(w2)
   14833 		v.AddArg(mem)
   14834 		return true
   14835 	}
   14836 	// match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem))
   14837 	// cond: x.Uses == 1   && is20Bit(i-24)   && clobber(x)
   14838 	// result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem)
   14839 	for {
   14840 		i := v.AuxInt
   14841 		s := v.Aux
   14842 		_ = v.Args[2]
   14843 		p := v.Args[0]
   14844 		w3 := v.Args[1]
   14845 		x := v.Args[2]
   14846 		if x.Op != OpS390XSTMG3 {
   14847 			break
   14848 		}
   14849 		if x.AuxInt != i-24 {
   14850 			break
   14851 		}
   14852 		if x.Aux != s {
   14853 			break
   14854 		}
   14855 		_ = x.Args[4]
   14856 		if p != x.Args[0] {
   14857 			break
   14858 		}
   14859 		w0 := x.Args[1]
   14860 		w1 := x.Args[2]
   14861 		w2 := x.Args[3]
   14862 		mem := x.Args[4]
   14863 		if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) {
   14864 			break
   14865 		}
   14866 		v.reset(OpS390XSTMG4)
   14867 		v.AuxInt = i - 24
   14868 		v.Aux = s
   14869 		v.AddArg(p)
   14870 		v.AddArg(w0)
   14871 		v.AddArg(w1)
   14872 		v.AddArg(w2)
   14873 		v.AddArg(w3)
   14874 		v.AddArg(mem)
   14875 		return true
   14876 	}
   14877 	return false
   14878 }
   14879 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool {
   14880 	// match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem)
   14881 	// cond: isU12Bit(ValAndOff(sc).Off()+off)
   14882 	// result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem)
   14883 	for {
   14884 		sc := v.AuxInt
   14885 		s := v.Aux
   14886 		_ = v.Args[1]
   14887 		v_0 := v.Args[0]
   14888 		if v_0.Op != OpS390XADDconst {
   14889 			break
   14890 		}
   14891 		off := v_0.AuxInt
   14892 		ptr := v_0.Args[0]
   14893 		mem := v.Args[1]
   14894 		if !(isU12Bit(ValAndOff(sc).Off() + off)) {
   14895 			break
   14896 		}
   14897 		v.reset(OpS390XMOVDstoreconst)
   14898 		v.AuxInt = ValAndOff(sc).add(off)
   14899 		v.Aux = s
   14900 		v.AddArg(ptr)
   14901 		v.AddArg(mem)
   14902 		return true
   14903 	}
   14904 	// match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem)
   14905 	// cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)
   14906 	// result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem)
   14907 	for {
   14908 		sc := v.AuxInt
   14909 		sym1 := v.Aux
   14910 		_ = v.Args[1]
   14911 		v_0 := v.Args[0]
   14912 		if v_0.Op != OpS390XMOVDaddr {
   14913 			break
   14914 		}
   14915 		off := v_0.AuxInt
   14916 		sym2 := v_0.Aux
   14917 		ptr := v_0.Args[0]
   14918 		mem := v.Args[1]
   14919 		if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) {
   14920 			break
   14921 		}
   14922 		v.reset(OpS390XMOVDstoreconst)
   14923 		v.AuxInt = ValAndOff(sc).add(off)
   14924 		v.Aux = mergeSym(sym1, sym2)
   14925 		v.AddArg(ptr)
   14926 		v.AddArg(mem)
   14927 		return true
   14928 	}
   14929 	return false
   14930 }
   14931 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool {
   14932 	// match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
   14933 	// cond: is20Bit(c+d)
   14934 	// result: (MOVDstoreidx  [c+d] {sym} ptr idx val mem)
   14935 	for {
   14936 		c := v.AuxInt
   14937 		sym := v.Aux
   14938 		_ = v.Args[3]
   14939 		v_0 := v.Args[0]
   14940 		if v_0.Op != OpS390XADDconst {
   14941 			break
   14942 		}
   14943 		d := v_0.AuxInt
   14944 		ptr := v_0.Args[0]
   14945 		idx := v.Args[1]
   14946 		val := v.Args[2]
   14947 		mem := v.Args[3]
   14948 		if !(is20Bit(c + d)) {
   14949 			break
   14950 		}
   14951 		v.reset(OpS390XMOVDstoreidx)
   14952 		v.AuxInt = c + d
   14953 		v.Aux = sym
   14954 		v.AddArg(ptr)
   14955 		v.AddArg(idx)
   14956 		v.AddArg(val)
   14957 		v.AddArg(mem)
   14958 		return true
   14959 	}
   14960 	// match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem)
   14961 	// cond: is20Bit(c+d)
   14962 	// result: (MOVDstoreidx  [c+d] {sym} ptr idx val mem)
   14963 	for {
   14964 		c := v.AuxInt
   14965 		sym := v.Aux
   14966 		_ = v.Args[3]
   14967 		idx := v.Args[0]
   14968 		v_1 := v.Args[1]
   14969 		if v_1.Op != OpS390XADDconst {
   14970 			break
   14971 		}
   14972 		d := v_1.AuxInt
   14973 		ptr := v_1.Args[0]
   14974 		val := v.Args[2]
   14975 		mem := v.Args[3]
   14976 		if !(is20Bit(c + d)) {
   14977 			break
   14978 		}
   14979 		v.reset(OpS390XMOVDstoreidx)
   14980 		v.AuxInt = c + d
   14981 		v.Aux = sym
   14982 		v.AddArg(ptr)
   14983 		v.AddArg(idx)
   14984 		v.AddArg(val)
   14985 		v.AddArg(mem)
   14986 		return true
   14987 	}
   14988 	// match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
   14989 	// cond: is20Bit(c+d)
   14990 	// result: (MOVDstoreidx  [c+d] {sym} ptr idx val mem)
   14991 	for {
   14992 		c := v.AuxInt
   14993 		sym := v.Aux
   14994 		_ = v.Args[3]
   14995 		ptr := v.Args[0]
   14996 		v_1 := v.Args[1]
   14997 		if v_1.Op != OpS390XADDconst {
   14998 			break
   14999 		}
   15000 		d := v_1.AuxInt
   15001 		idx := v_1.Args[0]
   15002 		val := v.Args[2]
   15003 		mem := v.Args[3]
   15004 		if !(is20Bit(c + d)) {
   15005 			break
   15006 		}
   15007 		v.reset(OpS390XMOVDstoreidx)
   15008 		v.AuxInt = c + d
   15009 		v.Aux = sym
   15010 		v.AddArg(ptr)
   15011 		v.AddArg(idx)
   15012 		v.AddArg(val)
   15013 		v.AddArg(mem)
   15014 		return true
   15015 	}
   15016 	// match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem)
   15017 	// cond: is20Bit(c+d)
   15018 	// result: (MOVDstoreidx  [c+d] {sym} ptr idx val mem)
   15019 	for {
   15020 		c := v.AuxInt
   15021 		sym := v.Aux
   15022 		_ = v.Args[3]
   15023 		v_0 := v.Args[0]
   15024 		if v_0.Op != OpS390XADDconst {
   15025 			break
   15026 		}
   15027 		d := v_0.AuxInt
   15028 		idx := v_0.Args[0]
   15029 		ptr := v.Args[1]
   15030 		val := v.Args[2]
   15031 		mem := v.Args[3]
   15032 		if !(is20Bit(c + d)) {
   15033 			break
   15034 		}
   15035 		v.reset(OpS390XMOVDstoreidx)
   15036 		v.AuxInt = c + d
   15037 		v.Aux = sym
   15038 		v.AddArg(ptr)
   15039 		v.AddArg(idx)
   15040 		v.AddArg(val)
   15041 		v.AddArg(mem)
   15042 		return true
   15043 	}
   15044 	return false
   15045 }
   15046 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool {
   15047 	// match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem))
   15048 	// cond: x.Uses == 1   && clobber(x)
   15049 	// result: (MOVWBRstore [i-2] {s} p w mem)
   15050 	for {
   15051 		i := v.AuxInt
   15052 		s := v.Aux
   15053 		_ = v.Args[2]
   15054 		p := v.Args[0]
   15055 		v_1 := v.Args[1]
   15056 		if v_1.Op != OpS390XSRDconst {
   15057 			break
   15058 		}
   15059 		if v_1.AuxInt != 16 {
   15060 			break
   15061 		}
   15062 		w := v_1.Args[0]
   15063 		x := v.Args[2]
   15064 		if x.Op != OpS390XMOVHBRstore {
   15065 			break
   15066 		}
   15067 		if x.AuxInt != i-2 {
   15068 			break
   15069 		}
   15070 		if x.Aux != s {
   15071 			break
   15072 		}
   15073 		_ = x.Args[2]
   15074 		if p != x.Args[0] {
   15075 			break
   15076 		}
   15077 		if w != x.Args[1] {
   15078 			break
   15079 		}
   15080 		mem := x.Args[2]
   15081 		if !(x.Uses == 1 && clobber(x)) {
   15082 			break
   15083 		}
   15084 		v.reset(OpS390XMOVWBRstore)
   15085 		v.AuxInt = i - 2
   15086 		v.Aux = s
   15087 		v.AddArg(p)
   15088 		v.AddArg(w)
   15089 		v.AddArg(mem)
   15090 		return true
   15091 	}
   15092 	// match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem))
   15093 	// cond: x.Uses == 1   && clobber(x)
   15094 	// result: (MOVWBRstore [i-2] {s} p w0 mem)
   15095 	for {
   15096 		i := v.AuxInt
   15097 		s := v.Aux
   15098 		_ = v.Args[2]
   15099 		p := v.Args[0]
   15100 		v_1 := v.Args[1]
   15101 		if v_1.Op != OpS390XSRDconst {
   15102 			break
   15103 		}
   15104 		j := v_1.AuxInt
   15105 		w := v_1.Args[0]
   15106 		x := v.Args[2]
   15107 		if x.Op != OpS390XMOVHBRstore {
   15108 			break
   15109 		}
   15110 		if x.AuxInt != i-2 {
   15111 			break
   15112 		}
   15113 		if x.Aux != s {
   15114 			break
   15115 		}
   15116 		_ = x.Args[2]
   15117 		if p != x.Args[0] {
   15118 			break
   15119 		}
   15120 		w0 := x.Args[1]
   15121 		if w0.Op != OpS390XSRDconst {
   15122 			break
   15123 		}
   15124 		if w0.AuxInt != j-16 {
   15125 			break
   15126 		}
   15127 		if w != w0.Args[0] {
   15128 			break
   15129 		}
   15130 		mem := x.Args[2]
   15131 		if !(x.Uses == 1 && clobber(x)) {
   15132 			break
   15133 		}
   15134 		v.reset(OpS390XMOVWBRstore)
   15135 		v.AuxInt = i - 2
   15136 		v.Aux = s
   15137 		v.AddArg(p)
   15138 		v.AddArg(w0)
   15139 		v.AddArg(mem)
   15140 		return true
   15141 	}
   15142 	// match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem))
   15143 	// cond: x.Uses == 1   && clobber(x)
   15144 	// result: (MOVWBRstore [i-2] {s} p w mem)
   15145 	for {
   15146 		i := v.AuxInt
   15147 		s := v.Aux
   15148 		_ = v.Args[2]
   15149 		p := v.Args[0]
   15150 		v_1 := v.Args[1]
   15151 		if v_1.Op != OpS390XSRWconst {
   15152 			break
   15153 		}
   15154 		if v_1.AuxInt != 16 {
   15155 			break
   15156 		}
   15157 		w := v_1.Args[0]
   15158 		x := v.Args[2]
   15159 		if x.Op != OpS390XMOVHBRstore {
   15160 			break
   15161 		}
   15162 		if x.AuxInt != i-2 {
   15163 			break
   15164 		}
   15165 		if x.Aux != s {
   15166 			break
   15167 		}
   15168 		_ = x.Args[2]
   15169 		if p != x.Args[0] {
   15170 			break
   15171 		}
   15172 		if w != x.Args[1] {
   15173 			break
   15174 		}
   15175 		mem := x.Args[2]
   15176 		if !(x.Uses == 1 && clobber(x)) {
   15177 			break
   15178 		}
   15179 		v.reset(OpS390XMOVWBRstore)
   15180 		v.AuxInt = i - 2
   15181 		v.Aux = s
   15182 		v.AddArg(p)
   15183 		v.AddArg(w)
   15184 		v.AddArg(mem)
   15185 		return true
   15186 	}
   15187 	// match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem))
   15188 	// cond: x.Uses == 1   && clobber(x)
   15189 	// result: (MOVWBRstore [i-2] {s} p w0 mem)
   15190 	for {
   15191 		i := v.AuxInt
   15192 		s := v.Aux
   15193 		_ = v.Args[2]
   15194 		p := v.Args[0]
   15195 		v_1 := v.Args[1]
   15196 		if v_1.Op != OpS390XSRWconst {
   15197 			break
   15198 		}
   15199 		j := v_1.AuxInt
   15200 		w := v_1.Args[0]
   15201 		x := v.Args[2]
   15202 		if x.Op != OpS390XMOVHBRstore {
   15203 			break
   15204 		}
   15205 		if x.AuxInt != i-2 {
   15206 			break
   15207 		}
   15208 		if x.Aux != s {
   15209 			break
   15210 		}
   15211 		_ = x.Args[2]
   15212 		if p != x.Args[0] {
   15213 			break
   15214 		}
   15215 		w0 := x.Args[1]
   15216 		if w0.Op != OpS390XSRWconst {
   15217 			break
   15218 		}
   15219 		if w0.AuxInt != j-16 {
   15220 			break
   15221 		}
   15222 		if w != w0.Args[0] {
   15223 			break
   15224 		}
   15225 		mem := x.Args[2]
   15226 		if !(x.Uses == 1 && clobber(x)) {
   15227 			break
   15228 		}
   15229 		v.reset(OpS390XMOVWBRstore)
   15230 		v.AuxInt = i - 2
   15231 		v.Aux = s
   15232 		v.AddArg(p)
   15233 		v.AddArg(w0)
   15234 		v.AddArg(mem)
   15235 		return true
   15236 	}
   15237 	return false
   15238 }
   15239 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool {
   15240 	// match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem))
   15241 	// cond: x.Uses == 1   && clobber(x)
   15242 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15243 	for {
   15244 		i := v.AuxInt
   15245 		s := v.Aux
   15246 		_ = v.Args[3]
   15247 		p := v.Args[0]
   15248 		idx := v.Args[1]
   15249 		v_2 := v.Args[2]
   15250 		if v_2.Op != OpS390XSRDconst {
   15251 			break
   15252 		}
   15253 		if v_2.AuxInt != 16 {
   15254 			break
   15255 		}
   15256 		w := v_2.Args[0]
   15257 		x := v.Args[3]
   15258 		if x.Op != OpS390XMOVHBRstoreidx {
   15259 			break
   15260 		}
   15261 		if x.AuxInt != i-2 {
   15262 			break
   15263 		}
   15264 		if x.Aux != s {
   15265 			break
   15266 		}
   15267 		_ = x.Args[3]
   15268 		if p != x.Args[0] {
   15269 			break
   15270 		}
   15271 		if idx != x.Args[1] {
   15272 			break
   15273 		}
   15274 		if w != x.Args[2] {
   15275 			break
   15276 		}
   15277 		mem := x.Args[3]
   15278 		if !(x.Uses == 1 && clobber(x)) {
   15279 			break
   15280 		}
   15281 		v.reset(OpS390XMOVWBRstoreidx)
   15282 		v.AuxInt = i - 2
   15283 		v.Aux = s
   15284 		v.AddArg(p)
   15285 		v.AddArg(idx)
   15286 		v.AddArg(w)
   15287 		v.AddArg(mem)
   15288 		return true
   15289 	}
   15290 	// match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem))
   15291 	// cond: x.Uses == 1   && clobber(x)
   15292 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15293 	for {
   15294 		i := v.AuxInt
   15295 		s := v.Aux
   15296 		_ = v.Args[3]
   15297 		p := v.Args[0]
   15298 		idx := v.Args[1]
   15299 		v_2 := v.Args[2]
   15300 		if v_2.Op != OpS390XSRDconst {
   15301 			break
   15302 		}
   15303 		if v_2.AuxInt != 16 {
   15304 			break
   15305 		}
   15306 		w := v_2.Args[0]
   15307 		x := v.Args[3]
   15308 		if x.Op != OpS390XMOVHBRstoreidx {
   15309 			break
   15310 		}
   15311 		if x.AuxInt != i-2 {
   15312 			break
   15313 		}
   15314 		if x.Aux != s {
   15315 			break
   15316 		}
   15317 		_ = x.Args[3]
   15318 		if idx != x.Args[0] {
   15319 			break
   15320 		}
   15321 		if p != x.Args[1] {
   15322 			break
   15323 		}
   15324 		if w != x.Args[2] {
   15325 			break
   15326 		}
   15327 		mem := x.Args[3]
   15328 		if !(x.Uses == 1 && clobber(x)) {
   15329 			break
   15330 		}
   15331 		v.reset(OpS390XMOVWBRstoreidx)
   15332 		v.AuxInt = i - 2
   15333 		v.Aux = s
   15334 		v.AddArg(p)
   15335 		v.AddArg(idx)
   15336 		v.AddArg(w)
   15337 		v.AddArg(mem)
   15338 		return true
   15339 	}
   15340 	// match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem))
   15341 	// cond: x.Uses == 1   && clobber(x)
   15342 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15343 	for {
   15344 		i := v.AuxInt
   15345 		s := v.Aux
   15346 		_ = v.Args[3]
   15347 		idx := v.Args[0]
   15348 		p := v.Args[1]
   15349 		v_2 := v.Args[2]
   15350 		if v_2.Op != OpS390XSRDconst {
   15351 			break
   15352 		}
   15353 		if v_2.AuxInt != 16 {
   15354 			break
   15355 		}
   15356 		w := v_2.Args[0]
   15357 		x := v.Args[3]
   15358 		if x.Op != OpS390XMOVHBRstoreidx {
   15359 			break
   15360 		}
   15361 		if x.AuxInt != i-2 {
   15362 			break
   15363 		}
   15364 		if x.Aux != s {
   15365 			break
   15366 		}
   15367 		_ = x.Args[3]
   15368 		if p != x.Args[0] {
   15369 			break
   15370 		}
   15371 		if idx != x.Args[1] {
   15372 			break
   15373 		}
   15374 		if w != x.Args[2] {
   15375 			break
   15376 		}
   15377 		mem := x.Args[3]
   15378 		if !(x.Uses == 1 && clobber(x)) {
   15379 			break
   15380 		}
   15381 		v.reset(OpS390XMOVWBRstoreidx)
   15382 		v.AuxInt = i - 2
   15383 		v.Aux = s
   15384 		v.AddArg(p)
   15385 		v.AddArg(idx)
   15386 		v.AddArg(w)
   15387 		v.AddArg(mem)
   15388 		return true
   15389 	}
   15390 	// match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem))
   15391 	// cond: x.Uses == 1   && clobber(x)
   15392 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15393 	for {
   15394 		i := v.AuxInt
   15395 		s := v.Aux
   15396 		_ = v.Args[3]
   15397 		idx := v.Args[0]
   15398 		p := v.Args[1]
   15399 		v_2 := v.Args[2]
   15400 		if v_2.Op != OpS390XSRDconst {
   15401 			break
   15402 		}
   15403 		if v_2.AuxInt != 16 {
   15404 			break
   15405 		}
   15406 		w := v_2.Args[0]
   15407 		x := v.Args[3]
   15408 		if x.Op != OpS390XMOVHBRstoreidx {
   15409 			break
   15410 		}
   15411 		if x.AuxInt != i-2 {
   15412 			break
   15413 		}
   15414 		if x.Aux != s {
   15415 			break
   15416 		}
   15417 		_ = x.Args[3]
   15418 		if idx != x.Args[0] {
   15419 			break
   15420 		}
   15421 		if p != x.Args[1] {
   15422 			break
   15423 		}
   15424 		if w != x.Args[2] {
   15425 			break
   15426 		}
   15427 		mem := x.Args[3]
   15428 		if !(x.Uses == 1 && clobber(x)) {
   15429 			break
   15430 		}
   15431 		v.reset(OpS390XMOVWBRstoreidx)
   15432 		v.AuxInt = i - 2
   15433 		v.Aux = s
   15434 		v.AddArg(p)
   15435 		v.AddArg(idx)
   15436 		v.AddArg(w)
   15437 		v.AddArg(mem)
   15438 		return true
   15439 	}
   15440 	// match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem))
   15441 	// cond: x.Uses == 1   && clobber(x)
   15442 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15443 	for {
   15444 		i := v.AuxInt
   15445 		s := v.Aux
   15446 		_ = v.Args[3]
   15447 		p := v.Args[0]
   15448 		idx := v.Args[1]
   15449 		v_2 := v.Args[2]
   15450 		if v_2.Op != OpS390XSRDconst {
   15451 			break
   15452 		}
   15453 		j := v_2.AuxInt
   15454 		w := v_2.Args[0]
   15455 		x := v.Args[3]
   15456 		if x.Op != OpS390XMOVHBRstoreidx {
   15457 			break
   15458 		}
   15459 		if x.AuxInt != i-2 {
   15460 			break
   15461 		}
   15462 		if x.Aux != s {
   15463 			break
   15464 		}
   15465 		_ = x.Args[3]
   15466 		if p != x.Args[0] {
   15467 			break
   15468 		}
   15469 		if idx != x.Args[1] {
   15470 			break
   15471 		}
   15472 		w0 := x.Args[2]
   15473 		if w0.Op != OpS390XSRDconst {
   15474 			break
   15475 		}
   15476 		if w0.AuxInt != j-16 {
   15477 			break
   15478 		}
   15479 		if w != w0.Args[0] {
   15480 			break
   15481 		}
   15482 		mem := x.Args[3]
   15483 		if !(x.Uses == 1 && clobber(x)) {
   15484 			break
   15485 		}
   15486 		v.reset(OpS390XMOVWBRstoreidx)
   15487 		v.AuxInt = i - 2
   15488 		v.Aux = s
   15489 		v.AddArg(p)
   15490 		v.AddArg(idx)
   15491 		v.AddArg(w0)
   15492 		v.AddArg(mem)
   15493 		return true
   15494 	}
   15495 	// match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem))
   15496 	// cond: x.Uses == 1   && clobber(x)
   15497 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15498 	for {
   15499 		i := v.AuxInt
   15500 		s := v.Aux
   15501 		_ = v.Args[3]
   15502 		p := v.Args[0]
   15503 		idx := v.Args[1]
   15504 		v_2 := v.Args[2]
   15505 		if v_2.Op != OpS390XSRDconst {
   15506 			break
   15507 		}
   15508 		j := v_2.AuxInt
   15509 		w := v_2.Args[0]
   15510 		x := v.Args[3]
   15511 		if x.Op != OpS390XMOVHBRstoreidx {
   15512 			break
   15513 		}
   15514 		if x.AuxInt != i-2 {
   15515 			break
   15516 		}
   15517 		if x.Aux != s {
   15518 			break
   15519 		}
   15520 		_ = x.Args[3]
   15521 		if idx != x.Args[0] {
   15522 			break
   15523 		}
   15524 		if p != x.Args[1] {
   15525 			break
   15526 		}
   15527 		w0 := x.Args[2]
   15528 		if w0.Op != OpS390XSRDconst {
   15529 			break
   15530 		}
   15531 		if w0.AuxInt != j-16 {
   15532 			break
   15533 		}
   15534 		if w != w0.Args[0] {
   15535 			break
   15536 		}
   15537 		mem := x.Args[3]
   15538 		if !(x.Uses == 1 && clobber(x)) {
   15539 			break
   15540 		}
   15541 		v.reset(OpS390XMOVWBRstoreidx)
   15542 		v.AuxInt = i - 2
   15543 		v.Aux = s
   15544 		v.AddArg(p)
   15545 		v.AddArg(idx)
   15546 		v.AddArg(w0)
   15547 		v.AddArg(mem)
   15548 		return true
   15549 	}
   15550 	// match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem))
   15551 	// cond: x.Uses == 1   && clobber(x)
   15552 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15553 	for {
   15554 		i := v.AuxInt
   15555 		s := v.Aux
   15556 		_ = v.Args[3]
   15557 		idx := v.Args[0]
   15558 		p := v.Args[1]
   15559 		v_2 := v.Args[2]
   15560 		if v_2.Op != OpS390XSRDconst {
   15561 			break
   15562 		}
   15563 		j := v_2.AuxInt
   15564 		w := v_2.Args[0]
   15565 		x := v.Args[3]
   15566 		if x.Op != OpS390XMOVHBRstoreidx {
   15567 			break
   15568 		}
   15569 		if x.AuxInt != i-2 {
   15570 			break
   15571 		}
   15572 		if x.Aux != s {
   15573 			break
   15574 		}
   15575 		_ = x.Args[3]
   15576 		if p != x.Args[0] {
   15577 			break
   15578 		}
   15579 		if idx != x.Args[1] {
   15580 			break
   15581 		}
   15582 		w0 := x.Args[2]
   15583 		if w0.Op != OpS390XSRDconst {
   15584 			break
   15585 		}
   15586 		if w0.AuxInt != j-16 {
   15587 			break
   15588 		}
   15589 		if w != w0.Args[0] {
   15590 			break
   15591 		}
   15592 		mem := x.Args[3]
   15593 		if !(x.Uses == 1 && clobber(x)) {
   15594 			break
   15595 		}
   15596 		v.reset(OpS390XMOVWBRstoreidx)
   15597 		v.AuxInt = i - 2
   15598 		v.Aux = s
   15599 		v.AddArg(p)
   15600 		v.AddArg(idx)
   15601 		v.AddArg(w0)
   15602 		v.AddArg(mem)
   15603 		return true
   15604 	}
   15605 	// match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem))
   15606 	// cond: x.Uses == 1   && clobber(x)
   15607 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15608 	for {
   15609 		i := v.AuxInt
   15610 		s := v.Aux
   15611 		_ = v.Args[3]
   15612 		idx := v.Args[0]
   15613 		p := v.Args[1]
   15614 		v_2 := v.Args[2]
   15615 		if v_2.Op != OpS390XSRDconst {
   15616 			break
   15617 		}
   15618 		j := v_2.AuxInt
   15619 		w := v_2.Args[0]
   15620 		x := v.Args[3]
   15621 		if x.Op != OpS390XMOVHBRstoreidx {
   15622 			break
   15623 		}
   15624 		if x.AuxInt != i-2 {
   15625 			break
   15626 		}
   15627 		if x.Aux != s {
   15628 			break
   15629 		}
   15630 		_ = x.Args[3]
   15631 		if idx != x.Args[0] {
   15632 			break
   15633 		}
   15634 		if p != x.Args[1] {
   15635 			break
   15636 		}
   15637 		w0 := x.Args[2]
   15638 		if w0.Op != OpS390XSRDconst {
   15639 			break
   15640 		}
   15641 		if w0.AuxInt != j-16 {
   15642 			break
   15643 		}
   15644 		if w != w0.Args[0] {
   15645 			break
   15646 		}
   15647 		mem := x.Args[3]
   15648 		if !(x.Uses == 1 && clobber(x)) {
   15649 			break
   15650 		}
   15651 		v.reset(OpS390XMOVWBRstoreidx)
   15652 		v.AuxInt = i - 2
   15653 		v.Aux = s
   15654 		v.AddArg(p)
   15655 		v.AddArg(idx)
   15656 		v.AddArg(w0)
   15657 		v.AddArg(mem)
   15658 		return true
   15659 	}
   15660 	// match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem))
   15661 	// cond: x.Uses == 1   && clobber(x)
   15662 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15663 	for {
   15664 		i := v.AuxInt
   15665 		s := v.Aux
   15666 		_ = v.Args[3]
   15667 		p := v.Args[0]
   15668 		idx := v.Args[1]
   15669 		v_2 := v.Args[2]
   15670 		if v_2.Op != OpS390XSRWconst {
   15671 			break
   15672 		}
   15673 		if v_2.AuxInt != 16 {
   15674 			break
   15675 		}
   15676 		w := v_2.Args[0]
   15677 		x := v.Args[3]
   15678 		if x.Op != OpS390XMOVHBRstoreidx {
   15679 			break
   15680 		}
   15681 		if x.AuxInt != i-2 {
   15682 			break
   15683 		}
   15684 		if x.Aux != s {
   15685 			break
   15686 		}
   15687 		_ = x.Args[3]
   15688 		if p != x.Args[0] {
   15689 			break
   15690 		}
   15691 		if idx != x.Args[1] {
   15692 			break
   15693 		}
   15694 		if w != x.Args[2] {
   15695 			break
   15696 		}
   15697 		mem := x.Args[3]
   15698 		if !(x.Uses == 1 && clobber(x)) {
   15699 			break
   15700 		}
   15701 		v.reset(OpS390XMOVWBRstoreidx)
   15702 		v.AuxInt = i - 2
   15703 		v.Aux = s
   15704 		v.AddArg(p)
   15705 		v.AddArg(idx)
   15706 		v.AddArg(w)
   15707 		v.AddArg(mem)
   15708 		return true
   15709 	}
   15710 	// match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem))
   15711 	// cond: x.Uses == 1   && clobber(x)
   15712 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15713 	for {
   15714 		i := v.AuxInt
   15715 		s := v.Aux
   15716 		_ = v.Args[3]
   15717 		p := v.Args[0]
   15718 		idx := v.Args[1]
   15719 		v_2 := v.Args[2]
   15720 		if v_2.Op != OpS390XSRWconst {
   15721 			break
   15722 		}
   15723 		if v_2.AuxInt != 16 {
   15724 			break
   15725 		}
   15726 		w := v_2.Args[0]
   15727 		x := v.Args[3]
   15728 		if x.Op != OpS390XMOVHBRstoreidx {
   15729 			break
   15730 		}
   15731 		if x.AuxInt != i-2 {
   15732 			break
   15733 		}
   15734 		if x.Aux != s {
   15735 			break
   15736 		}
   15737 		_ = x.Args[3]
   15738 		if idx != x.Args[0] {
   15739 			break
   15740 		}
   15741 		if p != x.Args[1] {
   15742 			break
   15743 		}
   15744 		if w != x.Args[2] {
   15745 			break
   15746 		}
   15747 		mem := x.Args[3]
   15748 		if !(x.Uses == 1 && clobber(x)) {
   15749 			break
   15750 		}
   15751 		v.reset(OpS390XMOVWBRstoreidx)
   15752 		v.AuxInt = i - 2
   15753 		v.Aux = s
   15754 		v.AddArg(p)
   15755 		v.AddArg(idx)
   15756 		v.AddArg(w)
   15757 		v.AddArg(mem)
   15758 		return true
   15759 	}
   15760 	return false
   15761 }
   15762 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool {
   15763 	// match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem))
   15764 	// cond: x.Uses == 1   && clobber(x)
   15765 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15766 	for {
   15767 		i := v.AuxInt
   15768 		s := v.Aux
   15769 		_ = v.Args[3]
   15770 		idx := v.Args[0]
   15771 		p := v.Args[1]
   15772 		v_2 := v.Args[2]
   15773 		if v_2.Op != OpS390XSRWconst {
   15774 			break
   15775 		}
   15776 		if v_2.AuxInt != 16 {
   15777 			break
   15778 		}
   15779 		w := v_2.Args[0]
   15780 		x := v.Args[3]
   15781 		if x.Op != OpS390XMOVHBRstoreidx {
   15782 			break
   15783 		}
   15784 		if x.AuxInt != i-2 {
   15785 			break
   15786 		}
   15787 		if x.Aux != s {
   15788 			break
   15789 		}
   15790 		_ = x.Args[3]
   15791 		if p != x.Args[0] {
   15792 			break
   15793 		}
   15794 		if idx != x.Args[1] {
   15795 			break
   15796 		}
   15797 		if w != x.Args[2] {
   15798 			break
   15799 		}
   15800 		mem := x.Args[3]
   15801 		if !(x.Uses == 1 && clobber(x)) {
   15802 			break
   15803 		}
   15804 		v.reset(OpS390XMOVWBRstoreidx)
   15805 		v.AuxInt = i - 2
   15806 		v.Aux = s
   15807 		v.AddArg(p)
   15808 		v.AddArg(idx)
   15809 		v.AddArg(w)
   15810 		v.AddArg(mem)
   15811 		return true
   15812 	}
   15813 	// match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem))
   15814 	// cond: x.Uses == 1   && clobber(x)
   15815 	// result: (MOVWBRstoreidx [i-2] {s} p idx w mem)
   15816 	for {
   15817 		i := v.AuxInt
   15818 		s := v.Aux
   15819 		_ = v.Args[3]
   15820 		idx := v.Args[0]
   15821 		p := v.Args[1]
   15822 		v_2 := v.Args[2]
   15823 		if v_2.Op != OpS390XSRWconst {
   15824 			break
   15825 		}
   15826 		if v_2.AuxInt != 16 {
   15827 			break
   15828 		}
   15829 		w := v_2.Args[0]
   15830 		x := v.Args[3]
   15831 		if x.Op != OpS390XMOVHBRstoreidx {
   15832 			break
   15833 		}
   15834 		if x.AuxInt != i-2 {
   15835 			break
   15836 		}
   15837 		if x.Aux != s {
   15838 			break
   15839 		}
   15840 		_ = x.Args[3]
   15841 		if idx != x.Args[0] {
   15842 			break
   15843 		}
   15844 		if p != x.Args[1] {
   15845 			break
   15846 		}
   15847 		if w != x.Args[2] {
   15848 			break
   15849 		}
   15850 		mem := x.Args[3]
   15851 		if !(x.Uses == 1 && clobber(x)) {
   15852 			break
   15853 		}
   15854 		v.reset(OpS390XMOVWBRstoreidx)
   15855 		v.AuxInt = i - 2
   15856 		v.Aux = s
   15857 		v.AddArg(p)
   15858 		v.AddArg(idx)
   15859 		v.AddArg(w)
   15860 		v.AddArg(mem)
   15861 		return true
   15862 	}
   15863 	// match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem))
   15864 	// cond: x.Uses == 1   && clobber(x)
   15865 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15866 	for {
   15867 		i := v.AuxInt
   15868 		s := v.Aux
   15869 		_ = v.Args[3]
   15870 		p := v.Args[0]
   15871 		idx := v.Args[1]
   15872 		v_2 := v.Args[2]
   15873 		if v_2.Op != OpS390XSRWconst {
   15874 			break
   15875 		}
   15876 		j := v_2.AuxInt
   15877 		w := v_2.Args[0]
   15878 		x := v.Args[3]
   15879 		if x.Op != OpS390XMOVHBRstoreidx {
   15880 			break
   15881 		}
   15882 		if x.AuxInt != i-2 {
   15883 			break
   15884 		}
   15885 		if x.Aux != s {
   15886 			break
   15887 		}
   15888 		_ = x.Args[3]
   15889 		if p != x.Args[0] {
   15890 			break
   15891 		}
   15892 		if idx != x.Args[1] {
   15893 			break
   15894 		}
   15895 		w0 := x.Args[2]
   15896 		if w0.Op != OpS390XSRWconst {
   15897 			break
   15898 		}
   15899 		if w0.AuxInt != j-16 {
   15900 			break
   15901 		}
   15902 		if w != w0.Args[0] {
   15903 			break
   15904 		}
   15905 		mem := x.Args[3]
   15906 		if !(x.Uses == 1 && clobber(x)) {
   15907 			break
   15908 		}
   15909 		v.reset(OpS390XMOVWBRstoreidx)
   15910 		v.AuxInt = i - 2
   15911 		v.Aux = s
   15912 		v.AddArg(p)
   15913 		v.AddArg(idx)
   15914 		v.AddArg(w0)
   15915 		v.AddArg(mem)
   15916 		return true
   15917 	}
   15918 	// match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem))
   15919 	// cond: x.Uses == 1   && clobber(x)
   15920 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15921 	for {
   15922 		i := v.AuxInt
   15923 		s := v.Aux
   15924 		_ = v.Args[3]
   15925 		p := v.Args[0]
   15926 		idx := v.Args[1]
   15927 		v_2 := v.Args[2]
   15928 		if v_2.Op != OpS390XSRWconst {
   15929 			break
   15930 		}
   15931 		j := v_2.AuxInt
   15932 		w := v_2.Args[0]
   15933 		x := v.Args[3]
   15934 		if x.Op != OpS390XMOVHBRstoreidx {
   15935 			break
   15936 		}
   15937 		if x.AuxInt != i-2 {
   15938 			break
   15939 		}
   15940 		if x.Aux != s {
   15941 			break
   15942 		}
   15943 		_ = x.Args[3]
   15944 		if idx != x.Args[0] {
   15945 			break
   15946 		}
   15947 		if p != x.Args[1] {
   15948 			break
   15949 		}
   15950 		w0 := x.Args[2]
   15951 		if w0.Op != OpS390XSRWconst {
   15952 			break
   15953 		}
   15954 		if w0.AuxInt != j-16 {
   15955 			break
   15956 		}
   15957 		if w != w0.Args[0] {
   15958 			break
   15959 		}
   15960 		mem := x.Args[3]
   15961 		if !(x.Uses == 1 && clobber(x)) {
   15962 			break
   15963 		}
   15964 		v.reset(OpS390XMOVWBRstoreidx)
   15965 		v.AuxInt = i - 2
   15966 		v.Aux = s
   15967 		v.AddArg(p)
   15968 		v.AddArg(idx)
   15969 		v.AddArg(w0)
   15970 		v.AddArg(mem)
   15971 		return true
   15972 	}
   15973 	// match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem))
   15974 	// cond: x.Uses == 1   && clobber(x)
   15975 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   15976 	for {
   15977 		i := v.AuxInt
   15978 		s := v.Aux
   15979 		_ = v.Args[3]
   15980 		idx := v.Args[0]
   15981 		p := v.Args[1]
   15982 		v_2 := v.Args[2]
   15983 		if v_2.Op != OpS390XSRWconst {
   15984 			break
   15985 		}
   15986 		j := v_2.AuxInt
   15987 		w := v_2.Args[0]
   15988 		x := v.Args[3]
   15989 		if x.Op != OpS390XMOVHBRstoreidx {
   15990 			break
   15991 		}
   15992 		if x.AuxInt != i-2 {
   15993 			break
   15994 		}
   15995 		if x.Aux != s {
   15996 			break
   15997 		}
   15998 		_ = x.Args[3]
   15999 		if p != x.Args[0] {
   16000 			break
   16001 		}
   16002 		if idx != x.Args[1] {
   16003 			break
   16004 		}
   16005 		w0 := x.Args[2]
   16006 		if w0.Op != OpS390XSRWconst {
   16007 			break
   16008 		}
   16009 		if w0.AuxInt != j-16 {
   16010 			break
   16011 		}
   16012 		if w != w0.Args[0] {
   16013 			break
   16014 		}
   16015 		mem := x.Args[3]
   16016 		if !(x.Uses == 1 && clobber(x)) {
   16017 			break
   16018 		}
   16019 		v.reset(OpS390XMOVWBRstoreidx)
   16020 		v.AuxInt = i - 2
   16021 		v.Aux = s
   16022 		v.AddArg(p)
   16023 		v.AddArg(idx)
   16024 		v.AddArg(w0)
   16025 		v.AddArg(mem)
   16026 		return true
   16027 	}
   16028 	// match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem))
   16029 	// cond: x.Uses == 1   && clobber(x)
   16030 	// result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem)
   16031 	for {
   16032 		i := v.AuxInt
   16033 		s := v.Aux
   16034 		_ = v.Args[3]
   16035 		idx := v.Args[0]
   16036 		p := v.Args[1]
   16037 		v_2 := v.Args[2]
   16038 		if v_2.Op != OpS390XSRWconst {
   16039 			break
   16040 		}
   16041 		j := v_2.AuxInt
   16042 		w := v_2.Args[0]
   16043 		x := v.Args[3]
   16044 		if x.Op != OpS390XMOVHBRstoreidx {
   16045 			break
   16046 		}
   16047 		if x.AuxInt != i-2 {
   16048 			break
   16049 		}
   16050 		if x.Aux != s {
   16051 			break
   16052 		}
   16053 		_ = x.Args[3]
   16054 		if idx != x.Args[0] {
   16055 			break
   16056 		}
   16057 		if p != x.Args[1] {
   16058 			break
   16059 		}
   16060 		w0 := x.Args[2]
   16061 		if w0.Op != OpS390XSRWconst {
   16062 			break
   16063 		}
   16064 		if w0.AuxInt != j-16 {
   16065 			break
   16066 		}
   16067 		if w != w0.Args[0] {
   16068 			break
   16069 		}
   16070 		mem := x.Args[3]
   16071 		if !(x.Uses == 1 && clobber(x)) {
   16072 			break
   16073 		}
   16074 		v.reset(OpS390XMOVWBRstoreidx)
   16075 		v.AuxInt = i - 2
   16076 		v.Aux = s
   16077 		v.AddArg(p)
   16078 		v.AddArg(idx)
   16079 		v.AddArg(w0)
   16080 		v.AddArg(mem)
   16081 		return true
   16082 	}
   16083 	return false
   16084 }
   16085 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool {
   16086 	// match: (MOVHZload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _))
   16087 	// cond: isSamePtr(ptr1, ptr2)
   16088 	// result: (MOVHZreg x)
   16089 	for {
   16090 		off := v.AuxInt
   16091 		sym := v.Aux
   16092 		_ = v.Args[1]
   16093 		ptr1 := v.Args[0]
   16094 		v_1 := v.Args[1]
   16095 		if v_1.Op != OpS390XMOVHstore {
   16096 			break
   16097 		}
   16098 		if v_1.AuxInt != off {
   16099 			break
   16100 		}
   16101 		if v_1.Aux != sym {
   16102 			break
   16103 		}
   16104 		_ = v_1.Args[2]
   16105 		ptr2 := v_1.Args[0]
   16106 		x := v_1.Args[1]
   16107 		if !(isSamePtr(ptr1, ptr2)) {
   16108 			break
   16109 		}
   16110 		v.reset(OpS390XMOVHZreg)
   16111 		v.AddArg(x)
   16112 		return true
   16113 	}
   16114 	// match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem)
   16115 	// cond: is20Bit(off1+off2)
   16116 	// result: (MOVHZload [off1+off2] {sym} ptr mem)
   16117 	for {
   16118 		off1 := v.AuxInt
   16119 		sym := v.Aux
   16120 		_ = v.Args[1]
   16121 		v_0 := v.Args[0]
   16122 		if v_0.Op != OpS390XADDconst {
   16123 			break
   16124 		}
   16125 		off2 := v_0.AuxInt
   16126 		ptr := v_0.Args[0]
   16127 		mem := v.Args[1]
   16128 		if !(is20Bit(off1 + off2)) {
   16129 			break
   16130 		}
   16131 		v.reset(OpS390XMOVHZload)
   16132 		v.AuxInt = off1 + off2
   16133 		v.Aux = sym
   16134 		v.AddArg(ptr)
   16135 		v.AddArg(mem)
   16136 		return true
   16137 	}
   16138 	// match: (MOVHZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem)
   16139 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))
   16140 	// result: (MOVHZload  [off1+off2] {mergeSym(sym1,sym2)} base mem)
   16141 	for {
   16142 		off1 := v.AuxInt
   16143 		sym1 := v.Aux
   16144 		_ = v.Args[1]
   16145 		v_0 := v.Args[0]
   16146 		if v_0.Op != OpS390XMOVDaddr {
   16147 			break
   16148 		}
   16149 		t := v_0.Type
   16150 		off2 := v_0.AuxInt
   16151 		sym2 := v_0.Aux
   16152 		base := v_0.Args[0]
   16153 		mem := v.Args[1]
   16154 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) {
   16155 			break
   16156 		}
   16157 		v.reset(OpS390XMOVHZload)
   16158 		v.AuxInt = off1 + off2
   16159 		v.Aux = mergeSym(sym1, sym2)
   16160 		v.AddArg(base)
   16161 		v.AddArg(mem)
   16162 		return true
   16163 	}
   16164 	// match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   16165 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   16166 	// result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   16167 	for {
   16168 		off1 := v.AuxInt
   16169 		sym1 := v.Aux
   16170 		_ = v.Args[1]
   16171 		v_0 := v.Args[0]
   16172 		if v_0.Op != OpS390XMOVDaddridx {
   16173 			break
   16174 		}
   16175 		off2 := v_0.AuxInt
   16176 		sym2 := v_0.Aux
   16177 		_ = v_0.Args[1]
   16178 		ptr := v_0.Args[0]
   16179 		idx := v_0.Args[1]
   16180 		mem := v.Args[1]
   16181 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   16182 			break
   16183 		}
   16184 		v.reset(OpS390XMOVHZloadidx)
   16185 		v.AuxInt = off1 + off2
   16186 		v.Aux = mergeSym(sym1, sym2)
   16187 		v.AddArg(ptr)
   16188 		v.AddArg(idx)
   16189 		v.AddArg(mem)
   16190 		return true
   16191 	}
   16192 	// match: (MOVHZload [off] {sym} (ADD ptr idx) mem)
   16193 	// cond: ptr.Op != OpSB
   16194 	// result: (MOVHZloadidx [off] {sym} ptr idx mem)
   16195 	for {
   16196 		off := v.AuxInt
   16197 		sym := v.Aux
   16198 		_ = v.Args[1]
   16199 		v_0 := v.Args[0]
   16200 		if v_0.Op != OpS390XADD {
   16201 			break
   16202 		}
   16203 		_ = v_0.Args[1]
   16204 		ptr := v_0.Args[0]
   16205 		idx := v_0.Args[1]
   16206 		mem := v.Args[1]
   16207 		if !(ptr.Op != OpSB) {
   16208 			break
   16209 		}
   16210 		v.reset(OpS390XMOVHZloadidx)
   16211 		v.AuxInt = off
   16212 		v.Aux = sym
   16213 		v.AddArg(ptr)
   16214 		v.AddArg(idx)
   16215 		v.AddArg(mem)
   16216 		return true
   16217 	}
   16218 	return false
   16219 }
   16220 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool {
   16221 	// match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   16222 	// cond: is20Bit(c+d)
   16223 	// result: (MOVHZloadidx [c+d] {sym} ptr idx mem)
   16224 	for {
   16225 		c := v.AuxInt
   16226 		sym := v.Aux
   16227 		_ = v.Args[2]
   16228 		v_0 := v.Args[0]
   16229 		if v_0.Op != OpS390XADDconst {
   16230 			break
   16231 		}
   16232 		d := v_0.AuxInt
   16233 		ptr := v_0.Args[0]
   16234 		idx := v.Args[1]
   16235 		mem := v.Args[2]
   16236 		if !(is20Bit(c + d)) {
   16237 			break
   16238 		}
   16239 		v.reset(OpS390XMOVHZloadidx)
   16240 		v.AuxInt = c + d
   16241 		v.Aux = sym
   16242 		v.AddArg(ptr)
   16243 		v.AddArg(idx)
   16244 		v.AddArg(mem)
   16245 		return true
   16246 	}
   16247 	// match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   16248 	// cond: is20Bit(c+d)
   16249 	// result: (MOVHZloadidx [c+d] {sym} ptr idx mem)
   16250 	for {
   16251 		c := v.AuxInt
   16252 		sym := v.Aux
   16253 		_ = v.Args[2]
   16254 		idx := v.Args[0]
   16255 		v_1 := v.Args[1]
   16256 		if v_1.Op != OpS390XADDconst {
   16257 			break
   16258 		}
   16259 		d := v_1.AuxInt
   16260 		ptr := v_1.Args[0]
   16261 		mem := v.Args[2]
   16262 		if !(is20Bit(c + d)) {
   16263 			break
   16264 		}
   16265 		v.reset(OpS390XMOVHZloadidx)
   16266 		v.AuxInt = c + d
   16267 		v.Aux = sym
   16268 		v.AddArg(ptr)
   16269 		v.AddArg(idx)
   16270 		v.AddArg(mem)
   16271 		return true
   16272 	}
   16273 	// match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   16274 	// cond: is20Bit(c+d)
   16275 	// result: (MOVHZloadidx [c+d] {sym} ptr idx mem)
   16276 	for {
   16277 		c := v.AuxInt
   16278 		sym := v.Aux
   16279 		_ = v.Args[2]
   16280 		ptr := v.Args[0]
   16281 		v_1 := v.Args[1]
   16282 		if v_1.Op != OpS390XADDconst {
   16283 			break
   16284 		}
   16285 		d := v_1.AuxInt
   16286 		idx := v_1.Args[0]
   16287 		mem := v.Args[2]
   16288 		if !(is20Bit(c + d)) {
   16289 			break
   16290 		}
   16291 		v.reset(OpS390XMOVHZloadidx)
   16292 		v.AuxInt = c + d
   16293 		v.Aux = sym
   16294 		v.AddArg(ptr)
   16295 		v.AddArg(idx)
   16296 		v.AddArg(mem)
   16297 		return true
   16298 	}
   16299 	// match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   16300 	// cond: is20Bit(c+d)
   16301 	// result: (MOVHZloadidx [c+d] {sym} ptr idx mem)
   16302 	for {
   16303 		c := v.AuxInt
   16304 		sym := v.Aux
   16305 		_ = v.Args[2]
   16306 		v_0 := v.Args[0]
   16307 		if v_0.Op != OpS390XADDconst {
   16308 			break
   16309 		}
   16310 		d := v_0.AuxInt
   16311 		idx := v_0.Args[0]
   16312 		ptr := v.Args[1]
   16313 		mem := v.Args[2]
   16314 		if !(is20Bit(c + d)) {
   16315 			break
   16316 		}
   16317 		v.reset(OpS390XMOVHZloadidx)
   16318 		v.AuxInt = c + d
   16319 		v.Aux = sym
   16320 		v.AddArg(ptr)
   16321 		v.AddArg(idx)
   16322 		v.AddArg(mem)
   16323 		return true
   16324 	}
   16325 	return false
   16326 }
   16327 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool {
   16328 	b := v.Block
   16329 	_ = b
   16330 	// match: (MOVHZreg x:(MOVBZload _ _))
   16331 	// cond:
   16332 	// result: (MOVDreg x)
   16333 	for {
   16334 		x := v.Args[0]
   16335 		if x.Op != OpS390XMOVBZload {
   16336 			break
   16337 		}
   16338 		_ = x.Args[1]
   16339 		v.reset(OpS390XMOVDreg)
   16340 		v.AddArg(x)
   16341 		return true
   16342 	}
   16343 	// match: (MOVHZreg x:(MOVHZload _ _))
   16344 	// cond:
   16345 	// result: (MOVDreg x)
   16346 	for {
   16347 		x := v.Args[0]
   16348 		if x.Op != OpS390XMOVHZload {
   16349 			break
   16350 		}
   16351 		_ = x.Args[1]
   16352 		v.reset(OpS390XMOVDreg)
   16353 		v.AddArg(x)
   16354 		return true
   16355 	}
   16356 	// match: (MOVHZreg x:(Arg <t>))
   16357 	// cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t)
   16358 	// result: (MOVDreg x)
   16359 	for {
   16360 		x := v.Args[0]
   16361 		if x.Op != OpArg {
   16362 			break
   16363 		}
   16364 		t := x.Type
   16365 		if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) {
   16366 			break
   16367 		}
   16368 		v.reset(OpS390XMOVDreg)
   16369 		v.AddArg(x)
   16370 		return true
   16371 	}
   16372 	// match: (MOVHZreg x:(MOVBZreg _))
   16373 	// cond:
   16374 	// result: (MOVDreg x)
   16375 	for {
   16376 		x := v.Args[0]
   16377 		if x.Op != OpS390XMOVBZreg {
   16378 			break
   16379 		}
   16380 		v.reset(OpS390XMOVDreg)
   16381 		v.AddArg(x)
   16382 		return true
   16383 	}
   16384 	// match: (MOVHZreg x:(MOVHZreg _))
   16385 	// cond:
   16386 	// result: (MOVDreg x)
   16387 	for {
   16388 		x := v.Args[0]
   16389 		if x.Op != OpS390XMOVHZreg {
   16390 			break
   16391 		}
   16392 		v.reset(OpS390XMOVDreg)
   16393 		v.AddArg(x)
   16394 		return true
   16395 	}
   16396 	// match: (MOVHZreg (MOVDconst [c]))
   16397 	// cond:
   16398 	// result: (MOVDconst [int64(uint16(c))])
   16399 	for {
   16400 		v_0 := v.Args[0]
   16401 		if v_0.Op != OpS390XMOVDconst {
   16402 			break
   16403 		}
   16404 		c := v_0.AuxInt
   16405 		v.reset(OpS390XMOVDconst)
   16406 		v.AuxInt = int64(uint16(c))
   16407 		return true
   16408 	}
   16409 	// match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem))
   16410 	// cond: x.Uses == 1 && clobber(x)
   16411 	// result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem)
   16412 	for {
   16413 		x := v.Args[0]
   16414 		if x.Op != OpS390XMOVHZload {
   16415 			break
   16416 		}
   16417 		off := x.AuxInt
   16418 		sym := x.Aux
   16419 		_ = x.Args[1]
   16420 		ptr := x.Args[0]
   16421 		mem := x.Args[1]
   16422 		if !(x.Uses == 1 && clobber(x)) {
   16423 			break
   16424 		}
   16425 		b = x.Block
   16426 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type)
   16427 		v.reset(OpCopy)
   16428 		v.AddArg(v0)
   16429 		v0.AuxInt = off
   16430 		v0.Aux = sym
   16431 		v0.AddArg(ptr)
   16432 		v0.AddArg(mem)
   16433 		return true
   16434 	}
   16435 	// match: (MOVHZreg x:(MOVHload [off] {sym} ptr mem))
   16436 	// cond: x.Uses == 1 && clobber(x)
   16437 	// result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem)
   16438 	for {
   16439 		x := v.Args[0]
   16440 		if x.Op != OpS390XMOVHload {
   16441 			break
   16442 		}
   16443 		off := x.AuxInt
   16444 		sym := x.Aux
   16445 		_ = x.Args[1]
   16446 		ptr := x.Args[0]
   16447 		mem := x.Args[1]
   16448 		if !(x.Uses == 1 && clobber(x)) {
   16449 			break
   16450 		}
   16451 		b = x.Block
   16452 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type)
   16453 		v.reset(OpCopy)
   16454 		v.AddArg(v0)
   16455 		v0.AuxInt = off
   16456 		v0.Aux = sym
   16457 		v0.AddArg(ptr)
   16458 		v0.AddArg(mem)
   16459 		return true
   16460 	}
   16461 	// match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem))
   16462 	// cond: x.Uses == 1 && clobber(x)
   16463 	// result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem)
   16464 	for {
   16465 		x := v.Args[0]
   16466 		if x.Op != OpS390XMOVHZloadidx {
   16467 			break
   16468 		}
   16469 		off := x.AuxInt
   16470 		sym := x.Aux
   16471 		_ = x.Args[2]
   16472 		ptr := x.Args[0]
   16473 		idx := x.Args[1]
   16474 		mem := x.Args[2]
   16475 		if !(x.Uses == 1 && clobber(x)) {
   16476 			break
   16477 		}
   16478 		b = x.Block
   16479 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type)
   16480 		v.reset(OpCopy)
   16481 		v.AddArg(v0)
   16482 		v0.AuxInt = off
   16483 		v0.Aux = sym
   16484 		v0.AddArg(ptr)
   16485 		v0.AddArg(idx)
   16486 		v0.AddArg(mem)
   16487 		return true
   16488 	}
   16489 	// match: (MOVHZreg x:(MOVHloadidx [off] {sym} ptr idx mem))
   16490 	// cond: x.Uses == 1 && clobber(x)
   16491 	// result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem)
   16492 	for {
   16493 		x := v.Args[0]
   16494 		if x.Op != OpS390XMOVHloadidx {
   16495 			break
   16496 		}
   16497 		off := x.AuxInt
   16498 		sym := x.Aux
   16499 		_ = x.Args[2]
   16500 		ptr := x.Args[0]
   16501 		idx := x.Args[1]
   16502 		mem := x.Args[2]
   16503 		if !(x.Uses == 1 && clobber(x)) {
   16504 			break
   16505 		}
   16506 		b = x.Block
   16507 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type)
   16508 		v.reset(OpCopy)
   16509 		v.AddArg(v0)
   16510 		v0.AuxInt = off
   16511 		v0.Aux = sym
   16512 		v0.AddArg(ptr)
   16513 		v0.AddArg(idx)
   16514 		v0.AddArg(mem)
   16515 		return true
   16516 	}
   16517 	return false
   16518 }
   16519 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool {
   16520 	// match: (MOVHload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _))
   16521 	// cond: isSamePtr(ptr1, ptr2)
   16522 	// result: (MOVHreg x)
   16523 	for {
   16524 		off := v.AuxInt
   16525 		sym := v.Aux
   16526 		_ = v.Args[1]
   16527 		ptr1 := v.Args[0]
   16528 		v_1 := v.Args[1]
   16529 		if v_1.Op != OpS390XMOVHstore {
   16530 			break
   16531 		}
   16532 		if v_1.AuxInt != off {
   16533 			break
   16534 		}
   16535 		if v_1.Aux != sym {
   16536 			break
   16537 		}
   16538 		_ = v_1.Args[2]
   16539 		ptr2 := v_1.Args[0]
   16540 		x := v_1.Args[1]
   16541 		if !(isSamePtr(ptr1, ptr2)) {
   16542 			break
   16543 		}
   16544 		v.reset(OpS390XMOVHreg)
   16545 		v.AddArg(x)
   16546 		return true
   16547 	}
   16548 	// match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem)
   16549 	// cond: is20Bit(off1+off2)
   16550 	// result: (MOVHload  [off1+off2] {sym} ptr mem)
   16551 	for {
   16552 		off1 := v.AuxInt
   16553 		sym := v.Aux
   16554 		_ = v.Args[1]
   16555 		v_0 := v.Args[0]
   16556 		if v_0.Op != OpS390XADDconst {
   16557 			break
   16558 		}
   16559 		off2 := v_0.AuxInt
   16560 		ptr := v_0.Args[0]
   16561 		mem := v.Args[1]
   16562 		if !(is20Bit(off1 + off2)) {
   16563 			break
   16564 		}
   16565 		v.reset(OpS390XMOVHload)
   16566 		v.AuxInt = off1 + off2
   16567 		v.Aux = sym
   16568 		v.AddArg(ptr)
   16569 		v.AddArg(mem)
   16570 		return true
   16571 	}
   16572 	// match: (MOVHload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem)
   16573 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))
   16574 	// result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem)
   16575 	for {
   16576 		off1 := v.AuxInt
   16577 		sym1 := v.Aux
   16578 		_ = v.Args[1]
   16579 		v_0 := v.Args[0]
   16580 		if v_0.Op != OpS390XMOVDaddr {
   16581 			break
   16582 		}
   16583 		t := v_0.Type
   16584 		off2 := v_0.AuxInt
   16585 		sym2 := v_0.Aux
   16586 		base := v_0.Args[0]
   16587 		mem := v.Args[1]
   16588 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) {
   16589 			break
   16590 		}
   16591 		v.reset(OpS390XMOVHload)
   16592 		v.AuxInt = off1 + off2
   16593 		v.Aux = mergeSym(sym1, sym2)
   16594 		v.AddArg(base)
   16595 		v.AddArg(mem)
   16596 		return true
   16597 	}
   16598 	// match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   16599 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   16600 	// result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   16601 	for {
   16602 		off1 := v.AuxInt
   16603 		sym1 := v.Aux
   16604 		_ = v.Args[1]
   16605 		v_0 := v.Args[0]
   16606 		if v_0.Op != OpS390XMOVDaddridx {
   16607 			break
   16608 		}
   16609 		off2 := v_0.AuxInt
   16610 		sym2 := v_0.Aux
   16611 		_ = v_0.Args[1]
   16612 		ptr := v_0.Args[0]
   16613 		idx := v_0.Args[1]
   16614 		mem := v.Args[1]
   16615 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   16616 			break
   16617 		}
   16618 		v.reset(OpS390XMOVHloadidx)
   16619 		v.AuxInt = off1 + off2
   16620 		v.Aux = mergeSym(sym1, sym2)
   16621 		v.AddArg(ptr)
   16622 		v.AddArg(idx)
   16623 		v.AddArg(mem)
   16624 		return true
   16625 	}
   16626 	// match: (MOVHload [off] {sym} (ADD ptr idx) mem)
   16627 	// cond: ptr.Op != OpSB
   16628 	// result: (MOVHloadidx  [off] {sym} ptr idx mem)
   16629 	for {
   16630 		off := v.AuxInt
   16631 		sym := v.Aux
   16632 		_ = v.Args[1]
   16633 		v_0 := v.Args[0]
   16634 		if v_0.Op != OpS390XADD {
   16635 			break
   16636 		}
   16637 		_ = v_0.Args[1]
   16638 		ptr := v_0.Args[0]
   16639 		idx := v_0.Args[1]
   16640 		mem := v.Args[1]
   16641 		if !(ptr.Op != OpSB) {
   16642 			break
   16643 		}
   16644 		v.reset(OpS390XMOVHloadidx)
   16645 		v.AuxInt = off
   16646 		v.Aux = sym
   16647 		v.AddArg(ptr)
   16648 		v.AddArg(idx)
   16649 		v.AddArg(mem)
   16650 		return true
   16651 	}
   16652 	return false
   16653 }
   16654 func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool {
   16655 	// match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   16656 	// cond: is20Bit(c+d)
   16657 	// result: (MOVHloadidx  [c+d] {sym} ptr idx mem)
   16658 	for {
   16659 		c := v.AuxInt
   16660 		sym := v.Aux
   16661 		_ = v.Args[2]
   16662 		v_0 := v.Args[0]
   16663 		if v_0.Op != OpS390XADDconst {
   16664 			break
   16665 		}
   16666 		d := v_0.AuxInt
   16667 		ptr := v_0.Args[0]
   16668 		idx := v.Args[1]
   16669 		mem := v.Args[2]
   16670 		if !(is20Bit(c + d)) {
   16671 			break
   16672 		}
   16673 		v.reset(OpS390XMOVHloadidx)
   16674 		v.AuxInt = c + d
   16675 		v.Aux = sym
   16676 		v.AddArg(ptr)
   16677 		v.AddArg(idx)
   16678 		v.AddArg(mem)
   16679 		return true
   16680 	}
   16681 	// match: (MOVHloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   16682 	// cond: is20Bit(c+d)
   16683 	// result: (MOVHloadidx  [c+d] {sym} ptr idx mem)
   16684 	for {
   16685 		c := v.AuxInt
   16686 		sym := v.Aux
   16687 		_ = v.Args[2]
   16688 		idx := v.Args[0]
   16689 		v_1 := v.Args[1]
   16690 		if v_1.Op != OpS390XADDconst {
   16691 			break
   16692 		}
   16693 		d := v_1.AuxInt
   16694 		ptr := v_1.Args[0]
   16695 		mem := v.Args[2]
   16696 		if !(is20Bit(c + d)) {
   16697 			break
   16698 		}
   16699 		v.reset(OpS390XMOVHloadidx)
   16700 		v.AuxInt = c + d
   16701 		v.Aux = sym
   16702 		v.AddArg(ptr)
   16703 		v.AddArg(idx)
   16704 		v.AddArg(mem)
   16705 		return true
   16706 	}
   16707 	// match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   16708 	// cond: is20Bit(c+d)
   16709 	// result: (MOVHloadidx  [c+d] {sym} ptr idx mem)
   16710 	for {
   16711 		c := v.AuxInt
   16712 		sym := v.Aux
   16713 		_ = v.Args[2]
   16714 		ptr := v.Args[0]
   16715 		v_1 := v.Args[1]
   16716 		if v_1.Op != OpS390XADDconst {
   16717 			break
   16718 		}
   16719 		d := v_1.AuxInt
   16720 		idx := v_1.Args[0]
   16721 		mem := v.Args[2]
   16722 		if !(is20Bit(c + d)) {
   16723 			break
   16724 		}
   16725 		v.reset(OpS390XMOVHloadidx)
   16726 		v.AuxInt = c + d
   16727 		v.Aux = sym
   16728 		v.AddArg(ptr)
   16729 		v.AddArg(idx)
   16730 		v.AddArg(mem)
   16731 		return true
   16732 	}
   16733 	// match: (MOVHloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   16734 	// cond: is20Bit(c+d)
   16735 	// result: (MOVHloadidx  [c+d] {sym} ptr idx mem)
   16736 	for {
   16737 		c := v.AuxInt
   16738 		sym := v.Aux
   16739 		_ = v.Args[2]
   16740 		v_0 := v.Args[0]
   16741 		if v_0.Op != OpS390XADDconst {
   16742 			break
   16743 		}
   16744 		d := v_0.AuxInt
   16745 		idx := v_0.Args[0]
   16746 		ptr := v.Args[1]
   16747 		mem := v.Args[2]
   16748 		if !(is20Bit(c + d)) {
   16749 			break
   16750 		}
   16751 		v.reset(OpS390XMOVHloadidx)
   16752 		v.AuxInt = c + d
   16753 		v.Aux = sym
   16754 		v.AddArg(ptr)
   16755 		v.AddArg(idx)
   16756 		v.AddArg(mem)
   16757 		return true
   16758 	}
   16759 	return false
   16760 }
   16761 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool {
   16762 	b := v.Block
   16763 	_ = b
   16764 	// match: (MOVHreg x:(MOVBload _ _))
   16765 	// cond:
   16766 	// result: (MOVDreg x)
   16767 	for {
   16768 		x := v.Args[0]
   16769 		if x.Op != OpS390XMOVBload {
   16770 			break
   16771 		}
   16772 		_ = x.Args[1]
   16773 		v.reset(OpS390XMOVDreg)
   16774 		v.AddArg(x)
   16775 		return true
   16776 	}
   16777 	// match: (MOVHreg x:(MOVBZload _ _))
   16778 	// cond:
   16779 	// result: (MOVDreg x)
   16780 	for {
   16781 		x := v.Args[0]
   16782 		if x.Op != OpS390XMOVBZload {
   16783 			break
   16784 		}
   16785 		_ = x.Args[1]
   16786 		v.reset(OpS390XMOVDreg)
   16787 		v.AddArg(x)
   16788 		return true
   16789 	}
   16790 	// match: (MOVHreg x:(MOVHload _ _))
   16791 	// cond:
   16792 	// result: (MOVDreg x)
   16793 	for {
   16794 		x := v.Args[0]
   16795 		if x.Op != OpS390XMOVHload {
   16796 			break
   16797 		}
   16798 		_ = x.Args[1]
   16799 		v.reset(OpS390XMOVDreg)
   16800 		v.AddArg(x)
   16801 		return true
   16802 	}
   16803 	// match: (MOVHreg x:(Arg <t>))
   16804 	// cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t)
   16805 	// result: (MOVDreg x)
   16806 	for {
   16807 		x := v.Args[0]
   16808 		if x.Op != OpArg {
   16809 			break
   16810 		}
   16811 		t := x.Type
   16812 		if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) {
   16813 			break
   16814 		}
   16815 		v.reset(OpS390XMOVDreg)
   16816 		v.AddArg(x)
   16817 		return true
   16818 	}
   16819 	// match: (MOVHreg x:(MOVBreg _))
   16820 	// cond:
   16821 	// result: (MOVDreg x)
   16822 	for {
   16823 		x := v.Args[0]
   16824 		if x.Op != OpS390XMOVBreg {
   16825 			break
   16826 		}
   16827 		v.reset(OpS390XMOVDreg)
   16828 		v.AddArg(x)
   16829 		return true
   16830 	}
   16831 	// match: (MOVHreg x:(MOVBZreg _))
   16832 	// cond:
   16833 	// result: (MOVDreg x)
   16834 	for {
   16835 		x := v.Args[0]
   16836 		if x.Op != OpS390XMOVBZreg {
   16837 			break
   16838 		}
   16839 		v.reset(OpS390XMOVDreg)
   16840 		v.AddArg(x)
   16841 		return true
   16842 	}
   16843 	// match: (MOVHreg x:(MOVHreg _))
   16844 	// cond:
   16845 	// result: (MOVDreg x)
   16846 	for {
   16847 		x := v.Args[0]
   16848 		if x.Op != OpS390XMOVHreg {
   16849 			break
   16850 		}
   16851 		v.reset(OpS390XMOVDreg)
   16852 		v.AddArg(x)
   16853 		return true
   16854 	}
   16855 	// match: (MOVHreg (MOVDconst [c]))
   16856 	// cond:
   16857 	// result: (MOVDconst [int64(int16(c))])
   16858 	for {
   16859 		v_0 := v.Args[0]
   16860 		if v_0.Op != OpS390XMOVDconst {
   16861 			break
   16862 		}
   16863 		c := v_0.AuxInt
   16864 		v.reset(OpS390XMOVDconst)
   16865 		v.AuxInt = int64(int16(c))
   16866 		return true
   16867 	}
   16868 	// match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem))
   16869 	// cond: x.Uses == 1 && clobber(x)
   16870 	// result: @x.Block (MOVHload  <v.Type> [off] {sym} ptr mem)
   16871 	for {
   16872 		x := v.Args[0]
   16873 		if x.Op != OpS390XMOVHZload {
   16874 			break
   16875 		}
   16876 		off := x.AuxInt
   16877 		sym := x.Aux
   16878 		_ = x.Args[1]
   16879 		ptr := x.Args[0]
   16880 		mem := x.Args[1]
   16881 		if !(x.Uses == 1 && clobber(x)) {
   16882 			break
   16883 		}
   16884 		b = x.Block
   16885 		v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type)
   16886 		v.reset(OpCopy)
   16887 		v.AddArg(v0)
   16888 		v0.AuxInt = off
   16889 		v0.Aux = sym
   16890 		v0.AddArg(ptr)
   16891 		v0.AddArg(mem)
   16892 		return true
   16893 	}
   16894 	// match: (MOVHreg x:(MOVHload [off] {sym} ptr mem))
   16895 	// cond: x.Uses == 1 && clobber(x)
   16896 	// result: @x.Block (MOVHload  <v.Type> [off] {sym} ptr mem)
   16897 	for {
   16898 		x := v.Args[0]
   16899 		if x.Op != OpS390XMOVHload {
   16900 			break
   16901 		}
   16902 		off := x.AuxInt
   16903 		sym := x.Aux
   16904 		_ = x.Args[1]
   16905 		ptr := x.Args[0]
   16906 		mem := x.Args[1]
   16907 		if !(x.Uses == 1 && clobber(x)) {
   16908 			break
   16909 		}
   16910 		b = x.Block
   16911 		v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type)
   16912 		v.reset(OpCopy)
   16913 		v.AddArg(v0)
   16914 		v0.AuxInt = off
   16915 		v0.Aux = sym
   16916 		v0.AddArg(ptr)
   16917 		v0.AddArg(mem)
   16918 		return true
   16919 	}
   16920 	return false
   16921 }
   16922 func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool {
   16923 	b := v.Block
   16924 	_ = b
   16925 	// match: (MOVHreg x:(MOVHZloadidx [off] {sym} ptr idx mem))
   16926 	// cond: x.Uses == 1 && clobber(x)
   16927 	// result: @x.Block (MOVHloadidx  <v.Type> [off] {sym} ptr idx mem)
   16928 	for {
   16929 		x := v.Args[0]
   16930 		if x.Op != OpS390XMOVHZloadidx {
   16931 			break
   16932 		}
   16933 		off := x.AuxInt
   16934 		sym := x.Aux
   16935 		_ = x.Args[2]
   16936 		ptr := x.Args[0]
   16937 		idx := x.Args[1]
   16938 		mem := x.Args[2]
   16939 		if !(x.Uses == 1 && clobber(x)) {
   16940 			break
   16941 		}
   16942 		b = x.Block
   16943 		v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type)
   16944 		v.reset(OpCopy)
   16945 		v.AddArg(v0)
   16946 		v0.AuxInt = off
   16947 		v0.Aux = sym
   16948 		v0.AddArg(ptr)
   16949 		v0.AddArg(idx)
   16950 		v0.AddArg(mem)
   16951 		return true
   16952 	}
   16953 	// match: (MOVHreg x:(MOVHloadidx [off] {sym} ptr idx mem))
   16954 	// cond: x.Uses == 1 && clobber(x)
   16955 	// result: @x.Block (MOVHloadidx  <v.Type> [off] {sym} ptr idx mem)
   16956 	for {
   16957 		x := v.Args[0]
   16958 		if x.Op != OpS390XMOVHloadidx {
   16959 			break
   16960 		}
   16961 		off := x.AuxInt
   16962 		sym := x.Aux
   16963 		_ = x.Args[2]
   16964 		ptr := x.Args[0]
   16965 		idx := x.Args[1]
   16966 		mem := x.Args[2]
   16967 		if !(x.Uses == 1 && clobber(x)) {
   16968 			break
   16969 		}
   16970 		b = x.Block
   16971 		v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type)
   16972 		v.reset(OpCopy)
   16973 		v.AddArg(v0)
   16974 		v0.AuxInt = off
   16975 		v0.Aux = sym
   16976 		v0.AddArg(ptr)
   16977 		v0.AddArg(idx)
   16978 		v0.AddArg(mem)
   16979 		return true
   16980 	}
   16981 	return false
   16982 }
   16983 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool {
   16984 	// match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem)
   16985 	// cond:
   16986 	// result: (MOVHstore [off] {sym} ptr x mem)
   16987 	for {
   16988 		off := v.AuxInt
   16989 		sym := v.Aux
   16990 		_ = v.Args[2]
   16991 		ptr := v.Args[0]
   16992 		v_1 := v.Args[1]
   16993 		if v_1.Op != OpS390XMOVHreg {
   16994 			break
   16995 		}
   16996 		x := v_1.Args[0]
   16997 		mem := v.Args[2]
   16998 		v.reset(OpS390XMOVHstore)
   16999 		v.AuxInt = off
   17000 		v.Aux = sym
   17001 		v.AddArg(ptr)
   17002 		v.AddArg(x)
   17003 		v.AddArg(mem)
   17004 		return true
   17005 	}
   17006 	// match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem)
   17007 	// cond:
   17008 	// result: (MOVHstore [off] {sym} ptr x mem)
   17009 	for {
   17010 		off := v.AuxInt
   17011 		sym := v.Aux
   17012 		_ = v.Args[2]
   17013 		ptr := v.Args[0]
   17014 		v_1 := v.Args[1]
   17015 		if v_1.Op != OpS390XMOVHZreg {
   17016 			break
   17017 		}
   17018 		x := v_1.Args[0]
   17019 		mem := v.Args[2]
   17020 		v.reset(OpS390XMOVHstore)
   17021 		v.AuxInt = off
   17022 		v.Aux = sym
   17023 		v.AddArg(ptr)
   17024 		v.AddArg(x)
   17025 		v.AddArg(mem)
   17026 		return true
   17027 	}
   17028 	// match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem)
   17029 	// cond: is20Bit(off1+off2)
   17030 	// result: (MOVHstore  [off1+off2] {sym} ptr val mem)
   17031 	for {
   17032 		off1 := v.AuxInt
   17033 		sym := v.Aux
   17034 		_ = v.Args[2]
   17035 		v_0 := v.Args[0]
   17036 		if v_0.Op != OpS390XADDconst {
   17037 			break
   17038 		}
   17039 		off2 := v_0.AuxInt
   17040 		ptr := v_0.Args[0]
   17041 		val := v.Args[1]
   17042 		mem := v.Args[2]
   17043 		if !(is20Bit(off1 + off2)) {
   17044 			break
   17045 		}
   17046 		v.reset(OpS390XMOVHstore)
   17047 		v.AuxInt = off1 + off2
   17048 		v.Aux = sym
   17049 		v.AddArg(ptr)
   17050 		v.AddArg(val)
   17051 		v.AddArg(mem)
   17052 		return true
   17053 	}
   17054 	// match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem)
   17055 	// cond: isU12Bit(off) && ptr.Op != OpSB
   17056 	// result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem)
   17057 	for {
   17058 		off := v.AuxInt
   17059 		sym := v.Aux
   17060 		_ = v.Args[2]
   17061 		ptr := v.Args[0]
   17062 		v_1 := v.Args[1]
   17063 		if v_1.Op != OpS390XMOVDconst {
   17064 			break
   17065 		}
   17066 		c := v_1.AuxInt
   17067 		mem := v.Args[2]
   17068 		if !(isU12Bit(off) && ptr.Op != OpSB) {
   17069 			break
   17070 		}
   17071 		v.reset(OpS390XMOVHstoreconst)
   17072 		v.AuxInt = makeValAndOff(int64(int16(c)), off)
   17073 		v.Aux = sym
   17074 		v.AddArg(ptr)
   17075 		v.AddArg(mem)
   17076 		return true
   17077 	}
   17078 	// match: (MOVHstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem)
   17079 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))
   17080 	// result: (MOVHstore  [off1+off2] {mergeSym(sym1,sym2)} base val mem)
   17081 	for {
   17082 		off1 := v.AuxInt
   17083 		sym1 := v.Aux
   17084 		_ = v.Args[2]
   17085 		v_0 := v.Args[0]
   17086 		if v_0.Op != OpS390XMOVDaddr {
   17087 			break
   17088 		}
   17089 		t := v_0.Type
   17090 		off2 := v_0.AuxInt
   17091 		sym2 := v_0.Aux
   17092 		base := v_0.Args[0]
   17093 		val := v.Args[1]
   17094 		mem := v.Args[2]
   17095 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) {
   17096 			break
   17097 		}
   17098 		v.reset(OpS390XMOVHstore)
   17099 		v.AuxInt = off1 + off2
   17100 		v.Aux = mergeSym(sym1, sym2)
   17101 		v.AddArg(base)
   17102 		v.AddArg(val)
   17103 		v.AddArg(mem)
   17104 		return true
   17105 	}
   17106 	// match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
   17107 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   17108 	// result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
   17109 	for {
   17110 		off1 := v.AuxInt
   17111 		sym1 := v.Aux
   17112 		_ = v.Args[2]
   17113 		v_0 := v.Args[0]
   17114 		if v_0.Op != OpS390XMOVDaddridx {
   17115 			break
   17116 		}
   17117 		off2 := v_0.AuxInt
   17118 		sym2 := v_0.Aux
   17119 		_ = v_0.Args[1]
   17120 		ptr := v_0.Args[0]
   17121 		idx := v_0.Args[1]
   17122 		val := v.Args[1]
   17123 		mem := v.Args[2]
   17124 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   17125 			break
   17126 		}
   17127 		v.reset(OpS390XMOVHstoreidx)
   17128 		v.AuxInt = off1 + off2
   17129 		v.Aux = mergeSym(sym1, sym2)
   17130 		v.AddArg(ptr)
   17131 		v.AddArg(idx)
   17132 		v.AddArg(val)
   17133 		v.AddArg(mem)
   17134 		return true
   17135 	}
   17136 	// match: (MOVHstore [off] {sym} (ADD ptr idx) val mem)
   17137 	// cond: ptr.Op != OpSB
   17138 	// result: (MOVHstoreidx  [off] {sym} ptr idx val mem)
   17139 	for {
   17140 		off := v.AuxInt
   17141 		sym := v.Aux
   17142 		_ = v.Args[2]
   17143 		v_0 := v.Args[0]
   17144 		if v_0.Op != OpS390XADD {
   17145 			break
   17146 		}
   17147 		_ = v_0.Args[1]
   17148 		ptr := v_0.Args[0]
   17149 		idx := v_0.Args[1]
   17150 		val := v.Args[1]
   17151 		mem := v.Args[2]
   17152 		if !(ptr.Op != OpSB) {
   17153 			break
   17154 		}
   17155 		v.reset(OpS390XMOVHstoreidx)
   17156 		v.AuxInt = off
   17157 		v.Aux = sym
   17158 		v.AddArg(ptr)
   17159 		v.AddArg(idx)
   17160 		v.AddArg(val)
   17161 		v.AddArg(mem)
   17162 		return true
   17163 	}
   17164 	// match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem))
   17165 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   17166 	// result: (MOVWstore [i-2] {s} p w mem)
   17167 	for {
   17168 		i := v.AuxInt
   17169 		s := v.Aux
   17170 		_ = v.Args[2]
   17171 		p := v.Args[0]
   17172 		w := v.Args[1]
   17173 		x := v.Args[2]
   17174 		if x.Op != OpS390XMOVHstore {
   17175 			break
   17176 		}
   17177 		if x.AuxInt != i-2 {
   17178 			break
   17179 		}
   17180 		if x.Aux != s {
   17181 			break
   17182 		}
   17183 		_ = x.Args[2]
   17184 		if p != x.Args[0] {
   17185 			break
   17186 		}
   17187 		x_1 := x.Args[1]
   17188 		if x_1.Op != OpS390XSRDconst {
   17189 			break
   17190 		}
   17191 		if x_1.AuxInt != 16 {
   17192 			break
   17193 		}
   17194 		if w != x_1.Args[0] {
   17195 			break
   17196 		}
   17197 		mem := x.Args[2]
   17198 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   17199 			break
   17200 		}
   17201 		v.reset(OpS390XMOVWstore)
   17202 		v.AuxInt = i - 2
   17203 		v.Aux = s
   17204 		v.AddArg(p)
   17205 		v.AddArg(w)
   17206 		v.AddArg(mem)
   17207 		return true
   17208 	}
   17209 	// match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem))
   17210 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   17211 	// result: (MOVWstore [i-2] {s} p w0 mem)
   17212 	for {
   17213 		i := v.AuxInt
   17214 		s := v.Aux
   17215 		_ = v.Args[2]
   17216 		p := v.Args[0]
   17217 		w0 := v.Args[1]
   17218 		if w0.Op != OpS390XSRDconst {
   17219 			break
   17220 		}
   17221 		j := w0.AuxInt
   17222 		w := w0.Args[0]
   17223 		x := v.Args[2]
   17224 		if x.Op != OpS390XMOVHstore {
   17225 			break
   17226 		}
   17227 		if x.AuxInt != i-2 {
   17228 			break
   17229 		}
   17230 		if x.Aux != s {
   17231 			break
   17232 		}
   17233 		_ = x.Args[2]
   17234 		if p != x.Args[0] {
   17235 			break
   17236 		}
   17237 		x_1 := x.Args[1]
   17238 		if x_1.Op != OpS390XSRDconst {
   17239 			break
   17240 		}
   17241 		if x_1.AuxInt != j+16 {
   17242 			break
   17243 		}
   17244 		if w != x_1.Args[0] {
   17245 			break
   17246 		}
   17247 		mem := x.Args[2]
   17248 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   17249 			break
   17250 		}
   17251 		v.reset(OpS390XMOVWstore)
   17252 		v.AuxInt = i - 2
   17253 		v.Aux = s
   17254 		v.AddArg(p)
   17255 		v.AddArg(w0)
   17256 		v.AddArg(mem)
   17257 		return true
   17258 	}
   17259 	// match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem))
   17260 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   17261 	// result: (MOVWstore [i-2] {s} p w mem)
   17262 	for {
   17263 		i := v.AuxInt
   17264 		s := v.Aux
   17265 		_ = v.Args[2]
   17266 		p := v.Args[0]
   17267 		w := v.Args[1]
   17268 		x := v.Args[2]
   17269 		if x.Op != OpS390XMOVHstore {
   17270 			break
   17271 		}
   17272 		if x.AuxInt != i-2 {
   17273 			break
   17274 		}
   17275 		if x.Aux != s {
   17276 			break
   17277 		}
   17278 		_ = x.Args[2]
   17279 		if p != x.Args[0] {
   17280 			break
   17281 		}
   17282 		x_1 := x.Args[1]
   17283 		if x_1.Op != OpS390XSRWconst {
   17284 			break
   17285 		}
   17286 		if x_1.AuxInt != 16 {
   17287 			break
   17288 		}
   17289 		if w != x_1.Args[0] {
   17290 			break
   17291 		}
   17292 		mem := x.Args[2]
   17293 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   17294 			break
   17295 		}
   17296 		v.reset(OpS390XMOVWstore)
   17297 		v.AuxInt = i - 2
   17298 		v.Aux = s
   17299 		v.AddArg(p)
   17300 		v.AddArg(w)
   17301 		v.AddArg(mem)
   17302 		return true
   17303 	}
   17304 	return false
   17305 }
   17306 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool {
   17307 	// match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem))
   17308 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   17309 	// result: (MOVWstore [i-2] {s} p w0 mem)
   17310 	for {
   17311 		i := v.AuxInt
   17312 		s := v.Aux
   17313 		_ = v.Args[2]
   17314 		p := v.Args[0]
   17315 		w0 := v.Args[1]
   17316 		if w0.Op != OpS390XSRWconst {
   17317 			break
   17318 		}
   17319 		j := w0.AuxInt
   17320 		w := w0.Args[0]
   17321 		x := v.Args[2]
   17322 		if x.Op != OpS390XMOVHstore {
   17323 			break
   17324 		}
   17325 		if x.AuxInt != i-2 {
   17326 			break
   17327 		}
   17328 		if x.Aux != s {
   17329 			break
   17330 		}
   17331 		_ = x.Args[2]
   17332 		if p != x.Args[0] {
   17333 			break
   17334 		}
   17335 		x_1 := x.Args[1]
   17336 		if x_1.Op != OpS390XSRWconst {
   17337 			break
   17338 		}
   17339 		if x_1.AuxInt != j+16 {
   17340 			break
   17341 		}
   17342 		if w != x_1.Args[0] {
   17343 			break
   17344 		}
   17345 		mem := x.Args[2]
   17346 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   17347 			break
   17348 		}
   17349 		v.reset(OpS390XMOVWstore)
   17350 		v.AuxInt = i - 2
   17351 		v.Aux = s
   17352 		v.AddArg(p)
   17353 		v.AddArg(w0)
   17354 		v.AddArg(mem)
   17355 		return true
   17356 	}
   17357 	return false
   17358 }
   17359 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool {
   17360 	b := v.Block
   17361 	_ = b
   17362 	typ := &b.Func.Config.Types
   17363 	_ = typ
   17364 	// match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem)
   17365 	// cond: isU12Bit(ValAndOff(sc).Off()+off)
   17366 	// result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem)
   17367 	for {
   17368 		sc := v.AuxInt
   17369 		s := v.Aux
   17370 		_ = v.Args[1]
   17371 		v_0 := v.Args[0]
   17372 		if v_0.Op != OpS390XADDconst {
   17373 			break
   17374 		}
   17375 		off := v_0.AuxInt
   17376 		ptr := v_0.Args[0]
   17377 		mem := v.Args[1]
   17378 		if !(isU12Bit(ValAndOff(sc).Off() + off)) {
   17379 			break
   17380 		}
   17381 		v.reset(OpS390XMOVHstoreconst)
   17382 		v.AuxInt = ValAndOff(sc).add(off)
   17383 		v.Aux = s
   17384 		v.AddArg(ptr)
   17385 		v.AddArg(mem)
   17386 		return true
   17387 	}
   17388 	// match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem)
   17389 	// cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)
   17390 	// result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem)
   17391 	for {
   17392 		sc := v.AuxInt
   17393 		sym1 := v.Aux
   17394 		_ = v.Args[1]
   17395 		v_0 := v.Args[0]
   17396 		if v_0.Op != OpS390XMOVDaddr {
   17397 			break
   17398 		}
   17399 		off := v_0.AuxInt
   17400 		sym2 := v_0.Aux
   17401 		ptr := v_0.Args[0]
   17402 		mem := v.Args[1]
   17403 		if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) {
   17404 			break
   17405 		}
   17406 		v.reset(OpS390XMOVHstoreconst)
   17407 		v.AuxInt = ValAndOff(sc).add(off)
   17408 		v.Aux = mergeSym(sym1, sym2)
   17409 		v.AddArg(ptr)
   17410 		v.AddArg(mem)
   17411 		return true
   17412 	}
   17413 	// match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem))
   17414 	// cond: p.Op != OpSB   && x.Uses == 1   && ValAndOff(a).Off() + 2 == ValAndOff(c).Off()   && clobber(x)
   17415 	// result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem)
   17416 	for {
   17417 		c := v.AuxInt
   17418 		s := v.Aux
   17419 		_ = v.Args[1]
   17420 		p := v.Args[0]
   17421 		x := v.Args[1]
   17422 		if x.Op != OpS390XMOVHstoreconst {
   17423 			break
   17424 		}
   17425 		a := x.AuxInt
   17426 		if x.Aux != s {
   17427 			break
   17428 		}
   17429 		_ = x.Args[1]
   17430 		if p != x.Args[0] {
   17431 			break
   17432 		}
   17433 		mem := x.Args[1]
   17434 		if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) {
   17435 			break
   17436 		}
   17437 		v.reset(OpS390XMOVWstore)
   17438 		v.AuxInt = ValAndOff(a).Off()
   17439 		v.Aux = s
   17440 		v.AddArg(p)
   17441 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   17442 		v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))
   17443 		v.AddArg(v0)
   17444 		v.AddArg(mem)
   17445 		return true
   17446 	}
   17447 	return false
   17448 }
   17449 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool {
   17450 	// match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
   17451 	// cond: is20Bit(c+d)
   17452 	// result: (MOVHstoreidx  [c+d] {sym} ptr idx val mem)
   17453 	for {
   17454 		c := v.AuxInt
   17455 		sym := v.Aux
   17456 		_ = v.Args[3]
   17457 		v_0 := v.Args[0]
   17458 		if v_0.Op != OpS390XADDconst {
   17459 			break
   17460 		}
   17461 		d := v_0.AuxInt
   17462 		ptr := v_0.Args[0]
   17463 		idx := v.Args[1]
   17464 		val := v.Args[2]
   17465 		mem := v.Args[3]
   17466 		if !(is20Bit(c + d)) {
   17467 			break
   17468 		}
   17469 		v.reset(OpS390XMOVHstoreidx)
   17470 		v.AuxInt = c + d
   17471 		v.Aux = sym
   17472 		v.AddArg(ptr)
   17473 		v.AddArg(idx)
   17474 		v.AddArg(val)
   17475 		v.AddArg(mem)
   17476 		return true
   17477 	}
   17478 	// match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem)
   17479 	// cond: is20Bit(c+d)
   17480 	// result: (MOVHstoreidx  [c+d] {sym} ptr idx val mem)
   17481 	for {
   17482 		c := v.AuxInt
   17483 		sym := v.Aux
   17484 		_ = v.Args[3]
   17485 		idx := v.Args[0]
   17486 		v_1 := v.Args[1]
   17487 		if v_1.Op != OpS390XADDconst {
   17488 			break
   17489 		}
   17490 		d := v_1.AuxInt
   17491 		ptr := v_1.Args[0]
   17492 		val := v.Args[2]
   17493 		mem := v.Args[3]
   17494 		if !(is20Bit(c + d)) {
   17495 			break
   17496 		}
   17497 		v.reset(OpS390XMOVHstoreidx)
   17498 		v.AuxInt = c + d
   17499 		v.Aux = sym
   17500 		v.AddArg(ptr)
   17501 		v.AddArg(idx)
   17502 		v.AddArg(val)
   17503 		v.AddArg(mem)
   17504 		return true
   17505 	}
   17506 	// match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
   17507 	// cond: is20Bit(c+d)
   17508 	// result: (MOVHstoreidx  [c+d] {sym} ptr idx val mem)
   17509 	for {
   17510 		c := v.AuxInt
   17511 		sym := v.Aux
   17512 		_ = v.Args[3]
   17513 		ptr := v.Args[0]
   17514 		v_1 := v.Args[1]
   17515 		if v_1.Op != OpS390XADDconst {
   17516 			break
   17517 		}
   17518 		d := v_1.AuxInt
   17519 		idx := v_1.Args[0]
   17520 		val := v.Args[2]
   17521 		mem := v.Args[3]
   17522 		if !(is20Bit(c + d)) {
   17523 			break
   17524 		}
   17525 		v.reset(OpS390XMOVHstoreidx)
   17526 		v.AuxInt = c + d
   17527 		v.Aux = sym
   17528 		v.AddArg(ptr)
   17529 		v.AddArg(idx)
   17530 		v.AddArg(val)
   17531 		v.AddArg(mem)
   17532 		return true
   17533 	}
   17534 	// match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem)
   17535 	// cond: is20Bit(c+d)
   17536 	// result: (MOVHstoreidx  [c+d] {sym} ptr idx val mem)
   17537 	for {
   17538 		c := v.AuxInt
   17539 		sym := v.Aux
   17540 		_ = v.Args[3]
   17541 		v_0 := v.Args[0]
   17542 		if v_0.Op != OpS390XADDconst {
   17543 			break
   17544 		}
   17545 		d := v_0.AuxInt
   17546 		idx := v_0.Args[0]
   17547 		ptr := v.Args[1]
   17548 		val := v.Args[2]
   17549 		mem := v.Args[3]
   17550 		if !(is20Bit(c + d)) {
   17551 			break
   17552 		}
   17553 		v.reset(OpS390XMOVHstoreidx)
   17554 		v.AuxInt = c + d
   17555 		v.Aux = sym
   17556 		v.AddArg(ptr)
   17557 		v.AddArg(idx)
   17558 		v.AddArg(val)
   17559 		v.AddArg(mem)
   17560 		return true
   17561 	}
   17562 	// match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem))
   17563 	// cond: x.Uses == 1   && clobber(x)
   17564 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   17565 	for {
   17566 		i := v.AuxInt
   17567 		s := v.Aux
   17568 		_ = v.Args[3]
   17569 		p := v.Args[0]
   17570 		idx := v.Args[1]
   17571 		w := v.Args[2]
   17572 		x := v.Args[3]
   17573 		if x.Op != OpS390XMOVHstoreidx {
   17574 			break
   17575 		}
   17576 		if x.AuxInt != i-2 {
   17577 			break
   17578 		}
   17579 		if x.Aux != s {
   17580 			break
   17581 		}
   17582 		_ = x.Args[3]
   17583 		if p != x.Args[0] {
   17584 			break
   17585 		}
   17586 		if idx != x.Args[1] {
   17587 			break
   17588 		}
   17589 		x_2 := x.Args[2]
   17590 		if x_2.Op != OpS390XSRDconst {
   17591 			break
   17592 		}
   17593 		if x_2.AuxInt != 16 {
   17594 			break
   17595 		}
   17596 		if w != x_2.Args[0] {
   17597 			break
   17598 		}
   17599 		mem := x.Args[3]
   17600 		if !(x.Uses == 1 && clobber(x)) {
   17601 			break
   17602 		}
   17603 		v.reset(OpS390XMOVWstoreidx)
   17604 		v.AuxInt = i - 2
   17605 		v.Aux = s
   17606 		v.AddArg(p)
   17607 		v.AddArg(idx)
   17608 		v.AddArg(w)
   17609 		v.AddArg(mem)
   17610 		return true
   17611 	}
   17612 	// match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem))
   17613 	// cond: x.Uses == 1   && clobber(x)
   17614 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   17615 	for {
   17616 		i := v.AuxInt
   17617 		s := v.Aux
   17618 		_ = v.Args[3]
   17619 		p := v.Args[0]
   17620 		idx := v.Args[1]
   17621 		w := v.Args[2]
   17622 		x := v.Args[3]
   17623 		if x.Op != OpS390XMOVHstoreidx {
   17624 			break
   17625 		}
   17626 		if x.AuxInt != i-2 {
   17627 			break
   17628 		}
   17629 		if x.Aux != s {
   17630 			break
   17631 		}
   17632 		_ = x.Args[3]
   17633 		if idx != x.Args[0] {
   17634 			break
   17635 		}
   17636 		if p != x.Args[1] {
   17637 			break
   17638 		}
   17639 		x_2 := x.Args[2]
   17640 		if x_2.Op != OpS390XSRDconst {
   17641 			break
   17642 		}
   17643 		if x_2.AuxInt != 16 {
   17644 			break
   17645 		}
   17646 		if w != x_2.Args[0] {
   17647 			break
   17648 		}
   17649 		mem := x.Args[3]
   17650 		if !(x.Uses == 1 && clobber(x)) {
   17651 			break
   17652 		}
   17653 		v.reset(OpS390XMOVWstoreidx)
   17654 		v.AuxInt = i - 2
   17655 		v.Aux = s
   17656 		v.AddArg(p)
   17657 		v.AddArg(idx)
   17658 		v.AddArg(w)
   17659 		v.AddArg(mem)
   17660 		return true
   17661 	}
   17662 	// match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem))
   17663 	// cond: x.Uses == 1   && clobber(x)
   17664 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   17665 	for {
   17666 		i := v.AuxInt
   17667 		s := v.Aux
   17668 		_ = v.Args[3]
   17669 		idx := v.Args[0]
   17670 		p := v.Args[1]
   17671 		w := v.Args[2]
   17672 		x := v.Args[3]
   17673 		if x.Op != OpS390XMOVHstoreidx {
   17674 			break
   17675 		}
   17676 		if x.AuxInt != i-2 {
   17677 			break
   17678 		}
   17679 		if x.Aux != s {
   17680 			break
   17681 		}
   17682 		_ = x.Args[3]
   17683 		if p != x.Args[0] {
   17684 			break
   17685 		}
   17686 		if idx != x.Args[1] {
   17687 			break
   17688 		}
   17689 		x_2 := x.Args[2]
   17690 		if x_2.Op != OpS390XSRDconst {
   17691 			break
   17692 		}
   17693 		if x_2.AuxInt != 16 {
   17694 			break
   17695 		}
   17696 		if w != x_2.Args[0] {
   17697 			break
   17698 		}
   17699 		mem := x.Args[3]
   17700 		if !(x.Uses == 1 && clobber(x)) {
   17701 			break
   17702 		}
   17703 		v.reset(OpS390XMOVWstoreidx)
   17704 		v.AuxInt = i - 2
   17705 		v.Aux = s
   17706 		v.AddArg(p)
   17707 		v.AddArg(idx)
   17708 		v.AddArg(w)
   17709 		v.AddArg(mem)
   17710 		return true
   17711 	}
   17712 	// match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem))
   17713 	// cond: x.Uses == 1   && clobber(x)
   17714 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   17715 	for {
   17716 		i := v.AuxInt
   17717 		s := v.Aux
   17718 		_ = v.Args[3]
   17719 		idx := v.Args[0]
   17720 		p := v.Args[1]
   17721 		w := v.Args[2]
   17722 		x := v.Args[3]
   17723 		if x.Op != OpS390XMOVHstoreidx {
   17724 			break
   17725 		}
   17726 		if x.AuxInt != i-2 {
   17727 			break
   17728 		}
   17729 		if x.Aux != s {
   17730 			break
   17731 		}
   17732 		_ = x.Args[3]
   17733 		if idx != x.Args[0] {
   17734 			break
   17735 		}
   17736 		if p != x.Args[1] {
   17737 			break
   17738 		}
   17739 		x_2 := x.Args[2]
   17740 		if x_2.Op != OpS390XSRDconst {
   17741 			break
   17742 		}
   17743 		if x_2.AuxInt != 16 {
   17744 			break
   17745 		}
   17746 		if w != x_2.Args[0] {
   17747 			break
   17748 		}
   17749 		mem := x.Args[3]
   17750 		if !(x.Uses == 1 && clobber(x)) {
   17751 			break
   17752 		}
   17753 		v.reset(OpS390XMOVWstoreidx)
   17754 		v.AuxInt = i - 2
   17755 		v.Aux = s
   17756 		v.AddArg(p)
   17757 		v.AddArg(idx)
   17758 		v.AddArg(w)
   17759 		v.AddArg(mem)
   17760 		return true
   17761 	}
   17762 	// match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem))
   17763 	// cond: x.Uses == 1   && clobber(x)
   17764 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   17765 	for {
   17766 		i := v.AuxInt
   17767 		s := v.Aux
   17768 		_ = v.Args[3]
   17769 		p := v.Args[0]
   17770 		idx := v.Args[1]
   17771 		w0 := v.Args[2]
   17772 		if w0.Op != OpS390XSRDconst {
   17773 			break
   17774 		}
   17775 		j := w0.AuxInt
   17776 		w := w0.Args[0]
   17777 		x := v.Args[3]
   17778 		if x.Op != OpS390XMOVHstoreidx {
   17779 			break
   17780 		}
   17781 		if x.AuxInt != i-2 {
   17782 			break
   17783 		}
   17784 		if x.Aux != s {
   17785 			break
   17786 		}
   17787 		_ = x.Args[3]
   17788 		if p != x.Args[0] {
   17789 			break
   17790 		}
   17791 		if idx != x.Args[1] {
   17792 			break
   17793 		}
   17794 		x_2 := x.Args[2]
   17795 		if x_2.Op != OpS390XSRDconst {
   17796 			break
   17797 		}
   17798 		if x_2.AuxInt != j+16 {
   17799 			break
   17800 		}
   17801 		if w != x_2.Args[0] {
   17802 			break
   17803 		}
   17804 		mem := x.Args[3]
   17805 		if !(x.Uses == 1 && clobber(x)) {
   17806 			break
   17807 		}
   17808 		v.reset(OpS390XMOVWstoreidx)
   17809 		v.AuxInt = i - 2
   17810 		v.Aux = s
   17811 		v.AddArg(p)
   17812 		v.AddArg(idx)
   17813 		v.AddArg(w0)
   17814 		v.AddArg(mem)
   17815 		return true
   17816 	}
   17817 	// match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem))
   17818 	// cond: x.Uses == 1   && clobber(x)
   17819 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   17820 	for {
   17821 		i := v.AuxInt
   17822 		s := v.Aux
   17823 		_ = v.Args[3]
   17824 		p := v.Args[0]
   17825 		idx := v.Args[1]
   17826 		w0 := v.Args[2]
   17827 		if w0.Op != OpS390XSRDconst {
   17828 			break
   17829 		}
   17830 		j := w0.AuxInt
   17831 		w := w0.Args[0]
   17832 		x := v.Args[3]
   17833 		if x.Op != OpS390XMOVHstoreidx {
   17834 			break
   17835 		}
   17836 		if x.AuxInt != i-2 {
   17837 			break
   17838 		}
   17839 		if x.Aux != s {
   17840 			break
   17841 		}
   17842 		_ = x.Args[3]
   17843 		if idx != x.Args[0] {
   17844 			break
   17845 		}
   17846 		if p != x.Args[1] {
   17847 			break
   17848 		}
   17849 		x_2 := x.Args[2]
   17850 		if x_2.Op != OpS390XSRDconst {
   17851 			break
   17852 		}
   17853 		if x_2.AuxInt != j+16 {
   17854 			break
   17855 		}
   17856 		if w != x_2.Args[0] {
   17857 			break
   17858 		}
   17859 		mem := x.Args[3]
   17860 		if !(x.Uses == 1 && clobber(x)) {
   17861 			break
   17862 		}
   17863 		v.reset(OpS390XMOVWstoreidx)
   17864 		v.AuxInt = i - 2
   17865 		v.Aux = s
   17866 		v.AddArg(p)
   17867 		v.AddArg(idx)
   17868 		v.AddArg(w0)
   17869 		v.AddArg(mem)
   17870 		return true
   17871 	}
   17872 	return false
   17873 }
   17874 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool {
   17875 	// match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem))
   17876 	// cond: x.Uses == 1   && clobber(x)
   17877 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   17878 	for {
   17879 		i := v.AuxInt
   17880 		s := v.Aux
   17881 		_ = v.Args[3]
   17882 		idx := v.Args[0]
   17883 		p := v.Args[1]
   17884 		w0 := v.Args[2]
   17885 		if w0.Op != OpS390XSRDconst {
   17886 			break
   17887 		}
   17888 		j := w0.AuxInt
   17889 		w := w0.Args[0]
   17890 		x := v.Args[3]
   17891 		if x.Op != OpS390XMOVHstoreidx {
   17892 			break
   17893 		}
   17894 		if x.AuxInt != i-2 {
   17895 			break
   17896 		}
   17897 		if x.Aux != s {
   17898 			break
   17899 		}
   17900 		_ = x.Args[3]
   17901 		if p != x.Args[0] {
   17902 			break
   17903 		}
   17904 		if idx != x.Args[1] {
   17905 			break
   17906 		}
   17907 		x_2 := x.Args[2]
   17908 		if x_2.Op != OpS390XSRDconst {
   17909 			break
   17910 		}
   17911 		if x_2.AuxInt != j+16 {
   17912 			break
   17913 		}
   17914 		if w != x_2.Args[0] {
   17915 			break
   17916 		}
   17917 		mem := x.Args[3]
   17918 		if !(x.Uses == 1 && clobber(x)) {
   17919 			break
   17920 		}
   17921 		v.reset(OpS390XMOVWstoreidx)
   17922 		v.AuxInt = i - 2
   17923 		v.Aux = s
   17924 		v.AddArg(p)
   17925 		v.AddArg(idx)
   17926 		v.AddArg(w0)
   17927 		v.AddArg(mem)
   17928 		return true
   17929 	}
   17930 	// match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem))
   17931 	// cond: x.Uses == 1   && clobber(x)
   17932 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   17933 	for {
   17934 		i := v.AuxInt
   17935 		s := v.Aux
   17936 		_ = v.Args[3]
   17937 		idx := v.Args[0]
   17938 		p := v.Args[1]
   17939 		w0 := v.Args[2]
   17940 		if w0.Op != OpS390XSRDconst {
   17941 			break
   17942 		}
   17943 		j := w0.AuxInt
   17944 		w := w0.Args[0]
   17945 		x := v.Args[3]
   17946 		if x.Op != OpS390XMOVHstoreidx {
   17947 			break
   17948 		}
   17949 		if x.AuxInt != i-2 {
   17950 			break
   17951 		}
   17952 		if x.Aux != s {
   17953 			break
   17954 		}
   17955 		_ = x.Args[3]
   17956 		if idx != x.Args[0] {
   17957 			break
   17958 		}
   17959 		if p != x.Args[1] {
   17960 			break
   17961 		}
   17962 		x_2 := x.Args[2]
   17963 		if x_2.Op != OpS390XSRDconst {
   17964 			break
   17965 		}
   17966 		if x_2.AuxInt != j+16 {
   17967 			break
   17968 		}
   17969 		if w != x_2.Args[0] {
   17970 			break
   17971 		}
   17972 		mem := x.Args[3]
   17973 		if !(x.Uses == 1 && clobber(x)) {
   17974 			break
   17975 		}
   17976 		v.reset(OpS390XMOVWstoreidx)
   17977 		v.AuxInt = i - 2
   17978 		v.Aux = s
   17979 		v.AddArg(p)
   17980 		v.AddArg(idx)
   17981 		v.AddArg(w0)
   17982 		v.AddArg(mem)
   17983 		return true
   17984 	}
   17985 	// match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem))
   17986 	// cond: x.Uses == 1   && clobber(x)
   17987 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   17988 	for {
   17989 		i := v.AuxInt
   17990 		s := v.Aux
   17991 		_ = v.Args[3]
   17992 		p := v.Args[0]
   17993 		idx := v.Args[1]
   17994 		w := v.Args[2]
   17995 		x := v.Args[3]
   17996 		if x.Op != OpS390XMOVHstoreidx {
   17997 			break
   17998 		}
   17999 		if x.AuxInt != i-2 {
   18000 			break
   18001 		}
   18002 		if x.Aux != s {
   18003 			break
   18004 		}
   18005 		_ = x.Args[3]
   18006 		if p != x.Args[0] {
   18007 			break
   18008 		}
   18009 		if idx != x.Args[1] {
   18010 			break
   18011 		}
   18012 		x_2 := x.Args[2]
   18013 		if x_2.Op != OpS390XSRWconst {
   18014 			break
   18015 		}
   18016 		if x_2.AuxInt != 16 {
   18017 			break
   18018 		}
   18019 		if w != x_2.Args[0] {
   18020 			break
   18021 		}
   18022 		mem := x.Args[3]
   18023 		if !(x.Uses == 1 && clobber(x)) {
   18024 			break
   18025 		}
   18026 		v.reset(OpS390XMOVWstoreidx)
   18027 		v.AuxInt = i - 2
   18028 		v.Aux = s
   18029 		v.AddArg(p)
   18030 		v.AddArg(idx)
   18031 		v.AddArg(w)
   18032 		v.AddArg(mem)
   18033 		return true
   18034 	}
   18035 	// match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem))
   18036 	// cond: x.Uses == 1   && clobber(x)
   18037 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   18038 	for {
   18039 		i := v.AuxInt
   18040 		s := v.Aux
   18041 		_ = v.Args[3]
   18042 		p := v.Args[0]
   18043 		idx := v.Args[1]
   18044 		w := v.Args[2]
   18045 		x := v.Args[3]
   18046 		if x.Op != OpS390XMOVHstoreidx {
   18047 			break
   18048 		}
   18049 		if x.AuxInt != i-2 {
   18050 			break
   18051 		}
   18052 		if x.Aux != s {
   18053 			break
   18054 		}
   18055 		_ = x.Args[3]
   18056 		if idx != x.Args[0] {
   18057 			break
   18058 		}
   18059 		if p != x.Args[1] {
   18060 			break
   18061 		}
   18062 		x_2 := x.Args[2]
   18063 		if x_2.Op != OpS390XSRWconst {
   18064 			break
   18065 		}
   18066 		if x_2.AuxInt != 16 {
   18067 			break
   18068 		}
   18069 		if w != x_2.Args[0] {
   18070 			break
   18071 		}
   18072 		mem := x.Args[3]
   18073 		if !(x.Uses == 1 && clobber(x)) {
   18074 			break
   18075 		}
   18076 		v.reset(OpS390XMOVWstoreidx)
   18077 		v.AuxInt = i - 2
   18078 		v.Aux = s
   18079 		v.AddArg(p)
   18080 		v.AddArg(idx)
   18081 		v.AddArg(w)
   18082 		v.AddArg(mem)
   18083 		return true
   18084 	}
   18085 	// match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem))
   18086 	// cond: x.Uses == 1   && clobber(x)
   18087 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   18088 	for {
   18089 		i := v.AuxInt
   18090 		s := v.Aux
   18091 		_ = v.Args[3]
   18092 		idx := v.Args[0]
   18093 		p := v.Args[1]
   18094 		w := v.Args[2]
   18095 		x := v.Args[3]
   18096 		if x.Op != OpS390XMOVHstoreidx {
   18097 			break
   18098 		}
   18099 		if x.AuxInt != i-2 {
   18100 			break
   18101 		}
   18102 		if x.Aux != s {
   18103 			break
   18104 		}
   18105 		_ = x.Args[3]
   18106 		if p != x.Args[0] {
   18107 			break
   18108 		}
   18109 		if idx != x.Args[1] {
   18110 			break
   18111 		}
   18112 		x_2 := x.Args[2]
   18113 		if x_2.Op != OpS390XSRWconst {
   18114 			break
   18115 		}
   18116 		if x_2.AuxInt != 16 {
   18117 			break
   18118 		}
   18119 		if w != x_2.Args[0] {
   18120 			break
   18121 		}
   18122 		mem := x.Args[3]
   18123 		if !(x.Uses == 1 && clobber(x)) {
   18124 			break
   18125 		}
   18126 		v.reset(OpS390XMOVWstoreidx)
   18127 		v.AuxInt = i - 2
   18128 		v.Aux = s
   18129 		v.AddArg(p)
   18130 		v.AddArg(idx)
   18131 		v.AddArg(w)
   18132 		v.AddArg(mem)
   18133 		return true
   18134 	}
   18135 	// match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem))
   18136 	// cond: x.Uses == 1   && clobber(x)
   18137 	// result: (MOVWstoreidx [i-2] {s} p idx w mem)
   18138 	for {
   18139 		i := v.AuxInt
   18140 		s := v.Aux
   18141 		_ = v.Args[3]
   18142 		idx := v.Args[0]
   18143 		p := v.Args[1]
   18144 		w := v.Args[2]
   18145 		x := v.Args[3]
   18146 		if x.Op != OpS390XMOVHstoreidx {
   18147 			break
   18148 		}
   18149 		if x.AuxInt != i-2 {
   18150 			break
   18151 		}
   18152 		if x.Aux != s {
   18153 			break
   18154 		}
   18155 		_ = x.Args[3]
   18156 		if idx != x.Args[0] {
   18157 			break
   18158 		}
   18159 		if p != x.Args[1] {
   18160 			break
   18161 		}
   18162 		x_2 := x.Args[2]
   18163 		if x_2.Op != OpS390XSRWconst {
   18164 			break
   18165 		}
   18166 		if x_2.AuxInt != 16 {
   18167 			break
   18168 		}
   18169 		if w != x_2.Args[0] {
   18170 			break
   18171 		}
   18172 		mem := x.Args[3]
   18173 		if !(x.Uses == 1 && clobber(x)) {
   18174 			break
   18175 		}
   18176 		v.reset(OpS390XMOVWstoreidx)
   18177 		v.AuxInt = i - 2
   18178 		v.Aux = s
   18179 		v.AddArg(p)
   18180 		v.AddArg(idx)
   18181 		v.AddArg(w)
   18182 		v.AddArg(mem)
   18183 		return true
   18184 	}
   18185 	// match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem))
   18186 	// cond: x.Uses == 1   && clobber(x)
   18187 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   18188 	for {
   18189 		i := v.AuxInt
   18190 		s := v.Aux
   18191 		_ = v.Args[3]
   18192 		p := v.Args[0]
   18193 		idx := v.Args[1]
   18194 		w0 := v.Args[2]
   18195 		if w0.Op != OpS390XSRWconst {
   18196 			break
   18197 		}
   18198 		j := w0.AuxInt
   18199 		w := w0.Args[0]
   18200 		x := v.Args[3]
   18201 		if x.Op != OpS390XMOVHstoreidx {
   18202 			break
   18203 		}
   18204 		if x.AuxInt != i-2 {
   18205 			break
   18206 		}
   18207 		if x.Aux != s {
   18208 			break
   18209 		}
   18210 		_ = x.Args[3]
   18211 		if p != x.Args[0] {
   18212 			break
   18213 		}
   18214 		if idx != x.Args[1] {
   18215 			break
   18216 		}
   18217 		x_2 := x.Args[2]
   18218 		if x_2.Op != OpS390XSRWconst {
   18219 			break
   18220 		}
   18221 		if x_2.AuxInt != j+16 {
   18222 			break
   18223 		}
   18224 		if w != x_2.Args[0] {
   18225 			break
   18226 		}
   18227 		mem := x.Args[3]
   18228 		if !(x.Uses == 1 && clobber(x)) {
   18229 			break
   18230 		}
   18231 		v.reset(OpS390XMOVWstoreidx)
   18232 		v.AuxInt = i - 2
   18233 		v.Aux = s
   18234 		v.AddArg(p)
   18235 		v.AddArg(idx)
   18236 		v.AddArg(w0)
   18237 		v.AddArg(mem)
   18238 		return true
   18239 	}
   18240 	// match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem))
   18241 	// cond: x.Uses == 1   && clobber(x)
   18242 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   18243 	for {
   18244 		i := v.AuxInt
   18245 		s := v.Aux
   18246 		_ = v.Args[3]
   18247 		p := v.Args[0]
   18248 		idx := v.Args[1]
   18249 		w0 := v.Args[2]
   18250 		if w0.Op != OpS390XSRWconst {
   18251 			break
   18252 		}
   18253 		j := w0.AuxInt
   18254 		w := w0.Args[0]
   18255 		x := v.Args[3]
   18256 		if x.Op != OpS390XMOVHstoreidx {
   18257 			break
   18258 		}
   18259 		if x.AuxInt != i-2 {
   18260 			break
   18261 		}
   18262 		if x.Aux != s {
   18263 			break
   18264 		}
   18265 		_ = x.Args[3]
   18266 		if idx != x.Args[0] {
   18267 			break
   18268 		}
   18269 		if p != x.Args[1] {
   18270 			break
   18271 		}
   18272 		x_2 := x.Args[2]
   18273 		if x_2.Op != OpS390XSRWconst {
   18274 			break
   18275 		}
   18276 		if x_2.AuxInt != j+16 {
   18277 			break
   18278 		}
   18279 		if w != x_2.Args[0] {
   18280 			break
   18281 		}
   18282 		mem := x.Args[3]
   18283 		if !(x.Uses == 1 && clobber(x)) {
   18284 			break
   18285 		}
   18286 		v.reset(OpS390XMOVWstoreidx)
   18287 		v.AuxInt = i - 2
   18288 		v.Aux = s
   18289 		v.AddArg(p)
   18290 		v.AddArg(idx)
   18291 		v.AddArg(w0)
   18292 		v.AddArg(mem)
   18293 		return true
   18294 	}
   18295 	// match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem))
   18296 	// cond: x.Uses == 1   && clobber(x)
   18297 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   18298 	for {
   18299 		i := v.AuxInt
   18300 		s := v.Aux
   18301 		_ = v.Args[3]
   18302 		idx := v.Args[0]
   18303 		p := v.Args[1]
   18304 		w0 := v.Args[2]
   18305 		if w0.Op != OpS390XSRWconst {
   18306 			break
   18307 		}
   18308 		j := w0.AuxInt
   18309 		w := w0.Args[0]
   18310 		x := v.Args[3]
   18311 		if x.Op != OpS390XMOVHstoreidx {
   18312 			break
   18313 		}
   18314 		if x.AuxInt != i-2 {
   18315 			break
   18316 		}
   18317 		if x.Aux != s {
   18318 			break
   18319 		}
   18320 		_ = x.Args[3]
   18321 		if p != x.Args[0] {
   18322 			break
   18323 		}
   18324 		if idx != x.Args[1] {
   18325 			break
   18326 		}
   18327 		x_2 := x.Args[2]
   18328 		if x_2.Op != OpS390XSRWconst {
   18329 			break
   18330 		}
   18331 		if x_2.AuxInt != j+16 {
   18332 			break
   18333 		}
   18334 		if w != x_2.Args[0] {
   18335 			break
   18336 		}
   18337 		mem := x.Args[3]
   18338 		if !(x.Uses == 1 && clobber(x)) {
   18339 			break
   18340 		}
   18341 		v.reset(OpS390XMOVWstoreidx)
   18342 		v.AuxInt = i - 2
   18343 		v.Aux = s
   18344 		v.AddArg(p)
   18345 		v.AddArg(idx)
   18346 		v.AddArg(w0)
   18347 		v.AddArg(mem)
   18348 		return true
   18349 	}
   18350 	// match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem))
   18351 	// cond: x.Uses == 1   && clobber(x)
   18352 	// result: (MOVWstoreidx [i-2] {s} p idx w0 mem)
   18353 	for {
   18354 		i := v.AuxInt
   18355 		s := v.Aux
   18356 		_ = v.Args[3]
   18357 		idx := v.Args[0]
   18358 		p := v.Args[1]
   18359 		w0 := v.Args[2]
   18360 		if w0.Op != OpS390XSRWconst {
   18361 			break
   18362 		}
   18363 		j := w0.AuxInt
   18364 		w := w0.Args[0]
   18365 		x := v.Args[3]
   18366 		if x.Op != OpS390XMOVHstoreidx {
   18367 			break
   18368 		}
   18369 		if x.AuxInt != i-2 {
   18370 			break
   18371 		}
   18372 		if x.Aux != s {
   18373 			break
   18374 		}
   18375 		_ = x.Args[3]
   18376 		if idx != x.Args[0] {
   18377 			break
   18378 		}
   18379 		if p != x.Args[1] {
   18380 			break
   18381 		}
   18382 		x_2 := x.Args[2]
   18383 		if x_2.Op != OpS390XSRWconst {
   18384 			break
   18385 		}
   18386 		if x_2.AuxInt != j+16 {
   18387 			break
   18388 		}
   18389 		if w != x_2.Args[0] {
   18390 			break
   18391 		}
   18392 		mem := x.Args[3]
   18393 		if !(x.Uses == 1 && clobber(x)) {
   18394 			break
   18395 		}
   18396 		v.reset(OpS390XMOVWstoreidx)
   18397 		v.AuxInt = i - 2
   18398 		v.Aux = s
   18399 		v.AddArg(p)
   18400 		v.AddArg(idx)
   18401 		v.AddArg(w0)
   18402 		v.AddArg(mem)
   18403 		return true
   18404 	}
   18405 	return false
   18406 }
   18407 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool {
   18408 	// match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem))
   18409 	// cond: x.Uses == 1   && clobber(x)
   18410 	// result: (MOVDBRstore [i-4] {s} p w mem)
   18411 	for {
   18412 		i := v.AuxInt
   18413 		s := v.Aux
   18414 		_ = v.Args[2]
   18415 		p := v.Args[0]
   18416 		v_1 := v.Args[1]
   18417 		if v_1.Op != OpS390XSRDconst {
   18418 			break
   18419 		}
   18420 		if v_1.AuxInt != 32 {
   18421 			break
   18422 		}
   18423 		w := v_1.Args[0]
   18424 		x := v.Args[2]
   18425 		if x.Op != OpS390XMOVWBRstore {
   18426 			break
   18427 		}
   18428 		if x.AuxInt != i-4 {
   18429 			break
   18430 		}
   18431 		if x.Aux != s {
   18432 			break
   18433 		}
   18434 		_ = x.Args[2]
   18435 		if p != x.Args[0] {
   18436 			break
   18437 		}
   18438 		if w != x.Args[1] {
   18439 			break
   18440 		}
   18441 		mem := x.Args[2]
   18442 		if !(x.Uses == 1 && clobber(x)) {
   18443 			break
   18444 		}
   18445 		v.reset(OpS390XMOVDBRstore)
   18446 		v.AuxInt = i - 4
   18447 		v.Aux = s
   18448 		v.AddArg(p)
   18449 		v.AddArg(w)
   18450 		v.AddArg(mem)
   18451 		return true
   18452 	}
   18453 	// match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem))
   18454 	// cond: x.Uses == 1   && clobber(x)
   18455 	// result: (MOVDBRstore [i-4] {s} p w0 mem)
   18456 	for {
   18457 		i := v.AuxInt
   18458 		s := v.Aux
   18459 		_ = v.Args[2]
   18460 		p := v.Args[0]
   18461 		v_1 := v.Args[1]
   18462 		if v_1.Op != OpS390XSRDconst {
   18463 			break
   18464 		}
   18465 		j := v_1.AuxInt
   18466 		w := v_1.Args[0]
   18467 		x := v.Args[2]
   18468 		if x.Op != OpS390XMOVWBRstore {
   18469 			break
   18470 		}
   18471 		if x.AuxInt != i-4 {
   18472 			break
   18473 		}
   18474 		if x.Aux != s {
   18475 			break
   18476 		}
   18477 		_ = x.Args[2]
   18478 		if p != x.Args[0] {
   18479 			break
   18480 		}
   18481 		w0 := x.Args[1]
   18482 		if w0.Op != OpS390XSRDconst {
   18483 			break
   18484 		}
   18485 		if w0.AuxInt != j-32 {
   18486 			break
   18487 		}
   18488 		if w != w0.Args[0] {
   18489 			break
   18490 		}
   18491 		mem := x.Args[2]
   18492 		if !(x.Uses == 1 && clobber(x)) {
   18493 			break
   18494 		}
   18495 		v.reset(OpS390XMOVDBRstore)
   18496 		v.AuxInt = i - 4
   18497 		v.Aux = s
   18498 		v.AddArg(p)
   18499 		v.AddArg(w0)
   18500 		v.AddArg(mem)
   18501 		return true
   18502 	}
   18503 	return false
   18504 }
   18505 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool {
   18506 	// match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem))
   18507 	// cond: x.Uses == 1   && clobber(x)
   18508 	// result: (MOVDBRstoreidx [i-4] {s} p idx w mem)
   18509 	for {
   18510 		i := v.AuxInt
   18511 		s := v.Aux
   18512 		_ = v.Args[3]
   18513 		p := v.Args[0]
   18514 		idx := v.Args[1]
   18515 		v_2 := v.Args[2]
   18516 		if v_2.Op != OpS390XSRDconst {
   18517 			break
   18518 		}
   18519 		if v_2.AuxInt != 32 {
   18520 			break
   18521 		}
   18522 		w := v_2.Args[0]
   18523 		x := v.Args[3]
   18524 		if x.Op != OpS390XMOVWBRstoreidx {
   18525 			break
   18526 		}
   18527 		if x.AuxInt != i-4 {
   18528 			break
   18529 		}
   18530 		if x.Aux != s {
   18531 			break
   18532 		}
   18533 		_ = x.Args[3]
   18534 		if p != x.Args[0] {
   18535 			break
   18536 		}
   18537 		if idx != x.Args[1] {
   18538 			break
   18539 		}
   18540 		if w != x.Args[2] {
   18541 			break
   18542 		}
   18543 		mem := x.Args[3]
   18544 		if !(x.Uses == 1 && clobber(x)) {
   18545 			break
   18546 		}
   18547 		v.reset(OpS390XMOVDBRstoreidx)
   18548 		v.AuxInt = i - 4
   18549 		v.Aux = s
   18550 		v.AddArg(p)
   18551 		v.AddArg(idx)
   18552 		v.AddArg(w)
   18553 		v.AddArg(mem)
   18554 		return true
   18555 	}
   18556 	// match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem))
   18557 	// cond: x.Uses == 1   && clobber(x)
   18558 	// result: (MOVDBRstoreidx [i-4] {s} p idx w mem)
   18559 	for {
   18560 		i := v.AuxInt
   18561 		s := v.Aux
   18562 		_ = v.Args[3]
   18563 		p := v.Args[0]
   18564 		idx := v.Args[1]
   18565 		v_2 := v.Args[2]
   18566 		if v_2.Op != OpS390XSRDconst {
   18567 			break
   18568 		}
   18569 		if v_2.AuxInt != 32 {
   18570 			break
   18571 		}
   18572 		w := v_2.Args[0]
   18573 		x := v.Args[3]
   18574 		if x.Op != OpS390XMOVWBRstoreidx {
   18575 			break
   18576 		}
   18577 		if x.AuxInt != i-4 {
   18578 			break
   18579 		}
   18580 		if x.Aux != s {
   18581 			break
   18582 		}
   18583 		_ = x.Args[3]
   18584 		if idx != x.Args[0] {
   18585 			break
   18586 		}
   18587 		if p != x.Args[1] {
   18588 			break
   18589 		}
   18590 		if w != x.Args[2] {
   18591 			break
   18592 		}
   18593 		mem := x.Args[3]
   18594 		if !(x.Uses == 1 && clobber(x)) {
   18595 			break
   18596 		}
   18597 		v.reset(OpS390XMOVDBRstoreidx)
   18598 		v.AuxInt = i - 4
   18599 		v.Aux = s
   18600 		v.AddArg(p)
   18601 		v.AddArg(idx)
   18602 		v.AddArg(w)
   18603 		v.AddArg(mem)
   18604 		return true
   18605 	}
   18606 	// match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem))
   18607 	// cond: x.Uses == 1   && clobber(x)
   18608 	// result: (MOVDBRstoreidx [i-4] {s} p idx w mem)
   18609 	for {
   18610 		i := v.AuxInt
   18611 		s := v.Aux
   18612 		_ = v.Args[3]
   18613 		idx := v.Args[0]
   18614 		p := v.Args[1]
   18615 		v_2 := v.Args[2]
   18616 		if v_2.Op != OpS390XSRDconst {
   18617 			break
   18618 		}
   18619 		if v_2.AuxInt != 32 {
   18620 			break
   18621 		}
   18622 		w := v_2.Args[0]
   18623 		x := v.Args[3]
   18624 		if x.Op != OpS390XMOVWBRstoreidx {
   18625 			break
   18626 		}
   18627 		if x.AuxInt != i-4 {
   18628 			break
   18629 		}
   18630 		if x.Aux != s {
   18631 			break
   18632 		}
   18633 		_ = x.Args[3]
   18634 		if p != x.Args[0] {
   18635 			break
   18636 		}
   18637 		if idx != x.Args[1] {
   18638 			break
   18639 		}
   18640 		if w != x.Args[2] {
   18641 			break
   18642 		}
   18643 		mem := x.Args[3]
   18644 		if !(x.Uses == 1 && clobber(x)) {
   18645 			break
   18646 		}
   18647 		v.reset(OpS390XMOVDBRstoreidx)
   18648 		v.AuxInt = i - 4
   18649 		v.Aux = s
   18650 		v.AddArg(p)
   18651 		v.AddArg(idx)
   18652 		v.AddArg(w)
   18653 		v.AddArg(mem)
   18654 		return true
   18655 	}
   18656 	// match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem))
   18657 	// cond: x.Uses == 1   && clobber(x)
   18658 	// result: (MOVDBRstoreidx [i-4] {s} p idx w mem)
   18659 	for {
   18660 		i := v.AuxInt
   18661 		s := v.Aux
   18662 		_ = v.Args[3]
   18663 		idx := v.Args[0]
   18664 		p := v.Args[1]
   18665 		v_2 := v.Args[2]
   18666 		if v_2.Op != OpS390XSRDconst {
   18667 			break
   18668 		}
   18669 		if v_2.AuxInt != 32 {
   18670 			break
   18671 		}
   18672 		w := v_2.Args[0]
   18673 		x := v.Args[3]
   18674 		if x.Op != OpS390XMOVWBRstoreidx {
   18675 			break
   18676 		}
   18677 		if x.AuxInt != i-4 {
   18678 			break
   18679 		}
   18680 		if x.Aux != s {
   18681 			break
   18682 		}
   18683 		_ = x.Args[3]
   18684 		if idx != x.Args[0] {
   18685 			break
   18686 		}
   18687 		if p != x.Args[1] {
   18688 			break
   18689 		}
   18690 		if w != x.Args[2] {
   18691 			break
   18692 		}
   18693 		mem := x.Args[3]
   18694 		if !(x.Uses == 1 && clobber(x)) {
   18695 			break
   18696 		}
   18697 		v.reset(OpS390XMOVDBRstoreidx)
   18698 		v.AuxInt = i - 4
   18699 		v.Aux = s
   18700 		v.AddArg(p)
   18701 		v.AddArg(idx)
   18702 		v.AddArg(w)
   18703 		v.AddArg(mem)
   18704 		return true
   18705 	}
   18706 	// match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem))
   18707 	// cond: x.Uses == 1   && clobber(x)
   18708 	// result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem)
   18709 	for {
   18710 		i := v.AuxInt
   18711 		s := v.Aux
   18712 		_ = v.Args[3]
   18713 		p := v.Args[0]
   18714 		idx := v.Args[1]
   18715 		v_2 := v.Args[2]
   18716 		if v_2.Op != OpS390XSRDconst {
   18717 			break
   18718 		}
   18719 		j := v_2.AuxInt
   18720 		w := v_2.Args[0]
   18721 		x := v.Args[3]
   18722 		if x.Op != OpS390XMOVWBRstoreidx {
   18723 			break
   18724 		}
   18725 		if x.AuxInt != i-4 {
   18726 			break
   18727 		}
   18728 		if x.Aux != s {
   18729 			break
   18730 		}
   18731 		_ = x.Args[3]
   18732 		if p != x.Args[0] {
   18733 			break
   18734 		}
   18735 		if idx != x.Args[1] {
   18736 			break
   18737 		}
   18738 		w0 := x.Args[2]
   18739 		if w0.Op != OpS390XSRDconst {
   18740 			break
   18741 		}
   18742 		if w0.AuxInt != j-32 {
   18743 			break
   18744 		}
   18745 		if w != w0.Args[0] {
   18746 			break
   18747 		}
   18748 		mem := x.Args[3]
   18749 		if !(x.Uses == 1 && clobber(x)) {
   18750 			break
   18751 		}
   18752 		v.reset(OpS390XMOVDBRstoreidx)
   18753 		v.AuxInt = i - 4
   18754 		v.Aux = s
   18755 		v.AddArg(p)
   18756 		v.AddArg(idx)
   18757 		v.AddArg(w0)
   18758 		v.AddArg(mem)
   18759 		return true
   18760 	}
   18761 	// match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem))
   18762 	// cond: x.Uses == 1   && clobber(x)
   18763 	// result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem)
   18764 	for {
   18765 		i := v.AuxInt
   18766 		s := v.Aux
   18767 		_ = v.Args[3]
   18768 		p := v.Args[0]
   18769 		idx := v.Args[1]
   18770 		v_2 := v.Args[2]
   18771 		if v_2.Op != OpS390XSRDconst {
   18772 			break
   18773 		}
   18774 		j := v_2.AuxInt
   18775 		w := v_2.Args[0]
   18776 		x := v.Args[3]
   18777 		if x.Op != OpS390XMOVWBRstoreidx {
   18778 			break
   18779 		}
   18780 		if x.AuxInt != i-4 {
   18781 			break
   18782 		}
   18783 		if x.Aux != s {
   18784 			break
   18785 		}
   18786 		_ = x.Args[3]
   18787 		if idx != x.Args[0] {
   18788 			break
   18789 		}
   18790 		if p != x.Args[1] {
   18791 			break
   18792 		}
   18793 		w0 := x.Args[2]
   18794 		if w0.Op != OpS390XSRDconst {
   18795 			break
   18796 		}
   18797 		if w0.AuxInt != j-32 {
   18798 			break
   18799 		}
   18800 		if w != w0.Args[0] {
   18801 			break
   18802 		}
   18803 		mem := x.Args[3]
   18804 		if !(x.Uses == 1 && clobber(x)) {
   18805 			break
   18806 		}
   18807 		v.reset(OpS390XMOVDBRstoreidx)
   18808 		v.AuxInt = i - 4
   18809 		v.Aux = s
   18810 		v.AddArg(p)
   18811 		v.AddArg(idx)
   18812 		v.AddArg(w0)
   18813 		v.AddArg(mem)
   18814 		return true
   18815 	}
   18816 	// match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem))
   18817 	// cond: x.Uses == 1   && clobber(x)
   18818 	// result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem)
   18819 	for {
   18820 		i := v.AuxInt
   18821 		s := v.Aux
   18822 		_ = v.Args[3]
   18823 		idx := v.Args[0]
   18824 		p := v.Args[1]
   18825 		v_2 := v.Args[2]
   18826 		if v_2.Op != OpS390XSRDconst {
   18827 			break
   18828 		}
   18829 		j := v_2.AuxInt
   18830 		w := v_2.Args[0]
   18831 		x := v.Args[3]
   18832 		if x.Op != OpS390XMOVWBRstoreidx {
   18833 			break
   18834 		}
   18835 		if x.AuxInt != i-4 {
   18836 			break
   18837 		}
   18838 		if x.Aux != s {
   18839 			break
   18840 		}
   18841 		_ = x.Args[3]
   18842 		if p != x.Args[0] {
   18843 			break
   18844 		}
   18845 		if idx != x.Args[1] {
   18846 			break
   18847 		}
   18848 		w0 := x.Args[2]
   18849 		if w0.Op != OpS390XSRDconst {
   18850 			break
   18851 		}
   18852 		if w0.AuxInt != j-32 {
   18853 			break
   18854 		}
   18855 		if w != w0.Args[0] {
   18856 			break
   18857 		}
   18858 		mem := x.Args[3]
   18859 		if !(x.Uses == 1 && clobber(x)) {
   18860 			break
   18861 		}
   18862 		v.reset(OpS390XMOVDBRstoreidx)
   18863 		v.AuxInt = i - 4
   18864 		v.Aux = s
   18865 		v.AddArg(p)
   18866 		v.AddArg(idx)
   18867 		v.AddArg(w0)
   18868 		v.AddArg(mem)
   18869 		return true
   18870 	}
   18871 	// match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem))
   18872 	// cond: x.Uses == 1   && clobber(x)
   18873 	// result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem)
   18874 	for {
   18875 		i := v.AuxInt
   18876 		s := v.Aux
   18877 		_ = v.Args[3]
   18878 		idx := v.Args[0]
   18879 		p := v.Args[1]
   18880 		v_2 := v.Args[2]
   18881 		if v_2.Op != OpS390XSRDconst {
   18882 			break
   18883 		}
   18884 		j := v_2.AuxInt
   18885 		w := v_2.Args[0]
   18886 		x := v.Args[3]
   18887 		if x.Op != OpS390XMOVWBRstoreidx {
   18888 			break
   18889 		}
   18890 		if x.AuxInt != i-4 {
   18891 			break
   18892 		}
   18893 		if x.Aux != s {
   18894 			break
   18895 		}
   18896 		_ = x.Args[3]
   18897 		if idx != x.Args[0] {
   18898 			break
   18899 		}
   18900 		if p != x.Args[1] {
   18901 			break
   18902 		}
   18903 		w0 := x.Args[2]
   18904 		if w0.Op != OpS390XSRDconst {
   18905 			break
   18906 		}
   18907 		if w0.AuxInt != j-32 {
   18908 			break
   18909 		}
   18910 		if w != w0.Args[0] {
   18911 			break
   18912 		}
   18913 		mem := x.Args[3]
   18914 		if !(x.Uses == 1 && clobber(x)) {
   18915 			break
   18916 		}
   18917 		v.reset(OpS390XMOVDBRstoreidx)
   18918 		v.AuxInt = i - 4
   18919 		v.Aux = s
   18920 		v.AddArg(p)
   18921 		v.AddArg(idx)
   18922 		v.AddArg(w0)
   18923 		v.AddArg(mem)
   18924 		return true
   18925 	}
   18926 	return false
   18927 }
   18928 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool {
   18929 	// match: (MOVWZload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _))
   18930 	// cond: isSamePtr(ptr1, ptr2)
   18931 	// result: (MOVWZreg x)
   18932 	for {
   18933 		off := v.AuxInt
   18934 		sym := v.Aux
   18935 		_ = v.Args[1]
   18936 		ptr1 := v.Args[0]
   18937 		v_1 := v.Args[1]
   18938 		if v_1.Op != OpS390XMOVWstore {
   18939 			break
   18940 		}
   18941 		if v_1.AuxInt != off {
   18942 			break
   18943 		}
   18944 		if v_1.Aux != sym {
   18945 			break
   18946 		}
   18947 		_ = v_1.Args[2]
   18948 		ptr2 := v_1.Args[0]
   18949 		x := v_1.Args[1]
   18950 		if !(isSamePtr(ptr1, ptr2)) {
   18951 			break
   18952 		}
   18953 		v.reset(OpS390XMOVWZreg)
   18954 		v.AddArg(x)
   18955 		return true
   18956 	}
   18957 	// match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem)
   18958 	// cond: is20Bit(off1+off2)
   18959 	// result: (MOVWZload [off1+off2] {sym} ptr mem)
   18960 	for {
   18961 		off1 := v.AuxInt
   18962 		sym := v.Aux
   18963 		_ = v.Args[1]
   18964 		v_0 := v.Args[0]
   18965 		if v_0.Op != OpS390XADDconst {
   18966 			break
   18967 		}
   18968 		off2 := v_0.AuxInt
   18969 		ptr := v_0.Args[0]
   18970 		mem := v.Args[1]
   18971 		if !(is20Bit(off1 + off2)) {
   18972 			break
   18973 		}
   18974 		v.reset(OpS390XMOVWZload)
   18975 		v.AuxInt = off1 + off2
   18976 		v.Aux = sym
   18977 		v.AddArg(ptr)
   18978 		v.AddArg(mem)
   18979 		return true
   18980 	}
   18981 	// match: (MOVWZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem)
   18982 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))
   18983 	// result: (MOVWZload  [off1+off2] {mergeSym(sym1,sym2)} base mem)
   18984 	for {
   18985 		off1 := v.AuxInt
   18986 		sym1 := v.Aux
   18987 		_ = v.Args[1]
   18988 		v_0 := v.Args[0]
   18989 		if v_0.Op != OpS390XMOVDaddr {
   18990 			break
   18991 		}
   18992 		t := v_0.Type
   18993 		off2 := v_0.AuxInt
   18994 		sym2 := v_0.Aux
   18995 		base := v_0.Args[0]
   18996 		mem := v.Args[1]
   18997 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) {
   18998 			break
   18999 		}
   19000 		v.reset(OpS390XMOVWZload)
   19001 		v.AuxInt = off1 + off2
   19002 		v.Aux = mergeSym(sym1, sym2)
   19003 		v.AddArg(base)
   19004 		v.AddArg(mem)
   19005 		return true
   19006 	}
   19007 	// match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   19008 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   19009 	// result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   19010 	for {
   19011 		off1 := v.AuxInt
   19012 		sym1 := v.Aux
   19013 		_ = v.Args[1]
   19014 		v_0 := v.Args[0]
   19015 		if v_0.Op != OpS390XMOVDaddridx {
   19016 			break
   19017 		}
   19018 		off2 := v_0.AuxInt
   19019 		sym2 := v_0.Aux
   19020 		_ = v_0.Args[1]
   19021 		ptr := v_0.Args[0]
   19022 		idx := v_0.Args[1]
   19023 		mem := v.Args[1]
   19024 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   19025 			break
   19026 		}
   19027 		v.reset(OpS390XMOVWZloadidx)
   19028 		v.AuxInt = off1 + off2
   19029 		v.Aux = mergeSym(sym1, sym2)
   19030 		v.AddArg(ptr)
   19031 		v.AddArg(idx)
   19032 		v.AddArg(mem)
   19033 		return true
   19034 	}
   19035 	// match: (MOVWZload [off] {sym} (ADD ptr idx) mem)
   19036 	// cond: ptr.Op != OpSB
   19037 	// result: (MOVWZloadidx [off] {sym} ptr idx mem)
   19038 	for {
   19039 		off := v.AuxInt
   19040 		sym := v.Aux
   19041 		_ = v.Args[1]
   19042 		v_0 := v.Args[0]
   19043 		if v_0.Op != OpS390XADD {
   19044 			break
   19045 		}
   19046 		_ = v_0.Args[1]
   19047 		ptr := v_0.Args[0]
   19048 		idx := v_0.Args[1]
   19049 		mem := v.Args[1]
   19050 		if !(ptr.Op != OpSB) {
   19051 			break
   19052 		}
   19053 		v.reset(OpS390XMOVWZloadidx)
   19054 		v.AuxInt = off
   19055 		v.Aux = sym
   19056 		v.AddArg(ptr)
   19057 		v.AddArg(idx)
   19058 		v.AddArg(mem)
   19059 		return true
   19060 	}
   19061 	return false
   19062 }
   19063 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool {
   19064 	// match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   19065 	// cond: is20Bit(c+d)
   19066 	// result: (MOVWZloadidx [c+d] {sym} ptr idx mem)
   19067 	for {
   19068 		c := v.AuxInt
   19069 		sym := v.Aux
   19070 		_ = v.Args[2]
   19071 		v_0 := v.Args[0]
   19072 		if v_0.Op != OpS390XADDconst {
   19073 			break
   19074 		}
   19075 		d := v_0.AuxInt
   19076 		ptr := v_0.Args[0]
   19077 		idx := v.Args[1]
   19078 		mem := v.Args[2]
   19079 		if !(is20Bit(c + d)) {
   19080 			break
   19081 		}
   19082 		v.reset(OpS390XMOVWZloadidx)
   19083 		v.AuxInt = c + d
   19084 		v.Aux = sym
   19085 		v.AddArg(ptr)
   19086 		v.AddArg(idx)
   19087 		v.AddArg(mem)
   19088 		return true
   19089 	}
   19090 	// match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   19091 	// cond: is20Bit(c+d)
   19092 	// result: (MOVWZloadidx [c+d] {sym} ptr idx mem)
   19093 	for {
   19094 		c := v.AuxInt
   19095 		sym := v.Aux
   19096 		_ = v.Args[2]
   19097 		idx := v.Args[0]
   19098 		v_1 := v.Args[1]
   19099 		if v_1.Op != OpS390XADDconst {
   19100 			break
   19101 		}
   19102 		d := v_1.AuxInt
   19103 		ptr := v_1.Args[0]
   19104 		mem := v.Args[2]
   19105 		if !(is20Bit(c + d)) {
   19106 			break
   19107 		}
   19108 		v.reset(OpS390XMOVWZloadidx)
   19109 		v.AuxInt = c + d
   19110 		v.Aux = sym
   19111 		v.AddArg(ptr)
   19112 		v.AddArg(idx)
   19113 		v.AddArg(mem)
   19114 		return true
   19115 	}
   19116 	// match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   19117 	// cond: is20Bit(c+d)
   19118 	// result: (MOVWZloadidx [c+d] {sym} ptr idx mem)
   19119 	for {
   19120 		c := v.AuxInt
   19121 		sym := v.Aux
   19122 		_ = v.Args[2]
   19123 		ptr := v.Args[0]
   19124 		v_1 := v.Args[1]
   19125 		if v_1.Op != OpS390XADDconst {
   19126 			break
   19127 		}
   19128 		d := v_1.AuxInt
   19129 		idx := v_1.Args[0]
   19130 		mem := v.Args[2]
   19131 		if !(is20Bit(c + d)) {
   19132 			break
   19133 		}
   19134 		v.reset(OpS390XMOVWZloadidx)
   19135 		v.AuxInt = c + d
   19136 		v.Aux = sym
   19137 		v.AddArg(ptr)
   19138 		v.AddArg(idx)
   19139 		v.AddArg(mem)
   19140 		return true
   19141 	}
   19142 	// match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   19143 	// cond: is20Bit(c+d)
   19144 	// result: (MOVWZloadidx [c+d] {sym} ptr idx mem)
   19145 	for {
   19146 		c := v.AuxInt
   19147 		sym := v.Aux
   19148 		_ = v.Args[2]
   19149 		v_0 := v.Args[0]
   19150 		if v_0.Op != OpS390XADDconst {
   19151 			break
   19152 		}
   19153 		d := v_0.AuxInt
   19154 		idx := v_0.Args[0]
   19155 		ptr := v.Args[1]
   19156 		mem := v.Args[2]
   19157 		if !(is20Bit(c + d)) {
   19158 			break
   19159 		}
   19160 		v.reset(OpS390XMOVWZloadidx)
   19161 		v.AuxInt = c + d
   19162 		v.Aux = sym
   19163 		v.AddArg(ptr)
   19164 		v.AddArg(idx)
   19165 		v.AddArg(mem)
   19166 		return true
   19167 	}
   19168 	return false
   19169 }
   19170 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool {
   19171 	b := v.Block
   19172 	_ = b
   19173 	// match: (MOVWZreg x:(MOVBZload _ _))
   19174 	// cond:
   19175 	// result: (MOVDreg x)
   19176 	for {
   19177 		x := v.Args[0]
   19178 		if x.Op != OpS390XMOVBZload {
   19179 			break
   19180 		}
   19181 		_ = x.Args[1]
   19182 		v.reset(OpS390XMOVDreg)
   19183 		v.AddArg(x)
   19184 		return true
   19185 	}
   19186 	// match: (MOVWZreg x:(MOVHZload _ _))
   19187 	// cond:
   19188 	// result: (MOVDreg x)
   19189 	for {
   19190 		x := v.Args[0]
   19191 		if x.Op != OpS390XMOVHZload {
   19192 			break
   19193 		}
   19194 		_ = x.Args[1]
   19195 		v.reset(OpS390XMOVDreg)
   19196 		v.AddArg(x)
   19197 		return true
   19198 	}
   19199 	// match: (MOVWZreg x:(MOVWZload _ _))
   19200 	// cond:
   19201 	// result: (MOVDreg x)
   19202 	for {
   19203 		x := v.Args[0]
   19204 		if x.Op != OpS390XMOVWZload {
   19205 			break
   19206 		}
   19207 		_ = x.Args[1]
   19208 		v.reset(OpS390XMOVDreg)
   19209 		v.AddArg(x)
   19210 		return true
   19211 	}
   19212 	// match: (MOVWZreg x:(Arg <t>))
   19213 	// cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)
   19214 	// result: (MOVDreg x)
   19215 	for {
   19216 		x := v.Args[0]
   19217 		if x.Op != OpArg {
   19218 			break
   19219 		}
   19220 		t := x.Type
   19221 		if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) {
   19222 			break
   19223 		}
   19224 		v.reset(OpS390XMOVDreg)
   19225 		v.AddArg(x)
   19226 		return true
   19227 	}
   19228 	// match: (MOVWZreg x:(MOVBZreg _))
   19229 	// cond:
   19230 	// result: (MOVDreg x)
   19231 	for {
   19232 		x := v.Args[0]
   19233 		if x.Op != OpS390XMOVBZreg {
   19234 			break
   19235 		}
   19236 		v.reset(OpS390XMOVDreg)
   19237 		v.AddArg(x)
   19238 		return true
   19239 	}
   19240 	// match: (MOVWZreg x:(MOVHZreg _))
   19241 	// cond:
   19242 	// result: (MOVDreg x)
   19243 	for {
   19244 		x := v.Args[0]
   19245 		if x.Op != OpS390XMOVHZreg {
   19246 			break
   19247 		}
   19248 		v.reset(OpS390XMOVDreg)
   19249 		v.AddArg(x)
   19250 		return true
   19251 	}
   19252 	// match: (MOVWZreg x:(MOVWZreg _))
   19253 	// cond:
   19254 	// result: (MOVDreg x)
   19255 	for {
   19256 		x := v.Args[0]
   19257 		if x.Op != OpS390XMOVWZreg {
   19258 			break
   19259 		}
   19260 		v.reset(OpS390XMOVDreg)
   19261 		v.AddArg(x)
   19262 		return true
   19263 	}
   19264 	// match: (MOVWZreg (MOVDconst [c]))
   19265 	// cond:
   19266 	// result: (MOVDconst [int64(uint32(c))])
   19267 	for {
   19268 		v_0 := v.Args[0]
   19269 		if v_0.Op != OpS390XMOVDconst {
   19270 			break
   19271 		}
   19272 		c := v_0.AuxInt
   19273 		v.reset(OpS390XMOVDconst)
   19274 		v.AuxInt = int64(uint32(c))
   19275 		return true
   19276 	}
   19277 	// match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem))
   19278 	// cond: x.Uses == 1 && clobber(x)
   19279 	// result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem)
   19280 	for {
   19281 		x := v.Args[0]
   19282 		if x.Op != OpS390XMOVWZload {
   19283 			break
   19284 		}
   19285 		off := x.AuxInt
   19286 		sym := x.Aux
   19287 		_ = x.Args[1]
   19288 		ptr := x.Args[0]
   19289 		mem := x.Args[1]
   19290 		if !(x.Uses == 1 && clobber(x)) {
   19291 			break
   19292 		}
   19293 		b = x.Block
   19294 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type)
   19295 		v.reset(OpCopy)
   19296 		v.AddArg(v0)
   19297 		v0.AuxInt = off
   19298 		v0.Aux = sym
   19299 		v0.AddArg(ptr)
   19300 		v0.AddArg(mem)
   19301 		return true
   19302 	}
   19303 	// match: (MOVWZreg x:(MOVWload [off] {sym} ptr mem))
   19304 	// cond: x.Uses == 1 && clobber(x)
   19305 	// result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem)
   19306 	for {
   19307 		x := v.Args[0]
   19308 		if x.Op != OpS390XMOVWload {
   19309 			break
   19310 		}
   19311 		off := x.AuxInt
   19312 		sym := x.Aux
   19313 		_ = x.Args[1]
   19314 		ptr := x.Args[0]
   19315 		mem := x.Args[1]
   19316 		if !(x.Uses == 1 && clobber(x)) {
   19317 			break
   19318 		}
   19319 		b = x.Block
   19320 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type)
   19321 		v.reset(OpCopy)
   19322 		v.AddArg(v0)
   19323 		v0.AuxInt = off
   19324 		v0.Aux = sym
   19325 		v0.AddArg(ptr)
   19326 		v0.AddArg(mem)
   19327 		return true
   19328 	}
   19329 	return false
   19330 }
   19331 func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool {
   19332 	b := v.Block
   19333 	_ = b
   19334 	// match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem))
   19335 	// cond: x.Uses == 1 && clobber(x)
   19336 	// result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem)
   19337 	for {
   19338 		x := v.Args[0]
   19339 		if x.Op != OpS390XMOVWZloadidx {
   19340 			break
   19341 		}
   19342 		off := x.AuxInt
   19343 		sym := x.Aux
   19344 		_ = x.Args[2]
   19345 		ptr := x.Args[0]
   19346 		idx := x.Args[1]
   19347 		mem := x.Args[2]
   19348 		if !(x.Uses == 1 && clobber(x)) {
   19349 			break
   19350 		}
   19351 		b = x.Block
   19352 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type)
   19353 		v.reset(OpCopy)
   19354 		v.AddArg(v0)
   19355 		v0.AuxInt = off
   19356 		v0.Aux = sym
   19357 		v0.AddArg(ptr)
   19358 		v0.AddArg(idx)
   19359 		v0.AddArg(mem)
   19360 		return true
   19361 	}
   19362 	// match: (MOVWZreg x:(MOVWloadidx [off] {sym} ptr idx mem))
   19363 	// cond: x.Uses == 1 && clobber(x)
   19364 	// result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem)
   19365 	for {
   19366 		x := v.Args[0]
   19367 		if x.Op != OpS390XMOVWloadidx {
   19368 			break
   19369 		}
   19370 		off := x.AuxInt
   19371 		sym := x.Aux
   19372 		_ = x.Args[2]
   19373 		ptr := x.Args[0]
   19374 		idx := x.Args[1]
   19375 		mem := x.Args[2]
   19376 		if !(x.Uses == 1 && clobber(x)) {
   19377 			break
   19378 		}
   19379 		b = x.Block
   19380 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type)
   19381 		v.reset(OpCopy)
   19382 		v.AddArg(v0)
   19383 		v0.AuxInt = off
   19384 		v0.Aux = sym
   19385 		v0.AddArg(ptr)
   19386 		v0.AddArg(idx)
   19387 		v0.AddArg(mem)
   19388 		return true
   19389 	}
   19390 	return false
   19391 }
   19392 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool {
   19393 	// match: (MOVWload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _))
   19394 	// cond: isSamePtr(ptr1, ptr2)
   19395 	// result: (MOVWreg x)
   19396 	for {
   19397 		off := v.AuxInt
   19398 		sym := v.Aux
   19399 		_ = v.Args[1]
   19400 		ptr1 := v.Args[0]
   19401 		v_1 := v.Args[1]
   19402 		if v_1.Op != OpS390XMOVWstore {
   19403 			break
   19404 		}
   19405 		if v_1.AuxInt != off {
   19406 			break
   19407 		}
   19408 		if v_1.Aux != sym {
   19409 			break
   19410 		}
   19411 		_ = v_1.Args[2]
   19412 		ptr2 := v_1.Args[0]
   19413 		x := v_1.Args[1]
   19414 		if !(isSamePtr(ptr1, ptr2)) {
   19415 			break
   19416 		}
   19417 		v.reset(OpS390XMOVWreg)
   19418 		v.AddArg(x)
   19419 		return true
   19420 	}
   19421 	// match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem)
   19422 	// cond: is20Bit(off1+off2)
   19423 	// result: (MOVWload  [off1+off2] {sym} ptr mem)
   19424 	for {
   19425 		off1 := v.AuxInt
   19426 		sym := v.Aux
   19427 		_ = v.Args[1]
   19428 		v_0 := v.Args[0]
   19429 		if v_0.Op != OpS390XADDconst {
   19430 			break
   19431 		}
   19432 		off2 := v_0.AuxInt
   19433 		ptr := v_0.Args[0]
   19434 		mem := v.Args[1]
   19435 		if !(is20Bit(off1 + off2)) {
   19436 			break
   19437 		}
   19438 		v.reset(OpS390XMOVWload)
   19439 		v.AuxInt = off1 + off2
   19440 		v.Aux = sym
   19441 		v.AddArg(ptr)
   19442 		v.AddArg(mem)
   19443 		return true
   19444 	}
   19445 	// match: (MOVWload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem)
   19446 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))
   19447 	// result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem)
   19448 	for {
   19449 		off1 := v.AuxInt
   19450 		sym1 := v.Aux
   19451 		_ = v.Args[1]
   19452 		v_0 := v.Args[0]
   19453 		if v_0.Op != OpS390XMOVDaddr {
   19454 			break
   19455 		}
   19456 		t := v_0.Type
   19457 		off2 := v_0.AuxInt
   19458 		sym2 := v_0.Aux
   19459 		base := v_0.Args[0]
   19460 		mem := v.Args[1]
   19461 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) {
   19462 			break
   19463 		}
   19464 		v.reset(OpS390XMOVWload)
   19465 		v.AuxInt = off1 + off2
   19466 		v.Aux = mergeSym(sym1, sym2)
   19467 		v.AddArg(base)
   19468 		v.AddArg(mem)
   19469 		return true
   19470 	}
   19471 	// match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
   19472 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   19473 	// result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
   19474 	for {
   19475 		off1 := v.AuxInt
   19476 		sym1 := v.Aux
   19477 		_ = v.Args[1]
   19478 		v_0 := v.Args[0]
   19479 		if v_0.Op != OpS390XMOVDaddridx {
   19480 			break
   19481 		}
   19482 		off2 := v_0.AuxInt
   19483 		sym2 := v_0.Aux
   19484 		_ = v_0.Args[1]
   19485 		ptr := v_0.Args[0]
   19486 		idx := v_0.Args[1]
   19487 		mem := v.Args[1]
   19488 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   19489 			break
   19490 		}
   19491 		v.reset(OpS390XMOVWloadidx)
   19492 		v.AuxInt = off1 + off2
   19493 		v.Aux = mergeSym(sym1, sym2)
   19494 		v.AddArg(ptr)
   19495 		v.AddArg(idx)
   19496 		v.AddArg(mem)
   19497 		return true
   19498 	}
   19499 	// match: (MOVWload [off] {sym} (ADD ptr idx) mem)
   19500 	// cond: ptr.Op != OpSB
   19501 	// result: (MOVWloadidx  [off] {sym} ptr idx mem)
   19502 	for {
   19503 		off := v.AuxInt
   19504 		sym := v.Aux
   19505 		_ = v.Args[1]
   19506 		v_0 := v.Args[0]
   19507 		if v_0.Op != OpS390XADD {
   19508 			break
   19509 		}
   19510 		_ = v_0.Args[1]
   19511 		ptr := v_0.Args[0]
   19512 		idx := v_0.Args[1]
   19513 		mem := v.Args[1]
   19514 		if !(ptr.Op != OpSB) {
   19515 			break
   19516 		}
   19517 		v.reset(OpS390XMOVWloadidx)
   19518 		v.AuxInt = off
   19519 		v.Aux = sym
   19520 		v.AddArg(ptr)
   19521 		v.AddArg(idx)
   19522 		v.AddArg(mem)
   19523 		return true
   19524 	}
   19525 	return false
   19526 }
   19527 func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool {
   19528 	// match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
   19529 	// cond: is20Bit(c+d)
   19530 	// result: (MOVWloadidx  [c+d] {sym} ptr idx mem)
   19531 	for {
   19532 		c := v.AuxInt
   19533 		sym := v.Aux
   19534 		_ = v.Args[2]
   19535 		v_0 := v.Args[0]
   19536 		if v_0.Op != OpS390XADDconst {
   19537 			break
   19538 		}
   19539 		d := v_0.AuxInt
   19540 		ptr := v_0.Args[0]
   19541 		idx := v.Args[1]
   19542 		mem := v.Args[2]
   19543 		if !(is20Bit(c + d)) {
   19544 			break
   19545 		}
   19546 		v.reset(OpS390XMOVWloadidx)
   19547 		v.AuxInt = c + d
   19548 		v.Aux = sym
   19549 		v.AddArg(ptr)
   19550 		v.AddArg(idx)
   19551 		v.AddArg(mem)
   19552 		return true
   19553 	}
   19554 	// match: (MOVWloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
   19555 	// cond: is20Bit(c+d)
   19556 	// result: (MOVWloadidx  [c+d] {sym} ptr idx mem)
   19557 	for {
   19558 		c := v.AuxInt
   19559 		sym := v.Aux
   19560 		_ = v.Args[2]
   19561 		idx := v.Args[0]
   19562 		v_1 := v.Args[1]
   19563 		if v_1.Op != OpS390XADDconst {
   19564 			break
   19565 		}
   19566 		d := v_1.AuxInt
   19567 		ptr := v_1.Args[0]
   19568 		mem := v.Args[2]
   19569 		if !(is20Bit(c + d)) {
   19570 			break
   19571 		}
   19572 		v.reset(OpS390XMOVWloadidx)
   19573 		v.AuxInt = c + d
   19574 		v.Aux = sym
   19575 		v.AddArg(ptr)
   19576 		v.AddArg(idx)
   19577 		v.AddArg(mem)
   19578 		return true
   19579 	}
   19580 	// match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
   19581 	// cond: is20Bit(c+d)
   19582 	// result: (MOVWloadidx  [c+d] {sym} ptr idx mem)
   19583 	for {
   19584 		c := v.AuxInt
   19585 		sym := v.Aux
   19586 		_ = v.Args[2]
   19587 		ptr := v.Args[0]
   19588 		v_1 := v.Args[1]
   19589 		if v_1.Op != OpS390XADDconst {
   19590 			break
   19591 		}
   19592 		d := v_1.AuxInt
   19593 		idx := v_1.Args[0]
   19594 		mem := v.Args[2]
   19595 		if !(is20Bit(c + d)) {
   19596 			break
   19597 		}
   19598 		v.reset(OpS390XMOVWloadidx)
   19599 		v.AuxInt = c + d
   19600 		v.Aux = sym
   19601 		v.AddArg(ptr)
   19602 		v.AddArg(idx)
   19603 		v.AddArg(mem)
   19604 		return true
   19605 	}
   19606 	// match: (MOVWloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
   19607 	// cond: is20Bit(c+d)
   19608 	// result: (MOVWloadidx  [c+d] {sym} ptr idx mem)
   19609 	for {
   19610 		c := v.AuxInt
   19611 		sym := v.Aux
   19612 		_ = v.Args[2]
   19613 		v_0 := v.Args[0]
   19614 		if v_0.Op != OpS390XADDconst {
   19615 			break
   19616 		}
   19617 		d := v_0.AuxInt
   19618 		idx := v_0.Args[0]
   19619 		ptr := v.Args[1]
   19620 		mem := v.Args[2]
   19621 		if !(is20Bit(c + d)) {
   19622 			break
   19623 		}
   19624 		v.reset(OpS390XMOVWloadidx)
   19625 		v.AuxInt = c + d
   19626 		v.Aux = sym
   19627 		v.AddArg(ptr)
   19628 		v.AddArg(idx)
   19629 		v.AddArg(mem)
   19630 		return true
   19631 	}
   19632 	return false
   19633 }
   19634 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool {
   19635 	// match: (MOVWreg x:(MOVBload _ _))
   19636 	// cond:
   19637 	// result: (MOVDreg x)
   19638 	for {
   19639 		x := v.Args[0]
   19640 		if x.Op != OpS390XMOVBload {
   19641 			break
   19642 		}
   19643 		_ = x.Args[1]
   19644 		v.reset(OpS390XMOVDreg)
   19645 		v.AddArg(x)
   19646 		return true
   19647 	}
   19648 	// match: (MOVWreg x:(MOVBZload _ _))
   19649 	// cond:
   19650 	// result: (MOVDreg x)
   19651 	for {
   19652 		x := v.Args[0]
   19653 		if x.Op != OpS390XMOVBZload {
   19654 			break
   19655 		}
   19656 		_ = x.Args[1]
   19657 		v.reset(OpS390XMOVDreg)
   19658 		v.AddArg(x)
   19659 		return true
   19660 	}
   19661 	// match: (MOVWreg x:(MOVHload _ _))
   19662 	// cond:
   19663 	// result: (MOVDreg x)
   19664 	for {
   19665 		x := v.Args[0]
   19666 		if x.Op != OpS390XMOVHload {
   19667 			break
   19668 		}
   19669 		_ = x.Args[1]
   19670 		v.reset(OpS390XMOVDreg)
   19671 		v.AddArg(x)
   19672 		return true
   19673 	}
   19674 	// match: (MOVWreg x:(MOVHZload _ _))
   19675 	// cond:
   19676 	// result: (MOVDreg x)
   19677 	for {
   19678 		x := v.Args[0]
   19679 		if x.Op != OpS390XMOVHZload {
   19680 			break
   19681 		}
   19682 		_ = x.Args[1]
   19683 		v.reset(OpS390XMOVDreg)
   19684 		v.AddArg(x)
   19685 		return true
   19686 	}
   19687 	// match: (MOVWreg x:(MOVWload _ _))
   19688 	// cond:
   19689 	// result: (MOVDreg x)
   19690 	for {
   19691 		x := v.Args[0]
   19692 		if x.Op != OpS390XMOVWload {
   19693 			break
   19694 		}
   19695 		_ = x.Args[1]
   19696 		v.reset(OpS390XMOVDreg)
   19697 		v.AddArg(x)
   19698 		return true
   19699 	}
   19700 	// match: (MOVWreg x:(Arg <t>))
   19701 	// cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)
   19702 	// result: (MOVDreg x)
   19703 	for {
   19704 		x := v.Args[0]
   19705 		if x.Op != OpArg {
   19706 			break
   19707 		}
   19708 		t := x.Type
   19709 		if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) {
   19710 			break
   19711 		}
   19712 		v.reset(OpS390XMOVDreg)
   19713 		v.AddArg(x)
   19714 		return true
   19715 	}
   19716 	// match: (MOVWreg x:(MOVBreg _))
   19717 	// cond:
   19718 	// result: (MOVDreg x)
   19719 	for {
   19720 		x := v.Args[0]
   19721 		if x.Op != OpS390XMOVBreg {
   19722 			break
   19723 		}
   19724 		v.reset(OpS390XMOVDreg)
   19725 		v.AddArg(x)
   19726 		return true
   19727 	}
   19728 	// match: (MOVWreg x:(MOVBZreg _))
   19729 	// cond:
   19730 	// result: (MOVDreg x)
   19731 	for {
   19732 		x := v.Args[0]
   19733 		if x.Op != OpS390XMOVBZreg {
   19734 			break
   19735 		}
   19736 		v.reset(OpS390XMOVDreg)
   19737 		v.AddArg(x)
   19738 		return true
   19739 	}
   19740 	// match: (MOVWreg x:(MOVHreg _))
   19741 	// cond:
   19742 	// result: (MOVDreg x)
   19743 	for {
   19744 		x := v.Args[0]
   19745 		if x.Op != OpS390XMOVHreg {
   19746 			break
   19747 		}
   19748 		v.reset(OpS390XMOVDreg)
   19749 		v.AddArg(x)
   19750 		return true
   19751 	}
   19752 	// match: (MOVWreg x:(MOVHreg _))
   19753 	// cond:
   19754 	// result: (MOVDreg x)
   19755 	for {
   19756 		x := v.Args[0]
   19757 		if x.Op != OpS390XMOVHreg {
   19758 			break
   19759 		}
   19760 		v.reset(OpS390XMOVDreg)
   19761 		v.AddArg(x)
   19762 		return true
   19763 	}
   19764 	return false
   19765 }
   19766 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool {
   19767 	b := v.Block
   19768 	_ = b
   19769 	// match: (MOVWreg x:(MOVWreg _))
   19770 	// cond:
   19771 	// result: (MOVDreg x)
   19772 	for {
   19773 		x := v.Args[0]
   19774 		if x.Op != OpS390XMOVWreg {
   19775 			break
   19776 		}
   19777 		v.reset(OpS390XMOVDreg)
   19778 		v.AddArg(x)
   19779 		return true
   19780 	}
   19781 	// match: (MOVWreg (MOVDconst [c]))
   19782 	// cond:
   19783 	// result: (MOVDconst [int64(int32(c))])
   19784 	for {
   19785 		v_0 := v.Args[0]
   19786 		if v_0.Op != OpS390XMOVDconst {
   19787 			break
   19788 		}
   19789 		c := v_0.AuxInt
   19790 		v.reset(OpS390XMOVDconst)
   19791 		v.AuxInt = int64(int32(c))
   19792 		return true
   19793 	}
   19794 	// match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem))
   19795 	// cond: x.Uses == 1 && clobber(x)
   19796 	// result: @x.Block (MOVWload  <v.Type> [off] {sym} ptr mem)
   19797 	for {
   19798 		x := v.Args[0]
   19799 		if x.Op != OpS390XMOVWZload {
   19800 			break
   19801 		}
   19802 		off := x.AuxInt
   19803 		sym := x.Aux
   19804 		_ = x.Args[1]
   19805 		ptr := x.Args[0]
   19806 		mem := x.Args[1]
   19807 		if !(x.Uses == 1 && clobber(x)) {
   19808 			break
   19809 		}
   19810 		b = x.Block
   19811 		v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type)
   19812 		v.reset(OpCopy)
   19813 		v.AddArg(v0)
   19814 		v0.AuxInt = off
   19815 		v0.Aux = sym
   19816 		v0.AddArg(ptr)
   19817 		v0.AddArg(mem)
   19818 		return true
   19819 	}
   19820 	// match: (MOVWreg x:(MOVWload [off] {sym} ptr mem))
   19821 	// cond: x.Uses == 1 && clobber(x)
   19822 	// result: @x.Block (MOVWload  <v.Type> [off] {sym} ptr mem)
   19823 	for {
   19824 		x := v.Args[0]
   19825 		if x.Op != OpS390XMOVWload {
   19826 			break
   19827 		}
   19828 		off := x.AuxInt
   19829 		sym := x.Aux
   19830 		_ = x.Args[1]
   19831 		ptr := x.Args[0]
   19832 		mem := x.Args[1]
   19833 		if !(x.Uses == 1 && clobber(x)) {
   19834 			break
   19835 		}
   19836 		b = x.Block
   19837 		v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type)
   19838 		v.reset(OpCopy)
   19839 		v.AddArg(v0)
   19840 		v0.AuxInt = off
   19841 		v0.Aux = sym
   19842 		v0.AddArg(ptr)
   19843 		v0.AddArg(mem)
   19844 		return true
   19845 	}
   19846 	// match: (MOVWreg x:(MOVWZloadidx [off] {sym} ptr idx mem))
   19847 	// cond: x.Uses == 1 && clobber(x)
   19848 	// result: @x.Block (MOVWloadidx  <v.Type> [off] {sym} ptr idx mem)
   19849 	for {
   19850 		x := v.Args[0]
   19851 		if x.Op != OpS390XMOVWZloadidx {
   19852 			break
   19853 		}
   19854 		off := x.AuxInt
   19855 		sym := x.Aux
   19856 		_ = x.Args[2]
   19857 		ptr := x.Args[0]
   19858 		idx := x.Args[1]
   19859 		mem := x.Args[2]
   19860 		if !(x.Uses == 1 && clobber(x)) {
   19861 			break
   19862 		}
   19863 		b = x.Block
   19864 		v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type)
   19865 		v.reset(OpCopy)
   19866 		v.AddArg(v0)
   19867 		v0.AuxInt = off
   19868 		v0.Aux = sym
   19869 		v0.AddArg(ptr)
   19870 		v0.AddArg(idx)
   19871 		v0.AddArg(mem)
   19872 		return true
   19873 	}
   19874 	// match: (MOVWreg x:(MOVWloadidx [off] {sym} ptr idx mem))
   19875 	// cond: x.Uses == 1 && clobber(x)
   19876 	// result: @x.Block (MOVWloadidx  <v.Type> [off] {sym} ptr idx mem)
   19877 	for {
   19878 		x := v.Args[0]
   19879 		if x.Op != OpS390XMOVWloadidx {
   19880 			break
   19881 		}
   19882 		off := x.AuxInt
   19883 		sym := x.Aux
   19884 		_ = x.Args[2]
   19885 		ptr := x.Args[0]
   19886 		idx := x.Args[1]
   19887 		mem := x.Args[2]
   19888 		if !(x.Uses == 1 && clobber(x)) {
   19889 			break
   19890 		}
   19891 		b = x.Block
   19892 		v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type)
   19893 		v.reset(OpCopy)
   19894 		v.AddArg(v0)
   19895 		v0.AuxInt = off
   19896 		v0.Aux = sym
   19897 		v0.AddArg(ptr)
   19898 		v0.AddArg(idx)
   19899 		v0.AddArg(mem)
   19900 		return true
   19901 	}
   19902 	return false
   19903 }
   19904 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool {
   19905 	// match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem)
   19906 	// cond:
   19907 	// result: (MOVWstore [off] {sym} ptr x mem)
   19908 	for {
   19909 		off := v.AuxInt
   19910 		sym := v.Aux
   19911 		_ = v.Args[2]
   19912 		ptr := v.Args[0]
   19913 		v_1 := v.Args[1]
   19914 		if v_1.Op != OpS390XMOVWreg {
   19915 			break
   19916 		}
   19917 		x := v_1.Args[0]
   19918 		mem := v.Args[2]
   19919 		v.reset(OpS390XMOVWstore)
   19920 		v.AuxInt = off
   19921 		v.Aux = sym
   19922 		v.AddArg(ptr)
   19923 		v.AddArg(x)
   19924 		v.AddArg(mem)
   19925 		return true
   19926 	}
   19927 	// match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem)
   19928 	// cond:
   19929 	// result: (MOVWstore [off] {sym} ptr x mem)
   19930 	for {
   19931 		off := v.AuxInt
   19932 		sym := v.Aux
   19933 		_ = v.Args[2]
   19934 		ptr := v.Args[0]
   19935 		v_1 := v.Args[1]
   19936 		if v_1.Op != OpS390XMOVWZreg {
   19937 			break
   19938 		}
   19939 		x := v_1.Args[0]
   19940 		mem := v.Args[2]
   19941 		v.reset(OpS390XMOVWstore)
   19942 		v.AuxInt = off
   19943 		v.Aux = sym
   19944 		v.AddArg(ptr)
   19945 		v.AddArg(x)
   19946 		v.AddArg(mem)
   19947 		return true
   19948 	}
   19949 	// match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem)
   19950 	// cond: is20Bit(off1+off2)
   19951 	// result: (MOVWstore  [off1+off2] {sym} ptr val mem)
   19952 	for {
   19953 		off1 := v.AuxInt
   19954 		sym := v.Aux
   19955 		_ = v.Args[2]
   19956 		v_0 := v.Args[0]
   19957 		if v_0.Op != OpS390XADDconst {
   19958 			break
   19959 		}
   19960 		off2 := v_0.AuxInt
   19961 		ptr := v_0.Args[0]
   19962 		val := v.Args[1]
   19963 		mem := v.Args[2]
   19964 		if !(is20Bit(off1 + off2)) {
   19965 			break
   19966 		}
   19967 		v.reset(OpS390XMOVWstore)
   19968 		v.AuxInt = off1 + off2
   19969 		v.Aux = sym
   19970 		v.AddArg(ptr)
   19971 		v.AddArg(val)
   19972 		v.AddArg(mem)
   19973 		return true
   19974 	}
   19975 	// match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem)
   19976 	// cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB
   19977 	// result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem)
   19978 	for {
   19979 		off := v.AuxInt
   19980 		sym := v.Aux
   19981 		_ = v.Args[2]
   19982 		ptr := v.Args[0]
   19983 		v_1 := v.Args[1]
   19984 		if v_1.Op != OpS390XMOVDconst {
   19985 			break
   19986 		}
   19987 		c := v_1.AuxInt
   19988 		mem := v.Args[2]
   19989 		if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) {
   19990 			break
   19991 		}
   19992 		v.reset(OpS390XMOVWstoreconst)
   19993 		v.AuxInt = makeValAndOff(int64(int32(c)), off)
   19994 		v.Aux = sym
   19995 		v.AddArg(ptr)
   19996 		v.AddArg(mem)
   19997 		return true
   19998 	}
   19999 	// match: (MOVWstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem)
   20000 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))
   20001 	// result: (MOVWstore  [off1+off2] {mergeSym(sym1,sym2)} base val mem)
   20002 	for {
   20003 		off1 := v.AuxInt
   20004 		sym1 := v.Aux
   20005 		_ = v.Args[2]
   20006 		v_0 := v.Args[0]
   20007 		if v_0.Op != OpS390XMOVDaddr {
   20008 			break
   20009 		}
   20010 		t := v_0.Type
   20011 		off2 := v_0.AuxInt
   20012 		sym2 := v_0.Aux
   20013 		base := v_0.Args[0]
   20014 		val := v.Args[1]
   20015 		mem := v.Args[2]
   20016 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) {
   20017 			break
   20018 		}
   20019 		v.reset(OpS390XMOVWstore)
   20020 		v.AuxInt = off1 + off2
   20021 		v.Aux = mergeSym(sym1, sym2)
   20022 		v.AddArg(base)
   20023 		v.AddArg(val)
   20024 		v.AddArg(mem)
   20025 		return true
   20026 	}
   20027 	// match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
   20028 	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
   20029 	// result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
   20030 	for {
   20031 		off1 := v.AuxInt
   20032 		sym1 := v.Aux
   20033 		_ = v.Args[2]
   20034 		v_0 := v.Args[0]
   20035 		if v_0.Op != OpS390XMOVDaddridx {
   20036 			break
   20037 		}
   20038 		off2 := v_0.AuxInt
   20039 		sym2 := v_0.Aux
   20040 		_ = v_0.Args[1]
   20041 		ptr := v_0.Args[0]
   20042 		idx := v_0.Args[1]
   20043 		val := v.Args[1]
   20044 		mem := v.Args[2]
   20045 		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
   20046 			break
   20047 		}
   20048 		v.reset(OpS390XMOVWstoreidx)
   20049 		v.AuxInt = off1 + off2
   20050 		v.Aux = mergeSym(sym1, sym2)
   20051 		v.AddArg(ptr)
   20052 		v.AddArg(idx)
   20053 		v.AddArg(val)
   20054 		v.AddArg(mem)
   20055 		return true
   20056 	}
   20057 	// match: (MOVWstore [off] {sym} (ADD ptr idx) val mem)
   20058 	// cond: ptr.Op != OpSB
   20059 	// result: (MOVWstoreidx  [off] {sym} ptr idx val mem)
   20060 	for {
   20061 		off := v.AuxInt
   20062 		sym := v.Aux
   20063 		_ = v.Args[2]
   20064 		v_0 := v.Args[0]
   20065 		if v_0.Op != OpS390XADD {
   20066 			break
   20067 		}
   20068 		_ = v_0.Args[1]
   20069 		ptr := v_0.Args[0]
   20070 		idx := v_0.Args[1]
   20071 		val := v.Args[1]
   20072 		mem := v.Args[2]
   20073 		if !(ptr.Op != OpSB) {
   20074 			break
   20075 		}
   20076 		v.reset(OpS390XMOVWstoreidx)
   20077 		v.AuxInt = off
   20078 		v.Aux = sym
   20079 		v.AddArg(ptr)
   20080 		v.AddArg(idx)
   20081 		v.AddArg(val)
   20082 		v.AddArg(mem)
   20083 		return true
   20084 	}
   20085 	// match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem))
   20086 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   20087 	// result: (MOVDstore [i-4] {s} p w mem)
   20088 	for {
   20089 		i := v.AuxInt
   20090 		s := v.Aux
   20091 		_ = v.Args[2]
   20092 		p := v.Args[0]
   20093 		v_1 := v.Args[1]
   20094 		if v_1.Op != OpS390XSRDconst {
   20095 			break
   20096 		}
   20097 		if v_1.AuxInt != 32 {
   20098 			break
   20099 		}
   20100 		w := v_1.Args[0]
   20101 		x := v.Args[2]
   20102 		if x.Op != OpS390XMOVWstore {
   20103 			break
   20104 		}
   20105 		if x.AuxInt != i-4 {
   20106 			break
   20107 		}
   20108 		if x.Aux != s {
   20109 			break
   20110 		}
   20111 		_ = x.Args[2]
   20112 		if p != x.Args[0] {
   20113 			break
   20114 		}
   20115 		if w != x.Args[1] {
   20116 			break
   20117 		}
   20118 		mem := x.Args[2]
   20119 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   20120 			break
   20121 		}
   20122 		v.reset(OpS390XMOVDstore)
   20123 		v.AuxInt = i - 4
   20124 		v.Aux = s
   20125 		v.AddArg(p)
   20126 		v.AddArg(w)
   20127 		v.AddArg(mem)
   20128 		return true
   20129 	}
   20130 	// match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem))
   20131 	// cond: p.Op != OpSB   && x.Uses == 1   && clobber(x)
   20132 	// result: (MOVDstore [i-4] {s} p w0 mem)
   20133 	for {
   20134 		i := v.AuxInt
   20135 		s := v.Aux
   20136 		_ = v.Args[2]
   20137 		p := v.Args[0]
   20138 		w0 := v.Args[1]
   20139 		if w0.Op != OpS390XSRDconst {
   20140 			break
   20141 		}
   20142 		j := w0.AuxInt
   20143 		w := w0.Args[0]
   20144 		x := v.Args[2]
   20145 		if x.Op != OpS390XMOVWstore {
   20146 			break
   20147 		}
   20148 		if x.AuxInt != i-4 {
   20149 			break
   20150 		}
   20151 		if x.Aux != s {
   20152 			break
   20153 		}
   20154 		_ = x.Args[2]
   20155 		if p != x.Args[0] {
   20156 			break
   20157 		}
   20158 		x_1 := x.Args[1]
   20159 		if x_1.Op != OpS390XSRDconst {
   20160 			break
   20161 		}
   20162 		if x_1.AuxInt != j+32 {
   20163 			break
   20164 		}
   20165 		if w != x_1.Args[0] {
   20166 			break
   20167 		}
   20168 		mem := x.Args[2]
   20169 		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
   20170 			break
   20171 		}
   20172 		v.reset(OpS390XMOVDstore)
   20173 		v.AuxInt = i - 4
   20174 		v.Aux = s
   20175 		v.AddArg(p)
   20176 		v.AddArg(w0)
   20177 		v.AddArg(mem)
   20178 		return true
   20179 	}
   20180 	// match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem))
   20181 	// cond: p.Op != OpSB   && x.Uses == 1   && is20Bit(i-4)   && clobber(x)
   20182 	// result: (STM2 [i-4] {s} p w0 w1 mem)
   20183 	for {
   20184 		i := v.AuxInt
   20185 		s := v.Aux
   20186 		_ = v.Args[2]
   20187 		p := v.Args[0]
   20188 		w1 := v.Args[1]
   20189 		x := v.Args[2]
   20190 		if x.Op != OpS390XMOVWstore {
   20191 			break
   20192 		}
   20193 		if x.AuxInt != i-4 {
   20194 			break
   20195 		}
   20196 		if x.Aux != s {
   20197 			break
   20198 		}
   20199 		_ = x.Args[2]
   20200 		if p != x.Args[0] {
   20201 			break
   20202 		}
   20203 		w0 := x.Args[1]
   20204 		mem := x.Args[2]
   20205 		if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) {
   20206 			break
   20207 		}
   20208 		v.reset(OpS390XSTM2)
   20209 		v.AuxInt = i - 4
   20210 		v.Aux = s
   20211 		v.AddArg(p)
   20212 		v.AddArg(w0)
   20213 		v.AddArg(w1)
   20214 		v.AddArg(mem)
   20215 		return true
   20216 	}
   20217 	return false
   20218 }
   20219 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool {
   20220 	// match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem))
   20221 	// cond: x.Uses == 1   && is20Bit(i-8)   && clobber(x)
   20222 	// result: (STM3 [i-8] {s} p w0 w1 w2 mem)
   20223 	for {
   20224 		i := v.AuxInt
   20225 		s := v.Aux
   20226 		_ = v.Args[2]
   20227 		p := v.Args[0]
   20228 		w2 := v.Args[1]
   20229 		x := v.Args[2]
   20230 		if x.Op != OpS390XSTM2 {
   20231 			break
   20232 		}
   20233 		if x.AuxInt != i-8 {
   20234 			break
   20235 		}
   20236 		if x.Aux != s {
   20237 			break
   20238 		}
   20239 		_ = x.Args[3]
   20240 		if p != x.Args[0] {
   20241 			break
   20242 		}
   20243 		w0 := x.Args[1]
   20244 		w1 := x.Args[2]
   20245 		mem := x.Args[3]
   20246 		if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) {
   20247 			break
   20248 		}
   20249 		v.reset(OpS390XSTM3)
   20250 		v.AuxInt = i - 8
   20251 		v.Aux = s
   20252 		v.AddArg(p)
   20253 		v.AddArg(w0)
   20254 		v.AddArg(w1)
   20255 		v.AddArg(w2)
   20256 		v.AddArg(mem)
   20257 		return true
   20258 	}
   20259 	// match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem))
   20260 	// cond: x.Uses == 1   && is20Bit(i-12)   && clobber(x)
   20261 	// result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem)
   20262 	for {
   20263 		i := v.AuxInt
   20264 		s := v.Aux
   20265 		_ = v.Args[2]
   20266 		p := v.Args[0]
   20267 		w3 := v.Args[1]
   20268 		x := v.Args[2]
   20269 		if x.Op != OpS390XSTM3 {
   20270 			break
   20271 		}
   20272 		if x.AuxInt != i-12 {
   20273 			break
   20274 		}
   20275 		if x.Aux != s {
   20276 			break
   20277 		}
   20278 		_ = x.Args[4]
   20279 		if p != x.Args[0] {
   20280 			break
   20281 		}
   20282 		w0 := x.Args[1]
   20283 		w1 := x.Args[2]
   20284 		w2 := x.Args[3]
   20285 		mem := x.Args[4]
   20286 		if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) {
   20287 			break
   20288 		}
   20289 		v.reset(OpS390XSTM4)
   20290 		v.AuxInt = i - 12
   20291 		v.Aux = s
   20292 		v.AddArg(p)
   20293 		v.AddArg(w0)
   20294 		v.AddArg(w1)
   20295 		v.AddArg(w2)
   20296 		v.AddArg(w3)
   20297 		v.AddArg(mem)
   20298 		return true
   20299 	}
   20300 	return false
   20301 }
   20302 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool {
   20303 	b := v.Block
   20304 	_ = b
   20305 	typ := &b.Func.Config.Types
   20306 	_ = typ
   20307 	// match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem)
   20308 	// cond: isU12Bit(ValAndOff(sc).Off()+off)
   20309 	// result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem)
   20310 	for {
   20311 		sc := v.AuxInt
   20312 		s := v.Aux
   20313 		_ = v.Args[1]
   20314 		v_0 := v.Args[0]
   20315 		if v_0.Op != OpS390XADDconst {
   20316 			break
   20317 		}
   20318 		off := v_0.AuxInt
   20319 		ptr := v_0.Args[0]
   20320 		mem := v.Args[1]
   20321 		if !(isU12Bit(ValAndOff(sc).Off() + off)) {
   20322 			break
   20323 		}
   20324 		v.reset(OpS390XMOVWstoreconst)
   20325 		v.AuxInt = ValAndOff(sc).add(off)
   20326 		v.Aux = s
   20327 		v.AddArg(ptr)
   20328 		v.AddArg(mem)
   20329 		return true
   20330 	}
   20331 	// match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem)
   20332 	// cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)
   20333 	// result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem)
   20334 	for {
   20335 		sc := v.AuxInt
   20336 		sym1 := v.Aux
   20337 		_ = v.Args[1]
   20338 		v_0 := v.Args[0]
   20339 		if v_0.Op != OpS390XMOVDaddr {
   20340 			break
   20341 		}
   20342 		off := v_0.AuxInt
   20343 		sym2 := v_0.Aux
   20344 		ptr := v_0.Args[0]
   20345 		mem := v.Args[1]
   20346 		if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) {
   20347 			break
   20348 		}
   20349 		v.reset(OpS390XMOVWstoreconst)
   20350 		v.AuxInt = ValAndOff(sc).add(off)
   20351 		v.Aux = mergeSym(sym1, sym2)
   20352 		v.AddArg(ptr)
   20353 		v.AddArg(mem)
   20354 		return true
   20355 	}
   20356 	// match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem))
   20357 	// cond: p.Op != OpSB   && x.Uses == 1   && ValAndOff(a).Off() + 4 == ValAndOff(c).Off()   && clobber(x)
   20358 	// result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem)
   20359 	for {
   20360 		c := v.AuxInt
   20361 		s := v.Aux
   20362 		_ = v.Args[1]
   20363 		p := v.Args[0]
   20364 		x := v.Args[1]
   20365 		if x.Op != OpS390XMOVWstoreconst {
   20366 			break
   20367 		}
   20368 		a := x.AuxInt
   20369 		if x.Aux != s {
   20370 			break
   20371 		}
   20372 		_ = x.Args[1]
   20373 		if p != x.Args[0] {
   20374 			break
   20375 		}
   20376 		mem := x.Args[1]
   20377 		if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) {
   20378 			break
   20379 		}
   20380 		v.reset(OpS390XMOVDstore)
   20381 		v.AuxInt = ValAndOff(a).Off()
   20382 		v.Aux = s
   20383 		v.AddArg(p)
   20384 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   20385 		v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32
   20386 		v.AddArg(v0)
   20387 		v.AddArg(mem)
   20388 		return true
   20389 	}
   20390 	return false
   20391 }
   20392 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool {
   20393 	// match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
   20394 	// cond: is20Bit(c+d)
   20395 	// result: (MOVWstoreidx  [c+d] {sym} ptr idx val mem)
   20396 	for {
   20397 		c := v.AuxInt
   20398 		sym := v.Aux
   20399 		_ = v.Args[3]
   20400 		v_0 := v.Args[0]
   20401 		if v_0.Op != OpS390XADDconst {
   20402 			break
   20403 		}
   20404 		d := v_0.AuxInt
   20405 		ptr := v_0.Args[0]
   20406 		idx := v.Args[1]
   20407 		val := v.Args[2]
   20408 		mem := v.Args[3]
   20409 		if !(is20Bit(c + d)) {
   20410 			break
   20411 		}
   20412 		v.reset(OpS390XMOVWstoreidx)
   20413 		v.AuxInt = c + d
   20414 		v.Aux = sym
   20415 		v.AddArg(ptr)
   20416 		v.AddArg(idx)
   20417 		v.AddArg(val)
   20418 		v.AddArg(mem)
   20419 		return true
   20420 	}
   20421 	// match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem)
   20422 	// cond: is20Bit(c+d)
   20423 	// result: (MOVWstoreidx  [c+d] {sym} ptr idx val mem)
   20424 	for {
   20425 		c := v.AuxInt
   20426 		sym := v.Aux
   20427 		_ = v.Args[3]
   20428 		idx := v.Args[0]
   20429 		v_1 := v.Args[1]
   20430 		if v_1.Op != OpS390XADDconst {
   20431 			break
   20432 		}
   20433 		d := v_1.AuxInt
   20434 		ptr := v_1.Args[0]
   20435 		val := v.Args[2]
   20436 		mem := v.Args[3]
   20437 		if !(is20Bit(c + d)) {
   20438 			break
   20439 		}
   20440 		v.reset(OpS390XMOVWstoreidx)
   20441 		v.AuxInt = c + d
   20442 		v.Aux = sym
   20443 		v.AddArg(ptr)
   20444 		v.AddArg(idx)
   20445 		v.AddArg(val)
   20446 		v.AddArg(mem)
   20447 		return true
   20448 	}
   20449 	// match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
   20450 	// cond: is20Bit(c+d)
   20451 	// result: (MOVWstoreidx  [c+d] {sym} ptr idx val mem)
   20452 	for {
   20453 		c := v.AuxInt
   20454 		sym := v.Aux
   20455 		_ = v.Args[3]
   20456 		ptr := v.Args[0]
   20457 		v_1 := v.Args[1]
   20458 		if v_1.Op != OpS390XADDconst {
   20459 			break
   20460 		}
   20461 		d := v_1.AuxInt
   20462 		idx := v_1.Args[0]
   20463 		val := v.Args[2]
   20464 		mem := v.Args[3]
   20465 		if !(is20Bit(c + d)) {
   20466 			break
   20467 		}
   20468 		v.reset(OpS390XMOVWstoreidx)
   20469 		v.AuxInt = c + d
   20470 		v.Aux = sym
   20471 		v.AddArg(ptr)
   20472 		v.AddArg(idx)
   20473 		v.AddArg(val)
   20474 		v.AddArg(mem)
   20475 		return true
   20476 	}
   20477 	// match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem)
   20478 	// cond: is20Bit(c+d)
   20479 	// result: (MOVWstoreidx  [c+d] {sym} ptr idx val mem)
   20480 	for {
   20481 		c := v.AuxInt
   20482 		sym := v.Aux
   20483 		_ = v.Args[3]
   20484 		v_0 := v.Args[0]
   20485 		if v_0.Op != OpS390XADDconst {
   20486 			break
   20487 		}
   20488 		d := v_0.AuxInt
   20489 		idx := v_0.Args[0]
   20490 		ptr := v.Args[1]
   20491 		val := v.Args[2]
   20492 		mem := v.Args[3]
   20493 		if !(is20Bit(c + d)) {
   20494 			break
   20495 		}
   20496 		v.reset(OpS390XMOVWstoreidx)
   20497 		v.AuxInt = c + d
   20498 		v.Aux = sym
   20499 		v.AddArg(ptr)
   20500 		v.AddArg(idx)
   20501 		v.AddArg(val)
   20502 		v.AddArg(mem)
   20503 		return true
   20504 	}
   20505 	// match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem))
   20506 	// cond: x.Uses == 1   && clobber(x)
   20507 	// result: (MOVDstoreidx [i-4] {s} p idx w mem)
   20508 	for {
   20509 		i := v.AuxInt
   20510 		s := v.Aux
   20511 		_ = v.Args[3]
   20512 		p := v.Args[0]
   20513 		idx := v.Args[1]
   20514 		w := v.Args[2]
   20515 		x := v.Args[3]
   20516 		if x.Op != OpS390XMOVWstoreidx {
   20517 			break
   20518 		}
   20519 		if x.AuxInt != i-4 {
   20520 			break
   20521 		}
   20522 		if x.Aux != s {
   20523 			break
   20524 		}
   20525 		_ = x.Args[3]
   20526 		if p != x.Args[0] {
   20527 			break
   20528 		}
   20529 		if idx != x.Args[1] {
   20530 			break
   20531 		}
   20532 		x_2 := x.Args[2]
   20533 		if x_2.Op != OpS390XSRDconst {
   20534 			break
   20535 		}
   20536 		if x_2.AuxInt != 32 {
   20537 			break
   20538 		}
   20539 		if w != x_2.Args[0] {
   20540 			break
   20541 		}
   20542 		mem := x.Args[3]
   20543 		if !(x.Uses == 1 && clobber(x)) {
   20544 			break
   20545 		}
   20546 		v.reset(OpS390XMOVDstoreidx)
   20547 		v.AuxInt = i - 4
   20548 		v.Aux = s
   20549 		v.AddArg(p)
   20550 		v.AddArg(idx)
   20551 		v.AddArg(w)
   20552 		v.AddArg(mem)
   20553 		return true
   20554 	}
   20555 	// match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem))
   20556 	// cond: x.Uses == 1   && clobber(x)
   20557 	// result: (MOVDstoreidx [i-4] {s} p idx w mem)
   20558 	for {
   20559 		i := v.AuxInt
   20560 		s := v.Aux
   20561 		_ = v.Args[3]
   20562 		p := v.Args[0]
   20563 		idx := v.Args[1]
   20564 		w := v.Args[2]
   20565 		x := v.Args[3]
   20566 		if x.Op != OpS390XMOVWstoreidx {
   20567 			break
   20568 		}
   20569 		if x.AuxInt != i-4 {
   20570 			break
   20571 		}
   20572 		if x.Aux != s {
   20573 			break
   20574 		}
   20575 		_ = x.Args[3]
   20576 		if idx != x.Args[0] {
   20577 			break
   20578 		}
   20579 		if p != x.Args[1] {
   20580 			break
   20581 		}
   20582 		x_2 := x.Args[2]
   20583 		if x_2.Op != OpS390XSRDconst {
   20584 			break
   20585 		}
   20586 		if x_2.AuxInt != 32 {
   20587 			break
   20588 		}
   20589 		if w != x_2.Args[0] {
   20590 			break
   20591 		}
   20592 		mem := x.Args[3]
   20593 		if !(x.Uses == 1 && clobber(x)) {
   20594 			break
   20595 		}
   20596 		v.reset(OpS390XMOVDstoreidx)
   20597 		v.AuxInt = i - 4
   20598 		v.Aux = s
   20599 		v.AddArg(p)
   20600 		v.AddArg(idx)
   20601 		v.AddArg(w)
   20602 		v.AddArg(mem)
   20603 		return true
   20604 	}
   20605 	// match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem))
   20606 	// cond: x.Uses == 1   && clobber(x)
   20607 	// result: (MOVDstoreidx [i-4] {s} p idx w mem)
   20608 	for {
   20609 		i := v.AuxInt
   20610 		s := v.Aux
   20611 		_ = v.Args[3]
   20612 		idx := v.Args[0]
   20613 		p := v.Args[1]
   20614 		w := v.Args[2]
   20615 		x := v.Args[3]
   20616 		if x.Op != OpS390XMOVWstoreidx {
   20617 			break
   20618 		}
   20619 		if x.AuxInt != i-4 {
   20620 			break
   20621 		}
   20622 		if x.Aux != s {
   20623 			break
   20624 		}
   20625 		_ = x.Args[3]
   20626 		if p != x.Args[0] {
   20627 			break
   20628 		}
   20629 		if idx != x.Args[1] {
   20630 			break
   20631 		}
   20632 		x_2 := x.Args[2]
   20633 		if x_2.Op != OpS390XSRDconst {
   20634 			break
   20635 		}
   20636 		if x_2.AuxInt != 32 {
   20637 			break
   20638 		}
   20639 		if w != x_2.Args[0] {
   20640 			break
   20641 		}
   20642 		mem := x.Args[3]
   20643 		if !(x.Uses == 1 && clobber(x)) {
   20644 			break
   20645 		}
   20646 		v.reset(OpS390XMOVDstoreidx)
   20647 		v.AuxInt = i - 4
   20648 		v.Aux = s
   20649 		v.AddArg(p)
   20650 		v.AddArg(idx)
   20651 		v.AddArg(w)
   20652 		v.AddArg(mem)
   20653 		return true
   20654 	}
   20655 	// match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem))
   20656 	// cond: x.Uses == 1   && clobber(x)
   20657 	// result: (MOVDstoreidx [i-4] {s} p idx w mem)
   20658 	for {
   20659 		i := v.AuxInt
   20660 		s := v.Aux
   20661 		_ = v.Args[3]
   20662 		idx := v.Args[0]
   20663 		p := v.Args[1]
   20664 		w := v.Args[2]
   20665 		x := v.Args[3]
   20666 		if x.Op != OpS390XMOVWstoreidx {
   20667 			break
   20668 		}
   20669 		if x.AuxInt != i-4 {
   20670 			break
   20671 		}
   20672 		if x.Aux != s {
   20673 			break
   20674 		}
   20675 		_ = x.Args[3]
   20676 		if idx != x.Args[0] {
   20677 			break
   20678 		}
   20679 		if p != x.Args[1] {
   20680 			break
   20681 		}
   20682 		x_2 := x.Args[2]
   20683 		if x_2.Op != OpS390XSRDconst {
   20684 			break
   20685 		}
   20686 		if x_2.AuxInt != 32 {
   20687 			break
   20688 		}
   20689 		if w != x_2.Args[0] {
   20690 			break
   20691 		}
   20692 		mem := x.Args[3]
   20693 		if !(x.Uses == 1 && clobber(x)) {
   20694 			break
   20695 		}
   20696 		v.reset(OpS390XMOVDstoreidx)
   20697 		v.AuxInt = i - 4
   20698 		v.Aux = s
   20699 		v.AddArg(p)
   20700 		v.AddArg(idx)
   20701 		v.AddArg(w)
   20702 		v.AddArg(mem)
   20703 		return true
   20704 	}
   20705 	// match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem))
   20706 	// cond: x.Uses == 1   && clobber(x)
   20707 	// result: (MOVDstoreidx [i-4] {s} p idx w0 mem)
   20708 	for {
   20709 		i := v.AuxInt
   20710 		s := v.Aux
   20711 		_ = v.Args[3]
   20712 		p := v.Args[0]
   20713 		idx := v.Args[1]
   20714 		w0 := v.Args[2]
   20715 		if w0.Op != OpS390XSRDconst {
   20716 			break
   20717 		}
   20718 		j := w0.AuxInt
   20719 		w := w0.Args[0]
   20720 		x := v.Args[3]
   20721 		if x.Op != OpS390XMOVWstoreidx {
   20722 			break
   20723 		}
   20724 		if x.AuxInt != i-4 {
   20725 			break
   20726 		}
   20727 		if x.Aux != s {
   20728 			break
   20729 		}
   20730 		_ = x.Args[3]
   20731 		if p != x.Args[0] {
   20732 			break
   20733 		}
   20734 		if idx != x.Args[1] {
   20735 			break
   20736 		}
   20737 		x_2 := x.Args[2]
   20738 		if x_2.Op != OpS390XSRDconst {
   20739 			break
   20740 		}
   20741 		if x_2.AuxInt != j+32 {
   20742 			break
   20743 		}
   20744 		if w != x_2.Args[0] {
   20745 			break
   20746 		}
   20747 		mem := x.Args[3]
   20748 		if !(x.Uses == 1 && clobber(x)) {
   20749 			break
   20750 		}
   20751 		v.reset(OpS390XMOVDstoreidx)
   20752 		v.AuxInt = i - 4
   20753 		v.Aux = s
   20754 		v.AddArg(p)
   20755 		v.AddArg(idx)
   20756 		v.AddArg(w0)
   20757 		v.AddArg(mem)
   20758 		return true
   20759 	}
   20760 	// match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem))
   20761 	// cond: x.Uses == 1   && clobber(x)
   20762 	// result: (MOVDstoreidx [i-4] {s} p idx w0 mem)
   20763 	for {
   20764 		i := v.AuxInt
   20765 		s := v.Aux
   20766 		_ = v.Args[3]
   20767 		p := v.Args[0]
   20768 		idx := v.Args[1]
   20769 		w0 := v.Args[2]
   20770 		if w0.Op != OpS390XSRDconst {
   20771 			break
   20772 		}
   20773 		j := w0.AuxInt
   20774 		w := w0.Args[0]
   20775 		x := v.Args[3]
   20776 		if x.Op != OpS390XMOVWstoreidx {
   20777 			break
   20778 		}
   20779 		if x.AuxInt != i-4 {
   20780 			break
   20781 		}
   20782 		if x.Aux != s {
   20783 			break
   20784 		}
   20785 		_ = x.Args[3]
   20786 		if idx != x.Args[0] {
   20787 			break
   20788 		}
   20789 		if p != x.Args[1] {
   20790 			break
   20791 		}
   20792 		x_2 := x.Args[2]
   20793 		if x_2.Op != OpS390XSRDconst {
   20794 			break
   20795 		}
   20796 		if x_2.AuxInt != j+32 {
   20797 			break
   20798 		}
   20799 		if w != x_2.Args[0] {
   20800 			break
   20801 		}
   20802 		mem := x.Args[3]
   20803 		if !(x.Uses == 1 && clobber(x)) {
   20804 			break
   20805 		}
   20806 		v.reset(OpS390XMOVDstoreidx)
   20807 		v.AuxInt = i - 4
   20808 		v.Aux = s
   20809 		v.AddArg(p)
   20810 		v.AddArg(idx)
   20811 		v.AddArg(w0)
   20812 		v.AddArg(mem)
   20813 		return true
   20814 	}
   20815 	return false
   20816 }
   20817 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool {
   20818 	// match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem))
   20819 	// cond: x.Uses == 1   && clobber(x)
   20820 	// result: (MOVDstoreidx [i-4] {s} p idx w0 mem)
   20821 	for {
   20822 		i := v.AuxInt
   20823 		s := v.Aux
   20824 		_ = v.Args[3]
   20825 		idx := v.Args[0]
   20826 		p := v.Args[1]
   20827 		w0 := v.Args[2]
   20828 		if w0.Op != OpS390XSRDconst {
   20829 			break
   20830 		}
   20831 		j := w0.AuxInt
   20832 		w := w0.Args[0]
   20833 		x := v.Args[3]
   20834 		if x.Op != OpS390XMOVWstoreidx {
   20835 			break
   20836 		}
   20837 		if x.AuxInt != i-4 {
   20838 			break
   20839 		}
   20840 		if x.Aux != s {
   20841 			break
   20842 		}
   20843 		_ = x.Args[3]
   20844 		if p != x.Args[0] {
   20845 			break
   20846 		}
   20847 		if idx != x.Args[1] {
   20848 			break
   20849 		}
   20850 		x_2 := x.Args[2]
   20851 		if x_2.Op != OpS390XSRDconst {
   20852 			break
   20853 		}
   20854 		if x_2.AuxInt != j+32 {
   20855 			break
   20856 		}
   20857 		if w != x_2.Args[0] {
   20858 			break
   20859 		}
   20860 		mem := x.Args[3]
   20861 		if !(x.Uses == 1 && clobber(x)) {
   20862 			break
   20863 		}
   20864 		v.reset(OpS390XMOVDstoreidx)
   20865 		v.AuxInt = i - 4
   20866 		v.Aux = s
   20867 		v.AddArg(p)
   20868 		v.AddArg(idx)
   20869 		v.AddArg(w0)
   20870 		v.AddArg(mem)
   20871 		return true
   20872 	}
   20873 	// match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem))
   20874 	// cond: x.Uses == 1   && clobber(x)
   20875 	// result: (MOVDstoreidx [i-4] {s} p idx w0 mem)
   20876 	for {
   20877 		i := v.AuxInt
   20878 		s := v.Aux
   20879 		_ = v.Args[3]
   20880 		idx := v.Args[0]
   20881 		p := v.Args[1]
   20882 		w0 := v.Args[2]
   20883 		if w0.Op != OpS390XSRDconst {
   20884 			break
   20885 		}
   20886 		j := w0.AuxInt
   20887 		w := w0.Args[0]
   20888 		x := v.Args[3]
   20889 		if x.Op != OpS390XMOVWstoreidx {
   20890 			break
   20891 		}
   20892 		if x.AuxInt != i-4 {
   20893 			break
   20894 		}
   20895 		if x.Aux != s {
   20896 			break
   20897 		}
   20898 		_ = x.Args[3]
   20899 		if idx != x.Args[0] {
   20900 			break
   20901 		}
   20902 		if p != x.Args[1] {
   20903 			break
   20904 		}
   20905 		x_2 := x.Args[2]
   20906 		if x_2.Op != OpS390XSRDconst {
   20907 			break
   20908 		}
   20909 		if x_2.AuxInt != j+32 {
   20910 			break
   20911 		}
   20912 		if w != x_2.Args[0] {
   20913 			break
   20914 		}
   20915 		mem := x.Args[3]
   20916 		if !(x.Uses == 1 && clobber(x)) {
   20917 			break
   20918 		}
   20919 		v.reset(OpS390XMOVDstoreidx)
   20920 		v.AuxInt = i - 4
   20921 		v.Aux = s
   20922 		v.AddArg(p)
   20923 		v.AddArg(idx)
   20924 		v.AddArg(w0)
   20925 		v.AddArg(mem)
   20926 		return true
   20927 	}
   20928 	return false
   20929 }
   20930 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool {
   20931 	// match: (MULLD x (MOVDconst [c]))
   20932 	// cond: is32Bit(c)
   20933 	// result: (MULLDconst [c] x)
   20934 	for {
   20935 		_ = v.Args[1]
   20936 		x := v.Args[0]
   20937 		v_1 := v.Args[1]
   20938 		if v_1.Op != OpS390XMOVDconst {
   20939 			break
   20940 		}
   20941 		c := v_1.AuxInt
   20942 		if !(is32Bit(c)) {
   20943 			break
   20944 		}
   20945 		v.reset(OpS390XMULLDconst)
   20946 		v.AuxInt = c
   20947 		v.AddArg(x)
   20948 		return true
   20949 	}
   20950 	// match: (MULLD (MOVDconst [c]) x)
   20951 	// cond: is32Bit(c)
   20952 	// result: (MULLDconst [c] x)
   20953 	for {
   20954 		_ = v.Args[1]
   20955 		v_0 := v.Args[0]
   20956 		if v_0.Op != OpS390XMOVDconst {
   20957 			break
   20958 		}
   20959 		c := v_0.AuxInt
   20960 		x := v.Args[1]
   20961 		if !(is32Bit(c)) {
   20962 			break
   20963 		}
   20964 		v.reset(OpS390XMULLDconst)
   20965 		v.AuxInt = c
   20966 		v.AddArg(x)
   20967 		return true
   20968 	}
   20969 	// match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem))
   20970 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   20971 	// result: (MULLDload <t> [off] {sym} x ptr mem)
   20972 	for {
   20973 		t := v.Type
   20974 		_ = v.Args[1]
   20975 		x := v.Args[0]
   20976 		g := v.Args[1]
   20977 		if g.Op != OpS390XMOVDload {
   20978 			break
   20979 		}
   20980 		off := g.AuxInt
   20981 		sym := g.Aux
   20982 		_ = g.Args[1]
   20983 		ptr := g.Args[0]
   20984 		mem := g.Args[1]
   20985 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   20986 			break
   20987 		}
   20988 		v.reset(OpS390XMULLDload)
   20989 		v.Type = t
   20990 		v.AuxInt = off
   20991 		v.Aux = sym
   20992 		v.AddArg(x)
   20993 		v.AddArg(ptr)
   20994 		v.AddArg(mem)
   20995 		return true
   20996 	}
   20997 	// match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x)
   20998 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   20999 	// result: (MULLDload <t> [off] {sym} x ptr mem)
   21000 	for {
   21001 		t := v.Type
   21002 		_ = v.Args[1]
   21003 		g := v.Args[0]
   21004 		if g.Op != OpS390XMOVDload {
   21005 			break
   21006 		}
   21007 		off := g.AuxInt
   21008 		sym := g.Aux
   21009 		_ = g.Args[1]
   21010 		ptr := g.Args[0]
   21011 		mem := g.Args[1]
   21012 		x := v.Args[1]
   21013 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21014 			break
   21015 		}
   21016 		v.reset(OpS390XMULLDload)
   21017 		v.Type = t
   21018 		v.AuxInt = off
   21019 		v.Aux = sym
   21020 		v.AddArg(x)
   21021 		v.AddArg(ptr)
   21022 		v.AddArg(mem)
   21023 		return true
   21024 	}
   21025 	// match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x)
   21026 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21027 	// result: (MULLDload <t> [off] {sym} x ptr mem)
   21028 	for {
   21029 		t := v.Type
   21030 		_ = v.Args[1]
   21031 		g := v.Args[0]
   21032 		if g.Op != OpS390XMOVDload {
   21033 			break
   21034 		}
   21035 		off := g.AuxInt
   21036 		sym := g.Aux
   21037 		_ = g.Args[1]
   21038 		ptr := g.Args[0]
   21039 		mem := g.Args[1]
   21040 		x := v.Args[1]
   21041 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21042 			break
   21043 		}
   21044 		v.reset(OpS390XMULLDload)
   21045 		v.Type = t
   21046 		v.AuxInt = off
   21047 		v.Aux = sym
   21048 		v.AddArg(x)
   21049 		v.AddArg(ptr)
   21050 		v.AddArg(mem)
   21051 		return true
   21052 	}
   21053 	// match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem))
   21054 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21055 	// result: (MULLDload <t> [off] {sym} x ptr mem)
   21056 	for {
   21057 		t := v.Type
   21058 		_ = v.Args[1]
   21059 		x := v.Args[0]
   21060 		g := v.Args[1]
   21061 		if g.Op != OpS390XMOVDload {
   21062 			break
   21063 		}
   21064 		off := g.AuxInt
   21065 		sym := g.Aux
   21066 		_ = g.Args[1]
   21067 		ptr := g.Args[0]
   21068 		mem := g.Args[1]
   21069 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21070 			break
   21071 		}
   21072 		v.reset(OpS390XMULLDload)
   21073 		v.Type = t
   21074 		v.AuxInt = off
   21075 		v.Aux = sym
   21076 		v.AddArg(x)
   21077 		v.AddArg(ptr)
   21078 		v.AddArg(mem)
   21079 		return true
   21080 	}
   21081 	return false
   21082 }
   21083 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool {
   21084 	b := v.Block
   21085 	_ = b
   21086 	// match: (MULLDconst [-1] x)
   21087 	// cond:
   21088 	// result: (NEG x)
   21089 	for {
   21090 		if v.AuxInt != -1 {
   21091 			break
   21092 		}
   21093 		x := v.Args[0]
   21094 		v.reset(OpS390XNEG)
   21095 		v.AddArg(x)
   21096 		return true
   21097 	}
   21098 	// match: (MULLDconst [0] _)
   21099 	// cond:
   21100 	// result: (MOVDconst [0])
   21101 	for {
   21102 		if v.AuxInt != 0 {
   21103 			break
   21104 		}
   21105 		v.reset(OpS390XMOVDconst)
   21106 		v.AuxInt = 0
   21107 		return true
   21108 	}
   21109 	// match: (MULLDconst [1] x)
   21110 	// cond:
   21111 	// result: x
   21112 	for {
   21113 		if v.AuxInt != 1 {
   21114 			break
   21115 		}
   21116 		x := v.Args[0]
   21117 		v.reset(OpCopy)
   21118 		v.Type = x.Type
   21119 		v.AddArg(x)
   21120 		return true
   21121 	}
   21122 	// match: (MULLDconst [c] x)
   21123 	// cond: isPowerOfTwo(c)
   21124 	// result: (SLDconst [log2(c)] x)
   21125 	for {
   21126 		c := v.AuxInt
   21127 		x := v.Args[0]
   21128 		if !(isPowerOfTwo(c)) {
   21129 			break
   21130 		}
   21131 		v.reset(OpS390XSLDconst)
   21132 		v.AuxInt = log2(c)
   21133 		v.AddArg(x)
   21134 		return true
   21135 	}
   21136 	// match: (MULLDconst [c] x)
   21137 	// cond: isPowerOfTwo(c+1) && c >= 15
   21138 	// result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x)
   21139 	for {
   21140 		c := v.AuxInt
   21141 		x := v.Args[0]
   21142 		if !(isPowerOfTwo(c+1) && c >= 15) {
   21143 			break
   21144 		}
   21145 		v.reset(OpS390XSUB)
   21146 		v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   21147 		v0.AuxInt = log2(c + 1)
   21148 		v0.AddArg(x)
   21149 		v.AddArg(v0)
   21150 		v.AddArg(x)
   21151 		return true
   21152 	}
   21153 	// match: (MULLDconst [c] x)
   21154 	// cond: isPowerOfTwo(c-1) && c >= 17
   21155 	// result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x)
   21156 	for {
   21157 		c := v.AuxInt
   21158 		x := v.Args[0]
   21159 		if !(isPowerOfTwo(c-1) && c >= 17) {
   21160 			break
   21161 		}
   21162 		v.reset(OpS390XADD)
   21163 		v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   21164 		v0.AuxInt = log2(c - 1)
   21165 		v0.AddArg(x)
   21166 		v.AddArg(v0)
   21167 		v.AddArg(x)
   21168 		return true
   21169 	}
   21170 	// match: (MULLDconst [c] (MOVDconst [d]))
   21171 	// cond:
   21172 	// result: (MOVDconst [c*d])
   21173 	for {
   21174 		c := v.AuxInt
   21175 		v_0 := v.Args[0]
   21176 		if v_0.Op != OpS390XMOVDconst {
   21177 			break
   21178 		}
   21179 		d := v_0.AuxInt
   21180 		v.reset(OpS390XMOVDconst)
   21181 		v.AuxInt = c * d
   21182 		return true
   21183 	}
   21184 	return false
   21185 }
   21186 func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool {
   21187 	b := v.Block
   21188 	_ = b
   21189 	// match: (MULLDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
   21190 	// cond: isSamePtr(ptr1, ptr2)
   21191 	// result: (MULLD x (LGDR <t> y))
   21192 	for {
   21193 		t := v.Type
   21194 		off := v.AuxInt
   21195 		sym := v.Aux
   21196 		_ = v.Args[2]
   21197 		x := v.Args[0]
   21198 		ptr1 := v.Args[1]
   21199 		v_2 := v.Args[2]
   21200 		if v_2.Op != OpS390XFMOVDstore {
   21201 			break
   21202 		}
   21203 		if v_2.AuxInt != off {
   21204 			break
   21205 		}
   21206 		if v_2.Aux != sym {
   21207 			break
   21208 		}
   21209 		_ = v_2.Args[2]
   21210 		ptr2 := v_2.Args[0]
   21211 		y := v_2.Args[1]
   21212 		if !(isSamePtr(ptr1, ptr2)) {
   21213 			break
   21214 		}
   21215 		v.reset(OpS390XMULLD)
   21216 		v.AddArg(x)
   21217 		v0 := b.NewValue0(v.Pos, OpS390XLGDR, t)
   21218 		v0.AddArg(y)
   21219 		v.AddArg(v0)
   21220 		return true
   21221 	}
   21222 	// match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem)
   21223 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   21224 	// result: (MULLDload [off1+off2] {sym} x ptr mem)
   21225 	for {
   21226 		off1 := v.AuxInt
   21227 		sym := v.Aux
   21228 		_ = v.Args[2]
   21229 		x := v.Args[0]
   21230 		v_1 := v.Args[1]
   21231 		if v_1.Op != OpS390XADDconst {
   21232 			break
   21233 		}
   21234 		off2 := v_1.AuxInt
   21235 		ptr := v_1.Args[0]
   21236 		mem := v.Args[2]
   21237 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   21238 			break
   21239 		}
   21240 		v.reset(OpS390XMULLDload)
   21241 		v.AuxInt = off1 + off2
   21242 		v.Aux = sym
   21243 		v.AddArg(x)
   21244 		v.AddArg(ptr)
   21245 		v.AddArg(mem)
   21246 		return true
   21247 	}
   21248 	// match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   21249 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   21250 	// result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   21251 	for {
   21252 		o1 := v.AuxInt
   21253 		s1 := v.Aux
   21254 		_ = v.Args[2]
   21255 		x := v.Args[0]
   21256 		v_1 := v.Args[1]
   21257 		if v_1.Op != OpS390XMOVDaddr {
   21258 			break
   21259 		}
   21260 		o2 := v_1.AuxInt
   21261 		s2 := v_1.Aux
   21262 		ptr := v_1.Args[0]
   21263 		mem := v.Args[2]
   21264 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   21265 			break
   21266 		}
   21267 		v.reset(OpS390XMULLDload)
   21268 		v.AuxInt = o1 + o2
   21269 		v.Aux = mergeSym(s1, s2)
   21270 		v.AddArg(x)
   21271 		v.AddArg(ptr)
   21272 		v.AddArg(mem)
   21273 		return true
   21274 	}
   21275 	return false
   21276 }
   21277 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool {
   21278 	// match: (MULLW x (MOVDconst [c]))
   21279 	// cond:
   21280 	// result: (MULLWconst [int64(int32(c))] x)
   21281 	for {
   21282 		_ = v.Args[1]
   21283 		x := v.Args[0]
   21284 		v_1 := v.Args[1]
   21285 		if v_1.Op != OpS390XMOVDconst {
   21286 			break
   21287 		}
   21288 		c := v_1.AuxInt
   21289 		v.reset(OpS390XMULLWconst)
   21290 		v.AuxInt = int64(int32(c))
   21291 		v.AddArg(x)
   21292 		return true
   21293 	}
   21294 	// match: (MULLW (MOVDconst [c]) x)
   21295 	// cond:
   21296 	// result: (MULLWconst [int64(int32(c))] x)
   21297 	for {
   21298 		_ = v.Args[1]
   21299 		v_0 := v.Args[0]
   21300 		if v_0.Op != OpS390XMOVDconst {
   21301 			break
   21302 		}
   21303 		c := v_0.AuxInt
   21304 		x := v.Args[1]
   21305 		v.reset(OpS390XMULLWconst)
   21306 		v.AuxInt = int64(int32(c))
   21307 		v.AddArg(x)
   21308 		return true
   21309 	}
   21310 	// match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem))
   21311 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21312 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21313 	for {
   21314 		t := v.Type
   21315 		_ = v.Args[1]
   21316 		x := v.Args[0]
   21317 		g := v.Args[1]
   21318 		if g.Op != OpS390XMOVWload {
   21319 			break
   21320 		}
   21321 		off := g.AuxInt
   21322 		sym := g.Aux
   21323 		_ = g.Args[1]
   21324 		ptr := g.Args[0]
   21325 		mem := g.Args[1]
   21326 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21327 			break
   21328 		}
   21329 		v.reset(OpS390XMULLWload)
   21330 		v.Type = t
   21331 		v.AuxInt = off
   21332 		v.Aux = sym
   21333 		v.AddArg(x)
   21334 		v.AddArg(ptr)
   21335 		v.AddArg(mem)
   21336 		return true
   21337 	}
   21338 	// match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x)
   21339 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21340 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21341 	for {
   21342 		t := v.Type
   21343 		_ = v.Args[1]
   21344 		g := v.Args[0]
   21345 		if g.Op != OpS390XMOVWload {
   21346 			break
   21347 		}
   21348 		off := g.AuxInt
   21349 		sym := g.Aux
   21350 		_ = g.Args[1]
   21351 		ptr := g.Args[0]
   21352 		mem := g.Args[1]
   21353 		x := v.Args[1]
   21354 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21355 			break
   21356 		}
   21357 		v.reset(OpS390XMULLWload)
   21358 		v.Type = t
   21359 		v.AuxInt = off
   21360 		v.Aux = sym
   21361 		v.AddArg(x)
   21362 		v.AddArg(ptr)
   21363 		v.AddArg(mem)
   21364 		return true
   21365 	}
   21366 	// match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x)
   21367 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21368 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21369 	for {
   21370 		t := v.Type
   21371 		_ = v.Args[1]
   21372 		g := v.Args[0]
   21373 		if g.Op != OpS390XMOVWload {
   21374 			break
   21375 		}
   21376 		off := g.AuxInt
   21377 		sym := g.Aux
   21378 		_ = g.Args[1]
   21379 		ptr := g.Args[0]
   21380 		mem := g.Args[1]
   21381 		x := v.Args[1]
   21382 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21383 			break
   21384 		}
   21385 		v.reset(OpS390XMULLWload)
   21386 		v.Type = t
   21387 		v.AuxInt = off
   21388 		v.Aux = sym
   21389 		v.AddArg(x)
   21390 		v.AddArg(ptr)
   21391 		v.AddArg(mem)
   21392 		return true
   21393 	}
   21394 	// match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem))
   21395 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21396 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21397 	for {
   21398 		t := v.Type
   21399 		_ = v.Args[1]
   21400 		x := v.Args[0]
   21401 		g := v.Args[1]
   21402 		if g.Op != OpS390XMOVWload {
   21403 			break
   21404 		}
   21405 		off := g.AuxInt
   21406 		sym := g.Aux
   21407 		_ = g.Args[1]
   21408 		ptr := g.Args[0]
   21409 		mem := g.Args[1]
   21410 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21411 			break
   21412 		}
   21413 		v.reset(OpS390XMULLWload)
   21414 		v.Type = t
   21415 		v.AuxInt = off
   21416 		v.Aux = sym
   21417 		v.AddArg(x)
   21418 		v.AddArg(ptr)
   21419 		v.AddArg(mem)
   21420 		return true
   21421 	}
   21422 	// match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem))
   21423 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21424 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21425 	for {
   21426 		t := v.Type
   21427 		_ = v.Args[1]
   21428 		x := v.Args[0]
   21429 		g := v.Args[1]
   21430 		if g.Op != OpS390XMOVWZload {
   21431 			break
   21432 		}
   21433 		off := g.AuxInt
   21434 		sym := g.Aux
   21435 		_ = g.Args[1]
   21436 		ptr := g.Args[0]
   21437 		mem := g.Args[1]
   21438 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21439 			break
   21440 		}
   21441 		v.reset(OpS390XMULLWload)
   21442 		v.Type = t
   21443 		v.AuxInt = off
   21444 		v.Aux = sym
   21445 		v.AddArg(x)
   21446 		v.AddArg(ptr)
   21447 		v.AddArg(mem)
   21448 		return true
   21449 	}
   21450 	// match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   21451 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21452 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21453 	for {
   21454 		t := v.Type
   21455 		_ = v.Args[1]
   21456 		g := v.Args[0]
   21457 		if g.Op != OpS390XMOVWZload {
   21458 			break
   21459 		}
   21460 		off := g.AuxInt
   21461 		sym := g.Aux
   21462 		_ = g.Args[1]
   21463 		ptr := g.Args[0]
   21464 		mem := g.Args[1]
   21465 		x := v.Args[1]
   21466 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21467 			break
   21468 		}
   21469 		v.reset(OpS390XMULLWload)
   21470 		v.Type = t
   21471 		v.AuxInt = off
   21472 		v.Aux = sym
   21473 		v.AddArg(x)
   21474 		v.AddArg(ptr)
   21475 		v.AddArg(mem)
   21476 		return true
   21477 	}
   21478 	// match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   21479 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21480 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21481 	for {
   21482 		t := v.Type
   21483 		_ = v.Args[1]
   21484 		g := v.Args[0]
   21485 		if g.Op != OpS390XMOVWZload {
   21486 			break
   21487 		}
   21488 		off := g.AuxInt
   21489 		sym := g.Aux
   21490 		_ = g.Args[1]
   21491 		ptr := g.Args[0]
   21492 		mem := g.Args[1]
   21493 		x := v.Args[1]
   21494 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21495 			break
   21496 		}
   21497 		v.reset(OpS390XMULLWload)
   21498 		v.Type = t
   21499 		v.AuxInt = off
   21500 		v.Aux = sym
   21501 		v.AddArg(x)
   21502 		v.AddArg(ptr)
   21503 		v.AddArg(mem)
   21504 		return true
   21505 	}
   21506 	// match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem))
   21507 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   21508 	// result: (MULLWload <t> [off] {sym} x ptr mem)
   21509 	for {
   21510 		t := v.Type
   21511 		_ = v.Args[1]
   21512 		x := v.Args[0]
   21513 		g := v.Args[1]
   21514 		if g.Op != OpS390XMOVWZload {
   21515 			break
   21516 		}
   21517 		off := g.AuxInt
   21518 		sym := g.Aux
   21519 		_ = g.Args[1]
   21520 		ptr := g.Args[0]
   21521 		mem := g.Args[1]
   21522 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   21523 			break
   21524 		}
   21525 		v.reset(OpS390XMULLWload)
   21526 		v.Type = t
   21527 		v.AuxInt = off
   21528 		v.Aux = sym
   21529 		v.AddArg(x)
   21530 		v.AddArg(ptr)
   21531 		v.AddArg(mem)
   21532 		return true
   21533 	}
   21534 	return false
   21535 }
   21536 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool {
   21537 	b := v.Block
   21538 	_ = b
   21539 	// match: (MULLWconst [-1] x)
   21540 	// cond:
   21541 	// result: (NEGW x)
   21542 	for {
   21543 		if v.AuxInt != -1 {
   21544 			break
   21545 		}
   21546 		x := v.Args[0]
   21547 		v.reset(OpS390XNEGW)
   21548 		v.AddArg(x)
   21549 		return true
   21550 	}
   21551 	// match: (MULLWconst [0] _)
   21552 	// cond:
   21553 	// result: (MOVDconst [0])
   21554 	for {
   21555 		if v.AuxInt != 0 {
   21556 			break
   21557 		}
   21558 		v.reset(OpS390XMOVDconst)
   21559 		v.AuxInt = 0
   21560 		return true
   21561 	}
   21562 	// match: (MULLWconst [1] x)
   21563 	// cond:
   21564 	// result: x
   21565 	for {
   21566 		if v.AuxInt != 1 {
   21567 			break
   21568 		}
   21569 		x := v.Args[0]
   21570 		v.reset(OpCopy)
   21571 		v.Type = x.Type
   21572 		v.AddArg(x)
   21573 		return true
   21574 	}
   21575 	// match: (MULLWconst [c] x)
   21576 	// cond: isPowerOfTwo(c)
   21577 	// result: (SLWconst [log2(c)] x)
   21578 	for {
   21579 		c := v.AuxInt
   21580 		x := v.Args[0]
   21581 		if !(isPowerOfTwo(c)) {
   21582 			break
   21583 		}
   21584 		v.reset(OpS390XSLWconst)
   21585 		v.AuxInt = log2(c)
   21586 		v.AddArg(x)
   21587 		return true
   21588 	}
   21589 	// match: (MULLWconst [c] x)
   21590 	// cond: isPowerOfTwo(c+1) && c >= 15
   21591 	// result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x)
   21592 	for {
   21593 		c := v.AuxInt
   21594 		x := v.Args[0]
   21595 		if !(isPowerOfTwo(c+1) && c >= 15) {
   21596 			break
   21597 		}
   21598 		v.reset(OpS390XSUBW)
   21599 		v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   21600 		v0.AuxInt = log2(c + 1)
   21601 		v0.AddArg(x)
   21602 		v.AddArg(v0)
   21603 		v.AddArg(x)
   21604 		return true
   21605 	}
   21606 	// match: (MULLWconst [c] x)
   21607 	// cond: isPowerOfTwo(c-1) && c >= 17
   21608 	// result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x)
   21609 	for {
   21610 		c := v.AuxInt
   21611 		x := v.Args[0]
   21612 		if !(isPowerOfTwo(c-1) && c >= 17) {
   21613 			break
   21614 		}
   21615 		v.reset(OpS390XADDW)
   21616 		v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   21617 		v0.AuxInt = log2(c - 1)
   21618 		v0.AddArg(x)
   21619 		v.AddArg(v0)
   21620 		v.AddArg(x)
   21621 		return true
   21622 	}
   21623 	// match: (MULLWconst [c] (MOVDconst [d]))
   21624 	// cond:
   21625 	// result: (MOVDconst [int64(int32(c*d))])
   21626 	for {
   21627 		c := v.AuxInt
   21628 		v_0 := v.Args[0]
   21629 		if v_0.Op != OpS390XMOVDconst {
   21630 			break
   21631 		}
   21632 		d := v_0.AuxInt
   21633 		v.reset(OpS390XMOVDconst)
   21634 		v.AuxInt = int64(int32(c * d))
   21635 		return true
   21636 	}
   21637 	return false
   21638 }
   21639 func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool {
   21640 	// match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem)
   21641 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   21642 	// result: (MULLWload [off1+off2] {sym} x ptr mem)
   21643 	for {
   21644 		off1 := v.AuxInt
   21645 		sym := v.Aux
   21646 		_ = v.Args[2]
   21647 		x := v.Args[0]
   21648 		v_1 := v.Args[1]
   21649 		if v_1.Op != OpS390XADDconst {
   21650 			break
   21651 		}
   21652 		off2 := v_1.AuxInt
   21653 		ptr := v_1.Args[0]
   21654 		mem := v.Args[2]
   21655 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   21656 			break
   21657 		}
   21658 		v.reset(OpS390XMULLWload)
   21659 		v.AuxInt = off1 + off2
   21660 		v.Aux = sym
   21661 		v.AddArg(x)
   21662 		v.AddArg(ptr)
   21663 		v.AddArg(mem)
   21664 		return true
   21665 	}
   21666 	// match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   21667 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   21668 	// result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   21669 	for {
   21670 		o1 := v.AuxInt
   21671 		s1 := v.Aux
   21672 		_ = v.Args[2]
   21673 		x := v.Args[0]
   21674 		v_1 := v.Args[1]
   21675 		if v_1.Op != OpS390XMOVDaddr {
   21676 			break
   21677 		}
   21678 		o2 := v_1.AuxInt
   21679 		s2 := v_1.Aux
   21680 		ptr := v_1.Args[0]
   21681 		mem := v.Args[2]
   21682 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   21683 			break
   21684 		}
   21685 		v.reset(OpS390XMULLWload)
   21686 		v.AuxInt = o1 + o2
   21687 		v.Aux = mergeSym(s1, s2)
   21688 		v.AddArg(x)
   21689 		v.AddArg(ptr)
   21690 		v.AddArg(mem)
   21691 		return true
   21692 	}
   21693 	return false
   21694 }
   21695 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool {
   21696 	// match: (NEG (MOVDconst [c]))
   21697 	// cond:
   21698 	// result: (MOVDconst [-c])
   21699 	for {
   21700 		v_0 := v.Args[0]
   21701 		if v_0.Op != OpS390XMOVDconst {
   21702 			break
   21703 		}
   21704 		c := v_0.AuxInt
   21705 		v.reset(OpS390XMOVDconst)
   21706 		v.AuxInt = -c
   21707 		return true
   21708 	}
   21709 	// match: (NEG (ADDconst [c] (NEG x)))
   21710 	// cond: c != -(1<<31)
   21711 	// result: (ADDconst [-c] x)
   21712 	for {
   21713 		v_0 := v.Args[0]
   21714 		if v_0.Op != OpS390XADDconst {
   21715 			break
   21716 		}
   21717 		c := v_0.AuxInt
   21718 		v_0_0 := v_0.Args[0]
   21719 		if v_0_0.Op != OpS390XNEG {
   21720 			break
   21721 		}
   21722 		x := v_0_0.Args[0]
   21723 		if !(c != -(1 << 31)) {
   21724 			break
   21725 		}
   21726 		v.reset(OpS390XADDconst)
   21727 		v.AuxInt = -c
   21728 		v.AddArg(x)
   21729 		return true
   21730 	}
   21731 	return false
   21732 }
   21733 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool {
   21734 	// match: (NEGW (MOVDconst [c]))
   21735 	// cond:
   21736 	// result: (MOVDconst [int64(int32(-c))])
   21737 	for {
   21738 		v_0 := v.Args[0]
   21739 		if v_0.Op != OpS390XMOVDconst {
   21740 			break
   21741 		}
   21742 		c := v_0.AuxInt
   21743 		v.reset(OpS390XMOVDconst)
   21744 		v.AuxInt = int64(int32(-c))
   21745 		return true
   21746 	}
   21747 	return false
   21748 }
   21749 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool {
   21750 	b := v.Block
   21751 	_ = b
   21752 	typ := &b.Func.Config.Types
   21753 	_ = typ
   21754 	// match: (NOT x)
   21755 	// cond: true
   21756 	// result: (XOR (MOVDconst [-1]) x)
   21757 	for {
   21758 		x := v.Args[0]
   21759 		if !(true) {
   21760 			break
   21761 		}
   21762 		v.reset(OpS390XXOR)
   21763 		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
   21764 		v0.AuxInt = -1
   21765 		v.AddArg(v0)
   21766 		v.AddArg(x)
   21767 		return true
   21768 	}
   21769 	return false
   21770 }
   21771 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool {
   21772 	// match: (NOTW x)
   21773 	// cond: true
   21774 	// result: (XORWconst [-1] x)
   21775 	for {
   21776 		x := v.Args[0]
   21777 		if !(true) {
   21778 			break
   21779 		}
   21780 		v.reset(OpS390XXORWconst)
   21781 		v.AuxInt = -1
   21782 		v.AddArg(x)
   21783 		return true
   21784 	}
   21785 	return false
   21786 }
   21787 func rewriteValueS390X_OpS390XOR_0(v *Value) bool {
   21788 	b := v.Block
   21789 	_ = b
   21790 	// match: (OR x (MOVDconst [c]))
   21791 	// cond: isU32Bit(c)
   21792 	// result: (ORconst [c] x)
   21793 	for {
   21794 		_ = v.Args[1]
   21795 		x := v.Args[0]
   21796 		v_1 := v.Args[1]
   21797 		if v_1.Op != OpS390XMOVDconst {
   21798 			break
   21799 		}
   21800 		c := v_1.AuxInt
   21801 		if !(isU32Bit(c)) {
   21802 			break
   21803 		}
   21804 		v.reset(OpS390XORconst)
   21805 		v.AuxInt = c
   21806 		v.AddArg(x)
   21807 		return true
   21808 	}
   21809 	// match: (OR (MOVDconst [c]) x)
   21810 	// cond: isU32Bit(c)
   21811 	// result: (ORconst [c] x)
   21812 	for {
   21813 		_ = v.Args[1]
   21814 		v_0 := v.Args[0]
   21815 		if v_0.Op != OpS390XMOVDconst {
   21816 			break
   21817 		}
   21818 		c := v_0.AuxInt
   21819 		x := v.Args[1]
   21820 		if !(isU32Bit(c)) {
   21821 			break
   21822 		}
   21823 		v.reset(OpS390XORconst)
   21824 		v.AuxInt = c
   21825 		v.AddArg(x)
   21826 		return true
   21827 	}
   21828 	// match: (OR (SLDconst x [c]) (SRDconst x [d]))
   21829 	// cond: d == 64-c
   21830 	// result: (RLLGconst [c] x)
   21831 	for {
   21832 		_ = v.Args[1]
   21833 		v_0 := v.Args[0]
   21834 		if v_0.Op != OpS390XSLDconst {
   21835 			break
   21836 		}
   21837 		c := v_0.AuxInt
   21838 		x := v_0.Args[0]
   21839 		v_1 := v.Args[1]
   21840 		if v_1.Op != OpS390XSRDconst {
   21841 			break
   21842 		}
   21843 		d := v_1.AuxInt
   21844 		if x != v_1.Args[0] {
   21845 			break
   21846 		}
   21847 		if !(d == 64-c) {
   21848 			break
   21849 		}
   21850 		v.reset(OpS390XRLLGconst)
   21851 		v.AuxInt = c
   21852 		v.AddArg(x)
   21853 		return true
   21854 	}
   21855 	// match: (OR (SRDconst x [d]) (SLDconst x [c]))
   21856 	// cond: d == 64-c
   21857 	// result: (RLLGconst [c] x)
   21858 	for {
   21859 		_ = v.Args[1]
   21860 		v_0 := v.Args[0]
   21861 		if v_0.Op != OpS390XSRDconst {
   21862 			break
   21863 		}
   21864 		d := v_0.AuxInt
   21865 		x := v_0.Args[0]
   21866 		v_1 := v.Args[1]
   21867 		if v_1.Op != OpS390XSLDconst {
   21868 			break
   21869 		}
   21870 		c := v_1.AuxInt
   21871 		if x != v_1.Args[0] {
   21872 			break
   21873 		}
   21874 		if !(d == 64-c) {
   21875 			break
   21876 		}
   21877 		v.reset(OpS390XRLLGconst)
   21878 		v.AuxInt = c
   21879 		v.AddArg(x)
   21880 		return true
   21881 	}
   21882 	// match: (OR (MOVDconst [-1<<63]) (LGDR <t> x))
   21883 	// cond:
   21884 	// result: (LGDR <t> (LNDFR <x.Type> x))
   21885 	for {
   21886 		_ = v.Args[1]
   21887 		v_0 := v.Args[0]
   21888 		if v_0.Op != OpS390XMOVDconst {
   21889 			break
   21890 		}
   21891 		if v_0.AuxInt != -1<<63 {
   21892 			break
   21893 		}
   21894 		v_1 := v.Args[1]
   21895 		if v_1.Op != OpS390XLGDR {
   21896 			break
   21897 		}
   21898 		t := v_1.Type
   21899 		x := v_1.Args[0]
   21900 		v.reset(OpS390XLGDR)
   21901 		v.Type = t
   21902 		v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type)
   21903 		v0.AddArg(x)
   21904 		v.AddArg(v0)
   21905 		return true
   21906 	}
   21907 	// match: (OR (LGDR <t> x) (MOVDconst [-1<<63]))
   21908 	// cond:
   21909 	// result: (LGDR <t> (LNDFR <x.Type> x))
   21910 	for {
   21911 		_ = v.Args[1]
   21912 		v_0 := v.Args[0]
   21913 		if v_0.Op != OpS390XLGDR {
   21914 			break
   21915 		}
   21916 		t := v_0.Type
   21917 		x := v_0.Args[0]
   21918 		v_1 := v.Args[1]
   21919 		if v_1.Op != OpS390XMOVDconst {
   21920 			break
   21921 		}
   21922 		if v_1.AuxInt != -1<<63 {
   21923 			break
   21924 		}
   21925 		v.reset(OpS390XLGDR)
   21926 		v.Type = t
   21927 		v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type)
   21928 		v0.AddArg(x)
   21929 		v.AddArg(v0)
   21930 		return true
   21931 	}
   21932 	// match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR <t> y)))
   21933 	// cond:
   21934 	// result: (LGDR (CPSDR <t> y x))
   21935 	for {
   21936 		_ = v.Args[1]
   21937 		v_0 := v.Args[0]
   21938 		if v_0.Op != OpS390XSLDconst {
   21939 			break
   21940 		}
   21941 		if v_0.AuxInt != 63 {
   21942 			break
   21943 		}
   21944 		v_0_0 := v_0.Args[0]
   21945 		if v_0_0.Op != OpS390XSRDconst {
   21946 			break
   21947 		}
   21948 		if v_0_0.AuxInt != 63 {
   21949 			break
   21950 		}
   21951 		v_0_0_0 := v_0_0.Args[0]
   21952 		if v_0_0_0.Op != OpS390XLGDR {
   21953 			break
   21954 		}
   21955 		x := v_0_0_0.Args[0]
   21956 		v_1 := v.Args[1]
   21957 		if v_1.Op != OpS390XLGDR {
   21958 			break
   21959 		}
   21960 		v_1_0 := v_1.Args[0]
   21961 		if v_1_0.Op != OpS390XLPDFR {
   21962 			break
   21963 		}
   21964 		t := v_1_0.Type
   21965 		y := v_1_0.Args[0]
   21966 		v.reset(OpS390XLGDR)
   21967 		v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t)
   21968 		v0.AddArg(y)
   21969 		v0.AddArg(x)
   21970 		v.AddArg(v0)
   21971 		return true
   21972 	}
   21973 	// match: (OR (LGDR (LPDFR <t> y)) (SLDconst [63] (SRDconst [63] (LGDR x))))
   21974 	// cond:
   21975 	// result: (LGDR (CPSDR <t> y x))
   21976 	for {
   21977 		_ = v.Args[1]
   21978 		v_0 := v.Args[0]
   21979 		if v_0.Op != OpS390XLGDR {
   21980 			break
   21981 		}
   21982 		v_0_0 := v_0.Args[0]
   21983 		if v_0_0.Op != OpS390XLPDFR {
   21984 			break
   21985 		}
   21986 		t := v_0_0.Type
   21987 		y := v_0_0.Args[0]
   21988 		v_1 := v.Args[1]
   21989 		if v_1.Op != OpS390XSLDconst {
   21990 			break
   21991 		}
   21992 		if v_1.AuxInt != 63 {
   21993 			break
   21994 		}
   21995 		v_1_0 := v_1.Args[0]
   21996 		if v_1_0.Op != OpS390XSRDconst {
   21997 			break
   21998 		}
   21999 		if v_1_0.AuxInt != 63 {
   22000 			break
   22001 		}
   22002 		v_1_0_0 := v_1_0.Args[0]
   22003 		if v_1_0_0.Op != OpS390XLGDR {
   22004 			break
   22005 		}
   22006 		x := v_1_0_0.Args[0]
   22007 		v.reset(OpS390XLGDR)
   22008 		v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t)
   22009 		v0.AddArg(y)
   22010 		v0.AddArg(x)
   22011 		v.AddArg(v0)
   22012 		return true
   22013 	}
   22014 	// match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c]))
   22015 	// cond: c & -1<<63 == 0
   22016 	// result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x))
   22017 	for {
   22018 		_ = v.Args[1]
   22019 		v_0 := v.Args[0]
   22020 		if v_0.Op != OpS390XSLDconst {
   22021 			break
   22022 		}
   22023 		if v_0.AuxInt != 63 {
   22024 			break
   22025 		}
   22026 		v_0_0 := v_0.Args[0]
   22027 		if v_0_0.Op != OpS390XSRDconst {
   22028 			break
   22029 		}
   22030 		if v_0_0.AuxInt != 63 {
   22031 			break
   22032 		}
   22033 		v_0_0_0 := v_0_0.Args[0]
   22034 		if v_0_0_0.Op != OpS390XLGDR {
   22035 			break
   22036 		}
   22037 		x := v_0_0_0.Args[0]
   22038 		v_1 := v.Args[1]
   22039 		if v_1.Op != OpS390XMOVDconst {
   22040 			break
   22041 		}
   22042 		c := v_1.AuxInt
   22043 		if !(c&-1<<63 == 0) {
   22044 			break
   22045 		}
   22046 		v.reset(OpS390XLGDR)
   22047 		v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type)
   22048 		v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type)
   22049 		v1.AuxInt = c
   22050 		v0.AddArg(v1)
   22051 		v0.AddArg(x)
   22052 		v.AddArg(v0)
   22053 		return true
   22054 	}
   22055 	// match: (OR (MOVDconst [c]) (SLDconst [63] (SRDconst [63] (LGDR x))))
   22056 	// cond: c & -1<<63 == 0
   22057 	// result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x))
   22058 	for {
   22059 		_ = v.Args[1]
   22060 		v_0 := v.Args[0]
   22061 		if v_0.Op != OpS390XMOVDconst {
   22062 			break
   22063 		}
   22064 		c := v_0.AuxInt
   22065 		v_1 := v.Args[1]
   22066 		if v_1.Op != OpS390XSLDconst {
   22067 			break
   22068 		}
   22069 		if v_1.AuxInt != 63 {
   22070 			break
   22071 		}
   22072 		v_1_0 := v_1.Args[0]
   22073 		if v_1_0.Op != OpS390XSRDconst {
   22074 			break
   22075 		}
   22076 		if v_1_0.AuxInt != 63 {
   22077 			break
   22078 		}
   22079 		v_1_0_0 := v_1_0.Args[0]
   22080 		if v_1_0_0.Op != OpS390XLGDR {
   22081 			break
   22082 		}
   22083 		x := v_1_0_0.Args[0]
   22084 		if !(c&-1<<63 == 0) {
   22085 			break
   22086 		}
   22087 		v.reset(OpS390XLGDR)
   22088 		v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type)
   22089 		v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type)
   22090 		v1.AuxInt = c
   22091 		v0.AddArg(v1)
   22092 		v0.AddArg(x)
   22093 		v.AddArg(v0)
   22094 		return true
   22095 	}
   22096 	return false
   22097 }
   22098 func rewriteValueS390X_OpS390XOR_10(v *Value) bool {
   22099 	b := v.Block
   22100 	_ = b
   22101 	typ := &b.Func.Config.Types
   22102 	_ = typ
   22103 	// match: (OR (MOVDconst [c]) (MOVDconst [d]))
   22104 	// cond:
   22105 	// result: (MOVDconst [c|d])
   22106 	for {
   22107 		_ = v.Args[1]
   22108 		v_0 := v.Args[0]
   22109 		if v_0.Op != OpS390XMOVDconst {
   22110 			break
   22111 		}
   22112 		c := v_0.AuxInt
   22113 		v_1 := v.Args[1]
   22114 		if v_1.Op != OpS390XMOVDconst {
   22115 			break
   22116 		}
   22117 		d := v_1.AuxInt
   22118 		v.reset(OpS390XMOVDconst)
   22119 		v.AuxInt = c | d
   22120 		return true
   22121 	}
   22122 	// match: (OR (MOVDconst [d]) (MOVDconst [c]))
   22123 	// cond:
   22124 	// result: (MOVDconst [c|d])
   22125 	for {
   22126 		_ = v.Args[1]
   22127 		v_0 := v.Args[0]
   22128 		if v_0.Op != OpS390XMOVDconst {
   22129 			break
   22130 		}
   22131 		d := v_0.AuxInt
   22132 		v_1 := v.Args[1]
   22133 		if v_1.Op != OpS390XMOVDconst {
   22134 			break
   22135 		}
   22136 		c := v_1.AuxInt
   22137 		v.reset(OpS390XMOVDconst)
   22138 		v.AuxInt = c | d
   22139 		return true
   22140 	}
   22141 	// match: (OR x x)
   22142 	// cond:
   22143 	// result: x
   22144 	for {
   22145 		_ = v.Args[1]
   22146 		x := v.Args[0]
   22147 		if x != v.Args[1] {
   22148 			break
   22149 		}
   22150 		v.reset(OpCopy)
   22151 		v.Type = x.Type
   22152 		v.AddArg(x)
   22153 		return true
   22154 	}
   22155 	// match: (OR <t> x g:(MOVDload [off] {sym} ptr mem))
   22156 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   22157 	// result: (ORload <t> [off] {sym} x ptr mem)
   22158 	for {
   22159 		t := v.Type
   22160 		_ = v.Args[1]
   22161 		x := v.Args[0]
   22162 		g := v.Args[1]
   22163 		if g.Op != OpS390XMOVDload {
   22164 			break
   22165 		}
   22166 		off := g.AuxInt
   22167 		sym := g.Aux
   22168 		_ = g.Args[1]
   22169 		ptr := g.Args[0]
   22170 		mem := g.Args[1]
   22171 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   22172 			break
   22173 		}
   22174 		v.reset(OpS390XORload)
   22175 		v.Type = t
   22176 		v.AuxInt = off
   22177 		v.Aux = sym
   22178 		v.AddArg(x)
   22179 		v.AddArg(ptr)
   22180 		v.AddArg(mem)
   22181 		return true
   22182 	}
   22183 	// match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x)
   22184 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   22185 	// result: (ORload <t> [off] {sym} x ptr mem)
   22186 	for {
   22187 		t := v.Type
   22188 		_ = v.Args[1]
   22189 		g := v.Args[0]
   22190 		if g.Op != OpS390XMOVDload {
   22191 			break
   22192 		}
   22193 		off := g.AuxInt
   22194 		sym := g.Aux
   22195 		_ = g.Args[1]
   22196 		ptr := g.Args[0]
   22197 		mem := g.Args[1]
   22198 		x := v.Args[1]
   22199 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   22200 			break
   22201 		}
   22202 		v.reset(OpS390XORload)
   22203 		v.Type = t
   22204 		v.AuxInt = off
   22205 		v.Aux = sym
   22206 		v.AddArg(x)
   22207 		v.AddArg(ptr)
   22208 		v.AddArg(mem)
   22209 		return true
   22210 	}
   22211 	// match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x)
   22212 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   22213 	// result: (ORload <t> [off] {sym} x ptr mem)
   22214 	for {
   22215 		t := v.Type
   22216 		_ = v.Args[1]
   22217 		g := v.Args[0]
   22218 		if g.Op != OpS390XMOVDload {
   22219 			break
   22220 		}
   22221 		off := g.AuxInt
   22222 		sym := g.Aux
   22223 		_ = g.Args[1]
   22224 		ptr := g.Args[0]
   22225 		mem := g.Args[1]
   22226 		x := v.Args[1]
   22227 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   22228 			break
   22229 		}
   22230 		v.reset(OpS390XORload)
   22231 		v.Type = t
   22232 		v.AuxInt = off
   22233 		v.Aux = sym
   22234 		v.AddArg(x)
   22235 		v.AddArg(ptr)
   22236 		v.AddArg(mem)
   22237 		return true
   22238 	}
   22239 	// match: (OR <t> x g:(MOVDload [off] {sym} ptr mem))
   22240 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   22241 	// result: (ORload <t> [off] {sym} x ptr mem)
   22242 	for {
   22243 		t := v.Type
   22244 		_ = v.Args[1]
   22245 		x := v.Args[0]
   22246 		g := v.Args[1]
   22247 		if g.Op != OpS390XMOVDload {
   22248 			break
   22249 		}
   22250 		off := g.AuxInt
   22251 		sym := g.Aux
   22252 		_ = g.Args[1]
   22253 		ptr := g.Args[0]
   22254 		mem := g.Args[1]
   22255 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   22256 			break
   22257 		}
   22258 		v.reset(OpS390XORload)
   22259 		v.Type = t
   22260 		v.AuxInt = off
   22261 		v.Aux = sym
   22262 		v.AddArg(x)
   22263 		v.AddArg(ptr)
   22264 		v.AddArg(mem)
   22265 		return true
   22266 	}
   22267 	// match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)))
   22268 	// 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)
   22269 	// result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
   22270 	for {
   22271 		_ = v.Args[1]
   22272 		x1 := v.Args[0]
   22273 		if x1.Op != OpS390XMOVBZload {
   22274 			break
   22275 		}
   22276 		i1 := x1.AuxInt
   22277 		s := x1.Aux
   22278 		_ = x1.Args[1]
   22279 		p := x1.Args[0]
   22280 		mem := x1.Args[1]
   22281 		sh := v.Args[1]
   22282 		if sh.Op != OpS390XSLDconst {
   22283 			break
   22284 		}
   22285 		if sh.AuxInt != 8 {
   22286 			break
   22287 		}
   22288 		x0 := sh.Args[0]
   22289 		if x0.Op != OpS390XMOVBZload {
   22290 			break
   22291 		}
   22292 		i0 := x0.AuxInt
   22293 		if x0.Aux != s {
   22294 			break
   22295 		}
   22296 		_ = x0.Args[1]
   22297 		if p != x0.Args[0] {
   22298 			break
   22299 		}
   22300 		if mem != x0.Args[1] {
   22301 			break
   22302 		}
   22303 		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)) {
   22304 			break
   22305 		}
   22306 		b = mergePoint(b, x0, x1)
   22307 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   22308 		v.reset(OpCopy)
   22309 		v.AddArg(v0)
   22310 		v0.AuxInt = i0
   22311 		v0.Aux = s
   22312 		v0.AddArg(p)
   22313 		v0.AddArg(mem)
   22314 		return true
   22315 	}
   22316 	// match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem))
   22317 	// 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)
   22318 	// result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
   22319 	for {
   22320 		_ = v.Args[1]
   22321 		sh := v.Args[0]
   22322 		if sh.Op != OpS390XSLDconst {
   22323 			break
   22324 		}
   22325 		if sh.AuxInt != 8 {
   22326 			break
   22327 		}
   22328 		x0 := sh.Args[0]
   22329 		if x0.Op != OpS390XMOVBZload {
   22330 			break
   22331 		}
   22332 		i0 := x0.AuxInt
   22333 		s := x0.Aux
   22334 		_ = x0.Args[1]
   22335 		p := x0.Args[0]
   22336 		mem := x0.Args[1]
   22337 		x1 := v.Args[1]
   22338 		if x1.Op != OpS390XMOVBZload {
   22339 			break
   22340 		}
   22341 		i1 := x1.AuxInt
   22342 		if x1.Aux != s {
   22343 			break
   22344 		}
   22345 		_ = x1.Args[1]
   22346 		if p != x1.Args[0] {
   22347 			break
   22348 		}
   22349 		if mem != x1.Args[1] {
   22350 			break
   22351 		}
   22352 		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)) {
   22353 			break
   22354 		}
   22355 		b = mergePoint(b, x0, x1)
   22356 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   22357 		v.reset(OpCopy)
   22358 		v.AddArg(v0)
   22359 		v0.AuxInt = i0
   22360 		v0.Aux = s
   22361 		v0.AddArg(p)
   22362 		v0.AddArg(mem)
   22363 		return true
   22364 	}
   22365 	// match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)))
   22366 	// 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)
   22367 	// result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
   22368 	for {
   22369 		_ = v.Args[1]
   22370 		x1 := v.Args[0]
   22371 		if x1.Op != OpS390XMOVHZload {
   22372 			break
   22373 		}
   22374 		i1 := x1.AuxInt
   22375 		s := x1.Aux
   22376 		_ = x1.Args[1]
   22377 		p := x1.Args[0]
   22378 		mem := x1.Args[1]
   22379 		sh := v.Args[1]
   22380 		if sh.Op != OpS390XSLDconst {
   22381 			break
   22382 		}
   22383 		if sh.AuxInt != 16 {
   22384 			break
   22385 		}
   22386 		x0 := sh.Args[0]
   22387 		if x0.Op != OpS390XMOVHZload {
   22388 			break
   22389 		}
   22390 		i0 := x0.AuxInt
   22391 		if x0.Aux != s {
   22392 			break
   22393 		}
   22394 		_ = x0.Args[1]
   22395 		if p != x0.Args[0] {
   22396 			break
   22397 		}
   22398 		if mem != x0.Args[1] {
   22399 			break
   22400 		}
   22401 		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)) {
   22402 			break
   22403 		}
   22404 		b = mergePoint(b, x0, x1)
   22405 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   22406 		v.reset(OpCopy)
   22407 		v.AddArg(v0)
   22408 		v0.AuxInt = i0
   22409 		v0.Aux = s
   22410 		v0.AddArg(p)
   22411 		v0.AddArg(mem)
   22412 		return true
   22413 	}
   22414 	return false
   22415 }
   22416 func rewriteValueS390X_OpS390XOR_20(v *Value) bool {
   22417 	b := v.Block
   22418 	_ = b
   22419 	typ := &b.Func.Config.Types
   22420 	_ = typ
   22421 	// match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem))
   22422 	// 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)
   22423 	// result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
   22424 	for {
   22425 		_ = v.Args[1]
   22426 		sh := v.Args[0]
   22427 		if sh.Op != OpS390XSLDconst {
   22428 			break
   22429 		}
   22430 		if sh.AuxInt != 16 {
   22431 			break
   22432 		}
   22433 		x0 := sh.Args[0]
   22434 		if x0.Op != OpS390XMOVHZload {
   22435 			break
   22436 		}
   22437 		i0 := x0.AuxInt
   22438 		s := x0.Aux
   22439 		_ = x0.Args[1]
   22440 		p := x0.Args[0]
   22441 		mem := x0.Args[1]
   22442 		x1 := v.Args[1]
   22443 		if x1.Op != OpS390XMOVHZload {
   22444 			break
   22445 		}
   22446 		i1 := x1.AuxInt
   22447 		if x1.Aux != s {
   22448 			break
   22449 		}
   22450 		_ = x1.Args[1]
   22451 		if p != x1.Args[0] {
   22452 			break
   22453 		}
   22454 		if mem != x1.Args[1] {
   22455 			break
   22456 		}
   22457 		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)) {
   22458 			break
   22459 		}
   22460 		b = mergePoint(b, x0, x1)
   22461 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   22462 		v.reset(OpCopy)
   22463 		v.AddArg(v0)
   22464 		v0.AuxInt = i0
   22465 		v0.Aux = s
   22466 		v0.AddArg(p)
   22467 		v0.AddArg(mem)
   22468 		return true
   22469 	}
   22470 	// match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)))
   22471 	// 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)
   22472 	// result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem)
   22473 	for {
   22474 		_ = v.Args[1]
   22475 		x1 := v.Args[0]
   22476 		if x1.Op != OpS390XMOVWZload {
   22477 			break
   22478 		}
   22479 		i1 := x1.AuxInt
   22480 		s := x1.Aux
   22481 		_ = x1.Args[1]
   22482 		p := x1.Args[0]
   22483 		mem := x1.Args[1]
   22484 		sh := v.Args[1]
   22485 		if sh.Op != OpS390XSLDconst {
   22486 			break
   22487 		}
   22488 		if sh.AuxInt != 32 {
   22489 			break
   22490 		}
   22491 		x0 := sh.Args[0]
   22492 		if x0.Op != OpS390XMOVWZload {
   22493 			break
   22494 		}
   22495 		i0 := x0.AuxInt
   22496 		if x0.Aux != s {
   22497 			break
   22498 		}
   22499 		_ = x0.Args[1]
   22500 		if p != x0.Args[0] {
   22501 			break
   22502 		}
   22503 		if mem != x0.Args[1] {
   22504 			break
   22505 		}
   22506 		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)) {
   22507 			break
   22508 		}
   22509 		b = mergePoint(b, x0, x1)
   22510 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   22511 		v.reset(OpCopy)
   22512 		v.AddArg(v0)
   22513 		v0.AuxInt = i0
   22514 		v0.Aux = s
   22515 		v0.AddArg(p)
   22516 		v0.AddArg(mem)
   22517 		return true
   22518 	}
   22519 	// match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem))
   22520 	// 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)
   22521 	// result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem)
   22522 	for {
   22523 		_ = v.Args[1]
   22524 		sh := v.Args[0]
   22525 		if sh.Op != OpS390XSLDconst {
   22526 			break
   22527 		}
   22528 		if sh.AuxInt != 32 {
   22529 			break
   22530 		}
   22531 		x0 := sh.Args[0]
   22532 		if x0.Op != OpS390XMOVWZload {
   22533 			break
   22534 		}
   22535 		i0 := x0.AuxInt
   22536 		s := x0.Aux
   22537 		_ = x0.Args[1]
   22538 		p := x0.Args[0]
   22539 		mem := x0.Args[1]
   22540 		x1 := v.Args[1]
   22541 		if x1.Op != OpS390XMOVWZload {
   22542 			break
   22543 		}
   22544 		i1 := x1.AuxInt
   22545 		if x1.Aux != s {
   22546 			break
   22547 		}
   22548 		_ = x1.Args[1]
   22549 		if p != x1.Args[0] {
   22550 			break
   22551 		}
   22552 		if mem != x1.Args[1] {
   22553 			break
   22554 		}
   22555 		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)) {
   22556 			break
   22557 		}
   22558 		b = mergePoint(b, x0, x1)
   22559 		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
   22560 		v.reset(OpCopy)
   22561 		v.AddArg(v0)
   22562 		v0.AuxInt = i0
   22563 		v0.Aux = s
   22564 		v0.AddArg(p)
   22565 		v0.AddArg(mem)
   22566 		return true
   22567 	}
   22568 	// match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y))
   22569 	// 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)
   22570 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   22571 	for {
   22572 		_ = v.Args[1]
   22573 		s0 := v.Args[0]
   22574 		if s0.Op != OpS390XSLDconst {
   22575 			break
   22576 		}
   22577 		j0 := s0.AuxInt
   22578 		x0 := s0.Args[0]
   22579 		if x0.Op != OpS390XMOVBZload {
   22580 			break
   22581 		}
   22582 		i0 := x0.AuxInt
   22583 		s := x0.Aux
   22584 		_ = x0.Args[1]
   22585 		p := x0.Args[0]
   22586 		mem := x0.Args[1]
   22587 		or := v.Args[1]
   22588 		if or.Op != OpS390XOR {
   22589 			break
   22590 		}
   22591 		_ = or.Args[1]
   22592 		s1 := or.Args[0]
   22593 		if s1.Op != OpS390XSLDconst {
   22594 			break
   22595 		}
   22596 		j1 := s1.AuxInt
   22597 		x1 := s1.Args[0]
   22598 		if x1.Op != OpS390XMOVBZload {
   22599 			break
   22600 		}
   22601 		i1 := x1.AuxInt
   22602 		if x1.Aux != s {
   22603 			break
   22604 		}
   22605 		_ = x1.Args[1]
   22606 		if p != x1.Args[0] {
   22607 			break
   22608 		}
   22609 		if mem != x1.Args[1] {
   22610 			break
   22611 		}
   22612 		y := or.Args[1]
   22613 		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)) {
   22614 			break
   22615 		}
   22616 		b = mergePoint(b, x0, x1)
   22617 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   22618 		v.reset(OpCopy)
   22619 		v.AddArg(v0)
   22620 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   22621 		v1.AuxInt = j1
   22622 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   22623 		v2.AuxInt = i0
   22624 		v2.Aux = s
   22625 		v2.AddArg(p)
   22626 		v2.AddArg(mem)
   22627 		v1.AddArg(v2)
   22628 		v0.AddArg(v1)
   22629 		v0.AddArg(y)
   22630 		return true
   22631 	}
   22632 	// match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))))
   22633 	// 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)
   22634 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   22635 	for {
   22636 		_ = v.Args[1]
   22637 		s0 := v.Args[0]
   22638 		if s0.Op != OpS390XSLDconst {
   22639 			break
   22640 		}
   22641 		j0 := s0.AuxInt
   22642 		x0 := s0.Args[0]
   22643 		if x0.Op != OpS390XMOVBZload {
   22644 			break
   22645 		}
   22646 		i0 := x0.AuxInt
   22647 		s := x0.Aux
   22648 		_ = x0.Args[1]
   22649 		p := x0.Args[0]
   22650 		mem := x0.Args[1]
   22651 		or := v.Args[1]
   22652 		if or.Op != OpS390XOR {
   22653 			break
   22654 		}
   22655 		_ = or.Args[1]
   22656 		y := or.Args[0]
   22657 		s1 := or.Args[1]
   22658 		if s1.Op != OpS390XSLDconst {
   22659 			break
   22660 		}
   22661 		j1 := s1.AuxInt
   22662 		x1 := s1.Args[0]
   22663 		if x1.Op != OpS390XMOVBZload {
   22664 			break
   22665 		}
   22666 		i1 := x1.AuxInt
   22667 		if x1.Aux != s {
   22668 			break
   22669 		}
   22670 		_ = x1.Args[1]
   22671 		if p != x1.Args[0] {
   22672 			break
   22673 		}
   22674 		if mem != x1.Args[1] {
   22675 			break
   22676 		}
   22677 		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)) {
   22678 			break
   22679 		}
   22680 		b = mergePoint(b, x0, x1)
   22681 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   22682 		v.reset(OpCopy)
   22683 		v.AddArg(v0)
   22684 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   22685 		v1.AuxInt = j1
   22686 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   22687 		v2.AuxInt = i0
   22688 		v2.Aux = s
   22689 		v2.AddArg(p)
   22690 		v2.AddArg(mem)
   22691 		v1.AddArg(v2)
   22692 		v0.AddArg(v1)
   22693 		v0.AddArg(y)
   22694 		return true
   22695 	}
   22696 	// match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))
   22697 	// 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)
   22698 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   22699 	for {
   22700 		_ = v.Args[1]
   22701 		or := v.Args[0]
   22702 		if or.Op != OpS390XOR {
   22703 			break
   22704 		}
   22705 		_ = or.Args[1]
   22706 		s1 := or.Args[0]
   22707 		if s1.Op != OpS390XSLDconst {
   22708 			break
   22709 		}
   22710 		j1 := s1.AuxInt
   22711 		x1 := s1.Args[0]
   22712 		if x1.Op != OpS390XMOVBZload {
   22713 			break
   22714 		}
   22715 		i1 := x1.AuxInt
   22716 		s := x1.Aux
   22717 		_ = x1.Args[1]
   22718 		p := x1.Args[0]
   22719 		mem := x1.Args[1]
   22720 		y := or.Args[1]
   22721 		s0 := v.Args[1]
   22722 		if s0.Op != OpS390XSLDconst {
   22723 			break
   22724 		}
   22725 		j0 := s0.AuxInt
   22726 		x0 := s0.Args[0]
   22727 		if x0.Op != OpS390XMOVBZload {
   22728 			break
   22729 		}
   22730 		i0 := x0.AuxInt
   22731 		if x0.Aux != s {
   22732 			break
   22733 		}
   22734 		_ = x0.Args[1]
   22735 		if p != x0.Args[0] {
   22736 			break
   22737 		}
   22738 		if mem != x0.Args[1] {
   22739 			break
   22740 		}
   22741 		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)) {
   22742 			break
   22743 		}
   22744 		b = mergePoint(b, x0, x1)
   22745 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   22746 		v.reset(OpCopy)
   22747 		v.AddArg(v0)
   22748 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   22749 		v1.AuxInt = j1
   22750 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   22751 		v2.AuxInt = i0
   22752 		v2.Aux = s
   22753 		v2.AddArg(p)
   22754 		v2.AddArg(mem)
   22755 		v1.AddArg(v2)
   22756 		v0.AddArg(v1)
   22757 		v0.AddArg(y)
   22758 		return true
   22759 	}
   22760 	// match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))
   22761 	// 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)
   22762 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   22763 	for {
   22764 		_ = v.Args[1]
   22765 		or := v.Args[0]
   22766 		if or.Op != OpS390XOR {
   22767 			break
   22768 		}
   22769 		_ = or.Args[1]
   22770 		y := or.Args[0]
   22771 		s1 := or.Args[1]
   22772 		if s1.Op != OpS390XSLDconst {
   22773 			break
   22774 		}
   22775 		j1 := s1.AuxInt
   22776 		x1 := s1.Args[0]
   22777 		if x1.Op != OpS390XMOVBZload {
   22778 			break
   22779 		}
   22780 		i1 := x1.AuxInt
   22781 		s := x1.Aux
   22782 		_ = x1.Args[1]
   22783 		p := x1.Args[0]
   22784 		mem := x1.Args[1]
   22785 		s0 := v.Args[1]
   22786 		if s0.Op != OpS390XSLDconst {
   22787 			break
   22788 		}
   22789 		j0 := s0.AuxInt
   22790 		x0 := s0.Args[0]
   22791 		if x0.Op != OpS390XMOVBZload {
   22792 			break
   22793 		}
   22794 		i0 := x0.AuxInt
   22795 		if x0.Aux != s {
   22796 			break
   22797 		}
   22798 		_ = x0.Args[1]
   22799 		if p != x0.Args[0] {
   22800 			break
   22801 		}
   22802 		if mem != x0.Args[1] {
   22803 			break
   22804 		}
   22805 		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)) {
   22806 			break
   22807 		}
   22808 		b = mergePoint(b, x0, x1)
   22809 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   22810 		v.reset(OpCopy)
   22811 		v.AddArg(v0)
   22812 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   22813 		v1.AuxInt = j1
   22814 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   22815 		v2.AuxInt = i0
   22816 		v2.Aux = s
   22817 		v2.AddArg(p)
   22818 		v2.AddArg(mem)
   22819 		v1.AddArg(v2)
   22820 		v0.AddArg(v1)
   22821 		v0.AddArg(y)
   22822 		return true
   22823 	}
   22824 	// match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y))
   22825 	// 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)
   22826 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
   22827 	for {
   22828 		_ = v.Args[1]
   22829 		s0 := v.Args[0]
   22830 		if s0.Op != OpS390XSLDconst {
   22831 			break
   22832 		}
   22833 		j0 := s0.AuxInt
   22834 		x0 := s0.Args[0]
   22835 		if x0.Op != OpS390XMOVHZload {
   22836 			break
   22837 		}
   22838 		i0 := x0.AuxInt
   22839 		s := x0.Aux
   22840 		_ = x0.Args[1]
   22841 		p := x0.Args[0]
   22842 		mem := x0.Args[1]
   22843 		or := v.Args[1]
   22844 		if or.Op != OpS390XOR {
   22845 			break
   22846 		}
   22847 		_ = or.Args[1]
   22848 		s1 := or.Args[0]
   22849 		if s1.Op != OpS390XSLDconst {
   22850 			break
   22851 		}
   22852 		j1 := s1.AuxInt
   22853 		x1 := s1.Args[0]
   22854 		if x1.Op != OpS390XMOVHZload {
   22855 			break
   22856 		}
   22857 		i1 := x1.AuxInt
   22858 		if x1.Aux != s {
   22859 			break
   22860 		}
   22861 		_ = x1.Args[1]
   22862 		if p != x1.Args[0] {
   22863 			break
   22864 		}
   22865 		if mem != x1.Args[1] {
   22866 			break
   22867 		}
   22868 		y := or.Args[1]
   22869 		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)) {
   22870 			break
   22871 		}
   22872 		b = mergePoint(b, x0, x1)
   22873 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   22874 		v.reset(OpCopy)
   22875 		v.AddArg(v0)
   22876 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   22877 		v1.AuxInt = j1
   22878 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   22879 		v2.AuxInt = i0
   22880 		v2.Aux = s
   22881 		v2.AddArg(p)
   22882 		v2.AddArg(mem)
   22883 		v1.AddArg(v2)
   22884 		v0.AddArg(v1)
   22885 		v0.AddArg(y)
   22886 		return true
   22887 	}
   22888 	// match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))))
   22889 	// 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)
   22890 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
   22891 	for {
   22892 		_ = v.Args[1]
   22893 		s0 := v.Args[0]
   22894 		if s0.Op != OpS390XSLDconst {
   22895 			break
   22896 		}
   22897 		j0 := s0.AuxInt
   22898 		x0 := s0.Args[0]
   22899 		if x0.Op != OpS390XMOVHZload {
   22900 			break
   22901 		}
   22902 		i0 := x0.AuxInt
   22903 		s := x0.Aux
   22904 		_ = x0.Args[1]
   22905 		p := x0.Args[0]
   22906 		mem := x0.Args[1]
   22907 		or := v.Args[1]
   22908 		if or.Op != OpS390XOR {
   22909 			break
   22910 		}
   22911 		_ = or.Args[1]
   22912 		y := or.Args[0]
   22913 		s1 := or.Args[1]
   22914 		if s1.Op != OpS390XSLDconst {
   22915 			break
   22916 		}
   22917 		j1 := s1.AuxInt
   22918 		x1 := s1.Args[0]
   22919 		if x1.Op != OpS390XMOVHZload {
   22920 			break
   22921 		}
   22922 		i1 := x1.AuxInt
   22923 		if x1.Aux != s {
   22924 			break
   22925 		}
   22926 		_ = x1.Args[1]
   22927 		if p != x1.Args[0] {
   22928 			break
   22929 		}
   22930 		if mem != x1.Args[1] {
   22931 			break
   22932 		}
   22933 		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)) {
   22934 			break
   22935 		}
   22936 		b = mergePoint(b, x0, x1)
   22937 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   22938 		v.reset(OpCopy)
   22939 		v.AddArg(v0)
   22940 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   22941 		v1.AuxInt = j1
   22942 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   22943 		v2.AuxInt = i0
   22944 		v2.Aux = s
   22945 		v2.AddArg(p)
   22946 		v2.AddArg(mem)
   22947 		v1.AddArg(v2)
   22948 		v0.AddArg(v1)
   22949 		v0.AddArg(y)
   22950 		return true
   22951 	}
   22952 	// match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)))
   22953 	// 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)
   22954 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
   22955 	for {
   22956 		_ = v.Args[1]
   22957 		or := v.Args[0]
   22958 		if or.Op != OpS390XOR {
   22959 			break
   22960 		}
   22961 		_ = or.Args[1]
   22962 		s1 := or.Args[0]
   22963 		if s1.Op != OpS390XSLDconst {
   22964 			break
   22965 		}
   22966 		j1 := s1.AuxInt
   22967 		x1 := s1.Args[0]
   22968 		if x1.Op != OpS390XMOVHZload {
   22969 			break
   22970 		}
   22971 		i1 := x1.AuxInt
   22972 		s := x1.Aux
   22973 		_ = x1.Args[1]
   22974 		p := x1.Args[0]
   22975 		mem := x1.Args[1]
   22976 		y := or.Args[1]
   22977 		s0 := v.Args[1]
   22978 		if s0.Op != OpS390XSLDconst {
   22979 			break
   22980 		}
   22981 		j0 := s0.AuxInt
   22982 		x0 := s0.Args[0]
   22983 		if x0.Op != OpS390XMOVHZload {
   22984 			break
   22985 		}
   22986 		i0 := x0.AuxInt
   22987 		if x0.Aux != s {
   22988 			break
   22989 		}
   22990 		_ = x0.Args[1]
   22991 		if p != x0.Args[0] {
   22992 			break
   22993 		}
   22994 		if mem != x0.Args[1] {
   22995 			break
   22996 		}
   22997 		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)) {
   22998 			break
   22999 		}
   23000 		b = mergePoint(b, x0, x1)
   23001 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   23002 		v.reset(OpCopy)
   23003 		v.AddArg(v0)
   23004 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   23005 		v1.AuxInt = j1
   23006 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   23007 		v2.AuxInt = i0
   23008 		v2.Aux = s
   23009 		v2.AddArg(p)
   23010 		v2.AddArg(mem)
   23011 		v1.AddArg(v2)
   23012 		v0.AddArg(v1)
   23013 		v0.AddArg(y)
   23014 		return true
   23015 	}
   23016 	return false
   23017 }
   23018 func rewriteValueS390X_OpS390XOR_30(v *Value) bool {
   23019 	b := v.Block
   23020 	_ = b
   23021 	typ := &b.Func.Config.Types
   23022 	_ = typ
   23023 	// match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)))
   23024 	// 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)
   23025 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
   23026 	for {
   23027 		_ = v.Args[1]
   23028 		or := v.Args[0]
   23029 		if or.Op != OpS390XOR {
   23030 			break
   23031 		}
   23032 		_ = or.Args[1]
   23033 		y := or.Args[0]
   23034 		s1 := or.Args[1]
   23035 		if s1.Op != OpS390XSLDconst {
   23036 			break
   23037 		}
   23038 		j1 := s1.AuxInt
   23039 		x1 := s1.Args[0]
   23040 		if x1.Op != OpS390XMOVHZload {
   23041 			break
   23042 		}
   23043 		i1 := x1.AuxInt
   23044 		s := x1.Aux
   23045 		_ = x1.Args[1]
   23046 		p := x1.Args[0]
   23047 		mem := x1.Args[1]
   23048 		s0 := v.Args[1]
   23049 		if s0.Op != OpS390XSLDconst {
   23050 			break
   23051 		}
   23052 		j0 := s0.AuxInt
   23053 		x0 := s0.Args[0]
   23054 		if x0.Op != OpS390XMOVHZload {
   23055 			break
   23056 		}
   23057 		i0 := x0.AuxInt
   23058 		if x0.Aux != s {
   23059 			break
   23060 		}
   23061 		_ = x0.Args[1]
   23062 		if p != x0.Args[0] {
   23063 			break
   23064 		}
   23065 		if mem != x0.Args[1] {
   23066 			break
   23067 		}
   23068 		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)) {
   23069 			break
   23070 		}
   23071 		b = mergePoint(b, x0, x1)
   23072 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   23073 		v.reset(OpCopy)
   23074 		v.AddArg(v0)
   23075 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   23076 		v1.AuxInt = j1
   23077 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   23078 		v2.AuxInt = i0
   23079 		v2.Aux = s
   23080 		v2.AddArg(p)
   23081 		v2.AddArg(mem)
   23082 		v1.AddArg(v2)
   23083 		v0.AddArg(v1)
   23084 		v0.AddArg(y)
   23085 		return true
   23086 	}
   23087 	// match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)))
   23088 	// 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)
   23089 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23090 	for {
   23091 		_ = v.Args[1]
   23092 		x1 := v.Args[0]
   23093 		if x1.Op != OpS390XMOVBZloadidx {
   23094 			break
   23095 		}
   23096 		i1 := x1.AuxInt
   23097 		s := x1.Aux
   23098 		_ = x1.Args[2]
   23099 		p := x1.Args[0]
   23100 		idx := x1.Args[1]
   23101 		mem := x1.Args[2]
   23102 		sh := v.Args[1]
   23103 		if sh.Op != OpS390XSLDconst {
   23104 			break
   23105 		}
   23106 		if sh.AuxInt != 8 {
   23107 			break
   23108 		}
   23109 		x0 := sh.Args[0]
   23110 		if x0.Op != OpS390XMOVBZloadidx {
   23111 			break
   23112 		}
   23113 		i0 := x0.AuxInt
   23114 		if x0.Aux != s {
   23115 			break
   23116 		}
   23117 		_ = x0.Args[2]
   23118 		if p != x0.Args[0] {
   23119 			break
   23120 		}
   23121 		if idx != x0.Args[1] {
   23122 			break
   23123 		}
   23124 		if mem != x0.Args[2] {
   23125 			break
   23126 		}
   23127 		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)) {
   23128 			break
   23129 		}
   23130 		b = mergePoint(b, x0, x1)
   23131 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23132 		v.reset(OpCopy)
   23133 		v.AddArg(v0)
   23134 		v0.AuxInt = i0
   23135 		v0.Aux = s
   23136 		v0.AddArg(p)
   23137 		v0.AddArg(idx)
   23138 		v0.AddArg(mem)
   23139 		return true
   23140 	}
   23141 	// match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)))
   23142 	// 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)
   23143 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23144 	for {
   23145 		_ = v.Args[1]
   23146 		x1 := v.Args[0]
   23147 		if x1.Op != OpS390XMOVBZloadidx {
   23148 			break
   23149 		}
   23150 		i1 := x1.AuxInt
   23151 		s := x1.Aux
   23152 		_ = x1.Args[2]
   23153 		idx := x1.Args[0]
   23154 		p := x1.Args[1]
   23155 		mem := x1.Args[2]
   23156 		sh := v.Args[1]
   23157 		if sh.Op != OpS390XSLDconst {
   23158 			break
   23159 		}
   23160 		if sh.AuxInt != 8 {
   23161 			break
   23162 		}
   23163 		x0 := sh.Args[0]
   23164 		if x0.Op != OpS390XMOVBZloadidx {
   23165 			break
   23166 		}
   23167 		i0 := x0.AuxInt
   23168 		if x0.Aux != s {
   23169 			break
   23170 		}
   23171 		_ = x0.Args[2]
   23172 		if p != x0.Args[0] {
   23173 			break
   23174 		}
   23175 		if idx != x0.Args[1] {
   23176 			break
   23177 		}
   23178 		if mem != x0.Args[2] {
   23179 			break
   23180 		}
   23181 		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)) {
   23182 			break
   23183 		}
   23184 		b = mergePoint(b, x0, x1)
   23185 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23186 		v.reset(OpCopy)
   23187 		v.AddArg(v0)
   23188 		v0.AuxInt = i0
   23189 		v0.Aux = s
   23190 		v0.AddArg(p)
   23191 		v0.AddArg(idx)
   23192 		v0.AddArg(mem)
   23193 		return true
   23194 	}
   23195 	// match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)))
   23196 	// 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)
   23197 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23198 	for {
   23199 		_ = v.Args[1]
   23200 		x1 := v.Args[0]
   23201 		if x1.Op != OpS390XMOVBZloadidx {
   23202 			break
   23203 		}
   23204 		i1 := x1.AuxInt
   23205 		s := x1.Aux
   23206 		_ = x1.Args[2]
   23207 		p := x1.Args[0]
   23208 		idx := x1.Args[1]
   23209 		mem := x1.Args[2]
   23210 		sh := v.Args[1]
   23211 		if sh.Op != OpS390XSLDconst {
   23212 			break
   23213 		}
   23214 		if sh.AuxInt != 8 {
   23215 			break
   23216 		}
   23217 		x0 := sh.Args[0]
   23218 		if x0.Op != OpS390XMOVBZloadidx {
   23219 			break
   23220 		}
   23221 		i0 := x0.AuxInt
   23222 		if x0.Aux != s {
   23223 			break
   23224 		}
   23225 		_ = x0.Args[2]
   23226 		if idx != x0.Args[0] {
   23227 			break
   23228 		}
   23229 		if p != x0.Args[1] {
   23230 			break
   23231 		}
   23232 		if mem != x0.Args[2] {
   23233 			break
   23234 		}
   23235 		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)) {
   23236 			break
   23237 		}
   23238 		b = mergePoint(b, x0, x1)
   23239 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23240 		v.reset(OpCopy)
   23241 		v.AddArg(v0)
   23242 		v0.AuxInt = i0
   23243 		v0.Aux = s
   23244 		v0.AddArg(p)
   23245 		v0.AddArg(idx)
   23246 		v0.AddArg(mem)
   23247 		return true
   23248 	}
   23249 	// match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)))
   23250 	// 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)
   23251 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23252 	for {
   23253 		_ = v.Args[1]
   23254 		x1 := v.Args[0]
   23255 		if x1.Op != OpS390XMOVBZloadidx {
   23256 			break
   23257 		}
   23258 		i1 := x1.AuxInt
   23259 		s := x1.Aux
   23260 		_ = x1.Args[2]
   23261 		idx := x1.Args[0]
   23262 		p := x1.Args[1]
   23263 		mem := x1.Args[2]
   23264 		sh := v.Args[1]
   23265 		if sh.Op != OpS390XSLDconst {
   23266 			break
   23267 		}
   23268 		if sh.AuxInt != 8 {
   23269 			break
   23270 		}
   23271 		x0 := sh.Args[0]
   23272 		if x0.Op != OpS390XMOVBZloadidx {
   23273 			break
   23274 		}
   23275 		i0 := x0.AuxInt
   23276 		if x0.Aux != s {
   23277 			break
   23278 		}
   23279 		_ = x0.Args[2]
   23280 		if idx != x0.Args[0] {
   23281 			break
   23282 		}
   23283 		if p != x0.Args[1] {
   23284 			break
   23285 		}
   23286 		if mem != x0.Args[2] {
   23287 			break
   23288 		}
   23289 		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)) {
   23290 			break
   23291 		}
   23292 		b = mergePoint(b, x0, x1)
   23293 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23294 		v.reset(OpCopy)
   23295 		v.AddArg(v0)
   23296 		v0.AuxInt = i0
   23297 		v0.Aux = s
   23298 		v0.AddArg(p)
   23299 		v0.AddArg(idx)
   23300 		v0.AddArg(mem)
   23301 		return true
   23302 	}
   23303 	// match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem))
   23304 	// 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)
   23305 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23306 	for {
   23307 		_ = v.Args[1]
   23308 		sh := v.Args[0]
   23309 		if sh.Op != OpS390XSLDconst {
   23310 			break
   23311 		}
   23312 		if sh.AuxInt != 8 {
   23313 			break
   23314 		}
   23315 		x0 := sh.Args[0]
   23316 		if x0.Op != OpS390XMOVBZloadidx {
   23317 			break
   23318 		}
   23319 		i0 := x0.AuxInt
   23320 		s := x0.Aux
   23321 		_ = x0.Args[2]
   23322 		p := x0.Args[0]
   23323 		idx := x0.Args[1]
   23324 		mem := x0.Args[2]
   23325 		x1 := v.Args[1]
   23326 		if x1.Op != OpS390XMOVBZloadidx {
   23327 			break
   23328 		}
   23329 		i1 := x1.AuxInt
   23330 		if x1.Aux != s {
   23331 			break
   23332 		}
   23333 		_ = x1.Args[2]
   23334 		if p != x1.Args[0] {
   23335 			break
   23336 		}
   23337 		if idx != x1.Args[1] {
   23338 			break
   23339 		}
   23340 		if mem != x1.Args[2] {
   23341 			break
   23342 		}
   23343 		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)) {
   23344 			break
   23345 		}
   23346 		b = mergePoint(b, x0, x1)
   23347 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23348 		v.reset(OpCopy)
   23349 		v.AddArg(v0)
   23350 		v0.AuxInt = i0
   23351 		v0.Aux = s
   23352 		v0.AddArg(p)
   23353 		v0.AddArg(idx)
   23354 		v0.AddArg(mem)
   23355 		return true
   23356 	}
   23357 	// match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem))
   23358 	// 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)
   23359 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23360 	for {
   23361 		_ = v.Args[1]
   23362 		sh := v.Args[0]
   23363 		if sh.Op != OpS390XSLDconst {
   23364 			break
   23365 		}
   23366 		if sh.AuxInt != 8 {
   23367 			break
   23368 		}
   23369 		x0 := sh.Args[0]
   23370 		if x0.Op != OpS390XMOVBZloadidx {
   23371 			break
   23372 		}
   23373 		i0 := x0.AuxInt
   23374 		s := x0.Aux
   23375 		_ = x0.Args[2]
   23376 		idx := x0.Args[0]
   23377 		p := x0.Args[1]
   23378 		mem := x0.Args[2]
   23379 		x1 := v.Args[1]
   23380 		if x1.Op != OpS390XMOVBZloadidx {
   23381 			break
   23382 		}
   23383 		i1 := x1.AuxInt
   23384 		if x1.Aux != s {
   23385 			break
   23386 		}
   23387 		_ = x1.Args[2]
   23388 		if p != x1.Args[0] {
   23389 			break
   23390 		}
   23391 		if idx != x1.Args[1] {
   23392 			break
   23393 		}
   23394 		if mem != x1.Args[2] {
   23395 			break
   23396 		}
   23397 		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)) {
   23398 			break
   23399 		}
   23400 		b = mergePoint(b, x0, x1)
   23401 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23402 		v.reset(OpCopy)
   23403 		v.AddArg(v0)
   23404 		v0.AuxInt = i0
   23405 		v0.Aux = s
   23406 		v0.AddArg(p)
   23407 		v0.AddArg(idx)
   23408 		v0.AddArg(mem)
   23409 		return true
   23410 	}
   23411 	// match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem))
   23412 	// 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)
   23413 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23414 	for {
   23415 		_ = v.Args[1]
   23416 		sh := v.Args[0]
   23417 		if sh.Op != OpS390XSLDconst {
   23418 			break
   23419 		}
   23420 		if sh.AuxInt != 8 {
   23421 			break
   23422 		}
   23423 		x0 := sh.Args[0]
   23424 		if x0.Op != OpS390XMOVBZloadidx {
   23425 			break
   23426 		}
   23427 		i0 := x0.AuxInt
   23428 		s := x0.Aux
   23429 		_ = x0.Args[2]
   23430 		p := x0.Args[0]
   23431 		idx := x0.Args[1]
   23432 		mem := x0.Args[2]
   23433 		x1 := v.Args[1]
   23434 		if x1.Op != OpS390XMOVBZloadidx {
   23435 			break
   23436 		}
   23437 		i1 := x1.AuxInt
   23438 		if x1.Aux != s {
   23439 			break
   23440 		}
   23441 		_ = x1.Args[2]
   23442 		if idx != x1.Args[0] {
   23443 			break
   23444 		}
   23445 		if p != x1.Args[1] {
   23446 			break
   23447 		}
   23448 		if mem != x1.Args[2] {
   23449 			break
   23450 		}
   23451 		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)) {
   23452 			break
   23453 		}
   23454 		b = mergePoint(b, x0, x1)
   23455 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23456 		v.reset(OpCopy)
   23457 		v.AddArg(v0)
   23458 		v0.AuxInt = i0
   23459 		v0.Aux = s
   23460 		v0.AddArg(p)
   23461 		v0.AddArg(idx)
   23462 		v0.AddArg(mem)
   23463 		return true
   23464 	}
   23465 	// match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem))
   23466 	// 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)
   23467 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   23468 	for {
   23469 		_ = v.Args[1]
   23470 		sh := v.Args[0]
   23471 		if sh.Op != OpS390XSLDconst {
   23472 			break
   23473 		}
   23474 		if sh.AuxInt != 8 {
   23475 			break
   23476 		}
   23477 		x0 := sh.Args[0]
   23478 		if x0.Op != OpS390XMOVBZloadidx {
   23479 			break
   23480 		}
   23481 		i0 := x0.AuxInt
   23482 		s := x0.Aux
   23483 		_ = x0.Args[2]
   23484 		idx := x0.Args[0]
   23485 		p := x0.Args[1]
   23486 		mem := x0.Args[2]
   23487 		x1 := v.Args[1]
   23488 		if x1.Op != OpS390XMOVBZloadidx {
   23489 			break
   23490 		}
   23491 		i1 := x1.AuxInt
   23492 		if x1.Aux != s {
   23493 			break
   23494 		}
   23495 		_ = x1.Args[2]
   23496 		if idx != x1.Args[0] {
   23497 			break
   23498 		}
   23499 		if p != x1.Args[1] {
   23500 			break
   23501 		}
   23502 		if mem != x1.Args[2] {
   23503 			break
   23504 		}
   23505 		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)) {
   23506 			break
   23507 		}
   23508 		b = mergePoint(b, x0, x1)
   23509 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   23510 		v.reset(OpCopy)
   23511 		v.AddArg(v0)
   23512 		v0.AuxInt = i0
   23513 		v0.Aux = s
   23514 		v0.AddArg(p)
   23515 		v0.AddArg(idx)
   23516 		v0.AddArg(mem)
   23517 		return true
   23518 	}
   23519 	// match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)))
   23520 	// 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)
   23521 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23522 	for {
   23523 		_ = v.Args[1]
   23524 		x1 := v.Args[0]
   23525 		if x1.Op != OpS390XMOVHZloadidx {
   23526 			break
   23527 		}
   23528 		i1 := x1.AuxInt
   23529 		s := x1.Aux
   23530 		_ = x1.Args[2]
   23531 		p := x1.Args[0]
   23532 		idx := x1.Args[1]
   23533 		mem := x1.Args[2]
   23534 		sh := v.Args[1]
   23535 		if sh.Op != OpS390XSLDconst {
   23536 			break
   23537 		}
   23538 		if sh.AuxInt != 16 {
   23539 			break
   23540 		}
   23541 		x0 := sh.Args[0]
   23542 		if x0.Op != OpS390XMOVHZloadidx {
   23543 			break
   23544 		}
   23545 		i0 := x0.AuxInt
   23546 		if x0.Aux != s {
   23547 			break
   23548 		}
   23549 		_ = x0.Args[2]
   23550 		if p != x0.Args[0] {
   23551 			break
   23552 		}
   23553 		if idx != x0.Args[1] {
   23554 			break
   23555 		}
   23556 		if mem != x0.Args[2] {
   23557 			break
   23558 		}
   23559 		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)) {
   23560 			break
   23561 		}
   23562 		b = mergePoint(b, x0, x1)
   23563 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23564 		v.reset(OpCopy)
   23565 		v.AddArg(v0)
   23566 		v0.AuxInt = i0
   23567 		v0.Aux = s
   23568 		v0.AddArg(p)
   23569 		v0.AddArg(idx)
   23570 		v0.AddArg(mem)
   23571 		return true
   23572 	}
   23573 	return false
   23574 }
   23575 func rewriteValueS390X_OpS390XOR_40(v *Value) bool {
   23576 	b := v.Block
   23577 	_ = b
   23578 	typ := &b.Func.Config.Types
   23579 	_ = typ
   23580 	// match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)))
   23581 	// 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)
   23582 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23583 	for {
   23584 		_ = v.Args[1]
   23585 		x1 := v.Args[0]
   23586 		if x1.Op != OpS390XMOVHZloadidx {
   23587 			break
   23588 		}
   23589 		i1 := x1.AuxInt
   23590 		s := x1.Aux
   23591 		_ = x1.Args[2]
   23592 		idx := x1.Args[0]
   23593 		p := x1.Args[1]
   23594 		mem := x1.Args[2]
   23595 		sh := v.Args[1]
   23596 		if sh.Op != OpS390XSLDconst {
   23597 			break
   23598 		}
   23599 		if sh.AuxInt != 16 {
   23600 			break
   23601 		}
   23602 		x0 := sh.Args[0]
   23603 		if x0.Op != OpS390XMOVHZloadidx {
   23604 			break
   23605 		}
   23606 		i0 := x0.AuxInt
   23607 		if x0.Aux != s {
   23608 			break
   23609 		}
   23610 		_ = x0.Args[2]
   23611 		if p != x0.Args[0] {
   23612 			break
   23613 		}
   23614 		if idx != x0.Args[1] {
   23615 			break
   23616 		}
   23617 		if mem != x0.Args[2] {
   23618 			break
   23619 		}
   23620 		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)) {
   23621 			break
   23622 		}
   23623 		b = mergePoint(b, x0, x1)
   23624 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23625 		v.reset(OpCopy)
   23626 		v.AddArg(v0)
   23627 		v0.AuxInt = i0
   23628 		v0.Aux = s
   23629 		v0.AddArg(p)
   23630 		v0.AddArg(idx)
   23631 		v0.AddArg(mem)
   23632 		return true
   23633 	}
   23634 	// match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)))
   23635 	// 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)
   23636 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23637 	for {
   23638 		_ = v.Args[1]
   23639 		x1 := v.Args[0]
   23640 		if x1.Op != OpS390XMOVHZloadidx {
   23641 			break
   23642 		}
   23643 		i1 := x1.AuxInt
   23644 		s := x1.Aux
   23645 		_ = x1.Args[2]
   23646 		p := x1.Args[0]
   23647 		idx := x1.Args[1]
   23648 		mem := x1.Args[2]
   23649 		sh := v.Args[1]
   23650 		if sh.Op != OpS390XSLDconst {
   23651 			break
   23652 		}
   23653 		if sh.AuxInt != 16 {
   23654 			break
   23655 		}
   23656 		x0 := sh.Args[0]
   23657 		if x0.Op != OpS390XMOVHZloadidx {
   23658 			break
   23659 		}
   23660 		i0 := x0.AuxInt
   23661 		if x0.Aux != s {
   23662 			break
   23663 		}
   23664 		_ = x0.Args[2]
   23665 		if idx != x0.Args[0] {
   23666 			break
   23667 		}
   23668 		if p != x0.Args[1] {
   23669 			break
   23670 		}
   23671 		if mem != x0.Args[2] {
   23672 			break
   23673 		}
   23674 		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)) {
   23675 			break
   23676 		}
   23677 		b = mergePoint(b, x0, x1)
   23678 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23679 		v.reset(OpCopy)
   23680 		v.AddArg(v0)
   23681 		v0.AuxInt = i0
   23682 		v0.Aux = s
   23683 		v0.AddArg(p)
   23684 		v0.AddArg(idx)
   23685 		v0.AddArg(mem)
   23686 		return true
   23687 	}
   23688 	// match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)))
   23689 	// 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)
   23690 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23691 	for {
   23692 		_ = v.Args[1]
   23693 		x1 := v.Args[0]
   23694 		if x1.Op != OpS390XMOVHZloadidx {
   23695 			break
   23696 		}
   23697 		i1 := x1.AuxInt
   23698 		s := x1.Aux
   23699 		_ = x1.Args[2]
   23700 		idx := x1.Args[0]
   23701 		p := x1.Args[1]
   23702 		mem := x1.Args[2]
   23703 		sh := v.Args[1]
   23704 		if sh.Op != OpS390XSLDconst {
   23705 			break
   23706 		}
   23707 		if sh.AuxInt != 16 {
   23708 			break
   23709 		}
   23710 		x0 := sh.Args[0]
   23711 		if x0.Op != OpS390XMOVHZloadidx {
   23712 			break
   23713 		}
   23714 		i0 := x0.AuxInt
   23715 		if x0.Aux != s {
   23716 			break
   23717 		}
   23718 		_ = x0.Args[2]
   23719 		if idx != x0.Args[0] {
   23720 			break
   23721 		}
   23722 		if p != x0.Args[1] {
   23723 			break
   23724 		}
   23725 		if mem != x0.Args[2] {
   23726 			break
   23727 		}
   23728 		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)) {
   23729 			break
   23730 		}
   23731 		b = mergePoint(b, x0, x1)
   23732 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23733 		v.reset(OpCopy)
   23734 		v.AddArg(v0)
   23735 		v0.AuxInt = i0
   23736 		v0.Aux = s
   23737 		v0.AddArg(p)
   23738 		v0.AddArg(idx)
   23739 		v0.AddArg(mem)
   23740 		return true
   23741 	}
   23742 	// match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem))
   23743 	// 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)
   23744 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23745 	for {
   23746 		_ = v.Args[1]
   23747 		sh := v.Args[0]
   23748 		if sh.Op != OpS390XSLDconst {
   23749 			break
   23750 		}
   23751 		if sh.AuxInt != 16 {
   23752 			break
   23753 		}
   23754 		x0 := sh.Args[0]
   23755 		if x0.Op != OpS390XMOVHZloadidx {
   23756 			break
   23757 		}
   23758 		i0 := x0.AuxInt
   23759 		s := x0.Aux
   23760 		_ = x0.Args[2]
   23761 		p := x0.Args[0]
   23762 		idx := x0.Args[1]
   23763 		mem := x0.Args[2]
   23764 		x1 := v.Args[1]
   23765 		if x1.Op != OpS390XMOVHZloadidx {
   23766 			break
   23767 		}
   23768 		i1 := x1.AuxInt
   23769 		if x1.Aux != s {
   23770 			break
   23771 		}
   23772 		_ = x1.Args[2]
   23773 		if p != x1.Args[0] {
   23774 			break
   23775 		}
   23776 		if idx != x1.Args[1] {
   23777 			break
   23778 		}
   23779 		if mem != x1.Args[2] {
   23780 			break
   23781 		}
   23782 		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)) {
   23783 			break
   23784 		}
   23785 		b = mergePoint(b, x0, x1)
   23786 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23787 		v.reset(OpCopy)
   23788 		v.AddArg(v0)
   23789 		v0.AuxInt = i0
   23790 		v0.Aux = s
   23791 		v0.AddArg(p)
   23792 		v0.AddArg(idx)
   23793 		v0.AddArg(mem)
   23794 		return true
   23795 	}
   23796 	// match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem))
   23797 	// 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)
   23798 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23799 	for {
   23800 		_ = v.Args[1]
   23801 		sh := v.Args[0]
   23802 		if sh.Op != OpS390XSLDconst {
   23803 			break
   23804 		}
   23805 		if sh.AuxInt != 16 {
   23806 			break
   23807 		}
   23808 		x0 := sh.Args[0]
   23809 		if x0.Op != OpS390XMOVHZloadidx {
   23810 			break
   23811 		}
   23812 		i0 := x0.AuxInt
   23813 		s := x0.Aux
   23814 		_ = x0.Args[2]
   23815 		idx := x0.Args[0]
   23816 		p := x0.Args[1]
   23817 		mem := x0.Args[2]
   23818 		x1 := v.Args[1]
   23819 		if x1.Op != OpS390XMOVHZloadidx {
   23820 			break
   23821 		}
   23822 		i1 := x1.AuxInt
   23823 		if x1.Aux != s {
   23824 			break
   23825 		}
   23826 		_ = x1.Args[2]
   23827 		if p != x1.Args[0] {
   23828 			break
   23829 		}
   23830 		if idx != x1.Args[1] {
   23831 			break
   23832 		}
   23833 		if mem != x1.Args[2] {
   23834 			break
   23835 		}
   23836 		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)) {
   23837 			break
   23838 		}
   23839 		b = mergePoint(b, x0, x1)
   23840 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23841 		v.reset(OpCopy)
   23842 		v.AddArg(v0)
   23843 		v0.AuxInt = i0
   23844 		v0.Aux = s
   23845 		v0.AddArg(p)
   23846 		v0.AddArg(idx)
   23847 		v0.AddArg(mem)
   23848 		return true
   23849 	}
   23850 	// match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem))
   23851 	// 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)
   23852 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23853 	for {
   23854 		_ = v.Args[1]
   23855 		sh := v.Args[0]
   23856 		if sh.Op != OpS390XSLDconst {
   23857 			break
   23858 		}
   23859 		if sh.AuxInt != 16 {
   23860 			break
   23861 		}
   23862 		x0 := sh.Args[0]
   23863 		if x0.Op != OpS390XMOVHZloadidx {
   23864 			break
   23865 		}
   23866 		i0 := x0.AuxInt
   23867 		s := x0.Aux
   23868 		_ = x0.Args[2]
   23869 		p := x0.Args[0]
   23870 		idx := x0.Args[1]
   23871 		mem := x0.Args[2]
   23872 		x1 := v.Args[1]
   23873 		if x1.Op != OpS390XMOVHZloadidx {
   23874 			break
   23875 		}
   23876 		i1 := x1.AuxInt
   23877 		if x1.Aux != s {
   23878 			break
   23879 		}
   23880 		_ = x1.Args[2]
   23881 		if idx != x1.Args[0] {
   23882 			break
   23883 		}
   23884 		if p != x1.Args[1] {
   23885 			break
   23886 		}
   23887 		if mem != x1.Args[2] {
   23888 			break
   23889 		}
   23890 		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)) {
   23891 			break
   23892 		}
   23893 		b = mergePoint(b, x0, x1)
   23894 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23895 		v.reset(OpCopy)
   23896 		v.AddArg(v0)
   23897 		v0.AuxInt = i0
   23898 		v0.Aux = s
   23899 		v0.AddArg(p)
   23900 		v0.AddArg(idx)
   23901 		v0.AddArg(mem)
   23902 		return true
   23903 	}
   23904 	// match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem))
   23905 	// 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)
   23906 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   23907 	for {
   23908 		_ = v.Args[1]
   23909 		sh := v.Args[0]
   23910 		if sh.Op != OpS390XSLDconst {
   23911 			break
   23912 		}
   23913 		if sh.AuxInt != 16 {
   23914 			break
   23915 		}
   23916 		x0 := sh.Args[0]
   23917 		if x0.Op != OpS390XMOVHZloadidx {
   23918 			break
   23919 		}
   23920 		i0 := x0.AuxInt
   23921 		s := x0.Aux
   23922 		_ = x0.Args[2]
   23923 		idx := x0.Args[0]
   23924 		p := x0.Args[1]
   23925 		mem := x0.Args[2]
   23926 		x1 := v.Args[1]
   23927 		if x1.Op != OpS390XMOVHZloadidx {
   23928 			break
   23929 		}
   23930 		i1 := x1.AuxInt
   23931 		if x1.Aux != s {
   23932 			break
   23933 		}
   23934 		_ = x1.Args[2]
   23935 		if idx != x1.Args[0] {
   23936 			break
   23937 		}
   23938 		if p != x1.Args[1] {
   23939 			break
   23940 		}
   23941 		if mem != x1.Args[2] {
   23942 			break
   23943 		}
   23944 		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)) {
   23945 			break
   23946 		}
   23947 		b = mergePoint(b, x0, x1)
   23948 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   23949 		v.reset(OpCopy)
   23950 		v.AddArg(v0)
   23951 		v0.AuxInt = i0
   23952 		v0.Aux = s
   23953 		v0.AddArg(p)
   23954 		v0.AddArg(idx)
   23955 		v0.AddArg(mem)
   23956 		return true
   23957 	}
   23958 	// match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)))
   23959 	// 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)
   23960 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   23961 	for {
   23962 		_ = v.Args[1]
   23963 		x1 := v.Args[0]
   23964 		if x1.Op != OpS390XMOVWZloadidx {
   23965 			break
   23966 		}
   23967 		i1 := x1.AuxInt
   23968 		s := x1.Aux
   23969 		_ = x1.Args[2]
   23970 		p := x1.Args[0]
   23971 		idx := x1.Args[1]
   23972 		mem := x1.Args[2]
   23973 		sh := v.Args[1]
   23974 		if sh.Op != OpS390XSLDconst {
   23975 			break
   23976 		}
   23977 		if sh.AuxInt != 32 {
   23978 			break
   23979 		}
   23980 		x0 := sh.Args[0]
   23981 		if x0.Op != OpS390XMOVWZloadidx {
   23982 			break
   23983 		}
   23984 		i0 := x0.AuxInt
   23985 		if x0.Aux != s {
   23986 			break
   23987 		}
   23988 		_ = x0.Args[2]
   23989 		if p != x0.Args[0] {
   23990 			break
   23991 		}
   23992 		if idx != x0.Args[1] {
   23993 			break
   23994 		}
   23995 		if mem != x0.Args[2] {
   23996 			break
   23997 		}
   23998 		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)) {
   23999 			break
   24000 		}
   24001 		b = mergePoint(b, x0, x1)
   24002 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24003 		v.reset(OpCopy)
   24004 		v.AddArg(v0)
   24005 		v0.AuxInt = i0
   24006 		v0.Aux = s
   24007 		v0.AddArg(p)
   24008 		v0.AddArg(idx)
   24009 		v0.AddArg(mem)
   24010 		return true
   24011 	}
   24012 	// match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)))
   24013 	// 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)
   24014 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24015 	for {
   24016 		_ = v.Args[1]
   24017 		x1 := v.Args[0]
   24018 		if x1.Op != OpS390XMOVWZloadidx {
   24019 			break
   24020 		}
   24021 		i1 := x1.AuxInt
   24022 		s := x1.Aux
   24023 		_ = x1.Args[2]
   24024 		idx := x1.Args[0]
   24025 		p := x1.Args[1]
   24026 		mem := x1.Args[2]
   24027 		sh := v.Args[1]
   24028 		if sh.Op != OpS390XSLDconst {
   24029 			break
   24030 		}
   24031 		if sh.AuxInt != 32 {
   24032 			break
   24033 		}
   24034 		x0 := sh.Args[0]
   24035 		if x0.Op != OpS390XMOVWZloadidx {
   24036 			break
   24037 		}
   24038 		i0 := x0.AuxInt
   24039 		if x0.Aux != s {
   24040 			break
   24041 		}
   24042 		_ = x0.Args[2]
   24043 		if p != x0.Args[0] {
   24044 			break
   24045 		}
   24046 		if idx != x0.Args[1] {
   24047 			break
   24048 		}
   24049 		if mem != x0.Args[2] {
   24050 			break
   24051 		}
   24052 		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)) {
   24053 			break
   24054 		}
   24055 		b = mergePoint(b, x0, x1)
   24056 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24057 		v.reset(OpCopy)
   24058 		v.AddArg(v0)
   24059 		v0.AuxInt = i0
   24060 		v0.Aux = s
   24061 		v0.AddArg(p)
   24062 		v0.AddArg(idx)
   24063 		v0.AddArg(mem)
   24064 		return true
   24065 	}
   24066 	// match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)))
   24067 	// 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)
   24068 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24069 	for {
   24070 		_ = v.Args[1]
   24071 		x1 := v.Args[0]
   24072 		if x1.Op != OpS390XMOVWZloadidx {
   24073 			break
   24074 		}
   24075 		i1 := x1.AuxInt
   24076 		s := x1.Aux
   24077 		_ = x1.Args[2]
   24078 		p := x1.Args[0]
   24079 		idx := x1.Args[1]
   24080 		mem := x1.Args[2]
   24081 		sh := v.Args[1]
   24082 		if sh.Op != OpS390XSLDconst {
   24083 			break
   24084 		}
   24085 		if sh.AuxInt != 32 {
   24086 			break
   24087 		}
   24088 		x0 := sh.Args[0]
   24089 		if x0.Op != OpS390XMOVWZloadidx {
   24090 			break
   24091 		}
   24092 		i0 := x0.AuxInt
   24093 		if x0.Aux != s {
   24094 			break
   24095 		}
   24096 		_ = x0.Args[2]
   24097 		if idx != x0.Args[0] {
   24098 			break
   24099 		}
   24100 		if p != x0.Args[1] {
   24101 			break
   24102 		}
   24103 		if mem != x0.Args[2] {
   24104 			break
   24105 		}
   24106 		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)) {
   24107 			break
   24108 		}
   24109 		b = mergePoint(b, x0, x1)
   24110 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24111 		v.reset(OpCopy)
   24112 		v.AddArg(v0)
   24113 		v0.AuxInt = i0
   24114 		v0.Aux = s
   24115 		v0.AddArg(p)
   24116 		v0.AddArg(idx)
   24117 		v0.AddArg(mem)
   24118 		return true
   24119 	}
   24120 	return false
   24121 }
   24122 func rewriteValueS390X_OpS390XOR_50(v *Value) bool {
   24123 	b := v.Block
   24124 	_ = b
   24125 	typ := &b.Func.Config.Types
   24126 	_ = typ
   24127 	// match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)))
   24128 	// 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)
   24129 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24130 	for {
   24131 		_ = v.Args[1]
   24132 		x1 := v.Args[0]
   24133 		if x1.Op != OpS390XMOVWZloadidx {
   24134 			break
   24135 		}
   24136 		i1 := x1.AuxInt
   24137 		s := x1.Aux
   24138 		_ = x1.Args[2]
   24139 		idx := x1.Args[0]
   24140 		p := x1.Args[1]
   24141 		mem := x1.Args[2]
   24142 		sh := v.Args[1]
   24143 		if sh.Op != OpS390XSLDconst {
   24144 			break
   24145 		}
   24146 		if sh.AuxInt != 32 {
   24147 			break
   24148 		}
   24149 		x0 := sh.Args[0]
   24150 		if x0.Op != OpS390XMOVWZloadidx {
   24151 			break
   24152 		}
   24153 		i0 := x0.AuxInt
   24154 		if x0.Aux != s {
   24155 			break
   24156 		}
   24157 		_ = x0.Args[2]
   24158 		if idx != x0.Args[0] {
   24159 			break
   24160 		}
   24161 		if p != x0.Args[1] {
   24162 			break
   24163 		}
   24164 		if mem != x0.Args[2] {
   24165 			break
   24166 		}
   24167 		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)) {
   24168 			break
   24169 		}
   24170 		b = mergePoint(b, x0, x1)
   24171 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24172 		v.reset(OpCopy)
   24173 		v.AddArg(v0)
   24174 		v0.AuxInt = i0
   24175 		v0.Aux = s
   24176 		v0.AddArg(p)
   24177 		v0.AddArg(idx)
   24178 		v0.AddArg(mem)
   24179 		return true
   24180 	}
   24181 	// match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem))
   24182 	// 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)
   24183 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24184 	for {
   24185 		_ = v.Args[1]
   24186 		sh := v.Args[0]
   24187 		if sh.Op != OpS390XSLDconst {
   24188 			break
   24189 		}
   24190 		if sh.AuxInt != 32 {
   24191 			break
   24192 		}
   24193 		x0 := sh.Args[0]
   24194 		if x0.Op != OpS390XMOVWZloadidx {
   24195 			break
   24196 		}
   24197 		i0 := x0.AuxInt
   24198 		s := x0.Aux
   24199 		_ = x0.Args[2]
   24200 		p := x0.Args[0]
   24201 		idx := x0.Args[1]
   24202 		mem := x0.Args[2]
   24203 		x1 := v.Args[1]
   24204 		if x1.Op != OpS390XMOVWZloadidx {
   24205 			break
   24206 		}
   24207 		i1 := x1.AuxInt
   24208 		if x1.Aux != s {
   24209 			break
   24210 		}
   24211 		_ = x1.Args[2]
   24212 		if p != x1.Args[0] {
   24213 			break
   24214 		}
   24215 		if idx != x1.Args[1] {
   24216 			break
   24217 		}
   24218 		if mem != x1.Args[2] {
   24219 			break
   24220 		}
   24221 		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)) {
   24222 			break
   24223 		}
   24224 		b = mergePoint(b, x0, x1)
   24225 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24226 		v.reset(OpCopy)
   24227 		v.AddArg(v0)
   24228 		v0.AuxInt = i0
   24229 		v0.Aux = s
   24230 		v0.AddArg(p)
   24231 		v0.AddArg(idx)
   24232 		v0.AddArg(mem)
   24233 		return true
   24234 	}
   24235 	// match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem))
   24236 	// 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)
   24237 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24238 	for {
   24239 		_ = v.Args[1]
   24240 		sh := v.Args[0]
   24241 		if sh.Op != OpS390XSLDconst {
   24242 			break
   24243 		}
   24244 		if sh.AuxInt != 32 {
   24245 			break
   24246 		}
   24247 		x0 := sh.Args[0]
   24248 		if x0.Op != OpS390XMOVWZloadidx {
   24249 			break
   24250 		}
   24251 		i0 := x0.AuxInt
   24252 		s := x0.Aux
   24253 		_ = x0.Args[2]
   24254 		idx := x0.Args[0]
   24255 		p := x0.Args[1]
   24256 		mem := x0.Args[2]
   24257 		x1 := v.Args[1]
   24258 		if x1.Op != OpS390XMOVWZloadidx {
   24259 			break
   24260 		}
   24261 		i1 := x1.AuxInt
   24262 		if x1.Aux != s {
   24263 			break
   24264 		}
   24265 		_ = x1.Args[2]
   24266 		if p != x1.Args[0] {
   24267 			break
   24268 		}
   24269 		if idx != x1.Args[1] {
   24270 			break
   24271 		}
   24272 		if mem != x1.Args[2] {
   24273 			break
   24274 		}
   24275 		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)) {
   24276 			break
   24277 		}
   24278 		b = mergePoint(b, x0, x1)
   24279 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24280 		v.reset(OpCopy)
   24281 		v.AddArg(v0)
   24282 		v0.AuxInt = i0
   24283 		v0.Aux = s
   24284 		v0.AddArg(p)
   24285 		v0.AddArg(idx)
   24286 		v0.AddArg(mem)
   24287 		return true
   24288 	}
   24289 	// match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem))
   24290 	// 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)
   24291 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24292 	for {
   24293 		_ = v.Args[1]
   24294 		sh := v.Args[0]
   24295 		if sh.Op != OpS390XSLDconst {
   24296 			break
   24297 		}
   24298 		if sh.AuxInt != 32 {
   24299 			break
   24300 		}
   24301 		x0 := sh.Args[0]
   24302 		if x0.Op != OpS390XMOVWZloadidx {
   24303 			break
   24304 		}
   24305 		i0 := x0.AuxInt
   24306 		s := x0.Aux
   24307 		_ = x0.Args[2]
   24308 		p := x0.Args[0]
   24309 		idx := x0.Args[1]
   24310 		mem := x0.Args[2]
   24311 		x1 := v.Args[1]
   24312 		if x1.Op != OpS390XMOVWZloadidx {
   24313 			break
   24314 		}
   24315 		i1 := x1.AuxInt
   24316 		if x1.Aux != s {
   24317 			break
   24318 		}
   24319 		_ = x1.Args[2]
   24320 		if idx != x1.Args[0] {
   24321 			break
   24322 		}
   24323 		if p != x1.Args[1] {
   24324 			break
   24325 		}
   24326 		if mem != x1.Args[2] {
   24327 			break
   24328 		}
   24329 		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)) {
   24330 			break
   24331 		}
   24332 		b = mergePoint(b, x0, x1)
   24333 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24334 		v.reset(OpCopy)
   24335 		v.AddArg(v0)
   24336 		v0.AuxInt = i0
   24337 		v0.Aux = s
   24338 		v0.AddArg(p)
   24339 		v0.AddArg(idx)
   24340 		v0.AddArg(mem)
   24341 		return true
   24342 	}
   24343 	// match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem))
   24344 	// 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)
   24345 	// result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem)
   24346 	for {
   24347 		_ = v.Args[1]
   24348 		sh := v.Args[0]
   24349 		if sh.Op != OpS390XSLDconst {
   24350 			break
   24351 		}
   24352 		if sh.AuxInt != 32 {
   24353 			break
   24354 		}
   24355 		x0 := sh.Args[0]
   24356 		if x0.Op != OpS390XMOVWZloadidx {
   24357 			break
   24358 		}
   24359 		i0 := x0.AuxInt
   24360 		s := x0.Aux
   24361 		_ = x0.Args[2]
   24362 		idx := x0.Args[0]
   24363 		p := x0.Args[1]
   24364 		mem := x0.Args[2]
   24365 		x1 := v.Args[1]
   24366 		if x1.Op != OpS390XMOVWZloadidx {
   24367 			break
   24368 		}
   24369 		i1 := x1.AuxInt
   24370 		if x1.Aux != s {
   24371 			break
   24372 		}
   24373 		_ = x1.Args[2]
   24374 		if idx != x1.Args[0] {
   24375 			break
   24376 		}
   24377 		if p != x1.Args[1] {
   24378 			break
   24379 		}
   24380 		if mem != x1.Args[2] {
   24381 			break
   24382 		}
   24383 		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)) {
   24384 			break
   24385 		}
   24386 		b = mergePoint(b, x0, x1)
   24387 		v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64)
   24388 		v.reset(OpCopy)
   24389 		v.AddArg(v0)
   24390 		v0.AuxInt = i0
   24391 		v0.Aux = s
   24392 		v0.AddArg(p)
   24393 		v0.AddArg(idx)
   24394 		v0.AddArg(mem)
   24395 		return true
   24396 	}
   24397 	// 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))
   24398 	// 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)
   24399 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24400 	for {
   24401 		_ = v.Args[1]
   24402 		s0 := v.Args[0]
   24403 		if s0.Op != OpS390XSLDconst {
   24404 			break
   24405 		}
   24406 		j0 := s0.AuxInt
   24407 		x0 := s0.Args[0]
   24408 		if x0.Op != OpS390XMOVBZloadidx {
   24409 			break
   24410 		}
   24411 		i0 := x0.AuxInt
   24412 		s := x0.Aux
   24413 		_ = x0.Args[2]
   24414 		p := x0.Args[0]
   24415 		idx := x0.Args[1]
   24416 		mem := x0.Args[2]
   24417 		or := v.Args[1]
   24418 		if or.Op != OpS390XOR {
   24419 			break
   24420 		}
   24421 		_ = or.Args[1]
   24422 		s1 := or.Args[0]
   24423 		if s1.Op != OpS390XSLDconst {
   24424 			break
   24425 		}
   24426 		j1 := s1.AuxInt
   24427 		x1 := s1.Args[0]
   24428 		if x1.Op != OpS390XMOVBZloadidx {
   24429 			break
   24430 		}
   24431 		i1 := x1.AuxInt
   24432 		if x1.Aux != s {
   24433 			break
   24434 		}
   24435 		_ = x1.Args[2]
   24436 		if p != x1.Args[0] {
   24437 			break
   24438 		}
   24439 		if idx != x1.Args[1] {
   24440 			break
   24441 		}
   24442 		if mem != x1.Args[2] {
   24443 			break
   24444 		}
   24445 		y := or.Args[1]
   24446 		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)) {
   24447 			break
   24448 		}
   24449 		b = mergePoint(b, x0, x1)
   24450 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24451 		v.reset(OpCopy)
   24452 		v.AddArg(v0)
   24453 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24454 		v1.AuxInt = j1
   24455 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24456 		v2.AuxInt = i0
   24457 		v2.Aux = s
   24458 		v2.AddArg(p)
   24459 		v2.AddArg(idx)
   24460 		v2.AddArg(mem)
   24461 		v1.AddArg(v2)
   24462 		v0.AddArg(v1)
   24463 		v0.AddArg(y)
   24464 		return true
   24465 	}
   24466 	// 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))
   24467 	// 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)
   24468 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24469 	for {
   24470 		_ = v.Args[1]
   24471 		s0 := v.Args[0]
   24472 		if s0.Op != OpS390XSLDconst {
   24473 			break
   24474 		}
   24475 		j0 := s0.AuxInt
   24476 		x0 := s0.Args[0]
   24477 		if x0.Op != OpS390XMOVBZloadidx {
   24478 			break
   24479 		}
   24480 		i0 := x0.AuxInt
   24481 		s := x0.Aux
   24482 		_ = x0.Args[2]
   24483 		idx := x0.Args[0]
   24484 		p := x0.Args[1]
   24485 		mem := x0.Args[2]
   24486 		or := v.Args[1]
   24487 		if or.Op != OpS390XOR {
   24488 			break
   24489 		}
   24490 		_ = or.Args[1]
   24491 		s1 := or.Args[0]
   24492 		if s1.Op != OpS390XSLDconst {
   24493 			break
   24494 		}
   24495 		j1 := s1.AuxInt
   24496 		x1 := s1.Args[0]
   24497 		if x1.Op != OpS390XMOVBZloadidx {
   24498 			break
   24499 		}
   24500 		i1 := x1.AuxInt
   24501 		if x1.Aux != s {
   24502 			break
   24503 		}
   24504 		_ = x1.Args[2]
   24505 		if p != x1.Args[0] {
   24506 			break
   24507 		}
   24508 		if idx != x1.Args[1] {
   24509 			break
   24510 		}
   24511 		if mem != x1.Args[2] {
   24512 			break
   24513 		}
   24514 		y := or.Args[1]
   24515 		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)) {
   24516 			break
   24517 		}
   24518 		b = mergePoint(b, x0, x1)
   24519 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24520 		v.reset(OpCopy)
   24521 		v.AddArg(v0)
   24522 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24523 		v1.AuxInt = j1
   24524 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24525 		v2.AuxInt = i0
   24526 		v2.Aux = s
   24527 		v2.AddArg(p)
   24528 		v2.AddArg(idx)
   24529 		v2.AddArg(mem)
   24530 		v1.AddArg(v2)
   24531 		v0.AddArg(v1)
   24532 		v0.AddArg(y)
   24533 		return true
   24534 	}
   24535 	// 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))
   24536 	// 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)
   24537 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24538 	for {
   24539 		_ = v.Args[1]
   24540 		s0 := v.Args[0]
   24541 		if s0.Op != OpS390XSLDconst {
   24542 			break
   24543 		}
   24544 		j0 := s0.AuxInt
   24545 		x0 := s0.Args[0]
   24546 		if x0.Op != OpS390XMOVBZloadidx {
   24547 			break
   24548 		}
   24549 		i0 := x0.AuxInt
   24550 		s := x0.Aux
   24551 		_ = x0.Args[2]
   24552 		p := x0.Args[0]
   24553 		idx := x0.Args[1]
   24554 		mem := x0.Args[2]
   24555 		or := v.Args[1]
   24556 		if or.Op != OpS390XOR {
   24557 			break
   24558 		}
   24559 		_ = or.Args[1]
   24560 		s1 := or.Args[0]
   24561 		if s1.Op != OpS390XSLDconst {
   24562 			break
   24563 		}
   24564 		j1 := s1.AuxInt
   24565 		x1 := s1.Args[0]
   24566 		if x1.Op != OpS390XMOVBZloadidx {
   24567 			break
   24568 		}
   24569 		i1 := x1.AuxInt
   24570 		if x1.Aux != s {
   24571 			break
   24572 		}
   24573 		_ = x1.Args[2]
   24574 		if idx != x1.Args[0] {
   24575 			break
   24576 		}
   24577 		if p != x1.Args[1] {
   24578 			break
   24579 		}
   24580 		if mem != x1.Args[2] {
   24581 			break
   24582 		}
   24583 		y := or.Args[1]
   24584 		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)) {
   24585 			break
   24586 		}
   24587 		b = mergePoint(b, x0, x1)
   24588 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24589 		v.reset(OpCopy)
   24590 		v.AddArg(v0)
   24591 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24592 		v1.AuxInt = j1
   24593 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24594 		v2.AuxInt = i0
   24595 		v2.Aux = s
   24596 		v2.AddArg(p)
   24597 		v2.AddArg(idx)
   24598 		v2.AddArg(mem)
   24599 		v1.AddArg(v2)
   24600 		v0.AddArg(v1)
   24601 		v0.AddArg(y)
   24602 		return true
   24603 	}
   24604 	// 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))
   24605 	// 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)
   24606 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24607 	for {
   24608 		_ = v.Args[1]
   24609 		s0 := v.Args[0]
   24610 		if s0.Op != OpS390XSLDconst {
   24611 			break
   24612 		}
   24613 		j0 := s0.AuxInt
   24614 		x0 := s0.Args[0]
   24615 		if x0.Op != OpS390XMOVBZloadidx {
   24616 			break
   24617 		}
   24618 		i0 := x0.AuxInt
   24619 		s := x0.Aux
   24620 		_ = x0.Args[2]
   24621 		idx := x0.Args[0]
   24622 		p := x0.Args[1]
   24623 		mem := x0.Args[2]
   24624 		or := v.Args[1]
   24625 		if or.Op != OpS390XOR {
   24626 			break
   24627 		}
   24628 		_ = or.Args[1]
   24629 		s1 := or.Args[0]
   24630 		if s1.Op != OpS390XSLDconst {
   24631 			break
   24632 		}
   24633 		j1 := s1.AuxInt
   24634 		x1 := s1.Args[0]
   24635 		if x1.Op != OpS390XMOVBZloadidx {
   24636 			break
   24637 		}
   24638 		i1 := x1.AuxInt
   24639 		if x1.Aux != s {
   24640 			break
   24641 		}
   24642 		_ = x1.Args[2]
   24643 		if idx != x1.Args[0] {
   24644 			break
   24645 		}
   24646 		if p != x1.Args[1] {
   24647 			break
   24648 		}
   24649 		if mem != x1.Args[2] {
   24650 			break
   24651 		}
   24652 		y := or.Args[1]
   24653 		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)) {
   24654 			break
   24655 		}
   24656 		b = mergePoint(b, x0, x1)
   24657 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24658 		v.reset(OpCopy)
   24659 		v.AddArg(v0)
   24660 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24661 		v1.AuxInt = j1
   24662 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24663 		v2.AuxInt = i0
   24664 		v2.Aux = s
   24665 		v2.AddArg(p)
   24666 		v2.AddArg(idx)
   24667 		v2.AddArg(mem)
   24668 		v1.AddArg(v2)
   24669 		v0.AddArg(v1)
   24670 		v0.AddArg(y)
   24671 		return true
   24672 	}
   24673 	// 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))))
   24674 	// 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)
   24675 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24676 	for {
   24677 		_ = v.Args[1]
   24678 		s0 := v.Args[0]
   24679 		if s0.Op != OpS390XSLDconst {
   24680 			break
   24681 		}
   24682 		j0 := s0.AuxInt
   24683 		x0 := s0.Args[0]
   24684 		if x0.Op != OpS390XMOVBZloadidx {
   24685 			break
   24686 		}
   24687 		i0 := x0.AuxInt
   24688 		s := x0.Aux
   24689 		_ = x0.Args[2]
   24690 		p := x0.Args[0]
   24691 		idx := x0.Args[1]
   24692 		mem := x0.Args[2]
   24693 		or := v.Args[1]
   24694 		if or.Op != OpS390XOR {
   24695 			break
   24696 		}
   24697 		_ = or.Args[1]
   24698 		y := or.Args[0]
   24699 		s1 := or.Args[1]
   24700 		if s1.Op != OpS390XSLDconst {
   24701 			break
   24702 		}
   24703 		j1 := s1.AuxInt
   24704 		x1 := s1.Args[0]
   24705 		if x1.Op != OpS390XMOVBZloadidx {
   24706 			break
   24707 		}
   24708 		i1 := x1.AuxInt
   24709 		if x1.Aux != s {
   24710 			break
   24711 		}
   24712 		_ = x1.Args[2]
   24713 		if p != x1.Args[0] {
   24714 			break
   24715 		}
   24716 		if idx != x1.Args[1] {
   24717 			break
   24718 		}
   24719 		if mem != x1.Args[2] {
   24720 			break
   24721 		}
   24722 		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)) {
   24723 			break
   24724 		}
   24725 		b = mergePoint(b, x0, x1)
   24726 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24727 		v.reset(OpCopy)
   24728 		v.AddArg(v0)
   24729 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24730 		v1.AuxInt = j1
   24731 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24732 		v2.AuxInt = i0
   24733 		v2.Aux = s
   24734 		v2.AddArg(p)
   24735 		v2.AddArg(idx)
   24736 		v2.AddArg(mem)
   24737 		v1.AddArg(v2)
   24738 		v0.AddArg(v1)
   24739 		v0.AddArg(y)
   24740 		return true
   24741 	}
   24742 	return false
   24743 }
   24744 func rewriteValueS390X_OpS390XOR_60(v *Value) bool {
   24745 	b := v.Block
   24746 	_ = b
   24747 	typ := &b.Func.Config.Types
   24748 	_ = typ
   24749 	// 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))))
   24750 	// 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)
   24751 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24752 	for {
   24753 		_ = v.Args[1]
   24754 		s0 := v.Args[0]
   24755 		if s0.Op != OpS390XSLDconst {
   24756 			break
   24757 		}
   24758 		j0 := s0.AuxInt
   24759 		x0 := s0.Args[0]
   24760 		if x0.Op != OpS390XMOVBZloadidx {
   24761 			break
   24762 		}
   24763 		i0 := x0.AuxInt
   24764 		s := x0.Aux
   24765 		_ = x0.Args[2]
   24766 		idx := x0.Args[0]
   24767 		p := x0.Args[1]
   24768 		mem := x0.Args[2]
   24769 		or := v.Args[1]
   24770 		if or.Op != OpS390XOR {
   24771 			break
   24772 		}
   24773 		_ = or.Args[1]
   24774 		y := or.Args[0]
   24775 		s1 := or.Args[1]
   24776 		if s1.Op != OpS390XSLDconst {
   24777 			break
   24778 		}
   24779 		j1 := s1.AuxInt
   24780 		x1 := s1.Args[0]
   24781 		if x1.Op != OpS390XMOVBZloadidx {
   24782 			break
   24783 		}
   24784 		i1 := x1.AuxInt
   24785 		if x1.Aux != s {
   24786 			break
   24787 		}
   24788 		_ = x1.Args[2]
   24789 		if p != x1.Args[0] {
   24790 			break
   24791 		}
   24792 		if idx != x1.Args[1] {
   24793 			break
   24794 		}
   24795 		if mem != x1.Args[2] {
   24796 			break
   24797 		}
   24798 		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)) {
   24799 			break
   24800 		}
   24801 		b = mergePoint(b, x0, x1)
   24802 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24803 		v.reset(OpCopy)
   24804 		v.AddArg(v0)
   24805 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24806 		v1.AuxInt = j1
   24807 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24808 		v2.AuxInt = i0
   24809 		v2.Aux = s
   24810 		v2.AddArg(p)
   24811 		v2.AddArg(idx)
   24812 		v2.AddArg(mem)
   24813 		v1.AddArg(v2)
   24814 		v0.AddArg(v1)
   24815 		v0.AddArg(y)
   24816 		return true
   24817 	}
   24818 	// 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))))
   24819 	// 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)
   24820 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24821 	for {
   24822 		_ = v.Args[1]
   24823 		s0 := v.Args[0]
   24824 		if s0.Op != OpS390XSLDconst {
   24825 			break
   24826 		}
   24827 		j0 := s0.AuxInt
   24828 		x0 := s0.Args[0]
   24829 		if x0.Op != OpS390XMOVBZloadidx {
   24830 			break
   24831 		}
   24832 		i0 := x0.AuxInt
   24833 		s := x0.Aux
   24834 		_ = x0.Args[2]
   24835 		p := x0.Args[0]
   24836 		idx := x0.Args[1]
   24837 		mem := x0.Args[2]
   24838 		or := v.Args[1]
   24839 		if or.Op != OpS390XOR {
   24840 			break
   24841 		}
   24842 		_ = or.Args[1]
   24843 		y := or.Args[0]
   24844 		s1 := or.Args[1]
   24845 		if s1.Op != OpS390XSLDconst {
   24846 			break
   24847 		}
   24848 		j1 := s1.AuxInt
   24849 		x1 := s1.Args[0]
   24850 		if x1.Op != OpS390XMOVBZloadidx {
   24851 			break
   24852 		}
   24853 		i1 := x1.AuxInt
   24854 		if x1.Aux != s {
   24855 			break
   24856 		}
   24857 		_ = x1.Args[2]
   24858 		if idx != x1.Args[0] {
   24859 			break
   24860 		}
   24861 		if p != x1.Args[1] {
   24862 			break
   24863 		}
   24864 		if mem != x1.Args[2] {
   24865 			break
   24866 		}
   24867 		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)) {
   24868 			break
   24869 		}
   24870 		b = mergePoint(b, x0, x1)
   24871 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24872 		v.reset(OpCopy)
   24873 		v.AddArg(v0)
   24874 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24875 		v1.AuxInt = j1
   24876 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24877 		v2.AuxInt = i0
   24878 		v2.Aux = s
   24879 		v2.AddArg(p)
   24880 		v2.AddArg(idx)
   24881 		v2.AddArg(mem)
   24882 		v1.AddArg(v2)
   24883 		v0.AddArg(v1)
   24884 		v0.AddArg(y)
   24885 		return true
   24886 	}
   24887 	// 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))))
   24888 	// 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)
   24889 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24890 	for {
   24891 		_ = v.Args[1]
   24892 		s0 := v.Args[0]
   24893 		if s0.Op != OpS390XSLDconst {
   24894 			break
   24895 		}
   24896 		j0 := s0.AuxInt
   24897 		x0 := s0.Args[0]
   24898 		if x0.Op != OpS390XMOVBZloadidx {
   24899 			break
   24900 		}
   24901 		i0 := x0.AuxInt
   24902 		s := x0.Aux
   24903 		_ = x0.Args[2]
   24904 		idx := x0.Args[0]
   24905 		p := x0.Args[1]
   24906 		mem := x0.Args[2]
   24907 		or := v.Args[1]
   24908 		if or.Op != OpS390XOR {
   24909 			break
   24910 		}
   24911 		_ = or.Args[1]
   24912 		y := or.Args[0]
   24913 		s1 := or.Args[1]
   24914 		if s1.Op != OpS390XSLDconst {
   24915 			break
   24916 		}
   24917 		j1 := s1.AuxInt
   24918 		x1 := s1.Args[0]
   24919 		if x1.Op != OpS390XMOVBZloadidx {
   24920 			break
   24921 		}
   24922 		i1 := x1.AuxInt
   24923 		if x1.Aux != s {
   24924 			break
   24925 		}
   24926 		_ = x1.Args[2]
   24927 		if idx != x1.Args[0] {
   24928 			break
   24929 		}
   24930 		if p != x1.Args[1] {
   24931 			break
   24932 		}
   24933 		if mem != x1.Args[2] {
   24934 			break
   24935 		}
   24936 		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)) {
   24937 			break
   24938 		}
   24939 		b = mergePoint(b, x0, x1)
   24940 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   24941 		v.reset(OpCopy)
   24942 		v.AddArg(v0)
   24943 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   24944 		v1.AuxInt = j1
   24945 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   24946 		v2.AuxInt = i0
   24947 		v2.Aux = s
   24948 		v2.AddArg(p)
   24949 		v2.AddArg(idx)
   24950 		v2.AddArg(mem)
   24951 		v1.AddArg(v2)
   24952 		v0.AddArg(v1)
   24953 		v0.AddArg(y)
   24954 		return true
   24955 	}
   24956 	// 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)))
   24957 	// 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)
   24958 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   24959 	for {
   24960 		_ = v.Args[1]
   24961 		or := v.Args[0]
   24962 		if or.Op != OpS390XOR {
   24963 			break
   24964 		}
   24965 		_ = or.Args[1]
   24966 		s1 := or.Args[0]
   24967 		if s1.Op != OpS390XSLDconst {
   24968 			break
   24969 		}
   24970 		j1 := s1.AuxInt
   24971 		x1 := s1.Args[0]
   24972 		if x1.Op != OpS390XMOVBZloadidx {
   24973 			break
   24974 		}
   24975 		i1 := x1.AuxInt
   24976 		s := x1.Aux
   24977 		_ = x1.Args[2]
   24978 		p := x1.Args[0]
   24979 		idx := x1.Args[1]
   24980 		mem := x1.Args[2]
   24981 		y := or.Args[1]
   24982 		s0 := v.Args[1]
   24983 		if s0.Op != OpS390XSLDconst {
   24984 			break
   24985 		}
   24986 		j0 := s0.AuxInt
   24987 		x0 := s0.Args[0]
   24988 		if x0.Op != OpS390XMOVBZloadidx {
   24989 			break
   24990 		}
   24991 		i0 := x0.AuxInt
   24992 		if x0.Aux != s {
   24993 			break
   24994 		}
   24995 		_ = x0.Args[2]
   24996 		if p != x0.Args[0] {
   24997 			break
   24998 		}
   24999 		if idx != x0.Args[1] {
   25000 			break
   25001 		}
   25002 		if mem != x0.Args[2] {
   25003 			break
   25004 		}
   25005 		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)) {
   25006 			break
   25007 		}
   25008 		b = mergePoint(b, x0, x1)
   25009 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25010 		v.reset(OpCopy)
   25011 		v.AddArg(v0)
   25012 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25013 		v1.AuxInt = j1
   25014 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25015 		v2.AuxInt = i0
   25016 		v2.Aux = s
   25017 		v2.AddArg(p)
   25018 		v2.AddArg(idx)
   25019 		v2.AddArg(mem)
   25020 		v1.AddArg(v2)
   25021 		v0.AddArg(v1)
   25022 		v0.AddArg(y)
   25023 		return true
   25024 	}
   25025 	// 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)))
   25026 	// 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)
   25027 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25028 	for {
   25029 		_ = v.Args[1]
   25030 		or := v.Args[0]
   25031 		if or.Op != OpS390XOR {
   25032 			break
   25033 		}
   25034 		_ = or.Args[1]
   25035 		s1 := or.Args[0]
   25036 		if s1.Op != OpS390XSLDconst {
   25037 			break
   25038 		}
   25039 		j1 := s1.AuxInt
   25040 		x1 := s1.Args[0]
   25041 		if x1.Op != OpS390XMOVBZloadidx {
   25042 			break
   25043 		}
   25044 		i1 := x1.AuxInt
   25045 		s := x1.Aux
   25046 		_ = x1.Args[2]
   25047 		idx := x1.Args[0]
   25048 		p := x1.Args[1]
   25049 		mem := x1.Args[2]
   25050 		y := or.Args[1]
   25051 		s0 := v.Args[1]
   25052 		if s0.Op != OpS390XSLDconst {
   25053 			break
   25054 		}
   25055 		j0 := s0.AuxInt
   25056 		x0 := s0.Args[0]
   25057 		if x0.Op != OpS390XMOVBZloadidx {
   25058 			break
   25059 		}
   25060 		i0 := x0.AuxInt
   25061 		if x0.Aux != s {
   25062 			break
   25063 		}
   25064 		_ = x0.Args[2]
   25065 		if p != x0.Args[0] {
   25066 			break
   25067 		}
   25068 		if idx != x0.Args[1] {
   25069 			break
   25070 		}
   25071 		if mem != x0.Args[2] {
   25072 			break
   25073 		}
   25074 		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)) {
   25075 			break
   25076 		}
   25077 		b = mergePoint(b, x0, x1)
   25078 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25079 		v.reset(OpCopy)
   25080 		v.AddArg(v0)
   25081 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25082 		v1.AuxInt = j1
   25083 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25084 		v2.AuxInt = i0
   25085 		v2.Aux = s
   25086 		v2.AddArg(p)
   25087 		v2.AddArg(idx)
   25088 		v2.AddArg(mem)
   25089 		v1.AddArg(v2)
   25090 		v0.AddArg(v1)
   25091 		v0.AddArg(y)
   25092 		return true
   25093 	}
   25094 	// 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)))
   25095 	// 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)
   25096 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25097 	for {
   25098 		_ = v.Args[1]
   25099 		or := v.Args[0]
   25100 		if or.Op != OpS390XOR {
   25101 			break
   25102 		}
   25103 		_ = or.Args[1]
   25104 		y := or.Args[0]
   25105 		s1 := or.Args[1]
   25106 		if s1.Op != OpS390XSLDconst {
   25107 			break
   25108 		}
   25109 		j1 := s1.AuxInt
   25110 		x1 := s1.Args[0]
   25111 		if x1.Op != OpS390XMOVBZloadidx {
   25112 			break
   25113 		}
   25114 		i1 := x1.AuxInt
   25115 		s := x1.Aux
   25116 		_ = x1.Args[2]
   25117 		p := x1.Args[0]
   25118 		idx := x1.Args[1]
   25119 		mem := x1.Args[2]
   25120 		s0 := v.Args[1]
   25121 		if s0.Op != OpS390XSLDconst {
   25122 			break
   25123 		}
   25124 		j0 := s0.AuxInt
   25125 		x0 := s0.Args[0]
   25126 		if x0.Op != OpS390XMOVBZloadidx {
   25127 			break
   25128 		}
   25129 		i0 := x0.AuxInt
   25130 		if x0.Aux != s {
   25131 			break
   25132 		}
   25133 		_ = x0.Args[2]
   25134 		if p != x0.Args[0] {
   25135 			break
   25136 		}
   25137 		if idx != x0.Args[1] {
   25138 			break
   25139 		}
   25140 		if mem != x0.Args[2] {
   25141 			break
   25142 		}
   25143 		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)) {
   25144 			break
   25145 		}
   25146 		b = mergePoint(b, x0, x1)
   25147 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25148 		v.reset(OpCopy)
   25149 		v.AddArg(v0)
   25150 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25151 		v1.AuxInt = j1
   25152 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25153 		v2.AuxInt = i0
   25154 		v2.Aux = s
   25155 		v2.AddArg(p)
   25156 		v2.AddArg(idx)
   25157 		v2.AddArg(mem)
   25158 		v1.AddArg(v2)
   25159 		v0.AddArg(v1)
   25160 		v0.AddArg(y)
   25161 		return true
   25162 	}
   25163 	// 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)))
   25164 	// 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)
   25165 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25166 	for {
   25167 		_ = v.Args[1]
   25168 		or := v.Args[0]
   25169 		if or.Op != OpS390XOR {
   25170 			break
   25171 		}
   25172 		_ = or.Args[1]
   25173 		y := or.Args[0]
   25174 		s1 := or.Args[1]
   25175 		if s1.Op != OpS390XSLDconst {
   25176 			break
   25177 		}
   25178 		j1 := s1.AuxInt
   25179 		x1 := s1.Args[0]
   25180 		if x1.Op != OpS390XMOVBZloadidx {
   25181 			break
   25182 		}
   25183 		i1 := x1.AuxInt
   25184 		s := x1.Aux
   25185 		_ = x1.Args[2]
   25186 		idx := x1.Args[0]
   25187 		p := x1.Args[1]
   25188 		mem := x1.Args[2]
   25189 		s0 := v.Args[1]
   25190 		if s0.Op != OpS390XSLDconst {
   25191 			break
   25192 		}
   25193 		j0 := s0.AuxInt
   25194 		x0 := s0.Args[0]
   25195 		if x0.Op != OpS390XMOVBZloadidx {
   25196 			break
   25197 		}
   25198 		i0 := x0.AuxInt
   25199 		if x0.Aux != s {
   25200 			break
   25201 		}
   25202 		_ = x0.Args[2]
   25203 		if p != x0.Args[0] {
   25204 			break
   25205 		}
   25206 		if idx != x0.Args[1] {
   25207 			break
   25208 		}
   25209 		if mem != x0.Args[2] {
   25210 			break
   25211 		}
   25212 		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)) {
   25213 			break
   25214 		}
   25215 		b = mergePoint(b, x0, x1)
   25216 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25217 		v.reset(OpCopy)
   25218 		v.AddArg(v0)
   25219 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25220 		v1.AuxInt = j1
   25221 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25222 		v2.AuxInt = i0
   25223 		v2.Aux = s
   25224 		v2.AddArg(p)
   25225 		v2.AddArg(idx)
   25226 		v2.AddArg(mem)
   25227 		v1.AddArg(v2)
   25228 		v0.AddArg(v1)
   25229 		v0.AddArg(y)
   25230 		return true
   25231 	}
   25232 	// 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)))
   25233 	// 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)
   25234 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25235 	for {
   25236 		_ = v.Args[1]
   25237 		or := v.Args[0]
   25238 		if or.Op != OpS390XOR {
   25239 			break
   25240 		}
   25241 		_ = or.Args[1]
   25242 		s1 := or.Args[0]
   25243 		if s1.Op != OpS390XSLDconst {
   25244 			break
   25245 		}
   25246 		j1 := s1.AuxInt
   25247 		x1 := s1.Args[0]
   25248 		if x1.Op != OpS390XMOVBZloadidx {
   25249 			break
   25250 		}
   25251 		i1 := x1.AuxInt
   25252 		s := x1.Aux
   25253 		_ = x1.Args[2]
   25254 		p := x1.Args[0]
   25255 		idx := x1.Args[1]
   25256 		mem := x1.Args[2]
   25257 		y := or.Args[1]
   25258 		s0 := v.Args[1]
   25259 		if s0.Op != OpS390XSLDconst {
   25260 			break
   25261 		}
   25262 		j0 := s0.AuxInt
   25263 		x0 := s0.Args[0]
   25264 		if x0.Op != OpS390XMOVBZloadidx {
   25265 			break
   25266 		}
   25267 		i0 := x0.AuxInt
   25268 		if x0.Aux != s {
   25269 			break
   25270 		}
   25271 		_ = x0.Args[2]
   25272 		if idx != x0.Args[0] {
   25273 			break
   25274 		}
   25275 		if p != x0.Args[1] {
   25276 			break
   25277 		}
   25278 		if mem != x0.Args[2] {
   25279 			break
   25280 		}
   25281 		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)) {
   25282 			break
   25283 		}
   25284 		b = mergePoint(b, x0, x1)
   25285 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25286 		v.reset(OpCopy)
   25287 		v.AddArg(v0)
   25288 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25289 		v1.AuxInt = j1
   25290 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25291 		v2.AuxInt = i0
   25292 		v2.Aux = s
   25293 		v2.AddArg(p)
   25294 		v2.AddArg(idx)
   25295 		v2.AddArg(mem)
   25296 		v1.AddArg(v2)
   25297 		v0.AddArg(v1)
   25298 		v0.AddArg(y)
   25299 		return true
   25300 	}
   25301 	// 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)))
   25302 	// 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)
   25303 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25304 	for {
   25305 		_ = v.Args[1]
   25306 		or := v.Args[0]
   25307 		if or.Op != OpS390XOR {
   25308 			break
   25309 		}
   25310 		_ = or.Args[1]
   25311 		s1 := or.Args[0]
   25312 		if s1.Op != OpS390XSLDconst {
   25313 			break
   25314 		}
   25315 		j1 := s1.AuxInt
   25316 		x1 := s1.Args[0]
   25317 		if x1.Op != OpS390XMOVBZloadidx {
   25318 			break
   25319 		}
   25320 		i1 := x1.AuxInt
   25321 		s := x1.Aux
   25322 		_ = x1.Args[2]
   25323 		idx := x1.Args[0]
   25324 		p := x1.Args[1]
   25325 		mem := x1.Args[2]
   25326 		y := or.Args[1]
   25327 		s0 := v.Args[1]
   25328 		if s0.Op != OpS390XSLDconst {
   25329 			break
   25330 		}
   25331 		j0 := s0.AuxInt
   25332 		x0 := s0.Args[0]
   25333 		if x0.Op != OpS390XMOVBZloadidx {
   25334 			break
   25335 		}
   25336 		i0 := x0.AuxInt
   25337 		if x0.Aux != s {
   25338 			break
   25339 		}
   25340 		_ = x0.Args[2]
   25341 		if idx != x0.Args[0] {
   25342 			break
   25343 		}
   25344 		if p != x0.Args[1] {
   25345 			break
   25346 		}
   25347 		if mem != x0.Args[2] {
   25348 			break
   25349 		}
   25350 		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)) {
   25351 			break
   25352 		}
   25353 		b = mergePoint(b, x0, x1)
   25354 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25355 		v.reset(OpCopy)
   25356 		v.AddArg(v0)
   25357 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25358 		v1.AuxInt = j1
   25359 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25360 		v2.AuxInt = i0
   25361 		v2.Aux = s
   25362 		v2.AddArg(p)
   25363 		v2.AddArg(idx)
   25364 		v2.AddArg(mem)
   25365 		v1.AddArg(v2)
   25366 		v0.AddArg(v1)
   25367 		v0.AddArg(y)
   25368 		return true
   25369 	}
   25370 	// 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)))
   25371 	// 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)
   25372 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25373 	for {
   25374 		_ = v.Args[1]
   25375 		or := v.Args[0]
   25376 		if or.Op != OpS390XOR {
   25377 			break
   25378 		}
   25379 		_ = or.Args[1]
   25380 		y := or.Args[0]
   25381 		s1 := or.Args[1]
   25382 		if s1.Op != OpS390XSLDconst {
   25383 			break
   25384 		}
   25385 		j1 := s1.AuxInt
   25386 		x1 := s1.Args[0]
   25387 		if x1.Op != OpS390XMOVBZloadidx {
   25388 			break
   25389 		}
   25390 		i1 := x1.AuxInt
   25391 		s := x1.Aux
   25392 		_ = x1.Args[2]
   25393 		p := x1.Args[0]
   25394 		idx := x1.Args[1]
   25395 		mem := x1.Args[2]
   25396 		s0 := v.Args[1]
   25397 		if s0.Op != OpS390XSLDconst {
   25398 			break
   25399 		}
   25400 		j0 := s0.AuxInt
   25401 		x0 := s0.Args[0]
   25402 		if x0.Op != OpS390XMOVBZloadidx {
   25403 			break
   25404 		}
   25405 		i0 := x0.AuxInt
   25406 		if x0.Aux != s {
   25407 			break
   25408 		}
   25409 		_ = x0.Args[2]
   25410 		if idx != x0.Args[0] {
   25411 			break
   25412 		}
   25413 		if p != x0.Args[1] {
   25414 			break
   25415 		}
   25416 		if mem != x0.Args[2] {
   25417 			break
   25418 		}
   25419 		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)) {
   25420 			break
   25421 		}
   25422 		b = mergePoint(b, x0, x1)
   25423 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25424 		v.reset(OpCopy)
   25425 		v.AddArg(v0)
   25426 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25427 		v1.AuxInt = j1
   25428 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25429 		v2.AuxInt = i0
   25430 		v2.Aux = s
   25431 		v2.AddArg(p)
   25432 		v2.AddArg(idx)
   25433 		v2.AddArg(mem)
   25434 		v1.AddArg(v2)
   25435 		v0.AddArg(v1)
   25436 		v0.AddArg(y)
   25437 		return true
   25438 	}
   25439 	return false
   25440 }
   25441 func rewriteValueS390X_OpS390XOR_70(v *Value) bool {
   25442 	b := v.Block
   25443 	_ = b
   25444 	typ := &b.Func.Config.Types
   25445 	_ = typ
   25446 	// 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)))
   25447 	// 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)
   25448 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   25449 	for {
   25450 		_ = v.Args[1]
   25451 		or := v.Args[0]
   25452 		if or.Op != OpS390XOR {
   25453 			break
   25454 		}
   25455 		_ = or.Args[1]
   25456 		y := or.Args[0]
   25457 		s1 := or.Args[1]
   25458 		if s1.Op != OpS390XSLDconst {
   25459 			break
   25460 		}
   25461 		j1 := s1.AuxInt
   25462 		x1 := s1.Args[0]
   25463 		if x1.Op != OpS390XMOVBZloadidx {
   25464 			break
   25465 		}
   25466 		i1 := x1.AuxInt
   25467 		s := x1.Aux
   25468 		_ = x1.Args[2]
   25469 		idx := x1.Args[0]
   25470 		p := x1.Args[1]
   25471 		mem := x1.Args[2]
   25472 		s0 := v.Args[1]
   25473 		if s0.Op != OpS390XSLDconst {
   25474 			break
   25475 		}
   25476 		j0 := s0.AuxInt
   25477 		x0 := s0.Args[0]
   25478 		if x0.Op != OpS390XMOVBZloadidx {
   25479 			break
   25480 		}
   25481 		i0 := x0.AuxInt
   25482 		if x0.Aux != s {
   25483 			break
   25484 		}
   25485 		_ = x0.Args[2]
   25486 		if idx != x0.Args[0] {
   25487 			break
   25488 		}
   25489 		if p != x0.Args[1] {
   25490 			break
   25491 		}
   25492 		if mem != x0.Args[2] {
   25493 			break
   25494 		}
   25495 		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)) {
   25496 			break
   25497 		}
   25498 		b = mergePoint(b, x0, x1)
   25499 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25500 		v.reset(OpCopy)
   25501 		v.AddArg(v0)
   25502 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25503 		v1.AuxInt = j1
   25504 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   25505 		v2.AuxInt = i0
   25506 		v2.Aux = s
   25507 		v2.AddArg(p)
   25508 		v2.AddArg(idx)
   25509 		v2.AddArg(mem)
   25510 		v1.AddArg(v2)
   25511 		v0.AddArg(v1)
   25512 		v0.AddArg(y)
   25513 		return true
   25514 	}
   25515 	// 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))
   25516 	// 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)
   25517 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25518 	for {
   25519 		_ = v.Args[1]
   25520 		s0 := v.Args[0]
   25521 		if s0.Op != OpS390XSLDconst {
   25522 			break
   25523 		}
   25524 		j0 := s0.AuxInt
   25525 		x0 := s0.Args[0]
   25526 		if x0.Op != OpS390XMOVHZloadidx {
   25527 			break
   25528 		}
   25529 		i0 := x0.AuxInt
   25530 		s := x0.Aux
   25531 		_ = x0.Args[2]
   25532 		p := x0.Args[0]
   25533 		idx := x0.Args[1]
   25534 		mem := x0.Args[2]
   25535 		or := v.Args[1]
   25536 		if or.Op != OpS390XOR {
   25537 			break
   25538 		}
   25539 		_ = or.Args[1]
   25540 		s1 := or.Args[0]
   25541 		if s1.Op != OpS390XSLDconst {
   25542 			break
   25543 		}
   25544 		j1 := s1.AuxInt
   25545 		x1 := s1.Args[0]
   25546 		if x1.Op != OpS390XMOVHZloadidx {
   25547 			break
   25548 		}
   25549 		i1 := x1.AuxInt
   25550 		if x1.Aux != s {
   25551 			break
   25552 		}
   25553 		_ = x1.Args[2]
   25554 		if p != x1.Args[0] {
   25555 			break
   25556 		}
   25557 		if idx != x1.Args[1] {
   25558 			break
   25559 		}
   25560 		if mem != x1.Args[2] {
   25561 			break
   25562 		}
   25563 		y := or.Args[1]
   25564 		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)) {
   25565 			break
   25566 		}
   25567 		b = mergePoint(b, x0, x1)
   25568 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25569 		v.reset(OpCopy)
   25570 		v.AddArg(v0)
   25571 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25572 		v1.AuxInt = j1
   25573 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25574 		v2.AuxInt = i0
   25575 		v2.Aux = s
   25576 		v2.AddArg(p)
   25577 		v2.AddArg(idx)
   25578 		v2.AddArg(mem)
   25579 		v1.AddArg(v2)
   25580 		v0.AddArg(v1)
   25581 		v0.AddArg(y)
   25582 		return true
   25583 	}
   25584 	// 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))
   25585 	// 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)
   25586 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25587 	for {
   25588 		_ = v.Args[1]
   25589 		s0 := v.Args[0]
   25590 		if s0.Op != OpS390XSLDconst {
   25591 			break
   25592 		}
   25593 		j0 := s0.AuxInt
   25594 		x0 := s0.Args[0]
   25595 		if x0.Op != OpS390XMOVHZloadidx {
   25596 			break
   25597 		}
   25598 		i0 := x0.AuxInt
   25599 		s := x0.Aux
   25600 		_ = x0.Args[2]
   25601 		idx := x0.Args[0]
   25602 		p := x0.Args[1]
   25603 		mem := x0.Args[2]
   25604 		or := v.Args[1]
   25605 		if or.Op != OpS390XOR {
   25606 			break
   25607 		}
   25608 		_ = or.Args[1]
   25609 		s1 := or.Args[0]
   25610 		if s1.Op != OpS390XSLDconst {
   25611 			break
   25612 		}
   25613 		j1 := s1.AuxInt
   25614 		x1 := s1.Args[0]
   25615 		if x1.Op != OpS390XMOVHZloadidx {
   25616 			break
   25617 		}
   25618 		i1 := x1.AuxInt
   25619 		if x1.Aux != s {
   25620 			break
   25621 		}
   25622 		_ = x1.Args[2]
   25623 		if p != x1.Args[0] {
   25624 			break
   25625 		}
   25626 		if idx != x1.Args[1] {
   25627 			break
   25628 		}
   25629 		if mem != x1.Args[2] {
   25630 			break
   25631 		}
   25632 		y := or.Args[1]
   25633 		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)) {
   25634 			break
   25635 		}
   25636 		b = mergePoint(b, x0, x1)
   25637 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25638 		v.reset(OpCopy)
   25639 		v.AddArg(v0)
   25640 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25641 		v1.AuxInt = j1
   25642 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25643 		v2.AuxInt = i0
   25644 		v2.Aux = s
   25645 		v2.AddArg(p)
   25646 		v2.AddArg(idx)
   25647 		v2.AddArg(mem)
   25648 		v1.AddArg(v2)
   25649 		v0.AddArg(v1)
   25650 		v0.AddArg(y)
   25651 		return true
   25652 	}
   25653 	// 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))
   25654 	// 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)
   25655 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25656 	for {
   25657 		_ = v.Args[1]
   25658 		s0 := v.Args[0]
   25659 		if s0.Op != OpS390XSLDconst {
   25660 			break
   25661 		}
   25662 		j0 := s0.AuxInt
   25663 		x0 := s0.Args[0]
   25664 		if x0.Op != OpS390XMOVHZloadidx {
   25665 			break
   25666 		}
   25667 		i0 := x0.AuxInt
   25668 		s := x0.Aux
   25669 		_ = x0.Args[2]
   25670 		p := x0.Args[0]
   25671 		idx := x0.Args[1]
   25672 		mem := x0.Args[2]
   25673 		or := v.Args[1]
   25674 		if or.Op != OpS390XOR {
   25675 			break
   25676 		}
   25677 		_ = or.Args[1]
   25678 		s1 := or.Args[0]
   25679 		if s1.Op != OpS390XSLDconst {
   25680 			break
   25681 		}
   25682 		j1 := s1.AuxInt
   25683 		x1 := s1.Args[0]
   25684 		if x1.Op != OpS390XMOVHZloadidx {
   25685 			break
   25686 		}
   25687 		i1 := x1.AuxInt
   25688 		if x1.Aux != s {
   25689 			break
   25690 		}
   25691 		_ = x1.Args[2]
   25692 		if idx != x1.Args[0] {
   25693 			break
   25694 		}
   25695 		if p != x1.Args[1] {
   25696 			break
   25697 		}
   25698 		if mem != x1.Args[2] {
   25699 			break
   25700 		}
   25701 		y := or.Args[1]
   25702 		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)) {
   25703 			break
   25704 		}
   25705 		b = mergePoint(b, x0, x1)
   25706 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25707 		v.reset(OpCopy)
   25708 		v.AddArg(v0)
   25709 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25710 		v1.AuxInt = j1
   25711 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25712 		v2.AuxInt = i0
   25713 		v2.Aux = s
   25714 		v2.AddArg(p)
   25715 		v2.AddArg(idx)
   25716 		v2.AddArg(mem)
   25717 		v1.AddArg(v2)
   25718 		v0.AddArg(v1)
   25719 		v0.AddArg(y)
   25720 		return true
   25721 	}
   25722 	// 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))
   25723 	// 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)
   25724 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25725 	for {
   25726 		_ = v.Args[1]
   25727 		s0 := v.Args[0]
   25728 		if s0.Op != OpS390XSLDconst {
   25729 			break
   25730 		}
   25731 		j0 := s0.AuxInt
   25732 		x0 := s0.Args[0]
   25733 		if x0.Op != OpS390XMOVHZloadidx {
   25734 			break
   25735 		}
   25736 		i0 := x0.AuxInt
   25737 		s := x0.Aux
   25738 		_ = x0.Args[2]
   25739 		idx := x0.Args[0]
   25740 		p := x0.Args[1]
   25741 		mem := x0.Args[2]
   25742 		or := v.Args[1]
   25743 		if or.Op != OpS390XOR {
   25744 			break
   25745 		}
   25746 		_ = or.Args[1]
   25747 		s1 := or.Args[0]
   25748 		if s1.Op != OpS390XSLDconst {
   25749 			break
   25750 		}
   25751 		j1 := s1.AuxInt
   25752 		x1 := s1.Args[0]
   25753 		if x1.Op != OpS390XMOVHZloadidx {
   25754 			break
   25755 		}
   25756 		i1 := x1.AuxInt
   25757 		if x1.Aux != s {
   25758 			break
   25759 		}
   25760 		_ = x1.Args[2]
   25761 		if idx != x1.Args[0] {
   25762 			break
   25763 		}
   25764 		if p != x1.Args[1] {
   25765 			break
   25766 		}
   25767 		if mem != x1.Args[2] {
   25768 			break
   25769 		}
   25770 		y := or.Args[1]
   25771 		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)) {
   25772 			break
   25773 		}
   25774 		b = mergePoint(b, x0, x1)
   25775 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25776 		v.reset(OpCopy)
   25777 		v.AddArg(v0)
   25778 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25779 		v1.AuxInt = j1
   25780 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25781 		v2.AuxInt = i0
   25782 		v2.Aux = s
   25783 		v2.AddArg(p)
   25784 		v2.AddArg(idx)
   25785 		v2.AddArg(mem)
   25786 		v1.AddArg(v2)
   25787 		v0.AddArg(v1)
   25788 		v0.AddArg(y)
   25789 		return true
   25790 	}
   25791 	// 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))))
   25792 	// 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)
   25793 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25794 	for {
   25795 		_ = v.Args[1]
   25796 		s0 := v.Args[0]
   25797 		if s0.Op != OpS390XSLDconst {
   25798 			break
   25799 		}
   25800 		j0 := s0.AuxInt
   25801 		x0 := s0.Args[0]
   25802 		if x0.Op != OpS390XMOVHZloadidx {
   25803 			break
   25804 		}
   25805 		i0 := x0.AuxInt
   25806 		s := x0.Aux
   25807 		_ = x0.Args[2]
   25808 		p := x0.Args[0]
   25809 		idx := x0.Args[1]
   25810 		mem := x0.Args[2]
   25811 		or := v.Args[1]
   25812 		if or.Op != OpS390XOR {
   25813 			break
   25814 		}
   25815 		_ = or.Args[1]
   25816 		y := or.Args[0]
   25817 		s1 := or.Args[1]
   25818 		if s1.Op != OpS390XSLDconst {
   25819 			break
   25820 		}
   25821 		j1 := s1.AuxInt
   25822 		x1 := s1.Args[0]
   25823 		if x1.Op != OpS390XMOVHZloadidx {
   25824 			break
   25825 		}
   25826 		i1 := x1.AuxInt
   25827 		if x1.Aux != s {
   25828 			break
   25829 		}
   25830 		_ = x1.Args[2]
   25831 		if p != x1.Args[0] {
   25832 			break
   25833 		}
   25834 		if idx != x1.Args[1] {
   25835 			break
   25836 		}
   25837 		if mem != x1.Args[2] {
   25838 			break
   25839 		}
   25840 		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)) {
   25841 			break
   25842 		}
   25843 		b = mergePoint(b, x0, x1)
   25844 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25845 		v.reset(OpCopy)
   25846 		v.AddArg(v0)
   25847 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25848 		v1.AuxInt = j1
   25849 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25850 		v2.AuxInt = i0
   25851 		v2.Aux = s
   25852 		v2.AddArg(p)
   25853 		v2.AddArg(idx)
   25854 		v2.AddArg(mem)
   25855 		v1.AddArg(v2)
   25856 		v0.AddArg(v1)
   25857 		v0.AddArg(y)
   25858 		return true
   25859 	}
   25860 	// 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))))
   25861 	// 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)
   25862 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25863 	for {
   25864 		_ = v.Args[1]
   25865 		s0 := v.Args[0]
   25866 		if s0.Op != OpS390XSLDconst {
   25867 			break
   25868 		}
   25869 		j0 := s0.AuxInt
   25870 		x0 := s0.Args[0]
   25871 		if x0.Op != OpS390XMOVHZloadidx {
   25872 			break
   25873 		}
   25874 		i0 := x0.AuxInt
   25875 		s := x0.Aux
   25876 		_ = x0.Args[2]
   25877 		idx := x0.Args[0]
   25878 		p := x0.Args[1]
   25879 		mem := x0.Args[2]
   25880 		or := v.Args[1]
   25881 		if or.Op != OpS390XOR {
   25882 			break
   25883 		}
   25884 		_ = or.Args[1]
   25885 		y := or.Args[0]
   25886 		s1 := or.Args[1]
   25887 		if s1.Op != OpS390XSLDconst {
   25888 			break
   25889 		}
   25890 		j1 := s1.AuxInt
   25891 		x1 := s1.Args[0]
   25892 		if x1.Op != OpS390XMOVHZloadidx {
   25893 			break
   25894 		}
   25895 		i1 := x1.AuxInt
   25896 		if x1.Aux != s {
   25897 			break
   25898 		}
   25899 		_ = x1.Args[2]
   25900 		if p != x1.Args[0] {
   25901 			break
   25902 		}
   25903 		if idx != x1.Args[1] {
   25904 			break
   25905 		}
   25906 		if mem != x1.Args[2] {
   25907 			break
   25908 		}
   25909 		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)) {
   25910 			break
   25911 		}
   25912 		b = mergePoint(b, x0, x1)
   25913 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25914 		v.reset(OpCopy)
   25915 		v.AddArg(v0)
   25916 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25917 		v1.AuxInt = j1
   25918 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25919 		v2.AuxInt = i0
   25920 		v2.Aux = s
   25921 		v2.AddArg(p)
   25922 		v2.AddArg(idx)
   25923 		v2.AddArg(mem)
   25924 		v1.AddArg(v2)
   25925 		v0.AddArg(v1)
   25926 		v0.AddArg(y)
   25927 		return true
   25928 	}
   25929 	// 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))))
   25930 	// 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)
   25931 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   25932 	for {
   25933 		_ = v.Args[1]
   25934 		s0 := v.Args[0]
   25935 		if s0.Op != OpS390XSLDconst {
   25936 			break
   25937 		}
   25938 		j0 := s0.AuxInt
   25939 		x0 := s0.Args[0]
   25940 		if x0.Op != OpS390XMOVHZloadidx {
   25941 			break
   25942 		}
   25943 		i0 := x0.AuxInt
   25944 		s := x0.Aux
   25945 		_ = x0.Args[2]
   25946 		p := x0.Args[0]
   25947 		idx := x0.Args[1]
   25948 		mem := x0.Args[2]
   25949 		or := v.Args[1]
   25950 		if or.Op != OpS390XOR {
   25951 			break
   25952 		}
   25953 		_ = or.Args[1]
   25954 		y := or.Args[0]
   25955 		s1 := or.Args[1]
   25956 		if s1.Op != OpS390XSLDconst {
   25957 			break
   25958 		}
   25959 		j1 := s1.AuxInt
   25960 		x1 := s1.Args[0]
   25961 		if x1.Op != OpS390XMOVHZloadidx {
   25962 			break
   25963 		}
   25964 		i1 := x1.AuxInt
   25965 		if x1.Aux != s {
   25966 			break
   25967 		}
   25968 		_ = x1.Args[2]
   25969 		if idx != x1.Args[0] {
   25970 			break
   25971 		}
   25972 		if p != x1.Args[1] {
   25973 			break
   25974 		}
   25975 		if mem != x1.Args[2] {
   25976 			break
   25977 		}
   25978 		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)) {
   25979 			break
   25980 		}
   25981 		b = mergePoint(b, x0, x1)
   25982 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   25983 		v.reset(OpCopy)
   25984 		v.AddArg(v0)
   25985 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   25986 		v1.AuxInt = j1
   25987 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   25988 		v2.AuxInt = i0
   25989 		v2.Aux = s
   25990 		v2.AddArg(p)
   25991 		v2.AddArg(idx)
   25992 		v2.AddArg(mem)
   25993 		v1.AddArg(v2)
   25994 		v0.AddArg(v1)
   25995 		v0.AddArg(y)
   25996 		return true
   25997 	}
   25998 	// 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))))
   25999 	// 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)
   26000 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26001 	for {
   26002 		_ = v.Args[1]
   26003 		s0 := v.Args[0]
   26004 		if s0.Op != OpS390XSLDconst {
   26005 			break
   26006 		}
   26007 		j0 := s0.AuxInt
   26008 		x0 := s0.Args[0]
   26009 		if x0.Op != OpS390XMOVHZloadidx {
   26010 			break
   26011 		}
   26012 		i0 := x0.AuxInt
   26013 		s := x0.Aux
   26014 		_ = x0.Args[2]
   26015 		idx := x0.Args[0]
   26016 		p := x0.Args[1]
   26017 		mem := x0.Args[2]
   26018 		or := v.Args[1]
   26019 		if or.Op != OpS390XOR {
   26020 			break
   26021 		}
   26022 		_ = or.Args[1]
   26023 		y := or.Args[0]
   26024 		s1 := or.Args[1]
   26025 		if s1.Op != OpS390XSLDconst {
   26026 			break
   26027 		}
   26028 		j1 := s1.AuxInt
   26029 		x1 := s1.Args[0]
   26030 		if x1.Op != OpS390XMOVHZloadidx {
   26031 			break
   26032 		}
   26033 		i1 := x1.AuxInt
   26034 		if x1.Aux != s {
   26035 			break
   26036 		}
   26037 		_ = x1.Args[2]
   26038 		if idx != x1.Args[0] {
   26039 			break
   26040 		}
   26041 		if p != x1.Args[1] {
   26042 			break
   26043 		}
   26044 		if mem != x1.Args[2] {
   26045 			break
   26046 		}
   26047 		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)) {
   26048 			break
   26049 		}
   26050 		b = mergePoint(b, x0, x1)
   26051 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26052 		v.reset(OpCopy)
   26053 		v.AddArg(v0)
   26054 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26055 		v1.AuxInt = j1
   26056 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26057 		v2.AuxInt = i0
   26058 		v2.Aux = s
   26059 		v2.AddArg(p)
   26060 		v2.AddArg(idx)
   26061 		v2.AddArg(mem)
   26062 		v1.AddArg(v2)
   26063 		v0.AddArg(v1)
   26064 		v0.AddArg(y)
   26065 		return true
   26066 	}
   26067 	// 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)))
   26068 	// 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)
   26069 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26070 	for {
   26071 		_ = v.Args[1]
   26072 		or := v.Args[0]
   26073 		if or.Op != OpS390XOR {
   26074 			break
   26075 		}
   26076 		_ = or.Args[1]
   26077 		s1 := or.Args[0]
   26078 		if s1.Op != OpS390XSLDconst {
   26079 			break
   26080 		}
   26081 		j1 := s1.AuxInt
   26082 		x1 := s1.Args[0]
   26083 		if x1.Op != OpS390XMOVHZloadidx {
   26084 			break
   26085 		}
   26086 		i1 := x1.AuxInt
   26087 		s := x1.Aux
   26088 		_ = x1.Args[2]
   26089 		p := x1.Args[0]
   26090 		idx := x1.Args[1]
   26091 		mem := x1.Args[2]
   26092 		y := or.Args[1]
   26093 		s0 := v.Args[1]
   26094 		if s0.Op != OpS390XSLDconst {
   26095 			break
   26096 		}
   26097 		j0 := s0.AuxInt
   26098 		x0 := s0.Args[0]
   26099 		if x0.Op != OpS390XMOVHZloadidx {
   26100 			break
   26101 		}
   26102 		i0 := x0.AuxInt
   26103 		if x0.Aux != s {
   26104 			break
   26105 		}
   26106 		_ = x0.Args[2]
   26107 		if p != x0.Args[0] {
   26108 			break
   26109 		}
   26110 		if idx != x0.Args[1] {
   26111 			break
   26112 		}
   26113 		if mem != x0.Args[2] {
   26114 			break
   26115 		}
   26116 		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)) {
   26117 			break
   26118 		}
   26119 		b = mergePoint(b, x0, x1)
   26120 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26121 		v.reset(OpCopy)
   26122 		v.AddArg(v0)
   26123 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26124 		v1.AuxInt = j1
   26125 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26126 		v2.AuxInt = i0
   26127 		v2.Aux = s
   26128 		v2.AddArg(p)
   26129 		v2.AddArg(idx)
   26130 		v2.AddArg(mem)
   26131 		v1.AddArg(v2)
   26132 		v0.AddArg(v1)
   26133 		v0.AddArg(y)
   26134 		return true
   26135 	}
   26136 	return false
   26137 }
   26138 func rewriteValueS390X_OpS390XOR_80(v *Value) bool {
   26139 	b := v.Block
   26140 	_ = b
   26141 	typ := &b.Func.Config.Types
   26142 	_ = typ
   26143 	// 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)))
   26144 	// 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)
   26145 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26146 	for {
   26147 		_ = v.Args[1]
   26148 		or := v.Args[0]
   26149 		if or.Op != OpS390XOR {
   26150 			break
   26151 		}
   26152 		_ = or.Args[1]
   26153 		s1 := or.Args[0]
   26154 		if s1.Op != OpS390XSLDconst {
   26155 			break
   26156 		}
   26157 		j1 := s1.AuxInt
   26158 		x1 := s1.Args[0]
   26159 		if x1.Op != OpS390XMOVHZloadidx {
   26160 			break
   26161 		}
   26162 		i1 := x1.AuxInt
   26163 		s := x1.Aux
   26164 		_ = x1.Args[2]
   26165 		idx := x1.Args[0]
   26166 		p := x1.Args[1]
   26167 		mem := x1.Args[2]
   26168 		y := or.Args[1]
   26169 		s0 := v.Args[1]
   26170 		if s0.Op != OpS390XSLDconst {
   26171 			break
   26172 		}
   26173 		j0 := s0.AuxInt
   26174 		x0 := s0.Args[0]
   26175 		if x0.Op != OpS390XMOVHZloadidx {
   26176 			break
   26177 		}
   26178 		i0 := x0.AuxInt
   26179 		if x0.Aux != s {
   26180 			break
   26181 		}
   26182 		_ = x0.Args[2]
   26183 		if p != x0.Args[0] {
   26184 			break
   26185 		}
   26186 		if idx != x0.Args[1] {
   26187 			break
   26188 		}
   26189 		if mem != x0.Args[2] {
   26190 			break
   26191 		}
   26192 		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)) {
   26193 			break
   26194 		}
   26195 		b = mergePoint(b, x0, x1)
   26196 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26197 		v.reset(OpCopy)
   26198 		v.AddArg(v0)
   26199 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26200 		v1.AuxInt = j1
   26201 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26202 		v2.AuxInt = i0
   26203 		v2.Aux = s
   26204 		v2.AddArg(p)
   26205 		v2.AddArg(idx)
   26206 		v2.AddArg(mem)
   26207 		v1.AddArg(v2)
   26208 		v0.AddArg(v1)
   26209 		v0.AddArg(y)
   26210 		return true
   26211 	}
   26212 	// 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)))
   26213 	// 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)
   26214 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26215 	for {
   26216 		_ = v.Args[1]
   26217 		or := v.Args[0]
   26218 		if or.Op != OpS390XOR {
   26219 			break
   26220 		}
   26221 		_ = or.Args[1]
   26222 		y := or.Args[0]
   26223 		s1 := or.Args[1]
   26224 		if s1.Op != OpS390XSLDconst {
   26225 			break
   26226 		}
   26227 		j1 := s1.AuxInt
   26228 		x1 := s1.Args[0]
   26229 		if x1.Op != OpS390XMOVHZloadidx {
   26230 			break
   26231 		}
   26232 		i1 := x1.AuxInt
   26233 		s := x1.Aux
   26234 		_ = x1.Args[2]
   26235 		p := x1.Args[0]
   26236 		idx := x1.Args[1]
   26237 		mem := x1.Args[2]
   26238 		s0 := v.Args[1]
   26239 		if s0.Op != OpS390XSLDconst {
   26240 			break
   26241 		}
   26242 		j0 := s0.AuxInt
   26243 		x0 := s0.Args[0]
   26244 		if x0.Op != OpS390XMOVHZloadidx {
   26245 			break
   26246 		}
   26247 		i0 := x0.AuxInt
   26248 		if x0.Aux != s {
   26249 			break
   26250 		}
   26251 		_ = x0.Args[2]
   26252 		if p != x0.Args[0] {
   26253 			break
   26254 		}
   26255 		if idx != x0.Args[1] {
   26256 			break
   26257 		}
   26258 		if mem != x0.Args[2] {
   26259 			break
   26260 		}
   26261 		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)) {
   26262 			break
   26263 		}
   26264 		b = mergePoint(b, x0, x1)
   26265 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26266 		v.reset(OpCopy)
   26267 		v.AddArg(v0)
   26268 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26269 		v1.AuxInt = j1
   26270 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26271 		v2.AuxInt = i0
   26272 		v2.Aux = s
   26273 		v2.AddArg(p)
   26274 		v2.AddArg(idx)
   26275 		v2.AddArg(mem)
   26276 		v1.AddArg(v2)
   26277 		v0.AddArg(v1)
   26278 		v0.AddArg(y)
   26279 		return true
   26280 	}
   26281 	// 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)))
   26282 	// 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)
   26283 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26284 	for {
   26285 		_ = v.Args[1]
   26286 		or := v.Args[0]
   26287 		if or.Op != OpS390XOR {
   26288 			break
   26289 		}
   26290 		_ = or.Args[1]
   26291 		y := or.Args[0]
   26292 		s1 := or.Args[1]
   26293 		if s1.Op != OpS390XSLDconst {
   26294 			break
   26295 		}
   26296 		j1 := s1.AuxInt
   26297 		x1 := s1.Args[0]
   26298 		if x1.Op != OpS390XMOVHZloadidx {
   26299 			break
   26300 		}
   26301 		i1 := x1.AuxInt
   26302 		s := x1.Aux
   26303 		_ = x1.Args[2]
   26304 		idx := x1.Args[0]
   26305 		p := x1.Args[1]
   26306 		mem := x1.Args[2]
   26307 		s0 := v.Args[1]
   26308 		if s0.Op != OpS390XSLDconst {
   26309 			break
   26310 		}
   26311 		j0 := s0.AuxInt
   26312 		x0 := s0.Args[0]
   26313 		if x0.Op != OpS390XMOVHZloadidx {
   26314 			break
   26315 		}
   26316 		i0 := x0.AuxInt
   26317 		if x0.Aux != s {
   26318 			break
   26319 		}
   26320 		_ = x0.Args[2]
   26321 		if p != x0.Args[0] {
   26322 			break
   26323 		}
   26324 		if idx != x0.Args[1] {
   26325 			break
   26326 		}
   26327 		if mem != x0.Args[2] {
   26328 			break
   26329 		}
   26330 		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)) {
   26331 			break
   26332 		}
   26333 		b = mergePoint(b, x0, x1)
   26334 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26335 		v.reset(OpCopy)
   26336 		v.AddArg(v0)
   26337 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26338 		v1.AuxInt = j1
   26339 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26340 		v2.AuxInt = i0
   26341 		v2.Aux = s
   26342 		v2.AddArg(p)
   26343 		v2.AddArg(idx)
   26344 		v2.AddArg(mem)
   26345 		v1.AddArg(v2)
   26346 		v0.AddArg(v1)
   26347 		v0.AddArg(y)
   26348 		return true
   26349 	}
   26350 	// 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)))
   26351 	// 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)
   26352 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26353 	for {
   26354 		_ = v.Args[1]
   26355 		or := v.Args[0]
   26356 		if or.Op != OpS390XOR {
   26357 			break
   26358 		}
   26359 		_ = or.Args[1]
   26360 		s1 := or.Args[0]
   26361 		if s1.Op != OpS390XSLDconst {
   26362 			break
   26363 		}
   26364 		j1 := s1.AuxInt
   26365 		x1 := s1.Args[0]
   26366 		if x1.Op != OpS390XMOVHZloadidx {
   26367 			break
   26368 		}
   26369 		i1 := x1.AuxInt
   26370 		s := x1.Aux
   26371 		_ = x1.Args[2]
   26372 		p := x1.Args[0]
   26373 		idx := x1.Args[1]
   26374 		mem := x1.Args[2]
   26375 		y := or.Args[1]
   26376 		s0 := v.Args[1]
   26377 		if s0.Op != OpS390XSLDconst {
   26378 			break
   26379 		}
   26380 		j0 := s0.AuxInt
   26381 		x0 := s0.Args[0]
   26382 		if x0.Op != OpS390XMOVHZloadidx {
   26383 			break
   26384 		}
   26385 		i0 := x0.AuxInt
   26386 		if x0.Aux != s {
   26387 			break
   26388 		}
   26389 		_ = x0.Args[2]
   26390 		if idx != x0.Args[0] {
   26391 			break
   26392 		}
   26393 		if p != x0.Args[1] {
   26394 			break
   26395 		}
   26396 		if mem != x0.Args[2] {
   26397 			break
   26398 		}
   26399 		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)) {
   26400 			break
   26401 		}
   26402 		b = mergePoint(b, x0, x1)
   26403 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26404 		v.reset(OpCopy)
   26405 		v.AddArg(v0)
   26406 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26407 		v1.AuxInt = j1
   26408 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26409 		v2.AuxInt = i0
   26410 		v2.Aux = s
   26411 		v2.AddArg(p)
   26412 		v2.AddArg(idx)
   26413 		v2.AddArg(mem)
   26414 		v1.AddArg(v2)
   26415 		v0.AddArg(v1)
   26416 		v0.AddArg(y)
   26417 		return true
   26418 	}
   26419 	// 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)))
   26420 	// 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)
   26421 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26422 	for {
   26423 		_ = v.Args[1]
   26424 		or := v.Args[0]
   26425 		if or.Op != OpS390XOR {
   26426 			break
   26427 		}
   26428 		_ = or.Args[1]
   26429 		s1 := or.Args[0]
   26430 		if s1.Op != OpS390XSLDconst {
   26431 			break
   26432 		}
   26433 		j1 := s1.AuxInt
   26434 		x1 := s1.Args[0]
   26435 		if x1.Op != OpS390XMOVHZloadidx {
   26436 			break
   26437 		}
   26438 		i1 := x1.AuxInt
   26439 		s := x1.Aux
   26440 		_ = x1.Args[2]
   26441 		idx := x1.Args[0]
   26442 		p := x1.Args[1]
   26443 		mem := x1.Args[2]
   26444 		y := or.Args[1]
   26445 		s0 := v.Args[1]
   26446 		if s0.Op != OpS390XSLDconst {
   26447 			break
   26448 		}
   26449 		j0 := s0.AuxInt
   26450 		x0 := s0.Args[0]
   26451 		if x0.Op != OpS390XMOVHZloadidx {
   26452 			break
   26453 		}
   26454 		i0 := x0.AuxInt
   26455 		if x0.Aux != s {
   26456 			break
   26457 		}
   26458 		_ = x0.Args[2]
   26459 		if idx != x0.Args[0] {
   26460 			break
   26461 		}
   26462 		if p != x0.Args[1] {
   26463 			break
   26464 		}
   26465 		if mem != x0.Args[2] {
   26466 			break
   26467 		}
   26468 		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)) {
   26469 			break
   26470 		}
   26471 		b = mergePoint(b, x0, x1)
   26472 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26473 		v.reset(OpCopy)
   26474 		v.AddArg(v0)
   26475 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26476 		v1.AuxInt = j1
   26477 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26478 		v2.AuxInt = i0
   26479 		v2.Aux = s
   26480 		v2.AddArg(p)
   26481 		v2.AddArg(idx)
   26482 		v2.AddArg(mem)
   26483 		v1.AddArg(v2)
   26484 		v0.AddArg(v1)
   26485 		v0.AddArg(y)
   26486 		return true
   26487 	}
   26488 	// 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)))
   26489 	// 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)
   26490 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26491 	for {
   26492 		_ = v.Args[1]
   26493 		or := v.Args[0]
   26494 		if or.Op != OpS390XOR {
   26495 			break
   26496 		}
   26497 		_ = or.Args[1]
   26498 		y := or.Args[0]
   26499 		s1 := or.Args[1]
   26500 		if s1.Op != OpS390XSLDconst {
   26501 			break
   26502 		}
   26503 		j1 := s1.AuxInt
   26504 		x1 := s1.Args[0]
   26505 		if x1.Op != OpS390XMOVHZloadidx {
   26506 			break
   26507 		}
   26508 		i1 := x1.AuxInt
   26509 		s := x1.Aux
   26510 		_ = x1.Args[2]
   26511 		p := x1.Args[0]
   26512 		idx := x1.Args[1]
   26513 		mem := x1.Args[2]
   26514 		s0 := v.Args[1]
   26515 		if s0.Op != OpS390XSLDconst {
   26516 			break
   26517 		}
   26518 		j0 := s0.AuxInt
   26519 		x0 := s0.Args[0]
   26520 		if x0.Op != OpS390XMOVHZloadidx {
   26521 			break
   26522 		}
   26523 		i0 := x0.AuxInt
   26524 		if x0.Aux != s {
   26525 			break
   26526 		}
   26527 		_ = x0.Args[2]
   26528 		if idx != x0.Args[0] {
   26529 			break
   26530 		}
   26531 		if p != x0.Args[1] {
   26532 			break
   26533 		}
   26534 		if mem != x0.Args[2] {
   26535 			break
   26536 		}
   26537 		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)) {
   26538 			break
   26539 		}
   26540 		b = mergePoint(b, x0, x1)
   26541 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26542 		v.reset(OpCopy)
   26543 		v.AddArg(v0)
   26544 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26545 		v1.AuxInt = j1
   26546 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26547 		v2.AuxInt = i0
   26548 		v2.Aux = s
   26549 		v2.AddArg(p)
   26550 		v2.AddArg(idx)
   26551 		v2.AddArg(mem)
   26552 		v1.AddArg(v2)
   26553 		v0.AddArg(v1)
   26554 		v0.AddArg(y)
   26555 		return true
   26556 	}
   26557 	// 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)))
   26558 	// 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)
   26559 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
   26560 	for {
   26561 		_ = v.Args[1]
   26562 		or := v.Args[0]
   26563 		if or.Op != OpS390XOR {
   26564 			break
   26565 		}
   26566 		_ = or.Args[1]
   26567 		y := or.Args[0]
   26568 		s1 := or.Args[1]
   26569 		if s1.Op != OpS390XSLDconst {
   26570 			break
   26571 		}
   26572 		j1 := s1.AuxInt
   26573 		x1 := s1.Args[0]
   26574 		if x1.Op != OpS390XMOVHZloadidx {
   26575 			break
   26576 		}
   26577 		i1 := x1.AuxInt
   26578 		s := x1.Aux
   26579 		_ = x1.Args[2]
   26580 		idx := x1.Args[0]
   26581 		p := x1.Args[1]
   26582 		mem := x1.Args[2]
   26583 		s0 := v.Args[1]
   26584 		if s0.Op != OpS390XSLDconst {
   26585 			break
   26586 		}
   26587 		j0 := s0.AuxInt
   26588 		x0 := s0.Args[0]
   26589 		if x0.Op != OpS390XMOVHZloadidx {
   26590 			break
   26591 		}
   26592 		i0 := x0.AuxInt
   26593 		if x0.Aux != s {
   26594 			break
   26595 		}
   26596 		_ = x0.Args[2]
   26597 		if idx != x0.Args[0] {
   26598 			break
   26599 		}
   26600 		if p != x0.Args[1] {
   26601 			break
   26602 		}
   26603 		if mem != x0.Args[2] {
   26604 			break
   26605 		}
   26606 		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)) {
   26607 			break
   26608 		}
   26609 		b = mergePoint(b, x0, x1)
   26610 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   26611 		v.reset(OpCopy)
   26612 		v.AddArg(v0)
   26613 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   26614 		v1.AuxInt = j1
   26615 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   26616 		v2.AuxInt = i0
   26617 		v2.Aux = s
   26618 		v2.AddArg(p)
   26619 		v2.AddArg(idx)
   26620 		v2.AddArg(mem)
   26621 		v1.AddArg(v2)
   26622 		v0.AddArg(v1)
   26623 		v0.AddArg(y)
   26624 		return true
   26625 	}
   26626 	// match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)))
   26627 	// 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)
   26628 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
   26629 	for {
   26630 		_ = v.Args[1]
   26631 		x0 := v.Args[0]
   26632 		if x0.Op != OpS390XMOVBZload {
   26633 			break
   26634 		}
   26635 		i0 := x0.AuxInt
   26636 		s := x0.Aux
   26637 		_ = x0.Args[1]
   26638 		p := x0.Args[0]
   26639 		mem := x0.Args[1]
   26640 		sh := v.Args[1]
   26641 		if sh.Op != OpS390XSLDconst {
   26642 			break
   26643 		}
   26644 		if sh.AuxInt != 8 {
   26645 			break
   26646 		}
   26647 		x1 := sh.Args[0]
   26648 		if x1.Op != OpS390XMOVBZload {
   26649 			break
   26650 		}
   26651 		i1 := x1.AuxInt
   26652 		if x1.Aux != s {
   26653 			break
   26654 		}
   26655 		_ = x1.Args[1]
   26656 		if p != x1.Args[0] {
   26657 			break
   26658 		}
   26659 		if mem != x1.Args[1] {
   26660 			break
   26661 		}
   26662 		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)) {
   26663 			break
   26664 		}
   26665 		b = mergePoint(b, x0, x1)
   26666 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   26667 		v.reset(OpCopy)
   26668 		v.AddArg(v0)
   26669 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   26670 		v1.AuxInt = i0
   26671 		v1.Aux = s
   26672 		v1.AddArg(p)
   26673 		v1.AddArg(mem)
   26674 		v0.AddArg(v1)
   26675 		return true
   26676 	}
   26677 	// match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem))
   26678 	// 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)
   26679 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
   26680 	for {
   26681 		_ = v.Args[1]
   26682 		sh := v.Args[0]
   26683 		if sh.Op != OpS390XSLDconst {
   26684 			break
   26685 		}
   26686 		if sh.AuxInt != 8 {
   26687 			break
   26688 		}
   26689 		x1 := sh.Args[0]
   26690 		if x1.Op != OpS390XMOVBZload {
   26691 			break
   26692 		}
   26693 		i1 := x1.AuxInt
   26694 		s := x1.Aux
   26695 		_ = x1.Args[1]
   26696 		p := x1.Args[0]
   26697 		mem := x1.Args[1]
   26698 		x0 := v.Args[1]
   26699 		if x0.Op != OpS390XMOVBZload {
   26700 			break
   26701 		}
   26702 		i0 := x0.AuxInt
   26703 		if x0.Aux != s {
   26704 			break
   26705 		}
   26706 		_ = x0.Args[1]
   26707 		if p != x0.Args[0] {
   26708 			break
   26709 		}
   26710 		if mem != x0.Args[1] {
   26711 			break
   26712 		}
   26713 		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)) {
   26714 			break
   26715 		}
   26716 		b = mergePoint(b, x0, x1)
   26717 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   26718 		v.reset(OpCopy)
   26719 		v.AddArg(v0)
   26720 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   26721 		v1.AuxInt = i0
   26722 		v1.Aux = s
   26723 		v1.AddArg(p)
   26724 		v1.AddArg(mem)
   26725 		v0.AddArg(v1)
   26726 		return true
   26727 	}
   26728 	// match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))))
   26729 	// 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)
   26730 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem))
   26731 	for {
   26732 		_ = v.Args[1]
   26733 		r0 := v.Args[0]
   26734 		if r0.Op != OpS390XMOVHZreg {
   26735 			break
   26736 		}
   26737 		x0 := r0.Args[0]
   26738 		if x0.Op != OpS390XMOVHBRload {
   26739 			break
   26740 		}
   26741 		i0 := x0.AuxInt
   26742 		s := x0.Aux
   26743 		_ = x0.Args[1]
   26744 		p := x0.Args[0]
   26745 		mem := x0.Args[1]
   26746 		sh := v.Args[1]
   26747 		if sh.Op != OpS390XSLDconst {
   26748 			break
   26749 		}
   26750 		if sh.AuxInt != 16 {
   26751 			break
   26752 		}
   26753 		r1 := sh.Args[0]
   26754 		if r1.Op != OpS390XMOVHZreg {
   26755 			break
   26756 		}
   26757 		x1 := r1.Args[0]
   26758 		if x1.Op != OpS390XMOVHBRload {
   26759 			break
   26760 		}
   26761 		i1 := x1.AuxInt
   26762 		if x1.Aux != s {
   26763 			break
   26764 		}
   26765 		_ = x1.Args[1]
   26766 		if p != x1.Args[0] {
   26767 			break
   26768 		}
   26769 		if mem != x1.Args[1] {
   26770 			break
   26771 		}
   26772 		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)) {
   26773 			break
   26774 		}
   26775 		b = mergePoint(b, x0, x1)
   26776 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   26777 		v.reset(OpCopy)
   26778 		v.AddArg(v0)
   26779 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   26780 		v1.AuxInt = i0
   26781 		v1.Aux = s
   26782 		v1.AddArg(p)
   26783 		v1.AddArg(mem)
   26784 		v0.AddArg(v1)
   26785 		return true
   26786 	}
   26787 	return false
   26788 }
   26789 func rewriteValueS390X_OpS390XOR_90(v *Value) bool {
   26790 	b := v.Block
   26791 	_ = b
   26792 	typ := &b.Func.Config.Types
   26793 	_ = typ
   26794 	// match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))
   26795 	// 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)
   26796 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem))
   26797 	for {
   26798 		_ = v.Args[1]
   26799 		sh := v.Args[0]
   26800 		if sh.Op != OpS390XSLDconst {
   26801 			break
   26802 		}
   26803 		if sh.AuxInt != 16 {
   26804 			break
   26805 		}
   26806 		r1 := sh.Args[0]
   26807 		if r1.Op != OpS390XMOVHZreg {
   26808 			break
   26809 		}
   26810 		x1 := r1.Args[0]
   26811 		if x1.Op != OpS390XMOVHBRload {
   26812 			break
   26813 		}
   26814 		i1 := x1.AuxInt
   26815 		s := x1.Aux
   26816 		_ = x1.Args[1]
   26817 		p := x1.Args[0]
   26818 		mem := x1.Args[1]
   26819 		r0 := v.Args[1]
   26820 		if r0.Op != OpS390XMOVHZreg {
   26821 			break
   26822 		}
   26823 		x0 := r0.Args[0]
   26824 		if x0.Op != OpS390XMOVHBRload {
   26825 			break
   26826 		}
   26827 		i0 := x0.AuxInt
   26828 		if x0.Aux != s {
   26829 			break
   26830 		}
   26831 		_ = x0.Args[1]
   26832 		if p != x0.Args[0] {
   26833 			break
   26834 		}
   26835 		if mem != x0.Args[1] {
   26836 			break
   26837 		}
   26838 		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)) {
   26839 			break
   26840 		}
   26841 		b = mergePoint(b, x0, x1)
   26842 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   26843 		v.reset(OpCopy)
   26844 		v.AddArg(v0)
   26845 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   26846 		v1.AuxInt = i0
   26847 		v1.Aux = s
   26848 		v1.AddArg(p)
   26849 		v1.AddArg(mem)
   26850 		v0.AddArg(v1)
   26851 		return true
   26852 	}
   26853 	// match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))))
   26854 	// 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)
   26855 	// result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem)
   26856 	for {
   26857 		_ = v.Args[1]
   26858 		r0 := v.Args[0]
   26859 		if r0.Op != OpS390XMOVWZreg {
   26860 			break
   26861 		}
   26862 		x0 := r0.Args[0]
   26863 		if x0.Op != OpS390XMOVWBRload {
   26864 			break
   26865 		}
   26866 		i0 := x0.AuxInt
   26867 		s := x0.Aux
   26868 		_ = x0.Args[1]
   26869 		p := x0.Args[0]
   26870 		mem := x0.Args[1]
   26871 		sh := v.Args[1]
   26872 		if sh.Op != OpS390XSLDconst {
   26873 			break
   26874 		}
   26875 		if sh.AuxInt != 32 {
   26876 			break
   26877 		}
   26878 		r1 := sh.Args[0]
   26879 		if r1.Op != OpS390XMOVWZreg {
   26880 			break
   26881 		}
   26882 		x1 := r1.Args[0]
   26883 		if x1.Op != OpS390XMOVWBRload {
   26884 			break
   26885 		}
   26886 		i1 := x1.AuxInt
   26887 		if x1.Aux != s {
   26888 			break
   26889 		}
   26890 		_ = x1.Args[1]
   26891 		if p != x1.Args[0] {
   26892 			break
   26893 		}
   26894 		if mem != x1.Args[1] {
   26895 			break
   26896 		}
   26897 		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)) {
   26898 			break
   26899 		}
   26900 		b = mergePoint(b, x0, x1)
   26901 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64)
   26902 		v.reset(OpCopy)
   26903 		v.AddArg(v0)
   26904 		v0.AuxInt = i0
   26905 		v0.Aux = s
   26906 		v0.AddArg(p)
   26907 		v0.AddArg(mem)
   26908 		return true
   26909 	}
   26910 	// match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)))
   26911 	// 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)
   26912 	// result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem)
   26913 	for {
   26914 		_ = v.Args[1]
   26915 		sh := v.Args[0]
   26916 		if sh.Op != OpS390XSLDconst {
   26917 			break
   26918 		}
   26919 		if sh.AuxInt != 32 {
   26920 			break
   26921 		}
   26922 		r1 := sh.Args[0]
   26923 		if r1.Op != OpS390XMOVWZreg {
   26924 			break
   26925 		}
   26926 		x1 := r1.Args[0]
   26927 		if x1.Op != OpS390XMOVWBRload {
   26928 			break
   26929 		}
   26930 		i1 := x1.AuxInt
   26931 		s := x1.Aux
   26932 		_ = x1.Args[1]
   26933 		p := x1.Args[0]
   26934 		mem := x1.Args[1]
   26935 		r0 := v.Args[1]
   26936 		if r0.Op != OpS390XMOVWZreg {
   26937 			break
   26938 		}
   26939 		x0 := r0.Args[0]
   26940 		if x0.Op != OpS390XMOVWBRload {
   26941 			break
   26942 		}
   26943 		i0 := x0.AuxInt
   26944 		if x0.Aux != s {
   26945 			break
   26946 		}
   26947 		_ = x0.Args[1]
   26948 		if p != x0.Args[0] {
   26949 			break
   26950 		}
   26951 		if mem != x0.Args[1] {
   26952 			break
   26953 		}
   26954 		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)) {
   26955 			break
   26956 		}
   26957 		b = mergePoint(b, x0, x1)
   26958 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64)
   26959 		v.reset(OpCopy)
   26960 		v.AddArg(v0)
   26961 		v0.AuxInt = i0
   26962 		v0.Aux = s
   26963 		v0.AddArg(p)
   26964 		v0.AddArg(mem)
   26965 		return true
   26966 	}
   26967 	// match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y))
   26968 	// 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)
   26969 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   26970 	for {
   26971 		_ = v.Args[1]
   26972 		s1 := v.Args[0]
   26973 		if s1.Op != OpS390XSLDconst {
   26974 			break
   26975 		}
   26976 		j1 := s1.AuxInt
   26977 		x1 := s1.Args[0]
   26978 		if x1.Op != OpS390XMOVBZload {
   26979 			break
   26980 		}
   26981 		i1 := x1.AuxInt
   26982 		s := x1.Aux
   26983 		_ = x1.Args[1]
   26984 		p := x1.Args[0]
   26985 		mem := x1.Args[1]
   26986 		or := v.Args[1]
   26987 		if or.Op != OpS390XOR {
   26988 			break
   26989 		}
   26990 		_ = or.Args[1]
   26991 		s0 := or.Args[0]
   26992 		if s0.Op != OpS390XSLDconst {
   26993 			break
   26994 		}
   26995 		j0 := s0.AuxInt
   26996 		x0 := s0.Args[0]
   26997 		if x0.Op != OpS390XMOVBZload {
   26998 			break
   26999 		}
   27000 		i0 := x0.AuxInt
   27001 		if x0.Aux != s {
   27002 			break
   27003 		}
   27004 		_ = x0.Args[1]
   27005 		if p != x0.Args[0] {
   27006 			break
   27007 		}
   27008 		if mem != x0.Args[1] {
   27009 			break
   27010 		}
   27011 		y := or.Args[1]
   27012 		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)) {
   27013 			break
   27014 		}
   27015 		b = mergePoint(b, x0, x1)
   27016 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27017 		v.reset(OpCopy)
   27018 		v.AddArg(v0)
   27019 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27020 		v1.AuxInt = j0
   27021 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27022 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   27023 		v3.AuxInt = i0
   27024 		v3.Aux = s
   27025 		v3.AddArg(p)
   27026 		v3.AddArg(mem)
   27027 		v2.AddArg(v3)
   27028 		v1.AddArg(v2)
   27029 		v0.AddArg(v1)
   27030 		v0.AddArg(y)
   27031 		return true
   27032 	}
   27033 	// match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))))
   27034 	// 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)
   27035 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   27036 	for {
   27037 		_ = v.Args[1]
   27038 		s1 := v.Args[0]
   27039 		if s1.Op != OpS390XSLDconst {
   27040 			break
   27041 		}
   27042 		j1 := s1.AuxInt
   27043 		x1 := s1.Args[0]
   27044 		if x1.Op != OpS390XMOVBZload {
   27045 			break
   27046 		}
   27047 		i1 := x1.AuxInt
   27048 		s := x1.Aux
   27049 		_ = x1.Args[1]
   27050 		p := x1.Args[0]
   27051 		mem := x1.Args[1]
   27052 		or := v.Args[1]
   27053 		if or.Op != OpS390XOR {
   27054 			break
   27055 		}
   27056 		_ = or.Args[1]
   27057 		y := or.Args[0]
   27058 		s0 := or.Args[1]
   27059 		if s0.Op != OpS390XSLDconst {
   27060 			break
   27061 		}
   27062 		j0 := s0.AuxInt
   27063 		x0 := s0.Args[0]
   27064 		if x0.Op != OpS390XMOVBZload {
   27065 			break
   27066 		}
   27067 		i0 := x0.AuxInt
   27068 		if x0.Aux != s {
   27069 			break
   27070 		}
   27071 		_ = x0.Args[1]
   27072 		if p != x0.Args[0] {
   27073 			break
   27074 		}
   27075 		if mem != x0.Args[1] {
   27076 			break
   27077 		}
   27078 		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)) {
   27079 			break
   27080 		}
   27081 		b = mergePoint(b, x0, x1)
   27082 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27083 		v.reset(OpCopy)
   27084 		v.AddArg(v0)
   27085 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27086 		v1.AuxInt = j0
   27087 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27088 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   27089 		v3.AuxInt = i0
   27090 		v3.Aux = s
   27091 		v3.AddArg(p)
   27092 		v3.AddArg(mem)
   27093 		v2.AddArg(v3)
   27094 		v1.AddArg(v2)
   27095 		v0.AddArg(v1)
   27096 		v0.AddArg(y)
   27097 		return true
   27098 	}
   27099 	// match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))
   27100 	// 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)
   27101 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   27102 	for {
   27103 		_ = v.Args[1]
   27104 		or := v.Args[0]
   27105 		if or.Op != OpS390XOR {
   27106 			break
   27107 		}
   27108 		_ = or.Args[1]
   27109 		s0 := or.Args[0]
   27110 		if s0.Op != OpS390XSLDconst {
   27111 			break
   27112 		}
   27113 		j0 := s0.AuxInt
   27114 		x0 := s0.Args[0]
   27115 		if x0.Op != OpS390XMOVBZload {
   27116 			break
   27117 		}
   27118 		i0 := x0.AuxInt
   27119 		s := x0.Aux
   27120 		_ = x0.Args[1]
   27121 		p := x0.Args[0]
   27122 		mem := x0.Args[1]
   27123 		y := or.Args[1]
   27124 		s1 := v.Args[1]
   27125 		if s1.Op != OpS390XSLDconst {
   27126 			break
   27127 		}
   27128 		j1 := s1.AuxInt
   27129 		x1 := s1.Args[0]
   27130 		if x1.Op != OpS390XMOVBZload {
   27131 			break
   27132 		}
   27133 		i1 := x1.AuxInt
   27134 		if x1.Aux != s {
   27135 			break
   27136 		}
   27137 		_ = x1.Args[1]
   27138 		if p != x1.Args[0] {
   27139 			break
   27140 		}
   27141 		if mem != x1.Args[1] {
   27142 			break
   27143 		}
   27144 		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)) {
   27145 			break
   27146 		}
   27147 		b = mergePoint(b, x0, x1)
   27148 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27149 		v.reset(OpCopy)
   27150 		v.AddArg(v0)
   27151 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27152 		v1.AuxInt = j0
   27153 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27154 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   27155 		v3.AuxInt = i0
   27156 		v3.Aux = s
   27157 		v3.AddArg(p)
   27158 		v3.AddArg(mem)
   27159 		v2.AddArg(v3)
   27160 		v1.AddArg(v2)
   27161 		v0.AddArg(v1)
   27162 		v0.AddArg(y)
   27163 		return true
   27164 	}
   27165 	// match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))
   27166 	// 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)
   27167 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   27168 	for {
   27169 		_ = v.Args[1]
   27170 		or := v.Args[0]
   27171 		if or.Op != OpS390XOR {
   27172 			break
   27173 		}
   27174 		_ = or.Args[1]
   27175 		y := or.Args[0]
   27176 		s0 := or.Args[1]
   27177 		if s0.Op != OpS390XSLDconst {
   27178 			break
   27179 		}
   27180 		j0 := s0.AuxInt
   27181 		x0 := s0.Args[0]
   27182 		if x0.Op != OpS390XMOVBZload {
   27183 			break
   27184 		}
   27185 		i0 := x0.AuxInt
   27186 		s := x0.Aux
   27187 		_ = x0.Args[1]
   27188 		p := x0.Args[0]
   27189 		mem := x0.Args[1]
   27190 		s1 := v.Args[1]
   27191 		if s1.Op != OpS390XSLDconst {
   27192 			break
   27193 		}
   27194 		j1 := s1.AuxInt
   27195 		x1 := s1.Args[0]
   27196 		if x1.Op != OpS390XMOVBZload {
   27197 			break
   27198 		}
   27199 		i1 := x1.AuxInt
   27200 		if x1.Aux != s {
   27201 			break
   27202 		}
   27203 		_ = x1.Args[1]
   27204 		if p != x1.Args[0] {
   27205 			break
   27206 		}
   27207 		if mem != x1.Args[1] {
   27208 			break
   27209 		}
   27210 		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)) {
   27211 			break
   27212 		}
   27213 		b = mergePoint(b, x0, x1)
   27214 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27215 		v.reset(OpCopy)
   27216 		v.AddArg(v0)
   27217 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27218 		v1.AuxInt = j0
   27219 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27220 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   27221 		v3.AuxInt = i0
   27222 		v3.Aux = s
   27223 		v3.AddArg(p)
   27224 		v3.AddArg(mem)
   27225 		v2.AddArg(v3)
   27226 		v1.AddArg(v2)
   27227 		v0.AddArg(v1)
   27228 		v0.AddArg(y)
   27229 		return true
   27230 	}
   27231 	// 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))
   27232 	// 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)
   27233 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
   27234 	for {
   27235 		_ = v.Args[1]
   27236 		s1 := v.Args[0]
   27237 		if s1.Op != OpS390XSLDconst {
   27238 			break
   27239 		}
   27240 		j1 := s1.AuxInt
   27241 		r1 := s1.Args[0]
   27242 		if r1.Op != OpS390XMOVHZreg {
   27243 			break
   27244 		}
   27245 		x1 := r1.Args[0]
   27246 		if x1.Op != OpS390XMOVHBRload {
   27247 			break
   27248 		}
   27249 		i1 := x1.AuxInt
   27250 		s := x1.Aux
   27251 		_ = x1.Args[1]
   27252 		p := x1.Args[0]
   27253 		mem := x1.Args[1]
   27254 		or := v.Args[1]
   27255 		if or.Op != OpS390XOR {
   27256 			break
   27257 		}
   27258 		_ = or.Args[1]
   27259 		s0 := or.Args[0]
   27260 		if s0.Op != OpS390XSLDconst {
   27261 			break
   27262 		}
   27263 		j0 := s0.AuxInt
   27264 		r0 := s0.Args[0]
   27265 		if r0.Op != OpS390XMOVHZreg {
   27266 			break
   27267 		}
   27268 		x0 := r0.Args[0]
   27269 		if x0.Op != OpS390XMOVHBRload {
   27270 			break
   27271 		}
   27272 		i0 := x0.AuxInt
   27273 		if x0.Aux != s {
   27274 			break
   27275 		}
   27276 		_ = x0.Args[1]
   27277 		if p != x0.Args[0] {
   27278 			break
   27279 		}
   27280 		if mem != x0.Args[1] {
   27281 			break
   27282 		}
   27283 		y := or.Args[1]
   27284 		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)) {
   27285 			break
   27286 		}
   27287 		b = mergePoint(b, x0, x1)
   27288 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27289 		v.reset(OpCopy)
   27290 		v.AddArg(v0)
   27291 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27292 		v1.AuxInt = j0
   27293 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   27294 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   27295 		v3.AuxInt = i0
   27296 		v3.Aux = s
   27297 		v3.AddArg(p)
   27298 		v3.AddArg(mem)
   27299 		v2.AddArg(v3)
   27300 		v1.AddArg(v2)
   27301 		v0.AddArg(v1)
   27302 		v0.AddArg(y)
   27303 		return true
   27304 	}
   27305 	// 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)))))
   27306 	// 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)
   27307 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
   27308 	for {
   27309 		_ = v.Args[1]
   27310 		s1 := v.Args[0]
   27311 		if s1.Op != OpS390XSLDconst {
   27312 			break
   27313 		}
   27314 		j1 := s1.AuxInt
   27315 		r1 := s1.Args[0]
   27316 		if r1.Op != OpS390XMOVHZreg {
   27317 			break
   27318 		}
   27319 		x1 := r1.Args[0]
   27320 		if x1.Op != OpS390XMOVHBRload {
   27321 			break
   27322 		}
   27323 		i1 := x1.AuxInt
   27324 		s := x1.Aux
   27325 		_ = x1.Args[1]
   27326 		p := x1.Args[0]
   27327 		mem := x1.Args[1]
   27328 		or := v.Args[1]
   27329 		if or.Op != OpS390XOR {
   27330 			break
   27331 		}
   27332 		_ = or.Args[1]
   27333 		y := or.Args[0]
   27334 		s0 := or.Args[1]
   27335 		if s0.Op != OpS390XSLDconst {
   27336 			break
   27337 		}
   27338 		j0 := s0.AuxInt
   27339 		r0 := s0.Args[0]
   27340 		if r0.Op != OpS390XMOVHZreg {
   27341 			break
   27342 		}
   27343 		x0 := r0.Args[0]
   27344 		if x0.Op != OpS390XMOVHBRload {
   27345 			break
   27346 		}
   27347 		i0 := x0.AuxInt
   27348 		if x0.Aux != s {
   27349 			break
   27350 		}
   27351 		_ = x0.Args[1]
   27352 		if p != x0.Args[0] {
   27353 			break
   27354 		}
   27355 		if mem != x0.Args[1] {
   27356 			break
   27357 		}
   27358 		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)) {
   27359 			break
   27360 		}
   27361 		b = mergePoint(b, x0, x1)
   27362 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27363 		v.reset(OpCopy)
   27364 		v.AddArg(v0)
   27365 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27366 		v1.AuxInt = j0
   27367 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   27368 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   27369 		v3.AuxInt = i0
   27370 		v3.Aux = s
   27371 		v3.AddArg(p)
   27372 		v3.AddArg(mem)
   27373 		v2.AddArg(v3)
   27374 		v1.AddArg(v2)
   27375 		v0.AddArg(v1)
   27376 		v0.AddArg(y)
   27377 		return true
   27378 	}
   27379 	// 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))))
   27380 	// 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)
   27381 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
   27382 	for {
   27383 		_ = v.Args[1]
   27384 		or := v.Args[0]
   27385 		if or.Op != OpS390XOR {
   27386 			break
   27387 		}
   27388 		_ = or.Args[1]
   27389 		s0 := or.Args[0]
   27390 		if s0.Op != OpS390XSLDconst {
   27391 			break
   27392 		}
   27393 		j0 := s0.AuxInt
   27394 		r0 := s0.Args[0]
   27395 		if r0.Op != OpS390XMOVHZreg {
   27396 			break
   27397 		}
   27398 		x0 := r0.Args[0]
   27399 		if x0.Op != OpS390XMOVHBRload {
   27400 			break
   27401 		}
   27402 		i0 := x0.AuxInt
   27403 		s := x0.Aux
   27404 		_ = x0.Args[1]
   27405 		p := x0.Args[0]
   27406 		mem := x0.Args[1]
   27407 		y := or.Args[1]
   27408 		s1 := v.Args[1]
   27409 		if s1.Op != OpS390XSLDconst {
   27410 			break
   27411 		}
   27412 		j1 := s1.AuxInt
   27413 		r1 := s1.Args[0]
   27414 		if r1.Op != OpS390XMOVHZreg {
   27415 			break
   27416 		}
   27417 		x1 := r1.Args[0]
   27418 		if x1.Op != OpS390XMOVHBRload {
   27419 			break
   27420 		}
   27421 		i1 := x1.AuxInt
   27422 		if x1.Aux != s {
   27423 			break
   27424 		}
   27425 		_ = x1.Args[1]
   27426 		if p != x1.Args[0] {
   27427 			break
   27428 		}
   27429 		if mem != x1.Args[1] {
   27430 			break
   27431 		}
   27432 		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)) {
   27433 			break
   27434 		}
   27435 		b = mergePoint(b, x0, x1)
   27436 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27437 		v.reset(OpCopy)
   27438 		v.AddArg(v0)
   27439 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27440 		v1.AuxInt = j0
   27441 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   27442 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   27443 		v3.AuxInt = i0
   27444 		v3.Aux = s
   27445 		v3.AddArg(p)
   27446 		v3.AddArg(mem)
   27447 		v2.AddArg(v3)
   27448 		v1.AddArg(v2)
   27449 		v0.AddArg(v1)
   27450 		v0.AddArg(y)
   27451 		return true
   27452 	}
   27453 	return false
   27454 }
   27455 func rewriteValueS390X_OpS390XOR_100(v *Value) bool {
   27456 	b := v.Block
   27457 	_ = b
   27458 	typ := &b.Func.Config.Types
   27459 	_ = typ
   27460 	// 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))))
   27461 	// 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)
   27462 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
   27463 	for {
   27464 		_ = v.Args[1]
   27465 		or := v.Args[0]
   27466 		if or.Op != OpS390XOR {
   27467 			break
   27468 		}
   27469 		_ = or.Args[1]
   27470 		y := or.Args[0]
   27471 		s0 := or.Args[1]
   27472 		if s0.Op != OpS390XSLDconst {
   27473 			break
   27474 		}
   27475 		j0 := s0.AuxInt
   27476 		r0 := s0.Args[0]
   27477 		if r0.Op != OpS390XMOVHZreg {
   27478 			break
   27479 		}
   27480 		x0 := r0.Args[0]
   27481 		if x0.Op != OpS390XMOVHBRload {
   27482 			break
   27483 		}
   27484 		i0 := x0.AuxInt
   27485 		s := x0.Aux
   27486 		_ = x0.Args[1]
   27487 		p := x0.Args[0]
   27488 		mem := x0.Args[1]
   27489 		s1 := v.Args[1]
   27490 		if s1.Op != OpS390XSLDconst {
   27491 			break
   27492 		}
   27493 		j1 := s1.AuxInt
   27494 		r1 := s1.Args[0]
   27495 		if r1.Op != OpS390XMOVHZreg {
   27496 			break
   27497 		}
   27498 		x1 := r1.Args[0]
   27499 		if x1.Op != OpS390XMOVHBRload {
   27500 			break
   27501 		}
   27502 		i1 := x1.AuxInt
   27503 		if x1.Aux != s {
   27504 			break
   27505 		}
   27506 		_ = x1.Args[1]
   27507 		if p != x1.Args[0] {
   27508 			break
   27509 		}
   27510 		if mem != x1.Args[1] {
   27511 			break
   27512 		}
   27513 		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)) {
   27514 			break
   27515 		}
   27516 		b = mergePoint(b, x0, x1)
   27517 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   27518 		v.reset(OpCopy)
   27519 		v.AddArg(v0)
   27520 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   27521 		v1.AuxInt = j0
   27522 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   27523 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   27524 		v3.AuxInt = i0
   27525 		v3.Aux = s
   27526 		v3.AddArg(p)
   27527 		v3.AddArg(mem)
   27528 		v2.AddArg(v3)
   27529 		v1.AddArg(v2)
   27530 		v0.AddArg(v1)
   27531 		v0.AddArg(y)
   27532 		return true
   27533 	}
   27534 	// match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)))
   27535 	// 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)
   27536 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27537 	for {
   27538 		_ = v.Args[1]
   27539 		x0 := v.Args[0]
   27540 		if x0.Op != OpS390XMOVBZloadidx {
   27541 			break
   27542 		}
   27543 		i0 := x0.AuxInt
   27544 		s := x0.Aux
   27545 		_ = x0.Args[2]
   27546 		p := x0.Args[0]
   27547 		idx := x0.Args[1]
   27548 		mem := x0.Args[2]
   27549 		sh := v.Args[1]
   27550 		if sh.Op != OpS390XSLDconst {
   27551 			break
   27552 		}
   27553 		if sh.AuxInt != 8 {
   27554 			break
   27555 		}
   27556 		x1 := sh.Args[0]
   27557 		if x1.Op != OpS390XMOVBZloadidx {
   27558 			break
   27559 		}
   27560 		i1 := x1.AuxInt
   27561 		if x1.Aux != s {
   27562 			break
   27563 		}
   27564 		_ = x1.Args[2]
   27565 		if p != x1.Args[0] {
   27566 			break
   27567 		}
   27568 		if idx != x1.Args[1] {
   27569 			break
   27570 		}
   27571 		if mem != x1.Args[2] {
   27572 			break
   27573 		}
   27574 		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)) {
   27575 			break
   27576 		}
   27577 		b = mergePoint(b, x0, x1)
   27578 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27579 		v.reset(OpCopy)
   27580 		v.AddArg(v0)
   27581 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27582 		v1.AuxInt = i0
   27583 		v1.Aux = s
   27584 		v1.AddArg(p)
   27585 		v1.AddArg(idx)
   27586 		v1.AddArg(mem)
   27587 		v0.AddArg(v1)
   27588 		return true
   27589 	}
   27590 	// match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)))
   27591 	// 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)
   27592 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27593 	for {
   27594 		_ = v.Args[1]
   27595 		x0 := v.Args[0]
   27596 		if x0.Op != OpS390XMOVBZloadidx {
   27597 			break
   27598 		}
   27599 		i0 := x0.AuxInt
   27600 		s := x0.Aux
   27601 		_ = x0.Args[2]
   27602 		idx := x0.Args[0]
   27603 		p := x0.Args[1]
   27604 		mem := x0.Args[2]
   27605 		sh := v.Args[1]
   27606 		if sh.Op != OpS390XSLDconst {
   27607 			break
   27608 		}
   27609 		if sh.AuxInt != 8 {
   27610 			break
   27611 		}
   27612 		x1 := sh.Args[0]
   27613 		if x1.Op != OpS390XMOVBZloadidx {
   27614 			break
   27615 		}
   27616 		i1 := x1.AuxInt
   27617 		if x1.Aux != s {
   27618 			break
   27619 		}
   27620 		_ = x1.Args[2]
   27621 		if p != x1.Args[0] {
   27622 			break
   27623 		}
   27624 		if idx != x1.Args[1] {
   27625 			break
   27626 		}
   27627 		if mem != x1.Args[2] {
   27628 			break
   27629 		}
   27630 		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)) {
   27631 			break
   27632 		}
   27633 		b = mergePoint(b, x0, x1)
   27634 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27635 		v.reset(OpCopy)
   27636 		v.AddArg(v0)
   27637 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27638 		v1.AuxInt = i0
   27639 		v1.Aux = s
   27640 		v1.AddArg(p)
   27641 		v1.AddArg(idx)
   27642 		v1.AddArg(mem)
   27643 		v0.AddArg(v1)
   27644 		return true
   27645 	}
   27646 	// match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)))
   27647 	// 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)
   27648 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27649 	for {
   27650 		_ = v.Args[1]
   27651 		x0 := v.Args[0]
   27652 		if x0.Op != OpS390XMOVBZloadidx {
   27653 			break
   27654 		}
   27655 		i0 := x0.AuxInt
   27656 		s := x0.Aux
   27657 		_ = x0.Args[2]
   27658 		p := x0.Args[0]
   27659 		idx := x0.Args[1]
   27660 		mem := x0.Args[2]
   27661 		sh := v.Args[1]
   27662 		if sh.Op != OpS390XSLDconst {
   27663 			break
   27664 		}
   27665 		if sh.AuxInt != 8 {
   27666 			break
   27667 		}
   27668 		x1 := sh.Args[0]
   27669 		if x1.Op != OpS390XMOVBZloadidx {
   27670 			break
   27671 		}
   27672 		i1 := x1.AuxInt
   27673 		if x1.Aux != s {
   27674 			break
   27675 		}
   27676 		_ = x1.Args[2]
   27677 		if idx != x1.Args[0] {
   27678 			break
   27679 		}
   27680 		if p != x1.Args[1] {
   27681 			break
   27682 		}
   27683 		if mem != x1.Args[2] {
   27684 			break
   27685 		}
   27686 		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)) {
   27687 			break
   27688 		}
   27689 		b = mergePoint(b, x0, x1)
   27690 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27691 		v.reset(OpCopy)
   27692 		v.AddArg(v0)
   27693 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27694 		v1.AuxInt = i0
   27695 		v1.Aux = s
   27696 		v1.AddArg(p)
   27697 		v1.AddArg(idx)
   27698 		v1.AddArg(mem)
   27699 		v0.AddArg(v1)
   27700 		return true
   27701 	}
   27702 	// match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)))
   27703 	// 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)
   27704 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27705 	for {
   27706 		_ = v.Args[1]
   27707 		x0 := v.Args[0]
   27708 		if x0.Op != OpS390XMOVBZloadidx {
   27709 			break
   27710 		}
   27711 		i0 := x0.AuxInt
   27712 		s := x0.Aux
   27713 		_ = x0.Args[2]
   27714 		idx := x0.Args[0]
   27715 		p := x0.Args[1]
   27716 		mem := x0.Args[2]
   27717 		sh := v.Args[1]
   27718 		if sh.Op != OpS390XSLDconst {
   27719 			break
   27720 		}
   27721 		if sh.AuxInt != 8 {
   27722 			break
   27723 		}
   27724 		x1 := sh.Args[0]
   27725 		if x1.Op != OpS390XMOVBZloadidx {
   27726 			break
   27727 		}
   27728 		i1 := x1.AuxInt
   27729 		if x1.Aux != s {
   27730 			break
   27731 		}
   27732 		_ = x1.Args[2]
   27733 		if idx != x1.Args[0] {
   27734 			break
   27735 		}
   27736 		if p != x1.Args[1] {
   27737 			break
   27738 		}
   27739 		if mem != x1.Args[2] {
   27740 			break
   27741 		}
   27742 		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)) {
   27743 			break
   27744 		}
   27745 		b = mergePoint(b, x0, x1)
   27746 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27747 		v.reset(OpCopy)
   27748 		v.AddArg(v0)
   27749 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27750 		v1.AuxInt = i0
   27751 		v1.Aux = s
   27752 		v1.AddArg(p)
   27753 		v1.AddArg(idx)
   27754 		v1.AddArg(mem)
   27755 		v0.AddArg(v1)
   27756 		return true
   27757 	}
   27758 	// match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem))
   27759 	// 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)
   27760 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27761 	for {
   27762 		_ = v.Args[1]
   27763 		sh := v.Args[0]
   27764 		if sh.Op != OpS390XSLDconst {
   27765 			break
   27766 		}
   27767 		if sh.AuxInt != 8 {
   27768 			break
   27769 		}
   27770 		x1 := sh.Args[0]
   27771 		if x1.Op != OpS390XMOVBZloadidx {
   27772 			break
   27773 		}
   27774 		i1 := x1.AuxInt
   27775 		s := x1.Aux
   27776 		_ = x1.Args[2]
   27777 		p := x1.Args[0]
   27778 		idx := x1.Args[1]
   27779 		mem := x1.Args[2]
   27780 		x0 := v.Args[1]
   27781 		if x0.Op != OpS390XMOVBZloadidx {
   27782 			break
   27783 		}
   27784 		i0 := x0.AuxInt
   27785 		if x0.Aux != s {
   27786 			break
   27787 		}
   27788 		_ = x0.Args[2]
   27789 		if p != x0.Args[0] {
   27790 			break
   27791 		}
   27792 		if idx != x0.Args[1] {
   27793 			break
   27794 		}
   27795 		if mem != x0.Args[2] {
   27796 			break
   27797 		}
   27798 		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)) {
   27799 			break
   27800 		}
   27801 		b = mergePoint(b, x0, x1)
   27802 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27803 		v.reset(OpCopy)
   27804 		v.AddArg(v0)
   27805 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27806 		v1.AuxInt = i0
   27807 		v1.Aux = s
   27808 		v1.AddArg(p)
   27809 		v1.AddArg(idx)
   27810 		v1.AddArg(mem)
   27811 		v0.AddArg(v1)
   27812 		return true
   27813 	}
   27814 	// match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem))
   27815 	// 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)
   27816 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27817 	for {
   27818 		_ = v.Args[1]
   27819 		sh := v.Args[0]
   27820 		if sh.Op != OpS390XSLDconst {
   27821 			break
   27822 		}
   27823 		if sh.AuxInt != 8 {
   27824 			break
   27825 		}
   27826 		x1 := sh.Args[0]
   27827 		if x1.Op != OpS390XMOVBZloadidx {
   27828 			break
   27829 		}
   27830 		i1 := x1.AuxInt
   27831 		s := x1.Aux
   27832 		_ = x1.Args[2]
   27833 		idx := x1.Args[0]
   27834 		p := x1.Args[1]
   27835 		mem := x1.Args[2]
   27836 		x0 := v.Args[1]
   27837 		if x0.Op != OpS390XMOVBZloadidx {
   27838 			break
   27839 		}
   27840 		i0 := x0.AuxInt
   27841 		if x0.Aux != s {
   27842 			break
   27843 		}
   27844 		_ = x0.Args[2]
   27845 		if p != x0.Args[0] {
   27846 			break
   27847 		}
   27848 		if idx != x0.Args[1] {
   27849 			break
   27850 		}
   27851 		if mem != x0.Args[2] {
   27852 			break
   27853 		}
   27854 		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)) {
   27855 			break
   27856 		}
   27857 		b = mergePoint(b, x0, x1)
   27858 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27859 		v.reset(OpCopy)
   27860 		v.AddArg(v0)
   27861 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27862 		v1.AuxInt = i0
   27863 		v1.Aux = s
   27864 		v1.AddArg(p)
   27865 		v1.AddArg(idx)
   27866 		v1.AddArg(mem)
   27867 		v0.AddArg(v1)
   27868 		return true
   27869 	}
   27870 	// match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem))
   27871 	// 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)
   27872 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27873 	for {
   27874 		_ = v.Args[1]
   27875 		sh := v.Args[0]
   27876 		if sh.Op != OpS390XSLDconst {
   27877 			break
   27878 		}
   27879 		if sh.AuxInt != 8 {
   27880 			break
   27881 		}
   27882 		x1 := sh.Args[0]
   27883 		if x1.Op != OpS390XMOVBZloadidx {
   27884 			break
   27885 		}
   27886 		i1 := x1.AuxInt
   27887 		s := x1.Aux
   27888 		_ = x1.Args[2]
   27889 		p := x1.Args[0]
   27890 		idx := x1.Args[1]
   27891 		mem := x1.Args[2]
   27892 		x0 := v.Args[1]
   27893 		if x0.Op != OpS390XMOVBZloadidx {
   27894 			break
   27895 		}
   27896 		i0 := x0.AuxInt
   27897 		if x0.Aux != s {
   27898 			break
   27899 		}
   27900 		_ = x0.Args[2]
   27901 		if idx != x0.Args[0] {
   27902 			break
   27903 		}
   27904 		if p != x0.Args[1] {
   27905 			break
   27906 		}
   27907 		if mem != x0.Args[2] {
   27908 			break
   27909 		}
   27910 		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)) {
   27911 			break
   27912 		}
   27913 		b = mergePoint(b, x0, x1)
   27914 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27915 		v.reset(OpCopy)
   27916 		v.AddArg(v0)
   27917 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27918 		v1.AuxInt = i0
   27919 		v1.Aux = s
   27920 		v1.AddArg(p)
   27921 		v1.AddArg(idx)
   27922 		v1.AddArg(mem)
   27923 		v0.AddArg(v1)
   27924 		return true
   27925 	}
   27926 	// match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem))
   27927 	// 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)
   27928 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   27929 	for {
   27930 		_ = v.Args[1]
   27931 		sh := v.Args[0]
   27932 		if sh.Op != OpS390XSLDconst {
   27933 			break
   27934 		}
   27935 		if sh.AuxInt != 8 {
   27936 			break
   27937 		}
   27938 		x1 := sh.Args[0]
   27939 		if x1.Op != OpS390XMOVBZloadidx {
   27940 			break
   27941 		}
   27942 		i1 := x1.AuxInt
   27943 		s := x1.Aux
   27944 		_ = x1.Args[2]
   27945 		idx := x1.Args[0]
   27946 		p := x1.Args[1]
   27947 		mem := x1.Args[2]
   27948 		x0 := v.Args[1]
   27949 		if x0.Op != OpS390XMOVBZloadidx {
   27950 			break
   27951 		}
   27952 		i0 := x0.AuxInt
   27953 		if x0.Aux != s {
   27954 			break
   27955 		}
   27956 		_ = x0.Args[2]
   27957 		if idx != x0.Args[0] {
   27958 			break
   27959 		}
   27960 		if p != x0.Args[1] {
   27961 			break
   27962 		}
   27963 		if mem != x0.Args[2] {
   27964 			break
   27965 		}
   27966 		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)) {
   27967 			break
   27968 		}
   27969 		b = mergePoint(b, x0, x1)
   27970 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   27971 		v.reset(OpCopy)
   27972 		v.AddArg(v0)
   27973 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   27974 		v1.AuxInt = i0
   27975 		v1.Aux = s
   27976 		v1.AddArg(p)
   27977 		v1.AddArg(idx)
   27978 		v1.AddArg(mem)
   27979 		v0.AddArg(v1)
   27980 		return true
   27981 	}
   27982 	// match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))))
   27983 	// 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)
   27984 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   27985 	for {
   27986 		_ = v.Args[1]
   27987 		r0 := v.Args[0]
   27988 		if r0.Op != OpS390XMOVHZreg {
   27989 			break
   27990 		}
   27991 		x0 := r0.Args[0]
   27992 		if x0.Op != OpS390XMOVHBRloadidx {
   27993 			break
   27994 		}
   27995 		i0 := x0.AuxInt
   27996 		s := x0.Aux
   27997 		_ = x0.Args[2]
   27998 		p := x0.Args[0]
   27999 		idx := x0.Args[1]
   28000 		mem := x0.Args[2]
   28001 		sh := v.Args[1]
   28002 		if sh.Op != OpS390XSLDconst {
   28003 			break
   28004 		}
   28005 		if sh.AuxInt != 16 {
   28006 			break
   28007 		}
   28008 		r1 := sh.Args[0]
   28009 		if r1.Op != OpS390XMOVHZreg {
   28010 			break
   28011 		}
   28012 		x1 := r1.Args[0]
   28013 		if x1.Op != OpS390XMOVHBRloadidx {
   28014 			break
   28015 		}
   28016 		i1 := x1.AuxInt
   28017 		if x1.Aux != s {
   28018 			break
   28019 		}
   28020 		_ = x1.Args[2]
   28021 		if p != x1.Args[0] {
   28022 			break
   28023 		}
   28024 		if idx != x1.Args[1] {
   28025 			break
   28026 		}
   28027 		if mem != x1.Args[2] {
   28028 			break
   28029 		}
   28030 		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)) {
   28031 			break
   28032 		}
   28033 		b = mergePoint(b, x0, x1)
   28034 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28035 		v.reset(OpCopy)
   28036 		v.AddArg(v0)
   28037 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28038 		v1.AuxInt = i0
   28039 		v1.Aux = s
   28040 		v1.AddArg(p)
   28041 		v1.AddArg(idx)
   28042 		v1.AddArg(mem)
   28043 		v0.AddArg(v1)
   28044 		return true
   28045 	}
   28046 	return false
   28047 }
   28048 func rewriteValueS390X_OpS390XOR_110(v *Value) bool {
   28049 	b := v.Block
   28050 	_ = b
   28051 	typ := &b.Func.Config.Types
   28052 	_ = typ
   28053 	// match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))))
   28054 	// 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)
   28055 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28056 	for {
   28057 		_ = v.Args[1]
   28058 		r0 := v.Args[0]
   28059 		if r0.Op != OpS390XMOVHZreg {
   28060 			break
   28061 		}
   28062 		x0 := r0.Args[0]
   28063 		if x0.Op != OpS390XMOVHBRloadidx {
   28064 			break
   28065 		}
   28066 		i0 := x0.AuxInt
   28067 		s := x0.Aux
   28068 		_ = x0.Args[2]
   28069 		idx := x0.Args[0]
   28070 		p := x0.Args[1]
   28071 		mem := x0.Args[2]
   28072 		sh := v.Args[1]
   28073 		if sh.Op != OpS390XSLDconst {
   28074 			break
   28075 		}
   28076 		if sh.AuxInt != 16 {
   28077 			break
   28078 		}
   28079 		r1 := sh.Args[0]
   28080 		if r1.Op != OpS390XMOVHZreg {
   28081 			break
   28082 		}
   28083 		x1 := r1.Args[0]
   28084 		if x1.Op != OpS390XMOVHBRloadidx {
   28085 			break
   28086 		}
   28087 		i1 := x1.AuxInt
   28088 		if x1.Aux != s {
   28089 			break
   28090 		}
   28091 		_ = x1.Args[2]
   28092 		if p != x1.Args[0] {
   28093 			break
   28094 		}
   28095 		if idx != x1.Args[1] {
   28096 			break
   28097 		}
   28098 		if mem != x1.Args[2] {
   28099 			break
   28100 		}
   28101 		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)) {
   28102 			break
   28103 		}
   28104 		b = mergePoint(b, x0, x1)
   28105 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28106 		v.reset(OpCopy)
   28107 		v.AddArg(v0)
   28108 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28109 		v1.AuxInt = i0
   28110 		v1.Aux = s
   28111 		v1.AddArg(p)
   28112 		v1.AddArg(idx)
   28113 		v1.AddArg(mem)
   28114 		v0.AddArg(v1)
   28115 		return true
   28116 	}
   28117 	// match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))))
   28118 	// 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)
   28119 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28120 	for {
   28121 		_ = v.Args[1]
   28122 		r0 := v.Args[0]
   28123 		if r0.Op != OpS390XMOVHZreg {
   28124 			break
   28125 		}
   28126 		x0 := r0.Args[0]
   28127 		if x0.Op != OpS390XMOVHBRloadidx {
   28128 			break
   28129 		}
   28130 		i0 := x0.AuxInt
   28131 		s := x0.Aux
   28132 		_ = x0.Args[2]
   28133 		p := x0.Args[0]
   28134 		idx := x0.Args[1]
   28135 		mem := x0.Args[2]
   28136 		sh := v.Args[1]
   28137 		if sh.Op != OpS390XSLDconst {
   28138 			break
   28139 		}
   28140 		if sh.AuxInt != 16 {
   28141 			break
   28142 		}
   28143 		r1 := sh.Args[0]
   28144 		if r1.Op != OpS390XMOVHZreg {
   28145 			break
   28146 		}
   28147 		x1 := r1.Args[0]
   28148 		if x1.Op != OpS390XMOVHBRloadidx {
   28149 			break
   28150 		}
   28151 		i1 := x1.AuxInt
   28152 		if x1.Aux != s {
   28153 			break
   28154 		}
   28155 		_ = x1.Args[2]
   28156 		if idx != x1.Args[0] {
   28157 			break
   28158 		}
   28159 		if p != x1.Args[1] {
   28160 			break
   28161 		}
   28162 		if mem != x1.Args[2] {
   28163 			break
   28164 		}
   28165 		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)) {
   28166 			break
   28167 		}
   28168 		b = mergePoint(b, x0, x1)
   28169 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28170 		v.reset(OpCopy)
   28171 		v.AddArg(v0)
   28172 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28173 		v1.AuxInt = i0
   28174 		v1.Aux = s
   28175 		v1.AddArg(p)
   28176 		v1.AddArg(idx)
   28177 		v1.AddArg(mem)
   28178 		v0.AddArg(v1)
   28179 		return true
   28180 	}
   28181 	// match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))))
   28182 	// 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)
   28183 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28184 	for {
   28185 		_ = v.Args[1]
   28186 		r0 := v.Args[0]
   28187 		if r0.Op != OpS390XMOVHZreg {
   28188 			break
   28189 		}
   28190 		x0 := r0.Args[0]
   28191 		if x0.Op != OpS390XMOVHBRloadidx {
   28192 			break
   28193 		}
   28194 		i0 := x0.AuxInt
   28195 		s := x0.Aux
   28196 		_ = x0.Args[2]
   28197 		idx := x0.Args[0]
   28198 		p := x0.Args[1]
   28199 		mem := x0.Args[2]
   28200 		sh := v.Args[1]
   28201 		if sh.Op != OpS390XSLDconst {
   28202 			break
   28203 		}
   28204 		if sh.AuxInt != 16 {
   28205 			break
   28206 		}
   28207 		r1 := sh.Args[0]
   28208 		if r1.Op != OpS390XMOVHZreg {
   28209 			break
   28210 		}
   28211 		x1 := r1.Args[0]
   28212 		if x1.Op != OpS390XMOVHBRloadidx {
   28213 			break
   28214 		}
   28215 		i1 := x1.AuxInt
   28216 		if x1.Aux != s {
   28217 			break
   28218 		}
   28219 		_ = x1.Args[2]
   28220 		if idx != x1.Args[0] {
   28221 			break
   28222 		}
   28223 		if p != x1.Args[1] {
   28224 			break
   28225 		}
   28226 		if mem != x1.Args[2] {
   28227 			break
   28228 		}
   28229 		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)) {
   28230 			break
   28231 		}
   28232 		b = mergePoint(b, x0, x1)
   28233 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28234 		v.reset(OpCopy)
   28235 		v.AddArg(v0)
   28236 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28237 		v1.AuxInt = i0
   28238 		v1.Aux = s
   28239 		v1.AddArg(p)
   28240 		v1.AddArg(idx)
   28241 		v1.AddArg(mem)
   28242 		v0.AddArg(v1)
   28243 		return true
   28244 	}
   28245 	// match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))
   28246 	// 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)
   28247 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28248 	for {
   28249 		_ = v.Args[1]
   28250 		sh := v.Args[0]
   28251 		if sh.Op != OpS390XSLDconst {
   28252 			break
   28253 		}
   28254 		if sh.AuxInt != 16 {
   28255 			break
   28256 		}
   28257 		r1 := sh.Args[0]
   28258 		if r1.Op != OpS390XMOVHZreg {
   28259 			break
   28260 		}
   28261 		x1 := r1.Args[0]
   28262 		if x1.Op != OpS390XMOVHBRloadidx {
   28263 			break
   28264 		}
   28265 		i1 := x1.AuxInt
   28266 		s := x1.Aux
   28267 		_ = x1.Args[2]
   28268 		p := x1.Args[0]
   28269 		idx := x1.Args[1]
   28270 		mem := x1.Args[2]
   28271 		r0 := v.Args[1]
   28272 		if r0.Op != OpS390XMOVHZreg {
   28273 			break
   28274 		}
   28275 		x0 := r0.Args[0]
   28276 		if x0.Op != OpS390XMOVHBRloadidx {
   28277 			break
   28278 		}
   28279 		i0 := x0.AuxInt
   28280 		if x0.Aux != s {
   28281 			break
   28282 		}
   28283 		_ = x0.Args[2]
   28284 		if p != x0.Args[0] {
   28285 			break
   28286 		}
   28287 		if idx != x0.Args[1] {
   28288 			break
   28289 		}
   28290 		if mem != x0.Args[2] {
   28291 			break
   28292 		}
   28293 		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)) {
   28294 			break
   28295 		}
   28296 		b = mergePoint(b, x0, x1)
   28297 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28298 		v.reset(OpCopy)
   28299 		v.AddArg(v0)
   28300 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28301 		v1.AuxInt = i0
   28302 		v1.Aux = s
   28303 		v1.AddArg(p)
   28304 		v1.AddArg(idx)
   28305 		v1.AddArg(mem)
   28306 		v0.AddArg(v1)
   28307 		return true
   28308 	}
   28309 	// match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))
   28310 	// 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)
   28311 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28312 	for {
   28313 		_ = v.Args[1]
   28314 		sh := v.Args[0]
   28315 		if sh.Op != OpS390XSLDconst {
   28316 			break
   28317 		}
   28318 		if sh.AuxInt != 16 {
   28319 			break
   28320 		}
   28321 		r1 := sh.Args[0]
   28322 		if r1.Op != OpS390XMOVHZreg {
   28323 			break
   28324 		}
   28325 		x1 := r1.Args[0]
   28326 		if x1.Op != OpS390XMOVHBRloadidx {
   28327 			break
   28328 		}
   28329 		i1 := x1.AuxInt
   28330 		s := x1.Aux
   28331 		_ = x1.Args[2]
   28332 		idx := x1.Args[0]
   28333 		p := x1.Args[1]
   28334 		mem := x1.Args[2]
   28335 		r0 := v.Args[1]
   28336 		if r0.Op != OpS390XMOVHZreg {
   28337 			break
   28338 		}
   28339 		x0 := r0.Args[0]
   28340 		if x0.Op != OpS390XMOVHBRloadidx {
   28341 			break
   28342 		}
   28343 		i0 := x0.AuxInt
   28344 		if x0.Aux != s {
   28345 			break
   28346 		}
   28347 		_ = x0.Args[2]
   28348 		if p != x0.Args[0] {
   28349 			break
   28350 		}
   28351 		if idx != x0.Args[1] {
   28352 			break
   28353 		}
   28354 		if mem != x0.Args[2] {
   28355 			break
   28356 		}
   28357 		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)) {
   28358 			break
   28359 		}
   28360 		b = mergePoint(b, x0, x1)
   28361 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28362 		v.reset(OpCopy)
   28363 		v.AddArg(v0)
   28364 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28365 		v1.AuxInt = i0
   28366 		v1.Aux = s
   28367 		v1.AddArg(p)
   28368 		v1.AddArg(idx)
   28369 		v1.AddArg(mem)
   28370 		v0.AddArg(v1)
   28371 		return true
   28372 	}
   28373 	// match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))
   28374 	// 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)
   28375 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28376 	for {
   28377 		_ = v.Args[1]
   28378 		sh := v.Args[0]
   28379 		if sh.Op != OpS390XSLDconst {
   28380 			break
   28381 		}
   28382 		if sh.AuxInt != 16 {
   28383 			break
   28384 		}
   28385 		r1 := sh.Args[0]
   28386 		if r1.Op != OpS390XMOVHZreg {
   28387 			break
   28388 		}
   28389 		x1 := r1.Args[0]
   28390 		if x1.Op != OpS390XMOVHBRloadidx {
   28391 			break
   28392 		}
   28393 		i1 := x1.AuxInt
   28394 		s := x1.Aux
   28395 		_ = x1.Args[2]
   28396 		p := x1.Args[0]
   28397 		idx := x1.Args[1]
   28398 		mem := x1.Args[2]
   28399 		r0 := v.Args[1]
   28400 		if r0.Op != OpS390XMOVHZreg {
   28401 			break
   28402 		}
   28403 		x0 := r0.Args[0]
   28404 		if x0.Op != OpS390XMOVHBRloadidx {
   28405 			break
   28406 		}
   28407 		i0 := x0.AuxInt
   28408 		if x0.Aux != s {
   28409 			break
   28410 		}
   28411 		_ = x0.Args[2]
   28412 		if idx != x0.Args[0] {
   28413 			break
   28414 		}
   28415 		if p != x0.Args[1] {
   28416 			break
   28417 		}
   28418 		if mem != x0.Args[2] {
   28419 			break
   28420 		}
   28421 		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)) {
   28422 			break
   28423 		}
   28424 		b = mergePoint(b, x0, x1)
   28425 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28426 		v.reset(OpCopy)
   28427 		v.AddArg(v0)
   28428 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28429 		v1.AuxInt = i0
   28430 		v1.Aux = s
   28431 		v1.AddArg(p)
   28432 		v1.AddArg(idx)
   28433 		v1.AddArg(mem)
   28434 		v0.AddArg(v1)
   28435 		return true
   28436 	}
   28437 	// match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))
   28438 	// 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)
   28439 	// result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))
   28440 	for {
   28441 		_ = v.Args[1]
   28442 		sh := v.Args[0]
   28443 		if sh.Op != OpS390XSLDconst {
   28444 			break
   28445 		}
   28446 		if sh.AuxInt != 16 {
   28447 			break
   28448 		}
   28449 		r1 := sh.Args[0]
   28450 		if r1.Op != OpS390XMOVHZreg {
   28451 			break
   28452 		}
   28453 		x1 := r1.Args[0]
   28454 		if x1.Op != OpS390XMOVHBRloadidx {
   28455 			break
   28456 		}
   28457 		i1 := x1.AuxInt
   28458 		s := x1.Aux
   28459 		_ = x1.Args[2]
   28460 		idx := x1.Args[0]
   28461 		p := x1.Args[1]
   28462 		mem := x1.Args[2]
   28463 		r0 := v.Args[1]
   28464 		if r0.Op != OpS390XMOVHZreg {
   28465 			break
   28466 		}
   28467 		x0 := r0.Args[0]
   28468 		if x0.Op != OpS390XMOVHBRloadidx {
   28469 			break
   28470 		}
   28471 		i0 := x0.AuxInt
   28472 		if x0.Aux != s {
   28473 			break
   28474 		}
   28475 		_ = x0.Args[2]
   28476 		if idx != x0.Args[0] {
   28477 			break
   28478 		}
   28479 		if p != x0.Args[1] {
   28480 			break
   28481 		}
   28482 		if mem != x0.Args[2] {
   28483 			break
   28484 		}
   28485 		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)) {
   28486 			break
   28487 		}
   28488 		b = mergePoint(b, x0, x1)
   28489 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   28490 		v.reset(OpCopy)
   28491 		v.AddArg(v0)
   28492 		v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   28493 		v1.AuxInt = i0
   28494 		v1.Aux = s
   28495 		v1.AddArg(p)
   28496 		v1.AddArg(idx)
   28497 		v1.AddArg(mem)
   28498 		v0.AddArg(v1)
   28499 		return true
   28500 	}
   28501 	// match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))))
   28502 	// 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)
   28503 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28504 	for {
   28505 		_ = v.Args[1]
   28506 		r0 := v.Args[0]
   28507 		if r0.Op != OpS390XMOVWZreg {
   28508 			break
   28509 		}
   28510 		x0 := r0.Args[0]
   28511 		if x0.Op != OpS390XMOVWBRloadidx {
   28512 			break
   28513 		}
   28514 		i0 := x0.AuxInt
   28515 		s := x0.Aux
   28516 		_ = x0.Args[2]
   28517 		p := x0.Args[0]
   28518 		idx := x0.Args[1]
   28519 		mem := x0.Args[2]
   28520 		sh := v.Args[1]
   28521 		if sh.Op != OpS390XSLDconst {
   28522 			break
   28523 		}
   28524 		if sh.AuxInt != 32 {
   28525 			break
   28526 		}
   28527 		r1 := sh.Args[0]
   28528 		if r1.Op != OpS390XMOVWZreg {
   28529 			break
   28530 		}
   28531 		x1 := r1.Args[0]
   28532 		if x1.Op != OpS390XMOVWBRloadidx {
   28533 			break
   28534 		}
   28535 		i1 := x1.AuxInt
   28536 		if x1.Aux != s {
   28537 			break
   28538 		}
   28539 		_ = x1.Args[2]
   28540 		if p != x1.Args[0] {
   28541 			break
   28542 		}
   28543 		if idx != x1.Args[1] {
   28544 			break
   28545 		}
   28546 		if mem != x1.Args[2] {
   28547 			break
   28548 		}
   28549 		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)) {
   28550 			break
   28551 		}
   28552 		b = mergePoint(b, x0, x1)
   28553 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28554 		v.reset(OpCopy)
   28555 		v.AddArg(v0)
   28556 		v0.AuxInt = i0
   28557 		v0.Aux = s
   28558 		v0.AddArg(p)
   28559 		v0.AddArg(idx)
   28560 		v0.AddArg(mem)
   28561 		return true
   28562 	}
   28563 	// match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))))
   28564 	// 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)
   28565 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28566 	for {
   28567 		_ = v.Args[1]
   28568 		r0 := v.Args[0]
   28569 		if r0.Op != OpS390XMOVWZreg {
   28570 			break
   28571 		}
   28572 		x0 := r0.Args[0]
   28573 		if x0.Op != OpS390XMOVWBRloadidx {
   28574 			break
   28575 		}
   28576 		i0 := x0.AuxInt
   28577 		s := x0.Aux
   28578 		_ = x0.Args[2]
   28579 		idx := x0.Args[0]
   28580 		p := x0.Args[1]
   28581 		mem := x0.Args[2]
   28582 		sh := v.Args[1]
   28583 		if sh.Op != OpS390XSLDconst {
   28584 			break
   28585 		}
   28586 		if sh.AuxInt != 32 {
   28587 			break
   28588 		}
   28589 		r1 := sh.Args[0]
   28590 		if r1.Op != OpS390XMOVWZreg {
   28591 			break
   28592 		}
   28593 		x1 := r1.Args[0]
   28594 		if x1.Op != OpS390XMOVWBRloadidx {
   28595 			break
   28596 		}
   28597 		i1 := x1.AuxInt
   28598 		if x1.Aux != s {
   28599 			break
   28600 		}
   28601 		_ = x1.Args[2]
   28602 		if p != x1.Args[0] {
   28603 			break
   28604 		}
   28605 		if idx != x1.Args[1] {
   28606 			break
   28607 		}
   28608 		if mem != x1.Args[2] {
   28609 			break
   28610 		}
   28611 		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)) {
   28612 			break
   28613 		}
   28614 		b = mergePoint(b, x0, x1)
   28615 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28616 		v.reset(OpCopy)
   28617 		v.AddArg(v0)
   28618 		v0.AuxInt = i0
   28619 		v0.Aux = s
   28620 		v0.AddArg(p)
   28621 		v0.AddArg(idx)
   28622 		v0.AddArg(mem)
   28623 		return true
   28624 	}
   28625 	// match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))))
   28626 	// 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)
   28627 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28628 	for {
   28629 		_ = v.Args[1]
   28630 		r0 := v.Args[0]
   28631 		if r0.Op != OpS390XMOVWZreg {
   28632 			break
   28633 		}
   28634 		x0 := r0.Args[0]
   28635 		if x0.Op != OpS390XMOVWBRloadidx {
   28636 			break
   28637 		}
   28638 		i0 := x0.AuxInt
   28639 		s := x0.Aux
   28640 		_ = x0.Args[2]
   28641 		p := x0.Args[0]
   28642 		idx := x0.Args[1]
   28643 		mem := x0.Args[2]
   28644 		sh := v.Args[1]
   28645 		if sh.Op != OpS390XSLDconst {
   28646 			break
   28647 		}
   28648 		if sh.AuxInt != 32 {
   28649 			break
   28650 		}
   28651 		r1 := sh.Args[0]
   28652 		if r1.Op != OpS390XMOVWZreg {
   28653 			break
   28654 		}
   28655 		x1 := r1.Args[0]
   28656 		if x1.Op != OpS390XMOVWBRloadidx {
   28657 			break
   28658 		}
   28659 		i1 := x1.AuxInt
   28660 		if x1.Aux != s {
   28661 			break
   28662 		}
   28663 		_ = x1.Args[2]
   28664 		if idx != x1.Args[0] {
   28665 			break
   28666 		}
   28667 		if p != x1.Args[1] {
   28668 			break
   28669 		}
   28670 		if mem != x1.Args[2] {
   28671 			break
   28672 		}
   28673 		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)) {
   28674 			break
   28675 		}
   28676 		b = mergePoint(b, x0, x1)
   28677 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28678 		v.reset(OpCopy)
   28679 		v.AddArg(v0)
   28680 		v0.AuxInt = i0
   28681 		v0.Aux = s
   28682 		v0.AddArg(p)
   28683 		v0.AddArg(idx)
   28684 		v0.AddArg(mem)
   28685 		return true
   28686 	}
   28687 	return false
   28688 }
   28689 func rewriteValueS390X_OpS390XOR_120(v *Value) bool {
   28690 	b := v.Block
   28691 	_ = b
   28692 	typ := &b.Func.Config.Types
   28693 	_ = typ
   28694 	// match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))))
   28695 	// 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)
   28696 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28697 	for {
   28698 		_ = v.Args[1]
   28699 		r0 := v.Args[0]
   28700 		if r0.Op != OpS390XMOVWZreg {
   28701 			break
   28702 		}
   28703 		x0 := r0.Args[0]
   28704 		if x0.Op != OpS390XMOVWBRloadidx {
   28705 			break
   28706 		}
   28707 		i0 := x0.AuxInt
   28708 		s := x0.Aux
   28709 		_ = x0.Args[2]
   28710 		idx := x0.Args[0]
   28711 		p := x0.Args[1]
   28712 		mem := x0.Args[2]
   28713 		sh := v.Args[1]
   28714 		if sh.Op != OpS390XSLDconst {
   28715 			break
   28716 		}
   28717 		if sh.AuxInt != 32 {
   28718 			break
   28719 		}
   28720 		r1 := sh.Args[0]
   28721 		if r1.Op != OpS390XMOVWZreg {
   28722 			break
   28723 		}
   28724 		x1 := r1.Args[0]
   28725 		if x1.Op != OpS390XMOVWBRloadidx {
   28726 			break
   28727 		}
   28728 		i1 := x1.AuxInt
   28729 		if x1.Aux != s {
   28730 			break
   28731 		}
   28732 		_ = x1.Args[2]
   28733 		if idx != x1.Args[0] {
   28734 			break
   28735 		}
   28736 		if p != x1.Args[1] {
   28737 			break
   28738 		}
   28739 		if mem != x1.Args[2] {
   28740 			break
   28741 		}
   28742 		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)) {
   28743 			break
   28744 		}
   28745 		b = mergePoint(b, x0, x1)
   28746 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28747 		v.reset(OpCopy)
   28748 		v.AddArg(v0)
   28749 		v0.AuxInt = i0
   28750 		v0.Aux = s
   28751 		v0.AddArg(p)
   28752 		v0.AddArg(idx)
   28753 		v0.AddArg(mem)
   28754 		return true
   28755 	}
   28756 	// match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)))
   28757 	// 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)
   28758 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28759 	for {
   28760 		_ = v.Args[1]
   28761 		sh := v.Args[0]
   28762 		if sh.Op != OpS390XSLDconst {
   28763 			break
   28764 		}
   28765 		if sh.AuxInt != 32 {
   28766 			break
   28767 		}
   28768 		r1 := sh.Args[0]
   28769 		if r1.Op != OpS390XMOVWZreg {
   28770 			break
   28771 		}
   28772 		x1 := r1.Args[0]
   28773 		if x1.Op != OpS390XMOVWBRloadidx {
   28774 			break
   28775 		}
   28776 		i1 := x1.AuxInt
   28777 		s := x1.Aux
   28778 		_ = x1.Args[2]
   28779 		p := x1.Args[0]
   28780 		idx := x1.Args[1]
   28781 		mem := x1.Args[2]
   28782 		r0 := v.Args[1]
   28783 		if r0.Op != OpS390XMOVWZreg {
   28784 			break
   28785 		}
   28786 		x0 := r0.Args[0]
   28787 		if x0.Op != OpS390XMOVWBRloadidx {
   28788 			break
   28789 		}
   28790 		i0 := x0.AuxInt
   28791 		if x0.Aux != s {
   28792 			break
   28793 		}
   28794 		_ = x0.Args[2]
   28795 		if p != x0.Args[0] {
   28796 			break
   28797 		}
   28798 		if idx != x0.Args[1] {
   28799 			break
   28800 		}
   28801 		if mem != x0.Args[2] {
   28802 			break
   28803 		}
   28804 		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)) {
   28805 			break
   28806 		}
   28807 		b = mergePoint(b, x0, x1)
   28808 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28809 		v.reset(OpCopy)
   28810 		v.AddArg(v0)
   28811 		v0.AuxInt = i0
   28812 		v0.Aux = s
   28813 		v0.AddArg(p)
   28814 		v0.AddArg(idx)
   28815 		v0.AddArg(mem)
   28816 		return true
   28817 	}
   28818 	// match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)))
   28819 	// 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)
   28820 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28821 	for {
   28822 		_ = v.Args[1]
   28823 		sh := v.Args[0]
   28824 		if sh.Op != OpS390XSLDconst {
   28825 			break
   28826 		}
   28827 		if sh.AuxInt != 32 {
   28828 			break
   28829 		}
   28830 		r1 := sh.Args[0]
   28831 		if r1.Op != OpS390XMOVWZreg {
   28832 			break
   28833 		}
   28834 		x1 := r1.Args[0]
   28835 		if x1.Op != OpS390XMOVWBRloadidx {
   28836 			break
   28837 		}
   28838 		i1 := x1.AuxInt
   28839 		s := x1.Aux
   28840 		_ = x1.Args[2]
   28841 		idx := x1.Args[0]
   28842 		p := x1.Args[1]
   28843 		mem := x1.Args[2]
   28844 		r0 := v.Args[1]
   28845 		if r0.Op != OpS390XMOVWZreg {
   28846 			break
   28847 		}
   28848 		x0 := r0.Args[0]
   28849 		if x0.Op != OpS390XMOVWBRloadidx {
   28850 			break
   28851 		}
   28852 		i0 := x0.AuxInt
   28853 		if x0.Aux != s {
   28854 			break
   28855 		}
   28856 		_ = x0.Args[2]
   28857 		if p != x0.Args[0] {
   28858 			break
   28859 		}
   28860 		if idx != x0.Args[1] {
   28861 			break
   28862 		}
   28863 		if mem != x0.Args[2] {
   28864 			break
   28865 		}
   28866 		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)) {
   28867 			break
   28868 		}
   28869 		b = mergePoint(b, x0, x1)
   28870 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28871 		v.reset(OpCopy)
   28872 		v.AddArg(v0)
   28873 		v0.AuxInt = i0
   28874 		v0.Aux = s
   28875 		v0.AddArg(p)
   28876 		v0.AddArg(idx)
   28877 		v0.AddArg(mem)
   28878 		return true
   28879 	}
   28880 	// match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)))
   28881 	// 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)
   28882 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28883 	for {
   28884 		_ = v.Args[1]
   28885 		sh := v.Args[0]
   28886 		if sh.Op != OpS390XSLDconst {
   28887 			break
   28888 		}
   28889 		if sh.AuxInt != 32 {
   28890 			break
   28891 		}
   28892 		r1 := sh.Args[0]
   28893 		if r1.Op != OpS390XMOVWZreg {
   28894 			break
   28895 		}
   28896 		x1 := r1.Args[0]
   28897 		if x1.Op != OpS390XMOVWBRloadidx {
   28898 			break
   28899 		}
   28900 		i1 := x1.AuxInt
   28901 		s := x1.Aux
   28902 		_ = x1.Args[2]
   28903 		p := x1.Args[0]
   28904 		idx := x1.Args[1]
   28905 		mem := x1.Args[2]
   28906 		r0 := v.Args[1]
   28907 		if r0.Op != OpS390XMOVWZreg {
   28908 			break
   28909 		}
   28910 		x0 := r0.Args[0]
   28911 		if x0.Op != OpS390XMOVWBRloadidx {
   28912 			break
   28913 		}
   28914 		i0 := x0.AuxInt
   28915 		if x0.Aux != s {
   28916 			break
   28917 		}
   28918 		_ = x0.Args[2]
   28919 		if idx != x0.Args[0] {
   28920 			break
   28921 		}
   28922 		if p != x0.Args[1] {
   28923 			break
   28924 		}
   28925 		if mem != x0.Args[2] {
   28926 			break
   28927 		}
   28928 		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)) {
   28929 			break
   28930 		}
   28931 		b = mergePoint(b, x0, x1)
   28932 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28933 		v.reset(OpCopy)
   28934 		v.AddArg(v0)
   28935 		v0.AuxInt = i0
   28936 		v0.Aux = s
   28937 		v0.AddArg(p)
   28938 		v0.AddArg(idx)
   28939 		v0.AddArg(mem)
   28940 		return true
   28941 	}
   28942 	// match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)))
   28943 	// 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)
   28944 	// result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem)
   28945 	for {
   28946 		_ = v.Args[1]
   28947 		sh := v.Args[0]
   28948 		if sh.Op != OpS390XSLDconst {
   28949 			break
   28950 		}
   28951 		if sh.AuxInt != 32 {
   28952 			break
   28953 		}
   28954 		r1 := sh.Args[0]
   28955 		if r1.Op != OpS390XMOVWZreg {
   28956 			break
   28957 		}
   28958 		x1 := r1.Args[0]
   28959 		if x1.Op != OpS390XMOVWBRloadidx {
   28960 			break
   28961 		}
   28962 		i1 := x1.AuxInt
   28963 		s := x1.Aux
   28964 		_ = x1.Args[2]
   28965 		idx := x1.Args[0]
   28966 		p := x1.Args[1]
   28967 		mem := x1.Args[2]
   28968 		r0 := v.Args[1]
   28969 		if r0.Op != OpS390XMOVWZreg {
   28970 			break
   28971 		}
   28972 		x0 := r0.Args[0]
   28973 		if x0.Op != OpS390XMOVWBRloadidx {
   28974 			break
   28975 		}
   28976 		i0 := x0.AuxInt
   28977 		if x0.Aux != s {
   28978 			break
   28979 		}
   28980 		_ = x0.Args[2]
   28981 		if idx != x0.Args[0] {
   28982 			break
   28983 		}
   28984 		if p != x0.Args[1] {
   28985 			break
   28986 		}
   28987 		if mem != x0.Args[2] {
   28988 			break
   28989 		}
   28990 		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)) {
   28991 			break
   28992 		}
   28993 		b = mergePoint(b, x0, x1)
   28994 		v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64)
   28995 		v.reset(OpCopy)
   28996 		v.AddArg(v0)
   28997 		v0.AuxInt = i0
   28998 		v0.Aux = s
   28999 		v0.AddArg(p)
   29000 		v0.AddArg(idx)
   29001 		v0.AddArg(mem)
   29002 		return true
   29003 	}
   29004 	// 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))
   29005 	// 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)
   29006 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29007 	for {
   29008 		_ = v.Args[1]
   29009 		s1 := v.Args[0]
   29010 		if s1.Op != OpS390XSLDconst {
   29011 			break
   29012 		}
   29013 		j1 := s1.AuxInt
   29014 		x1 := s1.Args[0]
   29015 		if x1.Op != OpS390XMOVBZloadidx {
   29016 			break
   29017 		}
   29018 		i1 := x1.AuxInt
   29019 		s := x1.Aux
   29020 		_ = x1.Args[2]
   29021 		p := x1.Args[0]
   29022 		idx := x1.Args[1]
   29023 		mem := x1.Args[2]
   29024 		or := v.Args[1]
   29025 		if or.Op != OpS390XOR {
   29026 			break
   29027 		}
   29028 		_ = or.Args[1]
   29029 		s0 := or.Args[0]
   29030 		if s0.Op != OpS390XSLDconst {
   29031 			break
   29032 		}
   29033 		j0 := s0.AuxInt
   29034 		x0 := s0.Args[0]
   29035 		if x0.Op != OpS390XMOVBZloadidx {
   29036 			break
   29037 		}
   29038 		i0 := x0.AuxInt
   29039 		if x0.Aux != s {
   29040 			break
   29041 		}
   29042 		_ = x0.Args[2]
   29043 		if p != x0.Args[0] {
   29044 			break
   29045 		}
   29046 		if idx != x0.Args[1] {
   29047 			break
   29048 		}
   29049 		if mem != x0.Args[2] {
   29050 			break
   29051 		}
   29052 		y := or.Args[1]
   29053 		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)) {
   29054 			break
   29055 		}
   29056 		b = mergePoint(b, x0, x1)
   29057 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29058 		v.reset(OpCopy)
   29059 		v.AddArg(v0)
   29060 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29061 		v1.AuxInt = j0
   29062 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29063 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29064 		v3.AuxInt = i0
   29065 		v3.Aux = s
   29066 		v3.AddArg(p)
   29067 		v3.AddArg(idx)
   29068 		v3.AddArg(mem)
   29069 		v2.AddArg(v3)
   29070 		v1.AddArg(v2)
   29071 		v0.AddArg(v1)
   29072 		v0.AddArg(y)
   29073 		return true
   29074 	}
   29075 	// 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))
   29076 	// 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)
   29077 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29078 	for {
   29079 		_ = v.Args[1]
   29080 		s1 := v.Args[0]
   29081 		if s1.Op != OpS390XSLDconst {
   29082 			break
   29083 		}
   29084 		j1 := s1.AuxInt
   29085 		x1 := s1.Args[0]
   29086 		if x1.Op != OpS390XMOVBZloadidx {
   29087 			break
   29088 		}
   29089 		i1 := x1.AuxInt
   29090 		s := x1.Aux
   29091 		_ = x1.Args[2]
   29092 		idx := x1.Args[0]
   29093 		p := x1.Args[1]
   29094 		mem := x1.Args[2]
   29095 		or := v.Args[1]
   29096 		if or.Op != OpS390XOR {
   29097 			break
   29098 		}
   29099 		_ = or.Args[1]
   29100 		s0 := or.Args[0]
   29101 		if s0.Op != OpS390XSLDconst {
   29102 			break
   29103 		}
   29104 		j0 := s0.AuxInt
   29105 		x0 := s0.Args[0]
   29106 		if x0.Op != OpS390XMOVBZloadidx {
   29107 			break
   29108 		}
   29109 		i0 := x0.AuxInt
   29110 		if x0.Aux != s {
   29111 			break
   29112 		}
   29113 		_ = x0.Args[2]
   29114 		if p != x0.Args[0] {
   29115 			break
   29116 		}
   29117 		if idx != x0.Args[1] {
   29118 			break
   29119 		}
   29120 		if mem != x0.Args[2] {
   29121 			break
   29122 		}
   29123 		y := or.Args[1]
   29124 		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)) {
   29125 			break
   29126 		}
   29127 		b = mergePoint(b, x0, x1)
   29128 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29129 		v.reset(OpCopy)
   29130 		v.AddArg(v0)
   29131 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29132 		v1.AuxInt = j0
   29133 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29134 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29135 		v3.AuxInt = i0
   29136 		v3.Aux = s
   29137 		v3.AddArg(p)
   29138 		v3.AddArg(idx)
   29139 		v3.AddArg(mem)
   29140 		v2.AddArg(v3)
   29141 		v1.AddArg(v2)
   29142 		v0.AddArg(v1)
   29143 		v0.AddArg(y)
   29144 		return true
   29145 	}
   29146 	// 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))
   29147 	// 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)
   29148 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29149 	for {
   29150 		_ = v.Args[1]
   29151 		s1 := v.Args[0]
   29152 		if s1.Op != OpS390XSLDconst {
   29153 			break
   29154 		}
   29155 		j1 := s1.AuxInt
   29156 		x1 := s1.Args[0]
   29157 		if x1.Op != OpS390XMOVBZloadidx {
   29158 			break
   29159 		}
   29160 		i1 := x1.AuxInt
   29161 		s := x1.Aux
   29162 		_ = x1.Args[2]
   29163 		p := x1.Args[0]
   29164 		idx := x1.Args[1]
   29165 		mem := x1.Args[2]
   29166 		or := v.Args[1]
   29167 		if or.Op != OpS390XOR {
   29168 			break
   29169 		}
   29170 		_ = or.Args[1]
   29171 		s0 := or.Args[0]
   29172 		if s0.Op != OpS390XSLDconst {
   29173 			break
   29174 		}
   29175 		j0 := s0.AuxInt
   29176 		x0 := s0.Args[0]
   29177 		if x0.Op != OpS390XMOVBZloadidx {
   29178 			break
   29179 		}
   29180 		i0 := x0.AuxInt
   29181 		if x0.Aux != s {
   29182 			break
   29183 		}
   29184 		_ = x0.Args[2]
   29185 		if idx != x0.Args[0] {
   29186 			break
   29187 		}
   29188 		if p != x0.Args[1] {
   29189 			break
   29190 		}
   29191 		if mem != x0.Args[2] {
   29192 			break
   29193 		}
   29194 		y := or.Args[1]
   29195 		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)) {
   29196 			break
   29197 		}
   29198 		b = mergePoint(b, x0, x1)
   29199 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29200 		v.reset(OpCopy)
   29201 		v.AddArg(v0)
   29202 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29203 		v1.AuxInt = j0
   29204 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29205 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29206 		v3.AuxInt = i0
   29207 		v3.Aux = s
   29208 		v3.AddArg(p)
   29209 		v3.AddArg(idx)
   29210 		v3.AddArg(mem)
   29211 		v2.AddArg(v3)
   29212 		v1.AddArg(v2)
   29213 		v0.AddArg(v1)
   29214 		v0.AddArg(y)
   29215 		return true
   29216 	}
   29217 	// 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))
   29218 	// 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)
   29219 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29220 	for {
   29221 		_ = v.Args[1]
   29222 		s1 := v.Args[0]
   29223 		if s1.Op != OpS390XSLDconst {
   29224 			break
   29225 		}
   29226 		j1 := s1.AuxInt
   29227 		x1 := s1.Args[0]
   29228 		if x1.Op != OpS390XMOVBZloadidx {
   29229 			break
   29230 		}
   29231 		i1 := x1.AuxInt
   29232 		s := x1.Aux
   29233 		_ = x1.Args[2]
   29234 		idx := x1.Args[0]
   29235 		p := x1.Args[1]
   29236 		mem := x1.Args[2]
   29237 		or := v.Args[1]
   29238 		if or.Op != OpS390XOR {
   29239 			break
   29240 		}
   29241 		_ = or.Args[1]
   29242 		s0 := or.Args[0]
   29243 		if s0.Op != OpS390XSLDconst {
   29244 			break
   29245 		}
   29246 		j0 := s0.AuxInt
   29247 		x0 := s0.Args[0]
   29248 		if x0.Op != OpS390XMOVBZloadidx {
   29249 			break
   29250 		}
   29251 		i0 := x0.AuxInt
   29252 		if x0.Aux != s {
   29253 			break
   29254 		}
   29255 		_ = x0.Args[2]
   29256 		if idx != x0.Args[0] {
   29257 			break
   29258 		}
   29259 		if p != x0.Args[1] {
   29260 			break
   29261 		}
   29262 		if mem != x0.Args[2] {
   29263 			break
   29264 		}
   29265 		y := or.Args[1]
   29266 		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)) {
   29267 			break
   29268 		}
   29269 		b = mergePoint(b, x0, x1)
   29270 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29271 		v.reset(OpCopy)
   29272 		v.AddArg(v0)
   29273 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29274 		v1.AuxInt = j0
   29275 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29276 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29277 		v3.AuxInt = i0
   29278 		v3.Aux = s
   29279 		v3.AddArg(p)
   29280 		v3.AddArg(idx)
   29281 		v3.AddArg(mem)
   29282 		v2.AddArg(v3)
   29283 		v1.AddArg(v2)
   29284 		v0.AddArg(v1)
   29285 		v0.AddArg(y)
   29286 		return true
   29287 	}
   29288 	// 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))))
   29289 	// 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)
   29290 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29291 	for {
   29292 		_ = v.Args[1]
   29293 		s1 := v.Args[0]
   29294 		if s1.Op != OpS390XSLDconst {
   29295 			break
   29296 		}
   29297 		j1 := s1.AuxInt
   29298 		x1 := s1.Args[0]
   29299 		if x1.Op != OpS390XMOVBZloadidx {
   29300 			break
   29301 		}
   29302 		i1 := x1.AuxInt
   29303 		s := x1.Aux
   29304 		_ = x1.Args[2]
   29305 		p := x1.Args[0]
   29306 		idx := x1.Args[1]
   29307 		mem := x1.Args[2]
   29308 		or := v.Args[1]
   29309 		if or.Op != OpS390XOR {
   29310 			break
   29311 		}
   29312 		_ = or.Args[1]
   29313 		y := or.Args[0]
   29314 		s0 := or.Args[1]
   29315 		if s0.Op != OpS390XSLDconst {
   29316 			break
   29317 		}
   29318 		j0 := s0.AuxInt
   29319 		x0 := s0.Args[0]
   29320 		if x0.Op != OpS390XMOVBZloadidx {
   29321 			break
   29322 		}
   29323 		i0 := x0.AuxInt
   29324 		if x0.Aux != s {
   29325 			break
   29326 		}
   29327 		_ = x0.Args[2]
   29328 		if p != x0.Args[0] {
   29329 			break
   29330 		}
   29331 		if idx != x0.Args[1] {
   29332 			break
   29333 		}
   29334 		if mem != x0.Args[2] {
   29335 			break
   29336 		}
   29337 		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)) {
   29338 			break
   29339 		}
   29340 		b = mergePoint(b, x0, x1)
   29341 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29342 		v.reset(OpCopy)
   29343 		v.AddArg(v0)
   29344 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29345 		v1.AuxInt = j0
   29346 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29347 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29348 		v3.AuxInt = i0
   29349 		v3.Aux = s
   29350 		v3.AddArg(p)
   29351 		v3.AddArg(idx)
   29352 		v3.AddArg(mem)
   29353 		v2.AddArg(v3)
   29354 		v1.AddArg(v2)
   29355 		v0.AddArg(v1)
   29356 		v0.AddArg(y)
   29357 		return true
   29358 	}
   29359 	return false
   29360 }
   29361 func rewriteValueS390X_OpS390XOR_130(v *Value) bool {
   29362 	b := v.Block
   29363 	_ = b
   29364 	typ := &b.Func.Config.Types
   29365 	_ = typ
   29366 	// 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))))
   29367 	// 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)
   29368 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29369 	for {
   29370 		_ = v.Args[1]
   29371 		s1 := v.Args[0]
   29372 		if s1.Op != OpS390XSLDconst {
   29373 			break
   29374 		}
   29375 		j1 := s1.AuxInt
   29376 		x1 := s1.Args[0]
   29377 		if x1.Op != OpS390XMOVBZloadidx {
   29378 			break
   29379 		}
   29380 		i1 := x1.AuxInt
   29381 		s := x1.Aux
   29382 		_ = x1.Args[2]
   29383 		idx := x1.Args[0]
   29384 		p := x1.Args[1]
   29385 		mem := x1.Args[2]
   29386 		or := v.Args[1]
   29387 		if or.Op != OpS390XOR {
   29388 			break
   29389 		}
   29390 		_ = or.Args[1]
   29391 		y := or.Args[0]
   29392 		s0 := or.Args[1]
   29393 		if s0.Op != OpS390XSLDconst {
   29394 			break
   29395 		}
   29396 		j0 := s0.AuxInt
   29397 		x0 := s0.Args[0]
   29398 		if x0.Op != OpS390XMOVBZloadidx {
   29399 			break
   29400 		}
   29401 		i0 := x0.AuxInt
   29402 		if x0.Aux != s {
   29403 			break
   29404 		}
   29405 		_ = x0.Args[2]
   29406 		if p != x0.Args[0] {
   29407 			break
   29408 		}
   29409 		if idx != x0.Args[1] {
   29410 			break
   29411 		}
   29412 		if mem != x0.Args[2] {
   29413 			break
   29414 		}
   29415 		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)) {
   29416 			break
   29417 		}
   29418 		b = mergePoint(b, x0, x1)
   29419 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29420 		v.reset(OpCopy)
   29421 		v.AddArg(v0)
   29422 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29423 		v1.AuxInt = j0
   29424 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29425 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29426 		v3.AuxInt = i0
   29427 		v3.Aux = s
   29428 		v3.AddArg(p)
   29429 		v3.AddArg(idx)
   29430 		v3.AddArg(mem)
   29431 		v2.AddArg(v3)
   29432 		v1.AddArg(v2)
   29433 		v0.AddArg(v1)
   29434 		v0.AddArg(y)
   29435 		return true
   29436 	}
   29437 	// 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))))
   29438 	// 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)
   29439 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29440 	for {
   29441 		_ = v.Args[1]
   29442 		s1 := v.Args[0]
   29443 		if s1.Op != OpS390XSLDconst {
   29444 			break
   29445 		}
   29446 		j1 := s1.AuxInt
   29447 		x1 := s1.Args[0]
   29448 		if x1.Op != OpS390XMOVBZloadidx {
   29449 			break
   29450 		}
   29451 		i1 := x1.AuxInt
   29452 		s := x1.Aux
   29453 		_ = x1.Args[2]
   29454 		p := x1.Args[0]
   29455 		idx := x1.Args[1]
   29456 		mem := x1.Args[2]
   29457 		or := v.Args[1]
   29458 		if or.Op != OpS390XOR {
   29459 			break
   29460 		}
   29461 		_ = or.Args[1]
   29462 		y := or.Args[0]
   29463 		s0 := or.Args[1]
   29464 		if s0.Op != OpS390XSLDconst {
   29465 			break
   29466 		}
   29467 		j0 := s0.AuxInt
   29468 		x0 := s0.Args[0]
   29469 		if x0.Op != OpS390XMOVBZloadidx {
   29470 			break
   29471 		}
   29472 		i0 := x0.AuxInt
   29473 		if x0.Aux != s {
   29474 			break
   29475 		}
   29476 		_ = x0.Args[2]
   29477 		if idx != x0.Args[0] {
   29478 			break
   29479 		}
   29480 		if p != x0.Args[1] {
   29481 			break
   29482 		}
   29483 		if mem != x0.Args[2] {
   29484 			break
   29485 		}
   29486 		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)) {
   29487 			break
   29488 		}
   29489 		b = mergePoint(b, x0, x1)
   29490 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29491 		v.reset(OpCopy)
   29492 		v.AddArg(v0)
   29493 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29494 		v1.AuxInt = j0
   29495 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29496 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29497 		v3.AuxInt = i0
   29498 		v3.Aux = s
   29499 		v3.AddArg(p)
   29500 		v3.AddArg(idx)
   29501 		v3.AddArg(mem)
   29502 		v2.AddArg(v3)
   29503 		v1.AddArg(v2)
   29504 		v0.AddArg(v1)
   29505 		v0.AddArg(y)
   29506 		return true
   29507 	}
   29508 	// 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))))
   29509 	// 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)
   29510 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29511 	for {
   29512 		_ = v.Args[1]
   29513 		s1 := v.Args[0]
   29514 		if s1.Op != OpS390XSLDconst {
   29515 			break
   29516 		}
   29517 		j1 := s1.AuxInt
   29518 		x1 := s1.Args[0]
   29519 		if x1.Op != OpS390XMOVBZloadidx {
   29520 			break
   29521 		}
   29522 		i1 := x1.AuxInt
   29523 		s := x1.Aux
   29524 		_ = x1.Args[2]
   29525 		idx := x1.Args[0]
   29526 		p := x1.Args[1]
   29527 		mem := x1.Args[2]
   29528 		or := v.Args[1]
   29529 		if or.Op != OpS390XOR {
   29530 			break
   29531 		}
   29532 		_ = or.Args[1]
   29533 		y := or.Args[0]
   29534 		s0 := or.Args[1]
   29535 		if s0.Op != OpS390XSLDconst {
   29536 			break
   29537 		}
   29538 		j0 := s0.AuxInt
   29539 		x0 := s0.Args[0]
   29540 		if x0.Op != OpS390XMOVBZloadidx {
   29541 			break
   29542 		}
   29543 		i0 := x0.AuxInt
   29544 		if x0.Aux != s {
   29545 			break
   29546 		}
   29547 		_ = x0.Args[2]
   29548 		if idx != x0.Args[0] {
   29549 			break
   29550 		}
   29551 		if p != x0.Args[1] {
   29552 			break
   29553 		}
   29554 		if mem != x0.Args[2] {
   29555 			break
   29556 		}
   29557 		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)) {
   29558 			break
   29559 		}
   29560 		b = mergePoint(b, x0, x1)
   29561 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29562 		v.reset(OpCopy)
   29563 		v.AddArg(v0)
   29564 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29565 		v1.AuxInt = j0
   29566 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29567 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29568 		v3.AuxInt = i0
   29569 		v3.Aux = s
   29570 		v3.AddArg(p)
   29571 		v3.AddArg(idx)
   29572 		v3.AddArg(mem)
   29573 		v2.AddArg(v3)
   29574 		v1.AddArg(v2)
   29575 		v0.AddArg(v1)
   29576 		v0.AddArg(y)
   29577 		return true
   29578 	}
   29579 	// 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)))
   29580 	// 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)
   29581 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29582 	for {
   29583 		_ = v.Args[1]
   29584 		or := v.Args[0]
   29585 		if or.Op != OpS390XOR {
   29586 			break
   29587 		}
   29588 		_ = or.Args[1]
   29589 		s0 := or.Args[0]
   29590 		if s0.Op != OpS390XSLDconst {
   29591 			break
   29592 		}
   29593 		j0 := s0.AuxInt
   29594 		x0 := s0.Args[0]
   29595 		if x0.Op != OpS390XMOVBZloadidx {
   29596 			break
   29597 		}
   29598 		i0 := x0.AuxInt
   29599 		s := x0.Aux
   29600 		_ = x0.Args[2]
   29601 		p := x0.Args[0]
   29602 		idx := x0.Args[1]
   29603 		mem := x0.Args[2]
   29604 		y := or.Args[1]
   29605 		s1 := v.Args[1]
   29606 		if s1.Op != OpS390XSLDconst {
   29607 			break
   29608 		}
   29609 		j1 := s1.AuxInt
   29610 		x1 := s1.Args[0]
   29611 		if x1.Op != OpS390XMOVBZloadidx {
   29612 			break
   29613 		}
   29614 		i1 := x1.AuxInt
   29615 		if x1.Aux != s {
   29616 			break
   29617 		}
   29618 		_ = x1.Args[2]
   29619 		if p != x1.Args[0] {
   29620 			break
   29621 		}
   29622 		if idx != x1.Args[1] {
   29623 			break
   29624 		}
   29625 		if mem != x1.Args[2] {
   29626 			break
   29627 		}
   29628 		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)) {
   29629 			break
   29630 		}
   29631 		b = mergePoint(b, x0, x1)
   29632 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29633 		v.reset(OpCopy)
   29634 		v.AddArg(v0)
   29635 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29636 		v1.AuxInt = j0
   29637 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29638 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29639 		v3.AuxInt = i0
   29640 		v3.Aux = s
   29641 		v3.AddArg(p)
   29642 		v3.AddArg(idx)
   29643 		v3.AddArg(mem)
   29644 		v2.AddArg(v3)
   29645 		v1.AddArg(v2)
   29646 		v0.AddArg(v1)
   29647 		v0.AddArg(y)
   29648 		return true
   29649 	}
   29650 	// 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)))
   29651 	// 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)
   29652 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29653 	for {
   29654 		_ = v.Args[1]
   29655 		or := v.Args[0]
   29656 		if or.Op != OpS390XOR {
   29657 			break
   29658 		}
   29659 		_ = or.Args[1]
   29660 		s0 := or.Args[0]
   29661 		if s0.Op != OpS390XSLDconst {
   29662 			break
   29663 		}
   29664 		j0 := s0.AuxInt
   29665 		x0 := s0.Args[0]
   29666 		if x0.Op != OpS390XMOVBZloadidx {
   29667 			break
   29668 		}
   29669 		i0 := x0.AuxInt
   29670 		s := x0.Aux
   29671 		_ = x0.Args[2]
   29672 		idx := x0.Args[0]
   29673 		p := x0.Args[1]
   29674 		mem := x0.Args[2]
   29675 		y := or.Args[1]
   29676 		s1 := v.Args[1]
   29677 		if s1.Op != OpS390XSLDconst {
   29678 			break
   29679 		}
   29680 		j1 := s1.AuxInt
   29681 		x1 := s1.Args[0]
   29682 		if x1.Op != OpS390XMOVBZloadidx {
   29683 			break
   29684 		}
   29685 		i1 := x1.AuxInt
   29686 		if x1.Aux != s {
   29687 			break
   29688 		}
   29689 		_ = x1.Args[2]
   29690 		if p != x1.Args[0] {
   29691 			break
   29692 		}
   29693 		if idx != x1.Args[1] {
   29694 			break
   29695 		}
   29696 		if mem != x1.Args[2] {
   29697 			break
   29698 		}
   29699 		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)) {
   29700 			break
   29701 		}
   29702 		b = mergePoint(b, x0, x1)
   29703 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29704 		v.reset(OpCopy)
   29705 		v.AddArg(v0)
   29706 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29707 		v1.AuxInt = j0
   29708 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29709 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29710 		v3.AuxInt = i0
   29711 		v3.Aux = s
   29712 		v3.AddArg(p)
   29713 		v3.AddArg(idx)
   29714 		v3.AddArg(mem)
   29715 		v2.AddArg(v3)
   29716 		v1.AddArg(v2)
   29717 		v0.AddArg(v1)
   29718 		v0.AddArg(y)
   29719 		return true
   29720 	}
   29721 	// 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)))
   29722 	// 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)
   29723 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29724 	for {
   29725 		_ = v.Args[1]
   29726 		or := v.Args[0]
   29727 		if or.Op != OpS390XOR {
   29728 			break
   29729 		}
   29730 		_ = or.Args[1]
   29731 		y := or.Args[0]
   29732 		s0 := or.Args[1]
   29733 		if s0.Op != OpS390XSLDconst {
   29734 			break
   29735 		}
   29736 		j0 := s0.AuxInt
   29737 		x0 := s0.Args[0]
   29738 		if x0.Op != OpS390XMOVBZloadidx {
   29739 			break
   29740 		}
   29741 		i0 := x0.AuxInt
   29742 		s := x0.Aux
   29743 		_ = x0.Args[2]
   29744 		p := x0.Args[0]
   29745 		idx := x0.Args[1]
   29746 		mem := x0.Args[2]
   29747 		s1 := v.Args[1]
   29748 		if s1.Op != OpS390XSLDconst {
   29749 			break
   29750 		}
   29751 		j1 := s1.AuxInt
   29752 		x1 := s1.Args[0]
   29753 		if x1.Op != OpS390XMOVBZloadidx {
   29754 			break
   29755 		}
   29756 		i1 := x1.AuxInt
   29757 		if x1.Aux != s {
   29758 			break
   29759 		}
   29760 		_ = x1.Args[2]
   29761 		if p != x1.Args[0] {
   29762 			break
   29763 		}
   29764 		if idx != x1.Args[1] {
   29765 			break
   29766 		}
   29767 		if mem != x1.Args[2] {
   29768 			break
   29769 		}
   29770 		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)) {
   29771 			break
   29772 		}
   29773 		b = mergePoint(b, x0, x1)
   29774 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29775 		v.reset(OpCopy)
   29776 		v.AddArg(v0)
   29777 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29778 		v1.AuxInt = j0
   29779 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29780 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29781 		v3.AuxInt = i0
   29782 		v3.Aux = s
   29783 		v3.AddArg(p)
   29784 		v3.AddArg(idx)
   29785 		v3.AddArg(mem)
   29786 		v2.AddArg(v3)
   29787 		v1.AddArg(v2)
   29788 		v0.AddArg(v1)
   29789 		v0.AddArg(y)
   29790 		return true
   29791 	}
   29792 	// 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)))
   29793 	// 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)
   29794 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29795 	for {
   29796 		_ = v.Args[1]
   29797 		or := v.Args[0]
   29798 		if or.Op != OpS390XOR {
   29799 			break
   29800 		}
   29801 		_ = or.Args[1]
   29802 		y := or.Args[0]
   29803 		s0 := or.Args[1]
   29804 		if s0.Op != OpS390XSLDconst {
   29805 			break
   29806 		}
   29807 		j0 := s0.AuxInt
   29808 		x0 := s0.Args[0]
   29809 		if x0.Op != OpS390XMOVBZloadidx {
   29810 			break
   29811 		}
   29812 		i0 := x0.AuxInt
   29813 		s := x0.Aux
   29814 		_ = x0.Args[2]
   29815 		idx := x0.Args[0]
   29816 		p := x0.Args[1]
   29817 		mem := x0.Args[2]
   29818 		s1 := v.Args[1]
   29819 		if s1.Op != OpS390XSLDconst {
   29820 			break
   29821 		}
   29822 		j1 := s1.AuxInt
   29823 		x1 := s1.Args[0]
   29824 		if x1.Op != OpS390XMOVBZloadidx {
   29825 			break
   29826 		}
   29827 		i1 := x1.AuxInt
   29828 		if x1.Aux != s {
   29829 			break
   29830 		}
   29831 		_ = x1.Args[2]
   29832 		if p != x1.Args[0] {
   29833 			break
   29834 		}
   29835 		if idx != x1.Args[1] {
   29836 			break
   29837 		}
   29838 		if mem != x1.Args[2] {
   29839 			break
   29840 		}
   29841 		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)) {
   29842 			break
   29843 		}
   29844 		b = mergePoint(b, x0, x1)
   29845 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29846 		v.reset(OpCopy)
   29847 		v.AddArg(v0)
   29848 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29849 		v1.AuxInt = j0
   29850 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29851 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29852 		v3.AuxInt = i0
   29853 		v3.Aux = s
   29854 		v3.AddArg(p)
   29855 		v3.AddArg(idx)
   29856 		v3.AddArg(mem)
   29857 		v2.AddArg(v3)
   29858 		v1.AddArg(v2)
   29859 		v0.AddArg(v1)
   29860 		v0.AddArg(y)
   29861 		return true
   29862 	}
   29863 	// 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)))
   29864 	// 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)
   29865 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29866 	for {
   29867 		_ = v.Args[1]
   29868 		or := v.Args[0]
   29869 		if or.Op != OpS390XOR {
   29870 			break
   29871 		}
   29872 		_ = or.Args[1]
   29873 		s0 := or.Args[0]
   29874 		if s0.Op != OpS390XSLDconst {
   29875 			break
   29876 		}
   29877 		j0 := s0.AuxInt
   29878 		x0 := s0.Args[0]
   29879 		if x0.Op != OpS390XMOVBZloadidx {
   29880 			break
   29881 		}
   29882 		i0 := x0.AuxInt
   29883 		s := x0.Aux
   29884 		_ = x0.Args[2]
   29885 		p := x0.Args[0]
   29886 		idx := x0.Args[1]
   29887 		mem := x0.Args[2]
   29888 		y := or.Args[1]
   29889 		s1 := v.Args[1]
   29890 		if s1.Op != OpS390XSLDconst {
   29891 			break
   29892 		}
   29893 		j1 := s1.AuxInt
   29894 		x1 := s1.Args[0]
   29895 		if x1.Op != OpS390XMOVBZloadidx {
   29896 			break
   29897 		}
   29898 		i1 := x1.AuxInt
   29899 		if x1.Aux != s {
   29900 			break
   29901 		}
   29902 		_ = x1.Args[2]
   29903 		if idx != x1.Args[0] {
   29904 			break
   29905 		}
   29906 		if p != x1.Args[1] {
   29907 			break
   29908 		}
   29909 		if mem != x1.Args[2] {
   29910 			break
   29911 		}
   29912 		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)) {
   29913 			break
   29914 		}
   29915 		b = mergePoint(b, x0, x1)
   29916 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29917 		v.reset(OpCopy)
   29918 		v.AddArg(v0)
   29919 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29920 		v1.AuxInt = j0
   29921 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29922 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29923 		v3.AuxInt = i0
   29924 		v3.Aux = s
   29925 		v3.AddArg(p)
   29926 		v3.AddArg(idx)
   29927 		v3.AddArg(mem)
   29928 		v2.AddArg(v3)
   29929 		v1.AddArg(v2)
   29930 		v0.AddArg(v1)
   29931 		v0.AddArg(y)
   29932 		return true
   29933 	}
   29934 	// 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)))
   29935 	// 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)
   29936 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   29937 	for {
   29938 		_ = v.Args[1]
   29939 		or := v.Args[0]
   29940 		if or.Op != OpS390XOR {
   29941 			break
   29942 		}
   29943 		_ = or.Args[1]
   29944 		s0 := or.Args[0]
   29945 		if s0.Op != OpS390XSLDconst {
   29946 			break
   29947 		}
   29948 		j0 := s0.AuxInt
   29949 		x0 := s0.Args[0]
   29950 		if x0.Op != OpS390XMOVBZloadidx {
   29951 			break
   29952 		}
   29953 		i0 := x0.AuxInt
   29954 		s := x0.Aux
   29955 		_ = x0.Args[2]
   29956 		idx := x0.Args[0]
   29957 		p := x0.Args[1]
   29958 		mem := x0.Args[2]
   29959 		y := or.Args[1]
   29960 		s1 := v.Args[1]
   29961 		if s1.Op != OpS390XSLDconst {
   29962 			break
   29963 		}
   29964 		j1 := s1.AuxInt
   29965 		x1 := s1.Args[0]
   29966 		if x1.Op != OpS390XMOVBZloadidx {
   29967 			break
   29968 		}
   29969 		i1 := x1.AuxInt
   29970 		if x1.Aux != s {
   29971 			break
   29972 		}
   29973 		_ = x1.Args[2]
   29974 		if idx != x1.Args[0] {
   29975 			break
   29976 		}
   29977 		if p != x1.Args[1] {
   29978 			break
   29979 		}
   29980 		if mem != x1.Args[2] {
   29981 			break
   29982 		}
   29983 		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)) {
   29984 			break
   29985 		}
   29986 		b = mergePoint(b, x0, x1)
   29987 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   29988 		v.reset(OpCopy)
   29989 		v.AddArg(v0)
   29990 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   29991 		v1.AuxInt = j0
   29992 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   29993 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   29994 		v3.AuxInt = i0
   29995 		v3.Aux = s
   29996 		v3.AddArg(p)
   29997 		v3.AddArg(idx)
   29998 		v3.AddArg(mem)
   29999 		v2.AddArg(v3)
   30000 		v1.AddArg(v2)
   30001 		v0.AddArg(v1)
   30002 		v0.AddArg(y)
   30003 		return true
   30004 	}
   30005 	// 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)))
   30006 	// 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)
   30007 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   30008 	for {
   30009 		_ = v.Args[1]
   30010 		or := v.Args[0]
   30011 		if or.Op != OpS390XOR {
   30012 			break
   30013 		}
   30014 		_ = or.Args[1]
   30015 		y := or.Args[0]
   30016 		s0 := or.Args[1]
   30017 		if s0.Op != OpS390XSLDconst {
   30018 			break
   30019 		}
   30020 		j0 := s0.AuxInt
   30021 		x0 := s0.Args[0]
   30022 		if x0.Op != OpS390XMOVBZloadidx {
   30023 			break
   30024 		}
   30025 		i0 := x0.AuxInt
   30026 		s := x0.Aux
   30027 		_ = x0.Args[2]
   30028 		p := x0.Args[0]
   30029 		idx := x0.Args[1]
   30030 		mem := x0.Args[2]
   30031 		s1 := v.Args[1]
   30032 		if s1.Op != OpS390XSLDconst {
   30033 			break
   30034 		}
   30035 		j1 := s1.AuxInt
   30036 		x1 := s1.Args[0]
   30037 		if x1.Op != OpS390XMOVBZloadidx {
   30038 			break
   30039 		}
   30040 		i1 := x1.AuxInt
   30041 		if x1.Aux != s {
   30042 			break
   30043 		}
   30044 		_ = x1.Args[2]
   30045 		if idx != x1.Args[0] {
   30046 			break
   30047 		}
   30048 		if p != x1.Args[1] {
   30049 			break
   30050 		}
   30051 		if mem != x1.Args[2] {
   30052 			break
   30053 		}
   30054 		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)) {
   30055 			break
   30056 		}
   30057 		b = mergePoint(b, x0, x1)
   30058 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30059 		v.reset(OpCopy)
   30060 		v.AddArg(v0)
   30061 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30062 		v1.AuxInt = j0
   30063 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   30064 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   30065 		v3.AuxInt = i0
   30066 		v3.Aux = s
   30067 		v3.AddArg(p)
   30068 		v3.AddArg(idx)
   30069 		v3.AddArg(mem)
   30070 		v2.AddArg(v3)
   30071 		v1.AddArg(v2)
   30072 		v0.AddArg(v1)
   30073 		v0.AddArg(y)
   30074 		return true
   30075 	}
   30076 	return false
   30077 }
   30078 func rewriteValueS390X_OpS390XOR_140(v *Value) bool {
   30079 	b := v.Block
   30080 	_ = b
   30081 	typ := &b.Func.Config.Types
   30082 	_ = typ
   30083 	// 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)))
   30084 	// 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)
   30085 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   30086 	for {
   30087 		_ = v.Args[1]
   30088 		or := v.Args[0]
   30089 		if or.Op != OpS390XOR {
   30090 			break
   30091 		}
   30092 		_ = or.Args[1]
   30093 		y := or.Args[0]
   30094 		s0 := or.Args[1]
   30095 		if s0.Op != OpS390XSLDconst {
   30096 			break
   30097 		}
   30098 		j0 := s0.AuxInt
   30099 		x0 := s0.Args[0]
   30100 		if x0.Op != OpS390XMOVBZloadidx {
   30101 			break
   30102 		}
   30103 		i0 := x0.AuxInt
   30104 		s := x0.Aux
   30105 		_ = x0.Args[2]
   30106 		idx := x0.Args[0]
   30107 		p := x0.Args[1]
   30108 		mem := x0.Args[2]
   30109 		s1 := v.Args[1]
   30110 		if s1.Op != OpS390XSLDconst {
   30111 			break
   30112 		}
   30113 		j1 := s1.AuxInt
   30114 		x1 := s1.Args[0]
   30115 		if x1.Op != OpS390XMOVBZloadidx {
   30116 			break
   30117 		}
   30118 		i1 := x1.AuxInt
   30119 		if x1.Aux != s {
   30120 			break
   30121 		}
   30122 		_ = x1.Args[2]
   30123 		if idx != x1.Args[0] {
   30124 			break
   30125 		}
   30126 		if p != x1.Args[1] {
   30127 			break
   30128 		}
   30129 		if mem != x1.Args[2] {
   30130 			break
   30131 		}
   30132 		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)) {
   30133 			break
   30134 		}
   30135 		b = mergePoint(b, x0, x1)
   30136 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30137 		v.reset(OpCopy)
   30138 		v.AddArg(v0)
   30139 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30140 		v1.AuxInt = j0
   30141 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   30142 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   30143 		v3.AuxInt = i0
   30144 		v3.Aux = s
   30145 		v3.AddArg(p)
   30146 		v3.AddArg(idx)
   30147 		v3.AddArg(mem)
   30148 		v2.AddArg(v3)
   30149 		v1.AddArg(v2)
   30150 		v0.AddArg(v1)
   30151 		v0.AddArg(y)
   30152 		return true
   30153 	}
   30154 	// 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))
   30155 	// 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)
   30156 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30157 	for {
   30158 		_ = v.Args[1]
   30159 		s1 := v.Args[0]
   30160 		if s1.Op != OpS390XSLDconst {
   30161 			break
   30162 		}
   30163 		j1 := s1.AuxInt
   30164 		r1 := s1.Args[0]
   30165 		if r1.Op != OpS390XMOVHZreg {
   30166 			break
   30167 		}
   30168 		x1 := r1.Args[0]
   30169 		if x1.Op != OpS390XMOVHBRloadidx {
   30170 			break
   30171 		}
   30172 		i1 := x1.AuxInt
   30173 		s := x1.Aux
   30174 		_ = x1.Args[2]
   30175 		p := x1.Args[0]
   30176 		idx := x1.Args[1]
   30177 		mem := x1.Args[2]
   30178 		or := v.Args[1]
   30179 		if or.Op != OpS390XOR {
   30180 			break
   30181 		}
   30182 		_ = or.Args[1]
   30183 		s0 := or.Args[0]
   30184 		if s0.Op != OpS390XSLDconst {
   30185 			break
   30186 		}
   30187 		j0 := s0.AuxInt
   30188 		r0 := s0.Args[0]
   30189 		if r0.Op != OpS390XMOVHZreg {
   30190 			break
   30191 		}
   30192 		x0 := r0.Args[0]
   30193 		if x0.Op != OpS390XMOVHBRloadidx {
   30194 			break
   30195 		}
   30196 		i0 := x0.AuxInt
   30197 		if x0.Aux != s {
   30198 			break
   30199 		}
   30200 		_ = x0.Args[2]
   30201 		if p != x0.Args[0] {
   30202 			break
   30203 		}
   30204 		if idx != x0.Args[1] {
   30205 			break
   30206 		}
   30207 		if mem != x0.Args[2] {
   30208 			break
   30209 		}
   30210 		y := or.Args[1]
   30211 		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)) {
   30212 			break
   30213 		}
   30214 		b = mergePoint(b, x0, x1)
   30215 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30216 		v.reset(OpCopy)
   30217 		v.AddArg(v0)
   30218 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30219 		v1.AuxInt = j0
   30220 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30221 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30222 		v3.AuxInt = i0
   30223 		v3.Aux = s
   30224 		v3.AddArg(p)
   30225 		v3.AddArg(idx)
   30226 		v3.AddArg(mem)
   30227 		v2.AddArg(v3)
   30228 		v1.AddArg(v2)
   30229 		v0.AddArg(v1)
   30230 		v0.AddArg(y)
   30231 		return true
   30232 	}
   30233 	// 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))
   30234 	// 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)
   30235 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30236 	for {
   30237 		_ = v.Args[1]
   30238 		s1 := v.Args[0]
   30239 		if s1.Op != OpS390XSLDconst {
   30240 			break
   30241 		}
   30242 		j1 := s1.AuxInt
   30243 		r1 := s1.Args[0]
   30244 		if r1.Op != OpS390XMOVHZreg {
   30245 			break
   30246 		}
   30247 		x1 := r1.Args[0]
   30248 		if x1.Op != OpS390XMOVHBRloadidx {
   30249 			break
   30250 		}
   30251 		i1 := x1.AuxInt
   30252 		s := x1.Aux
   30253 		_ = x1.Args[2]
   30254 		idx := x1.Args[0]
   30255 		p := x1.Args[1]
   30256 		mem := x1.Args[2]
   30257 		or := v.Args[1]
   30258 		if or.Op != OpS390XOR {
   30259 			break
   30260 		}
   30261 		_ = or.Args[1]
   30262 		s0 := or.Args[0]
   30263 		if s0.Op != OpS390XSLDconst {
   30264 			break
   30265 		}
   30266 		j0 := s0.AuxInt
   30267 		r0 := s0.Args[0]
   30268 		if r0.Op != OpS390XMOVHZreg {
   30269 			break
   30270 		}
   30271 		x0 := r0.Args[0]
   30272 		if x0.Op != OpS390XMOVHBRloadidx {
   30273 			break
   30274 		}
   30275 		i0 := x0.AuxInt
   30276 		if x0.Aux != s {
   30277 			break
   30278 		}
   30279 		_ = x0.Args[2]
   30280 		if p != x0.Args[0] {
   30281 			break
   30282 		}
   30283 		if idx != x0.Args[1] {
   30284 			break
   30285 		}
   30286 		if mem != x0.Args[2] {
   30287 			break
   30288 		}
   30289 		y := or.Args[1]
   30290 		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)) {
   30291 			break
   30292 		}
   30293 		b = mergePoint(b, x0, x1)
   30294 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30295 		v.reset(OpCopy)
   30296 		v.AddArg(v0)
   30297 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30298 		v1.AuxInt = j0
   30299 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30300 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30301 		v3.AuxInt = i0
   30302 		v3.Aux = s
   30303 		v3.AddArg(p)
   30304 		v3.AddArg(idx)
   30305 		v3.AddArg(mem)
   30306 		v2.AddArg(v3)
   30307 		v1.AddArg(v2)
   30308 		v0.AddArg(v1)
   30309 		v0.AddArg(y)
   30310 		return true
   30311 	}
   30312 	// 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))
   30313 	// 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)
   30314 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30315 	for {
   30316 		_ = v.Args[1]
   30317 		s1 := v.Args[0]
   30318 		if s1.Op != OpS390XSLDconst {
   30319 			break
   30320 		}
   30321 		j1 := s1.AuxInt
   30322 		r1 := s1.Args[0]
   30323 		if r1.Op != OpS390XMOVHZreg {
   30324 			break
   30325 		}
   30326 		x1 := r1.Args[0]
   30327 		if x1.Op != OpS390XMOVHBRloadidx {
   30328 			break
   30329 		}
   30330 		i1 := x1.AuxInt
   30331 		s := x1.Aux
   30332 		_ = x1.Args[2]
   30333 		p := x1.Args[0]
   30334 		idx := x1.Args[1]
   30335 		mem := x1.Args[2]
   30336 		or := v.Args[1]
   30337 		if or.Op != OpS390XOR {
   30338 			break
   30339 		}
   30340 		_ = or.Args[1]
   30341 		s0 := or.Args[0]
   30342 		if s0.Op != OpS390XSLDconst {
   30343 			break
   30344 		}
   30345 		j0 := s0.AuxInt
   30346 		r0 := s0.Args[0]
   30347 		if r0.Op != OpS390XMOVHZreg {
   30348 			break
   30349 		}
   30350 		x0 := r0.Args[0]
   30351 		if x0.Op != OpS390XMOVHBRloadidx {
   30352 			break
   30353 		}
   30354 		i0 := x0.AuxInt
   30355 		if x0.Aux != s {
   30356 			break
   30357 		}
   30358 		_ = x0.Args[2]
   30359 		if idx != x0.Args[0] {
   30360 			break
   30361 		}
   30362 		if p != x0.Args[1] {
   30363 			break
   30364 		}
   30365 		if mem != x0.Args[2] {
   30366 			break
   30367 		}
   30368 		y := or.Args[1]
   30369 		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)) {
   30370 			break
   30371 		}
   30372 		b = mergePoint(b, x0, x1)
   30373 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30374 		v.reset(OpCopy)
   30375 		v.AddArg(v0)
   30376 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30377 		v1.AuxInt = j0
   30378 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30379 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30380 		v3.AuxInt = i0
   30381 		v3.Aux = s
   30382 		v3.AddArg(p)
   30383 		v3.AddArg(idx)
   30384 		v3.AddArg(mem)
   30385 		v2.AddArg(v3)
   30386 		v1.AddArg(v2)
   30387 		v0.AddArg(v1)
   30388 		v0.AddArg(y)
   30389 		return true
   30390 	}
   30391 	// 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))
   30392 	// 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)
   30393 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30394 	for {
   30395 		_ = v.Args[1]
   30396 		s1 := v.Args[0]
   30397 		if s1.Op != OpS390XSLDconst {
   30398 			break
   30399 		}
   30400 		j1 := s1.AuxInt
   30401 		r1 := s1.Args[0]
   30402 		if r1.Op != OpS390XMOVHZreg {
   30403 			break
   30404 		}
   30405 		x1 := r1.Args[0]
   30406 		if x1.Op != OpS390XMOVHBRloadidx {
   30407 			break
   30408 		}
   30409 		i1 := x1.AuxInt
   30410 		s := x1.Aux
   30411 		_ = x1.Args[2]
   30412 		idx := x1.Args[0]
   30413 		p := x1.Args[1]
   30414 		mem := x1.Args[2]
   30415 		or := v.Args[1]
   30416 		if or.Op != OpS390XOR {
   30417 			break
   30418 		}
   30419 		_ = or.Args[1]
   30420 		s0 := or.Args[0]
   30421 		if s0.Op != OpS390XSLDconst {
   30422 			break
   30423 		}
   30424 		j0 := s0.AuxInt
   30425 		r0 := s0.Args[0]
   30426 		if r0.Op != OpS390XMOVHZreg {
   30427 			break
   30428 		}
   30429 		x0 := r0.Args[0]
   30430 		if x0.Op != OpS390XMOVHBRloadidx {
   30431 			break
   30432 		}
   30433 		i0 := x0.AuxInt
   30434 		if x0.Aux != s {
   30435 			break
   30436 		}
   30437 		_ = x0.Args[2]
   30438 		if idx != x0.Args[0] {
   30439 			break
   30440 		}
   30441 		if p != x0.Args[1] {
   30442 			break
   30443 		}
   30444 		if mem != x0.Args[2] {
   30445 			break
   30446 		}
   30447 		y := or.Args[1]
   30448 		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)) {
   30449 			break
   30450 		}
   30451 		b = mergePoint(b, x0, x1)
   30452 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30453 		v.reset(OpCopy)
   30454 		v.AddArg(v0)
   30455 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30456 		v1.AuxInt = j0
   30457 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30458 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30459 		v3.AuxInt = i0
   30460 		v3.Aux = s
   30461 		v3.AddArg(p)
   30462 		v3.AddArg(idx)
   30463 		v3.AddArg(mem)
   30464 		v2.AddArg(v3)
   30465 		v1.AddArg(v2)
   30466 		v0.AddArg(v1)
   30467 		v0.AddArg(y)
   30468 		return true
   30469 	}
   30470 	// 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)))))
   30471 	// 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)
   30472 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30473 	for {
   30474 		_ = v.Args[1]
   30475 		s1 := v.Args[0]
   30476 		if s1.Op != OpS390XSLDconst {
   30477 			break
   30478 		}
   30479 		j1 := s1.AuxInt
   30480 		r1 := s1.Args[0]
   30481 		if r1.Op != OpS390XMOVHZreg {
   30482 			break
   30483 		}
   30484 		x1 := r1.Args[0]
   30485 		if x1.Op != OpS390XMOVHBRloadidx {
   30486 			break
   30487 		}
   30488 		i1 := x1.AuxInt
   30489 		s := x1.Aux
   30490 		_ = x1.Args[2]
   30491 		p := x1.Args[0]
   30492 		idx := x1.Args[1]
   30493 		mem := x1.Args[2]
   30494 		or := v.Args[1]
   30495 		if or.Op != OpS390XOR {
   30496 			break
   30497 		}
   30498 		_ = or.Args[1]
   30499 		y := or.Args[0]
   30500 		s0 := or.Args[1]
   30501 		if s0.Op != OpS390XSLDconst {
   30502 			break
   30503 		}
   30504 		j0 := s0.AuxInt
   30505 		r0 := s0.Args[0]
   30506 		if r0.Op != OpS390XMOVHZreg {
   30507 			break
   30508 		}
   30509 		x0 := r0.Args[0]
   30510 		if x0.Op != OpS390XMOVHBRloadidx {
   30511 			break
   30512 		}
   30513 		i0 := x0.AuxInt
   30514 		if x0.Aux != s {
   30515 			break
   30516 		}
   30517 		_ = x0.Args[2]
   30518 		if p != x0.Args[0] {
   30519 			break
   30520 		}
   30521 		if idx != x0.Args[1] {
   30522 			break
   30523 		}
   30524 		if mem != x0.Args[2] {
   30525 			break
   30526 		}
   30527 		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)) {
   30528 			break
   30529 		}
   30530 		b = mergePoint(b, x0, x1)
   30531 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30532 		v.reset(OpCopy)
   30533 		v.AddArg(v0)
   30534 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30535 		v1.AuxInt = j0
   30536 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30537 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30538 		v3.AuxInt = i0
   30539 		v3.Aux = s
   30540 		v3.AddArg(p)
   30541 		v3.AddArg(idx)
   30542 		v3.AddArg(mem)
   30543 		v2.AddArg(v3)
   30544 		v1.AddArg(v2)
   30545 		v0.AddArg(v1)
   30546 		v0.AddArg(y)
   30547 		return true
   30548 	}
   30549 	// 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)))))
   30550 	// 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)
   30551 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30552 	for {
   30553 		_ = v.Args[1]
   30554 		s1 := v.Args[0]
   30555 		if s1.Op != OpS390XSLDconst {
   30556 			break
   30557 		}
   30558 		j1 := s1.AuxInt
   30559 		r1 := s1.Args[0]
   30560 		if r1.Op != OpS390XMOVHZreg {
   30561 			break
   30562 		}
   30563 		x1 := r1.Args[0]
   30564 		if x1.Op != OpS390XMOVHBRloadidx {
   30565 			break
   30566 		}
   30567 		i1 := x1.AuxInt
   30568 		s := x1.Aux
   30569 		_ = x1.Args[2]
   30570 		idx := x1.Args[0]
   30571 		p := x1.Args[1]
   30572 		mem := x1.Args[2]
   30573 		or := v.Args[1]
   30574 		if or.Op != OpS390XOR {
   30575 			break
   30576 		}
   30577 		_ = or.Args[1]
   30578 		y := or.Args[0]
   30579 		s0 := or.Args[1]
   30580 		if s0.Op != OpS390XSLDconst {
   30581 			break
   30582 		}
   30583 		j0 := s0.AuxInt
   30584 		r0 := s0.Args[0]
   30585 		if r0.Op != OpS390XMOVHZreg {
   30586 			break
   30587 		}
   30588 		x0 := r0.Args[0]
   30589 		if x0.Op != OpS390XMOVHBRloadidx {
   30590 			break
   30591 		}
   30592 		i0 := x0.AuxInt
   30593 		if x0.Aux != s {
   30594 			break
   30595 		}
   30596 		_ = x0.Args[2]
   30597 		if p != x0.Args[0] {
   30598 			break
   30599 		}
   30600 		if idx != x0.Args[1] {
   30601 			break
   30602 		}
   30603 		if mem != x0.Args[2] {
   30604 			break
   30605 		}
   30606 		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)) {
   30607 			break
   30608 		}
   30609 		b = mergePoint(b, x0, x1)
   30610 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30611 		v.reset(OpCopy)
   30612 		v.AddArg(v0)
   30613 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30614 		v1.AuxInt = j0
   30615 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30616 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30617 		v3.AuxInt = i0
   30618 		v3.Aux = s
   30619 		v3.AddArg(p)
   30620 		v3.AddArg(idx)
   30621 		v3.AddArg(mem)
   30622 		v2.AddArg(v3)
   30623 		v1.AddArg(v2)
   30624 		v0.AddArg(v1)
   30625 		v0.AddArg(y)
   30626 		return true
   30627 	}
   30628 	// 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)))))
   30629 	// 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)
   30630 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30631 	for {
   30632 		_ = v.Args[1]
   30633 		s1 := v.Args[0]
   30634 		if s1.Op != OpS390XSLDconst {
   30635 			break
   30636 		}
   30637 		j1 := s1.AuxInt
   30638 		r1 := s1.Args[0]
   30639 		if r1.Op != OpS390XMOVHZreg {
   30640 			break
   30641 		}
   30642 		x1 := r1.Args[0]
   30643 		if x1.Op != OpS390XMOVHBRloadidx {
   30644 			break
   30645 		}
   30646 		i1 := x1.AuxInt
   30647 		s := x1.Aux
   30648 		_ = x1.Args[2]
   30649 		p := x1.Args[0]
   30650 		idx := x1.Args[1]
   30651 		mem := x1.Args[2]
   30652 		or := v.Args[1]
   30653 		if or.Op != OpS390XOR {
   30654 			break
   30655 		}
   30656 		_ = or.Args[1]
   30657 		y := or.Args[0]
   30658 		s0 := or.Args[1]
   30659 		if s0.Op != OpS390XSLDconst {
   30660 			break
   30661 		}
   30662 		j0 := s0.AuxInt
   30663 		r0 := s0.Args[0]
   30664 		if r0.Op != OpS390XMOVHZreg {
   30665 			break
   30666 		}
   30667 		x0 := r0.Args[0]
   30668 		if x0.Op != OpS390XMOVHBRloadidx {
   30669 			break
   30670 		}
   30671 		i0 := x0.AuxInt
   30672 		if x0.Aux != s {
   30673 			break
   30674 		}
   30675 		_ = x0.Args[2]
   30676 		if idx != x0.Args[0] {
   30677 			break
   30678 		}
   30679 		if p != x0.Args[1] {
   30680 			break
   30681 		}
   30682 		if mem != x0.Args[2] {
   30683 			break
   30684 		}
   30685 		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)) {
   30686 			break
   30687 		}
   30688 		b = mergePoint(b, x0, x1)
   30689 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30690 		v.reset(OpCopy)
   30691 		v.AddArg(v0)
   30692 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30693 		v1.AuxInt = j0
   30694 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30695 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30696 		v3.AuxInt = i0
   30697 		v3.Aux = s
   30698 		v3.AddArg(p)
   30699 		v3.AddArg(idx)
   30700 		v3.AddArg(mem)
   30701 		v2.AddArg(v3)
   30702 		v1.AddArg(v2)
   30703 		v0.AddArg(v1)
   30704 		v0.AddArg(y)
   30705 		return true
   30706 	}
   30707 	// 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)))))
   30708 	// 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)
   30709 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30710 	for {
   30711 		_ = v.Args[1]
   30712 		s1 := v.Args[0]
   30713 		if s1.Op != OpS390XSLDconst {
   30714 			break
   30715 		}
   30716 		j1 := s1.AuxInt
   30717 		r1 := s1.Args[0]
   30718 		if r1.Op != OpS390XMOVHZreg {
   30719 			break
   30720 		}
   30721 		x1 := r1.Args[0]
   30722 		if x1.Op != OpS390XMOVHBRloadidx {
   30723 			break
   30724 		}
   30725 		i1 := x1.AuxInt
   30726 		s := x1.Aux
   30727 		_ = x1.Args[2]
   30728 		idx := x1.Args[0]
   30729 		p := x1.Args[1]
   30730 		mem := x1.Args[2]
   30731 		or := v.Args[1]
   30732 		if or.Op != OpS390XOR {
   30733 			break
   30734 		}
   30735 		_ = or.Args[1]
   30736 		y := or.Args[0]
   30737 		s0 := or.Args[1]
   30738 		if s0.Op != OpS390XSLDconst {
   30739 			break
   30740 		}
   30741 		j0 := s0.AuxInt
   30742 		r0 := s0.Args[0]
   30743 		if r0.Op != OpS390XMOVHZreg {
   30744 			break
   30745 		}
   30746 		x0 := r0.Args[0]
   30747 		if x0.Op != OpS390XMOVHBRloadidx {
   30748 			break
   30749 		}
   30750 		i0 := x0.AuxInt
   30751 		if x0.Aux != s {
   30752 			break
   30753 		}
   30754 		_ = x0.Args[2]
   30755 		if idx != x0.Args[0] {
   30756 			break
   30757 		}
   30758 		if p != x0.Args[1] {
   30759 			break
   30760 		}
   30761 		if mem != x0.Args[2] {
   30762 			break
   30763 		}
   30764 		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)) {
   30765 			break
   30766 		}
   30767 		b = mergePoint(b, x0, x1)
   30768 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30769 		v.reset(OpCopy)
   30770 		v.AddArg(v0)
   30771 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30772 		v1.AuxInt = j0
   30773 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30774 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30775 		v3.AuxInt = i0
   30776 		v3.Aux = s
   30777 		v3.AddArg(p)
   30778 		v3.AddArg(idx)
   30779 		v3.AddArg(mem)
   30780 		v2.AddArg(v3)
   30781 		v1.AddArg(v2)
   30782 		v0.AddArg(v1)
   30783 		v0.AddArg(y)
   30784 		return true
   30785 	}
   30786 	// 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))))
   30787 	// 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)
   30788 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30789 	for {
   30790 		_ = v.Args[1]
   30791 		or := v.Args[0]
   30792 		if or.Op != OpS390XOR {
   30793 			break
   30794 		}
   30795 		_ = or.Args[1]
   30796 		s0 := or.Args[0]
   30797 		if s0.Op != OpS390XSLDconst {
   30798 			break
   30799 		}
   30800 		j0 := s0.AuxInt
   30801 		r0 := s0.Args[0]
   30802 		if r0.Op != OpS390XMOVHZreg {
   30803 			break
   30804 		}
   30805 		x0 := r0.Args[0]
   30806 		if x0.Op != OpS390XMOVHBRloadidx {
   30807 			break
   30808 		}
   30809 		i0 := x0.AuxInt
   30810 		s := x0.Aux
   30811 		_ = x0.Args[2]
   30812 		p := x0.Args[0]
   30813 		idx := x0.Args[1]
   30814 		mem := x0.Args[2]
   30815 		y := or.Args[1]
   30816 		s1 := v.Args[1]
   30817 		if s1.Op != OpS390XSLDconst {
   30818 			break
   30819 		}
   30820 		j1 := s1.AuxInt
   30821 		r1 := s1.Args[0]
   30822 		if r1.Op != OpS390XMOVHZreg {
   30823 			break
   30824 		}
   30825 		x1 := r1.Args[0]
   30826 		if x1.Op != OpS390XMOVHBRloadidx {
   30827 			break
   30828 		}
   30829 		i1 := x1.AuxInt
   30830 		if x1.Aux != s {
   30831 			break
   30832 		}
   30833 		_ = x1.Args[2]
   30834 		if p != x1.Args[0] {
   30835 			break
   30836 		}
   30837 		if idx != x1.Args[1] {
   30838 			break
   30839 		}
   30840 		if mem != x1.Args[2] {
   30841 			break
   30842 		}
   30843 		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)) {
   30844 			break
   30845 		}
   30846 		b = mergePoint(b, x0, x1)
   30847 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30848 		v.reset(OpCopy)
   30849 		v.AddArg(v0)
   30850 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30851 		v1.AuxInt = j0
   30852 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30853 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30854 		v3.AuxInt = i0
   30855 		v3.Aux = s
   30856 		v3.AddArg(p)
   30857 		v3.AddArg(idx)
   30858 		v3.AddArg(mem)
   30859 		v2.AddArg(v3)
   30860 		v1.AddArg(v2)
   30861 		v0.AddArg(v1)
   30862 		v0.AddArg(y)
   30863 		return true
   30864 	}
   30865 	return false
   30866 }
   30867 func rewriteValueS390X_OpS390XOR_150(v *Value) bool {
   30868 	b := v.Block
   30869 	_ = b
   30870 	typ := &b.Func.Config.Types
   30871 	_ = typ
   30872 	// 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))))
   30873 	// 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)
   30874 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30875 	for {
   30876 		_ = v.Args[1]
   30877 		or := v.Args[0]
   30878 		if or.Op != OpS390XOR {
   30879 			break
   30880 		}
   30881 		_ = or.Args[1]
   30882 		s0 := or.Args[0]
   30883 		if s0.Op != OpS390XSLDconst {
   30884 			break
   30885 		}
   30886 		j0 := s0.AuxInt
   30887 		r0 := s0.Args[0]
   30888 		if r0.Op != OpS390XMOVHZreg {
   30889 			break
   30890 		}
   30891 		x0 := r0.Args[0]
   30892 		if x0.Op != OpS390XMOVHBRloadidx {
   30893 			break
   30894 		}
   30895 		i0 := x0.AuxInt
   30896 		s := x0.Aux
   30897 		_ = x0.Args[2]
   30898 		idx := x0.Args[0]
   30899 		p := x0.Args[1]
   30900 		mem := x0.Args[2]
   30901 		y := or.Args[1]
   30902 		s1 := v.Args[1]
   30903 		if s1.Op != OpS390XSLDconst {
   30904 			break
   30905 		}
   30906 		j1 := s1.AuxInt
   30907 		r1 := s1.Args[0]
   30908 		if r1.Op != OpS390XMOVHZreg {
   30909 			break
   30910 		}
   30911 		x1 := r1.Args[0]
   30912 		if x1.Op != OpS390XMOVHBRloadidx {
   30913 			break
   30914 		}
   30915 		i1 := x1.AuxInt
   30916 		if x1.Aux != s {
   30917 			break
   30918 		}
   30919 		_ = x1.Args[2]
   30920 		if p != x1.Args[0] {
   30921 			break
   30922 		}
   30923 		if idx != x1.Args[1] {
   30924 			break
   30925 		}
   30926 		if mem != x1.Args[2] {
   30927 			break
   30928 		}
   30929 		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)) {
   30930 			break
   30931 		}
   30932 		b = mergePoint(b, x0, x1)
   30933 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   30934 		v.reset(OpCopy)
   30935 		v.AddArg(v0)
   30936 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   30937 		v1.AuxInt = j0
   30938 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   30939 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   30940 		v3.AuxInt = i0
   30941 		v3.Aux = s
   30942 		v3.AddArg(p)
   30943 		v3.AddArg(idx)
   30944 		v3.AddArg(mem)
   30945 		v2.AddArg(v3)
   30946 		v1.AddArg(v2)
   30947 		v0.AddArg(v1)
   30948 		v0.AddArg(y)
   30949 		return true
   30950 	}
   30951 	// 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))))
   30952 	// 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)
   30953 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   30954 	for {
   30955 		_ = v.Args[1]
   30956 		or := v.Args[0]
   30957 		if or.Op != OpS390XOR {
   30958 			break
   30959 		}
   30960 		_ = or.Args[1]
   30961 		y := or.Args[0]
   30962 		s0 := or.Args[1]
   30963 		if s0.Op != OpS390XSLDconst {
   30964 			break
   30965 		}
   30966 		j0 := s0.AuxInt
   30967 		r0 := s0.Args[0]
   30968 		if r0.Op != OpS390XMOVHZreg {
   30969 			break
   30970 		}
   30971 		x0 := r0.Args[0]
   30972 		if x0.Op != OpS390XMOVHBRloadidx {
   30973 			break
   30974 		}
   30975 		i0 := x0.AuxInt
   30976 		s := x0.Aux
   30977 		_ = x0.Args[2]
   30978 		p := x0.Args[0]
   30979 		idx := x0.Args[1]
   30980 		mem := x0.Args[2]
   30981 		s1 := v.Args[1]
   30982 		if s1.Op != OpS390XSLDconst {
   30983 			break
   30984 		}
   30985 		j1 := s1.AuxInt
   30986 		r1 := s1.Args[0]
   30987 		if r1.Op != OpS390XMOVHZreg {
   30988 			break
   30989 		}
   30990 		x1 := r1.Args[0]
   30991 		if x1.Op != OpS390XMOVHBRloadidx {
   30992 			break
   30993 		}
   30994 		i1 := x1.AuxInt
   30995 		if x1.Aux != s {
   30996 			break
   30997 		}
   30998 		_ = x1.Args[2]
   30999 		if p != x1.Args[0] {
   31000 			break
   31001 		}
   31002 		if idx != x1.Args[1] {
   31003 			break
   31004 		}
   31005 		if mem != x1.Args[2] {
   31006 			break
   31007 		}
   31008 		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)) {
   31009 			break
   31010 		}
   31011 		b = mergePoint(b, x0, x1)
   31012 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   31013 		v.reset(OpCopy)
   31014 		v.AddArg(v0)
   31015 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   31016 		v1.AuxInt = j0
   31017 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   31018 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   31019 		v3.AuxInt = i0
   31020 		v3.Aux = s
   31021 		v3.AddArg(p)
   31022 		v3.AddArg(idx)
   31023 		v3.AddArg(mem)
   31024 		v2.AddArg(v3)
   31025 		v1.AddArg(v2)
   31026 		v0.AddArg(v1)
   31027 		v0.AddArg(y)
   31028 		return true
   31029 	}
   31030 	// 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))))
   31031 	// 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)
   31032 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   31033 	for {
   31034 		_ = v.Args[1]
   31035 		or := v.Args[0]
   31036 		if or.Op != OpS390XOR {
   31037 			break
   31038 		}
   31039 		_ = or.Args[1]
   31040 		y := or.Args[0]
   31041 		s0 := or.Args[1]
   31042 		if s0.Op != OpS390XSLDconst {
   31043 			break
   31044 		}
   31045 		j0 := s0.AuxInt
   31046 		r0 := s0.Args[0]
   31047 		if r0.Op != OpS390XMOVHZreg {
   31048 			break
   31049 		}
   31050 		x0 := r0.Args[0]
   31051 		if x0.Op != OpS390XMOVHBRloadidx {
   31052 			break
   31053 		}
   31054 		i0 := x0.AuxInt
   31055 		s := x0.Aux
   31056 		_ = x0.Args[2]
   31057 		idx := x0.Args[0]
   31058 		p := x0.Args[1]
   31059 		mem := x0.Args[2]
   31060 		s1 := v.Args[1]
   31061 		if s1.Op != OpS390XSLDconst {
   31062 			break
   31063 		}
   31064 		j1 := s1.AuxInt
   31065 		r1 := s1.Args[0]
   31066 		if r1.Op != OpS390XMOVHZreg {
   31067 			break
   31068 		}
   31069 		x1 := r1.Args[0]
   31070 		if x1.Op != OpS390XMOVHBRloadidx {
   31071 			break
   31072 		}
   31073 		i1 := x1.AuxInt
   31074 		if x1.Aux != s {
   31075 			break
   31076 		}
   31077 		_ = x1.Args[2]
   31078 		if p != x1.Args[0] {
   31079 			break
   31080 		}
   31081 		if idx != x1.Args[1] {
   31082 			break
   31083 		}
   31084 		if mem != x1.Args[2] {
   31085 			break
   31086 		}
   31087 		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)) {
   31088 			break
   31089 		}
   31090 		b = mergePoint(b, x0, x1)
   31091 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   31092 		v.reset(OpCopy)
   31093 		v.AddArg(v0)
   31094 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   31095 		v1.AuxInt = j0
   31096 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   31097 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   31098 		v3.AuxInt = i0
   31099 		v3.Aux = s
   31100 		v3.AddArg(p)
   31101 		v3.AddArg(idx)
   31102 		v3.AddArg(mem)
   31103 		v2.AddArg(v3)
   31104 		v1.AddArg(v2)
   31105 		v0.AddArg(v1)
   31106 		v0.AddArg(y)
   31107 		return true
   31108 	}
   31109 	// 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))))
   31110 	// 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)
   31111 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   31112 	for {
   31113 		_ = v.Args[1]
   31114 		or := v.Args[0]
   31115 		if or.Op != OpS390XOR {
   31116 			break
   31117 		}
   31118 		_ = or.Args[1]
   31119 		s0 := or.Args[0]
   31120 		if s0.Op != OpS390XSLDconst {
   31121 			break
   31122 		}
   31123 		j0 := s0.AuxInt
   31124 		r0 := s0.Args[0]
   31125 		if r0.Op != OpS390XMOVHZreg {
   31126 			break
   31127 		}
   31128 		x0 := r0.Args[0]
   31129 		if x0.Op != OpS390XMOVHBRloadidx {
   31130 			break
   31131 		}
   31132 		i0 := x0.AuxInt
   31133 		s := x0.Aux
   31134 		_ = x0.Args[2]
   31135 		p := x0.Args[0]
   31136 		idx := x0.Args[1]
   31137 		mem := x0.Args[2]
   31138 		y := or.Args[1]
   31139 		s1 := v.Args[1]
   31140 		if s1.Op != OpS390XSLDconst {
   31141 			break
   31142 		}
   31143 		j1 := s1.AuxInt
   31144 		r1 := s1.Args[0]
   31145 		if r1.Op != OpS390XMOVHZreg {
   31146 			break
   31147 		}
   31148 		x1 := r1.Args[0]
   31149 		if x1.Op != OpS390XMOVHBRloadidx {
   31150 			break
   31151 		}
   31152 		i1 := x1.AuxInt
   31153 		if x1.Aux != s {
   31154 			break
   31155 		}
   31156 		_ = x1.Args[2]
   31157 		if idx != x1.Args[0] {
   31158 			break
   31159 		}
   31160 		if p != x1.Args[1] {
   31161 			break
   31162 		}
   31163 		if mem != x1.Args[2] {
   31164 			break
   31165 		}
   31166 		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)) {
   31167 			break
   31168 		}
   31169 		b = mergePoint(b, x0, x1)
   31170 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   31171 		v.reset(OpCopy)
   31172 		v.AddArg(v0)
   31173 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   31174 		v1.AuxInt = j0
   31175 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   31176 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   31177 		v3.AuxInt = i0
   31178 		v3.Aux = s
   31179 		v3.AddArg(p)
   31180 		v3.AddArg(idx)
   31181 		v3.AddArg(mem)
   31182 		v2.AddArg(v3)
   31183 		v1.AddArg(v2)
   31184 		v0.AddArg(v1)
   31185 		v0.AddArg(y)
   31186 		return true
   31187 	}
   31188 	// 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))))
   31189 	// 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)
   31190 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   31191 	for {
   31192 		_ = v.Args[1]
   31193 		or := v.Args[0]
   31194 		if or.Op != OpS390XOR {
   31195 			break
   31196 		}
   31197 		_ = or.Args[1]
   31198 		s0 := or.Args[0]
   31199 		if s0.Op != OpS390XSLDconst {
   31200 			break
   31201 		}
   31202 		j0 := s0.AuxInt
   31203 		r0 := s0.Args[0]
   31204 		if r0.Op != OpS390XMOVHZreg {
   31205 			break
   31206 		}
   31207 		x0 := r0.Args[0]
   31208 		if x0.Op != OpS390XMOVHBRloadidx {
   31209 			break
   31210 		}
   31211 		i0 := x0.AuxInt
   31212 		s := x0.Aux
   31213 		_ = x0.Args[2]
   31214 		idx := x0.Args[0]
   31215 		p := x0.Args[1]
   31216 		mem := x0.Args[2]
   31217 		y := or.Args[1]
   31218 		s1 := v.Args[1]
   31219 		if s1.Op != OpS390XSLDconst {
   31220 			break
   31221 		}
   31222 		j1 := s1.AuxInt
   31223 		r1 := s1.Args[0]
   31224 		if r1.Op != OpS390XMOVHZreg {
   31225 			break
   31226 		}
   31227 		x1 := r1.Args[0]
   31228 		if x1.Op != OpS390XMOVHBRloadidx {
   31229 			break
   31230 		}
   31231 		i1 := x1.AuxInt
   31232 		if x1.Aux != s {
   31233 			break
   31234 		}
   31235 		_ = x1.Args[2]
   31236 		if idx != x1.Args[0] {
   31237 			break
   31238 		}
   31239 		if p != x1.Args[1] {
   31240 			break
   31241 		}
   31242 		if mem != x1.Args[2] {
   31243 			break
   31244 		}
   31245 		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)) {
   31246 			break
   31247 		}
   31248 		b = mergePoint(b, x0, x1)
   31249 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   31250 		v.reset(OpCopy)
   31251 		v.AddArg(v0)
   31252 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   31253 		v1.AuxInt = j0
   31254 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   31255 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   31256 		v3.AuxInt = i0
   31257 		v3.Aux = s
   31258 		v3.AddArg(p)
   31259 		v3.AddArg(idx)
   31260 		v3.AddArg(mem)
   31261 		v2.AddArg(v3)
   31262 		v1.AddArg(v2)
   31263 		v0.AddArg(v1)
   31264 		v0.AddArg(y)
   31265 		return true
   31266 	}
   31267 	// 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))))
   31268 	// 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)
   31269 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   31270 	for {
   31271 		_ = v.Args[1]
   31272 		or := v.Args[0]
   31273 		if or.Op != OpS390XOR {
   31274 			break
   31275 		}
   31276 		_ = or.Args[1]
   31277 		y := or.Args[0]
   31278 		s0 := or.Args[1]
   31279 		if s0.Op != OpS390XSLDconst {
   31280 			break
   31281 		}
   31282 		j0 := s0.AuxInt
   31283 		r0 := s0.Args[0]
   31284 		if r0.Op != OpS390XMOVHZreg {
   31285 			break
   31286 		}
   31287 		x0 := r0.Args[0]
   31288 		if x0.Op != OpS390XMOVHBRloadidx {
   31289 			break
   31290 		}
   31291 		i0 := x0.AuxInt
   31292 		s := x0.Aux
   31293 		_ = x0.Args[2]
   31294 		p := x0.Args[0]
   31295 		idx := x0.Args[1]
   31296 		mem := x0.Args[2]
   31297 		s1 := v.Args[1]
   31298 		if s1.Op != OpS390XSLDconst {
   31299 			break
   31300 		}
   31301 		j1 := s1.AuxInt
   31302 		r1 := s1.Args[0]
   31303 		if r1.Op != OpS390XMOVHZreg {
   31304 			break
   31305 		}
   31306 		x1 := r1.Args[0]
   31307 		if x1.Op != OpS390XMOVHBRloadidx {
   31308 			break
   31309 		}
   31310 		i1 := x1.AuxInt
   31311 		if x1.Aux != s {
   31312 			break
   31313 		}
   31314 		_ = x1.Args[2]
   31315 		if idx != x1.Args[0] {
   31316 			break
   31317 		}
   31318 		if p != x1.Args[1] {
   31319 			break
   31320 		}
   31321 		if mem != x1.Args[2] {
   31322 			break
   31323 		}
   31324 		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)) {
   31325 			break
   31326 		}
   31327 		b = mergePoint(b, x0, x1)
   31328 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   31329 		v.reset(OpCopy)
   31330 		v.AddArg(v0)
   31331 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   31332 		v1.AuxInt = j0
   31333 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   31334 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   31335 		v3.AuxInt = i0
   31336 		v3.Aux = s
   31337 		v3.AddArg(p)
   31338 		v3.AddArg(idx)
   31339 		v3.AddArg(mem)
   31340 		v2.AddArg(v3)
   31341 		v1.AddArg(v2)
   31342 		v0.AddArg(v1)
   31343 		v0.AddArg(y)
   31344 		return true
   31345 	}
   31346 	// 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))))
   31347 	// 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)
   31348 	// result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
   31349 	for {
   31350 		_ = v.Args[1]
   31351 		or := v.Args[0]
   31352 		if or.Op != OpS390XOR {
   31353 			break
   31354 		}
   31355 		_ = or.Args[1]
   31356 		y := or.Args[0]
   31357 		s0 := or.Args[1]
   31358 		if s0.Op != OpS390XSLDconst {
   31359 			break
   31360 		}
   31361 		j0 := s0.AuxInt
   31362 		r0 := s0.Args[0]
   31363 		if r0.Op != OpS390XMOVHZreg {
   31364 			break
   31365 		}
   31366 		x0 := r0.Args[0]
   31367 		if x0.Op != OpS390XMOVHBRloadidx {
   31368 			break
   31369 		}
   31370 		i0 := x0.AuxInt
   31371 		s := x0.Aux
   31372 		_ = x0.Args[2]
   31373 		idx := x0.Args[0]
   31374 		p := x0.Args[1]
   31375 		mem := x0.Args[2]
   31376 		s1 := v.Args[1]
   31377 		if s1.Op != OpS390XSLDconst {
   31378 			break
   31379 		}
   31380 		j1 := s1.AuxInt
   31381 		r1 := s1.Args[0]
   31382 		if r1.Op != OpS390XMOVHZreg {
   31383 			break
   31384 		}
   31385 		x1 := r1.Args[0]
   31386 		if x1.Op != OpS390XMOVHBRloadidx {
   31387 			break
   31388 		}
   31389 		i1 := x1.AuxInt
   31390 		if x1.Aux != s {
   31391 			break
   31392 		}
   31393 		_ = x1.Args[2]
   31394 		if idx != x1.Args[0] {
   31395 			break
   31396 		}
   31397 		if p != x1.Args[1] {
   31398 			break
   31399 		}
   31400 		if mem != x1.Args[2] {
   31401 			break
   31402 		}
   31403 		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)) {
   31404 			break
   31405 		}
   31406 		b = mergePoint(b, x0, x1)
   31407 		v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type)
   31408 		v.reset(OpCopy)
   31409 		v.AddArg(v0)
   31410 		v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type)
   31411 		v1.AuxInt = j0
   31412 		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
   31413 		v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   31414 		v3.AuxInt = i0
   31415 		v3.Aux = s
   31416 		v3.AddArg(p)
   31417 		v3.AddArg(idx)
   31418 		v3.AddArg(mem)
   31419 		v2.AddArg(v3)
   31420 		v1.AddArg(v2)
   31421 		v0.AddArg(v1)
   31422 		v0.AddArg(y)
   31423 		return true
   31424 	}
   31425 	return false
   31426 }
   31427 func rewriteValueS390X_OpS390XORW_0(v *Value) bool {
   31428 	// match: (ORW x (MOVDconst [c]))
   31429 	// cond:
   31430 	// result: (ORWconst [int64(int32(c))] x)
   31431 	for {
   31432 		_ = v.Args[1]
   31433 		x := v.Args[0]
   31434 		v_1 := v.Args[1]
   31435 		if v_1.Op != OpS390XMOVDconst {
   31436 			break
   31437 		}
   31438 		c := v_1.AuxInt
   31439 		v.reset(OpS390XORWconst)
   31440 		v.AuxInt = int64(int32(c))
   31441 		v.AddArg(x)
   31442 		return true
   31443 	}
   31444 	// match: (ORW (MOVDconst [c]) x)
   31445 	// cond:
   31446 	// result: (ORWconst [int64(int32(c))] x)
   31447 	for {
   31448 		_ = v.Args[1]
   31449 		v_0 := v.Args[0]
   31450 		if v_0.Op != OpS390XMOVDconst {
   31451 			break
   31452 		}
   31453 		c := v_0.AuxInt
   31454 		x := v.Args[1]
   31455 		v.reset(OpS390XORWconst)
   31456 		v.AuxInt = int64(int32(c))
   31457 		v.AddArg(x)
   31458 		return true
   31459 	}
   31460 	// match: (ORW (SLWconst x [c]) (SRWconst x [d]))
   31461 	// cond: d == 32-c
   31462 	// result: (RLLconst [c] x)
   31463 	for {
   31464 		_ = v.Args[1]
   31465 		v_0 := v.Args[0]
   31466 		if v_0.Op != OpS390XSLWconst {
   31467 			break
   31468 		}
   31469 		c := v_0.AuxInt
   31470 		x := v_0.Args[0]
   31471 		v_1 := v.Args[1]
   31472 		if v_1.Op != OpS390XSRWconst {
   31473 			break
   31474 		}
   31475 		d := v_1.AuxInt
   31476 		if x != v_1.Args[0] {
   31477 			break
   31478 		}
   31479 		if !(d == 32-c) {
   31480 			break
   31481 		}
   31482 		v.reset(OpS390XRLLconst)
   31483 		v.AuxInt = c
   31484 		v.AddArg(x)
   31485 		return true
   31486 	}
   31487 	// match: (ORW (SRWconst x [d]) (SLWconst x [c]))
   31488 	// cond: d == 32-c
   31489 	// result: (RLLconst [c] x)
   31490 	for {
   31491 		_ = v.Args[1]
   31492 		v_0 := v.Args[0]
   31493 		if v_0.Op != OpS390XSRWconst {
   31494 			break
   31495 		}
   31496 		d := v_0.AuxInt
   31497 		x := v_0.Args[0]
   31498 		v_1 := v.Args[1]
   31499 		if v_1.Op != OpS390XSLWconst {
   31500 			break
   31501 		}
   31502 		c := v_1.AuxInt
   31503 		if x != v_1.Args[0] {
   31504 			break
   31505 		}
   31506 		if !(d == 32-c) {
   31507 			break
   31508 		}
   31509 		v.reset(OpS390XRLLconst)
   31510 		v.AuxInt = c
   31511 		v.AddArg(x)
   31512 		return true
   31513 	}
   31514 	// match: (ORW x x)
   31515 	// cond:
   31516 	// result: x
   31517 	for {
   31518 		_ = v.Args[1]
   31519 		x := v.Args[0]
   31520 		if x != v.Args[1] {
   31521 			break
   31522 		}
   31523 		v.reset(OpCopy)
   31524 		v.Type = x.Type
   31525 		v.AddArg(x)
   31526 		return true
   31527 	}
   31528 	// match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem))
   31529 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31530 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31531 	for {
   31532 		t := v.Type
   31533 		_ = v.Args[1]
   31534 		x := v.Args[0]
   31535 		g := v.Args[1]
   31536 		if g.Op != OpS390XMOVWload {
   31537 			break
   31538 		}
   31539 		off := g.AuxInt
   31540 		sym := g.Aux
   31541 		_ = g.Args[1]
   31542 		ptr := g.Args[0]
   31543 		mem := g.Args[1]
   31544 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31545 			break
   31546 		}
   31547 		v.reset(OpS390XORWload)
   31548 		v.Type = t
   31549 		v.AuxInt = off
   31550 		v.Aux = sym
   31551 		v.AddArg(x)
   31552 		v.AddArg(ptr)
   31553 		v.AddArg(mem)
   31554 		return true
   31555 	}
   31556 	// match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x)
   31557 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31558 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31559 	for {
   31560 		t := v.Type
   31561 		_ = v.Args[1]
   31562 		g := v.Args[0]
   31563 		if g.Op != OpS390XMOVWload {
   31564 			break
   31565 		}
   31566 		off := g.AuxInt
   31567 		sym := g.Aux
   31568 		_ = g.Args[1]
   31569 		ptr := g.Args[0]
   31570 		mem := g.Args[1]
   31571 		x := v.Args[1]
   31572 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31573 			break
   31574 		}
   31575 		v.reset(OpS390XORWload)
   31576 		v.Type = t
   31577 		v.AuxInt = off
   31578 		v.Aux = sym
   31579 		v.AddArg(x)
   31580 		v.AddArg(ptr)
   31581 		v.AddArg(mem)
   31582 		return true
   31583 	}
   31584 	// match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x)
   31585 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31586 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31587 	for {
   31588 		t := v.Type
   31589 		_ = v.Args[1]
   31590 		g := v.Args[0]
   31591 		if g.Op != OpS390XMOVWload {
   31592 			break
   31593 		}
   31594 		off := g.AuxInt
   31595 		sym := g.Aux
   31596 		_ = g.Args[1]
   31597 		ptr := g.Args[0]
   31598 		mem := g.Args[1]
   31599 		x := v.Args[1]
   31600 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31601 			break
   31602 		}
   31603 		v.reset(OpS390XORWload)
   31604 		v.Type = t
   31605 		v.AuxInt = off
   31606 		v.Aux = sym
   31607 		v.AddArg(x)
   31608 		v.AddArg(ptr)
   31609 		v.AddArg(mem)
   31610 		return true
   31611 	}
   31612 	// match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem))
   31613 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31614 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31615 	for {
   31616 		t := v.Type
   31617 		_ = v.Args[1]
   31618 		x := v.Args[0]
   31619 		g := v.Args[1]
   31620 		if g.Op != OpS390XMOVWload {
   31621 			break
   31622 		}
   31623 		off := g.AuxInt
   31624 		sym := g.Aux
   31625 		_ = g.Args[1]
   31626 		ptr := g.Args[0]
   31627 		mem := g.Args[1]
   31628 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31629 			break
   31630 		}
   31631 		v.reset(OpS390XORWload)
   31632 		v.Type = t
   31633 		v.AuxInt = off
   31634 		v.Aux = sym
   31635 		v.AddArg(x)
   31636 		v.AddArg(ptr)
   31637 		v.AddArg(mem)
   31638 		return true
   31639 	}
   31640 	// match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem))
   31641 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31642 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31643 	for {
   31644 		t := v.Type
   31645 		_ = v.Args[1]
   31646 		x := v.Args[0]
   31647 		g := v.Args[1]
   31648 		if g.Op != OpS390XMOVWZload {
   31649 			break
   31650 		}
   31651 		off := g.AuxInt
   31652 		sym := g.Aux
   31653 		_ = g.Args[1]
   31654 		ptr := g.Args[0]
   31655 		mem := g.Args[1]
   31656 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31657 			break
   31658 		}
   31659 		v.reset(OpS390XORWload)
   31660 		v.Type = t
   31661 		v.AuxInt = off
   31662 		v.Aux = sym
   31663 		v.AddArg(x)
   31664 		v.AddArg(ptr)
   31665 		v.AddArg(mem)
   31666 		return true
   31667 	}
   31668 	return false
   31669 }
   31670 func rewriteValueS390X_OpS390XORW_10(v *Value) bool {
   31671 	b := v.Block
   31672 	_ = b
   31673 	typ := &b.Func.Config.Types
   31674 	_ = typ
   31675 	// match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   31676 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31677 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31678 	for {
   31679 		t := v.Type
   31680 		_ = v.Args[1]
   31681 		g := v.Args[0]
   31682 		if g.Op != OpS390XMOVWZload {
   31683 			break
   31684 		}
   31685 		off := g.AuxInt
   31686 		sym := g.Aux
   31687 		_ = g.Args[1]
   31688 		ptr := g.Args[0]
   31689 		mem := g.Args[1]
   31690 		x := v.Args[1]
   31691 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31692 			break
   31693 		}
   31694 		v.reset(OpS390XORWload)
   31695 		v.Type = t
   31696 		v.AuxInt = off
   31697 		v.Aux = sym
   31698 		v.AddArg(x)
   31699 		v.AddArg(ptr)
   31700 		v.AddArg(mem)
   31701 		return true
   31702 	}
   31703 	// match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   31704 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31705 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31706 	for {
   31707 		t := v.Type
   31708 		_ = v.Args[1]
   31709 		g := v.Args[0]
   31710 		if g.Op != OpS390XMOVWZload {
   31711 			break
   31712 		}
   31713 		off := g.AuxInt
   31714 		sym := g.Aux
   31715 		_ = g.Args[1]
   31716 		ptr := g.Args[0]
   31717 		mem := g.Args[1]
   31718 		x := v.Args[1]
   31719 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31720 			break
   31721 		}
   31722 		v.reset(OpS390XORWload)
   31723 		v.Type = t
   31724 		v.AuxInt = off
   31725 		v.Aux = sym
   31726 		v.AddArg(x)
   31727 		v.AddArg(ptr)
   31728 		v.AddArg(mem)
   31729 		return true
   31730 	}
   31731 	// match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem))
   31732 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   31733 	// result: (ORWload <t> [off] {sym} x ptr mem)
   31734 	for {
   31735 		t := v.Type
   31736 		_ = v.Args[1]
   31737 		x := v.Args[0]
   31738 		g := v.Args[1]
   31739 		if g.Op != OpS390XMOVWZload {
   31740 			break
   31741 		}
   31742 		off := g.AuxInt
   31743 		sym := g.Aux
   31744 		_ = g.Args[1]
   31745 		ptr := g.Args[0]
   31746 		mem := g.Args[1]
   31747 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   31748 			break
   31749 		}
   31750 		v.reset(OpS390XORWload)
   31751 		v.Type = t
   31752 		v.AuxInt = off
   31753 		v.Aux = sym
   31754 		v.AddArg(x)
   31755 		v.AddArg(ptr)
   31756 		v.AddArg(mem)
   31757 		return true
   31758 	}
   31759 	// match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)))
   31760 	// 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)
   31761 	// result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
   31762 	for {
   31763 		_ = v.Args[1]
   31764 		x1 := v.Args[0]
   31765 		if x1.Op != OpS390XMOVBZload {
   31766 			break
   31767 		}
   31768 		i1 := x1.AuxInt
   31769 		s := x1.Aux
   31770 		_ = x1.Args[1]
   31771 		p := x1.Args[0]
   31772 		mem := x1.Args[1]
   31773 		sh := v.Args[1]
   31774 		if sh.Op != OpS390XSLWconst {
   31775 			break
   31776 		}
   31777 		if sh.AuxInt != 8 {
   31778 			break
   31779 		}
   31780 		x0 := sh.Args[0]
   31781 		if x0.Op != OpS390XMOVBZload {
   31782 			break
   31783 		}
   31784 		i0 := x0.AuxInt
   31785 		if x0.Aux != s {
   31786 			break
   31787 		}
   31788 		_ = x0.Args[1]
   31789 		if p != x0.Args[0] {
   31790 			break
   31791 		}
   31792 		if mem != x0.Args[1] {
   31793 			break
   31794 		}
   31795 		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)) {
   31796 			break
   31797 		}
   31798 		b = mergePoint(b, x0, x1)
   31799 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   31800 		v.reset(OpCopy)
   31801 		v.AddArg(v0)
   31802 		v0.AuxInt = i0
   31803 		v0.Aux = s
   31804 		v0.AddArg(p)
   31805 		v0.AddArg(mem)
   31806 		return true
   31807 	}
   31808 	// match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem))
   31809 	// 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)
   31810 	// result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem)
   31811 	for {
   31812 		_ = v.Args[1]
   31813 		sh := v.Args[0]
   31814 		if sh.Op != OpS390XSLWconst {
   31815 			break
   31816 		}
   31817 		if sh.AuxInt != 8 {
   31818 			break
   31819 		}
   31820 		x0 := sh.Args[0]
   31821 		if x0.Op != OpS390XMOVBZload {
   31822 			break
   31823 		}
   31824 		i0 := x0.AuxInt
   31825 		s := x0.Aux
   31826 		_ = x0.Args[1]
   31827 		p := x0.Args[0]
   31828 		mem := x0.Args[1]
   31829 		x1 := v.Args[1]
   31830 		if x1.Op != OpS390XMOVBZload {
   31831 			break
   31832 		}
   31833 		i1 := x1.AuxInt
   31834 		if x1.Aux != s {
   31835 			break
   31836 		}
   31837 		_ = x1.Args[1]
   31838 		if p != x1.Args[0] {
   31839 			break
   31840 		}
   31841 		if mem != x1.Args[1] {
   31842 			break
   31843 		}
   31844 		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)) {
   31845 			break
   31846 		}
   31847 		b = mergePoint(b, x0, x1)
   31848 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   31849 		v.reset(OpCopy)
   31850 		v.AddArg(v0)
   31851 		v0.AuxInt = i0
   31852 		v0.Aux = s
   31853 		v0.AddArg(p)
   31854 		v0.AddArg(mem)
   31855 		return true
   31856 	}
   31857 	// match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)))
   31858 	// 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)
   31859 	// result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
   31860 	for {
   31861 		_ = v.Args[1]
   31862 		x1 := v.Args[0]
   31863 		if x1.Op != OpS390XMOVHZload {
   31864 			break
   31865 		}
   31866 		i1 := x1.AuxInt
   31867 		s := x1.Aux
   31868 		_ = x1.Args[1]
   31869 		p := x1.Args[0]
   31870 		mem := x1.Args[1]
   31871 		sh := v.Args[1]
   31872 		if sh.Op != OpS390XSLWconst {
   31873 			break
   31874 		}
   31875 		if sh.AuxInt != 16 {
   31876 			break
   31877 		}
   31878 		x0 := sh.Args[0]
   31879 		if x0.Op != OpS390XMOVHZload {
   31880 			break
   31881 		}
   31882 		i0 := x0.AuxInt
   31883 		if x0.Aux != s {
   31884 			break
   31885 		}
   31886 		_ = x0.Args[1]
   31887 		if p != x0.Args[0] {
   31888 			break
   31889 		}
   31890 		if mem != x0.Args[1] {
   31891 			break
   31892 		}
   31893 		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)) {
   31894 			break
   31895 		}
   31896 		b = mergePoint(b, x0, x1)
   31897 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   31898 		v.reset(OpCopy)
   31899 		v.AddArg(v0)
   31900 		v0.AuxInt = i0
   31901 		v0.Aux = s
   31902 		v0.AddArg(p)
   31903 		v0.AddArg(mem)
   31904 		return true
   31905 	}
   31906 	// match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem))
   31907 	// 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)
   31908 	// result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem)
   31909 	for {
   31910 		_ = v.Args[1]
   31911 		sh := v.Args[0]
   31912 		if sh.Op != OpS390XSLWconst {
   31913 			break
   31914 		}
   31915 		if sh.AuxInt != 16 {
   31916 			break
   31917 		}
   31918 		x0 := sh.Args[0]
   31919 		if x0.Op != OpS390XMOVHZload {
   31920 			break
   31921 		}
   31922 		i0 := x0.AuxInt
   31923 		s := x0.Aux
   31924 		_ = x0.Args[1]
   31925 		p := x0.Args[0]
   31926 		mem := x0.Args[1]
   31927 		x1 := v.Args[1]
   31928 		if x1.Op != OpS390XMOVHZload {
   31929 			break
   31930 		}
   31931 		i1 := x1.AuxInt
   31932 		if x1.Aux != s {
   31933 			break
   31934 		}
   31935 		_ = x1.Args[1]
   31936 		if p != x1.Args[0] {
   31937 			break
   31938 		}
   31939 		if mem != x1.Args[1] {
   31940 			break
   31941 		}
   31942 		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)) {
   31943 			break
   31944 		}
   31945 		b = mergePoint(b, x0, x1)
   31946 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
   31947 		v.reset(OpCopy)
   31948 		v.AddArg(v0)
   31949 		v0.AuxInt = i0
   31950 		v0.Aux = s
   31951 		v0.AddArg(p)
   31952 		v0.AddArg(mem)
   31953 		return true
   31954 	}
   31955 	// match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y))
   31956 	// 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)
   31957 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   31958 	for {
   31959 		_ = v.Args[1]
   31960 		s0 := v.Args[0]
   31961 		if s0.Op != OpS390XSLWconst {
   31962 			break
   31963 		}
   31964 		j0 := s0.AuxInt
   31965 		x0 := s0.Args[0]
   31966 		if x0.Op != OpS390XMOVBZload {
   31967 			break
   31968 		}
   31969 		i0 := x0.AuxInt
   31970 		s := x0.Aux
   31971 		_ = x0.Args[1]
   31972 		p := x0.Args[0]
   31973 		mem := x0.Args[1]
   31974 		or := v.Args[1]
   31975 		if or.Op != OpS390XORW {
   31976 			break
   31977 		}
   31978 		_ = or.Args[1]
   31979 		s1 := or.Args[0]
   31980 		if s1.Op != OpS390XSLWconst {
   31981 			break
   31982 		}
   31983 		j1 := s1.AuxInt
   31984 		x1 := s1.Args[0]
   31985 		if x1.Op != OpS390XMOVBZload {
   31986 			break
   31987 		}
   31988 		i1 := x1.AuxInt
   31989 		if x1.Aux != s {
   31990 			break
   31991 		}
   31992 		_ = x1.Args[1]
   31993 		if p != x1.Args[0] {
   31994 			break
   31995 		}
   31996 		if mem != x1.Args[1] {
   31997 			break
   31998 		}
   31999 		y := or.Args[1]
   32000 		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)) {
   32001 			break
   32002 		}
   32003 		b = mergePoint(b, x0, x1)
   32004 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   32005 		v.reset(OpCopy)
   32006 		v.AddArg(v0)
   32007 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   32008 		v1.AuxInt = j1
   32009 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   32010 		v2.AuxInt = i0
   32011 		v2.Aux = s
   32012 		v2.AddArg(p)
   32013 		v2.AddArg(mem)
   32014 		v1.AddArg(v2)
   32015 		v0.AddArg(v1)
   32016 		v0.AddArg(y)
   32017 		return true
   32018 	}
   32019 	// match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))))
   32020 	// 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)
   32021 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   32022 	for {
   32023 		_ = v.Args[1]
   32024 		s0 := v.Args[0]
   32025 		if s0.Op != OpS390XSLWconst {
   32026 			break
   32027 		}
   32028 		j0 := s0.AuxInt
   32029 		x0 := s0.Args[0]
   32030 		if x0.Op != OpS390XMOVBZload {
   32031 			break
   32032 		}
   32033 		i0 := x0.AuxInt
   32034 		s := x0.Aux
   32035 		_ = x0.Args[1]
   32036 		p := x0.Args[0]
   32037 		mem := x0.Args[1]
   32038 		or := v.Args[1]
   32039 		if or.Op != OpS390XORW {
   32040 			break
   32041 		}
   32042 		_ = or.Args[1]
   32043 		y := or.Args[0]
   32044 		s1 := or.Args[1]
   32045 		if s1.Op != OpS390XSLWconst {
   32046 			break
   32047 		}
   32048 		j1 := s1.AuxInt
   32049 		x1 := s1.Args[0]
   32050 		if x1.Op != OpS390XMOVBZload {
   32051 			break
   32052 		}
   32053 		i1 := x1.AuxInt
   32054 		if x1.Aux != s {
   32055 			break
   32056 		}
   32057 		_ = x1.Args[1]
   32058 		if p != x1.Args[0] {
   32059 			break
   32060 		}
   32061 		if mem != x1.Args[1] {
   32062 			break
   32063 		}
   32064 		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)) {
   32065 			break
   32066 		}
   32067 		b = mergePoint(b, x0, x1)
   32068 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   32069 		v.reset(OpCopy)
   32070 		v.AddArg(v0)
   32071 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   32072 		v1.AuxInt = j1
   32073 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   32074 		v2.AuxInt = i0
   32075 		v2.Aux = s
   32076 		v2.AddArg(p)
   32077 		v2.AddArg(mem)
   32078 		v1.AddArg(v2)
   32079 		v0.AddArg(v1)
   32080 		v0.AddArg(y)
   32081 		return true
   32082 	}
   32083 	// match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))
   32084 	// 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)
   32085 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   32086 	for {
   32087 		_ = v.Args[1]
   32088 		or := v.Args[0]
   32089 		if or.Op != OpS390XORW {
   32090 			break
   32091 		}
   32092 		_ = or.Args[1]
   32093 		s1 := or.Args[0]
   32094 		if s1.Op != OpS390XSLWconst {
   32095 			break
   32096 		}
   32097 		j1 := s1.AuxInt
   32098 		x1 := s1.Args[0]
   32099 		if x1.Op != OpS390XMOVBZload {
   32100 			break
   32101 		}
   32102 		i1 := x1.AuxInt
   32103 		s := x1.Aux
   32104 		_ = x1.Args[1]
   32105 		p := x1.Args[0]
   32106 		mem := x1.Args[1]
   32107 		y := or.Args[1]
   32108 		s0 := v.Args[1]
   32109 		if s0.Op != OpS390XSLWconst {
   32110 			break
   32111 		}
   32112 		j0 := s0.AuxInt
   32113 		x0 := s0.Args[0]
   32114 		if x0.Op != OpS390XMOVBZload {
   32115 			break
   32116 		}
   32117 		i0 := x0.AuxInt
   32118 		if x0.Aux != s {
   32119 			break
   32120 		}
   32121 		_ = x0.Args[1]
   32122 		if p != x0.Args[0] {
   32123 			break
   32124 		}
   32125 		if mem != x0.Args[1] {
   32126 			break
   32127 		}
   32128 		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)) {
   32129 			break
   32130 		}
   32131 		b = mergePoint(b, x0, x1)
   32132 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   32133 		v.reset(OpCopy)
   32134 		v.AddArg(v0)
   32135 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   32136 		v1.AuxInt = j1
   32137 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   32138 		v2.AuxInt = i0
   32139 		v2.Aux = s
   32140 		v2.AddArg(p)
   32141 		v2.AddArg(mem)
   32142 		v1.AddArg(v2)
   32143 		v0.AddArg(v1)
   32144 		v0.AddArg(y)
   32145 		return true
   32146 	}
   32147 	return false
   32148 }
   32149 func rewriteValueS390X_OpS390XORW_20(v *Value) bool {
   32150 	b := v.Block
   32151 	_ = b
   32152 	typ := &b.Func.Config.Types
   32153 	_ = typ
   32154 	// match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))
   32155 	// 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)
   32156 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y)
   32157 	for {
   32158 		_ = v.Args[1]
   32159 		or := v.Args[0]
   32160 		if or.Op != OpS390XORW {
   32161 			break
   32162 		}
   32163 		_ = or.Args[1]
   32164 		y := or.Args[0]
   32165 		s1 := or.Args[1]
   32166 		if s1.Op != OpS390XSLWconst {
   32167 			break
   32168 		}
   32169 		j1 := s1.AuxInt
   32170 		x1 := s1.Args[0]
   32171 		if x1.Op != OpS390XMOVBZload {
   32172 			break
   32173 		}
   32174 		i1 := x1.AuxInt
   32175 		s := x1.Aux
   32176 		_ = x1.Args[1]
   32177 		p := x1.Args[0]
   32178 		mem := x1.Args[1]
   32179 		s0 := v.Args[1]
   32180 		if s0.Op != OpS390XSLWconst {
   32181 			break
   32182 		}
   32183 		j0 := s0.AuxInt
   32184 		x0 := s0.Args[0]
   32185 		if x0.Op != OpS390XMOVBZload {
   32186 			break
   32187 		}
   32188 		i0 := x0.AuxInt
   32189 		if x0.Aux != s {
   32190 			break
   32191 		}
   32192 		_ = x0.Args[1]
   32193 		if p != x0.Args[0] {
   32194 			break
   32195 		}
   32196 		if mem != x0.Args[1] {
   32197 			break
   32198 		}
   32199 		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)) {
   32200 			break
   32201 		}
   32202 		b = mergePoint(b, x0, x1)
   32203 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   32204 		v.reset(OpCopy)
   32205 		v.AddArg(v0)
   32206 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   32207 		v1.AuxInt = j1
   32208 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
   32209 		v2.AuxInt = i0
   32210 		v2.Aux = s
   32211 		v2.AddArg(p)
   32212 		v2.AddArg(mem)
   32213 		v1.AddArg(v2)
   32214 		v0.AddArg(v1)
   32215 		v0.AddArg(y)
   32216 		return true
   32217 	}
   32218 	// match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)))
   32219 	// 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)
   32220 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32221 	for {
   32222 		_ = v.Args[1]
   32223 		x1 := v.Args[0]
   32224 		if x1.Op != OpS390XMOVBZloadidx {
   32225 			break
   32226 		}
   32227 		i1 := x1.AuxInt
   32228 		s := x1.Aux
   32229 		_ = x1.Args[2]
   32230 		p := x1.Args[0]
   32231 		idx := x1.Args[1]
   32232 		mem := x1.Args[2]
   32233 		sh := v.Args[1]
   32234 		if sh.Op != OpS390XSLWconst {
   32235 			break
   32236 		}
   32237 		if sh.AuxInt != 8 {
   32238 			break
   32239 		}
   32240 		x0 := sh.Args[0]
   32241 		if x0.Op != OpS390XMOVBZloadidx {
   32242 			break
   32243 		}
   32244 		i0 := x0.AuxInt
   32245 		if x0.Aux != s {
   32246 			break
   32247 		}
   32248 		_ = x0.Args[2]
   32249 		if p != x0.Args[0] {
   32250 			break
   32251 		}
   32252 		if idx != x0.Args[1] {
   32253 			break
   32254 		}
   32255 		if mem != x0.Args[2] {
   32256 			break
   32257 		}
   32258 		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)) {
   32259 			break
   32260 		}
   32261 		b = mergePoint(b, x0, x1)
   32262 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32263 		v.reset(OpCopy)
   32264 		v.AddArg(v0)
   32265 		v0.AuxInt = i0
   32266 		v0.Aux = s
   32267 		v0.AddArg(p)
   32268 		v0.AddArg(idx)
   32269 		v0.AddArg(mem)
   32270 		return true
   32271 	}
   32272 	// match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)))
   32273 	// 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)
   32274 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32275 	for {
   32276 		_ = v.Args[1]
   32277 		x1 := v.Args[0]
   32278 		if x1.Op != OpS390XMOVBZloadidx {
   32279 			break
   32280 		}
   32281 		i1 := x1.AuxInt
   32282 		s := x1.Aux
   32283 		_ = x1.Args[2]
   32284 		idx := x1.Args[0]
   32285 		p := x1.Args[1]
   32286 		mem := x1.Args[2]
   32287 		sh := v.Args[1]
   32288 		if sh.Op != OpS390XSLWconst {
   32289 			break
   32290 		}
   32291 		if sh.AuxInt != 8 {
   32292 			break
   32293 		}
   32294 		x0 := sh.Args[0]
   32295 		if x0.Op != OpS390XMOVBZloadidx {
   32296 			break
   32297 		}
   32298 		i0 := x0.AuxInt
   32299 		if x0.Aux != s {
   32300 			break
   32301 		}
   32302 		_ = x0.Args[2]
   32303 		if p != x0.Args[0] {
   32304 			break
   32305 		}
   32306 		if idx != x0.Args[1] {
   32307 			break
   32308 		}
   32309 		if mem != x0.Args[2] {
   32310 			break
   32311 		}
   32312 		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)) {
   32313 			break
   32314 		}
   32315 		b = mergePoint(b, x0, x1)
   32316 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32317 		v.reset(OpCopy)
   32318 		v.AddArg(v0)
   32319 		v0.AuxInt = i0
   32320 		v0.Aux = s
   32321 		v0.AddArg(p)
   32322 		v0.AddArg(idx)
   32323 		v0.AddArg(mem)
   32324 		return true
   32325 	}
   32326 	// match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)))
   32327 	// 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)
   32328 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32329 	for {
   32330 		_ = v.Args[1]
   32331 		x1 := v.Args[0]
   32332 		if x1.Op != OpS390XMOVBZloadidx {
   32333 			break
   32334 		}
   32335 		i1 := x1.AuxInt
   32336 		s := x1.Aux
   32337 		_ = x1.Args[2]
   32338 		p := x1.Args[0]
   32339 		idx := x1.Args[1]
   32340 		mem := x1.Args[2]
   32341 		sh := v.Args[1]
   32342 		if sh.Op != OpS390XSLWconst {
   32343 			break
   32344 		}
   32345 		if sh.AuxInt != 8 {
   32346 			break
   32347 		}
   32348 		x0 := sh.Args[0]
   32349 		if x0.Op != OpS390XMOVBZloadidx {
   32350 			break
   32351 		}
   32352 		i0 := x0.AuxInt
   32353 		if x0.Aux != s {
   32354 			break
   32355 		}
   32356 		_ = x0.Args[2]
   32357 		if idx != x0.Args[0] {
   32358 			break
   32359 		}
   32360 		if p != x0.Args[1] {
   32361 			break
   32362 		}
   32363 		if mem != x0.Args[2] {
   32364 			break
   32365 		}
   32366 		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)) {
   32367 			break
   32368 		}
   32369 		b = mergePoint(b, x0, x1)
   32370 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32371 		v.reset(OpCopy)
   32372 		v.AddArg(v0)
   32373 		v0.AuxInt = i0
   32374 		v0.Aux = s
   32375 		v0.AddArg(p)
   32376 		v0.AddArg(idx)
   32377 		v0.AddArg(mem)
   32378 		return true
   32379 	}
   32380 	// match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)))
   32381 	// 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)
   32382 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32383 	for {
   32384 		_ = v.Args[1]
   32385 		x1 := v.Args[0]
   32386 		if x1.Op != OpS390XMOVBZloadidx {
   32387 			break
   32388 		}
   32389 		i1 := x1.AuxInt
   32390 		s := x1.Aux
   32391 		_ = x1.Args[2]
   32392 		idx := x1.Args[0]
   32393 		p := x1.Args[1]
   32394 		mem := x1.Args[2]
   32395 		sh := v.Args[1]
   32396 		if sh.Op != OpS390XSLWconst {
   32397 			break
   32398 		}
   32399 		if sh.AuxInt != 8 {
   32400 			break
   32401 		}
   32402 		x0 := sh.Args[0]
   32403 		if x0.Op != OpS390XMOVBZloadidx {
   32404 			break
   32405 		}
   32406 		i0 := x0.AuxInt
   32407 		if x0.Aux != s {
   32408 			break
   32409 		}
   32410 		_ = x0.Args[2]
   32411 		if idx != x0.Args[0] {
   32412 			break
   32413 		}
   32414 		if p != x0.Args[1] {
   32415 			break
   32416 		}
   32417 		if mem != x0.Args[2] {
   32418 			break
   32419 		}
   32420 		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)) {
   32421 			break
   32422 		}
   32423 		b = mergePoint(b, x0, x1)
   32424 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32425 		v.reset(OpCopy)
   32426 		v.AddArg(v0)
   32427 		v0.AuxInt = i0
   32428 		v0.Aux = s
   32429 		v0.AddArg(p)
   32430 		v0.AddArg(idx)
   32431 		v0.AddArg(mem)
   32432 		return true
   32433 	}
   32434 	// match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem))
   32435 	// 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)
   32436 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32437 	for {
   32438 		_ = v.Args[1]
   32439 		sh := v.Args[0]
   32440 		if sh.Op != OpS390XSLWconst {
   32441 			break
   32442 		}
   32443 		if sh.AuxInt != 8 {
   32444 			break
   32445 		}
   32446 		x0 := sh.Args[0]
   32447 		if x0.Op != OpS390XMOVBZloadidx {
   32448 			break
   32449 		}
   32450 		i0 := x0.AuxInt
   32451 		s := x0.Aux
   32452 		_ = x0.Args[2]
   32453 		p := x0.Args[0]
   32454 		idx := x0.Args[1]
   32455 		mem := x0.Args[2]
   32456 		x1 := v.Args[1]
   32457 		if x1.Op != OpS390XMOVBZloadidx {
   32458 			break
   32459 		}
   32460 		i1 := x1.AuxInt
   32461 		if x1.Aux != s {
   32462 			break
   32463 		}
   32464 		_ = x1.Args[2]
   32465 		if p != x1.Args[0] {
   32466 			break
   32467 		}
   32468 		if idx != x1.Args[1] {
   32469 			break
   32470 		}
   32471 		if mem != x1.Args[2] {
   32472 			break
   32473 		}
   32474 		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)) {
   32475 			break
   32476 		}
   32477 		b = mergePoint(b, x0, x1)
   32478 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32479 		v.reset(OpCopy)
   32480 		v.AddArg(v0)
   32481 		v0.AuxInt = i0
   32482 		v0.Aux = s
   32483 		v0.AddArg(p)
   32484 		v0.AddArg(idx)
   32485 		v0.AddArg(mem)
   32486 		return true
   32487 	}
   32488 	// match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem))
   32489 	// 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)
   32490 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32491 	for {
   32492 		_ = v.Args[1]
   32493 		sh := v.Args[0]
   32494 		if sh.Op != OpS390XSLWconst {
   32495 			break
   32496 		}
   32497 		if sh.AuxInt != 8 {
   32498 			break
   32499 		}
   32500 		x0 := sh.Args[0]
   32501 		if x0.Op != OpS390XMOVBZloadidx {
   32502 			break
   32503 		}
   32504 		i0 := x0.AuxInt
   32505 		s := x0.Aux
   32506 		_ = x0.Args[2]
   32507 		idx := x0.Args[0]
   32508 		p := x0.Args[1]
   32509 		mem := x0.Args[2]
   32510 		x1 := v.Args[1]
   32511 		if x1.Op != OpS390XMOVBZloadidx {
   32512 			break
   32513 		}
   32514 		i1 := x1.AuxInt
   32515 		if x1.Aux != s {
   32516 			break
   32517 		}
   32518 		_ = x1.Args[2]
   32519 		if p != x1.Args[0] {
   32520 			break
   32521 		}
   32522 		if idx != x1.Args[1] {
   32523 			break
   32524 		}
   32525 		if mem != x1.Args[2] {
   32526 			break
   32527 		}
   32528 		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)) {
   32529 			break
   32530 		}
   32531 		b = mergePoint(b, x0, x1)
   32532 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32533 		v.reset(OpCopy)
   32534 		v.AddArg(v0)
   32535 		v0.AuxInt = i0
   32536 		v0.Aux = s
   32537 		v0.AddArg(p)
   32538 		v0.AddArg(idx)
   32539 		v0.AddArg(mem)
   32540 		return true
   32541 	}
   32542 	// match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem))
   32543 	// 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)
   32544 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32545 	for {
   32546 		_ = v.Args[1]
   32547 		sh := v.Args[0]
   32548 		if sh.Op != OpS390XSLWconst {
   32549 			break
   32550 		}
   32551 		if sh.AuxInt != 8 {
   32552 			break
   32553 		}
   32554 		x0 := sh.Args[0]
   32555 		if x0.Op != OpS390XMOVBZloadidx {
   32556 			break
   32557 		}
   32558 		i0 := x0.AuxInt
   32559 		s := x0.Aux
   32560 		_ = x0.Args[2]
   32561 		p := x0.Args[0]
   32562 		idx := x0.Args[1]
   32563 		mem := x0.Args[2]
   32564 		x1 := v.Args[1]
   32565 		if x1.Op != OpS390XMOVBZloadidx {
   32566 			break
   32567 		}
   32568 		i1 := x1.AuxInt
   32569 		if x1.Aux != s {
   32570 			break
   32571 		}
   32572 		_ = x1.Args[2]
   32573 		if idx != x1.Args[0] {
   32574 			break
   32575 		}
   32576 		if p != x1.Args[1] {
   32577 			break
   32578 		}
   32579 		if mem != x1.Args[2] {
   32580 			break
   32581 		}
   32582 		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)) {
   32583 			break
   32584 		}
   32585 		b = mergePoint(b, x0, x1)
   32586 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32587 		v.reset(OpCopy)
   32588 		v.AddArg(v0)
   32589 		v0.AuxInt = i0
   32590 		v0.Aux = s
   32591 		v0.AddArg(p)
   32592 		v0.AddArg(idx)
   32593 		v0.AddArg(mem)
   32594 		return true
   32595 	}
   32596 	// match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem))
   32597 	// 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)
   32598 	// result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem)
   32599 	for {
   32600 		_ = v.Args[1]
   32601 		sh := v.Args[0]
   32602 		if sh.Op != OpS390XSLWconst {
   32603 			break
   32604 		}
   32605 		if sh.AuxInt != 8 {
   32606 			break
   32607 		}
   32608 		x0 := sh.Args[0]
   32609 		if x0.Op != OpS390XMOVBZloadidx {
   32610 			break
   32611 		}
   32612 		i0 := x0.AuxInt
   32613 		s := x0.Aux
   32614 		_ = x0.Args[2]
   32615 		idx := x0.Args[0]
   32616 		p := x0.Args[1]
   32617 		mem := x0.Args[2]
   32618 		x1 := v.Args[1]
   32619 		if x1.Op != OpS390XMOVBZloadidx {
   32620 			break
   32621 		}
   32622 		i1 := x1.AuxInt
   32623 		if x1.Aux != s {
   32624 			break
   32625 		}
   32626 		_ = x1.Args[2]
   32627 		if idx != x1.Args[0] {
   32628 			break
   32629 		}
   32630 		if p != x1.Args[1] {
   32631 			break
   32632 		}
   32633 		if mem != x1.Args[2] {
   32634 			break
   32635 		}
   32636 		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)) {
   32637 			break
   32638 		}
   32639 		b = mergePoint(b, x0, x1)
   32640 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   32641 		v.reset(OpCopy)
   32642 		v.AddArg(v0)
   32643 		v0.AuxInt = i0
   32644 		v0.Aux = s
   32645 		v0.AddArg(p)
   32646 		v0.AddArg(idx)
   32647 		v0.AddArg(mem)
   32648 		return true
   32649 	}
   32650 	// match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)))
   32651 	// 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)
   32652 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32653 	for {
   32654 		_ = v.Args[1]
   32655 		x1 := v.Args[0]
   32656 		if x1.Op != OpS390XMOVHZloadidx {
   32657 			break
   32658 		}
   32659 		i1 := x1.AuxInt
   32660 		s := x1.Aux
   32661 		_ = x1.Args[2]
   32662 		p := x1.Args[0]
   32663 		idx := x1.Args[1]
   32664 		mem := x1.Args[2]
   32665 		sh := v.Args[1]
   32666 		if sh.Op != OpS390XSLWconst {
   32667 			break
   32668 		}
   32669 		if sh.AuxInt != 16 {
   32670 			break
   32671 		}
   32672 		x0 := sh.Args[0]
   32673 		if x0.Op != OpS390XMOVHZloadidx {
   32674 			break
   32675 		}
   32676 		i0 := x0.AuxInt
   32677 		if x0.Aux != s {
   32678 			break
   32679 		}
   32680 		_ = x0.Args[2]
   32681 		if p != x0.Args[0] {
   32682 			break
   32683 		}
   32684 		if idx != x0.Args[1] {
   32685 			break
   32686 		}
   32687 		if mem != x0.Args[2] {
   32688 			break
   32689 		}
   32690 		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)) {
   32691 			break
   32692 		}
   32693 		b = mergePoint(b, x0, x1)
   32694 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   32695 		v.reset(OpCopy)
   32696 		v.AddArg(v0)
   32697 		v0.AuxInt = i0
   32698 		v0.Aux = s
   32699 		v0.AddArg(p)
   32700 		v0.AddArg(idx)
   32701 		v0.AddArg(mem)
   32702 		return true
   32703 	}
   32704 	return false
   32705 }
   32706 func rewriteValueS390X_OpS390XORW_30(v *Value) bool {
   32707 	b := v.Block
   32708 	_ = b
   32709 	typ := &b.Func.Config.Types
   32710 	_ = typ
   32711 	// match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)))
   32712 	// 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)
   32713 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32714 	for {
   32715 		_ = v.Args[1]
   32716 		x1 := v.Args[0]
   32717 		if x1.Op != OpS390XMOVHZloadidx {
   32718 			break
   32719 		}
   32720 		i1 := x1.AuxInt
   32721 		s := x1.Aux
   32722 		_ = x1.Args[2]
   32723 		idx := x1.Args[0]
   32724 		p := x1.Args[1]
   32725 		mem := x1.Args[2]
   32726 		sh := v.Args[1]
   32727 		if sh.Op != OpS390XSLWconst {
   32728 			break
   32729 		}
   32730 		if sh.AuxInt != 16 {
   32731 			break
   32732 		}
   32733 		x0 := sh.Args[0]
   32734 		if x0.Op != OpS390XMOVHZloadidx {
   32735 			break
   32736 		}
   32737 		i0 := x0.AuxInt
   32738 		if x0.Aux != s {
   32739 			break
   32740 		}
   32741 		_ = x0.Args[2]
   32742 		if p != x0.Args[0] {
   32743 			break
   32744 		}
   32745 		if idx != x0.Args[1] {
   32746 			break
   32747 		}
   32748 		if mem != x0.Args[2] {
   32749 			break
   32750 		}
   32751 		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)) {
   32752 			break
   32753 		}
   32754 		b = mergePoint(b, x0, x1)
   32755 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   32756 		v.reset(OpCopy)
   32757 		v.AddArg(v0)
   32758 		v0.AuxInt = i0
   32759 		v0.Aux = s
   32760 		v0.AddArg(p)
   32761 		v0.AddArg(idx)
   32762 		v0.AddArg(mem)
   32763 		return true
   32764 	}
   32765 	// match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)))
   32766 	// 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)
   32767 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32768 	for {
   32769 		_ = v.Args[1]
   32770 		x1 := v.Args[0]
   32771 		if x1.Op != OpS390XMOVHZloadidx {
   32772 			break
   32773 		}
   32774 		i1 := x1.AuxInt
   32775 		s := x1.Aux
   32776 		_ = x1.Args[2]
   32777 		p := x1.Args[0]
   32778 		idx := x1.Args[1]
   32779 		mem := x1.Args[2]
   32780 		sh := v.Args[1]
   32781 		if sh.Op != OpS390XSLWconst {
   32782 			break
   32783 		}
   32784 		if sh.AuxInt != 16 {
   32785 			break
   32786 		}
   32787 		x0 := sh.Args[0]
   32788 		if x0.Op != OpS390XMOVHZloadidx {
   32789 			break
   32790 		}
   32791 		i0 := x0.AuxInt
   32792 		if x0.Aux != s {
   32793 			break
   32794 		}
   32795 		_ = x0.Args[2]
   32796 		if idx != x0.Args[0] {
   32797 			break
   32798 		}
   32799 		if p != x0.Args[1] {
   32800 			break
   32801 		}
   32802 		if mem != x0.Args[2] {
   32803 			break
   32804 		}
   32805 		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)) {
   32806 			break
   32807 		}
   32808 		b = mergePoint(b, x0, x1)
   32809 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   32810 		v.reset(OpCopy)
   32811 		v.AddArg(v0)
   32812 		v0.AuxInt = i0
   32813 		v0.Aux = s
   32814 		v0.AddArg(p)
   32815 		v0.AddArg(idx)
   32816 		v0.AddArg(mem)
   32817 		return true
   32818 	}
   32819 	// match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)))
   32820 	// 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)
   32821 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32822 	for {
   32823 		_ = v.Args[1]
   32824 		x1 := v.Args[0]
   32825 		if x1.Op != OpS390XMOVHZloadidx {
   32826 			break
   32827 		}
   32828 		i1 := x1.AuxInt
   32829 		s := x1.Aux
   32830 		_ = x1.Args[2]
   32831 		idx := x1.Args[0]
   32832 		p := x1.Args[1]
   32833 		mem := x1.Args[2]
   32834 		sh := v.Args[1]
   32835 		if sh.Op != OpS390XSLWconst {
   32836 			break
   32837 		}
   32838 		if sh.AuxInt != 16 {
   32839 			break
   32840 		}
   32841 		x0 := sh.Args[0]
   32842 		if x0.Op != OpS390XMOVHZloadidx {
   32843 			break
   32844 		}
   32845 		i0 := x0.AuxInt
   32846 		if x0.Aux != s {
   32847 			break
   32848 		}
   32849 		_ = x0.Args[2]
   32850 		if idx != x0.Args[0] {
   32851 			break
   32852 		}
   32853 		if p != x0.Args[1] {
   32854 			break
   32855 		}
   32856 		if mem != x0.Args[2] {
   32857 			break
   32858 		}
   32859 		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)) {
   32860 			break
   32861 		}
   32862 		b = mergePoint(b, x0, x1)
   32863 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   32864 		v.reset(OpCopy)
   32865 		v.AddArg(v0)
   32866 		v0.AuxInt = i0
   32867 		v0.Aux = s
   32868 		v0.AddArg(p)
   32869 		v0.AddArg(idx)
   32870 		v0.AddArg(mem)
   32871 		return true
   32872 	}
   32873 	// match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem))
   32874 	// 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)
   32875 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32876 	for {
   32877 		_ = v.Args[1]
   32878 		sh := v.Args[0]
   32879 		if sh.Op != OpS390XSLWconst {
   32880 			break
   32881 		}
   32882 		if sh.AuxInt != 16 {
   32883 			break
   32884 		}
   32885 		x0 := sh.Args[0]
   32886 		if x0.Op != OpS390XMOVHZloadidx {
   32887 			break
   32888 		}
   32889 		i0 := x0.AuxInt
   32890 		s := x0.Aux
   32891 		_ = x0.Args[2]
   32892 		p := x0.Args[0]
   32893 		idx := x0.Args[1]
   32894 		mem := x0.Args[2]
   32895 		x1 := v.Args[1]
   32896 		if x1.Op != OpS390XMOVHZloadidx {
   32897 			break
   32898 		}
   32899 		i1 := x1.AuxInt
   32900 		if x1.Aux != s {
   32901 			break
   32902 		}
   32903 		_ = x1.Args[2]
   32904 		if p != x1.Args[0] {
   32905 			break
   32906 		}
   32907 		if idx != x1.Args[1] {
   32908 			break
   32909 		}
   32910 		if mem != x1.Args[2] {
   32911 			break
   32912 		}
   32913 		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)) {
   32914 			break
   32915 		}
   32916 		b = mergePoint(b, x0, x1)
   32917 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   32918 		v.reset(OpCopy)
   32919 		v.AddArg(v0)
   32920 		v0.AuxInt = i0
   32921 		v0.Aux = s
   32922 		v0.AddArg(p)
   32923 		v0.AddArg(idx)
   32924 		v0.AddArg(mem)
   32925 		return true
   32926 	}
   32927 	// match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem))
   32928 	// 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)
   32929 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32930 	for {
   32931 		_ = v.Args[1]
   32932 		sh := v.Args[0]
   32933 		if sh.Op != OpS390XSLWconst {
   32934 			break
   32935 		}
   32936 		if sh.AuxInt != 16 {
   32937 			break
   32938 		}
   32939 		x0 := sh.Args[0]
   32940 		if x0.Op != OpS390XMOVHZloadidx {
   32941 			break
   32942 		}
   32943 		i0 := x0.AuxInt
   32944 		s := x0.Aux
   32945 		_ = x0.Args[2]
   32946 		idx := x0.Args[0]
   32947 		p := x0.Args[1]
   32948 		mem := x0.Args[2]
   32949 		x1 := v.Args[1]
   32950 		if x1.Op != OpS390XMOVHZloadidx {
   32951 			break
   32952 		}
   32953 		i1 := x1.AuxInt
   32954 		if x1.Aux != s {
   32955 			break
   32956 		}
   32957 		_ = x1.Args[2]
   32958 		if p != x1.Args[0] {
   32959 			break
   32960 		}
   32961 		if idx != x1.Args[1] {
   32962 			break
   32963 		}
   32964 		if mem != x1.Args[2] {
   32965 			break
   32966 		}
   32967 		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)) {
   32968 			break
   32969 		}
   32970 		b = mergePoint(b, x0, x1)
   32971 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   32972 		v.reset(OpCopy)
   32973 		v.AddArg(v0)
   32974 		v0.AuxInt = i0
   32975 		v0.Aux = s
   32976 		v0.AddArg(p)
   32977 		v0.AddArg(idx)
   32978 		v0.AddArg(mem)
   32979 		return true
   32980 	}
   32981 	// match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem))
   32982 	// 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)
   32983 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   32984 	for {
   32985 		_ = v.Args[1]
   32986 		sh := v.Args[0]
   32987 		if sh.Op != OpS390XSLWconst {
   32988 			break
   32989 		}
   32990 		if sh.AuxInt != 16 {
   32991 			break
   32992 		}
   32993 		x0 := sh.Args[0]
   32994 		if x0.Op != OpS390XMOVHZloadidx {
   32995 			break
   32996 		}
   32997 		i0 := x0.AuxInt
   32998 		s := x0.Aux
   32999 		_ = x0.Args[2]
   33000 		p := x0.Args[0]
   33001 		idx := x0.Args[1]
   33002 		mem := x0.Args[2]
   33003 		x1 := v.Args[1]
   33004 		if x1.Op != OpS390XMOVHZloadidx {
   33005 			break
   33006 		}
   33007 		i1 := x1.AuxInt
   33008 		if x1.Aux != s {
   33009 			break
   33010 		}
   33011 		_ = x1.Args[2]
   33012 		if idx != x1.Args[0] {
   33013 			break
   33014 		}
   33015 		if p != x1.Args[1] {
   33016 			break
   33017 		}
   33018 		if mem != x1.Args[2] {
   33019 			break
   33020 		}
   33021 		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)) {
   33022 			break
   33023 		}
   33024 		b = mergePoint(b, x0, x1)
   33025 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   33026 		v.reset(OpCopy)
   33027 		v.AddArg(v0)
   33028 		v0.AuxInt = i0
   33029 		v0.Aux = s
   33030 		v0.AddArg(p)
   33031 		v0.AddArg(idx)
   33032 		v0.AddArg(mem)
   33033 		return true
   33034 	}
   33035 	// match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem))
   33036 	// 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)
   33037 	// result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem)
   33038 	for {
   33039 		_ = v.Args[1]
   33040 		sh := v.Args[0]
   33041 		if sh.Op != OpS390XSLWconst {
   33042 			break
   33043 		}
   33044 		if sh.AuxInt != 16 {
   33045 			break
   33046 		}
   33047 		x0 := sh.Args[0]
   33048 		if x0.Op != OpS390XMOVHZloadidx {
   33049 			break
   33050 		}
   33051 		i0 := x0.AuxInt
   33052 		s := x0.Aux
   33053 		_ = x0.Args[2]
   33054 		idx := x0.Args[0]
   33055 		p := x0.Args[1]
   33056 		mem := x0.Args[2]
   33057 		x1 := v.Args[1]
   33058 		if x1.Op != OpS390XMOVHZloadidx {
   33059 			break
   33060 		}
   33061 		i1 := x1.AuxInt
   33062 		if x1.Aux != s {
   33063 			break
   33064 		}
   33065 		_ = x1.Args[2]
   33066 		if idx != x1.Args[0] {
   33067 			break
   33068 		}
   33069 		if p != x1.Args[1] {
   33070 			break
   33071 		}
   33072 		if mem != x1.Args[2] {
   33073 			break
   33074 		}
   33075 		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)) {
   33076 			break
   33077 		}
   33078 		b = mergePoint(b, x0, x1)
   33079 		v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32)
   33080 		v.reset(OpCopy)
   33081 		v.AddArg(v0)
   33082 		v0.AuxInt = i0
   33083 		v0.Aux = s
   33084 		v0.AddArg(p)
   33085 		v0.AddArg(idx)
   33086 		v0.AddArg(mem)
   33087 		return true
   33088 	}
   33089 	// 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))
   33090 	// 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)
   33091 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33092 	for {
   33093 		_ = v.Args[1]
   33094 		s0 := v.Args[0]
   33095 		if s0.Op != OpS390XSLWconst {
   33096 			break
   33097 		}
   33098 		j0 := s0.AuxInt
   33099 		x0 := s0.Args[0]
   33100 		if x0.Op != OpS390XMOVBZloadidx {
   33101 			break
   33102 		}
   33103 		i0 := x0.AuxInt
   33104 		s := x0.Aux
   33105 		_ = x0.Args[2]
   33106 		p := x0.Args[0]
   33107 		idx := x0.Args[1]
   33108 		mem := x0.Args[2]
   33109 		or := v.Args[1]
   33110 		if or.Op != OpS390XORW {
   33111 			break
   33112 		}
   33113 		_ = or.Args[1]
   33114 		s1 := or.Args[0]
   33115 		if s1.Op != OpS390XSLWconst {
   33116 			break
   33117 		}
   33118 		j1 := s1.AuxInt
   33119 		x1 := s1.Args[0]
   33120 		if x1.Op != OpS390XMOVBZloadidx {
   33121 			break
   33122 		}
   33123 		i1 := x1.AuxInt
   33124 		if x1.Aux != s {
   33125 			break
   33126 		}
   33127 		_ = x1.Args[2]
   33128 		if p != x1.Args[0] {
   33129 			break
   33130 		}
   33131 		if idx != x1.Args[1] {
   33132 			break
   33133 		}
   33134 		if mem != x1.Args[2] {
   33135 			break
   33136 		}
   33137 		y := or.Args[1]
   33138 		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)) {
   33139 			break
   33140 		}
   33141 		b = mergePoint(b, x0, x1)
   33142 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33143 		v.reset(OpCopy)
   33144 		v.AddArg(v0)
   33145 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33146 		v1.AuxInt = j1
   33147 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33148 		v2.AuxInt = i0
   33149 		v2.Aux = s
   33150 		v2.AddArg(p)
   33151 		v2.AddArg(idx)
   33152 		v2.AddArg(mem)
   33153 		v1.AddArg(v2)
   33154 		v0.AddArg(v1)
   33155 		v0.AddArg(y)
   33156 		return true
   33157 	}
   33158 	// 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))
   33159 	// 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)
   33160 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33161 	for {
   33162 		_ = v.Args[1]
   33163 		s0 := v.Args[0]
   33164 		if s0.Op != OpS390XSLWconst {
   33165 			break
   33166 		}
   33167 		j0 := s0.AuxInt
   33168 		x0 := s0.Args[0]
   33169 		if x0.Op != OpS390XMOVBZloadidx {
   33170 			break
   33171 		}
   33172 		i0 := x0.AuxInt
   33173 		s := x0.Aux
   33174 		_ = x0.Args[2]
   33175 		idx := x0.Args[0]
   33176 		p := x0.Args[1]
   33177 		mem := x0.Args[2]
   33178 		or := v.Args[1]
   33179 		if or.Op != OpS390XORW {
   33180 			break
   33181 		}
   33182 		_ = or.Args[1]
   33183 		s1 := or.Args[0]
   33184 		if s1.Op != OpS390XSLWconst {
   33185 			break
   33186 		}
   33187 		j1 := s1.AuxInt
   33188 		x1 := s1.Args[0]
   33189 		if x1.Op != OpS390XMOVBZloadidx {
   33190 			break
   33191 		}
   33192 		i1 := x1.AuxInt
   33193 		if x1.Aux != s {
   33194 			break
   33195 		}
   33196 		_ = x1.Args[2]
   33197 		if p != x1.Args[0] {
   33198 			break
   33199 		}
   33200 		if idx != x1.Args[1] {
   33201 			break
   33202 		}
   33203 		if mem != x1.Args[2] {
   33204 			break
   33205 		}
   33206 		y := or.Args[1]
   33207 		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)) {
   33208 			break
   33209 		}
   33210 		b = mergePoint(b, x0, x1)
   33211 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33212 		v.reset(OpCopy)
   33213 		v.AddArg(v0)
   33214 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33215 		v1.AuxInt = j1
   33216 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33217 		v2.AuxInt = i0
   33218 		v2.Aux = s
   33219 		v2.AddArg(p)
   33220 		v2.AddArg(idx)
   33221 		v2.AddArg(mem)
   33222 		v1.AddArg(v2)
   33223 		v0.AddArg(v1)
   33224 		v0.AddArg(y)
   33225 		return true
   33226 	}
   33227 	// 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))
   33228 	// 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)
   33229 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33230 	for {
   33231 		_ = v.Args[1]
   33232 		s0 := v.Args[0]
   33233 		if s0.Op != OpS390XSLWconst {
   33234 			break
   33235 		}
   33236 		j0 := s0.AuxInt
   33237 		x0 := s0.Args[0]
   33238 		if x0.Op != OpS390XMOVBZloadidx {
   33239 			break
   33240 		}
   33241 		i0 := x0.AuxInt
   33242 		s := x0.Aux
   33243 		_ = x0.Args[2]
   33244 		p := x0.Args[0]
   33245 		idx := x0.Args[1]
   33246 		mem := x0.Args[2]
   33247 		or := v.Args[1]
   33248 		if or.Op != OpS390XORW {
   33249 			break
   33250 		}
   33251 		_ = or.Args[1]
   33252 		s1 := or.Args[0]
   33253 		if s1.Op != OpS390XSLWconst {
   33254 			break
   33255 		}
   33256 		j1 := s1.AuxInt
   33257 		x1 := s1.Args[0]
   33258 		if x1.Op != OpS390XMOVBZloadidx {
   33259 			break
   33260 		}
   33261 		i1 := x1.AuxInt
   33262 		if x1.Aux != s {
   33263 			break
   33264 		}
   33265 		_ = x1.Args[2]
   33266 		if idx != x1.Args[0] {
   33267 			break
   33268 		}
   33269 		if p != x1.Args[1] {
   33270 			break
   33271 		}
   33272 		if mem != x1.Args[2] {
   33273 			break
   33274 		}
   33275 		y := or.Args[1]
   33276 		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)) {
   33277 			break
   33278 		}
   33279 		b = mergePoint(b, x0, x1)
   33280 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33281 		v.reset(OpCopy)
   33282 		v.AddArg(v0)
   33283 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33284 		v1.AuxInt = j1
   33285 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33286 		v2.AuxInt = i0
   33287 		v2.Aux = s
   33288 		v2.AddArg(p)
   33289 		v2.AddArg(idx)
   33290 		v2.AddArg(mem)
   33291 		v1.AddArg(v2)
   33292 		v0.AddArg(v1)
   33293 		v0.AddArg(y)
   33294 		return true
   33295 	}
   33296 	return false
   33297 }
   33298 func rewriteValueS390X_OpS390XORW_40(v *Value) bool {
   33299 	b := v.Block
   33300 	_ = b
   33301 	typ := &b.Func.Config.Types
   33302 	_ = typ
   33303 	// 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))
   33304 	// 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)
   33305 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33306 	for {
   33307 		_ = v.Args[1]
   33308 		s0 := v.Args[0]
   33309 		if s0.Op != OpS390XSLWconst {
   33310 			break
   33311 		}
   33312 		j0 := s0.AuxInt
   33313 		x0 := s0.Args[0]
   33314 		if x0.Op != OpS390XMOVBZloadidx {
   33315 			break
   33316 		}
   33317 		i0 := x0.AuxInt
   33318 		s := x0.Aux
   33319 		_ = x0.Args[2]
   33320 		idx := x0.Args[0]
   33321 		p := x0.Args[1]
   33322 		mem := x0.Args[2]
   33323 		or := v.Args[1]
   33324 		if or.Op != OpS390XORW {
   33325 			break
   33326 		}
   33327 		_ = or.Args[1]
   33328 		s1 := or.Args[0]
   33329 		if s1.Op != OpS390XSLWconst {
   33330 			break
   33331 		}
   33332 		j1 := s1.AuxInt
   33333 		x1 := s1.Args[0]
   33334 		if x1.Op != OpS390XMOVBZloadidx {
   33335 			break
   33336 		}
   33337 		i1 := x1.AuxInt
   33338 		if x1.Aux != s {
   33339 			break
   33340 		}
   33341 		_ = x1.Args[2]
   33342 		if idx != x1.Args[0] {
   33343 			break
   33344 		}
   33345 		if p != x1.Args[1] {
   33346 			break
   33347 		}
   33348 		if mem != x1.Args[2] {
   33349 			break
   33350 		}
   33351 		y := or.Args[1]
   33352 		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)) {
   33353 			break
   33354 		}
   33355 		b = mergePoint(b, x0, x1)
   33356 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33357 		v.reset(OpCopy)
   33358 		v.AddArg(v0)
   33359 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33360 		v1.AuxInt = j1
   33361 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33362 		v2.AuxInt = i0
   33363 		v2.Aux = s
   33364 		v2.AddArg(p)
   33365 		v2.AddArg(idx)
   33366 		v2.AddArg(mem)
   33367 		v1.AddArg(v2)
   33368 		v0.AddArg(v1)
   33369 		v0.AddArg(y)
   33370 		return true
   33371 	}
   33372 	// 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))))
   33373 	// 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)
   33374 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33375 	for {
   33376 		_ = v.Args[1]
   33377 		s0 := v.Args[0]
   33378 		if s0.Op != OpS390XSLWconst {
   33379 			break
   33380 		}
   33381 		j0 := s0.AuxInt
   33382 		x0 := s0.Args[0]
   33383 		if x0.Op != OpS390XMOVBZloadidx {
   33384 			break
   33385 		}
   33386 		i0 := x0.AuxInt
   33387 		s := x0.Aux
   33388 		_ = x0.Args[2]
   33389 		p := x0.Args[0]
   33390 		idx := x0.Args[1]
   33391 		mem := x0.Args[2]
   33392 		or := v.Args[1]
   33393 		if or.Op != OpS390XORW {
   33394 			break
   33395 		}
   33396 		_ = or.Args[1]
   33397 		y := or.Args[0]
   33398 		s1 := or.Args[1]
   33399 		if s1.Op != OpS390XSLWconst {
   33400 			break
   33401 		}
   33402 		j1 := s1.AuxInt
   33403 		x1 := s1.Args[0]
   33404 		if x1.Op != OpS390XMOVBZloadidx {
   33405 			break
   33406 		}
   33407 		i1 := x1.AuxInt
   33408 		if x1.Aux != s {
   33409 			break
   33410 		}
   33411 		_ = x1.Args[2]
   33412 		if p != x1.Args[0] {
   33413 			break
   33414 		}
   33415 		if idx != x1.Args[1] {
   33416 			break
   33417 		}
   33418 		if mem != x1.Args[2] {
   33419 			break
   33420 		}
   33421 		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)) {
   33422 			break
   33423 		}
   33424 		b = mergePoint(b, x0, x1)
   33425 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33426 		v.reset(OpCopy)
   33427 		v.AddArg(v0)
   33428 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33429 		v1.AuxInt = j1
   33430 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33431 		v2.AuxInt = i0
   33432 		v2.Aux = s
   33433 		v2.AddArg(p)
   33434 		v2.AddArg(idx)
   33435 		v2.AddArg(mem)
   33436 		v1.AddArg(v2)
   33437 		v0.AddArg(v1)
   33438 		v0.AddArg(y)
   33439 		return true
   33440 	}
   33441 	// 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))))
   33442 	// 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)
   33443 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33444 	for {
   33445 		_ = v.Args[1]
   33446 		s0 := v.Args[0]
   33447 		if s0.Op != OpS390XSLWconst {
   33448 			break
   33449 		}
   33450 		j0 := s0.AuxInt
   33451 		x0 := s0.Args[0]
   33452 		if x0.Op != OpS390XMOVBZloadidx {
   33453 			break
   33454 		}
   33455 		i0 := x0.AuxInt
   33456 		s := x0.Aux
   33457 		_ = x0.Args[2]
   33458 		idx := x0.Args[0]
   33459 		p := x0.Args[1]
   33460 		mem := x0.Args[2]
   33461 		or := v.Args[1]
   33462 		if or.Op != OpS390XORW {
   33463 			break
   33464 		}
   33465 		_ = or.Args[1]
   33466 		y := or.Args[0]
   33467 		s1 := or.Args[1]
   33468 		if s1.Op != OpS390XSLWconst {
   33469 			break
   33470 		}
   33471 		j1 := s1.AuxInt
   33472 		x1 := s1.Args[0]
   33473 		if x1.Op != OpS390XMOVBZloadidx {
   33474 			break
   33475 		}
   33476 		i1 := x1.AuxInt
   33477 		if x1.Aux != s {
   33478 			break
   33479 		}
   33480 		_ = x1.Args[2]
   33481 		if p != x1.Args[0] {
   33482 			break
   33483 		}
   33484 		if idx != x1.Args[1] {
   33485 			break
   33486 		}
   33487 		if mem != x1.Args[2] {
   33488 			break
   33489 		}
   33490 		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)) {
   33491 			break
   33492 		}
   33493 		b = mergePoint(b, x0, x1)
   33494 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33495 		v.reset(OpCopy)
   33496 		v.AddArg(v0)
   33497 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33498 		v1.AuxInt = j1
   33499 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33500 		v2.AuxInt = i0
   33501 		v2.Aux = s
   33502 		v2.AddArg(p)
   33503 		v2.AddArg(idx)
   33504 		v2.AddArg(mem)
   33505 		v1.AddArg(v2)
   33506 		v0.AddArg(v1)
   33507 		v0.AddArg(y)
   33508 		return true
   33509 	}
   33510 	// 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))))
   33511 	// 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)
   33512 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33513 	for {
   33514 		_ = v.Args[1]
   33515 		s0 := v.Args[0]
   33516 		if s0.Op != OpS390XSLWconst {
   33517 			break
   33518 		}
   33519 		j0 := s0.AuxInt
   33520 		x0 := s0.Args[0]
   33521 		if x0.Op != OpS390XMOVBZloadidx {
   33522 			break
   33523 		}
   33524 		i0 := x0.AuxInt
   33525 		s := x0.Aux
   33526 		_ = x0.Args[2]
   33527 		p := x0.Args[0]
   33528 		idx := x0.Args[1]
   33529 		mem := x0.Args[2]
   33530 		or := v.Args[1]
   33531 		if or.Op != OpS390XORW {
   33532 			break
   33533 		}
   33534 		_ = or.Args[1]
   33535 		y := or.Args[0]
   33536 		s1 := or.Args[1]
   33537 		if s1.Op != OpS390XSLWconst {
   33538 			break
   33539 		}
   33540 		j1 := s1.AuxInt
   33541 		x1 := s1.Args[0]
   33542 		if x1.Op != OpS390XMOVBZloadidx {
   33543 			break
   33544 		}
   33545 		i1 := x1.AuxInt
   33546 		if x1.Aux != s {
   33547 			break
   33548 		}
   33549 		_ = x1.Args[2]
   33550 		if idx != x1.Args[0] {
   33551 			break
   33552 		}
   33553 		if p != x1.Args[1] {
   33554 			break
   33555 		}
   33556 		if mem != x1.Args[2] {
   33557 			break
   33558 		}
   33559 		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)) {
   33560 			break
   33561 		}
   33562 		b = mergePoint(b, x0, x1)
   33563 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33564 		v.reset(OpCopy)
   33565 		v.AddArg(v0)
   33566 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33567 		v1.AuxInt = j1
   33568 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33569 		v2.AuxInt = i0
   33570 		v2.Aux = s
   33571 		v2.AddArg(p)
   33572 		v2.AddArg(idx)
   33573 		v2.AddArg(mem)
   33574 		v1.AddArg(v2)
   33575 		v0.AddArg(v1)
   33576 		v0.AddArg(y)
   33577 		return true
   33578 	}
   33579 	// 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))))
   33580 	// 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)
   33581 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33582 	for {
   33583 		_ = v.Args[1]
   33584 		s0 := v.Args[0]
   33585 		if s0.Op != OpS390XSLWconst {
   33586 			break
   33587 		}
   33588 		j0 := s0.AuxInt
   33589 		x0 := s0.Args[0]
   33590 		if x0.Op != OpS390XMOVBZloadidx {
   33591 			break
   33592 		}
   33593 		i0 := x0.AuxInt
   33594 		s := x0.Aux
   33595 		_ = x0.Args[2]
   33596 		idx := x0.Args[0]
   33597 		p := x0.Args[1]
   33598 		mem := x0.Args[2]
   33599 		or := v.Args[1]
   33600 		if or.Op != OpS390XORW {
   33601 			break
   33602 		}
   33603 		_ = or.Args[1]
   33604 		y := or.Args[0]
   33605 		s1 := or.Args[1]
   33606 		if s1.Op != OpS390XSLWconst {
   33607 			break
   33608 		}
   33609 		j1 := s1.AuxInt
   33610 		x1 := s1.Args[0]
   33611 		if x1.Op != OpS390XMOVBZloadidx {
   33612 			break
   33613 		}
   33614 		i1 := x1.AuxInt
   33615 		if x1.Aux != s {
   33616 			break
   33617 		}
   33618 		_ = x1.Args[2]
   33619 		if idx != x1.Args[0] {
   33620 			break
   33621 		}
   33622 		if p != x1.Args[1] {
   33623 			break
   33624 		}
   33625 		if mem != x1.Args[2] {
   33626 			break
   33627 		}
   33628 		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)) {
   33629 			break
   33630 		}
   33631 		b = mergePoint(b, x0, x1)
   33632 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33633 		v.reset(OpCopy)
   33634 		v.AddArg(v0)
   33635 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33636 		v1.AuxInt = j1
   33637 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33638 		v2.AuxInt = i0
   33639 		v2.Aux = s
   33640 		v2.AddArg(p)
   33641 		v2.AddArg(idx)
   33642 		v2.AddArg(mem)
   33643 		v1.AddArg(v2)
   33644 		v0.AddArg(v1)
   33645 		v0.AddArg(y)
   33646 		return true
   33647 	}
   33648 	// 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)))
   33649 	// 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)
   33650 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33651 	for {
   33652 		_ = v.Args[1]
   33653 		or := v.Args[0]
   33654 		if or.Op != OpS390XORW {
   33655 			break
   33656 		}
   33657 		_ = or.Args[1]
   33658 		s1 := or.Args[0]
   33659 		if s1.Op != OpS390XSLWconst {
   33660 			break
   33661 		}
   33662 		j1 := s1.AuxInt
   33663 		x1 := s1.Args[0]
   33664 		if x1.Op != OpS390XMOVBZloadidx {
   33665 			break
   33666 		}
   33667 		i1 := x1.AuxInt
   33668 		s := x1.Aux
   33669 		_ = x1.Args[2]
   33670 		p := x1.Args[0]
   33671 		idx := x1.Args[1]
   33672 		mem := x1.Args[2]
   33673 		y := or.Args[1]
   33674 		s0 := v.Args[1]
   33675 		if s0.Op != OpS390XSLWconst {
   33676 			break
   33677 		}
   33678 		j0 := s0.AuxInt
   33679 		x0 := s0.Args[0]
   33680 		if x0.Op != OpS390XMOVBZloadidx {
   33681 			break
   33682 		}
   33683 		i0 := x0.AuxInt
   33684 		if x0.Aux != s {
   33685 			break
   33686 		}
   33687 		_ = x0.Args[2]
   33688 		if p != x0.Args[0] {
   33689 			break
   33690 		}
   33691 		if idx != x0.Args[1] {
   33692 			break
   33693 		}
   33694 		if mem != x0.Args[2] {
   33695 			break
   33696 		}
   33697 		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)) {
   33698 			break
   33699 		}
   33700 		b = mergePoint(b, x0, x1)
   33701 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33702 		v.reset(OpCopy)
   33703 		v.AddArg(v0)
   33704 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33705 		v1.AuxInt = j1
   33706 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33707 		v2.AuxInt = i0
   33708 		v2.Aux = s
   33709 		v2.AddArg(p)
   33710 		v2.AddArg(idx)
   33711 		v2.AddArg(mem)
   33712 		v1.AddArg(v2)
   33713 		v0.AddArg(v1)
   33714 		v0.AddArg(y)
   33715 		return true
   33716 	}
   33717 	// 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)))
   33718 	// 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)
   33719 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33720 	for {
   33721 		_ = v.Args[1]
   33722 		or := v.Args[0]
   33723 		if or.Op != OpS390XORW {
   33724 			break
   33725 		}
   33726 		_ = or.Args[1]
   33727 		s1 := or.Args[0]
   33728 		if s1.Op != OpS390XSLWconst {
   33729 			break
   33730 		}
   33731 		j1 := s1.AuxInt
   33732 		x1 := s1.Args[0]
   33733 		if x1.Op != OpS390XMOVBZloadidx {
   33734 			break
   33735 		}
   33736 		i1 := x1.AuxInt
   33737 		s := x1.Aux
   33738 		_ = x1.Args[2]
   33739 		idx := x1.Args[0]
   33740 		p := x1.Args[1]
   33741 		mem := x1.Args[2]
   33742 		y := or.Args[1]
   33743 		s0 := v.Args[1]
   33744 		if s0.Op != OpS390XSLWconst {
   33745 			break
   33746 		}
   33747 		j0 := s0.AuxInt
   33748 		x0 := s0.Args[0]
   33749 		if x0.Op != OpS390XMOVBZloadidx {
   33750 			break
   33751 		}
   33752 		i0 := x0.AuxInt
   33753 		if x0.Aux != s {
   33754 			break
   33755 		}
   33756 		_ = x0.Args[2]
   33757 		if p != x0.Args[0] {
   33758 			break
   33759 		}
   33760 		if idx != x0.Args[1] {
   33761 			break
   33762 		}
   33763 		if mem != x0.Args[2] {
   33764 			break
   33765 		}
   33766 		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)) {
   33767 			break
   33768 		}
   33769 		b = mergePoint(b, x0, x1)
   33770 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33771 		v.reset(OpCopy)
   33772 		v.AddArg(v0)
   33773 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33774 		v1.AuxInt = j1
   33775 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33776 		v2.AuxInt = i0
   33777 		v2.Aux = s
   33778 		v2.AddArg(p)
   33779 		v2.AddArg(idx)
   33780 		v2.AddArg(mem)
   33781 		v1.AddArg(v2)
   33782 		v0.AddArg(v1)
   33783 		v0.AddArg(y)
   33784 		return true
   33785 	}
   33786 	// 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)))
   33787 	// 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)
   33788 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33789 	for {
   33790 		_ = v.Args[1]
   33791 		or := v.Args[0]
   33792 		if or.Op != OpS390XORW {
   33793 			break
   33794 		}
   33795 		_ = or.Args[1]
   33796 		y := or.Args[0]
   33797 		s1 := or.Args[1]
   33798 		if s1.Op != OpS390XSLWconst {
   33799 			break
   33800 		}
   33801 		j1 := s1.AuxInt
   33802 		x1 := s1.Args[0]
   33803 		if x1.Op != OpS390XMOVBZloadidx {
   33804 			break
   33805 		}
   33806 		i1 := x1.AuxInt
   33807 		s := x1.Aux
   33808 		_ = x1.Args[2]
   33809 		p := x1.Args[0]
   33810 		idx := x1.Args[1]
   33811 		mem := x1.Args[2]
   33812 		s0 := v.Args[1]
   33813 		if s0.Op != OpS390XSLWconst {
   33814 			break
   33815 		}
   33816 		j0 := s0.AuxInt
   33817 		x0 := s0.Args[0]
   33818 		if x0.Op != OpS390XMOVBZloadidx {
   33819 			break
   33820 		}
   33821 		i0 := x0.AuxInt
   33822 		if x0.Aux != s {
   33823 			break
   33824 		}
   33825 		_ = x0.Args[2]
   33826 		if p != x0.Args[0] {
   33827 			break
   33828 		}
   33829 		if idx != x0.Args[1] {
   33830 			break
   33831 		}
   33832 		if mem != x0.Args[2] {
   33833 			break
   33834 		}
   33835 		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)) {
   33836 			break
   33837 		}
   33838 		b = mergePoint(b, x0, x1)
   33839 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33840 		v.reset(OpCopy)
   33841 		v.AddArg(v0)
   33842 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33843 		v1.AuxInt = j1
   33844 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33845 		v2.AuxInt = i0
   33846 		v2.Aux = s
   33847 		v2.AddArg(p)
   33848 		v2.AddArg(idx)
   33849 		v2.AddArg(mem)
   33850 		v1.AddArg(v2)
   33851 		v0.AddArg(v1)
   33852 		v0.AddArg(y)
   33853 		return true
   33854 	}
   33855 	// 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)))
   33856 	// 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)
   33857 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33858 	for {
   33859 		_ = v.Args[1]
   33860 		or := v.Args[0]
   33861 		if or.Op != OpS390XORW {
   33862 			break
   33863 		}
   33864 		_ = or.Args[1]
   33865 		y := or.Args[0]
   33866 		s1 := or.Args[1]
   33867 		if s1.Op != OpS390XSLWconst {
   33868 			break
   33869 		}
   33870 		j1 := s1.AuxInt
   33871 		x1 := s1.Args[0]
   33872 		if x1.Op != OpS390XMOVBZloadidx {
   33873 			break
   33874 		}
   33875 		i1 := x1.AuxInt
   33876 		s := x1.Aux
   33877 		_ = x1.Args[2]
   33878 		idx := x1.Args[0]
   33879 		p := x1.Args[1]
   33880 		mem := x1.Args[2]
   33881 		s0 := v.Args[1]
   33882 		if s0.Op != OpS390XSLWconst {
   33883 			break
   33884 		}
   33885 		j0 := s0.AuxInt
   33886 		x0 := s0.Args[0]
   33887 		if x0.Op != OpS390XMOVBZloadidx {
   33888 			break
   33889 		}
   33890 		i0 := x0.AuxInt
   33891 		if x0.Aux != s {
   33892 			break
   33893 		}
   33894 		_ = x0.Args[2]
   33895 		if p != x0.Args[0] {
   33896 			break
   33897 		}
   33898 		if idx != x0.Args[1] {
   33899 			break
   33900 		}
   33901 		if mem != x0.Args[2] {
   33902 			break
   33903 		}
   33904 		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)) {
   33905 			break
   33906 		}
   33907 		b = mergePoint(b, x0, x1)
   33908 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33909 		v.reset(OpCopy)
   33910 		v.AddArg(v0)
   33911 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33912 		v1.AuxInt = j1
   33913 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33914 		v2.AuxInt = i0
   33915 		v2.Aux = s
   33916 		v2.AddArg(p)
   33917 		v2.AddArg(idx)
   33918 		v2.AddArg(mem)
   33919 		v1.AddArg(v2)
   33920 		v0.AddArg(v1)
   33921 		v0.AddArg(y)
   33922 		return true
   33923 	}
   33924 	// 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)))
   33925 	// 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)
   33926 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   33927 	for {
   33928 		_ = v.Args[1]
   33929 		or := v.Args[0]
   33930 		if or.Op != OpS390XORW {
   33931 			break
   33932 		}
   33933 		_ = or.Args[1]
   33934 		s1 := or.Args[0]
   33935 		if s1.Op != OpS390XSLWconst {
   33936 			break
   33937 		}
   33938 		j1 := s1.AuxInt
   33939 		x1 := s1.Args[0]
   33940 		if x1.Op != OpS390XMOVBZloadidx {
   33941 			break
   33942 		}
   33943 		i1 := x1.AuxInt
   33944 		s := x1.Aux
   33945 		_ = x1.Args[2]
   33946 		p := x1.Args[0]
   33947 		idx := x1.Args[1]
   33948 		mem := x1.Args[2]
   33949 		y := or.Args[1]
   33950 		s0 := v.Args[1]
   33951 		if s0.Op != OpS390XSLWconst {
   33952 			break
   33953 		}
   33954 		j0 := s0.AuxInt
   33955 		x0 := s0.Args[0]
   33956 		if x0.Op != OpS390XMOVBZloadidx {
   33957 			break
   33958 		}
   33959 		i0 := x0.AuxInt
   33960 		if x0.Aux != s {
   33961 			break
   33962 		}
   33963 		_ = x0.Args[2]
   33964 		if idx != x0.Args[0] {
   33965 			break
   33966 		}
   33967 		if p != x0.Args[1] {
   33968 			break
   33969 		}
   33970 		if mem != x0.Args[2] {
   33971 			break
   33972 		}
   33973 		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)) {
   33974 			break
   33975 		}
   33976 		b = mergePoint(b, x0, x1)
   33977 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   33978 		v.reset(OpCopy)
   33979 		v.AddArg(v0)
   33980 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   33981 		v1.AuxInt = j1
   33982 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   33983 		v2.AuxInt = i0
   33984 		v2.Aux = s
   33985 		v2.AddArg(p)
   33986 		v2.AddArg(idx)
   33987 		v2.AddArg(mem)
   33988 		v1.AddArg(v2)
   33989 		v0.AddArg(v1)
   33990 		v0.AddArg(y)
   33991 		return true
   33992 	}
   33993 	return false
   33994 }
   33995 func rewriteValueS390X_OpS390XORW_50(v *Value) bool {
   33996 	b := v.Block
   33997 	_ = b
   33998 	typ := &b.Func.Config.Types
   33999 	_ = typ
   34000 	// 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)))
   34001 	// 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)
   34002 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   34003 	for {
   34004 		_ = v.Args[1]
   34005 		or := v.Args[0]
   34006 		if or.Op != OpS390XORW {
   34007 			break
   34008 		}
   34009 		_ = or.Args[1]
   34010 		s1 := or.Args[0]
   34011 		if s1.Op != OpS390XSLWconst {
   34012 			break
   34013 		}
   34014 		j1 := s1.AuxInt
   34015 		x1 := s1.Args[0]
   34016 		if x1.Op != OpS390XMOVBZloadidx {
   34017 			break
   34018 		}
   34019 		i1 := x1.AuxInt
   34020 		s := x1.Aux
   34021 		_ = x1.Args[2]
   34022 		idx := x1.Args[0]
   34023 		p := x1.Args[1]
   34024 		mem := x1.Args[2]
   34025 		y := or.Args[1]
   34026 		s0 := v.Args[1]
   34027 		if s0.Op != OpS390XSLWconst {
   34028 			break
   34029 		}
   34030 		j0 := s0.AuxInt
   34031 		x0 := s0.Args[0]
   34032 		if x0.Op != OpS390XMOVBZloadidx {
   34033 			break
   34034 		}
   34035 		i0 := x0.AuxInt
   34036 		if x0.Aux != s {
   34037 			break
   34038 		}
   34039 		_ = x0.Args[2]
   34040 		if idx != x0.Args[0] {
   34041 			break
   34042 		}
   34043 		if p != x0.Args[1] {
   34044 			break
   34045 		}
   34046 		if mem != x0.Args[2] {
   34047 			break
   34048 		}
   34049 		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)) {
   34050 			break
   34051 		}
   34052 		b = mergePoint(b, x0, x1)
   34053 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34054 		v.reset(OpCopy)
   34055 		v.AddArg(v0)
   34056 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34057 		v1.AuxInt = j1
   34058 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   34059 		v2.AuxInt = i0
   34060 		v2.Aux = s
   34061 		v2.AddArg(p)
   34062 		v2.AddArg(idx)
   34063 		v2.AddArg(mem)
   34064 		v1.AddArg(v2)
   34065 		v0.AddArg(v1)
   34066 		v0.AddArg(y)
   34067 		return true
   34068 	}
   34069 	// 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)))
   34070 	// 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)
   34071 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   34072 	for {
   34073 		_ = v.Args[1]
   34074 		or := v.Args[0]
   34075 		if or.Op != OpS390XORW {
   34076 			break
   34077 		}
   34078 		_ = or.Args[1]
   34079 		y := or.Args[0]
   34080 		s1 := or.Args[1]
   34081 		if s1.Op != OpS390XSLWconst {
   34082 			break
   34083 		}
   34084 		j1 := s1.AuxInt
   34085 		x1 := s1.Args[0]
   34086 		if x1.Op != OpS390XMOVBZloadidx {
   34087 			break
   34088 		}
   34089 		i1 := x1.AuxInt
   34090 		s := x1.Aux
   34091 		_ = x1.Args[2]
   34092 		p := x1.Args[0]
   34093 		idx := x1.Args[1]
   34094 		mem := x1.Args[2]
   34095 		s0 := v.Args[1]
   34096 		if s0.Op != OpS390XSLWconst {
   34097 			break
   34098 		}
   34099 		j0 := s0.AuxInt
   34100 		x0 := s0.Args[0]
   34101 		if x0.Op != OpS390XMOVBZloadidx {
   34102 			break
   34103 		}
   34104 		i0 := x0.AuxInt
   34105 		if x0.Aux != s {
   34106 			break
   34107 		}
   34108 		_ = x0.Args[2]
   34109 		if idx != x0.Args[0] {
   34110 			break
   34111 		}
   34112 		if p != x0.Args[1] {
   34113 			break
   34114 		}
   34115 		if mem != x0.Args[2] {
   34116 			break
   34117 		}
   34118 		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)) {
   34119 			break
   34120 		}
   34121 		b = mergePoint(b, x0, x1)
   34122 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34123 		v.reset(OpCopy)
   34124 		v.AddArg(v0)
   34125 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34126 		v1.AuxInt = j1
   34127 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   34128 		v2.AuxInt = i0
   34129 		v2.Aux = s
   34130 		v2.AddArg(p)
   34131 		v2.AddArg(idx)
   34132 		v2.AddArg(mem)
   34133 		v1.AddArg(v2)
   34134 		v0.AddArg(v1)
   34135 		v0.AddArg(y)
   34136 		return true
   34137 	}
   34138 	// 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)))
   34139 	// 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)
   34140 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
   34141 	for {
   34142 		_ = v.Args[1]
   34143 		or := v.Args[0]
   34144 		if or.Op != OpS390XORW {
   34145 			break
   34146 		}
   34147 		_ = or.Args[1]
   34148 		y := or.Args[0]
   34149 		s1 := or.Args[1]
   34150 		if s1.Op != OpS390XSLWconst {
   34151 			break
   34152 		}
   34153 		j1 := s1.AuxInt
   34154 		x1 := s1.Args[0]
   34155 		if x1.Op != OpS390XMOVBZloadidx {
   34156 			break
   34157 		}
   34158 		i1 := x1.AuxInt
   34159 		s := x1.Aux
   34160 		_ = x1.Args[2]
   34161 		idx := x1.Args[0]
   34162 		p := x1.Args[1]
   34163 		mem := x1.Args[2]
   34164 		s0 := v.Args[1]
   34165 		if s0.Op != OpS390XSLWconst {
   34166 			break
   34167 		}
   34168 		j0 := s0.AuxInt
   34169 		x0 := s0.Args[0]
   34170 		if x0.Op != OpS390XMOVBZloadidx {
   34171 			break
   34172 		}
   34173 		i0 := x0.AuxInt
   34174 		if x0.Aux != s {
   34175 			break
   34176 		}
   34177 		_ = x0.Args[2]
   34178 		if idx != x0.Args[0] {
   34179 			break
   34180 		}
   34181 		if p != x0.Args[1] {
   34182 			break
   34183 		}
   34184 		if mem != x0.Args[2] {
   34185 			break
   34186 		}
   34187 		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)) {
   34188 			break
   34189 		}
   34190 		b = mergePoint(b, x0, x1)
   34191 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34192 		v.reset(OpCopy)
   34193 		v.AddArg(v0)
   34194 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34195 		v1.AuxInt = j1
   34196 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16)
   34197 		v2.AuxInt = i0
   34198 		v2.Aux = s
   34199 		v2.AddArg(p)
   34200 		v2.AddArg(idx)
   34201 		v2.AddArg(mem)
   34202 		v1.AddArg(v2)
   34203 		v0.AddArg(v1)
   34204 		v0.AddArg(y)
   34205 		return true
   34206 	}
   34207 	// match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)))
   34208 	// 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)
   34209 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
   34210 	for {
   34211 		_ = v.Args[1]
   34212 		x0 := v.Args[0]
   34213 		if x0.Op != OpS390XMOVBZload {
   34214 			break
   34215 		}
   34216 		i0 := x0.AuxInt
   34217 		s := x0.Aux
   34218 		_ = x0.Args[1]
   34219 		p := x0.Args[0]
   34220 		mem := x0.Args[1]
   34221 		sh := v.Args[1]
   34222 		if sh.Op != OpS390XSLWconst {
   34223 			break
   34224 		}
   34225 		if sh.AuxInt != 8 {
   34226 			break
   34227 		}
   34228 		x1 := sh.Args[0]
   34229 		if x1.Op != OpS390XMOVBZload {
   34230 			break
   34231 		}
   34232 		i1 := x1.AuxInt
   34233 		if x1.Aux != s {
   34234 			break
   34235 		}
   34236 		_ = x1.Args[1]
   34237 		if p != x1.Args[0] {
   34238 			break
   34239 		}
   34240 		if mem != x1.Args[1] {
   34241 			break
   34242 		}
   34243 		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)) {
   34244 			break
   34245 		}
   34246 		b = mergePoint(b, x0, x1)
   34247 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34248 		v.reset(OpCopy)
   34249 		v.AddArg(v0)
   34250 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   34251 		v1.AuxInt = i0
   34252 		v1.Aux = s
   34253 		v1.AddArg(p)
   34254 		v1.AddArg(mem)
   34255 		v0.AddArg(v1)
   34256 		return true
   34257 	}
   34258 	// match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem))
   34259 	// 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)
   34260 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem))
   34261 	for {
   34262 		_ = v.Args[1]
   34263 		sh := v.Args[0]
   34264 		if sh.Op != OpS390XSLWconst {
   34265 			break
   34266 		}
   34267 		if sh.AuxInt != 8 {
   34268 			break
   34269 		}
   34270 		x1 := sh.Args[0]
   34271 		if x1.Op != OpS390XMOVBZload {
   34272 			break
   34273 		}
   34274 		i1 := x1.AuxInt
   34275 		s := x1.Aux
   34276 		_ = x1.Args[1]
   34277 		p := x1.Args[0]
   34278 		mem := x1.Args[1]
   34279 		x0 := v.Args[1]
   34280 		if x0.Op != OpS390XMOVBZload {
   34281 			break
   34282 		}
   34283 		i0 := x0.AuxInt
   34284 		if x0.Aux != s {
   34285 			break
   34286 		}
   34287 		_ = x0.Args[1]
   34288 		if p != x0.Args[0] {
   34289 			break
   34290 		}
   34291 		if mem != x0.Args[1] {
   34292 			break
   34293 		}
   34294 		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)) {
   34295 			break
   34296 		}
   34297 		b = mergePoint(b, x0, x1)
   34298 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34299 		v.reset(OpCopy)
   34300 		v.AddArg(v0)
   34301 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   34302 		v1.AuxInt = i0
   34303 		v1.Aux = s
   34304 		v1.AddArg(p)
   34305 		v1.AddArg(mem)
   34306 		v0.AddArg(v1)
   34307 		return true
   34308 	}
   34309 	// match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))))
   34310 	// 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)
   34311 	// result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem)
   34312 	for {
   34313 		_ = v.Args[1]
   34314 		r0 := v.Args[0]
   34315 		if r0.Op != OpS390XMOVHZreg {
   34316 			break
   34317 		}
   34318 		x0 := r0.Args[0]
   34319 		if x0.Op != OpS390XMOVHBRload {
   34320 			break
   34321 		}
   34322 		i0 := x0.AuxInt
   34323 		s := x0.Aux
   34324 		_ = x0.Args[1]
   34325 		p := x0.Args[0]
   34326 		mem := x0.Args[1]
   34327 		sh := v.Args[1]
   34328 		if sh.Op != OpS390XSLWconst {
   34329 			break
   34330 		}
   34331 		if sh.AuxInt != 16 {
   34332 			break
   34333 		}
   34334 		r1 := sh.Args[0]
   34335 		if r1.Op != OpS390XMOVHZreg {
   34336 			break
   34337 		}
   34338 		x1 := r1.Args[0]
   34339 		if x1.Op != OpS390XMOVHBRload {
   34340 			break
   34341 		}
   34342 		i1 := x1.AuxInt
   34343 		if x1.Aux != s {
   34344 			break
   34345 		}
   34346 		_ = x1.Args[1]
   34347 		if p != x1.Args[0] {
   34348 			break
   34349 		}
   34350 		if mem != x1.Args[1] {
   34351 			break
   34352 		}
   34353 		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)) {
   34354 			break
   34355 		}
   34356 		b = mergePoint(b, x0, x1)
   34357 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   34358 		v.reset(OpCopy)
   34359 		v.AddArg(v0)
   34360 		v0.AuxInt = i0
   34361 		v0.Aux = s
   34362 		v0.AddArg(p)
   34363 		v0.AddArg(mem)
   34364 		return true
   34365 	}
   34366 	// match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))
   34367 	// 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)
   34368 	// result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem)
   34369 	for {
   34370 		_ = v.Args[1]
   34371 		sh := v.Args[0]
   34372 		if sh.Op != OpS390XSLWconst {
   34373 			break
   34374 		}
   34375 		if sh.AuxInt != 16 {
   34376 			break
   34377 		}
   34378 		r1 := sh.Args[0]
   34379 		if r1.Op != OpS390XMOVHZreg {
   34380 			break
   34381 		}
   34382 		x1 := r1.Args[0]
   34383 		if x1.Op != OpS390XMOVHBRload {
   34384 			break
   34385 		}
   34386 		i1 := x1.AuxInt
   34387 		s := x1.Aux
   34388 		_ = x1.Args[1]
   34389 		p := x1.Args[0]
   34390 		mem := x1.Args[1]
   34391 		r0 := v.Args[1]
   34392 		if r0.Op != OpS390XMOVHZreg {
   34393 			break
   34394 		}
   34395 		x0 := r0.Args[0]
   34396 		if x0.Op != OpS390XMOVHBRload {
   34397 			break
   34398 		}
   34399 		i0 := x0.AuxInt
   34400 		if x0.Aux != s {
   34401 			break
   34402 		}
   34403 		_ = x0.Args[1]
   34404 		if p != x0.Args[0] {
   34405 			break
   34406 		}
   34407 		if mem != x0.Args[1] {
   34408 			break
   34409 		}
   34410 		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)) {
   34411 			break
   34412 		}
   34413 		b = mergePoint(b, x0, x1)
   34414 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32)
   34415 		v.reset(OpCopy)
   34416 		v.AddArg(v0)
   34417 		v0.AuxInt = i0
   34418 		v0.Aux = s
   34419 		v0.AddArg(p)
   34420 		v0.AddArg(mem)
   34421 		return true
   34422 	}
   34423 	// match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y))
   34424 	// 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)
   34425 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   34426 	for {
   34427 		_ = v.Args[1]
   34428 		s1 := v.Args[0]
   34429 		if s1.Op != OpS390XSLWconst {
   34430 			break
   34431 		}
   34432 		j1 := s1.AuxInt
   34433 		x1 := s1.Args[0]
   34434 		if x1.Op != OpS390XMOVBZload {
   34435 			break
   34436 		}
   34437 		i1 := x1.AuxInt
   34438 		s := x1.Aux
   34439 		_ = x1.Args[1]
   34440 		p := x1.Args[0]
   34441 		mem := x1.Args[1]
   34442 		or := v.Args[1]
   34443 		if or.Op != OpS390XORW {
   34444 			break
   34445 		}
   34446 		_ = or.Args[1]
   34447 		s0 := or.Args[0]
   34448 		if s0.Op != OpS390XSLWconst {
   34449 			break
   34450 		}
   34451 		j0 := s0.AuxInt
   34452 		x0 := s0.Args[0]
   34453 		if x0.Op != OpS390XMOVBZload {
   34454 			break
   34455 		}
   34456 		i0 := x0.AuxInt
   34457 		if x0.Aux != s {
   34458 			break
   34459 		}
   34460 		_ = x0.Args[1]
   34461 		if p != x0.Args[0] {
   34462 			break
   34463 		}
   34464 		if mem != x0.Args[1] {
   34465 			break
   34466 		}
   34467 		y := or.Args[1]
   34468 		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)) {
   34469 			break
   34470 		}
   34471 		b = mergePoint(b, x0, x1)
   34472 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34473 		v.reset(OpCopy)
   34474 		v.AddArg(v0)
   34475 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34476 		v1.AuxInt = j0
   34477 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34478 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   34479 		v3.AuxInt = i0
   34480 		v3.Aux = s
   34481 		v3.AddArg(p)
   34482 		v3.AddArg(mem)
   34483 		v2.AddArg(v3)
   34484 		v1.AddArg(v2)
   34485 		v0.AddArg(v1)
   34486 		v0.AddArg(y)
   34487 		return true
   34488 	}
   34489 	// match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))))
   34490 	// 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)
   34491 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   34492 	for {
   34493 		_ = v.Args[1]
   34494 		s1 := v.Args[0]
   34495 		if s1.Op != OpS390XSLWconst {
   34496 			break
   34497 		}
   34498 		j1 := s1.AuxInt
   34499 		x1 := s1.Args[0]
   34500 		if x1.Op != OpS390XMOVBZload {
   34501 			break
   34502 		}
   34503 		i1 := x1.AuxInt
   34504 		s := x1.Aux
   34505 		_ = x1.Args[1]
   34506 		p := x1.Args[0]
   34507 		mem := x1.Args[1]
   34508 		or := v.Args[1]
   34509 		if or.Op != OpS390XORW {
   34510 			break
   34511 		}
   34512 		_ = or.Args[1]
   34513 		y := or.Args[0]
   34514 		s0 := or.Args[1]
   34515 		if s0.Op != OpS390XSLWconst {
   34516 			break
   34517 		}
   34518 		j0 := s0.AuxInt
   34519 		x0 := s0.Args[0]
   34520 		if x0.Op != OpS390XMOVBZload {
   34521 			break
   34522 		}
   34523 		i0 := x0.AuxInt
   34524 		if x0.Aux != s {
   34525 			break
   34526 		}
   34527 		_ = x0.Args[1]
   34528 		if p != x0.Args[0] {
   34529 			break
   34530 		}
   34531 		if mem != x0.Args[1] {
   34532 			break
   34533 		}
   34534 		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)) {
   34535 			break
   34536 		}
   34537 		b = mergePoint(b, x0, x1)
   34538 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34539 		v.reset(OpCopy)
   34540 		v.AddArg(v0)
   34541 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34542 		v1.AuxInt = j0
   34543 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34544 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   34545 		v3.AuxInt = i0
   34546 		v3.Aux = s
   34547 		v3.AddArg(p)
   34548 		v3.AddArg(mem)
   34549 		v2.AddArg(v3)
   34550 		v1.AddArg(v2)
   34551 		v0.AddArg(v1)
   34552 		v0.AddArg(y)
   34553 		return true
   34554 	}
   34555 	// match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))
   34556 	// 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)
   34557 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   34558 	for {
   34559 		_ = v.Args[1]
   34560 		or := v.Args[0]
   34561 		if or.Op != OpS390XORW {
   34562 			break
   34563 		}
   34564 		_ = or.Args[1]
   34565 		s0 := or.Args[0]
   34566 		if s0.Op != OpS390XSLWconst {
   34567 			break
   34568 		}
   34569 		j0 := s0.AuxInt
   34570 		x0 := s0.Args[0]
   34571 		if x0.Op != OpS390XMOVBZload {
   34572 			break
   34573 		}
   34574 		i0 := x0.AuxInt
   34575 		s := x0.Aux
   34576 		_ = x0.Args[1]
   34577 		p := x0.Args[0]
   34578 		mem := x0.Args[1]
   34579 		y := or.Args[1]
   34580 		s1 := v.Args[1]
   34581 		if s1.Op != OpS390XSLWconst {
   34582 			break
   34583 		}
   34584 		j1 := s1.AuxInt
   34585 		x1 := s1.Args[0]
   34586 		if x1.Op != OpS390XMOVBZload {
   34587 			break
   34588 		}
   34589 		i1 := x1.AuxInt
   34590 		if x1.Aux != s {
   34591 			break
   34592 		}
   34593 		_ = x1.Args[1]
   34594 		if p != x1.Args[0] {
   34595 			break
   34596 		}
   34597 		if mem != x1.Args[1] {
   34598 			break
   34599 		}
   34600 		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)) {
   34601 			break
   34602 		}
   34603 		b = mergePoint(b, x0, x1)
   34604 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34605 		v.reset(OpCopy)
   34606 		v.AddArg(v0)
   34607 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34608 		v1.AuxInt = j0
   34609 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34610 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   34611 		v3.AuxInt = i0
   34612 		v3.Aux = s
   34613 		v3.AddArg(p)
   34614 		v3.AddArg(mem)
   34615 		v2.AddArg(v3)
   34616 		v1.AddArg(v2)
   34617 		v0.AddArg(v1)
   34618 		v0.AddArg(y)
   34619 		return true
   34620 	}
   34621 	return false
   34622 }
   34623 func rewriteValueS390X_OpS390XORW_60(v *Value) bool {
   34624 	b := v.Block
   34625 	_ = b
   34626 	typ := &b.Func.Config.Types
   34627 	_ = typ
   34628 	// match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))
   34629 	// 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)
   34630 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y)
   34631 	for {
   34632 		_ = v.Args[1]
   34633 		or := v.Args[0]
   34634 		if or.Op != OpS390XORW {
   34635 			break
   34636 		}
   34637 		_ = or.Args[1]
   34638 		y := or.Args[0]
   34639 		s0 := or.Args[1]
   34640 		if s0.Op != OpS390XSLWconst {
   34641 			break
   34642 		}
   34643 		j0 := s0.AuxInt
   34644 		x0 := s0.Args[0]
   34645 		if x0.Op != OpS390XMOVBZload {
   34646 			break
   34647 		}
   34648 		i0 := x0.AuxInt
   34649 		s := x0.Aux
   34650 		_ = x0.Args[1]
   34651 		p := x0.Args[0]
   34652 		mem := x0.Args[1]
   34653 		s1 := v.Args[1]
   34654 		if s1.Op != OpS390XSLWconst {
   34655 			break
   34656 		}
   34657 		j1 := s1.AuxInt
   34658 		x1 := s1.Args[0]
   34659 		if x1.Op != OpS390XMOVBZload {
   34660 			break
   34661 		}
   34662 		i1 := x1.AuxInt
   34663 		if x1.Aux != s {
   34664 			break
   34665 		}
   34666 		_ = x1.Args[1]
   34667 		if p != x1.Args[0] {
   34668 			break
   34669 		}
   34670 		if mem != x1.Args[1] {
   34671 			break
   34672 		}
   34673 		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)) {
   34674 			break
   34675 		}
   34676 		b = mergePoint(b, x0, x1)
   34677 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   34678 		v.reset(OpCopy)
   34679 		v.AddArg(v0)
   34680 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   34681 		v1.AuxInt = j0
   34682 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34683 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16)
   34684 		v3.AuxInt = i0
   34685 		v3.Aux = s
   34686 		v3.AddArg(p)
   34687 		v3.AddArg(mem)
   34688 		v2.AddArg(v3)
   34689 		v1.AddArg(v2)
   34690 		v0.AddArg(v1)
   34691 		v0.AddArg(y)
   34692 		return true
   34693 	}
   34694 	// match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)))
   34695 	// 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)
   34696 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   34697 	for {
   34698 		_ = v.Args[1]
   34699 		x0 := v.Args[0]
   34700 		if x0.Op != OpS390XMOVBZloadidx {
   34701 			break
   34702 		}
   34703 		i0 := x0.AuxInt
   34704 		s := x0.Aux
   34705 		_ = x0.Args[2]
   34706 		p := x0.Args[0]
   34707 		idx := x0.Args[1]
   34708 		mem := x0.Args[2]
   34709 		sh := v.Args[1]
   34710 		if sh.Op != OpS390XSLWconst {
   34711 			break
   34712 		}
   34713 		if sh.AuxInt != 8 {
   34714 			break
   34715 		}
   34716 		x1 := sh.Args[0]
   34717 		if x1.Op != OpS390XMOVBZloadidx {
   34718 			break
   34719 		}
   34720 		i1 := x1.AuxInt
   34721 		if x1.Aux != s {
   34722 			break
   34723 		}
   34724 		_ = x1.Args[2]
   34725 		if p != x1.Args[0] {
   34726 			break
   34727 		}
   34728 		if idx != x1.Args[1] {
   34729 			break
   34730 		}
   34731 		if mem != x1.Args[2] {
   34732 			break
   34733 		}
   34734 		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)) {
   34735 			break
   34736 		}
   34737 		b = mergePoint(b, x0, x1)
   34738 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34739 		v.reset(OpCopy)
   34740 		v.AddArg(v0)
   34741 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   34742 		v1.AuxInt = i0
   34743 		v1.Aux = s
   34744 		v1.AddArg(p)
   34745 		v1.AddArg(idx)
   34746 		v1.AddArg(mem)
   34747 		v0.AddArg(v1)
   34748 		return true
   34749 	}
   34750 	// match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)))
   34751 	// 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)
   34752 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   34753 	for {
   34754 		_ = v.Args[1]
   34755 		x0 := v.Args[0]
   34756 		if x0.Op != OpS390XMOVBZloadidx {
   34757 			break
   34758 		}
   34759 		i0 := x0.AuxInt
   34760 		s := x0.Aux
   34761 		_ = x0.Args[2]
   34762 		idx := x0.Args[0]
   34763 		p := x0.Args[1]
   34764 		mem := x0.Args[2]
   34765 		sh := v.Args[1]
   34766 		if sh.Op != OpS390XSLWconst {
   34767 			break
   34768 		}
   34769 		if sh.AuxInt != 8 {
   34770 			break
   34771 		}
   34772 		x1 := sh.Args[0]
   34773 		if x1.Op != OpS390XMOVBZloadidx {
   34774 			break
   34775 		}
   34776 		i1 := x1.AuxInt
   34777 		if x1.Aux != s {
   34778 			break
   34779 		}
   34780 		_ = x1.Args[2]
   34781 		if p != x1.Args[0] {
   34782 			break
   34783 		}
   34784 		if idx != x1.Args[1] {
   34785 			break
   34786 		}
   34787 		if mem != x1.Args[2] {
   34788 			break
   34789 		}
   34790 		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)) {
   34791 			break
   34792 		}
   34793 		b = mergePoint(b, x0, x1)
   34794 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34795 		v.reset(OpCopy)
   34796 		v.AddArg(v0)
   34797 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   34798 		v1.AuxInt = i0
   34799 		v1.Aux = s
   34800 		v1.AddArg(p)
   34801 		v1.AddArg(idx)
   34802 		v1.AddArg(mem)
   34803 		v0.AddArg(v1)
   34804 		return true
   34805 	}
   34806 	// match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)))
   34807 	// 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)
   34808 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   34809 	for {
   34810 		_ = v.Args[1]
   34811 		x0 := v.Args[0]
   34812 		if x0.Op != OpS390XMOVBZloadidx {
   34813 			break
   34814 		}
   34815 		i0 := x0.AuxInt
   34816 		s := x0.Aux
   34817 		_ = x0.Args[2]
   34818 		p := x0.Args[0]
   34819 		idx := x0.Args[1]
   34820 		mem := x0.Args[2]
   34821 		sh := v.Args[1]
   34822 		if sh.Op != OpS390XSLWconst {
   34823 			break
   34824 		}
   34825 		if sh.AuxInt != 8 {
   34826 			break
   34827 		}
   34828 		x1 := sh.Args[0]
   34829 		if x1.Op != OpS390XMOVBZloadidx {
   34830 			break
   34831 		}
   34832 		i1 := x1.AuxInt
   34833 		if x1.Aux != s {
   34834 			break
   34835 		}
   34836 		_ = x1.Args[2]
   34837 		if idx != x1.Args[0] {
   34838 			break
   34839 		}
   34840 		if p != x1.Args[1] {
   34841 			break
   34842 		}
   34843 		if mem != x1.Args[2] {
   34844 			break
   34845 		}
   34846 		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)) {
   34847 			break
   34848 		}
   34849 		b = mergePoint(b, x0, x1)
   34850 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34851 		v.reset(OpCopy)
   34852 		v.AddArg(v0)
   34853 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   34854 		v1.AuxInt = i0
   34855 		v1.Aux = s
   34856 		v1.AddArg(p)
   34857 		v1.AddArg(idx)
   34858 		v1.AddArg(mem)
   34859 		v0.AddArg(v1)
   34860 		return true
   34861 	}
   34862 	// match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)))
   34863 	// 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)
   34864 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   34865 	for {
   34866 		_ = v.Args[1]
   34867 		x0 := v.Args[0]
   34868 		if x0.Op != OpS390XMOVBZloadidx {
   34869 			break
   34870 		}
   34871 		i0 := x0.AuxInt
   34872 		s := x0.Aux
   34873 		_ = x0.Args[2]
   34874 		idx := x0.Args[0]
   34875 		p := x0.Args[1]
   34876 		mem := x0.Args[2]
   34877 		sh := v.Args[1]
   34878 		if sh.Op != OpS390XSLWconst {
   34879 			break
   34880 		}
   34881 		if sh.AuxInt != 8 {
   34882 			break
   34883 		}
   34884 		x1 := sh.Args[0]
   34885 		if x1.Op != OpS390XMOVBZloadidx {
   34886 			break
   34887 		}
   34888 		i1 := x1.AuxInt
   34889 		if x1.Aux != s {
   34890 			break
   34891 		}
   34892 		_ = x1.Args[2]
   34893 		if idx != x1.Args[0] {
   34894 			break
   34895 		}
   34896 		if p != x1.Args[1] {
   34897 			break
   34898 		}
   34899 		if mem != x1.Args[2] {
   34900 			break
   34901 		}
   34902 		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)) {
   34903 			break
   34904 		}
   34905 		b = mergePoint(b, x0, x1)
   34906 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34907 		v.reset(OpCopy)
   34908 		v.AddArg(v0)
   34909 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   34910 		v1.AuxInt = i0
   34911 		v1.Aux = s
   34912 		v1.AddArg(p)
   34913 		v1.AddArg(idx)
   34914 		v1.AddArg(mem)
   34915 		v0.AddArg(v1)
   34916 		return true
   34917 	}
   34918 	// match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem))
   34919 	// 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)
   34920 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   34921 	for {
   34922 		_ = v.Args[1]
   34923 		sh := v.Args[0]
   34924 		if sh.Op != OpS390XSLWconst {
   34925 			break
   34926 		}
   34927 		if sh.AuxInt != 8 {
   34928 			break
   34929 		}
   34930 		x1 := sh.Args[0]
   34931 		if x1.Op != OpS390XMOVBZloadidx {
   34932 			break
   34933 		}
   34934 		i1 := x1.AuxInt
   34935 		s := x1.Aux
   34936 		_ = x1.Args[2]
   34937 		p := x1.Args[0]
   34938 		idx := x1.Args[1]
   34939 		mem := x1.Args[2]
   34940 		x0 := v.Args[1]
   34941 		if x0.Op != OpS390XMOVBZloadidx {
   34942 			break
   34943 		}
   34944 		i0 := x0.AuxInt
   34945 		if x0.Aux != s {
   34946 			break
   34947 		}
   34948 		_ = x0.Args[2]
   34949 		if p != x0.Args[0] {
   34950 			break
   34951 		}
   34952 		if idx != x0.Args[1] {
   34953 			break
   34954 		}
   34955 		if mem != x0.Args[2] {
   34956 			break
   34957 		}
   34958 		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)) {
   34959 			break
   34960 		}
   34961 		b = mergePoint(b, x0, x1)
   34962 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   34963 		v.reset(OpCopy)
   34964 		v.AddArg(v0)
   34965 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   34966 		v1.AuxInt = i0
   34967 		v1.Aux = s
   34968 		v1.AddArg(p)
   34969 		v1.AddArg(idx)
   34970 		v1.AddArg(mem)
   34971 		v0.AddArg(v1)
   34972 		return true
   34973 	}
   34974 	// match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem))
   34975 	// 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)
   34976 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   34977 	for {
   34978 		_ = v.Args[1]
   34979 		sh := v.Args[0]
   34980 		if sh.Op != OpS390XSLWconst {
   34981 			break
   34982 		}
   34983 		if sh.AuxInt != 8 {
   34984 			break
   34985 		}
   34986 		x1 := sh.Args[0]
   34987 		if x1.Op != OpS390XMOVBZloadidx {
   34988 			break
   34989 		}
   34990 		i1 := x1.AuxInt
   34991 		s := x1.Aux
   34992 		_ = x1.Args[2]
   34993 		idx := x1.Args[0]
   34994 		p := x1.Args[1]
   34995 		mem := x1.Args[2]
   34996 		x0 := v.Args[1]
   34997 		if x0.Op != OpS390XMOVBZloadidx {
   34998 			break
   34999 		}
   35000 		i0 := x0.AuxInt
   35001 		if x0.Aux != s {
   35002 			break
   35003 		}
   35004 		_ = x0.Args[2]
   35005 		if p != x0.Args[0] {
   35006 			break
   35007 		}
   35008 		if idx != x0.Args[1] {
   35009 			break
   35010 		}
   35011 		if mem != x0.Args[2] {
   35012 			break
   35013 		}
   35014 		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)) {
   35015 			break
   35016 		}
   35017 		b = mergePoint(b, x0, x1)
   35018 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35019 		v.reset(OpCopy)
   35020 		v.AddArg(v0)
   35021 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35022 		v1.AuxInt = i0
   35023 		v1.Aux = s
   35024 		v1.AddArg(p)
   35025 		v1.AddArg(idx)
   35026 		v1.AddArg(mem)
   35027 		v0.AddArg(v1)
   35028 		return true
   35029 	}
   35030 	// match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem))
   35031 	// 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)
   35032 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   35033 	for {
   35034 		_ = v.Args[1]
   35035 		sh := v.Args[0]
   35036 		if sh.Op != OpS390XSLWconst {
   35037 			break
   35038 		}
   35039 		if sh.AuxInt != 8 {
   35040 			break
   35041 		}
   35042 		x1 := sh.Args[0]
   35043 		if x1.Op != OpS390XMOVBZloadidx {
   35044 			break
   35045 		}
   35046 		i1 := x1.AuxInt
   35047 		s := x1.Aux
   35048 		_ = x1.Args[2]
   35049 		p := x1.Args[0]
   35050 		idx := x1.Args[1]
   35051 		mem := x1.Args[2]
   35052 		x0 := v.Args[1]
   35053 		if x0.Op != OpS390XMOVBZloadidx {
   35054 			break
   35055 		}
   35056 		i0 := x0.AuxInt
   35057 		if x0.Aux != s {
   35058 			break
   35059 		}
   35060 		_ = x0.Args[2]
   35061 		if idx != x0.Args[0] {
   35062 			break
   35063 		}
   35064 		if p != x0.Args[1] {
   35065 			break
   35066 		}
   35067 		if mem != x0.Args[2] {
   35068 			break
   35069 		}
   35070 		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)) {
   35071 			break
   35072 		}
   35073 		b = mergePoint(b, x0, x1)
   35074 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35075 		v.reset(OpCopy)
   35076 		v.AddArg(v0)
   35077 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35078 		v1.AuxInt = i0
   35079 		v1.Aux = s
   35080 		v1.AddArg(p)
   35081 		v1.AddArg(idx)
   35082 		v1.AddArg(mem)
   35083 		v0.AddArg(v1)
   35084 		return true
   35085 	}
   35086 	// match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem))
   35087 	// 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)
   35088 	// result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))
   35089 	for {
   35090 		_ = v.Args[1]
   35091 		sh := v.Args[0]
   35092 		if sh.Op != OpS390XSLWconst {
   35093 			break
   35094 		}
   35095 		if sh.AuxInt != 8 {
   35096 			break
   35097 		}
   35098 		x1 := sh.Args[0]
   35099 		if x1.Op != OpS390XMOVBZloadidx {
   35100 			break
   35101 		}
   35102 		i1 := x1.AuxInt
   35103 		s := x1.Aux
   35104 		_ = x1.Args[2]
   35105 		idx := x1.Args[0]
   35106 		p := x1.Args[1]
   35107 		mem := x1.Args[2]
   35108 		x0 := v.Args[1]
   35109 		if x0.Op != OpS390XMOVBZloadidx {
   35110 			break
   35111 		}
   35112 		i0 := x0.AuxInt
   35113 		if x0.Aux != s {
   35114 			break
   35115 		}
   35116 		_ = x0.Args[2]
   35117 		if idx != x0.Args[0] {
   35118 			break
   35119 		}
   35120 		if p != x0.Args[1] {
   35121 			break
   35122 		}
   35123 		if mem != x0.Args[2] {
   35124 			break
   35125 		}
   35126 		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)) {
   35127 			break
   35128 		}
   35129 		b = mergePoint(b, x0, x1)
   35130 		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35131 		v.reset(OpCopy)
   35132 		v.AddArg(v0)
   35133 		v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35134 		v1.AuxInt = i0
   35135 		v1.Aux = s
   35136 		v1.AddArg(p)
   35137 		v1.AddArg(idx)
   35138 		v1.AddArg(mem)
   35139 		v0.AddArg(v1)
   35140 		return true
   35141 	}
   35142 	// match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))))
   35143 	// 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)
   35144 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35145 	for {
   35146 		_ = v.Args[1]
   35147 		r0 := v.Args[0]
   35148 		if r0.Op != OpS390XMOVHZreg {
   35149 			break
   35150 		}
   35151 		x0 := r0.Args[0]
   35152 		if x0.Op != OpS390XMOVHBRloadidx {
   35153 			break
   35154 		}
   35155 		i0 := x0.AuxInt
   35156 		s := x0.Aux
   35157 		_ = x0.Args[2]
   35158 		p := x0.Args[0]
   35159 		idx := x0.Args[1]
   35160 		mem := x0.Args[2]
   35161 		sh := v.Args[1]
   35162 		if sh.Op != OpS390XSLWconst {
   35163 			break
   35164 		}
   35165 		if sh.AuxInt != 16 {
   35166 			break
   35167 		}
   35168 		r1 := sh.Args[0]
   35169 		if r1.Op != OpS390XMOVHZreg {
   35170 			break
   35171 		}
   35172 		x1 := r1.Args[0]
   35173 		if x1.Op != OpS390XMOVHBRloadidx {
   35174 			break
   35175 		}
   35176 		i1 := x1.AuxInt
   35177 		if x1.Aux != s {
   35178 			break
   35179 		}
   35180 		_ = x1.Args[2]
   35181 		if p != x1.Args[0] {
   35182 			break
   35183 		}
   35184 		if idx != x1.Args[1] {
   35185 			break
   35186 		}
   35187 		if mem != x1.Args[2] {
   35188 			break
   35189 		}
   35190 		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)) {
   35191 			break
   35192 		}
   35193 		b = mergePoint(b, x0, x1)
   35194 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35195 		v.reset(OpCopy)
   35196 		v.AddArg(v0)
   35197 		v0.AuxInt = i0
   35198 		v0.Aux = s
   35199 		v0.AddArg(p)
   35200 		v0.AddArg(idx)
   35201 		v0.AddArg(mem)
   35202 		return true
   35203 	}
   35204 	return false
   35205 }
   35206 func rewriteValueS390X_OpS390XORW_70(v *Value) bool {
   35207 	b := v.Block
   35208 	_ = b
   35209 	typ := &b.Func.Config.Types
   35210 	_ = typ
   35211 	// match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))))
   35212 	// 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)
   35213 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35214 	for {
   35215 		_ = v.Args[1]
   35216 		r0 := v.Args[0]
   35217 		if r0.Op != OpS390XMOVHZreg {
   35218 			break
   35219 		}
   35220 		x0 := r0.Args[0]
   35221 		if x0.Op != OpS390XMOVHBRloadidx {
   35222 			break
   35223 		}
   35224 		i0 := x0.AuxInt
   35225 		s := x0.Aux
   35226 		_ = x0.Args[2]
   35227 		idx := x0.Args[0]
   35228 		p := x0.Args[1]
   35229 		mem := x0.Args[2]
   35230 		sh := v.Args[1]
   35231 		if sh.Op != OpS390XSLWconst {
   35232 			break
   35233 		}
   35234 		if sh.AuxInt != 16 {
   35235 			break
   35236 		}
   35237 		r1 := sh.Args[0]
   35238 		if r1.Op != OpS390XMOVHZreg {
   35239 			break
   35240 		}
   35241 		x1 := r1.Args[0]
   35242 		if x1.Op != OpS390XMOVHBRloadidx {
   35243 			break
   35244 		}
   35245 		i1 := x1.AuxInt
   35246 		if x1.Aux != s {
   35247 			break
   35248 		}
   35249 		_ = x1.Args[2]
   35250 		if p != x1.Args[0] {
   35251 			break
   35252 		}
   35253 		if idx != x1.Args[1] {
   35254 			break
   35255 		}
   35256 		if mem != x1.Args[2] {
   35257 			break
   35258 		}
   35259 		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)) {
   35260 			break
   35261 		}
   35262 		b = mergePoint(b, x0, x1)
   35263 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35264 		v.reset(OpCopy)
   35265 		v.AddArg(v0)
   35266 		v0.AuxInt = i0
   35267 		v0.Aux = s
   35268 		v0.AddArg(p)
   35269 		v0.AddArg(idx)
   35270 		v0.AddArg(mem)
   35271 		return true
   35272 	}
   35273 	// match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))))
   35274 	// 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)
   35275 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35276 	for {
   35277 		_ = v.Args[1]
   35278 		r0 := v.Args[0]
   35279 		if r0.Op != OpS390XMOVHZreg {
   35280 			break
   35281 		}
   35282 		x0 := r0.Args[0]
   35283 		if x0.Op != OpS390XMOVHBRloadidx {
   35284 			break
   35285 		}
   35286 		i0 := x0.AuxInt
   35287 		s := x0.Aux
   35288 		_ = x0.Args[2]
   35289 		p := x0.Args[0]
   35290 		idx := x0.Args[1]
   35291 		mem := x0.Args[2]
   35292 		sh := v.Args[1]
   35293 		if sh.Op != OpS390XSLWconst {
   35294 			break
   35295 		}
   35296 		if sh.AuxInt != 16 {
   35297 			break
   35298 		}
   35299 		r1 := sh.Args[0]
   35300 		if r1.Op != OpS390XMOVHZreg {
   35301 			break
   35302 		}
   35303 		x1 := r1.Args[0]
   35304 		if x1.Op != OpS390XMOVHBRloadidx {
   35305 			break
   35306 		}
   35307 		i1 := x1.AuxInt
   35308 		if x1.Aux != s {
   35309 			break
   35310 		}
   35311 		_ = x1.Args[2]
   35312 		if idx != x1.Args[0] {
   35313 			break
   35314 		}
   35315 		if p != x1.Args[1] {
   35316 			break
   35317 		}
   35318 		if mem != x1.Args[2] {
   35319 			break
   35320 		}
   35321 		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)) {
   35322 			break
   35323 		}
   35324 		b = mergePoint(b, x0, x1)
   35325 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35326 		v.reset(OpCopy)
   35327 		v.AddArg(v0)
   35328 		v0.AuxInt = i0
   35329 		v0.Aux = s
   35330 		v0.AddArg(p)
   35331 		v0.AddArg(idx)
   35332 		v0.AddArg(mem)
   35333 		return true
   35334 	}
   35335 	// match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))))
   35336 	// 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)
   35337 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35338 	for {
   35339 		_ = v.Args[1]
   35340 		r0 := v.Args[0]
   35341 		if r0.Op != OpS390XMOVHZreg {
   35342 			break
   35343 		}
   35344 		x0 := r0.Args[0]
   35345 		if x0.Op != OpS390XMOVHBRloadidx {
   35346 			break
   35347 		}
   35348 		i0 := x0.AuxInt
   35349 		s := x0.Aux
   35350 		_ = x0.Args[2]
   35351 		idx := x0.Args[0]
   35352 		p := x0.Args[1]
   35353 		mem := x0.Args[2]
   35354 		sh := v.Args[1]
   35355 		if sh.Op != OpS390XSLWconst {
   35356 			break
   35357 		}
   35358 		if sh.AuxInt != 16 {
   35359 			break
   35360 		}
   35361 		r1 := sh.Args[0]
   35362 		if r1.Op != OpS390XMOVHZreg {
   35363 			break
   35364 		}
   35365 		x1 := r1.Args[0]
   35366 		if x1.Op != OpS390XMOVHBRloadidx {
   35367 			break
   35368 		}
   35369 		i1 := x1.AuxInt
   35370 		if x1.Aux != s {
   35371 			break
   35372 		}
   35373 		_ = x1.Args[2]
   35374 		if idx != x1.Args[0] {
   35375 			break
   35376 		}
   35377 		if p != x1.Args[1] {
   35378 			break
   35379 		}
   35380 		if mem != x1.Args[2] {
   35381 			break
   35382 		}
   35383 		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)) {
   35384 			break
   35385 		}
   35386 		b = mergePoint(b, x0, x1)
   35387 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35388 		v.reset(OpCopy)
   35389 		v.AddArg(v0)
   35390 		v0.AuxInt = i0
   35391 		v0.Aux = s
   35392 		v0.AddArg(p)
   35393 		v0.AddArg(idx)
   35394 		v0.AddArg(mem)
   35395 		return true
   35396 	}
   35397 	// match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))
   35398 	// 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)
   35399 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35400 	for {
   35401 		_ = v.Args[1]
   35402 		sh := v.Args[0]
   35403 		if sh.Op != OpS390XSLWconst {
   35404 			break
   35405 		}
   35406 		if sh.AuxInt != 16 {
   35407 			break
   35408 		}
   35409 		r1 := sh.Args[0]
   35410 		if r1.Op != OpS390XMOVHZreg {
   35411 			break
   35412 		}
   35413 		x1 := r1.Args[0]
   35414 		if x1.Op != OpS390XMOVHBRloadidx {
   35415 			break
   35416 		}
   35417 		i1 := x1.AuxInt
   35418 		s := x1.Aux
   35419 		_ = x1.Args[2]
   35420 		p := x1.Args[0]
   35421 		idx := x1.Args[1]
   35422 		mem := x1.Args[2]
   35423 		r0 := v.Args[1]
   35424 		if r0.Op != OpS390XMOVHZreg {
   35425 			break
   35426 		}
   35427 		x0 := r0.Args[0]
   35428 		if x0.Op != OpS390XMOVHBRloadidx {
   35429 			break
   35430 		}
   35431 		i0 := x0.AuxInt
   35432 		if x0.Aux != s {
   35433 			break
   35434 		}
   35435 		_ = x0.Args[2]
   35436 		if p != x0.Args[0] {
   35437 			break
   35438 		}
   35439 		if idx != x0.Args[1] {
   35440 			break
   35441 		}
   35442 		if mem != x0.Args[2] {
   35443 			break
   35444 		}
   35445 		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)) {
   35446 			break
   35447 		}
   35448 		b = mergePoint(b, x0, x1)
   35449 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35450 		v.reset(OpCopy)
   35451 		v.AddArg(v0)
   35452 		v0.AuxInt = i0
   35453 		v0.Aux = s
   35454 		v0.AddArg(p)
   35455 		v0.AddArg(idx)
   35456 		v0.AddArg(mem)
   35457 		return true
   35458 	}
   35459 	// match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))
   35460 	// 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)
   35461 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35462 	for {
   35463 		_ = v.Args[1]
   35464 		sh := v.Args[0]
   35465 		if sh.Op != OpS390XSLWconst {
   35466 			break
   35467 		}
   35468 		if sh.AuxInt != 16 {
   35469 			break
   35470 		}
   35471 		r1 := sh.Args[0]
   35472 		if r1.Op != OpS390XMOVHZreg {
   35473 			break
   35474 		}
   35475 		x1 := r1.Args[0]
   35476 		if x1.Op != OpS390XMOVHBRloadidx {
   35477 			break
   35478 		}
   35479 		i1 := x1.AuxInt
   35480 		s := x1.Aux
   35481 		_ = x1.Args[2]
   35482 		idx := x1.Args[0]
   35483 		p := x1.Args[1]
   35484 		mem := x1.Args[2]
   35485 		r0 := v.Args[1]
   35486 		if r0.Op != OpS390XMOVHZreg {
   35487 			break
   35488 		}
   35489 		x0 := r0.Args[0]
   35490 		if x0.Op != OpS390XMOVHBRloadidx {
   35491 			break
   35492 		}
   35493 		i0 := x0.AuxInt
   35494 		if x0.Aux != s {
   35495 			break
   35496 		}
   35497 		_ = x0.Args[2]
   35498 		if p != x0.Args[0] {
   35499 			break
   35500 		}
   35501 		if idx != x0.Args[1] {
   35502 			break
   35503 		}
   35504 		if mem != x0.Args[2] {
   35505 			break
   35506 		}
   35507 		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)) {
   35508 			break
   35509 		}
   35510 		b = mergePoint(b, x0, x1)
   35511 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35512 		v.reset(OpCopy)
   35513 		v.AddArg(v0)
   35514 		v0.AuxInt = i0
   35515 		v0.Aux = s
   35516 		v0.AddArg(p)
   35517 		v0.AddArg(idx)
   35518 		v0.AddArg(mem)
   35519 		return true
   35520 	}
   35521 	// match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))
   35522 	// 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)
   35523 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35524 	for {
   35525 		_ = v.Args[1]
   35526 		sh := v.Args[0]
   35527 		if sh.Op != OpS390XSLWconst {
   35528 			break
   35529 		}
   35530 		if sh.AuxInt != 16 {
   35531 			break
   35532 		}
   35533 		r1 := sh.Args[0]
   35534 		if r1.Op != OpS390XMOVHZreg {
   35535 			break
   35536 		}
   35537 		x1 := r1.Args[0]
   35538 		if x1.Op != OpS390XMOVHBRloadidx {
   35539 			break
   35540 		}
   35541 		i1 := x1.AuxInt
   35542 		s := x1.Aux
   35543 		_ = x1.Args[2]
   35544 		p := x1.Args[0]
   35545 		idx := x1.Args[1]
   35546 		mem := x1.Args[2]
   35547 		r0 := v.Args[1]
   35548 		if r0.Op != OpS390XMOVHZreg {
   35549 			break
   35550 		}
   35551 		x0 := r0.Args[0]
   35552 		if x0.Op != OpS390XMOVHBRloadidx {
   35553 			break
   35554 		}
   35555 		i0 := x0.AuxInt
   35556 		if x0.Aux != s {
   35557 			break
   35558 		}
   35559 		_ = x0.Args[2]
   35560 		if idx != x0.Args[0] {
   35561 			break
   35562 		}
   35563 		if p != x0.Args[1] {
   35564 			break
   35565 		}
   35566 		if mem != x0.Args[2] {
   35567 			break
   35568 		}
   35569 		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)) {
   35570 			break
   35571 		}
   35572 		b = mergePoint(b, x0, x1)
   35573 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35574 		v.reset(OpCopy)
   35575 		v.AddArg(v0)
   35576 		v0.AuxInt = i0
   35577 		v0.Aux = s
   35578 		v0.AddArg(p)
   35579 		v0.AddArg(idx)
   35580 		v0.AddArg(mem)
   35581 		return true
   35582 	}
   35583 	// match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))
   35584 	// 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)
   35585 	// result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem)
   35586 	for {
   35587 		_ = v.Args[1]
   35588 		sh := v.Args[0]
   35589 		if sh.Op != OpS390XSLWconst {
   35590 			break
   35591 		}
   35592 		if sh.AuxInt != 16 {
   35593 			break
   35594 		}
   35595 		r1 := sh.Args[0]
   35596 		if r1.Op != OpS390XMOVHZreg {
   35597 			break
   35598 		}
   35599 		x1 := r1.Args[0]
   35600 		if x1.Op != OpS390XMOVHBRloadidx {
   35601 			break
   35602 		}
   35603 		i1 := x1.AuxInt
   35604 		s := x1.Aux
   35605 		_ = x1.Args[2]
   35606 		idx := x1.Args[0]
   35607 		p := x1.Args[1]
   35608 		mem := x1.Args[2]
   35609 		r0 := v.Args[1]
   35610 		if r0.Op != OpS390XMOVHZreg {
   35611 			break
   35612 		}
   35613 		x0 := r0.Args[0]
   35614 		if x0.Op != OpS390XMOVHBRloadidx {
   35615 			break
   35616 		}
   35617 		i0 := x0.AuxInt
   35618 		if x0.Aux != s {
   35619 			break
   35620 		}
   35621 		_ = x0.Args[2]
   35622 		if idx != x0.Args[0] {
   35623 			break
   35624 		}
   35625 		if p != x0.Args[1] {
   35626 			break
   35627 		}
   35628 		if mem != x0.Args[2] {
   35629 			break
   35630 		}
   35631 		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)) {
   35632 			break
   35633 		}
   35634 		b = mergePoint(b, x0, x1)
   35635 		v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32)
   35636 		v.reset(OpCopy)
   35637 		v.AddArg(v0)
   35638 		v0.AuxInt = i0
   35639 		v0.Aux = s
   35640 		v0.AddArg(p)
   35641 		v0.AddArg(idx)
   35642 		v0.AddArg(mem)
   35643 		return true
   35644 	}
   35645 	// 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))
   35646 	// 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)
   35647 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   35648 	for {
   35649 		_ = v.Args[1]
   35650 		s1 := v.Args[0]
   35651 		if s1.Op != OpS390XSLWconst {
   35652 			break
   35653 		}
   35654 		j1 := s1.AuxInt
   35655 		x1 := s1.Args[0]
   35656 		if x1.Op != OpS390XMOVBZloadidx {
   35657 			break
   35658 		}
   35659 		i1 := x1.AuxInt
   35660 		s := x1.Aux
   35661 		_ = x1.Args[2]
   35662 		p := x1.Args[0]
   35663 		idx := x1.Args[1]
   35664 		mem := x1.Args[2]
   35665 		or := v.Args[1]
   35666 		if or.Op != OpS390XORW {
   35667 			break
   35668 		}
   35669 		_ = or.Args[1]
   35670 		s0 := or.Args[0]
   35671 		if s0.Op != OpS390XSLWconst {
   35672 			break
   35673 		}
   35674 		j0 := s0.AuxInt
   35675 		x0 := s0.Args[0]
   35676 		if x0.Op != OpS390XMOVBZloadidx {
   35677 			break
   35678 		}
   35679 		i0 := x0.AuxInt
   35680 		if x0.Aux != s {
   35681 			break
   35682 		}
   35683 		_ = x0.Args[2]
   35684 		if p != x0.Args[0] {
   35685 			break
   35686 		}
   35687 		if idx != x0.Args[1] {
   35688 			break
   35689 		}
   35690 		if mem != x0.Args[2] {
   35691 			break
   35692 		}
   35693 		y := or.Args[1]
   35694 		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)) {
   35695 			break
   35696 		}
   35697 		b = mergePoint(b, x0, x1)
   35698 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   35699 		v.reset(OpCopy)
   35700 		v.AddArg(v0)
   35701 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   35702 		v1.AuxInt = j0
   35703 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35704 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35705 		v3.AuxInt = i0
   35706 		v3.Aux = s
   35707 		v3.AddArg(p)
   35708 		v3.AddArg(idx)
   35709 		v3.AddArg(mem)
   35710 		v2.AddArg(v3)
   35711 		v1.AddArg(v2)
   35712 		v0.AddArg(v1)
   35713 		v0.AddArg(y)
   35714 		return true
   35715 	}
   35716 	// 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))
   35717 	// 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)
   35718 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   35719 	for {
   35720 		_ = v.Args[1]
   35721 		s1 := v.Args[0]
   35722 		if s1.Op != OpS390XSLWconst {
   35723 			break
   35724 		}
   35725 		j1 := s1.AuxInt
   35726 		x1 := s1.Args[0]
   35727 		if x1.Op != OpS390XMOVBZloadidx {
   35728 			break
   35729 		}
   35730 		i1 := x1.AuxInt
   35731 		s := x1.Aux
   35732 		_ = x1.Args[2]
   35733 		idx := x1.Args[0]
   35734 		p := x1.Args[1]
   35735 		mem := x1.Args[2]
   35736 		or := v.Args[1]
   35737 		if or.Op != OpS390XORW {
   35738 			break
   35739 		}
   35740 		_ = or.Args[1]
   35741 		s0 := or.Args[0]
   35742 		if s0.Op != OpS390XSLWconst {
   35743 			break
   35744 		}
   35745 		j0 := s0.AuxInt
   35746 		x0 := s0.Args[0]
   35747 		if x0.Op != OpS390XMOVBZloadidx {
   35748 			break
   35749 		}
   35750 		i0 := x0.AuxInt
   35751 		if x0.Aux != s {
   35752 			break
   35753 		}
   35754 		_ = x0.Args[2]
   35755 		if p != x0.Args[0] {
   35756 			break
   35757 		}
   35758 		if idx != x0.Args[1] {
   35759 			break
   35760 		}
   35761 		if mem != x0.Args[2] {
   35762 			break
   35763 		}
   35764 		y := or.Args[1]
   35765 		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)) {
   35766 			break
   35767 		}
   35768 		b = mergePoint(b, x0, x1)
   35769 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   35770 		v.reset(OpCopy)
   35771 		v.AddArg(v0)
   35772 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   35773 		v1.AuxInt = j0
   35774 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35775 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35776 		v3.AuxInt = i0
   35777 		v3.Aux = s
   35778 		v3.AddArg(p)
   35779 		v3.AddArg(idx)
   35780 		v3.AddArg(mem)
   35781 		v2.AddArg(v3)
   35782 		v1.AddArg(v2)
   35783 		v0.AddArg(v1)
   35784 		v0.AddArg(y)
   35785 		return true
   35786 	}
   35787 	// 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))
   35788 	// 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)
   35789 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   35790 	for {
   35791 		_ = v.Args[1]
   35792 		s1 := v.Args[0]
   35793 		if s1.Op != OpS390XSLWconst {
   35794 			break
   35795 		}
   35796 		j1 := s1.AuxInt
   35797 		x1 := s1.Args[0]
   35798 		if x1.Op != OpS390XMOVBZloadidx {
   35799 			break
   35800 		}
   35801 		i1 := x1.AuxInt
   35802 		s := x1.Aux
   35803 		_ = x1.Args[2]
   35804 		p := x1.Args[0]
   35805 		idx := x1.Args[1]
   35806 		mem := x1.Args[2]
   35807 		or := v.Args[1]
   35808 		if or.Op != OpS390XORW {
   35809 			break
   35810 		}
   35811 		_ = or.Args[1]
   35812 		s0 := or.Args[0]
   35813 		if s0.Op != OpS390XSLWconst {
   35814 			break
   35815 		}
   35816 		j0 := s0.AuxInt
   35817 		x0 := s0.Args[0]
   35818 		if x0.Op != OpS390XMOVBZloadidx {
   35819 			break
   35820 		}
   35821 		i0 := x0.AuxInt
   35822 		if x0.Aux != s {
   35823 			break
   35824 		}
   35825 		_ = x0.Args[2]
   35826 		if idx != x0.Args[0] {
   35827 			break
   35828 		}
   35829 		if p != x0.Args[1] {
   35830 			break
   35831 		}
   35832 		if mem != x0.Args[2] {
   35833 			break
   35834 		}
   35835 		y := or.Args[1]
   35836 		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)) {
   35837 			break
   35838 		}
   35839 		b = mergePoint(b, x0, x1)
   35840 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   35841 		v.reset(OpCopy)
   35842 		v.AddArg(v0)
   35843 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   35844 		v1.AuxInt = j0
   35845 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35846 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35847 		v3.AuxInt = i0
   35848 		v3.Aux = s
   35849 		v3.AddArg(p)
   35850 		v3.AddArg(idx)
   35851 		v3.AddArg(mem)
   35852 		v2.AddArg(v3)
   35853 		v1.AddArg(v2)
   35854 		v0.AddArg(v1)
   35855 		v0.AddArg(y)
   35856 		return true
   35857 	}
   35858 	return false
   35859 }
   35860 func rewriteValueS390X_OpS390XORW_80(v *Value) bool {
   35861 	b := v.Block
   35862 	_ = b
   35863 	typ := &b.Func.Config.Types
   35864 	_ = typ
   35865 	// 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))
   35866 	// 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)
   35867 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   35868 	for {
   35869 		_ = v.Args[1]
   35870 		s1 := v.Args[0]
   35871 		if s1.Op != OpS390XSLWconst {
   35872 			break
   35873 		}
   35874 		j1 := s1.AuxInt
   35875 		x1 := s1.Args[0]
   35876 		if x1.Op != OpS390XMOVBZloadidx {
   35877 			break
   35878 		}
   35879 		i1 := x1.AuxInt
   35880 		s := x1.Aux
   35881 		_ = x1.Args[2]
   35882 		idx := x1.Args[0]
   35883 		p := x1.Args[1]
   35884 		mem := x1.Args[2]
   35885 		or := v.Args[1]
   35886 		if or.Op != OpS390XORW {
   35887 			break
   35888 		}
   35889 		_ = or.Args[1]
   35890 		s0 := or.Args[0]
   35891 		if s0.Op != OpS390XSLWconst {
   35892 			break
   35893 		}
   35894 		j0 := s0.AuxInt
   35895 		x0 := s0.Args[0]
   35896 		if x0.Op != OpS390XMOVBZloadidx {
   35897 			break
   35898 		}
   35899 		i0 := x0.AuxInt
   35900 		if x0.Aux != s {
   35901 			break
   35902 		}
   35903 		_ = x0.Args[2]
   35904 		if idx != x0.Args[0] {
   35905 			break
   35906 		}
   35907 		if p != x0.Args[1] {
   35908 			break
   35909 		}
   35910 		if mem != x0.Args[2] {
   35911 			break
   35912 		}
   35913 		y := or.Args[1]
   35914 		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)) {
   35915 			break
   35916 		}
   35917 		b = mergePoint(b, x0, x1)
   35918 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   35919 		v.reset(OpCopy)
   35920 		v.AddArg(v0)
   35921 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   35922 		v1.AuxInt = j0
   35923 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35924 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35925 		v3.AuxInt = i0
   35926 		v3.Aux = s
   35927 		v3.AddArg(p)
   35928 		v3.AddArg(idx)
   35929 		v3.AddArg(mem)
   35930 		v2.AddArg(v3)
   35931 		v1.AddArg(v2)
   35932 		v0.AddArg(v1)
   35933 		v0.AddArg(y)
   35934 		return true
   35935 	}
   35936 	// 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))))
   35937 	// 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)
   35938 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   35939 	for {
   35940 		_ = v.Args[1]
   35941 		s1 := v.Args[0]
   35942 		if s1.Op != OpS390XSLWconst {
   35943 			break
   35944 		}
   35945 		j1 := s1.AuxInt
   35946 		x1 := s1.Args[0]
   35947 		if x1.Op != OpS390XMOVBZloadidx {
   35948 			break
   35949 		}
   35950 		i1 := x1.AuxInt
   35951 		s := x1.Aux
   35952 		_ = x1.Args[2]
   35953 		p := x1.Args[0]
   35954 		idx := x1.Args[1]
   35955 		mem := x1.Args[2]
   35956 		or := v.Args[1]
   35957 		if or.Op != OpS390XORW {
   35958 			break
   35959 		}
   35960 		_ = or.Args[1]
   35961 		y := or.Args[0]
   35962 		s0 := or.Args[1]
   35963 		if s0.Op != OpS390XSLWconst {
   35964 			break
   35965 		}
   35966 		j0 := s0.AuxInt
   35967 		x0 := s0.Args[0]
   35968 		if x0.Op != OpS390XMOVBZloadidx {
   35969 			break
   35970 		}
   35971 		i0 := x0.AuxInt
   35972 		if x0.Aux != s {
   35973 			break
   35974 		}
   35975 		_ = x0.Args[2]
   35976 		if p != x0.Args[0] {
   35977 			break
   35978 		}
   35979 		if idx != x0.Args[1] {
   35980 			break
   35981 		}
   35982 		if mem != x0.Args[2] {
   35983 			break
   35984 		}
   35985 		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)) {
   35986 			break
   35987 		}
   35988 		b = mergePoint(b, x0, x1)
   35989 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   35990 		v.reset(OpCopy)
   35991 		v.AddArg(v0)
   35992 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   35993 		v1.AuxInt = j0
   35994 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   35995 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   35996 		v3.AuxInt = i0
   35997 		v3.Aux = s
   35998 		v3.AddArg(p)
   35999 		v3.AddArg(idx)
   36000 		v3.AddArg(mem)
   36001 		v2.AddArg(v3)
   36002 		v1.AddArg(v2)
   36003 		v0.AddArg(v1)
   36004 		v0.AddArg(y)
   36005 		return true
   36006 	}
   36007 	// 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))))
   36008 	// 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)
   36009 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36010 	for {
   36011 		_ = v.Args[1]
   36012 		s1 := v.Args[0]
   36013 		if s1.Op != OpS390XSLWconst {
   36014 			break
   36015 		}
   36016 		j1 := s1.AuxInt
   36017 		x1 := s1.Args[0]
   36018 		if x1.Op != OpS390XMOVBZloadidx {
   36019 			break
   36020 		}
   36021 		i1 := x1.AuxInt
   36022 		s := x1.Aux
   36023 		_ = x1.Args[2]
   36024 		idx := x1.Args[0]
   36025 		p := x1.Args[1]
   36026 		mem := x1.Args[2]
   36027 		or := v.Args[1]
   36028 		if or.Op != OpS390XORW {
   36029 			break
   36030 		}
   36031 		_ = or.Args[1]
   36032 		y := or.Args[0]
   36033 		s0 := or.Args[1]
   36034 		if s0.Op != OpS390XSLWconst {
   36035 			break
   36036 		}
   36037 		j0 := s0.AuxInt
   36038 		x0 := s0.Args[0]
   36039 		if x0.Op != OpS390XMOVBZloadidx {
   36040 			break
   36041 		}
   36042 		i0 := x0.AuxInt
   36043 		if x0.Aux != s {
   36044 			break
   36045 		}
   36046 		_ = x0.Args[2]
   36047 		if p != x0.Args[0] {
   36048 			break
   36049 		}
   36050 		if idx != x0.Args[1] {
   36051 			break
   36052 		}
   36053 		if mem != x0.Args[2] {
   36054 			break
   36055 		}
   36056 		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)) {
   36057 			break
   36058 		}
   36059 		b = mergePoint(b, x0, x1)
   36060 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36061 		v.reset(OpCopy)
   36062 		v.AddArg(v0)
   36063 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36064 		v1.AuxInt = j0
   36065 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36066 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36067 		v3.AuxInt = i0
   36068 		v3.Aux = s
   36069 		v3.AddArg(p)
   36070 		v3.AddArg(idx)
   36071 		v3.AddArg(mem)
   36072 		v2.AddArg(v3)
   36073 		v1.AddArg(v2)
   36074 		v0.AddArg(v1)
   36075 		v0.AddArg(y)
   36076 		return true
   36077 	}
   36078 	// 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))))
   36079 	// 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)
   36080 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36081 	for {
   36082 		_ = v.Args[1]
   36083 		s1 := v.Args[0]
   36084 		if s1.Op != OpS390XSLWconst {
   36085 			break
   36086 		}
   36087 		j1 := s1.AuxInt
   36088 		x1 := s1.Args[0]
   36089 		if x1.Op != OpS390XMOVBZloadidx {
   36090 			break
   36091 		}
   36092 		i1 := x1.AuxInt
   36093 		s := x1.Aux
   36094 		_ = x1.Args[2]
   36095 		p := x1.Args[0]
   36096 		idx := x1.Args[1]
   36097 		mem := x1.Args[2]
   36098 		or := v.Args[1]
   36099 		if or.Op != OpS390XORW {
   36100 			break
   36101 		}
   36102 		_ = or.Args[1]
   36103 		y := or.Args[0]
   36104 		s0 := or.Args[1]
   36105 		if s0.Op != OpS390XSLWconst {
   36106 			break
   36107 		}
   36108 		j0 := s0.AuxInt
   36109 		x0 := s0.Args[0]
   36110 		if x0.Op != OpS390XMOVBZloadidx {
   36111 			break
   36112 		}
   36113 		i0 := x0.AuxInt
   36114 		if x0.Aux != s {
   36115 			break
   36116 		}
   36117 		_ = x0.Args[2]
   36118 		if idx != x0.Args[0] {
   36119 			break
   36120 		}
   36121 		if p != x0.Args[1] {
   36122 			break
   36123 		}
   36124 		if mem != x0.Args[2] {
   36125 			break
   36126 		}
   36127 		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)) {
   36128 			break
   36129 		}
   36130 		b = mergePoint(b, x0, x1)
   36131 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36132 		v.reset(OpCopy)
   36133 		v.AddArg(v0)
   36134 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36135 		v1.AuxInt = j0
   36136 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36137 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36138 		v3.AuxInt = i0
   36139 		v3.Aux = s
   36140 		v3.AddArg(p)
   36141 		v3.AddArg(idx)
   36142 		v3.AddArg(mem)
   36143 		v2.AddArg(v3)
   36144 		v1.AddArg(v2)
   36145 		v0.AddArg(v1)
   36146 		v0.AddArg(y)
   36147 		return true
   36148 	}
   36149 	// 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))))
   36150 	// 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)
   36151 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36152 	for {
   36153 		_ = v.Args[1]
   36154 		s1 := v.Args[0]
   36155 		if s1.Op != OpS390XSLWconst {
   36156 			break
   36157 		}
   36158 		j1 := s1.AuxInt
   36159 		x1 := s1.Args[0]
   36160 		if x1.Op != OpS390XMOVBZloadidx {
   36161 			break
   36162 		}
   36163 		i1 := x1.AuxInt
   36164 		s := x1.Aux
   36165 		_ = x1.Args[2]
   36166 		idx := x1.Args[0]
   36167 		p := x1.Args[1]
   36168 		mem := x1.Args[2]
   36169 		or := v.Args[1]
   36170 		if or.Op != OpS390XORW {
   36171 			break
   36172 		}
   36173 		_ = or.Args[1]
   36174 		y := or.Args[0]
   36175 		s0 := or.Args[1]
   36176 		if s0.Op != OpS390XSLWconst {
   36177 			break
   36178 		}
   36179 		j0 := s0.AuxInt
   36180 		x0 := s0.Args[0]
   36181 		if x0.Op != OpS390XMOVBZloadidx {
   36182 			break
   36183 		}
   36184 		i0 := x0.AuxInt
   36185 		if x0.Aux != s {
   36186 			break
   36187 		}
   36188 		_ = x0.Args[2]
   36189 		if idx != x0.Args[0] {
   36190 			break
   36191 		}
   36192 		if p != x0.Args[1] {
   36193 			break
   36194 		}
   36195 		if mem != x0.Args[2] {
   36196 			break
   36197 		}
   36198 		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)) {
   36199 			break
   36200 		}
   36201 		b = mergePoint(b, x0, x1)
   36202 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36203 		v.reset(OpCopy)
   36204 		v.AddArg(v0)
   36205 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36206 		v1.AuxInt = j0
   36207 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36208 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36209 		v3.AuxInt = i0
   36210 		v3.Aux = s
   36211 		v3.AddArg(p)
   36212 		v3.AddArg(idx)
   36213 		v3.AddArg(mem)
   36214 		v2.AddArg(v3)
   36215 		v1.AddArg(v2)
   36216 		v0.AddArg(v1)
   36217 		v0.AddArg(y)
   36218 		return true
   36219 	}
   36220 	// 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)))
   36221 	// 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)
   36222 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36223 	for {
   36224 		_ = v.Args[1]
   36225 		or := v.Args[0]
   36226 		if or.Op != OpS390XORW {
   36227 			break
   36228 		}
   36229 		_ = or.Args[1]
   36230 		s0 := or.Args[0]
   36231 		if s0.Op != OpS390XSLWconst {
   36232 			break
   36233 		}
   36234 		j0 := s0.AuxInt
   36235 		x0 := s0.Args[0]
   36236 		if x0.Op != OpS390XMOVBZloadidx {
   36237 			break
   36238 		}
   36239 		i0 := x0.AuxInt
   36240 		s := x0.Aux
   36241 		_ = x0.Args[2]
   36242 		p := x0.Args[0]
   36243 		idx := x0.Args[1]
   36244 		mem := x0.Args[2]
   36245 		y := or.Args[1]
   36246 		s1 := v.Args[1]
   36247 		if s1.Op != OpS390XSLWconst {
   36248 			break
   36249 		}
   36250 		j1 := s1.AuxInt
   36251 		x1 := s1.Args[0]
   36252 		if x1.Op != OpS390XMOVBZloadidx {
   36253 			break
   36254 		}
   36255 		i1 := x1.AuxInt
   36256 		if x1.Aux != s {
   36257 			break
   36258 		}
   36259 		_ = x1.Args[2]
   36260 		if p != x1.Args[0] {
   36261 			break
   36262 		}
   36263 		if idx != x1.Args[1] {
   36264 			break
   36265 		}
   36266 		if mem != x1.Args[2] {
   36267 			break
   36268 		}
   36269 		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)) {
   36270 			break
   36271 		}
   36272 		b = mergePoint(b, x0, x1)
   36273 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36274 		v.reset(OpCopy)
   36275 		v.AddArg(v0)
   36276 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36277 		v1.AuxInt = j0
   36278 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36279 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36280 		v3.AuxInt = i0
   36281 		v3.Aux = s
   36282 		v3.AddArg(p)
   36283 		v3.AddArg(idx)
   36284 		v3.AddArg(mem)
   36285 		v2.AddArg(v3)
   36286 		v1.AddArg(v2)
   36287 		v0.AddArg(v1)
   36288 		v0.AddArg(y)
   36289 		return true
   36290 	}
   36291 	// 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)))
   36292 	// 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)
   36293 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36294 	for {
   36295 		_ = v.Args[1]
   36296 		or := v.Args[0]
   36297 		if or.Op != OpS390XORW {
   36298 			break
   36299 		}
   36300 		_ = or.Args[1]
   36301 		s0 := or.Args[0]
   36302 		if s0.Op != OpS390XSLWconst {
   36303 			break
   36304 		}
   36305 		j0 := s0.AuxInt
   36306 		x0 := s0.Args[0]
   36307 		if x0.Op != OpS390XMOVBZloadidx {
   36308 			break
   36309 		}
   36310 		i0 := x0.AuxInt
   36311 		s := x0.Aux
   36312 		_ = x0.Args[2]
   36313 		idx := x0.Args[0]
   36314 		p := x0.Args[1]
   36315 		mem := x0.Args[2]
   36316 		y := or.Args[1]
   36317 		s1 := v.Args[1]
   36318 		if s1.Op != OpS390XSLWconst {
   36319 			break
   36320 		}
   36321 		j1 := s1.AuxInt
   36322 		x1 := s1.Args[0]
   36323 		if x1.Op != OpS390XMOVBZloadidx {
   36324 			break
   36325 		}
   36326 		i1 := x1.AuxInt
   36327 		if x1.Aux != s {
   36328 			break
   36329 		}
   36330 		_ = x1.Args[2]
   36331 		if p != x1.Args[0] {
   36332 			break
   36333 		}
   36334 		if idx != x1.Args[1] {
   36335 			break
   36336 		}
   36337 		if mem != x1.Args[2] {
   36338 			break
   36339 		}
   36340 		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)) {
   36341 			break
   36342 		}
   36343 		b = mergePoint(b, x0, x1)
   36344 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36345 		v.reset(OpCopy)
   36346 		v.AddArg(v0)
   36347 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36348 		v1.AuxInt = j0
   36349 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36350 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36351 		v3.AuxInt = i0
   36352 		v3.Aux = s
   36353 		v3.AddArg(p)
   36354 		v3.AddArg(idx)
   36355 		v3.AddArg(mem)
   36356 		v2.AddArg(v3)
   36357 		v1.AddArg(v2)
   36358 		v0.AddArg(v1)
   36359 		v0.AddArg(y)
   36360 		return true
   36361 	}
   36362 	// 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)))
   36363 	// 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)
   36364 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36365 	for {
   36366 		_ = v.Args[1]
   36367 		or := v.Args[0]
   36368 		if or.Op != OpS390XORW {
   36369 			break
   36370 		}
   36371 		_ = or.Args[1]
   36372 		y := or.Args[0]
   36373 		s0 := or.Args[1]
   36374 		if s0.Op != OpS390XSLWconst {
   36375 			break
   36376 		}
   36377 		j0 := s0.AuxInt
   36378 		x0 := s0.Args[0]
   36379 		if x0.Op != OpS390XMOVBZloadidx {
   36380 			break
   36381 		}
   36382 		i0 := x0.AuxInt
   36383 		s := x0.Aux
   36384 		_ = x0.Args[2]
   36385 		p := x0.Args[0]
   36386 		idx := x0.Args[1]
   36387 		mem := x0.Args[2]
   36388 		s1 := v.Args[1]
   36389 		if s1.Op != OpS390XSLWconst {
   36390 			break
   36391 		}
   36392 		j1 := s1.AuxInt
   36393 		x1 := s1.Args[0]
   36394 		if x1.Op != OpS390XMOVBZloadidx {
   36395 			break
   36396 		}
   36397 		i1 := x1.AuxInt
   36398 		if x1.Aux != s {
   36399 			break
   36400 		}
   36401 		_ = x1.Args[2]
   36402 		if p != x1.Args[0] {
   36403 			break
   36404 		}
   36405 		if idx != x1.Args[1] {
   36406 			break
   36407 		}
   36408 		if mem != x1.Args[2] {
   36409 			break
   36410 		}
   36411 		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)) {
   36412 			break
   36413 		}
   36414 		b = mergePoint(b, x0, x1)
   36415 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36416 		v.reset(OpCopy)
   36417 		v.AddArg(v0)
   36418 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36419 		v1.AuxInt = j0
   36420 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36421 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36422 		v3.AuxInt = i0
   36423 		v3.Aux = s
   36424 		v3.AddArg(p)
   36425 		v3.AddArg(idx)
   36426 		v3.AddArg(mem)
   36427 		v2.AddArg(v3)
   36428 		v1.AddArg(v2)
   36429 		v0.AddArg(v1)
   36430 		v0.AddArg(y)
   36431 		return true
   36432 	}
   36433 	// 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)))
   36434 	// 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)
   36435 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36436 	for {
   36437 		_ = v.Args[1]
   36438 		or := v.Args[0]
   36439 		if or.Op != OpS390XORW {
   36440 			break
   36441 		}
   36442 		_ = or.Args[1]
   36443 		y := or.Args[0]
   36444 		s0 := or.Args[1]
   36445 		if s0.Op != OpS390XSLWconst {
   36446 			break
   36447 		}
   36448 		j0 := s0.AuxInt
   36449 		x0 := s0.Args[0]
   36450 		if x0.Op != OpS390XMOVBZloadidx {
   36451 			break
   36452 		}
   36453 		i0 := x0.AuxInt
   36454 		s := x0.Aux
   36455 		_ = x0.Args[2]
   36456 		idx := x0.Args[0]
   36457 		p := x0.Args[1]
   36458 		mem := x0.Args[2]
   36459 		s1 := v.Args[1]
   36460 		if s1.Op != OpS390XSLWconst {
   36461 			break
   36462 		}
   36463 		j1 := s1.AuxInt
   36464 		x1 := s1.Args[0]
   36465 		if x1.Op != OpS390XMOVBZloadidx {
   36466 			break
   36467 		}
   36468 		i1 := x1.AuxInt
   36469 		if x1.Aux != s {
   36470 			break
   36471 		}
   36472 		_ = x1.Args[2]
   36473 		if p != x1.Args[0] {
   36474 			break
   36475 		}
   36476 		if idx != x1.Args[1] {
   36477 			break
   36478 		}
   36479 		if mem != x1.Args[2] {
   36480 			break
   36481 		}
   36482 		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)) {
   36483 			break
   36484 		}
   36485 		b = mergePoint(b, x0, x1)
   36486 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36487 		v.reset(OpCopy)
   36488 		v.AddArg(v0)
   36489 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36490 		v1.AuxInt = j0
   36491 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36492 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36493 		v3.AuxInt = i0
   36494 		v3.Aux = s
   36495 		v3.AddArg(p)
   36496 		v3.AddArg(idx)
   36497 		v3.AddArg(mem)
   36498 		v2.AddArg(v3)
   36499 		v1.AddArg(v2)
   36500 		v0.AddArg(v1)
   36501 		v0.AddArg(y)
   36502 		return true
   36503 	}
   36504 	// 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)))
   36505 	// 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)
   36506 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36507 	for {
   36508 		_ = v.Args[1]
   36509 		or := v.Args[0]
   36510 		if or.Op != OpS390XORW {
   36511 			break
   36512 		}
   36513 		_ = or.Args[1]
   36514 		s0 := or.Args[0]
   36515 		if s0.Op != OpS390XSLWconst {
   36516 			break
   36517 		}
   36518 		j0 := s0.AuxInt
   36519 		x0 := s0.Args[0]
   36520 		if x0.Op != OpS390XMOVBZloadidx {
   36521 			break
   36522 		}
   36523 		i0 := x0.AuxInt
   36524 		s := x0.Aux
   36525 		_ = x0.Args[2]
   36526 		p := x0.Args[0]
   36527 		idx := x0.Args[1]
   36528 		mem := x0.Args[2]
   36529 		y := or.Args[1]
   36530 		s1 := v.Args[1]
   36531 		if s1.Op != OpS390XSLWconst {
   36532 			break
   36533 		}
   36534 		j1 := s1.AuxInt
   36535 		x1 := s1.Args[0]
   36536 		if x1.Op != OpS390XMOVBZloadidx {
   36537 			break
   36538 		}
   36539 		i1 := x1.AuxInt
   36540 		if x1.Aux != s {
   36541 			break
   36542 		}
   36543 		_ = x1.Args[2]
   36544 		if idx != x1.Args[0] {
   36545 			break
   36546 		}
   36547 		if p != x1.Args[1] {
   36548 			break
   36549 		}
   36550 		if mem != x1.Args[2] {
   36551 			break
   36552 		}
   36553 		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)) {
   36554 			break
   36555 		}
   36556 		b = mergePoint(b, x0, x1)
   36557 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36558 		v.reset(OpCopy)
   36559 		v.AddArg(v0)
   36560 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36561 		v1.AuxInt = j0
   36562 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36563 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36564 		v3.AuxInt = i0
   36565 		v3.Aux = s
   36566 		v3.AddArg(p)
   36567 		v3.AddArg(idx)
   36568 		v3.AddArg(mem)
   36569 		v2.AddArg(v3)
   36570 		v1.AddArg(v2)
   36571 		v0.AddArg(v1)
   36572 		v0.AddArg(y)
   36573 		return true
   36574 	}
   36575 	return false
   36576 }
   36577 func rewriteValueS390X_OpS390XORW_90(v *Value) bool {
   36578 	b := v.Block
   36579 	_ = b
   36580 	typ := &b.Func.Config.Types
   36581 	_ = typ
   36582 	// 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)))
   36583 	// 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)
   36584 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36585 	for {
   36586 		_ = v.Args[1]
   36587 		or := v.Args[0]
   36588 		if or.Op != OpS390XORW {
   36589 			break
   36590 		}
   36591 		_ = or.Args[1]
   36592 		s0 := or.Args[0]
   36593 		if s0.Op != OpS390XSLWconst {
   36594 			break
   36595 		}
   36596 		j0 := s0.AuxInt
   36597 		x0 := s0.Args[0]
   36598 		if x0.Op != OpS390XMOVBZloadidx {
   36599 			break
   36600 		}
   36601 		i0 := x0.AuxInt
   36602 		s := x0.Aux
   36603 		_ = x0.Args[2]
   36604 		idx := x0.Args[0]
   36605 		p := x0.Args[1]
   36606 		mem := x0.Args[2]
   36607 		y := or.Args[1]
   36608 		s1 := v.Args[1]
   36609 		if s1.Op != OpS390XSLWconst {
   36610 			break
   36611 		}
   36612 		j1 := s1.AuxInt
   36613 		x1 := s1.Args[0]
   36614 		if x1.Op != OpS390XMOVBZloadidx {
   36615 			break
   36616 		}
   36617 		i1 := x1.AuxInt
   36618 		if x1.Aux != s {
   36619 			break
   36620 		}
   36621 		_ = x1.Args[2]
   36622 		if idx != x1.Args[0] {
   36623 			break
   36624 		}
   36625 		if p != x1.Args[1] {
   36626 			break
   36627 		}
   36628 		if mem != x1.Args[2] {
   36629 			break
   36630 		}
   36631 		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)) {
   36632 			break
   36633 		}
   36634 		b = mergePoint(b, x0, x1)
   36635 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36636 		v.reset(OpCopy)
   36637 		v.AddArg(v0)
   36638 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36639 		v1.AuxInt = j0
   36640 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36641 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36642 		v3.AuxInt = i0
   36643 		v3.Aux = s
   36644 		v3.AddArg(p)
   36645 		v3.AddArg(idx)
   36646 		v3.AddArg(mem)
   36647 		v2.AddArg(v3)
   36648 		v1.AddArg(v2)
   36649 		v0.AddArg(v1)
   36650 		v0.AddArg(y)
   36651 		return true
   36652 	}
   36653 	// 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)))
   36654 	// 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)
   36655 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36656 	for {
   36657 		_ = v.Args[1]
   36658 		or := v.Args[0]
   36659 		if or.Op != OpS390XORW {
   36660 			break
   36661 		}
   36662 		_ = or.Args[1]
   36663 		y := or.Args[0]
   36664 		s0 := or.Args[1]
   36665 		if s0.Op != OpS390XSLWconst {
   36666 			break
   36667 		}
   36668 		j0 := s0.AuxInt
   36669 		x0 := s0.Args[0]
   36670 		if x0.Op != OpS390XMOVBZloadidx {
   36671 			break
   36672 		}
   36673 		i0 := x0.AuxInt
   36674 		s := x0.Aux
   36675 		_ = x0.Args[2]
   36676 		p := x0.Args[0]
   36677 		idx := x0.Args[1]
   36678 		mem := x0.Args[2]
   36679 		s1 := v.Args[1]
   36680 		if s1.Op != OpS390XSLWconst {
   36681 			break
   36682 		}
   36683 		j1 := s1.AuxInt
   36684 		x1 := s1.Args[0]
   36685 		if x1.Op != OpS390XMOVBZloadidx {
   36686 			break
   36687 		}
   36688 		i1 := x1.AuxInt
   36689 		if x1.Aux != s {
   36690 			break
   36691 		}
   36692 		_ = x1.Args[2]
   36693 		if idx != x1.Args[0] {
   36694 			break
   36695 		}
   36696 		if p != x1.Args[1] {
   36697 			break
   36698 		}
   36699 		if mem != x1.Args[2] {
   36700 			break
   36701 		}
   36702 		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)) {
   36703 			break
   36704 		}
   36705 		b = mergePoint(b, x0, x1)
   36706 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36707 		v.reset(OpCopy)
   36708 		v.AddArg(v0)
   36709 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36710 		v1.AuxInt = j0
   36711 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36712 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36713 		v3.AuxInt = i0
   36714 		v3.Aux = s
   36715 		v3.AddArg(p)
   36716 		v3.AddArg(idx)
   36717 		v3.AddArg(mem)
   36718 		v2.AddArg(v3)
   36719 		v1.AddArg(v2)
   36720 		v0.AddArg(v1)
   36721 		v0.AddArg(y)
   36722 		return true
   36723 	}
   36724 	// 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)))
   36725 	// 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)
   36726 	// result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
   36727 	for {
   36728 		_ = v.Args[1]
   36729 		or := v.Args[0]
   36730 		if or.Op != OpS390XORW {
   36731 			break
   36732 		}
   36733 		_ = or.Args[1]
   36734 		y := or.Args[0]
   36735 		s0 := or.Args[1]
   36736 		if s0.Op != OpS390XSLWconst {
   36737 			break
   36738 		}
   36739 		j0 := s0.AuxInt
   36740 		x0 := s0.Args[0]
   36741 		if x0.Op != OpS390XMOVBZloadidx {
   36742 			break
   36743 		}
   36744 		i0 := x0.AuxInt
   36745 		s := x0.Aux
   36746 		_ = x0.Args[2]
   36747 		idx := x0.Args[0]
   36748 		p := x0.Args[1]
   36749 		mem := x0.Args[2]
   36750 		s1 := v.Args[1]
   36751 		if s1.Op != OpS390XSLWconst {
   36752 			break
   36753 		}
   36754 		j1 := s1.AuxInt
   36755 		x1 := s1.Args[0]
   36756 		if x1.Op != OpS390XMOVBZloadidx {
   36757 			break
   36758 		}
   36759 		i1 := x1.AuxInt
   36760 		if x1.Aux != s {
   36761 			break
   36762 		}
   36763 		_ = x1.Args[2]
   36764 		if idx != x1.Args[0] {
   36765 			break
   36766 		}
   36767 		if p != x1.Args[1] {
   36768 			break
   36769 		}
   36770 		if mem != x1.Args[2] {
   36771 			break
   36772 		}
   36773 		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)) {
   36774 			break
   36775 		}
   36776 		b = mergePoint(b, x0, x1)
   36777 		v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type)
   36778 		v.reset(OpCopy)
   36779 		v.AddArg(v0)
   36780 		v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type)
   36781 		v1.AuxInt = j0
   36782 		v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
   36783 		v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16)
   36784 		v3.AuxInt = i0
   36785 		v3.Aux = s
   36786 		v3.AddArg(p)
   36787 		v3.AddArg(idx)
   36788 		v3.AddArg(mem)
   36789 		v2.AddArg(v3)
   36790 		v1.AddArg(v2)
   36791 		v0.AddArg(v1)
   36792 		v0.AddArg(y)
   36793 		return true
   36794 	}
   36795 	return false
   36796 }
   36797 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool {
   36798 	// match: (ORWconst [c] x)
   36799 	// cond: int32(c)==0
   36800 	// result: x
   36801 	for {
   36802 		c := v.AuxInt
   36803 		x := v.Args[0]
   36804 		if !(int32(c) == 0) {
   36805 			break
   36806 		}
   36807 		v.reset(OpCopy)
   36808 		v.Type = x.Type
   36809 		v.AddArg(x)
   36810 		return true
   36811 	}
   36812 	// match: (ORWconst [c] _)
   36813 	// cond: int32(c)==-1
   36814 	// result: (MOVDconst [-1])
   36815 	for {
   36816 		c := v.AuxInt
   36817 		if !(int32(c) == -1) {
   36818 			break
   36819 		}
   36820 		v.reset(OpS390XMOVDconst)
   36821 		v.AuxInt = -1
   36822 		return true
   36823 	}
   36824 	// match: (ORWconst [c] (MOVDconst [d]))
   36825 	// cond:
   36826 	// result: (MOVDconst [c|d])
   36827 	for {
   36828 		c := v.AuxInt
   36829 		v_0 := v.Args[0]
   36830 		if v_0.Op != OpS390XMOVDconst {
   36831 			break
   36832 		}
   36833 		d := v_0.AuxInt
   36834 		v.reset(OpS390XMOVDconst)
   36835 		v.AuxInt = c | d
   36836 		return true
   36837 	}
   36838 	return false
   36839 }
   36840 func rewriteValueS390X_OpS390XORWload_0(v *Value) bool {
   36841 	// match: (ORWload [off1] {sym} x (ADDconst [off2] ptr) mem)
   36842 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   36843 	// result: (ORWload   [off1+off2] {sym} x ptr mem)
   36844 	for {
   36845 		off1 := v.AuxInt
   36846 		sym := v.Aux
   36847 		_ = v.Args[2]
   36848 		x := v.Args[0]
   36849 		v_1 := v.Args[1]
   36850 		if v_1.Op != OpS390XADDconst {
   36851 			break
   36852 		}
   36853 		off2 := v_1.AuxInt
   36854 		ptr := v_1.Args[0]
   36855 		mem := v.Args[2]
   36856 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   36857 			break
   36858 		}
   36859 		v.reset(OpS390XORWload)
   36860 		v.AuxInt = off1 + off2
   36861 		v.Aux = sym
   36862 		v.AddArg(x)
   36863 		v.AddArg(ptr)
   36864 		v.AddArg(mem)
   36865 		return true
   36866 	}
   36867 	// match: (ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   36868 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   36869 	// result: (ORWload   [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   36870 	for {
   36871 		o1 := v.AuxInt
   36872 		s1 := v.Aux
   36873 		_ = v.Args[2]
   36874 		x := v.Args[0]
   36875 		v_1 := v.Args[1]
   36876 		if v_1.Op != OpS390XMOVDaddr {
   36877 			break
   36878 		}
   36879 		o2 := v_1.AuxInt
   36880 		s2 := v_1.Aux
   36881 		ptr := v_1.Args[0]
   36882 		mem := v.Args[2]
   36883 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   36884 			break
   36885 		}
   36886 		v.reset(OpS390XORWload)
   36887 		v.AuxInt = o1 + o2
   36888 		v.Aux = mergeSym(s1, s2)
   36889 		v.AddArg(x)
   36890 		v.AddArg(ptr)
   36891 		v.AddArg(mem)
   36892 		return true
   36893 	}
   36894 	return false
   36895 }
   36896 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool {
   36897 	// match: (ORconst [0] x)
   36898 	// cond:
   36899 	// result: x
   36900 	for {
   36901 		if v.AuxInt != 0 {
   36902 			break
   36903 		}
   36904 		x := v.Args[0]
   36905 		v.reset(OpCopy)
   36906 		v.Type = x.Type
   36907 		v.AddArg(x)
   36908 		return true
   36909 	}
   36910 	// match: (ORconst [-1] _)
   36911 	// cond:
   36912 	// result: (MOVDconst [-1])
   36913 	for {
   36914 		if v.AuxInt != -1 {
   36915 			break
   36916 		}
   36917 		v.reset(OpS390XMOVDconst)
   36918 		v.AuxInt = -1
   36919 		return true
   36920 	}
   36921 	// match: (ORconst [c] (MOVDconst [d]))
   36922 	// cond:
   36923 	// result: (MOVDconst [c|d])
   36924 	for {
   36925 		c := v.AuxInt
   36926 		v_0 := v.Args[0]
   36927 		if v_0.Op != OpS390XMOVDconst {
   36928 			break
   36929 		}
   36930 		d := v_0.AuxInt
   36931 		v.reset(OpS390XMOVDconst)
   36932 		v.AuxInt = c | d
   36933 		return true
   36934 	}
   36935 	return false
   36936 }
   36937 func rewriteValueS390X_OpS390XORload_0(v *Value) bool {
   36938 	b := v.Block
   36939 	_ = b
   36940 	// match: (ORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
   36941 	// cond: isSamePtr(ptr1, ptr2)
   36942 	// result: (OR    x (LGDR <t> y))
   36943 	for {
   36944 		t := v.Type
   36945 		off := v.AuxInt
   36946 		sym := v.Aux
   36947 		_ = v.Args[2]
   36948 		x := v.Args[0]
   36949 		ptr1 := v.Args[1]
   36950 		v_2 := v.Args[2]
   36951 		if v_2.Op != OpS390XFMOVDstore {
   36952 			break
   36953 		}
   36954 		if v_2.AuxInt != off {
   36955 			break
   36956 		}
   36957 		if v_2.Aux != sym {
   36958 			break
   36959 		}
   36960 		_ = v_2.Args[2]
   36961 		ptr2 := v_2.Args[0]
   36962 		y := v_2.Args[1]
   36963 		if !(isSamePtr(ptr1, ptr2)) {
   36964 			break
   36965 		}
   36966 		v.reset(OpS390XOR)
   36967 		v.AddArg(x)
   36968 		v0 := b.NewValue0(v.Pos, OpS390XLGDR, t)
   36969 		v0.AddArg(y)
   36970 		v.AddArg(v0)
   36971 		return true
   36972 	}
   36973 	// match: (ORload [off1] {sym} x (ADDconst [off2] ptr) mem)
   36974 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   36975 	// result: (ORload    [off1+off2] {sym} x ptr mem)
   36976 	for {
   36977 		off1 := v.AuxInt
   36978 		sym := v.Aux
   36979 		_ = v.Args[2]
   36980 		x := v.Args[0]
   36981 		v_1 := v.Args[1]
   36982 		if v_1.Op != OpS390XADDconst {
   36983 			break
   36984 		}
   36985 		off2 := v_1.AuxInt
   36986 		ptr := v_1.Args[0]
   36987 		mem := v.Args[2]
   36988 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   36989 			break
   36990 		}
   36991 		v.reset(OpS390XORload)
   36992 		v.AuxInt = off1 + off2
   36993 		v.Aux = sym
   36994 		v.AddArg(x)
   36995 		v.AddArg(ptr)
   36996 		v.AddArg(mem)
   36997 		return true
   36998 	}
   36999 	// match: (ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   37000 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   37001 	// result: (ORload    [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   37002 	for {
   37003 		o1 := v.AuxInt
   37004 		s1 := v.Aux
   37005 		_ = v.Args[2]
   37006 		x := v.Args[0]
   37007 		v_1 := v.Args[1]
   37008 		if v_1.Op != OpS390XMOVDaddr {
   37009 			break
   37010 		}
   37011 		o2 := v_1.AuxInt
   37012 		s2 := v_1.Aux
   37013 		ptr := v_1.Args[0]
   37014 		mem := v.Args[2]
   37015 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   37016 			break
   37017 		}
   37018 		v.reset(OpS390XORload)
   37019 		v.AuxInt = o1 + o2
   37020 		v.Aux = mergeSym(s1, s2)
   37021 		v.AddArg(x)
   37022 		v.AddArg(ptr)
   37023 		v.AddArg(mem)
   37024 		return true
   37025 	}
   37026 	return false
   37027 }
   37028 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool {
   37029 	// match: (SLD x (MOVDconst [c]))
   37030 	// cond:
   37031 	// result: (SLDconst [c&63] x)
   37032 	for {
   37033 		_ = v.Args[1]
   37034 		x := v.Args[0]
   37035 		v_1 := v.Args[1]
   37036 		if v_1.Op != OpS390XMOVDconst {
   37037 			break
   37038 		}
   37039 		c := v_1.AuxInt
   37040 		v.reset(OpS390XSLDconst)
   37041 		v.AuxInt = c & 63
   37042 		v.AddArg(x)
   37043 		return true
   37044 	}
   37045 	// match: (SLD x (ANDconst [63] y))
   37046 	// cond:
   37047 	// result: (SLD x y)
   37048 	for {
   37049 		_ = v.Args[1]
   37050 		x := v.Args[0]
   37051 		v_1 := v.Args[1]
   37052 		if v_1.Op != OpS390XANDconst {
   37053 			break
   37054 		}
   37055 		if v_1.AuxInt != 63 {
   37056 			break
   37057 		}
   37058 		y := v_1.Args[0]
   37059 		v.reset(OpS390XSLD)
   37060 		v.AddArg(x)
   37061 		v.AddArg(y)
   37062 		return true
   37063 	}
   37064 	return false
   37065 }
   37066 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool {
   37067 	// match: (SLW x (MOVDconst [c]))
   37068 	// cond:
   37069 	// result: (SLWconst [c&63] x)
   37070 	for {
   37071 		_ = v.Args[1]
   37072 		x := v.Args[0]
   37073 		v_1 := v.Args[1]
   37074 		if v_1.Op != OpS390XMOVDconst {
   37075 			break
   37076 		}
   37077 		c := v_1.AuxInt
   37078 		v.reset(OpS390XSLWconst)
   37079 		v.AuxInt = c & 63
   37080 		v.AddArg(x)
   37081 		return true
   37082 	}
   37083 	// match: (SLW x (ANDWconst [63] y))
   37084 	// cond:
   37085 	// result: (SLW x y)
   37086 	for {
   37087 		_ = v.Args[1]
   37088 		x := v.Args[0]
   37089 		v_1 := v.Args[1]
   37090 		if v_1.Op != OpS390XANDWconst {
   37091 			break
   37092 		}
   37093 		if v_1.AuxInt != 63 {
   37094 			break
   37095 		}
   37096 		y := v_1.Args[0]
   37097 		v.reset(OpS390XSLW)
   37098 		v.AddArg(x)
   37099 		v.AddArg(y)
   37100 		return true
   37101 	}
   37102 	return false
   37103 }
   37104 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool {
   37105 	// match: (SRAD x (MOVDconst [c]))
   37106 	// cond:
   37107 	// result: (SRADconst [c&63] x)
   37108 	for {
   37109 		_ = v.Args[1]
   37110 		x := v.Args[0]
   37111 		v_1 := v.Args[1]
   37112 		if v_1.Op != OpS390XMOVDconst {
   37113 			break
   37114 		}
   37115 		c := v_1.AuxInt
   37116 		v.reset(OpS390XSRADconst)
   37117 		v.AuxInt = c & 63
   37118 		v.AddArg(x)
   37119 		return true
   37120 	}
   37121 	// match: (SRAD x (ANDconst [63] y))
   37122 	// cond:
   37123 	// result: (SRAD x y)
   37124 	for {
   37125 		_ = v.Args[1]
   37126 		x := v.Args[0]
   37127 		v_1 := v.Args[1]
   37128 		if v_1.Op != OpS390XANDconst {
   37129 			break
   37130 		}
   37131 		if v_1.AuxInt != 63 {
   37132 			break
   37133 		}
   37134 		y := v_1.Args[0]
   37135 		v.reset(OpS390XSRAD)
   37136 		v.AddArg(x)
   37137 		v.AddArg(y)
   37138 		return true
   37139 	}
   37140 	return false
   37141 }
   37142 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool {
   37143 	// match: (SRADconst [c] (MOVDconst [d]))
   37144 	// cond:
   37145 	// result: (MOVDconst [d>>uint64(c)])
   37146 	for {
   37147 		c := v.AuxInt
   37148 		v_0 := v.Args[0]
   37149 		if v_0.Op != OpS390XMOVDconst {
   37150 			break
   37151 		}
   37152 		d := v_0.AuxInt
   37153 		v.reset(OpS390XMOVDconst)
   37154 		v.AuxInt = d >> uint64(c)
   37155 		return true
   37156 	}
   37157 	return false
   37158 }
   37159 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool {
   37160 	// match: (SRAW x (MOVDconst [c]))
   37161 	// cond:
   37162 	// result: (SRAWconst [c&63] x)
   37163 	for {
   37164 		_ = v.Args[1]
   37165 		x := v.Args[0]
   37166 		v_1 := v.Args[1]
   37167 		if v_1.Op != OpS390XMOVDconst {
   37168 			break
   37169 		}
   37170 		c := v_1.AuxInt
   37171 		v.reset(OpS390XSRAWconst)
   37172 		v.AuxInt = c & 63
   37173 		v.AddArg(x)
   37174 		return true
   37175 	}
   37176 	// match: (SRAW x (ANDWconst [63] y))
   37177 	// cond:
   37178 	// result: (SRAW x y)
   37179 	for {
   37180 		_ = v.Args[1]
   37181 		x := v.Args[0]
   37182 		v_1 := v.Args[1]
   37183 		if v_1.Op != OpS390XANDWconst {
   37184 			break
   37185 		}
   37186 		if v_1.AuxInt != 63 {
   37187 			break
   37188 		}
   37189 		y := v_1.Args[0]
   37190 		v.reset(OpS390XSRAW)
   37191 		v.AddArg(x)
   37192 		v.AddArg(y)
   37193 		return true
   37194 	}
   37195 	return false
   37196 }
   37197 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool {
   37198 	// match: (SRAWconst [c] (MOVDconst [d]))
   37199 	// cond:
   37200 	// result: (MOVDconst [int64(int32(d))>>uint64(c)])
   37201 	for {
   37202 		c := v.AuxInt
   37203 		v_0 := v.Args[0]
   37204 		if v_0.Op != OpS390XMOVDconst {
   37205 			break
   37206 		}
   37207 		d := v_0.AuxInt
   37208 		v.reset(OpS390XMOVDconst)
   37209 		v.AuxInt = int64(int32(d)) >> uint64(c)
   37210 		return true
   37211 	}
   37212 	return false
   37213 }
   37214 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool {
   37215 	// match: (SRD x (MOVDconst [c]))
   37216 	// cond:
   37217 	// result: (SRDconst [c&63] x)
   37218 	for {
   37219 		_ = v.Args[1]
   37220 		x := v.Args[0]
   37221 		v_1 := v.Args[1]
   37222 		if v_1.Op != OpS390XMOVDconst {
   37223 			break
   37224 		}
   37225 		c := v_1.AuxInt
   37226 		v.reset(OpS390XSRDconst)
   37227 		v.AuxInt = c & 63
   37228 		v.AddArg(x)
   37229 		return true
   37230 	}
   37231 	// match: (SRD x (ANDconst [63] y))
   37232 	// cond:
   37233 	// result: (SRD x y)
   37234 	for {
   37235 		_ = v.Args[1]
   37236 		x := v.Args[0]
   37237 		v_1 := v.Args[1]
   37238 		if v_1.Op != OpS390XANDconst {
   37239 			break
   37240 		}
   37241 		if v_1.AuxInt != 63 {
   37242 			break
   37243 		}
   37244 		y := v_1.Args[0]
   37245 		v.reset(OpS390XSRD)
   37246 		v.AddArg(x)
   37247 		v.AddArg(y)
   37248 		return true
   37249 	}
   37250 	return false
   37251 }
   37252 func rewriteValueS390X_OpS390XSRDconst_0(v *Value) bool {
   37253 	b := v.Block
   37254 	_ = b
   37255 	// match: (SRDconst [1] (SLDconst [1] (LGDR <t> x)))
   37256 	// cond:
   37257 	// result: (LGDR <t> (LPDFR <x.Type> x))
   37258 	for {
   37259 		if v.AuxInt != 1 {
   37260 			break
   37261 		}
   37262 		v_0 := v.Args[0]
   37263 		if v_0.Op != OpS390XSLDconst {
   37264 			break
   37265 		}
   37266 		if v_0.AuxInt != 1 {
   37267 			break
   37268 		}
   37269 		v_0_0 := v_0.Args[0]
   37270 		if v_0_0.Op != OpS390XLGDR {
   37271 			break
   37272 		}
   37273 		t := v_0_0.Type
   37274 		x := v_0_0.Args[0]
   37275 		v.reset(OpS390XLGDR)
   37276 		v.Type = t
   37277 		v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type)
   37278 		v0.AddArg(x)
   37279 		v.AddArg(v0)
   37280 		return true
   37281 	}
   37282 	return false
   37283 }
   37284 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool {
   37285 	// match: (SRW x (MOVDconst [c]))
   37286 	// cond:
   37287 	// result: (SRWconst [c&63] x)
   37288 	for {
   37289 		_ = v.Args[1]
   37290 		x := v.Args[0]
   37291 		v_1 := v.Args[1]
   37292 		if v_1.Op != OpS390XMOVDconst {
   37293 			break
   37294 		}
   37295 		c := v_1.AuxInt
   37296 		v.reset(OpS390XSRWconst)
   37297 		v.AuxInt = c & 63
   37298 		v.AddArg(x)
   37299 		return true
   37300 	}
   37301 	// match: (SRW x (ANDWconst [63] y))
   37302 	// cond:
   37303 	// result: (SRW x y)
   37304 	for {
   37305 		_ = v.Args[1]
   37306 		x := v.Args[0]
   37307 		v_1 := v.Args[1]
   37308 		if v_1.Op != OpS390XANDWconst {
   37309 			break
   37310 		}
   37311 		if v_1.AuxInt != 63 {
   37312 			break
   37313 		}
   37314 		y := v_1.Args[0]
   37315 		v.reset(OpS390XSRW)
   37316 		v.AddArg(x)
   37317 		v.AddArg(y)
   37318 		return true
   37319 	}
   37320 	return false
   37321 }
   37322 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool {
   37323 	// match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem))
   37324 	// cond: x.Uses == 1   && is20Bit(i-8)   && clobber(x)
   37325 	// result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem)
   37326 	for {
   37327 		i := v.AuxInt
   37328 		s := v.Aux
   37329 		_ = v.Args[3]
   37330 		p := v.Args[0]
   37331 		w2 := v.Args[1]
   37332 		w3 := v.Args[2]
   37333 		x := v.Args[3]
   37334 		if x.Op != OpS390XSTM2 {
   37335 			break
   37336 		}
   37337 		if x.AuxInt != i-8 {
   37338 			break
   37339 		}
   37340 		if x.Aux != s {
   37341 			break
   37342 		}
   37343 		_ = x.Args[3]
   37344 		if p != x.Args[0] {
   37345 			break
   37346 		}
   37347 		w0 := x.Args[1]
   37348 		w1 := x.Args[2]
   37349 		mem := x.Args[3]
   37350 		if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) {
   37351 			break
   37352 		}
   37353 		v.reset(OpS390XSTM4)
   37354 		v.AuxInt = i - 8
   37355 		v.Aux = s
   37356 		v.AddArg(p)
   37357 		v.AddArg(w0)
   37358 		v.AddArg(w1)
   37359 		v.AddArg(w2)
   37360 		v.AddArg(w3)
   37361 		v.AddArg(mem)
   37362 		return true
   37363 	}
   37364 	// match: (STM2 [i] {s} p (SRDconst [32] x) x mem)
   37365 	// cond:
   37366 	// result: (MOVDstore [i] {s} p x mem)
   37367 	for {
   37368 		i := v.AuxInt
   37369 		s := v.Aux
   37370 		_ = v.Args[3]
   37371 		p := v.Args[0]
   37372 		v_1 := v.Args[1]
   37373 		if v_1.Op != OpS390XSRDconst {
   37374 			break
   37375 		}
   37376 		if v_1.AuxInt != 32 {
   37377 			break
   37378 		}
   37379 		x := v_1.Args[0]
   37380 		if x != v.Args[2] {
   37381 			break
   37382 		}
   37383 		mem := v.Args[3]
   37384 		v.reset(OpS390XMOVDstore)
   37385 		v.AuxInt = i
   37386 		v.Aux = s
   37387 		v.AddArg(p)
   37388 		v.AddArg(x)
   37389 		v.AddArg(mem)
   37390 		return true
   37391 	}
   37392 	return false
   37393 }
   37394 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool {
   37395 	// match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem))
   37396 	// cond: x.Uses == 1   && is20Bit(i-16)   && clobber(x)
   37397 	// result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem)
   37398 	for {
   37399 		i := v.AuxInt
   37400 		s := v.Aux
   37401 		_ = v.Args[3]
   37402 		p := v.Args[0]
   37403 		w2 := v.Args[1]
   37404 		w3 := v.Args[2]
   37405 		x := v.Args[3]
   37406 		if x.Op != OpS390XSTMG2 {
   37407 			break
   37408 		}
   37409 		if x.AuxInt != i-16 {
   37410 			break
   37411 		}
   37412 		if x.Aux != s {
   37413 			break
   37414 		}
   37415 		_ = x.Args[3]
   37416 		if p != x.Args[0] {
   37417 			break
   37418 		}
   37419 		w0 := x.Args[1]
   37420 		w1 := x.Args[2]
   37421 		mem := x.Args[3]
   37422 		if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) {
   37423 			break
   37424 		}
   37425 		v.reset(OpS390XSTMG4)
   37426 		v.AuxInt = i - 16
   37427 		v.Aux = s
   37428 		v.AddArg(p)
   37429 		v.AddArg(w0)
   37430 		v.AddArg(w1)
   37431 		v.AddArg(w2)
   37432 		v.AddArg(w3)
   37433 		v.AddArg(mem)
   37434 		return true
   37435 	}
   37436 	return false
   37437 }
   37438 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool {
   37439 	b := v.Block
   37440 	_ = b
   37441 	// match: (SUB x (MOVDconst [c]))
   37442 	// cond: is32Bit(c)
   37443 	// result: (SUBconst x [c])
   37444 	for {
   37445 		_ = v.Args[1]
   37446 		x := v.Args[0]
   37447 		v_1 := v.Args[1]
   37448 		if v_1.Op != OpS390XMOVDconst {
   37449 			break
   37450 		}
   37451 		c := v_1.AuxInt
   37452 		if !(is32Bit(c)) {
   37453 			break
   37454 		}
   37455 		v.reset(OpS390XSUBconst)
   37456 		v.AuxInt = c
   37457 		v.AddArg(x)
   37458 		return true
   37459 	}
   37460 	// match: (SUB (MOVDconst [c]) x)
   37461 	// cond: is32Bit(c)
   37462 	// result: (NEG (SUBconst <v.Type> x [c]))
   37463 	for {
   37464 		_ = v.Args[1]
   37465 		v_0 := v.Args[0]
   37466 		if v_0.Op != OpS390XMOVDconst {
   37467 			break
   37468 		}
   37469 		c := v_0.AuxInt
   37470 		x := v.Args[1]
   37471 		if !(is32Bit(c)) {
   37472 			break
   37473 		}
   37474 		v.reset(OpS390XNEG)
   37475 		v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type)
   37476 		v0.AuxInt = c
   37477 		v0.AddArg(x)
   37478 		v.AddArg(v0)
   37479 		return true
   37480 	}
   37481 	// match: (SUB x x)
   37482 	// cond:
   37483 	// result: (MOVDconst [0])
   37484 	for {
   37485 		_ = v.Args[1]
   37486 		x := v.Args[0]
   37487 		if x != v.Args[1] {
   37488 			break
   37489 		}
   37490 		v.reset(OpS390XMOVDconst)
   37491 		v.AuxInt = 0
   37492 		return true
   37493 	}
   37494 	// match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem))
   37495 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   37496 	// result: (SUBload <t> [off] {sym} x ptr mem)
   37497 	for {
   37498 		t := v.Type
   37499 		_ = v.Args[1]
   37500 		x := v.Args[0]
   37501 		g := v.Args[1]
   37502 		if g.Op != OpS390XMOVDload {
   37503 			break
   37504 		}
   37505 		off := g.AuxInt
   37506 		sym := g.Aux
   37507 		_ = g.Args[1]
   37508 		ptr := g.Args[0]
   37509 		mem := g.Args[1]
   37510 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   37511 			break
   37512 		}
   37513 		v.reset(OpS390XSUBload)
   37514 		v.Type = t
   37515 		v.AuxInt = off
   37516 		v.Aux = sym
   37517 		v.AddArg(x)
   37518 		v.AddArg(ptr)
   37519 		v.AddArg(mem)
   37520 		return true
   37521 	}
   37522 	return false
   37523 }
   37524 func rewriteValueS390X_OpS390XSUBEWcarrymask_0(v *Value) bool {
   37525 	// match: (SUBEWcarrymask (FlagEQ))
   37526 	// cond:
   37527 	// result: (MOVDconst [-1])
   37528 	for {
   37529 		v_0 := v.Args[0]
   37530 		if v_0.Op != OpS390XFlagEQ {
   37531 			break
   37532 		}
   37533 		v.reset(OpS390XMOVDconst)
   37534 		v.AuxInt = -1
   37535 		return true
   37536 	}
   37537 	// match: (SUBEWcarrymask (FlagLT))
   37538 	// cond:
   37539 	// result: (MOVDconst [-1])
   37540 	for {
   37541 		v_0 := v.Args[0]
   37542 		if v_0.Op != OpS390XFlagLT {
   37543 			break
   37544 		}
   37545 		v.reset(OpS390XMOVDconst)
   37546 		v.AuxInt = -1
   37547 		return true
   37548 	}
   37549 	// match: (SUBEWcarrymask (FlagGT))
   37550 	// cond:
   37551 	// result: (MOVDconst [0])
   37552 	for {
   37553 		v_0 := v.Args[0]
   37554 		if v_0.Op != OpS390XFlagGT {
   37555 			break
   37556 		}
   37557 		v.reset(OpS390XMOVDconst)
   37558 		v.AuxInt = 0
   37559 		return true
   37560 	}
   37561 	return false
   37562 }
   37563 func rewriteValueS390X_OpS390XSUBEcarrymask_0(v *Value) bool {
   37564 	// match: (SUBEcarrymask (FlagEQ))
   37565 	// cond:
   37566 	// result: (MOVDconst [-1])
   37567 	for {
   37568 		v_0 := v.Args[0]
   37569 		if v_0.Op != OpS390XFlagEQ {
   37570 			break
   37571 		}
   37572 		v.reset(OpS390XMOVDconst)
   37573 		v.AuxInt = -1
   37574 		return true
   37575 	}
   37576 	// match: (SUBEcarrymask (FlagLT))
   37577 	// cond:
   37578 	// result: (MOVDconst [-1])
   37579 	for {
   37580 		v_0 := v.Args[0]
   37581 		if v_0.Op != OpS390XFlagLT {
   37582 			break
   37583 		}
   37584 		v.reset(OpS390XMOVDconst)
   37585 		v.AuxInt = -1
   37586 		return true
   37587 	}
   37588 	// match: (SUBEcarrymask (FlagGT))
   37589 	// cond:
   37590 	// result: (MOVDconst [0])
   37591 	for {
   37592 		v_0 := v.Args[0]
   37593 		if v_0.Op != OpS390XFlagGT {
   37594 			break
   37595 		}
   37596 		v.reset(OpS390XMOVDconst)
   37597 		v.AuxInt = 0
   37598 		return true
   37599 	}
   37600 	return false
   37601 }
   37602 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool {
   37603 	b := v.Block
   37604 	_ = b
   37605 	// match: (SUBW x (MOVDconst [c]))
   37606 	// cond:
   37607 	// result: (SUBWconst x [int64(int32(c))])
   37608 	for {
   37609 		_ = v.Args[1]
   37610 		x := v.Args[0]
   37611 		v_1 := v.Args[1]
   37612 		if v_1.Op != OpS390XMOVDconst {
   37613 			break
   37614 		}
   37615 		c := v_1.AuxInt
   37616 		v.reset(OpS390XSUBWconst)
   37617 		v.AuxInt = int64(int32(c))
   37618 		v.AddArg(x)
   37619 		return true
   37620 	}
   37621 	// match: (SUBW (MOVDconst [c]) x)
   37622 	// cond:
   37623 	// result: (NEGW (SUBWconst <v.Type> x [int64(int32(c))]))
   37624 	for {
   37625 		_ = v.Args[1]
   37626 		v_0 := v.Args[0]
   37627 		if v_0.Op != OpS390XMOVDconst {
   37628 			break
   37629 		}
   37630 		c := v_0.AuxInt
   37631 		x := v.Args[1]
   37632 		v.reset(OpS390XNEGW)
   37633 		v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type)
   37634 		v0.AuxInt = int64(int32(c))
   37635 		v0.AddArg(x)
   37636 		v.AddArg(v0)
   37637 		return true
   37638 	}
   37639 	// match: (SUBW x x)
   37640 	// cond:
   37641 	// result: (MOVDconst [0])
   37642 	for {
   37643 		_ = v.Args[1]
   37644 		x := v.Args[0]
   37645 		if x != v.Args[1] {
   37646 			break
   37647 		}
   37648 		v.reset(OpS390XMOVDconst)
   37649 		v.AuxInt = 0
   37650 		return true
   37651 	}
   37652 	// match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem))
   37653 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   37654 	// result: (SUBWload <t> [off] {sym} x ptr mem)
   37655 	for {
   37656 		t := v.Type
   37657 		_ = v.Args[1]
   37658 		x := v.Args[0]
   37659 		g := v.Args[1]
   37660 		if g.Op != OpS390XMOVWload {
   37661 			break
   37662 		}
   37663 		off := g.AuxInt
   37664 		sym := g.Aux
   37665 		_ = g.Args[1]
   37666 		ptr := g.Args[0]
   37667 		mem := g.Args[1]
   37668 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   37669 			break
   37670 		}
   37671 		v.reset(OpS390XSUBWload)
   37672 		v.Type = t
   37673 		v.AuxInt = off
   37674 		v.Aux = sym
   37675 		v.AddArg(x)
   37676 		v.AddArg(ptr)
   37677 		v.AddArg(mem)
   37678 		return true
   37679 	}
   37680 	// match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem))
   37681 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   37682 	// result: (SUBWload <t> [off] {sym} x ptr mem)
   37683 	for {
   37684 		t := v.Type
   37685 		_ = v.Args[1]
   37686 		x := v.Args[0]
   37687 		g := v.Args[1]
   37688 		if g.Op != OpS390XMOVWZload {
   37689 			break
   37690 		}
   37691 		off := g.AuxInt
   37692 		sym := g.Aux
   37693 		_ = g.Args[1]
   37694 		ptr := g.Args[0]
   37695 		mem := g.Args[1]
   37696 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   37697 			break
   37698 		}
   37699 		v.reset(OpS390XSUBWload)
   37700 		v.Type = t
   37701 		v.AuxInt = off
   37702 		v.Aux = sym
   37703 		v.AddArg(x)
   37704 		v.AddArg(ptr)
   37705 		v.AddArg(mem)
   37706 		return true
   37707 	}
   37708 	return false
   37709 }
   37710 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool {
   37711 	// match: (SUBWconst [c] x)
   37712 	// cond: int32(c) == 0
   37713 	// result: x
   37714 	for {
   37715 		c := v.AuxInt
   37716 		x := v.Args[0]
   37717 		if !(int32(c) == 0) {
   37718 			break
   37719 		}
   37720 		v.reset(OpCopy)
   37721 		v.Type = x.Type
   37722 		v.AddArg(x)
   37723 		return true
   37724 	}
   37725 	// match: (SUBWconst [c] x)
   37726 	// cond:
   37727 	// result: (ADDWconst [int64(int32(-c))] x)
   37728 	for {
   37729 		c := v.AuxInt
   37730 		x := v.Args[0]
   37731 		v.reset(OpS390XADDWconst)
   37732 		v.AuxInt = int64(int32(-c))
   37733 		v.AddArg(x)
   37734 		return true
   37735 	}
   37736 }
   37737 func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool {
   37738 	// match: (SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem)
   37739 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   37740 	// result: (SUBWload  [off1+off2] {sym} x ptr mem)
   37741 	for {
   37742 		off1 := v.AuxInt
   37743 		sym := v.Aux
   37744 		_ = v.Args[2]
   37745 		x := v.Args[0]
   37746 		v_1 := v.Args[1]
   37747 		if v_1.Op != OpS390XADDconst {
   37748 			break
   37749 		}
   37750 		off2 := v_1.AuxInt
   37751 		ptr := v_1.Args[0]
   37752 		mem := v.Args[2]
   37753 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   37754 			break
   37755 		}
   37756 		v.reset(OpS390XSUBWload)
   37757 		v.AuxInt = off1 + off2
   37758 		v.Aux = sym
   37759 		v.AddArg(x)
   37760 		v.AddArg(ptr)
   37761 		v.AddArg(mem)
   37762 		return true
   37763 	}
   37764 	// match: (SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   37765 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   37766 	// result: (SUBWload  [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   37767 	for {
   37768 		o1 := v.AuxInt
   37769 		s1 := v.Aux
   37770 		_ = v.Args[2]
   37771 		x := v.Args[0]
   37772 		v_1 := v.Args[1]
   37773 		if v_1.Op != OpS390XMOVDaddr {
   37774 			break
   37775 		}
   37776 		o2 := v_1.AuxInt
   37777 		s2 := v_1.Aux
   37778 		ptr := v_1.Args[0]
   37779 		mem := v.Args[2]
   37780 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   37781 			break
   37782 		}
   37783 		v.reset(OpS390XSUBWload)
   37784 		v.AuxInt = o1 + o2
   37785 		v.Aux = mergeSym(s1, s2)
   37786 		v.AddArg(x)
   37787 		v.AddArg(ptr)
   37788 		v.AddArg(mem)
   37789 		return true
   37790 	}
   37791 	return false
   37792 }
   37793 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool {
   37794 	// match: (SUBconst [0] x)
   37795 	// cond:
   37796 	// result: x
   37797 	for {
   37798 		if v.AuxInt != 0 {
   37799 			break
   37800 		}
   37801 		x := v.Args[0]
   37802 		v.reset(OpCopy)
   37803 		v.Type = x.Type
   37804 		v.AddArg(x)
   37805 		return true
   37806 	}
   37807 	// match: (SUBconst [c] x)
   37808 	// cond: c != -(1<<31)
   37809 	// result: (ADDconst [-c] x)
   37810 	for {
   37811 		c := v.AuxInt
   37812 		x := v.Args[0]
   37813 		if !(c != -(1 << 31)) {
   37814 			break
   37815 		}
   37816 		v.reset(OpS390XADDconst)
   37817 		v.AuxInt = -c
   37818 		v.AddArg(x)
   37819 		return true
   37820 	}
   37821 	// match: (SUBconst (MOVDconst [d]) [c])
   37822 	// cond:
   37823 	// result: (MOVDconst [d-c])
   37824 	for {
   37825 		c := v.AuxInt
   37826 		v_0 := v.Args[0]
   37827 		if v_0.Op != OpS390XMOVDconst {
   37828 			break
   37829 		}
   37830 		d := v_0.AuxInt
   37831 		v.reset(OpS390XMOVDconst)
   37832 		v.AuxInt = d - c
   37833 		return true
   37834 	}
   37835 	// match: (SUBconst (SUBconst x [d]) [c])
   37836 	// cond: is32Bit(-c-d)
   37837 	// result: (ADDconst [-c-d] x)
   37838 	for {
   37839 		c := v.AuxInt
   37840 		v_0 := v.Args[0]
   37841 		if v_0.Op != OpS390XSUBconst {
   37842 			break
   37843 		}
   37844 		d := v_0.AuxInt
   37845 		x := v_0.Args[0]
   37846 		if !(is32Bit(-c - d)) {
   37847 			break
   37848 		}
   37849 		v.reset(OpS390XADDconst)
   37850 		v.AuxInt = -c - d
   37851 		v.AddArg(x)
   37852 		return true
   37853 	}
   37854 	return false
   37855 }
   37856 func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool {
   37857 	b := v.Block
   37858 	_ = b
   37859 	// match: (SUBload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
   37860 	// cond: isSamePtr(ptr1, ptr2)
   37861 	// result: (SUB   x (LGDR <t> y))
   37862 	for {
   37863 		t := v.Type
   37864 		off := v.AuxInt
   37865 		sym := v.Aux
   37866 		_ = v.Args[2]
   37867 		x := v.Args[0]
   37868 		ptr1 := v.Args[1]
   37869 		v_2 := v.Args[2]
   37870 		if v_2.Op != OpS390XFMOVDstore {
   37871 			break
   37872 		}
   37873 		if v_2.AuxInt != off {
   37874 			break
   37875 		}
   37876 		if v_2.Aux != sym {
   37877 			break
   37878 		}
   37879 		_ = v_2.Args[2]
   37880 		ptr2 := v_2.Args[0]
   37881 		y := v_2.Args[1]
   37882 		if !(isSamePtr(ptr1, ptr2)) {
   37883 			break
   37884 		}
   37885 		v.reset(OpS390XSUB)
   37886 		v.AddArg(x)
   37887 		v0 := b.NewValue0(v.Pos, OpS390XLGDR, t)
   37888 		v0.AddArg(y)
   37889 		v.AddArg(v0)
   37890 		return true
   37891 	}
   37892 	// match: (SUBload [off1] {sym} x (ADDconst [off2] ptr) mem)
   37893 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   37894 	// result: (SUBload   [off1+off2] {sym} x ptr mem)
   37895 	for {
   37896 		off1 := v.AuxInt
   37897 		sym := v.Aux
   37898 		_ = v.Args[2]
   37899 		x := v.Args[0]
   37900 		v_1 := v.Args[1]
   37901 		if v_1.Op != OpS390XADDconst {
   37902 			break
   37903 		}
   37904 		off2 := v_1.AuxInt
   37905 		ptr := v_1.Args[0]
   37906 		mem := v.Args[2]
   37907 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   37908 			break
   37909 		}
   37910 		v.reset(OpS390XSUBload)
   37911 		v.AuxInt = off1 + off2
   37912 		v.Aux = sym
   37913 		v.AddArg(x)
   37914 		v.AddArg(ptr)
   37915 		v.AddArg(mem)
   37916 		return true
   37917 	}
   37918 	// match: (SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   37919 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   37920 	// result: (SUBload   [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   37921 	for {
   37922 		o1 := v.AuxInt
   37923 		s1 := v.Aux
   37924 		_ = v.Args[2]
   37925 		x := v.Args[0]
   37926 		v_1 := v.Args[1]
   37927 		if v_1.Op != OpS390XMOVDaddr {
   37928 			break
   37929 		}
   37930 		o2 := v_1.AuxInt
   37931 		s2 := v_1.Aux
   37932 		ptr := v_1.Args[0]
   37933 		mem := v.Args[2]
   37934 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   37935 			break
   37936 		}
   37937 		v.reset(OpS390XSUBload)
   37938 		v.AuxInt = o1 + o2
   37939 		v.Aux = mergeSym(s1, s2)
   37940 		v.AddArg(x)
   37941 		v.AddArg(ptr)
   37942 		v.AddArg(mem)
   37943 		return true
   37944 	}
   37945 	return false
   37946 }
   37947 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool {
   37948 	// match: (XOR x (MOVDconst [c]))
   37949 	// cond: isU32Bit(c)
   37950 	// result: (XORconst [c] x)
   37951 	for {
   37952 		_ = v.Args[1]
   37953 		x := v.Args[0]
   37954 		v_1 := v.Args[1]
   37955 		if v_1.Op != OpS390XMOVDconst {
   37956 			break
   37957 		}
   37958 		c := v_1.AuxInt
   37959 		if !(isU32Bit(c)) {
   37960 			break
   37961 		}
   37962 		v.reset(OpS390XXORconst)
   37963 		v.AuxInt = c
   37964 		v.AddArg(x)
   37965 		return true
   37966 	}
   37967 	// match: (XOR (MOVDconst [c]) x)
   37968 	// cond: isU32Bit(c)
   37969 	// result: (XORconst [c] x)
   37970 	for {
   37971 		_ = v.Args[1]
   37972 		v_0 := v.Args[0]
   37973 		if v_0.Op != OpS390XMOVDconst {
   37974 			break
   37975 		}
   37976 		c := v_0.AuxInt
   37977 		x := v.Args[1]
   37978 		if !(isU32Bit(c)) {
   37979 			break
   37980 		}
   37981 		v.reset(OpS390XXORconst)
   37982 		v.AuxInt = c
   37983 		v.AddArg(x)
   37984 		return true
   37985 	}
   37986 	// match: (XOR (SLDconst x [c]) (SRDconst x [d]))
   37987 	// cond: d == 64-c
   37988 	// result: (RLLGconst [c] x)
   37989 	for {
   37990 		_ = v.Args[1]
   37991 		v_0 := v.Args[0]
   37992 		if v_0.Op != OpS390XSLDconst {
   37993 			break
   37994 		}
   37995 		c := v_0.AuxInt
   37996 		x := v_0.Args[0]
   37997 		v_1 := v.Args[1]
   37998 		if v_1.Op != OpS390XSRDconst {
   37999 			break
   38000 		}
   38001 		d := v_1.AuxInt
   38002 		if x != v_1.Args[0] {
   38003 			break
   38004 		}
   38005 		if !(d == 64-c) {
   38006 			break
   38007 		}
   38008 		v.reset(OpS390XRLLGconst)
   38009 		v.AuxInt = c
   38010 		v.AddArg(x)
   38011 		return true
   38012 	}
   38013 	// match: (XOR (SRDconst x [d]) (SLDconst x [c]))
   38014 	// cond: d == 64-c
   38015 	// result: (RLLGconst [c] x)
   38016 	for {
   38017 		_ = v.Args[1]
   38018 		v_0 := v.Args[0]
   38019 		if v_0.Op != OpS390XSRDconst {
   38020 			break
   38021 		}
   38022 		d := v_0.AuxInt
   38023 		x := v_0.Args[0]
   38024 		v_1 := v.Args[1]
   38025 		if v_1.Op != OpS390XSLDconst {
   38026 			break
   38027 		}
   38028 		c := v_1.AuxInt
   38029 		if x != v_1.Args[0] {
   38030 			break
   38031 		}
   38032 		if !(d == 64-c) {
   38033 			break
   38034 		}
   38035 		v.reset(OpS390XRLLGconst)
   38036 		v.AuxInt = c
   38037 		v.AddArg(x)
   38038 		return true
   38039 	}
   38040 	// match: (XOR (MOVDconst [c]) (MOVDconst [d]))
   38041 	// cond:
   38042 	// result: (MOVDconst [c^d])
   38043 	for {
   38044 		_ = v.Args[1]
   38045 		v_0 := v.Args[0]
   38046 		if v_0.Op != OpS390XMOVDconst {
   38047 			break
   38048 		}
   38049 		c := v_0.AuxInt
   38050 		v_1 := v.Args[1]
   38051 		if v_1.Op != OpS390XMOVDconst {
   38052 			break
   38053 		}
   38054 		d := v_1.AuxInt
   38055 		v.reset(OpS390XMOVDconst)
   38056 		v.AuxInt = c ^ d
   38057 		return true
   38058 	}
   38059 	// match: (XOR (MOVDconst [d]) (MOVDconst [c]))
   38060 	// cond:
   38061 	// result: (MOVDconst [c^d])
   38062 	for {
   38063 		_ = v.Args[1]
   38064 		v_0 := v.Args[0]
   38065 		if v_0.Op != OpS390XMOVDconst {
   38066 			break
   38067 		}
   38068 		d := v_0.AuxInt
   38069 		v_1 := v.Args[1]
   38070 		if v_1.Op != OpS390XMOVDconst {
   38071 			break
   38072 		}
   38073 		c := v_1.AuxInt
   38074 		v.reset(OpS390XMOVDconst)
   38075 		v.AuxInt = c ^ d
   38076 		return true
   38077 	}
   38078 	// match: (XOR x x)
   38079 	// cond:
   38080 	// result: (MOVDconst [0])
   38081 	for {
   38082 		_ = v.Args[1]
   38083 		x := v.Args[0]
   38084 		if x != v.Args[1] {
   38085 			break
   38086 		}
   38087 		v.reset(OpS390XMOVDconst)
   38088 		v.AuxInt = 0
   38089 		return true
   38090 	}
   38091 	// match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem))
   38092 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38093 	// result: (XORload <t> [off] {sym} x ptr mem)
   38094 	for {
   38095 		t := v.Type
   38096 		_ = v.Args[1]
   38097 		x := v.Args[0]
   38098 		g := v.Args[1]
   38099 		if g.Op != OpS390XMOVDload {
   38100 			break
   38101 		}
   38102 		off := g.AuxInt
   38103 		sym := g.Aux
   38104 		_ = g.Args[1]
   38105 		ptr := g.Args[0]
   38106 		mem := g.Args[1]
   38107 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38108 			break
   38109 		}
   38110 		v.reset(OpS390XXORload)
   38111 		v.Type = t
   38112 		v.AuxInt = off
   38113 		v.Aux = sym
   38114 		v.AddArg(x)
   38115 		v.AddArg(ptr)
   38116 		v.AddArg(mem)
   38117 		return true
   38118 	}
   38119 	// match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x)
   38120 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38121 	// result: (XORload <t> [off] {sym} x ptr mem)
   38122 	for {
   38123 		t := v.Type
   38124 		_ = v.Args[1]
   38125 		g := v.Args[0]
   38126 		if g.Op != OpS390XMOVDload {
   38127 			break
   38128 		}
   38129 		off := g.AuxInt
   38130 		sym := g.Aux
   38131 		_ = g.Args[1]
   38132 		ptr := g.Args[0]
   38133 		mem := g.Args[1]
   38134 		x := v.Args[1]
   38135 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38136 			break
   38137 		}
   38138 		v.reset(OpS390XXORload)
   38139 		v.Type = t
   38140 		v.AuxInt = off
   38141 		v.Aux = sym
   38142 		v.AddArg(x)
   38143 		v.AddArg(ptr)
   38144 		v.AddArg(mem)
   38145 		return true
   38146 	}
   38147 	// match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x)
   38148 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38149 	// result: (XORload <t> [off] {sym} x ptr mem)
   38150 	for {
   38151 		t := v.Type
   38152 		_ = v.Args[1]
   38153 		g := v.Args[0]
   38154 		if g.Op != OpS390XMOVDload {
   38155 			break
   38156 		}
   38157 		off := g.AuxInt
   38158 		sym := g.Aux
   38159 		_ = g.Args[1]
   38160 		ptr := g.Args[0]
   38161 		mem := g.Args[1]
   38162 		x := v.Args[1]
   38163 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38164 			break
   38165 		}
   38166 		v.reset(OpS390XXORload)
   38167 		v.Type = t
   38168 		v.AuxInt = off
   38169 		v.Aux = sym
   38170 		v.AddArg(x)
   38171 		v.AddArg(ptr)
   38172 		v.AddArg(mem)
   38173 		return true
   38174 	}
   38175 	return false
   38176 }
   38177 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool {
   38178 	// match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem))
   38179 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38180 	// result: (XORload <t> [off] {sym} x ptr mem)
   38181 	for {
   38182 		t := v.Type
   38183 		_ = v.Args[1]
   38184 		x := v.Args[0]
   38185 		g := v.Args[1]
   38186 		if g.Op != OpS390XMOVDload {
   38187 			break
   38188 		}
   38189 		off := g.AuxInt
   38190 		sym := g.Aux
   38191 		_ = g.Args[1]
   38192 		ptr := g.Args[0]
   38193 		mem := g.Args[1]
   38194 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38195 			break
   38196 		}
   38197 		v.reset(OpS390XXORload)
   38198 		v.Type = t
   38199 		v.AuxInt = off
   38200 		v.Aux = sym
   38201 		v.AddArg(x)
   38202 		v.AddArg(ptr)
   38203 		v.AddArg(mem)
   38204 		return true
   38205 	}
   38206 	return false
   38207 }
   38208 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool {
   38209 	// match: (XORW x (MOVDconst [c]))
   38210 	// cond:
   38211 	// result: (XORWconst [int64(int32(c))] x)
   38212 	for {
   38213 		_ = v.Args[1]
   38214 		x := v.Args[0]
   38215 		v_1 := v.Args[1]
   38216 		if v_1.Op != OpS390XMOVDconst {
   38217 			break
   38218 		}
   38219 		c := v_1.AuxInt
   38220 		v.reset(OpS390XXORWconst)
   38221 		v.AuxInt = int64(int32(c))
   38222 		v.AddArg(x)
   38223 		return true
   38224 	}
   38225 	// match: (XORW (MOVDconst [c]) x)
   38226 	// cond:
   38227 	// result: (XORWconst [int64(int32(c))] x)
   38228 	for {
   38229 		_ = v.Args[1]
   38230 		v_0 := v.Args[0]
   38231 		if v_0.Op != OpS390XMOVDconst {
   38232 			break
   38233 		}
   38234 		c := v_0.AuxInt
   38235 		x := v.Args[1]
   38236 		v.reset(OpS390XXORWconst)
   38237 		v.AuxInt = int64(int32(c))
   38238 		v.AddArg(x)
   38239 		return true
   38240 	}
   38241 	// match: (XORW (SLWconst x [c]) (SRWconst x [d]))
   38242 	// cond: d == 32-c
   38243 	// result: (RLLconst [c] x)
   38244 	for {
   38245 		_ = v.Args[1]
   38246 		v_0 := v.Args[0]
   38247 		if v_0.Op != OpS390XSLWconst {
   38248 			break
   38249 		}
   38250 		c := v_0.AuxInt
   38251 		x := v_0.Args[0]
   38252 		v_1 := v.Args[1]
   38253 		if v_1.Op != OpS390XSRWconst {
   38254 			break
   38255 		}
   38256 		d := v_1.AuxInt
   38257 		if x != v_1.Args[0] {
   38258 			break
   38259 		}
   38260 		if !(d == 32-c) {
   38261 			break
   38262 		}
   38263 		v.reset(OpS390XRLLconst)
   38264 		v.AuxInt = c
   38265 		v.AddArg(x)
   38266 		return true
   38267 	}
   38268 	// match: (XORW (SRWconst x [d]) (SLWconst x [c]))
   38269 	// cond: d == 32-c
   38270 	// result: (RLLconst [c] x)
   38271 	for {
   38272 		_ = v.Args[1]
   38273 		v_0 := v.Args[0]
   38274 		if v_0.Op != OpS390XSRWconst {
   38275 			break
   38276 		}
   38277 		d := v_0.AuxInt
   38278 		x := v_0.Args[0]
   38279 		v_1 := v.Args[1]
   38280 		if v_1.Op != OpS390XSLWconst {
   38281 			break
   38282 		}
   38283 		c := v_1.AuxInt
   38284 		if x != v_1.Args[0] {
   38285 			break
   38286 		}
   38287 		if !(d == 32-c) {
   38288 			break
   38289 		}
   38290 		v.reset(OpS390XRLLconst)
   38291 		v.AuxInt = c
   38292 		v.AddArg(x)
   38293 		return true
   38294 	}
   38295 	// match: (XORW x x)
   38296 	// cond:
   38297 	// result: (MOVDconst [0])
   38298 	for {
   38299 		_ = v.Args[1]
   38300 		x := v.Args[0]
   38301 		if x != v.Args[1] {
   38302 			break
   38303 		}
   38304 		v.reset(OpS390XMOVDconst)
   38305 		v.AuxInt = 0
   38306 		return true
   38307 	}
   38308 	// match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem))
   38309 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38310 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38311 	for {
   38312 		t := v.Type
   38313 		_ = v.Args[1]
   38314 		x := v.Args[0]
   38315 		g := v.Args[1]
   38316 		if g.Op != OpS390XMOVWload {
   38317 			break
   38318 		}
   38319 		off := g.AuxInt
   38320 		sym := g.Aux
   38321 		_ = g.Args[1]
   38322 		ptr := g.Args[0]
   38323 		mem := g.Args[1]
   38324 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38325 			break
   38326 		}
   38327 		v.reset(OpS390XXORWload)
   38328 		v.Type = t
   38329 		v.AuxInt = off
   38330 		v.Aux = sym
   38331 		v.AddArg(x)
   38332 		v.AddArg(ptr)
   38333 		v.AddArg(mem)
   38334 		return true
   38335 	}
   38336 	// match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x)
   38337 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38338 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38339 	for {
   38340 		t := v.Type
   38341 		_ = v.Args[1]
   38342 		g := v.Args[0]
   38343 		if g.Op != OpS390XMOVWload {
   38344 			break
   38345 		}
   38346 		off := g.AuxInt
   38347 		sym := g.Aux
   38348 		_ = g.Args[1]
   38349 		ptr := g.Args[0]
   38350 		mem := g.Args[1]
   38351 		x := v.Args[1]
   38352 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38353 			break
   38354 		}
   38355 		v.reset(OpS390XXORWload)
   38356 		v.Type = t
   38357 		v.AuxInt = off
   38358 		v.Aux = sym
   38359 		v.AddArg(x)
   38360 		v.AddArg(ptr)
   38361 		v.AddArg(mem)
   38362 		return true
   38363 	}
   38364 	// match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x)
   38365 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38366 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38367 	for {
   38368 		t := v.Type
   38369 		_ = v.Args[1]
   38370 		g := v.Args[0]
   38371 		if g.Op != OpS390XMOVWload {
   38372 			break
   38373 		}
   38374 		off := g.AuxInt
   38375 		sym := g.Aux
   38376 		_ = g.Args[1]
   38377 		ptr := g.Args[0]
   38378 		mem := g.Args[1]
   38379 		x := v.Args[1]
   38380 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38381 			break
   38382 		}
   38383 		v.reset(OpS390XXORWload)
   38384 		v.Type = t
   38385 		v.AuxInt = off
   38386 		v.Aux = sym
   38387 		v.AddArg(x)
   38388 		v.AddArg(ptr)
   38389 		v.AddArg(mem)
   38390 		return true
   38391 	}
   38392 	// match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem))
   38393 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38394 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38395 	for {
   38396 		t := v.Type
   38397 		_ = v.Args[1]
   38398 		x := v.Args[0]
   38399 		g := v.Args[1]
   38400 		if g.Op != OpS390XMOVWload {
   38401 			break
   38402 		}
   38403 		off := g.AuxInt
   38404 		sym := g.Aux
   38405 		_ = g.Args[1]
   38406 		ptr := g.Args[0]
   38407 		mem := g.Args[1]
   38408 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38409 			break
   38410 		}
   38411 		v.reset(OpS390XXORWload)
   38412 		v.Type = t
   38413 		v.AuxInt = off
   38414 		v.Aux = sym
   38415 		v.AddArg(x)
   38416 		v.AddArg(ptr)
   38417 		v.AddArg(mem)
   38418 		return true
   38419 	}
   38420 	// match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem))
   38421 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38422 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38423 	for {
   38424 		t := v.Type
   38425 		_ = v.Args[1]
   38426 		x := v.Args[0]
   38427 		g := v.Args[1]
   38428 		if g.Op != OpS390XMOVWZload {
   38429 			break
   38430 		}
   38431 		off := g.AuxInt
   38432 		sym := g.Aux
   38433 		_ = g.Args[1]
   38434 		ptr := g.Args[0]
   38435 		mem := g.Args[1]
   38436 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38437 			break
   38438 		}
   38439 		v.reset(OpS390XXORWload)
   38440 		v.Type = t
   38441 		v.AuxInt = off
   38442 		v.Aux = sym
   38443 		v.AddArg(x)
   38444 		v.AddArg(ptr)
   38445 		v.AddArg(mem)
   38446 		return true
   38447 	}
   38448 	return false
   38449 }
   38450 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool {
   38451 	// match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   38452 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38453 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38454 	for {
   38455 		t := v.Type
   38456 		_ = v.Args[1]
   38457 		g := v.Args[0]
   38458 		if g.Op != OpS390XMOVWZload {
   38459 			break
   38460 		}
   38461 		off := g.AuxInt
   38462 		sym := g.Aux
   38463 		_ = g.Args[1]
   38464 		ptr := g.Args[0]
   38465 		mem := g.Args[1]
   38466 		x := v.Args[1]
   38467 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38468 			break
   38469 		}
   38470 		v.reset(OpS390XXORWload)
   38471 		v.Type = t
   38472 		v.AuxInt = off
   38473 		v.Aux = sym
   38474 		v.AddArg(x)
   38475 		v.AddArg(ptr)
   38476 		v.AddArg(mem)
   38477 		return true
   38478 	}
   38479 	// match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x)
   38480 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38481 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38482 	for {
   38483 		t := v.Type
   38484 		_ = v.Args[1]
   38485 		g := v.Args[0]
   38486 		if g.Op != OpS390XMOVWZload {
   38487 			break
   38488 		}
   38489 		off := g.AuxInt
   38490 		sym := g.Aux
   38491 		_ = g.Args[1]
   38492 		ptr := g.Args[0]
   38493 		mem := g.Args[1]
   38494 		x := v.Args[1]
   38495 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38496 			break
   38497 		}
   38498 		v.reset(OpS390XXORWload)
   38499 		v.Type = t
   38500 		v.AuxInt = off
   38501 		v.Aux = sym
   38502 		v.AddArg(x)
   38503 		v.AddArg(ptr)
   38504 		v.AddArg(mem)
   38505 		return true
   38506 	}
   38507 	// match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem))
   38508 	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)
   38509 	// result: (XORWload <t> [off] {sym} x ptr mem)
   38510 	for {
   38511 		t := v.Type
   38512 		_ = v.Args[1]
   38513 		x := v.Args[0]
   38514 		g := v.Args[1]
   38515 		if g.Op != OpS390XMOVWZload {
   38516 			break
   38517 		}
   38518 		off := g.AuxInt
   38519 		sym := g.Aux
   38520 		_ = g.Args[1]
   38521 		ptr := g.Args[0]
   38522 		mem := g.Args[1]
   38523 		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) {
   38524 			break
   38525 		}
   38526 		v.reset(OpS390XXORWload)
   38527 		v.Type = t
   38528 		v.AuxInt = off
   38529 		v.Aux = sym
   38530 		v.AddArg(x)
   38531 		v.AddArg(ptr)
   38532 		v.AddArg(mem)
   38533 		return true
   38534 	}
   38535 	return false
   38536 }
   38537 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool {
   38538 	// match: (XORWconst [c] x)
   38539 	// cond: int32(c)==0
   38540 	// result: x
   38541 	for {
   38542 		c := v.AuxInt
   38543 		x := v.Args[0]
   38544 		if !(int32(c) == 0) {
   38545 			break
   38546 		}
   38547 		v.reset(OpCopy)
   38548 		v.Type = x.Type
   38549 		v.AddArg(x)
   38550 		return true
   38551 	}
   38552 	// match: (XORWconst [c] (MOVDconst [d]))
   38553 	// cond:
   38554 	// result: (MOVDconst [c^d])
   38555 	for {
   38556 		c := v.AuxInt
   38557 		v_0 := v.Args[0]
   38558 		if v_0.Op != OpS390XMOVDconst {
   38559 			break
   38560 		}
   38561 		d := v_0.AuxInt
   38562 		v.reset(OpS390XMOVDconst)
   38563 		v.AuxInt = c ^ d
   38564 		return true
   38565 	}
   38566 	return false
   38567 }
   38568 func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool {
   38569 	// match: (XORWload [off1] {sym} x (ADDconst [off2] ptr) mem)
   38570 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   38571 	// result: (XORWload  [off1+off2] {sym} x ptr mem)
   38572 	for {
   38573 		off1 := v.AuxInt
   38574 		sym := v.Aux
   38575 		_ = v.Args[2]
   38576 		x := v.Args[0]
   38577 		v_1 := v.Args[1]
   38578 		if v_1.Op != OpS390XADDconst {
   38579 			break
   38580 		}
   38581 		off2 := v_1.AuxInt
   38582 		ptr := v_1.Args[0]
   38583 		mem := v.Args[2]
   38584 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   38585 			break
   38586 		}
   38587 		v.reset(OpS390XXORWload)
   38588 		v.AuxInt = off1 + off2
   38589 		v.Aux = sym
   38590 		v.AddArg(x)
   38591 		v.AddArg(ptr)
   38592 		v.AddArg(mem)
   38593 		return true
   38594 	}
   38595 	// match: (XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   38596 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   38597 	// result: (XORWload  [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   38598 	for {
   38599 		o1 := v.AuxInt
   38600 		s1 := v.Aux
   38601 		_ = v.Args[2]
   38602 		x := v.Args[0]
   38603 		v_1 := v.Args[1]
   38604 		if v_1.Op != OpS390XMOVDaddr {
   38605 			break
   38606 		}
   38607 		o2 := v_1.AuxInt
   38608 		s2 := v_1.Aux
   38609 		ptr := v_1.Args[0]
   38610 		mem := v.Args[2]
   38611 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   38612 			break
   38613 		}
   38614 		v.reset(OpS390XXORWload)
   38615 		v.AuxInt = o1 + o2
   38616 		v.Aux = mergeSym(s1, s2)
   38617 		v.AddArg(x)
   38618 		v.AddArg(ptr)
   38619 		v.AddArg(mem)
   38620 		return true
   38621 	}
   38622 	return false
   38623 }
   38624 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool {
   38625 	// match: (XORconst [0] x)
   38626 	// cond:
   38627 	// result: x
   38628 	for {
   38629 		if v.AuxInt != 0 {
   38630 			break
   38631 		}
   38632 		x := v.Args[0]
   38633 		v.reset(OpCopy)
   38634 		v.Type = x.Type
   38635 		v.AddArg(x)
   38636 		return true
   38637 	}
   38638 	// match: (XORconst [c] (MOVDconst [d]))
   38639 	// cond:
   38640 	// result: (MOVDconst [c^d])
   38641 	for {
   38642 		c := v.AuxInt
   38643 		v_0 := v.Args[0]
   38644 		if v_0.Op != OpS390XMOVDconst {
   38645 			break
   38646 		}
   38647 		d := v_0.AuxInt
   38648 		v.reset(OpS390XMOVDconst)
   38649 		v.AuxInt = c ^ d
   38650 		return true
   38651 	}
   38652 	return false
   38653 }
   38654 func rewriteValueS390X_OpS390XXORload_0(v *Value) bool {
   38655 	b := v.Block
   38656 	_ = b
   38657 	// match: (XORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
   38658 	// cond: isSamePtr(ptr1, ptr2)
   38659 	// result: (XOR   x (LGDR <t> y))
   38660 	for {
   38661 		t := v.Type
   38662 		off := v.AuxInt
   38663 		sym := v.Aux
   38664 		_ = v.Args[2]
   38665 		x := v.Args[0]
   38666 		ptr1 := v.Args[1]
   38667 		v_2 := v.Args[2]
   38668 		if v_2.Op != OpS390XFMOVDstore {
   38669 			break
   38670 		}
   38671 		if v_2.AuxInt != off {
   38672 			break
   38673 		}
   38674 		if v_2.Aux != sym {
   38675 			break
   38676 		}
   38677 		_ = v_2.Args[2]
   38678 		ptr2 := v_2.Args[0]
   38679 		y := v_2.Args[1]
   38680 		if !(isSamePtr(ptr1, ptr2)) {
   38681 			break
   38682 		}
   38683 		v.reset(OpS390XXOR)
   38684 		v.AddArg(x)
   38685 		v0 := b.NewValue0(v.Pos, OpS390XLGDR, t)
   38686 		v0.AddArg(y)
   38687 		v.AddArg(v0)
   38688 		return true
   38689 	}
   38690 	// match: (XORload [off1] {sym} x (ADDconst [off2] ptr) mem)
   38691 	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
   38692 	// result: (XORload   [off1+off2] {sym} x ptr mem)
   38693 	for {
   38694 		off1 := v.AuxInt
   38695 		sym := v.Aux
   38696 		_ = v.Args[2]
   38697 		x := v.Args[0]
   38698 		v_1 := v.Args[1]
   38699 		if v_1.Op != OpS390XADDconst {
   38700 			break
   38701 		}
   38702 		off2 := v_1.AuxInt
   38703 		ptr := v_1.Args[0]
   38704 		mem := v.Args[2]
   38705 		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
   38706 			break
   38707 		}
   38708 		v.reset(OpS390XXORload)
   38709 		v.AuxInt = off1 + off2
   38710 		v.Aux = sym
   38711 		v.AddArg(x)
   38712 		v.AddArg(ptr)
   38713 		v.AddArg(mem)
   38714 		return true
   38715 	}
   38716 	// match: (XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
   38717 	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
   38718 	// result: (XORload   [o1+o2] {mergeSym(s1, s2)} x ptr mem)
   38719 	for {
   38720 		o1 := v.AuxInt
   38721 		s1 := v.Aux
   38722 		_ = v.Args[2]
   38723 		x := v.Args[0]
   38724 		v_1 := v.Args[1]
   38725 		if v_1.Op != OpS390XMOVDaddr {
   38726 			break
   38727 		}
   38728 		o2 := v_1.AuxInt
   38729 		s2 := v_1.Aux
   38730 		ptr := v_1.Args[0]
   38731 		mem := v.Args[2]
   38732 		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
   38733 			break
   38734 		}
   38735 		v.reset(OpS390XXORload)
   38736 		v.AuxInt = o1 + o2
   38737 		v.Aux = mergeSym(s1, s2)
   38738 		v.AddArg(x)
   38739 		v.AddArg(ptr)
   38740 		v.AddArg(mem)
   38741 		return true
   38742 	}
   38743 	return false
   38744 }
   38745 func rewriteValueS390X_OpSelect0_0(v *Value) bool {
   38746 	b := v.Block
   38747 	_ = b
   38748 	// match: (Select0 <t> (AddTupleFirst32 val tuple))
   38749 	// cond:
   38750 	// result: (ADDW val (Select0 <t> tuple))
   38751 	for {
   38752 		t := v.Type
   38753 		v_0 := v.Args[0]
   38754 		if v_0.Op != OpS390XAddTupleFirst32 {
   38755 			break
   38756 		}
   38757 		_ = v_0.Args[1]
   38758 		val := v_0.Args[0]
   38759 		tuple := v_0.Args[1]
   38760 		v.reset(OpS390XADDW)
   38761 		v.AddArg(val)
   38762 		v0 := b.NewValue0(v.Pos, OpSelect0, t)
   38763 		v0.AddArg(tuple)
   38764 		v.AddArg(v0)
   38765 		return true
   38766 	}
   38767 	// match: (Select0 <t> (AddTupleFirst64 val tuple))
   38768 	// cond:
   38769 	// result: (ADD val (Select0 <t> tuple))
   38770 	for {
   38771 		t := v.Type
   38772 		v_0 := v.Args[0]
   38773 		if v_0.Op != OpS390XAddTupleFirst64 {
   38774 			break
   38775 		}
   38776 		_ = v_0.Args[1]
   38777 		val := v_0.Args[0]
   38778 		tuple := v_0.Args[1]
   38779 		v.reset(OpS390XADD)
   38780 		v.AddArg(val)
   38781 		v0 := b.NewValue0(v.Pos, OpSelect0, t)
   38782 		v0.AddArg(tuple)
   38783 		v.AddArg(v0)
   38784 		return true
   38785 	}
   38786 	return false
   38787 }
   38788 func rewriteValueS390X_OpSelect1_0(v *Value) bool {
   38789 	// match: (Select1 (AddTupleFirst32 _ tuple))
   38790 	// cond:
   38791 	// result: (Select1 tuple)
   38792 	for {
   38793 		v_0 := v.Args[0]
   38794 		if v_0.Op != OpS390XAddTupleFirst32 {
   38795 			break
   38796 		}
   38797 		_ = v_0.Args[1]
   38798 		tuple := v_0.Args[1]
   38799 		v.reset(OpSelect1)
   38800 		v.AddArg(tuple)
   38801 		return true
   38802 	}
   38803 	// match: (Select1 (AddTupleFirst64 _ tuple))
   38804 	// cond:
   38805 	// result: (Select1 tuple)
   38806 	for {
   38807 		v_0 := v.Args[0]
   38808 		if v_0.Op != OpS390XAddTupleFirst64 {
   38809 			break
   38810 		}
   38811 		_ = v_0.Args[1]
   38812 		tuple := v_0.Args[1]
   38813 		v.reset(OpSelect1)
   38814 		v.AddArg(tuple)
   38815 		return true
   38816 	}
   38817 	return false
   38818 }
   38819 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool {
   38820 	// match: (SignExt16to32 x)
   38821 	// cond:
   38822 	// result: (MOVHreg x)
   38823 	for {
   38824 		x := v.Args[0]
   38825 		v.reset(OpS390XMOVHreg)
   38826 		v.AddArg(x)
   38827 		return true
   38828 	}
   38829 }
   38830 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool {
   38831 	// match: (SignExt16to64 x)
   38832 	// cond:
   38833 	// result: (MOVHreg x)
   38834 	for {
   38835 		x := v.Args[0]
   38836 		v.reset(OpS390XMOVHreg)
   38837 		v.AddArg(x)
   38838 		return true
   38839 	}
   38840 }
   38841 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool {
   38842 	// match: (SignExt32to64 x)
   38843 	// cond:
   38844 	// result: (MOVWreg x)
   38845 	for {
   38846 		x := v.Args[0]
   38847 		v.reset(OpS390XMOVWreg)
   38848 		v.AddArg(x)
   38849 		return true
   38850 	}
   38851 }
   38852 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool {
   38853 	// match: (SignExt8to16 x)
   38854 	// cond:
   38855 	// result: (MOVBreg x)
   38856 	for {
   38857 		x := v.Args[0]
   38858 		v.reset(OpS390XMOVBreg)
   38859 		v.AddArg(x)
   38860 		return true
   38861 	}
   38862 }
   38863 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool {
   38864 	// match: (SignExt8to32 x)
   38865 	// cond:
   38866 	// result: (MOVBreg x)
   38867 	for {
   38868 		x := v.Args[0]
   38869 		v.reset(OpS390XMOVBreg)
   38870 		v.AddArg(x)
   38871 		return true
   38872 	}
   38873 }
   38874 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool {
   38875 	// match: (SignExt8to64 x)
   38876 	// cond:
   38877 	// result: (MOVBreg x)
   38878 	for {
   38879 		x := v.Args[0]
   38880 		v.reset(OpS390XMOVBreg)
   38881 		v.AddArg(x)
   38882 		return true
   38883 	}
   38884 }
   38885 func rewriteValueS390X_OpSlicemask_0(v *Value) bool {
   38886 	b := v.Block
   38887 	_ = b
   38888 	// match: (Slicemask <t> x)
   38889 	// cond:
   38890 	// result: (SRADconst (NEG <t> x) [63])
   38891 	for {
   38892 		t := v.Type
   38893 		x := v.Args[0]
   38894 		v.reset(OpS390XSRADconst)
   38895 		v.AuxInt = 63
   38896 		v0 := b.NewValue0(v.Pos, OpS390XNEG, t)
   38897 		v0.AddArg(x)
   38898 		v.AddArg(v0)
   38899 		return true
   38900 	}
   38901 }
   38902 func rewriteValueS390X_OpSqrt_0(v *Value) bool {
   38903 	// match: (Sqrt x)
   38904 	// cond:
   38905 	// result: (FSQRT x)
   38906 	for {
   38907 		x := v.Args[0]
   38908 		v.reset(OpS390XFSQRT)
   38909 		v.AddArg(x)
   38910 		return true
   38911 	}
   38912 }
   38913 func rewriteValueS390X_OpStaticCall_0(v *Value) bool {
   38914 	// match: (StaticCall [argwid] {target} mem)
   38915 	// cond:
   38916 	// result: (CALLstatic [argwid] {target} mem)
   38917 	for {
   38918 		argwid := v.AuxInt
   38919 		target := v.Aux
   38920 		mem := v.Args[0]
   38921 		v.reset(OpS390XCALLstatic)
   38922 		v.AuxInt = argwid
   38923 		v.Aux = target
   38924 		v.AddArg(mem)
   38925 		return true
   38926 	}
   38927 }
   38928 func rewriteValueS390X_OpStore_0(v *Value) bool {
   38929 	// match: (Store {t} ptr val mem)
   38930 	// cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)
   38931 	// result: (FMOVDstore ptr val mem)
   38932 	for {
   38933 		t := v.Aux
   38934 		_ = v.Args[2]
   38935 		ptr := v.Args[0]
   38936 		val := v.Args[1]
   38937 		mem := v.Args[2]
   38938 		if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) {
   38939 			break
   38940 		}
   38941 		v.reset(OpS390XFMOVDstore)
   38942 		v.AddArg(ptr)
   38943 		v.AddArg(val)
   38944 		v.AddArg(mem)
   38945 		return true
   38946 	}
   38947 	// match: (Store {t} ptr val mem)
   38948 	// cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)
   38949 	// result: (FMOVSstore ptr val mem)
   38950 	for {
   38951 		t := v.Aux
   38952 		_ = v.Args[2]
   38953 		ptr := v.Args[0]
   38954 		val := v.Args[1]
   38955 		mem := v.Args[2]
   38956 		if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) {
   38957 			break
   38958 		}
   38959 		v.reset(OpS390XFMOVSstore)
   38960 		v.AddArg(ptr)
   38961 		v.AddArg(val)
   38962 		v.AddArg(mem)
   38963 		return true
   38964 	}
   38965 	// match: (Store {t} ptr val mem)
   38966 	// cond: t.(*types.Type).Size() == 8
   38967 	// result: (MOVDstore ptr val mem)
   38968 	for {
   38969 		t := v.Aux
   38970 		_ = v.Args[2]
   38971 		ptr := v.Args[0]
   38972 		val := v.Args[1]
   38973 		mem := v.Args[2]
   38974 		if !(t.(*types.Type).Size() == 8) {
   38975 			break
   38976 		}
   38977 		v.reset(OpS390XMOVDstore)
   38978 		v.AddArg(ptr)
   38979 		v.AddArg(val)
   38980 		v.AddArg(mem)
   38981 		return true
   38982 	}
   38983 	// match: (Store {t} ptr val mem)
   38984 	// cond: t.(*types.Type).Size() == 4
   38985 	// result: (MOVWstore ptr val mem)
   38986 	for {
   38987 		t := v.Aux
   38988 		_ = v.Args[2]
   38989 		ptr := v.Args[0]
   38990 		val := v.Args[1]
   38991 		mem := v.Args[2]
   38992 		if !(t.(*types.Type).Size() == 4) {
   38993 			break
   38994 		}
   38995 		v.reset(OpS390XMOVWstore)
   38996 		v.AddArg(ptr)
   38997 		v.AddArg(val)
   38998 		v.AddArg(mem)
   38999 		return true
   39000 	}
   39001 	// match: (Store {t} ptr val mem)
   39002 	// cond: t.(*types.Type).Size() == 2
   39003 	// result: (MOVHstore ptr val mem)
   39004 	for {
   39005 		t := v.Aux
   39006 		_ = v.Args[2]
   39007 		ptr := v.Args[0]
   39008 		val := v.Args[1]
   39009 		mem := v.Args[2]
   39010 		if !(t.(*types.Type).Size() == 2) {
   39011 			break
   39012 		}
   39013 		v.reset(OpS390XMOVHstore)
   39014 		v.AddArg(ptr)
   39015 		v.AddArg(val)
   39016 		v.AddArg(mem)
   39017 		return true
   39018 	}
   39019 	// match: (Store {t} ptr val mem)
   39020 	// cond: t.(*types.Type).Size() == 1
   39021 	// result: (MOVBstore ptr val mem)
   39022 	for {
   39023 		t := v.Aux
   39024 		_ = v.Args[2]
   39025 		ptr := v.Args[0]
   39026 		val := v.Args[1]
   39027 		mem := v.Args[2]
   39028 		if !(t.(*types.Type).Size() == 1) {
   39029 			break
   39030 		}
   39031 		v.reset(OpS390XMOVBstore)
   39032 		v.AddArg(ptr)
   39033 		v.AddArg(val)
   39034 		v.AddArg(mem)
   39035 		return true
   39036 	}
   39037 	return false
   39038 }
   39039 func rewriteValueS390X_OpSub16_0(v *Value) bool {
   39040 	// match: (Sub16 x y)
   39041 	// cond:
   39042 	// result: (SUBW  x y)
   39043 	for {
   39044 		_ = v.Args[1]
   39045 		x := v.Args[0]
   39046 		y := v.Args[1]
   39047 		v.reset(OpS390XSUBW)
   39048 		v.AddArg(x)
   39049 		v.AddArg(y)
   39050 		return true
   39051 	}
   39052 }
   39053 func rewriteValueS390X_OpSub32_0(v *Value) bool {
   39054 	// match: (Sub32 x y)
   39055 	// cond:
   39056 	// result: (SUBW  x y)
   39057 	for {
   39058 		_ = v.Args[1]
   39059 		x := v.Args[0]
   39060 		y := v.Args[1]
   39061 		v.reset(OpS390XSUBW)
   39062 		v.AddArg(x)
   39063 		v.AddArg(y)
   39064 		return true
   39065 	}
   39066 }
   39067 func rewriteValueS390X_OpSub32F_0(v *Value) bool {
   39068 	// match: (Sub32F x y)
   39069 	// cond:
   39070 	// result: (FSUBS x y)
   39071 	for {
   39072 		_ = v.Args[1]
   39073 		x := v.Args[0]
   39074 		y := v.Args[1]
   39075 		v.reset(OpS390XFSUBS)
   39076 		v.AddArg(x)
   39077 		v.AddArg(y)
   39078 		return true
   39079 	}
   39080 }
   39081 func rewriteValueS390X_OpSub64_0(v *Value) bool {
   39082 	// match: (Sub64 x y)
   39083 	// cond:
   39084 	// result: (SUB  x y)
   39085 	for {
   39086 		_ = v.Args[1]
   39087 		x := v.Args[0]
   39088 		y := v.Args[1]
   39089 		v.reset(OpS390XSUB)
   39090 		v.AddArg(x)
   39091 		v.AddArg(y)
   39092 		return true
   39093 	}
   39094 }
   39095 func rewriteValueS390X_OpSub64F_0(v *Value) bool {
   39096 	// match: (Sub64F x y)
   39097 	// cond:
   39098 	// result: (FSUB x y)
   39099 	for {
   39100 		_ = v.Args[1]
   39101 		x := v.Args[0]
   39102 		y := v.Args[1]
   39103 		v.reset(OpS390XFSUB)
   39104 		v.AddArg(x)
   39105 		v.AddArg(y)
   39106 		return true
   39107 	}
   39108 }
   39109 func rewriteValueS390X_OpSub8_0(v *Value) bool {
   39110 	// match: (Sub8 x y)
   39111 	// cond:
   39112 	// result: (SUBW  x y)
   39113 	for {
   39114 		_ = v.Args[1]
   39115 		x := v.Args[0]
   39116 		y := v.Args[1]
   39117 		v.reset(OpS390XSUBW)
   39118 		v.AddArg(x)
   39119 		v.AddArg(y)
   39120 		return true
   39121 	}
   39122 }
   39123 func rewriteValueS390X_OpSubPtr_0(v *Value) bool {
   39124 	// match: (SubPtr x y)
   39125 	// cond:
   39126 	// result: (SUB  x y)
   39127 	for {
   39128 		_ = v.Args[1]
   39129 		x := v.Args[0]
   39130 		y := v.Args[1]
   39131 		v.reset(OpS390XSUB)
   39132 		v.AddArg(x)
   39133 		v.AddArg(y)
   39134 		return true
   39135 	}
   39136 }
   39137 func rewriteValueS390X_OpTrunc_0(v *Value) bool {
   39138 	// match: (Trunc x)
   39139 	// cond:
   39140 	// result: (FIDBR [5] x)
   39141 	for {
   39142 		x := v.Args[0]
   39143 		v.reset(OpS390XFIDBR)
   39144 		v.AuxInt = 5
   39145 		v.AddArg(x)
   39146 		return true
   39147 	}
   39148 }
   39149 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool {
   39150 	// match: (Trunc16to8 x)
   39151 	// cond:
   39152 	// result: x
   39153 	for {
   39154 		x := v.Args[0]
   39155 		v.reset(OpCopy)
   39156 		v.Type = x.Type
   39157 		v.AddArg(x)
   39158 		return true
   39159 	}
   39160 }
   39161 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool {
   39162 	// match: (Trunc32to16 x)
   39163 	// cond:
   39164 	// result: x
   39165 	for {
   39166 		x := v.Args[0]
   39167 		v.reset(OpCopy)
   39168 		v.Type = x.Type
   39169 		v.AddArg(x)
   39170 		return true
   39171 	}
   39172 }
   39173 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool {
   39174 	// match: (Trunc32to8 x)
   39175 	// cond:
   39176 	// result: x
   39177 	for {
   39178 		x := v.Args[0]
   39179 		v.reset(OpCopy)
   39180 		v.Type = x.Type
   39181 		v.AddArg(x)
   39182 		return true
   39183 	}
   39184 }
   39185 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool {
   39186 	// match: (Trunc64to16 x)
   39187 	// cond:
   39188 	// result: x
   39189 	for {
   39190 		x := v.Args[0]
   39191 		v.reset(OpCopy)
   39192 		v.Type = x.Type
   39193 		v.AddArg(x)
   39194 		return true
   39195 	}
   39196 }
   39197 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool {
   39198 	// match: (Trunc64to32 x)
   39199 	// cond:
   39200 	// result: x
   39201 	for {
   39202 		x := v.Args[0]
   39203 		v.reset(OpCopy)
   39204 		v.Type = x.Type
   39205 		v.AddArg(x)
   39206 		return true
   39207 	}
   39208 }
   39209 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool {
   39210 	// match: (Trunc64to8 x)
   39211 	// cond:
   39212 	// result: x
   39213 	for {
   39214 		x := v.Args[0]
   39215 		v.reset(OpCopy)
   39216 		v.Type = x.Type
   39217 		v.AddArg(x)
   39218 		return true
   39219 	}
   39220 }
   39221 func rewriteValueS390X_OpXor16_0(v *Value) bool {
   39222 	// match: (Xor16 x y)
   39223 	// cond:
   39224 	// result: (XORW x y)
   39225 	for {
   39226 		_ = v.Args[1]
   39227 		x := v.Args[0]
   39228 		y := v.Args[1]
   39229 		v.reset(OpS390XXORW)
   39230 		v.AddArg(x)
   39231 		v.AddArg(y)
   39232 		return true
   39233 	}
   39234 }
   39235 func rewriteValueS390X_OpXor32_0(v *Value) bool {
   39236 	// match: (Xor32 x y)
   39237 	// cond:
   39238 	// result: (XORW x y)
   39239 	for {
   39240 		_ = v.Args[1]
   39241 		x := v.Args[0]
   39242 		y := v.Args[1]
   39243 		v.reset(OpS390XXORW)
   39244 		v.AddArg(x)
   39245 		v.AddArg(y)
   39246 		return true
   39247 	}
   39248 }
   39249 func rewriteValueS390X_OpXor64_0(v *Value) bool {
   39250 	// match: (Xor64 x y)
   39251 	// cond:
   39252 	// result: (XOR x y)
   39253 	for {
   39254 		_ = v.Args[1]
   39255 		x := v.Args[0]
   39256 		y := v.Args[1]
   39257 		v.reset(OpS390XXOR)
   39258 		v.AddArg(x)
   39259 		v.AddArg(y)
   39260 		return true
   39261 	}
   39262 }
   39263 func rewriteValueS390X_OpXor8_0(v *Value) bool {
   39264 	// match: (Xor8 x y)
   39265 	// cond:
   39266 	// result: (XORW x y)
   39267 	for {
   39268 		_ = v.Args[1]
   39269 		x := v.Args[0]
   39270 		y := v.Args[1]
   39271 		v.reset(OpS390XXORW)
   39272 		v.AddArg(x)
   39273 		v.AddArg(y)
   39274 		return true
   39275 	}
   39276 }
   39277 func rewriteValueS390X_OpZero_0(v *Value) bool {
   39278 	b := v.Block
   39279 	_ = b
   39280 	// match: (Zero [0] _ mem)
   39281 	// cond:
   39282 	// result: mem
   39283 	for {
   39284 		if v.AuxInt != 0 {
   39285 			break
   39286 		}
   39287 		_ = v.Args[1]
   39288 		mem := v.Args[1]
   39289 		v.reset(OpCopy)
   39290 		v.Type = mem.Type
   39291 		v.AddArg(mem)
   39292 		return true
   39293 	}
   39294 	// match: (Zero [1] destptr mem)
   39295 	// cond:
   39296 	// result: (MOVBstoreconst [0] destptr mem)
   39297 	for {
   39298 		if v.AuxInt != 1 {
   39299 			break
   39300 		}
   39301 		_ = v.Args[1]
   39302 		destptr := v.Args[0]
   39303 		mem := v.Args[1]
   39304 		v.reset(OpS390XMOVBstoreconst)
   39305 		v.AuxInt = 0
   39306 		v.AddArg(destptr)
   39307 		v.AddArg(mem)
   39308 		return true
   39309 	}
   39310 	// match: (Zero [2] destptr mem)
   39311 	// cond:
   39312 	// result: (MOVHstoreconst [0] destptr mem)
   39313 	for {
   39314 		if v.AuxInt != 2 {
   39315 			break
   39316 		}
   39317 		_ = v.Args[1]
   39318 		destptr := v.Args[0]
   39319 		mem := v.Args[1]
   39320 		v.reset(OpS390XMOVHstoreconst)
   39321 		v.AuxInt = 0
   39322 		v.AddArg(destptr)
   39323 		v.AddArg(mem)
   39324 		return true
   39325 	}
   39326 	// match: (Zero [4] destptr mem)
   39327 	// cond:
   39328 	// result: (MOVWstoreconst [0] destptr mem)
   39329 	for {
   39330 		if v.AuxInt != 4 {
   39331 			break
   39332 		}
   39333 		_ = v.Args[1]
   39334 		destptr := v.Args[0]
   39335 		mem := v.Args[1]
   39336 		v.reset(OpS390XMOVWstoreconst)
   39337 		v.AuxInt = 0
   39338 		v.AddArg(destptr)
   39339 		v.AddArg(mem)
   39340 		return true
   39341 	}
   39342 	// match: (Zero [8] destptr mem)
   39343 	// cond:
   39344 	// result: (MOVDstoreconst [0] destptr mem)
   39345 	for {
   39346 		if v.AuxInt != 8 {
   39347 			break
   39348 		}
   39349 		_ = v.Args[1]
   39350 		destptr := v.Args[0]
   39351 		mem := v.Args[1]
   39352 		v.reset(OpS390XMOVDstoreconst)
   39353 		v.AuxInt = 0
   39354 		v.AddArg(destptr)
   39355 		v.AddArg(mem)
   39356 		return true
   39357 	}
   39358 	// match: (Zero [3] destptr mem)
   39359 	// cond:
   39360 	// result: (MOVBstoreconst [makeValAndOff(0,2)] destptr 		(MOVHstoreconst [0] destptr mem))
   39361 	for {
   39362 		if v.AuxInt != 3 {
   39363 			break
   39364 		}
   39365 		_ = v.Args[1]
   39366 		destptr := v.Args[0]
   39367 		mem := v.Args[1]
   39368 		v.reset(OpS390XMOVBstoreconst)
   39369 		v.AuxInt = makeValAndOff(0, 2)
   39370 		v.AddArg(destptr)
   39371 		v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem)
   39372 		v0.AuxInt = 0
   39373 		v0.AddArg(destptr)
   39374 		v0.AddArg(mem)
   39375 		v.AddArg(v0)
   39376 		return true
   39377 	}
   39378 	// match: (Zero [5] destptr mem)
   39379 	// cond:
   39380 	// result: (MOVBstoreconst [makeValAndOff(0,4)] destptr 		(MOVWstoreconst [0] destptr mem))
   39381 	for {
   39382 		if v.AuxInt != 5 {
   39383 			break
   39384 		}
   39385 		_ = v.Args[1]
   39386 		destptr := v.Args[0]
   39387 		mem := v.Args[1]
   39388 		v.reset(OpS390XMOVBstoreconst)
   39389 		v.AuxInt = makeValAndOff(0, 4)
   39390 		v.AddArg(destptr)
   39391 		v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem)
   39392 		v0.AuxInt = 0
   39393 		v0.AddArg(destptr)
   39394 		v0.AddArg(mem)
   39395 		v.AddArg(v0)
   39396 		return true
   39397 	}
   39398 	// match: (Zero [6] destptr mem)
   39399 	// cond:
   39400 	// result: (MOVHstoreconst [makeValAndOff(0,4)] destptr 		(MOVWstoreconst [0] destptr mem))
   39401 	for {
   39402 		if v.AuxInt != 6 {
   39403 			break
   39404 		}
   39405 		_ = v.Args[1]
   39406 		destptr := v.Args[0]
   39407 		mem := v.Args[1]
   39408 		v.reset(OpS390XMOVHstoreconst)
   39409 		v.AuxInt = makeValAndOff(0, 4)
   39410 		v.AddArg(destptr)
   39411 		v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem)
   39412 		v0.AuxInt = 0
   39413 		v0.AddArg(destptr)
   39414 		v0.AddArg(mem)
   39415 		v.AddArg(v0)
   39416 		return true
   39417 	}
   39418 	// match: (Zero [7] destptr mem)
   39419 	// cond:
   39420 	// result: (MOVWstoreconst [makeValAndOff(0,3)] destptr 		(MOVWstoreconst [0] destptr mem))
   39421 	for {
   39422 		if v.AuxInt != 7 {
   39423 			break
   39424 		}
   39425 		_ = v.Args[1]
   39426 		destptr := v.Args[0]
   39427 		mem := v.Args[1]
   39428 		v.reset(OpS390XMOVWstoreconst)
   39429 		v.AuxInt = makeValAndOff(0, 3)
   39430 		v.AddArg(destptr)
   39431 		v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem)
   39432 		v0.AuxInt = 0
   39433 		v0.AddArg(destptr)
   39434 		v0.AddArg(mem)
   39435 		v.AddArg(v0)
   39436 		return true
   39437 	}
   39438 	// match: (Zero [s] destptr mem)
   39439 	// cond: s > 0 && s <= 1024
   39440 	// result: (CLEAR [makeValAndOff(s, 0)] destptr mem)
   39441 	for {
   39442 		s := v.AuxInt
   39443 		_ = v.Args[1]
   39444 		destptr := v.Args[0]
   39445 		mem := v.Args[1]
   39446 		if !(s > 0 && s <= 1024) {
   39447 			break
   39448 		}
   39449 		v.reset(OpS390XCLEAR)
   39450 		v.AuxInt = makeValAndOff(s, 0)
   39451 		v.AddArg(destptr)
   39452 		v.AddArg(mem)
   39453 		return true
   39454 	}
   39455 	return false
   39456 }
   39457 func rewriteValueS390X_OpZero_10(v *Value) bool {
   39458 	b := v.Block
   39459 	_ = b
   39460 	// match: (Zero [s] destptr mem)
   39461 	// cond: s > 1024
   39462 	// result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem)
   39463 	for {
   39464 		s := v.AuxInt
   39465 		_ = v.Args[1]
   39466 		destptr := v.Args[0]
   39467 		mem := v.Args[1]
   39468 		if !(s > 1024) {
   39469 			break
   39470 		}
   39471 		v.reset(OpS390XLoweredZero)
   39472 		v.AuxInt = s % 256
   39473 		v.AddArg(destptr)
   39474 		v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type)
   39475 		v0.AuxInt = (s / 256) * 256
   39476 		v0.AddArg(destptr)
   39477 		v.AddArg(v0)
   39478 		v.AddArg(mem)
   39479 		return true
   39480 	}
   39481 	return false
   39482 }
   39483 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool {
   39484 	// match: (ZeroExt16to32 x)
   39485 	// cond:
   39486 	// result: (MOVHZreg x)
   39487 	for {
   39488 		x := v.Args[0]
   39489 		v.reset(OpS390XMOVHZreg)
   39490 		v.AddArg(x)
   39491 		return true
   39492 	}
   39493 }
   39494 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool {
   39495 	// match: (ZeroExt16to64 x)
   39496 	// cond:
   39497 	// result: (MOVHZreg x)
   39498 	for {
   39499 		x := v.Args[0]
   39500 		v.reset(OpS390XMOVHZreg)
   39501 		v.AddArg(x)
   39502 		return true
   39503 	}
   39504 }
   39505 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool {
   39506 	// match: (ZeroExt32to64 x)
   39507 	// cond:
   39508 	// result: (MOVWZreg x)
   39509 	for {
   39510 		x := v.Args[0]
   39511 		v.reset(OpS390XMOVWZreg)
   39512 		v.AddArg(x)
   39513 		return true
   39514 	}
   39515 }
   39516 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool {
   39517 	// match: (ZeroExt8to16 x)
   39518 	// cond:
   39519 	// result: (MOVBZreg x)
   39520 	for {
   39521 		x := v.Args[0]
   39522 		v.reset(OpS390XMOVBZreg)
   39523 		v.AddArg(x)
   39524 		return true
   39525 	}
   39526 }
   39527 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool {
   39528 	// match: (ZeroExt8to32 x)
   39529 	// cond:
   39530 	// result: (MOVBZreg x)
   39531 	for {
   39532 		x := v.Args[0]
   39533 		v.reset(OpS390XMOVBZreg)
   39534 		v.AddArg(x)
   39535 		return true
   39536 	}
   39537 }
   39538 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool {
   39539 	// match: (ZeroExt8to64 x)
   39540 	// cond:
   39541 	// result: (MOVBZreg x)
   39542 	for {
   39543 		x := v.Args[0]
   39544 		v.reset(OpS390XMOVBZreg)
   39545 		v.AddArg(x)
   39546 		return true
   39547 	}
   39548 }
   39549 func rewriteBlockS390X(b *Block) bool {
   39550 	config := b.Func.Config
   39551 	_ = config
   39552 	fe := b.Func.fe
   39553 	_ = fe
   39554 	typ := &config.Types
   39555 	_ = typ
   39556 	switch b.Kind {
   39557 	case BlockS390XEQ:
   39558 		// match: (EQ (InvertFlags cmp) yes no)
   39559 		// cond:
   39560 		// result: (EQ cmp yes no)
   39561 		for {
   39562 			v := b.Control
   39563 			if v.Op != OpS390XInvertFlags {
   39564 				break
   39565 			}
   39566 			cmp := v.Args[0]
   39567 			b.Kind = BlockS390XEQ
   39568 			b.SetControl(cmp)
   39569 			b.Aux = nil
   39570 			return true
   39571 		}
   39572 		// match: (EQ (FlagEQ) yes no)
   39573 		// cond:
   39574 		// result: (First nil yes no)
   39575 		for {
   39576 			v := b.Control
   39577 			if v.Op != OpS390XFlagEQ {
   39578 				break
   39579 			}
   39580 			b.Kind = BlockFirst
   39581 			b.SetControl(nil)
   39582 			b.Aux = nil
   39583 			return true
   39584 		}
   39585 		// match: (EQ (FlagLT) yes no)
   39586 		// cond:
   39587 		// result: (First nil no yes)
   39588 		for {
   39589 			v := b.Control
   39590 			if v.Op != OpS390XFlagLT {
   39591 				break
   39592 			}
   39593 			b.Kind = BlockFirst
   39594 			b.SetControl(nil)
   39595 			b.Aux = nil
   39596 			b.swapSuccessors()
   39597 			return true
   39598 		}
   39599 		// match: (EQ (FlagGT) yes no)
   39600 		// cond:
   39601 		// result: (First nil no yes)
   39602 		for {
   39603 			v := b.Control
   39604 			if v.Op != OpS390XFlagGT {
   39605 				break
   39606 			}
   39607 			b.Kind = BlockFirst
   39608 			b.SetControl(nil)
   39609 			b.Aux = nil
   39610 			b.swapSuccessors()
   39611 			return true
   39612 		}
   39613 	case BlockS390XGE:
   39614 		// match: (GE (InvertFlags cmp) yes no)
   39615 		// cond:
   39616 		// result: (LE cmp yes no)
   39617 		for {
   39618 			v := b.Control
   39619 			if v.Op != OpS390XInvertFlags {
   39620 				break
   39621 			}
   39622 			cmp := v.Args[0]
   39623 			b.Kind = BlockS390XLE
   39624 			b.SetControl(cmp)
   39625 			b.Aux = nil
   39626 			return true
   39627 		}
   39628 		// match: (GE (FlagEQ) yes no)
   39629 		// cond:
   39630 		// result: (First nil yes no)
   39631 		for {
   39632 			v := b.Control
   39633 			if v.Op != OpS390XFlagEQ {
   39634 				break
   39635 			}
   39636 			b.Kind = BlockFirst
   39637 			b.SetControl(nil)
   39638 			b.Aux = nil
   39639 			return true
   39640 		}
   39641 		// match: (GE (FlagLT) yes no)
   39642 		// cond:
   39643 		// result: (First nil no yes)
   39644 		for {
   39645 			v := b.Control
   39646 			if v.Op != OpS390XFlagLT {
   39647 				break
   39648 			}
   39649 			b.Kind = BlockFirst
   39650 			b.SetControl(nil)
   39651 			b.Aux = nil
   39652 			b.swapSuccessors()
   39653 			return true
   39654 		}
   39655 		// match: (GE (FlagGT) yes no)
   39656 		// cond:
   39657 		// result: (First nil yes no)
   39658 		for {
   39659 			v := b.Control
   39660 			if v.Op != OpS390XFlagGT {
   39661 				break
   39662 			}
   39663 			b.Kind = BlockFirst
   39664 			b.SetControl(nil)
   39665 			b.Aux = nil
   39666 			return true
   39667 		}
   39668 	case BlockS390XGT:
   39669 		// match: (GT (InvertFlags cmp) yes no)
   39670 		// cond:
   39671 		// result: (LT cmp yes no)
   39672 		for {
   39673 			v := b.Control
   39674 			if v.Op != OpS390XInvertFlags {
   39675 				break
   39676 			}
   39677 			cmp := v.Args[0]
   39678 			b.Kind = BlockS390XLT
   39679 			b.SetControl(cmp)
   39680 			b.Aux = nil
   39681 			return true
   39682 		}
   39683 		// match: (GT (FlagEQ) yes no)
   39684 		// cond:
   39685 		// result: (First nil no yes)
   39686 		for {
   39687 			v := b.Control
   39688 			if v.Op != OpS390XFlagEQ {
   39689 				break
   39690 			}
   39691 			b.Kind = BlockFirst
   39692 			b.SetControl(nil)
   39693 			b.Aux = nil
   39694 			b.swapSuccessors()
   39695 			return true
   39696 		}
   39697 		// match: (GT (FlagLT) yes no)
   39698 		// cond:
   39699 		// result: (First nil no yes)
   39700 		for {
   39701 			v := b.Control
   39702 			if v.Op != OpS390XFlagLT {
   39703 				break
   39704 			}
   39705 			b.Kind = BlockFirst
   39706 			b.SetControl(nil)
   39707 			b.Aux = nil
   39708 			b.swapSuccessors()
   39709 			return true
   39710 		}
   39711 		// match: (GT (FlagGT) yes no)
   39712 		// cond:
   39713 		// result: (First nil yes no)
   39714 		for {
   39715 			v := b.Control
   39716 			if v.Op != OpS390XFlagGT {
   39717 				break
   39718 			}
   39719 			b.Kind = BlockFirst
   39720 			b.SetControl(nil)
   39721 			b.Aux = nil
   39722 			return true
   39723 		}
   39724 	case BlockIf:
   39725 		// match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39726 		// cond:
   39727 		// result: (LT cmp yes no)
   39728 		for {
   39729 			v := b.Control
   39730 			if v.Op != OpS390XMOVDLT {
   39731 				break
   39732 			}
   39733 			_ = v.Args[2]
   39734 			v_0 := v.Args[0]
   39735 			if v_0.Op != OpS390XMOVDconst {
   39736 				break
   39737 			}
   39738 			if v_0.AuxInt != 0 {
   39739 				break
   39740 			}
   39741 			v_1 := v.Args[1]
   39742 			if v_1.Op != OpS390XMOVDconst {
   39743 				break
   39744 			}
   39745 			if v_1.AuxInt != 1 {
   39746 				break
   39747 			}
   39748 			cmp := v.Args[2]
   39749 			b.Kind = BlockS390XLT
   39750 			b.SetControl(cmp)
   39751 			b.Aux = nil
   39752 			return true
   39753 		}
   39754 		// match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39755 		// cond:
   39756 		// result: (LE cmp yes no)
   39757 		for {
   39758 			v := b.Control
   39759 			if v.Op != OpS390XMOVDLE {
   39760 				break
   39761 			}
   39762 			_ = v.Args[2]
   39763 			v_0 := v.Args[0]
   39764 			if v_0.Op != OpS390XMOVDconst {
   39765 				break
   39766 			}
   39767 			if v_0.AuxInt != 0 {
   39768 				break
   39769 			}
   39770 			v_1 := v.Args[1]
   39771 			if v_1.Op != OpS390XMOVDconst {
   39772 				break
   39773 			}
   39774 			if v_1.AuxInt != 1 {
   39775 				break
   39776 			}
   39777 			cmp := v.Args[2]
   39778 			b.Kind = BlockS390XLE
   39779 			b.SetControl(cmp)
   39780 			b.Aux = nil
   39781 			return true
   39782 		}
   39783 		// match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39784 		// cond:
   39785 		// result: (GT cmp yes no)
   39786 		for {
   39787 			v := b.Control
   39788 			if v.Op != OpS390XMOVDGT {
   39789 				break
   39790 			}
   39791 			_ = v.Args[2]
   39792 			v_0 := v.Args[0]
   39793 			if v_0.Op != OpS390XMOVDconst {
   39794 				break
   39795 			}
   39796 			if v_0.AuxInt != 0 {
   39797 				break
   39798 			}
   39799 			v_1 := v.Args[1]
   39800 			if v_1.Op != OpS390XMOVDconst {
   39801 				break
   39802 			}
   39803 			if v_1.AuxInt != 1 {
   39804 				break
   39805 			}
   39806 			cmp := v.Args[2]
   39807 			b.Kind = BlockS390XGT
   39808 			b.SetControl(cmp)
   39809 			b.Aux = nil
   39810 			return true
   39811 		}
   39812 		// match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39813 		// cond:
   39814 		// result: (GE cmp yes no)
   39815 		for {
   39816 			v := b.Control
   39817 			if v.Op != OpS390XMOVDGE {
   39818 				break
   39819 			}
   39820 			_ = v.Args[2]
   39821 			v_0 := v.Args[0]
   39822 			if v_0.Op != OpS390XMOVDconst {
   39823 				break
   39824 			}
   39825 			if v_0.AuxInt != 0 {
   39826 				break
   39827 			}
   39828 			v_1 := v.Args[1]
   39829 			if v_1.Op != OpS390XMOVDconst {
   39830 				break
   39831 			}
   39832 			if v_1.AuxInt != 1 {
   39833 				break
   39834 			}
   39835 			cmp := v.Args[2]
   39836 			b.Kind = BlockS390XGE
   39837 			b.SetControl(cmp)
   39838 			b.Aux = nil
   39839 			return true
   39840 		}
   39841 		// match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39842 		// cond:
   39843 		// result: (EQ cmp yes no)
   39844 		for {
   39845 			v := b.Control
   39846 			if v.Op != OpS390XMOVDEQ {
   39847 				break
   39848 			}
   39849 			_ = v.Args[2]
   39850 			v_0 := v.Args[0]
   39851 			if v_0.Op != OpS390XMOVDconst {
   39852 				break
   39853 			}
   39854 			if v_0.AuxInt != 0 {
   39855 				break
   39856 			}
   39857 			v_1 := v.Args[1]
   39858 			if v_1.Op != OpS390XMOVDconst {
   39859 				break
   39860 			}
   39861 			if v_1.AuxInt != 1 {
   39862 				break
   39863 			}
   39864 			cmp := v.Args[2]
   39865 			b.Kind = BlockS390XEQ
   39866 			b.SetControl(cmp)
   39867 			b.Aux = nil
   39868 			return true
   39869 		}
   39870 		// match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39871 		// cond:
   39872 		// result: (NE cmp yes no)
   39873 		for {
   39874 			v := b.Control
   39875 			if v.Op != OpS390XMOVDNE {
   39876 				break
   39877 			}
   39878 			_ = v.Args[2]
   39879 			v_0 := v.Args[0]
   39880 			if v_0.Op != OpS390XMOVDconst {
   39881 				break
   39882 			}
   39883 			if v_0.AuxInt != 0 {
   39884 				break
   39885 			}
   39886 			v_1 := v.Args[1]
   39887 			if v_1.Op != OpS390XMOVDconst {
   39888 				break
   39889 			}
   39890 			if v_1.AuxInt != 1 {
   39891 				break
   39892 			}
   39893 			cmp := v.Args[2]
   39894 			b.Kind = BlockS390XNE
   39895 			b.SetControl(cmp)
   39896 			b.Aux = nil
   39897 			return true
   39898 		}
   39899 		// match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39900 		// cond:
   39901 		// result: (GTF cmp yes no)
   39902 		for {
   39903 			v := b.Control
   39904 			if v.Op != OpS390XMOVDGTnoinv {
   39905 				break
   39906 			}
   39907 			_ = v.Args[2]
   39908 			v_0 := v.Args[0]
   39909 			if v_0.Op != OpS390XMOVDconst {
   39910 				break
   39911 			}
   39912 			if v_0.AuxInt != 0 {
   39913 				break
   39914 			}
   39915 			v_1 := v.Args[1]
   39916 			if v_1.Op != OpS390XMOVDconst {
   39917 				break
   39918 			}
   39919 			if v_1.AuxInt != 1 {
   39920 				break
   39921 			}
   39922 			cmp := v.Args[2]
   39923 			b.Kind = BlockS390XGTF
   39924 			b.SetControl(cmp)
   39925 			b.Aux = nil
   39926 			return true
   39927 		}
   39928 		// match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no)
   39929 		// cond:
   39930 		// result: (GEF cmp yes no)
   39931 		for {
   39932 			v := b.Control
   39933 			if v.Op != OpS390XMOVDGEnoinv {
   39934 				break
   39935 			}
   39936 			_ = v.Args[2]
   39937 			v_0 := v.Args[0]
   39938 			if v_0.Op != OpS390XMOVDconst {
   39939 				break
   39940 			}
   39941 			if v_0.AuxInt != 0 {
   39942 				break
   39943 			}
   39944 			v_1 := v.Args[1]
   39945 			if v_1.Op != OpS390XMOVDconst {
   39946 				break
   39947 			}
   39948 			if v_1.AuxInt != 1 {
   39949 				break
   39950 			}
   39951 			cmp := v.Args[2]
   39952 			b.Kind = BlockS390XGEF
   39953 			b.SetControl(cmp)
   39954 			b.Aux = nil
   39955 			return true
   39956 		}
   39957 		// match: (If cond yes no)
   39958 		// cond:
   39959 		// result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no)
   39960 		for {
   39961 			v := b.Control
   39962 			_ = v
   39963 			cond := b.Control
   39964 			b.Kind = BlockS390XNE
   39965 			v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags)
   39966 			v0.AuxInt = 0
   39967 			v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool)
   39968 			v1.AddArg(cond)
   39969 			v0.AddArg(v1)
   39970 			b.SetControl(v0)
   39971 			b.Aux = nil
   39972 			return true
   39973 		}
   39974 	case BlockS390XLE:
   39975 		// match: (LE (InvertFlags cmp) yes no)
   39976 		// cond:
   39977 		// result: (GE cmp yes no)
   39978 		for {
   39979 			v := b.Control
   39980 			if v.Op != OpS390XInvertFlags {
   39981 				break
   39982 			}
   39983 			cmp := v.Args[0]
   39984 			b.Kind = BlockS390XGE
   39985 			b.SetControl(cmp)
   39986 			b.Aux = nil
   39987 			return true
   39988 		}
   39989 		// match: (LE (FlagEQ) yes no)
   39990 		// cond:
   39991 		// result: (First nil yes no)
   39992 		for {
   39993 			v := b.Control
   39994 			if v.Op != OpS390XFlagEQ {
   39995 				break
   39996 			}
   39997 			b.Kind = BlockFirst
   39998 			b.SetControl(nil)
   39999 			b.Aux = nil
   40000 			return true
   40001 		}
   40002 		// match: (LE (FlagLT) yes no)
   40003 		// cond:
   40004 		// result: (First nil yes no)
   40005 		for {
   40006 			v := b.Control
   40007 			if v.Op != OpS390XFlagLT {
   40008 				break
   40009 			}
   40010 			b.Kind = BlockFirst
   40011 			b.SetControl(nil)
   40012 			b.Aux = nil
   40013 			return true
   40014 		}
   40015 		// match: (LE (FlagGT) yes no)
   40016 		// cond:
   40017 		// result: (First nil no yes)
   40018 		for {
   40019 			v := b.Control
   40020 			if v.Op != OpS390XFlagGT {
   40021 				break
   40022 			}
   40023 			b.Kind = BlockFirst
   40024 			b.SetControl(nil)
   40025 			b.Aux = nil
   40026 			b.swapSuccessors()
   40027 			return true
   40028 		}
   40029 	case BlockS390XLT:
   40030 		// match: (LT (InvertFlags cmp) yes no)
   40031 		// cond:
   40032 		// result: (GT cmp yes no)
   40033 		for {
   40034 			v := b.Control
   40035 			if v.Op != OpS390XInvertFlags {
   40036 				break
   40037 			}
   40038 			cmp := v.Args[0]
   40039 			b.Kind = BlockS390XGT
   40040 			b.SetControl(cmp)
   40041 			b.Aux = nil
   40042 			return true
   40043 		}
   40044 		// match: (LT (FlagEQ) yes no)
   40045 		// cond:
   40046 		// result: (First nil no yes)
   40047 		for {
   40048 			v := b.Control
   40049 			if v.Op != OpS390XFlagEQ {
   40050 				break
   40051 			}
   40052 			b.Kind = BlockFirst
   40053 			b.SetControl(nil)
   40054 			b.Aux = nil
   40055 			b.swapSuccessors()
   40056 			return true
   40057 		}
   40058 		// match: (LT (FlagLT) yes no)
   40059 		// cond:
   40060 		// result: (First nil yes no)
   40061 		for {
   40062 			v := b.Control
   40063 			if v.Op != OpS390XFlagLT {
   40064 				break
   40065 			}
   40066 			b.Kind = BlockFirst
   40067 			b.SetControl(nil)
   40068 			b.Aux = nil
   40069 			return true
   40070 		}
   40071 		// match: (LT (FlagGT) yes no)
   40072 		// cond:
   40073 		// result: (First nil no yes)
   40074 		for {
   40075 			v := b.Control
   40076 			if v.Op != OpS390XFlagGT {
   40077 				break
   40078 			}
   40079 			b.Kind = BlockFirst
   40080 			b.SetControl(nil)
   40081 			b.Aux = nil
   40082 			b.swapSuccessors()
   40083 			return true
   40084 		}
   40085 	case BlockS390XNE:
   40086 		// match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40087 		// cond:
   40088 		// result: (LT cmp yes no)
   40089 		for {
   40090 			v := b.Control
   40091 			if v.Op != OpS390XCMPWconst {
   40092 				break
   40093 			}
   40094 			if v.AuxInt != 0 {
   40095 				break
   40096 			}
   40097 			v_0 := v.Args[0]
   40098 			if v_0.Op != OpS390XMOVDLT {
   40099 				break
   40100 			}
   40101 			_ = v_0.Args[2]
   40102 			v_0_0 := v_0.Args[0]
   40103 			if v_0_0.Op != OpS390XMOVDconst {
   40104 				break
   40105 			}
   40106 			if v_0_0.AuxInt != 0 {
   40107 				break
   40108 			}
   40109 			v_0_1 := v_0.Args[1]
   40110 			if v_0_1.Op != OpS390XMOVDconst {
   40111 				break
   40112 			}
   40113 			if v_0_1.AuxInt != 1 {
   40114 				break
   40115 			}
   40116 			cmp := v_0.Args[2]
   40117 			b.Kind = BlockS390XLT
   40118 			b.SetControl(cmp)
   40119 			b.Aux = nil
   40120 			return true
   40121 		}
   40122 		// match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40123 		// cond:
   40124 		// result: (LE cmp yes no)
   40125 		for {
   40126 			v := b.Control
   40127 			if v.Op != OpS390XCMPWconst {
   40128 				break
   40129 			}
   40130 			if v.AuxInt != 0 {
   40131 				break
   40132 			}
   40133 			v_0 := v.Args[0]
   40134 			if v_0.Op != OpS390XMOVDLE {
   40135 				break
   40136 			}
   40137 			_ = v_0.Args[2]
   40138 			v_0_0 := v_0.Args[0]
   40139 			if v_0_0.Op != OpS390XMOVDconst {
   40140 				break
   40141 			}
   40142 			if v_0_0.AuxInt != 0 {
   40143 				break
   40144 			}
   40145 			v_0_1 := v_0.Args[1]
   40146 			if v_0_1.Op != OpS390XMOVDconst {
   40147 				break
   40148 			}
   40149 			if v_0_1.AuxInt != 1 {
   40150 				break
   40151 			}
   40152 			cmp := v_0.Args[2]
   40153 			b.Kind = BlockS390XLE
   40154 			b.SetControl(cmp)
   40155 			b.Aux = nil
   40156 			return true
   40157 		}
   40158 		// match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40159 		// cond:
   40160 		// result: (GT cmp yes no)
   40161 		for {
   40162 			v := b.Control
   40163 			if v.Op != OpS390XCMPWconst {
   40164 				break
   40165 			}
   40166 			if v.AuxInt != 0 {
   40167 				break
   40168 			}
   40169 			v_0 := v.Args[0]
   40170 			if v_0.Op != OpS390XMOVDGT {
   40171 				break
   40172 			}
   40173 			_ = v_0.Args[2]
   40174 			v_0_0 := v_0.Args[0]
   40175 			if v_0_0.Op != OpS390XMOVDconst {
   40176 				break
   40177 			}
   40178 			if v_0_0.AuxInt != 0 {
   40179 				break
   40180 			}
   40181 			v_0_1 := v_0.Args[1]
   40182 			if v_0_1.Op != OpS390XMOVDconst {
   40183 				break
   40184 			}
   40185 			if v_0_1.AuxInt != 1 {
   40186 				break
   40187 			}
   40188 			cmp := v_0.Args[2]
   40189 			b.Kind = BlockS390XGT
   40190 			b.SetControl(cmp)
   40191 			b.Aux = nil
   40192 			return true
   40193 		}
   40194 		// match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40195 		// cond:
   40196 		// result: (GE cmp yes no)
   40197 		for {
   40198 			v := b.Control
   40199 			if v.Op != OpS390XCMPWconst {
   40200 				break
   40201 			}
   40202 			if v.AuxInt != 0 {
   40203 				break
   40204 			}
   40205 			v_0 := v.Args[0]
   40206 			if v_0.Op != OpS390XMOVDGE {
   40207 				break
   40208 			}
   40209 			_ = v_0.Args[2]
   40210 			v_0_0 := v_0.Args[0]
   40211 			if v_0_0.Op != OpS390XMOVDconst {
   40212 				break
   40213 			}
   40214 			if v_0_0.AuxInt != 0 {
   40215 				break
   40216 			}
   40217 			v_0_1 := v_0.Args[1]
   40218 			if v_0_1.Op != OpS390XMOVDconst {
   40219 				break
   40220 			}
   40221 			if v_0_1.AuxInt != 1 {
   40222 				break
   40223 			}
   40224 			cmp := v_0.Args[2]
   40225 			b.Kind = BlockS390XGE
   40226 			b.SetControl(cmp)
   40227 			b.Aux = nil
   40228 			return true
   40229 		}
   40230 		// match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40231 		// cond:
   40232 		// result: (EQ cmp yes no)
   40233 		for {
   40234 			v := b.Control
   40235 			if v.Op != OpS390XCMPWconst {
   40236 				break
   40237 			}
   40238 			if v.AuxInt != 0 {
   40239 				break
   40240 			}
   40241 			v_0 := v.Args[0]
   40242 			if v_0.Op != OpS390XMOVDEQ {
   40243 				break
   40244 			}
   40245 			_ = v_0.Args[2]
   40246 			v_0_0 := v_0.Args[0]
   40247 			if v_0_0.Op != OpS390XMOVDconst {
   40248 				break
   40249 			}
   40250 			if v_0_0.AuxInt != 0 {
   40251 				break
   40252 			}
   40253 			v_0_1 := v_0.Args[1]
   40254 			if v_0_1.Op != OpS390XMOVDconst {
   40255 				break
   40256 			}
   40257 			if v_0_1.AuxInt != 1 {
   40258 				break
   40259 			}
   40260 			cmp := v_0.Args[2]
   40261 			b.Kind = BlockS390XEQ
   40262 			b.SetControl(cmp)
   40263 			b.Aux = nil
   40264 			return true
   40265 		}
   40266 		// match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40267 		// cond:
   40268 		// result: (NE cmp yes no)
   40269 		for {
   40270 			v := b.Control
   40271 			if v.Op != OpS390XCMPWconst {
   40272 				break
   40273 			}
   40274 			if v.AuxInt != 0 {
   40275 				break
   40276 			}
   40277 			v_0 := v.Args[0]
   40278 			if v_0.Op != OpS390XMOVDNE {
   40279 				break
   40280 			}
   40281 			_ = v_0.Args[2]
   40282 			v_0_0 := v_0.Args[0]
   40283 			if v_0_0.Op != OpS390XMOVDconst {
   40284 				break
   40285 			}
   40286 			if v_0_0.AuxInt != 0 {
   40287 				break
   40288 			}
   40289 			v_0_1 := v_0.Args[1]
   40290 			if v_0_1.Op != OpS390XMOVDconst {
   40291 				break
   40292 			}
   40293 			if v_0_1.AuxInt != 1 {
   40294 				break
   40295 			}
   40296 			cmp := v_0.Args[2]
   40297 			b.Kind = BlockS390XNE
   40298 			b.SetControl(cmp)
   40299 			b.Aux = nil
   40300 			return true
   40301 		}
   40302 		// match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40303 		// cond:
   40304 		// result: (GTF cmp yes no)
   40305 		for {
   40306 			v := b.Control
   40307 			if v.Op != OpS390XCMPWconst {
   40308 				break
   40309 			}
   40310 			if v.AuxInt != 0 {
   40311 				break
   40312 			}
   40313 			v_0 := v.Args[0]
   40314 			if v_0.Op != OpS390XMOVDGTnoinv {
   40315 				break
   40316 			}
   40317 			_ = v_0.Args[2]
   40318 			v_0_0 := v_0.Args[0]
   40319 			if v_0_0.Op != OpS390XMOVDconst {
   40320 				break
   40321 			}
   40322 			if v_0_0.AuxInt != 0 {
   40323 				break
   40324 			}
   40325 			v_0_1 := v_0.Args[1]
   40326 			if v_0_1.Op != OpS390XMOVDconst {
   40327 				break
   40328 			}
   40329 			if v_0_1.AuxInt != 1 {
   40330 				break
   40331 			}
   40332 			cmp := v_0.Args[2]
   40333 			b.Kind = BlockS390XGTF
   40334 			b.SetControl(cmp)
   40335 			b.Aux = nil
   40336 			return true
   40337 		}
   40338 		// match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no)
   40339 		// cond:
   40340 		// result: (GEF cmp yes no)
   40341 		for {
   40342 			v := b.Control
   40343 			if v.Op != OpS390XCMPWconst {
   40344 				break
   40345 			}
   40346 			if v.AuxInt != 0 {
   40347 				break
   40348 			}
   40349 			v_0 := v.Args[0]
   40350 			if v_0.Op != OpS390XMOVDGEnoinv {
   40351 				break
   40352 			}
   40353 			_ = v_0.Args[2]
   40354 			v_0_0 := v_0.Args[0]
   40355 			if v_0_0.Op != OpS390XMOVDconst {
   40356 				break
   40357 			}
   40358 			if v_0_0.AuxInt != 0 {
   40359 				break
   40360 			}
   40361 			v_0_1 := v_0.Args[1]
   40362 			if v_0_1.Op != OpS390XMOVDconst {
   40363 				break
   40364 			}
   40365 			if v_0_1.AuxInt != 1 {
   40366 				break
   40367 			}
   40368 			cmp := v_0.Args[2]
   40369 			b.Kind = BlockS390XGEF
   40370 			b.SetControl(cmp)
   40371 			b.Aux = nil
   40372 			return true
   40373 		}
   40374 		// match: (NE (InvertFlags cmp) yes no)
   40375 		// cond:
   40376 		// result: (NE cmp yes no)
   40377 		for {
   40378 			v := b.Control
   40379 			if v.Op != OpS390XInvertFlags {
   40380 				break
   40381 			}
   40382 			cmp := v.Args[0]
   40383 			b.Kind = BlockS390XNE
   40384 			b.SetControl(cmp)
   40385 			b.Aux = nil
   40386 			return true
   40387 		}
   40388 		// match: (NE (FlagEQ) yes no)
   40389 		// cond:
   40390 		// result: (First nil no yes)
   40391 		for {
   40392 			v := b.Control
   40393 			if v.Op != OpS390XFlagEQ {
   40394 				break
   40395 			}
   40396 			b.Kind = BlockFirst
   40397 			b.SetControl(nil)
   40398 			b.Aux = nil
   40399 			b.swapSuccessors()
   40400 			return true
   40401 		}
   40402 		// match: (NE (FlagLT) yes no)
   40403 		// cond:
   40404 		// result: (First nil yes no)
   40405 		for {
   40406 			v := b.Control
   40407 			if v.Op != OpS390XFlagLT {
   40408 				break
   40409 			}
   40410 			b.Kind = BlockFirst
   40411 			b.SetControl(nil)
   40412 			b.Aux = nil
   40413 			return true
   40414 		}
   40415 		// match: (NE (FlagGT) yes no)
   40416 		// cond:
   40417 		// result: (First nil yes no)
   40418 		for {
   40419 			v := b.Control
   40420 			if v.Op != OpS390XFlagGT {
   40421 				break
   40422 			}
   40423 			b.Kind = BlockFirst
   40424 			b.SetControl(nil)
   40425 			b.Aux = nil
   40426 			return true
   40427 		}
   40428 	}
   40429 	return false
   40430 }
   40431