Source file src/cmd/compile/internal/ssa/rewriteS390X.go

Documentation: cmd/compile/internal/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 "fmt"
     7  import "math"
     8  import "cmd/internal/obj"
     9  import "cmd/internal/objabi"
    10  import "cmd/compile/internal/types"
    11  
    12  var _ = fmt.Println   // in case not otherwise used
    13  var _ = math.MinInt8  // in case not otherwise used
    14  var _ = obj.ANOP      // in case not otherwise used
    15  var _ = objabi.GOROOT // in case not otherwise used
    16  var _ = types.TypeMem // in case not otherwise used
    17  
    18  func rewriteValueS390X(v *Value) bool {
    19  	switch v.Op {
    20  	case OpAdd16:
    21  		return rewriteValueS390X_OpAdd16_0(v)
    22  	case OpAdd32:
    23  		return rewriteValueS390X_OpAdd32_0(v)
    24  	case OpAdd32F:
    25  		return rewriteValueS390X_OpAdd32F_0(v)
    26  	case OpAdd64:
    27  		return rewriteValueS390X_OpAdd64_0(v)
    28  	case OpAdd64F:
    29  		return rewriteValueS390X_OpAdd64F_0(v)
    30  	case OpAdd8:
    31  		return rewriteValueS390X_OpAdd8_0(v)
    32  	case OpAddPtr:
    33  		return rewriteValueS390X_OpAddPtr_0(v)
    34  	case OpAddr:
    35  		return rewriteValueS390X_OpAddr_0(v)
    36  	case OpAnd16:
    37  		return rewriteValueS390X_OpAnd16_0(v)
    38  	case OpAnd32:
    39  		return rewriteValueS390X_OpAnd32_0(v)
    40  	case OpAnd64:
    41  		return rewriteValueS390X_OpAnd64_0(v)
    42  	case OpAnd8:
    43  		return rewriteValueS390X_OpAnd8_0(v)
    44  	case OpAndB:
    45  		return rewriteValueS390X_OpAndB_0(v)
    46  	case OpAtomicAdd32:
    47  		return rewriteValueS390X_OpAtomicAdd32_0(v)
    48  	case OpAtomicAdd64:
    49  		return rewriteValueS390X_OpAtomicAdd64_0(v)
    50  	case OpAtomicCompareAndSwap32:
    51  		return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v)
    52  	case OpAtomicCompareAndSwap64:
    53  		return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v)
    54  	case OpAtomicExchange32:
    55  		return rewriteValueS390X_OpAtomicExchange32_0(v)
    56  	case OpAtomicExchange64:
    57  		return rewriteValueS390X_OpAtomicExchange64_0(v)
    58  	case OpAtomicLoad32:
    59  		return rewriteValueS390X_OpAtomicLoad32_0(v)
    60  	case OpAtomicLoad64:
    61  		return rewriteValueS390X_OpAtomicLoad64_0(v)
    62  	case OpAtomicLoad8:
    63  		return rewriteValueS390X_OpAtomicLoad8_0(v)
    64  	case OpAtomicLoadAcq32:
    65  		return rewriteValueS390X_OpAtomicLoadAcq32_0(v)
    66  	case OpAtomicLoadPtr:
    67  		return rewriteValueS390X_OpAtomicLoadPtr_0(v)
    68  	case OpAtomicStore32:
    69  		return rewriteValueS390X_OpAtomicStore32_0(v)
    70  	case OpAtomicStore64:
    71  		return rewriteValueS390X_OpAtomicStore64_0(v)
    72  	case OpAtomicStorePtrNoWB:
    73  		return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v)
    74  	case OpAtomicStoreRel32:
    75  		return rewriteValueS390X_OpAtomicStoreRel32_0(v)
    76  	case OpAvg64u:
    77  		return rewriteValueS390X_OpAvg64u_0(v)
    78  	case OpBitLen64:
    79  		return rewriteValueS390X_OpBitLen64_0(v)
    80  	case OpBswap32:
    81  		return rewriteValueS390X_OpBswap32_0(v)
    82  	case OpBswap64:
    83  		return rewriteValueS390X_OpBswap64_0(v)
    84  	case OpCeil:
    85  		return rewriteValueS390X_OpCeil_0(v)
    86  	case OpClosureCall:
    87  		return rewriteValueS390X_OpClosureCall_0(v)
    88  	case OpCom16:
    89  		return rewriteValueS390X_OpCom16_0(v)
    90  	case OpCom32:
    91  		return rewriteValueS390X_OpCom32_0(v)
    92  	case OpCom64:
    93  		return rewriteValueS390X_OpCom64_0(v)
    94  	case OpCom8:
    95  		return rewriteValueS390X_OpCom8_0(v)
    96  	case OpConst16:
    97  		return rewriteValueS390X_OpConst16_0(v)
    98  	case OpConst32:
    99  		return rewriteValueS390X_OpConst32_0(v)
   100  	case OpConst32F:
   101  		return rewriteValueS390X_OpConst32F_0(v)
   102  	case OpConst64:
   103  		return rewriteValueS390X_OpConst64_0(v)
   104  	case OpConst64F:
   105  		return rewriteValueS390X_OpConst64F_0(v)
   106  	case OpConst8:
   107  		return rewriteValueS390X_OpConst8_0(v)
   108  	case OpConstBool:
   109  		return rewriteValueS390X_OpConstBool_0(v)
   110  	case OpConstNil:
   111  		return rewriteValueS390X_OpConstNil_0(v)
   112  	case OpCtz32:
   113  		return rewriteValueS390X_OpCtz32_0(v)
   114  	case OpCtz32NonZero:
   115  		return rewriteValueS390X_OpCtz32NonZero_0(v)
   116  	case OpCtz64:
   117  		return rewriteValueS390X_OpCtz64_0(v)
   118  	case OpCtz64NonZero:
   119  		return rewriteValueS390X_OpCtz64NonZero_0(v)
   120  	case OpCvt32Fto32:
   121  		return rewriteValueS390X_OpCvt32Fto32_0(v)
   122  	case OpCvt32Fto64:
   123  		return rewriteValueS390X_OpCvt32Fto64_0(v)
   124  	case OpCvt32Fto64F:
   125  		return rewriteValueS390X_OpCvt32Fto64F_0(v)
   126  	case OpCvt32to32F:
   127  		return rewriteValueS390X_OpCvt32to32F_0(v)
   128  	case OpCvt32to64F:
   129  		return rewriteValueS390X_OpCvt32to64F_0(v)
   130  	case OpCvt64Fto32:
   131  		return rewriteValueS390X_OpCvt64Fto32_0(v)
   132  	case OpCvt64Fto32F:
   133  		return rewriteValueS390X_OpCvt64Fto32F_0(v)
   134  	case OpCvt64Fto64:
   135  		return rewriteValueS390X_OpCvt64Fto64_0(v)
   136  	case OpCvt64to32F:
   137  		return rewriteValueS390X_OpCvt64to32F_0(v)
   138  	case OpCvt64to64F:
   139  		return rewriteValueS390X_OpCvt64to64F_0(v)
   140  	case OpDiv16:
   141  		return rewriteValueS390X_OpDiv16_0(v)
   142  	case OpDiv16u:
   143  		return rewriteValueS390X_OpDiv16u_0(v)
   144  	case OpDiv32:
   145  		return rewriteValueS390X_OpDiv32_0(v)
   146  	case OpDiv32F:
   147  		return rewriteValueS390X_OpDiv32F_0(v)
   148  	case OpDiv32u:
   149  		return rewriteValueS390X_OpDiv32u_0(v)
   150  	case OpDiv64:
   151  		return rewriteValueS390X_OpDiv64_0(v)
   152  	case OpDiv64F:
   153  		return rewriteValueS390X_OpDiv64F_0(v)
   154  	case OpDiv64u:
   155  		return rewriteValueS390X_OpDiv64u_0(v)
   156  	case OpDiv8:
   157  		return rewriteValueS390X_OpDiv8_0(v)
   158  	case OpDiv8u:
   159  		return rewriteValueS390X_OpDiv8u_0(v)
   160  	case OpEq16:
   161  		return rewriteValueS390X_OpEq16_0(v)
   162  	case OpEq32:
   163  		return rewriteValueS390X_OpEq32_0(v)
   164  	case OpEq32F:
   165  		return rewriteValueS390X_OpEq32F_0(v)
   166  	case OpEq64:
   167  		return rewriteValueS390X_OpEq64_0(v)
   168  	case OpEq64F:
   169  		return rewriteValueS390X_OpEq64F_0(v)
   170  	case OpEq8:
   171  		return rewriteValueS390X_OpEq8_0(v)
   172  	case OpEqB:
   173  		return rewriteValueS390X_OpEqB_0(v)
   174  	case OpEqPtr:
   175  		return rewriteValueS390X_OpEqPtr_0(v)
   176  	case OpFloor:
   177  		return rewriteValueS390X_OpFloor_0(v)
   178  	case OpGeq16:
   179  		return rewriteValueS390X_OpGeq16_0(v)
   180  	case OpGeq16U:
   181  		return rewriteValueS390X_OpGeq16U_0(v)
   182  	case OpGeq32:
   183  		return rewriteValueS390X_OpGeq32_0(v)
   184  	case OpGeq32F:
   185  		return rewriteValueS390X_OpGeq32F_0(v)
   186  	case OpGeq32U:
   187  		return rewriteValueS390X_OpGeq32U_0(v)
   188  	case OpGeq64:
   189  		return rewriteValueS390X_OpGeq64_0(v)
   190  	case OpGeq64F:
   191  		return rewriteValueS390X_OpGeq64F_0(v)
   192  	case OpGeq64U:
   193  		return rewriteValueS390X_OpGeq64U_0(v)
   194  	case OpGeq8:
   195  		return rewriteValueS390X_OpGeq8_0(v)
   196  	case OpGeq8U:
   197  		return rewriteValueS390X_OpGeq8U_0(v)
   198  	case OpGetCallerPC:
   199  		return rewriteValueS390X_OpGetCallerPC_0(v)
   200  	case OpGetCallerSP:
   201  		return rewriteValueS390X_OpGetCallerSP_0(v)
   202  	case OpGetClosurePtr:
   203  		return rewriteValueS390X_OpGetClosurePtr_0(v)
   204  	case OpGetG:
   205  		return rewriteValueS390X_OpGetG_0(v)
   206  	case OpGreater16:
   207  		return rewriteValueS390X_OpGreater16_0(v)
   208  	case OpGreater16U:
   209  		return rewriteValueS390X_OpGreater16U_0(v)
   210  	case OpGreater32:
   211  		return rewriteValueS390X_OpGreater32_0(v)
   212  	case OpGreater32F:
   213  		return rewriteValueS390X_OpGreater32F_0(v)
   214  	case OpGreater32U:
   215  		return rewriteValueS390X_OpGreater32U_0(v)
   216  	case OpGreater64:
   217  		return rewriteValueS390X_OpGreater64_0(v)
   218  	case OpGreater64F:
   219  		return rewriteValueS390X_OpGreater64F_0(v)
   220  	case OpGreater64U:
   221  		return rewriteValueS390X_OpGreater64U_0(v)
   222  	case OpGreater8:
   223  		return rewriteValueS390X_OpGreater8_0(v)
   224  	case OpGreater8U:
   225  		return rewriteValueS390X_OpGreater8U_0(v)
   226  	case OpHmul32:
   227  		return rewriteValueS390X_OpHmul32_0(v)
   228  	case OpHmul32u:
   229  		return rewriteValueS390X_OpHmul32u_0(v)
   230  	case OpHmul64:
   231  		return rewriteValueS390X_OpHmul64_0(v)
   232  	case OpHmul64u:
   233  		return rewriteValueS390X_OpHmul64u_0(v)
   234  	case OpITab:
   235  		return rewriteValueS390X_OpITab_0(v)
   236  	case OpInterCall:
   237  		return rewriteValueS390X_OpInterCall_0(v)
   238  	case OpIsInBounds:
   239  		return rewriteValueS390X_OpIsInBounds_0(v)
   240  	case OpIsNonNil:
   241  		return rewriteValueS390X_OpIsNonNil_0(v)
   242  	case OpIsSliceInBounds:
   243  		return rewriteValueS390X_OpIsSliceInBounds_0(v)
   244  	case OpLeq16:
   245  		return rewriteValueS390X_OpLeq16_0(v)
   246  	case OpLeq16U:
   247  		return rewriteValueS390X_OpLeq16U_0(v)
   248  	case OpLeq32:
   249  		return rewriteValueS390X_OpLeq32_0(v)
   250  	case OpLeq32F:
   251  		return rewriteValueS390X_OpLeq32F_0(v)
   252  	case OpLeq32U:
   253  		return rewriteValueS390X_OpLeq32U_0(v)
   254  	case OpLeq64:
   255  		return rewriteValueS390X_OpLeq64_0(v)
   256  	case OpLeq64F:
   257  		return rewriteValueS390X_OpLeq64F_0(v)
   258  	case OpLeq64U:
   259  		return rewriteValueS390X_OpLeq64U_0(v)
   260  	case OpLeq8:
   261  		return rewriteValueS390X_OpLeq8_0(v)
   262  	case OpLeq8U:
   263  		return rewriteValueS390X_OpLeq8U_0(v)
   264  	case OpLess16:
   265  		return rewriteValueS390X_OpLess16_0(v)
   266  	case OpLess16U:
   267  		return rewriteValueS390X_OpLess16U_0(v)
   268  	case OpLess32:
   269  		return rewriteValueS390X_OpLess32_0(v)
   270  	case OpLess32F:
   271  		return rewriteValueS390X_OpLess32F_0(v)
   272  	case OpLess32U:
   273  		return rewriteValueS390X_OpLess32U_0(v)
   274  	case OpLess64:
   275  		return rewriteValueS390X_OpLess64_0(v)
   276  	case OpLess64F:
   277  		return rewriteValueS390X_OpLess64F_0(v)
   278  	case OpLess64U:
   279  		return rewriteValueS390X_OpLess64U_0(v)
   280  	case OpLess8:
   281  		return rewriteValueS390X_OpLess8_0(v)
   282  	case OpLess8U:
   283  		return rewriteValueS390X_OpLess8U_0(v)
   284  	case OpLoad:
   285  		return rewriteValueS390X_OpLoad_0(v)
   286  	case OpLocalAddr:
   287  		return rewriteValueS390X_OpLocalAddr_0(v)
   288  	case OpLsh16x16:
   289  		return rewriteValueS390X_OpLsh16x16_0(v)
   290  	case OpLsh16x32:
   291  		return rewriteValueS390X_OpLsh16x32_0(v)
   292  	case OpLsh16x64:
   293  		return rewriteValueS390X_OpLsh16x64_0(v)
   294  	case OpLsh16x8:
   295  		return rewriteValueS390X_OpLsh16x8_0(v)
   296  	case OpLsh32x16:
   297  		return rewriteValueS390X_OpLsh32x16_0(v)
   298  	case OpLsh32x32:
   299  		return rewriteValueS390X_OpLsh32x32_0(v)
   300  	case OpLsh32x64:
   301  		return rewriteValueS390X_OpLsh32x64_0(v)
   302  	case OpLsh32x8:
   303  		return rewriteValueS390X_OpLsh32x8_0(v)
   304  	case OpLsh64x16:
   305  		return rewriteValueS390X_OpLsh64x16_0(v)
   306  	case OpLsh64x32:
   307  		return rewriteValueS390X_OpLsh64x32_0(v)
   308  	case OpLsh64x64:
   309  		return rewriteValueS390X_OpLsh64x64_0(v)
   310  	case OpLsh64x8:
   311  		return rewriteValueS390X_OpLsh64x8_0(v)
   312  	case OpLsh8x16:
   313  		return rewriteValueS390X_OpLsh8x16_0(v)
   314  	case OpLsh8x32:
   315  		return rewriteValueS390X_OpLsh8x32_0(v)
   316  	case OpLsh8x64:
   317  		return rewriteValueS390X_OpLsh8x64_0(v)
   318  	case OpLsh8x8:
   319  		return rewriteValueS390X_OpLsh8x8_0(v)
   320  	case OpMod16:
   321  		return rewriteValueS390X_OpMod16_0(v)
   322  	case OpMod16u:
   323  		return rewriteValueS390X_OpMod16u_0(v)
   324  	case OpMod32:
   325  		return rewriteValueS390X_OpMod32_0(v)
   326  	case OpMod32u:
   327  		return rewriteValueS390X_OpMod32u_0(v)
   328  	case OpMod64:
   329  		return rewriteValueS390X_OpMod64_0(v)
   330  	case OpMod64u:
   331  		return rewriteValueS390X_OpMod64u_0(v)
   332  	case OpMod8:
   333  		return rewriteValueS390X_OpMod8_0(v)
   334  	case OpMod8u:
   335  		return rewriteValueS390X_OpMod8u_0(v)
   336  	case OpMove:
   337  		return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v)
   338  	case OpMul16:
   339  		return rewriteValueS390X_OpMul16_0(v)
   340  	case OpMul32:
   341  		return rewriteValueS390X_OpMul32_0(v)
   342  	case OpMul32F:
   343  		return rewriteValueS390X_OpMul32F_0(v)
   344  	case OpMul64:
   345  		return rewriteValueS390X_OpMul64_0(v)
   346  	case OpMul64F:
   347  		return rewriteValueS390X_OpMul64F_0(v)
   348  	case OpMul8:
   349  		return rewriteValueS390X_OpMul8_0(v)
   350  	case OpNeg16:
   351  		return rewriteValueS390X_OpNeg16_0(v)
   352  	case OpNeg32:
   353  		return rewriteValueS390X_OpNeg32_0(v)
   354  	case OpNeg32F:
   355  		return rewriteValueS390X_OpNeg32F_0(v)
   356  	case OpNeg64:
   357  		return rewriteValueS390X_OpNeg64_0(v)
   358  	case OpNeg64F:
   359  		return rewriteValueS390X_OpNeg64F_0(v)
   360  	case OpNeg8:
   361  		return rewriteValueS390X_OpNeg8_0(v)
   362  	case OpNeq16:
   363  		return rewriteValueS390X_OpNeq16_0(v)
   364  	case OpNeq32:
   365  		return rewriteValueS390X_OpNeq32_0(v)
   366  	case OpNeq32F:
   367  		return rewriteValueS390X_OpNeq32F_0(v)
   368  	case OpNeq64:
   369  		return rewriteValueS390X_OpNeq64_0(v)
   370  	case OpNeq64F:
   371  		return rewriteValueS390X_OpNeq64F_0(v)
   372  	case OpNeq8:
   373  		return rewriteValueS390X_OpNeq8_0(v)
   374  	case OpNeqB:
   375  		return rewriteValueS390X_OpNeqB_0(v)
   376  	case OpNeqPtr:
   377  		return rewriteValueS390X_OpNeqPtr_0(v)
   378  	case OpNilCheck:
   379  		return rewriteValueS390X_OpNilCheck_0(v)
   380  	case OpNot:
   381  		return rewriteValueS390X_OpNot_0(v)
   382  	case OpOffPtr:
   383  		return rewriteValueS390X_OpOffPtr_0(v)
   384  	case OpOr16:
   385  		return rewriteValueS390X_OpOr16_0(v)
   386  	case OpOr32:
   387  		return rewriteValueS390X_OpOr32_0(v)
   388  	case OpOr64:
   389  		return rewriteValueS390X_OpOr64_0(v)
   390  	case OpOr8:
   391  		return rewriteValueS390X_OpOr8_0(v)
   392  	case OpOrB:
   393  		return rewriteValueS390X_OpOrB_0(v)
   394  	case OpPanicBounds:
   395  		return rewriteValueS390X_OpPanicBounds_0(v)
   396  	case OpPopCount16:
   397  		return rewriteValueS390X_OpPopCount16_0(v)
   398  	case OpPopCount32:
   399  		return rewriteValueS390X_OpPopCount32_0(v)
   400  	case OpPopCount64:
   401  		return rewriteValueS390X_OpPopCount64_0(v)
   402  	case OpPopCount8:
   403  		return rewriteValueS390X_OpPopCount8_0(v)
   404  	case OpRotateLeft16:
   405  		return rewriteValueS390X_OpRotateLeft16_0(v)
   406  	case OpRotateLeft32:
   407  		return rewriteValueS390X_OpRotateLeft32_0(v)
   408  	case OpRotateLeft64:
   409  		return rewriteValueS390X_OpRotateLeft64_0(v)
   410  	case OpRotateLeft8:
   411  		return rewriteValueS390X_OpRotateLeft8_0(v)
   412  	case OpRound:
   413  		return rewriteValueS390X_OpRound_0(v)
   414  	case OpRound32F:
   415  		return rewriteValueS390X_OpRound32F_0(v)
   416  	case OpRound64F:
   417  		return rewriteValueS390X_OpRound64F_0(v)
   418  	case OpRoundToEven:
   419  		return rewriteValueS390X_OpRoundToEven_0(v)
   420  	case OpRsh16Ux16:
   421  		return rewriteValueS390X_OpRsh16Ux16_0(v)
   422  	case OpRsh16Ux32:
   423  		return rewriteValueS390X_OpRsh16Ux32_0(v)
   424  	case OpRsh16Ux64:
   425  		return rewriteValueS390X_OpRsh16Ux64_0(v)
   426  	case OpRsh16Ux8:
   427  		return rewriteValueS390X_OpRsh16Ux8_0(v)
   428  	case OpRsh16x16:
   429  		return rewriteValueS390X_OpRsh16x16_0(v)
   430  	case OpRsh16x32:
   431  		return rewriteValueS390X_OpRsh16x32_0(v)
   432  	case OpRsh16x64:
   433  		return rewriteValueS390X_OpRsh16x64_0(v)
   434  	case OpRsh16x8:
   435  		return rewriteValueS390X_OpRsh16x8_0(v)
   436  	case OpRsh32Ux16:
   437  		return rewriteValueS390X_OpRsh32Ux16_0(v)
   438  	case OpRsh32Ux32:
   439  		return rewriteValueS390X_OpRsh32Ux32_0(v)
   440  	case OpRsh32Ux64:
   441  		return rewriteValueS390X_OpRsh32Ux64_0(v)
   442  	case OpRsh32Ux8:
   443  		return rewriteValueS390X_OpRsh32Ux8_0(v)
   444  	case OpRsh32x16:
   445  		return rewriteValueS390X_OpRsh32x16_0(v)
   446  	case OpRsh32x32:
   447  		return rewriteValueS390X_OpRsh32x32_0(v)
   448  	case OpRsh32x64:
   449  		return rewriteValueS390X_OpRsh32x64_0(v)
   450  	case OpRsh32x8:
   451  		return rewriteValueS390X_OpRsh32x8_0(v)
   452  	case OpRsh64Ux16:
   453  		return rewriteValueS390X_OpRsh64Ux16_0(v)
   454  	case OpRsh64Ux32:
   455  		return rewriteValueS390X_OpRsh64Ux32_0(v)
   456  	case OpRsh64Ux64:
   457  		return rewriteValueS390X_OpRsh64Ux64_0(v)
   458  	case OpRsh64Ux8:
   459  		return rewriteValueS390X_OpRsh64Ux8_0(v)
   460  	case OpRsh64x16:
   461  		return rewriteValueS390X_OpRsh64x16_0(v)
   462  	case OpRsh64x32:
   463  		return rewriteValueS390X_OpRsh64x32_0(v)
   464  	case OpRsh64x64:
   465  		return rewriteValueS390X_OpRsh64x64_0(v)
   466  	case OpRsh64x8:
   467  		return rewriteValueS390X_OpRsh64x8_0(v)
   468  	case OpRsh8Ux16:
   469  		return rewriteValueS390X_OpRsh8Ux16_0(v)
   470  	case OpRsh8Ux32:
   471  		return rewriteValueS390X_OpRsh8Ux32_0(v)
   472  	case OpRsh8Ux64:
   473  		return rewriteValueS390X_OpRsh8Ux64_0(v)
   474  	case OpRsh8Ux8:
   475  		return rewriteValueS390X_OpRsh8Ux8_0(v)
   476  	case OpRsh8x16:
   477  		return rewriteValueS390X_OpRsh8x16_0(v)
   478  	case OpRsh8x32:
   479  		return rewriteValueS390X_OpRsh8x32_0(v)
   480  	case OpRsh8x64:
   481  		return rewriteValueS390X_OpRsh8x64_0(v)
   482  	case OpRsh8x8:
   483  		return rewriteValueS390X_OpRsh8x8_0(v)
   484  	case OpS390XADD:
   485  		return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v)
   486  	case OpS390XADDC:
   487  		return rewriteValueS390X_OpS390XADDC_0(v)
   488  	case OpS390XADDE:
   489  		return rewriteValueS390X_OpS390XADDE_0(v)
   490  	case OpS390XADDW:
   491  		return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v)
   492  	case OpS390XADDWconst:
   493  		return rewriteValueS390X_OpS390XADDWconst_0(v)
   494  	case OpS390XADDWload:
   495  		return rewriteValueS390X_OpS390XADDWload_0(v)
   496  	case OpS390XADDconst:
   497  		return rewriteValueS390X_OpS390XADDconst_0(v)
   498  	case OpS390XADDload:
   499  		return rewriteValueS390X_OpS390XADDload_0(v)
   500  	case OpS390XAND:
   501  		return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v)
   502  	case OpS390XANDW:
   503  		return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v)
   504  	case OpS390XANDWconst:
   505  		return rewriteValueS390X_OpS390XANDWconst_0(v)
   506  	case OpS390XANDWload:
   507  		return rewriteValueS390X_OpS390XANDWload_0(v)
   508  	case OpS390XANDconst:
   509  		return rewriteValueS390X_OpS390XANDconst_0(v)
   510  	case OpS390XANDload:
   511  		return rewriteValueS390X_OpS390XANDload_0(v)
   512  	case OpS390XCMP:
   513  		return rewriteValueS390X_OpS390XCMP_0(v)
   514  	case OpS390XCMPU:
   515  		return rewriteValueS390X_OpS390XCMPU_0(v)
   516  	case OpS390XCMPUconst:
   517  		return rewriteValueS390X_OpS390XCMPUconst_0(v) || rewriteValueS390X_OpS390XCMPUconst_10(v)
   518  	case OpS390XCMPW:
   519  		return rewriteValueS390X_OpS390XCMPW_0(v)
   520  	case OpS390XCMPWU:
   521  		return rewriteValueS390X_OpS390XCMPWU_0(v)
   522  	case OpS390XCMPWUconst:
   523  		return rewriteValueS390X_OpS390XCMPWUconst_0(v)
   524  	case OpS390XCMPWconst:
   525  		return rewriteValueS390X_OpS390XCMPWconst_0(v)
   526  	case OpS390XCMPconst:
   527  		return rewriteValueS390X_OpS390XCMPconst_0(v) || rewriteValueS390X_OpS390XCMPconst_10(v)
   528  	case OpS390XCPSDR:
   529  		return rewriteValueS390X_OpS390XCPSDR_0(v)
   530  	case OpS390XFADD:
   531  		return rewriteValueS390X_OpS390XFADD_0(v)
   532  	case OpS390XFADDS:
   533  		return rewriteValueS390X_OpS390XFADDS_0(v)
   534  	case OpS390XFMOVDload:
   535  		return rewriteValueS390X_OpS390XFMOVDload_0(v)
   536  	case OpS390XFMOVDloadidx:
   537  		return rewriteValueS390X_OpS390XFMOVDloadidx_0(v)
   538  	case OpS390XFMOVDstore:
   539  		return rewriteValueS390X_OpS390XFMOVDstore_0(v)
   540  	case OpS390XFMOVDstoreidx:
   541  		return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v)
   542  	case OpS390XFMOVSload:
   543  		return rewriteValueS390X_OpS390XFMOVSload_0(v)
   544  	case OpS390XFMOVSloadidx:
   545  		return rewriteValueS390X_OpS390XFMOVSloadidx_0(v)
   546  	case OpS390XFMOVSstore:
   547  		return rewriteValueS390X_OpS390XFMOVSstore_0(v)
   548  	case OpS390XFMOVSstoreidx:
   549  		return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v)
   550  	case OpS390XFNEG:
   551  		return rewriteValueS390X_OpS390XFNEG_0(v)
   552  	case OpS390XFNEGS:
   553  		return rewriteValueS390X_OpS390XFNEGS_0(v)
   554  	case OpS390XFSUB:
   555  		return rewriteValueS390X_OpS390XFSUB_0(v)
   556  	case OpS390XFSUBS:
   557  		return rewriteValueS390X_OpS390XFSUBS_0(v)
   558  	case OpS390XLDGR:
   559  		return rewriteValueS390X_OpS390XLDGR_0(v)
   560  	case OpS390XLEDBR:
   561  		return rewriteValueS390X_OpS390XLEDBR_0(v)
   562  	case OpS390XLGDR:
   563  		return rewriteValueS390X_OpS390XLGDR_0(v)
   564  	case OpS390XLoweredRound32F:
   565  		return rewriteValueS390X_OpS390XLoweredRound32F_0(v)
   566  	case OpS390XLoweredRound64F:
   567  		return rewriteValueS390X_OpS390XLoweredRound64F_0(v)
   568  	case OpS390XMOVBZload:
   569  		return rewriteValueS390X_OpS390XMOVBZload_0(v)
   570  	case OpS390XMOVBZloadidx:
   571  		return rewriteValueS390X_OpS390XMOVBZloadidx_0(v)
   572  	case OpS390XMOVBZreg:
   573  		return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v)
   574  	case OpS390XMOVBload:
   575  		return rewriteValueS390X_OpS390XMOVBload_0(v)
   576  	case OpS390XMOVBloadidx:
   577  		return rewriteValueS390X_OpS390XMOVBloadidx_0(v)
   578  	case OpS390XMOVBreg:
   579  		return rewriteValueS390X_OpS390XMOVBreg_0(v)
   580  	case OpS390XMOVBstore:
   581  		return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v)
   582  	case OpS390XMOVBstoreconst:
   583  		return rewriteValueS390X_OpS390XMOVBstoreconst_0(v)
   584  	case OpS390XMOVBstoreidx:
   585  		return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v)
   586  	case OpS390XMOVDEQ:
   587  		return rewriteValueS390X_OpS390XMOVDEQ_0(v)
   588  	case OpS390XMOVDGE:
   589  		return rewriteValueS390X_OpS390XMOVDGE_0(v)
   590  	case OpS390XMOVDGT:
   591  		return rewriteValueS390X_OpS390XMOVDGT_0(v)
   592  	case OpS390XMOVDLE:
   593  		return rewriteValueS390X_OpS390XMOVDLE_0(v)
   594  	case OpS390XMOVDLT:
   595  		return rewriteValueS390X_OpS390XMOVDLT_0(v)
   596  	case OpS390XMOVDNE:
   597  		return rewriteValueS390X_OpS390XMOVDNE_0(v)
   598  	case OpS390XMOVDaddridx:
   599  		return rewriteValueS390X_OpS390XMOVDaddridx_0(v)
   600  	case OpS390XMOVDload:
   601  		return rewriteValueS390X_OpS390XMOVDload_0(v)
   602  	case OpS390XMOVDloadidx:
   603  		return rewriteValueS390X_OpS390XMOVDloadidx_0(v)
   604  	case OpS390XMOVDnop:
   605  		return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v)
   606  	case OpS390XMOVDreg:
   607  		return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v)
   608  	case OpS390XMOVDstore:
   609  		return rewriteValueS390X_OpS390XMOVDstore_0(v)
   610  	case OpS390XMOVDstoreconst:
   611  		return rewriteValueS390X_OpS390XMOVDstoreconst_0(v)
   612  	case OpS390XMOVDstoreidx:
   613  		return rewriteValueS390X_OpS390XMOVDstoreidx_0(v)
   614  	case OpS390XMOVHBRstore:
   615  		return rewriteValueS390X_OpS390XMOVHBRstore_0(v)
   616  	case OpS390XMOVHBRstoreidx:
   617  		return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v)
   618  	case OpS390XMOVHZload:
   619  		return rewriteValueS390X_OpS390XMOVHZload_0(v)
   620  	case OpS390XMOVHZloadidx:
   621  		return rewriteValueS390X_OpS390XMOVHZloadidx_0(v)
   622  	case OpS390XMOVHZreg:
   623  		return rewriteValueS390X_OpS390XMOVHZreg_0(v) || rewriteValueS390X_OpS390XMOVHZreg_10(v)
   624  	case OpS390XMOVHload:
   625  		return rewriteValueS390X_OpS390XMOVHload_0(v)
   626  	case OpS390XMOVHloadidx:
   627  		return rewriteValueS390X_OpS390XMOVHloadidx_0(v)
   628  	case OpS390XMOVHreg:
   629  		return rewriteValueS390X_OpS390XMOVHreg_0(v) || rewriteValueS390X_OpS390XMOVHreg_10(v)
   630  	case OpS390XMOVHstore:
   631  		return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v)
   632  	case OpS390XMOVHstoreconst:
   633  		return rewriteValueS390X_OpS390XMOVHstoreconst_0(v)
   634  	case OpS390XMOVHstoreidx:
   635  		return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v)
   636  	case OpS390XMOVWBRstore:
   637  		return rewriteValueS390X_OpS390XMOVWBRstore_0(v)
   638  	case OpS390XMOVWBRstoreidx:
   639  		return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v)
   640  	case OpS390XMOVWZload:
   641  		return rewriteValueS390X_OpS390XMOVWZload_0(v)
   642  	case OpS390XMOVWZloadidx:
   643  		return rewriteValueS390X_OpS390XMOVWZloadidx_0(v)
   644  	case OpS390XMOVWZreg:
   645  		return rewriteValueS390X_OpS390XMOVWZreg_0(v) || rewriteValueS390X_OpS390XMOVWZreg_10(v)
   646  	case OpS390XMOVWload:
   647  		return rewriteValueS390X_OpS390XMOVWload_0(v)
   648  	case OpS390XMOVWloadidx:
   649  		return rewriteValueS390X_OpS390XMOVWloadidx_0(v)
   650  	case OpS390XMOVWreg:
   651  		return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v)
   652  	case OpS390XMOVWstore:
   653  		return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v)
   654  	case OpS390XMOVWstoreconst:
   655  		return rewriteValueS390X_OpS390XMOVWstoreconst_0(v)
   656  	case OpS390XMOVWstoreidx:
   657  		return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v)
   658  	case OpS390XMULLD:
   659  		return rewriteValueS390X_OpS390XMULLD_0(v)
   660  	case OpS390XMULLDconst:
   661  		return rewriteValueS390X_OpS390XMULLDconst_0(v)
   662  	case OpS390XMULLDload:
   663  		return rewriteValueS390X_OpS390XMULLDload_0(v)
   664  	case OpS390XMULLW:
   665  		return rewriteValueS390X_OpS390XMULLW_0(v)
   666  	case OpS390XMULLWconst:
   667  		return rewriteValueS390X_OpS390XMULLWconst_0(v)
   668  	case OpS390XMULLWload:
   669  		return rewriteValueS390X_OpS390XMULLWload_0(v)
   670  	case OpS390XNEG:
   671  		return rewriteValueS390X_OpS390XNEG_0(v)
   672  	case OpS390XNEGW:
   673  		return rewriteValueS390X_OpS390XNEGW_0(v)
   674  	case OpS390XNOT:
   675  		return rewriteValueS390X_OpS390XNOT_0(v)
   676  	case OpS390XNOTW:
   677  		return rewriteValueS390X_OpS390XNOTW_0(v)
   678  	case OpS390XOR:
   679  		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)
   680  	case OpS390XORW:
   681  		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)
   682  	case OpS390XORWconst:
   683  		return rewriteValueS390X_OpS390XORWconst_0(v)
   684  	case OpS390XORWload:
   685  		return rewriteValueS390X_OpS390XORWload_0(v)
   686  	case OpS390XORconst:
   687  		return rewriteValueS390X_OpS390XORconst_0(v)
   688  	case OpS390XORload:
   689  		return rewriteValueS390X_OpS390XORload_0(v)
   690  	case OpS390XRLL:
   691  		return rewriteValueS390X_OpS390XRLL_0(v)
   692  	case OpS390XRLLG:
   693  		return rewriteValueS390X_OpS390XRLLG_0(v)
   694  	case OpS390XSLD:
   695  		return rewriteValueS390X_OpS390XSLD_0(v) || rewriteValueS390X_OpS390XSLD_10(v)
   696  	case OpS390XSLW:
   697  		return rewriteValueS390X_OpS390XSLW_0(v) || rewriteValueS390X_OpS390XSLW_10(v)
   698  	case OpS390XSRAD:
   699  		return rewriteValueS390X_OpS390XSRAD_0(v) || rewriteValueS390X_OpS390XSRAD_10(v)
   700  	case OpS390XSRADconst:
   701  		return rewriteValueS390X_OpS390XSRADconst_0(v)
   702  	case OpS390XSRAW:
   703  		return rewriteValueS390X_OpS390XSRAW_0(v) || rewriteValueS390X_OpS390XSRAW_10(v)
   704  	case OpS390XSRAWconst:
   705  		return rewriteValueS390X_OpS390XSRAWconst_0(v)
   706  	case OpS390XSRD:
   707  		return rewriteValueS390X_OpS390XSRD_0(v) || rewriteValueS390X_OpS390XSRD_10(v)
   708  	case OpS390XSRDconst:
   709  		return rewriteValueS390X_OpS390XSRDconst_0(v)
   710  	case OpS390XSRW:
   711  		return rewriteValueS390X_OpS390XSRW_0(v) || rewriteValueS390X_OpS390XSRW_10(v)
   712  	case OpS390XSTM2:
   713  		return rewriteValueS390X_OpS390XSTM2_0(v)
   714  	case OpS390XSTMG2:
   715  		return rewriteValueS390X_OpS390XSTMG2_0(v)
   716  	case OpS390XSUB:
   717  		return rewriteValueS390X_OpS390XSUB_0(v)
   718  	case OpS390XSUBE:
   719  		return rewriteValueS390X_OpS390XSUBE_0(v)
   720  	case OpS390XSUBW:
   721  		return rewriteValueS390X_OpS390XSUBW_0(v)
   722  	case OpS390XSUBWconst:
   723  		return rewriteValueS390X_OpS390XSUBWconst_0(v)
   724  	case OpS390XSUBWload:
   725  		return rewriteValueS390X_OpS390XSUBWload_0(v)
   726  	case OpS390XSUBconst:
   727  		return rewriteValueS390X_OpS390XSUBconst_0(v)
   728  	case OpS390XSUBload:
   729  		return rewriteValueS390X_OpS390XSUBload_0(v)
   730  	case OpS390XSumBytes2:
   731  		return rewriteValueS390X_OpS390XSumBytes2_0(v)
   732  	case OpS390XSumBytes4:
   733  		return rewriteValueS390X_OpS390XSumBytes4_0(v)
   734  	case OpS390XSumBytes8:
   735  		return rewriteValueS390X_OpS390XSumBytes8_0(v)
   736  	case OpS390XXOR:
   737  		return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v)
   738  	case OpS390XXORW:
   739  		return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v)
   740  	case OpS390XXORWconst:
   741  		return rewriteValueS390X_OpS390XXORWconst_0(v)
   742  	case OpS390XXORWload:
   743  		return rewriteValueS390X_OpS390XXORWload_0(v)
   744  	case OpS390XXORconst:
   745  		return rewriteValueS390X_OpS390XXORconst_0(v)
   746  	case OpS390XXORload:
   747  		return rewriteValueS390X_OpS390XXORload_0(v)
   748  	case OpSelect0:
   749  		return rewriteValueS390X_OpSelect0_0(v)
   750  	case OpSelect1:
   751  		return rewriteValueS390X_OpSelect1_0(v)
   752  	case OpSignExt16to32:
   753  		return rewriteValueS390X_OpSignExt16to32_0(v)
   754  	case OpSignExt16to64:
   755  		return rewriteValueS390X_OpSignExt16to64_0(v)
   756  	case OpSignExt32to64:
   757  		return rewriteValueS390X_OpSignExt32to64_0(v)
   758  	case OpSignExt8to16:
   759  		return rewriteValueS390X_OpSignExt8to16_0(v)
   760  	case OpSignExt8to32:
   761  		return rewriteValueS390X_OpSignExt8to32_0(v)
   762  	case OpSignExt8to64:
   763  		return rewriteValueS390X_OpSignExt8to64_0(v)
   764  	case OpSlicemask:
   765  		return rewriteValueS390X_OpSlicemask_0(v)
   766  	case OpSqrt:
   767  		return rewriteValueS390X_OpSqrt_0(v)
   768  	case OpStaticCall:
   769  		return rewriteValueS390X_OpStaticCall_0(v)
   770  	case OpStore:
   771  		return rewriteValueS390X_OpStore_0(v)
   772  	case OpSub16:
   773  		return rewriteValueS390X_OpSub16_0(v)
   774  	case OpSub32:
   775  		return rewriteValueS390X_OpSub32_0(v)
   776  	case OpSub32F:
   777  		return rewriteValueS390X_OpSub32F_0(v)
   778  	case OpSub64:
   779  		return rewriteValueS390X_OpSub64_0(v)
   780  	case OpSub64F:
   781  		return rewriteValueS390X_OpSub64F_0(v)
   782  	case OpSub8:
   783  		return rewriteValueS390X_OpSub8_0(v)
   784  	case OpSubPtr:
   785  		return rewriteValueS390X_OpSubPtr_0(v)
   786  	case OpTrunc:
   787  		return rewriteValueS390X_OpTrunc_0(v)
   788  	case OpTrunc16to8:
   789  		return rewriteValueS390X_OpTrunc16to8_0(v)
   790  	case OpTrunc32to16:
   791  		return rewriteValueS390X_OpTrunc32to16_0(v)
   792  	case OpTrunc32to8:
   793  		return rewriteValueS390X_OpTrunc32to8_0(v)
   794  	case OpTrunc64to16:
   795  		return rewriteValueS390X_OpTrunc64to16_0(v)
   796  	case OpTrunc64to32:
   797  		return rewriteValueS390X_OpTrunc64to32_0(v)
   798  	case OpTrunc64to8:
   799  		return rewriteValueS390X_OpTrunc64to8_0(v)
   800  	case OpWB:
   801  		return rewriteValueS390X_OpWB_0(v)
   802  	case OpXor16:
   803  		return rewriteValueS390X_OpXor16_0(v)
   804  	case OpXor32:
   805  		return rewriteValueS390X_OpXor32_0(v)
   806  	case OpXor64:
   807  		return rewriteValueS390X_OpXor64_0(v)
   808  	case OpXor8:
   809  		return rewriteValueS390X_OpXor8_0(v)
   810  	case OpZero:
   811  		return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v)
   812  	case OpZeroExt16to32:
   813  		return rewriteValueS390X_OpZeroExt16to32_0(v)
   814  	case OpZeroExt16to64:
   815  		return rewriteValueS390X_OpZeroExt16to64_0(v)
   816  	case OpZeroExt32to64:
   817  		return rewriteValueS390X_OpZeroExt32to64_0(v)
   818  	case OpZeroExt8to16:
   819  		return rewriteValueS390X_OpZeroExt8to16_0(v)
   820  	case OpZeroExt8to32:
   821  		return rewriteValueS390X_OpZeroExt8to32_0(v)
   822  	case OpZeroExt8to64:
   823  		return rewriteValueS390X_OpZeroExt8to64_0(v)
   824  	}
   825  	return false
   826  }
   827  func rewriteValueS390X_OpAdd16_0(v *Value) bool {
   828  	// match: (Add16 x y)
   829  	// cond:
   830  	// result: (ADDW x y)
   831  	for {
   832  		y := v.Args[1]
   833  		x := v.Args[0]
   834  		v.reset(OpS390XADDW)
   835  		v.AddArg(x)
   836  		v.AddArg(y)
   837  		return true
   838  	}
   839  }
   840  func rewriteValueS390X_OpAdd32_0(v *Value) bool {
   841  	// match: (Add32 x y)
   842  	// cond:
   843  	// result: (ADDW x y)
   844  	for {
   845  		y := v.Args[1]
   846  		x := v.Args[0]
   847  		v.reset(OpS390XADDW)
   848  		v.AddArg(x)
   849  		v.AddArg(y)
   850  		return true
   851  	}
   852  }
   853  func rewriteValueS390X_OpAdd32F_0(v *Value) bool {
   854  	// match: (Add32F x y)
   855  	// cond:
   856  	// result: (FADDS x y)
   857  	for {
   858  		y := v.Args[1]
   859  		x := v.Args[0]
   860  		v.reset(OpS390XFADDS)
   861  		v.AddArg(x)
   862  		v.AddArg(y)
   863  		return true
   864  	}
   865  }
   866  func rewriteValueS390X_OpAdd64_0(v *Value) bool {
   867  	// match: (Add64 x y)
   868  	// cond:
   869  	// result: (ADD x y)
   870  	for {
   871  		y := v.Args[1]
   872  		x := v.Args[0]
   873  		v.reset(OpS390XADD)
   874  		v.AddArg(x)
   875  		v.AddArg(y)
   876  		return true
   877  	}
   878  }
   879  func rewriteValueS390X_OpAdd64F_0(v *Value) bool {
   880  	// match: (Add64F x y)
   881  	// cond:
   882  	// result: (FADD x y)
   883  	for {
   884  		y := v.Args[1]
   885  		x := v.Args[0]
   886  		v.reset(OpS390XFADD)
   887  		v.AddArg(x)
   888  		v.AddArg(y)
   889  		return true
   890  	}
   891  }
   892  func rewriteValueS390X_OpAdd8_0(v *Value) bool {
   893  	// match: (Add8 x y)
   894  	// cond:
   895  	// result: (ADDW x y)
   896  	for {
   897  		y := v.Args[1]
   898  		x := v.Args[0]
   899  		v.reset(OpS390XADDW)
   900  		v.AddArg(x)
   901  		v.AddArg(y)
   902  		return true
   903  	}
   904  }
   905  func rewriteValueS390X_OpAddPtr_0(v *Value) bool {
   906  	// match: (AddPtr x y)
   907  	// cond:
   908  	// result: (ADD x y)
   909  	for {
   910  		y := v.Args[1]
   911  		x := v.Args[0]
   912  		v.reset(OpS390XADD)
   913  		v.AddArg(x)
   914  		v.AddArg(y)
   915  		return true
   916  	}
   917  }
   918  func rewriteValueS390X_OpAddr_0(v *Value) bool {
   919  	// match: (Addr {sym} base)
   920  	// cond:
   921  	// result: (MOVDaddr {sym} base)
   922  	for {
   923  		sym := v.Aux
   924  		base := v.Args[0]
   925  		v.reset(OpS390XMOVDaddr)
   926  		v.Aux = sym
   927  		v.AddArg(base)
   928  		return true
   929  	}
   930  }
   931  func rewriteValueS390X_OpAnd16_0(v *Value) bool {
   932  	// match: (And16 x y)
   933  	// cond:
   934  	// result: (ANDW x y)
   935  	for {
   936  		y := v.Args[1]
   937  		x := v.Args[0]
   938  		v.reset(OpS390XANDW)
   939  		v.AddArg(x)
   940  		v.AddArg(y)
   941  		return true
   942  	}
   943  }
   944  func rewriteValueS390X_OpAnd32_0(v *Value) bool {
   945  	// match: (And32 x y)
   946  	// cond:
   947  	// result: (ANDW x y)
   948  	for {
   949  		y := v.Args[1]
   950  		x := v.Args[0]
   951  		v.reset(OpS390XANDW)
   952  		v.AddArg(x)
   953  		v.AddArg(y)
   954  		return true
   955  	}
   956  }
   957  func rewriteValueS390X_OpAnd64_0(v *Value) bool {
   958  	// match: (And64 x y)
   959  	// cond:
   960  	// result: (AND x y)
   961  	for {
   962  		y := v.Args[1]
   963  		x := v.Args[0]
   964  		v.reset(OpS390XAND)
   965  		v.AddArg(x)
   966  		v.AddArg(y)
   967  		return true
   968  	}
   969  }
   970  func rewriteValueS390X_OpAnd8_0(v *Value) bool {
   971  	// match: (And8 x y)
   972  	// cond:
   973  	// result: (ANDW x y)
   974  	for {
   975  		y := v.Args[1]
   976  		x := v.Args[0]
   977  		v.reset(OpS390XANDW)
   978  		v.AddArg(x)
   979  		v.AddArg(y)
   980  		return true
   981  	}
   982  }
   983  func rewriteValueS390X_OpAndB_0(v *Value) bool {
   984  	// match: (AndB x y)
   985  	// cond:
   986  	// result: (ANDW x y)
   987  	for {
   988  		y := v.Args[1]
   989  		x := v.Args[0]
   990  		v.reset(OpS390XANDW)
   991  		v.AddArg(x)
   992  		v.AddArg(y)
   993  		return true
   994  	}
   995  }
   996  func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool {
   997  	b := v.Block
   998  	typ := &b.Func.Config.Types
   999  	// match: (AtomicAdd32 ptr val mem)
  1000  	// cond:
  1001  	// result: (AddTupleFirst32 val (LAA ptr val mem))
  1002  	for {
  1003  		mem := v.Args[2]
  1004  		ptr := v.Args[0]
  1005  		val := v.Args[1]
  1006  		v.reset(OpS390XAddTupleFirst32)
  1007  		v.AddArg(val)
  1008  		v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem))
  1009  		v0.AddArg(ptr)
  1010  		v0.AddArg(val)
  1011  		v0.AddArg(mem)
  1012  		v.AddArg(v0)
  1013  		return true
  1014  	}
  1015  }
  1016  func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool {
  1017  	b := v.Block
  1018  	typ := &b.Func.Config.Types
  1019  	// match: (AtomicAdd64 ptr val mem)
  1020  	// cond:
  1021  	// result: (AddTupleFirst64 val (LAAG ptr val mem))
  1022  	for {
  1023  		mem := v.Args[2]
  1024  		ptr := v.Args[0]
  1025  		val := v.Args[1]
  1026  		v.reset(OpS390XAddTupleFirst64)
  1027  		v.AddArg(val)
  1028  		v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem))
  1029  		v0.AddArg(ptr)
  1030  		v0.AddArg(val)
  1031  		v0.AddArg(mem)
  1032  		v.AddArg(v0)
  1033  		return true
  1034  	}
  1035  }
  1036  func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool {
  1037  	// match: (AtomicCompareAndSwap32 ptr old new_ mem)
  1038  	// cond:
  1039  	// result: (LoweredAtomicCas32 ptr old new_ mem)
  1040  	for {
  1041  		mem := v.Args[3]
  1042  		ptr := v.Args[0]
  1043  		old := v.Args[1]
  1044  		new_ := v.Args[2]
  1045  		v.reset(OpS390XLoweredAtomicCas32)
  1046  		v.AddArg(ptr)
  1047  		v.AddArg(old)
  1048  		v.AddArg(new_)
  1049  		v.AddArg(mem)
  1050  		return true
  1051  	}
  1052  }
  1053  func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool {
  1054  	// match: (AtomicCompareAndSwap64 ptr old new_ mem)
  1055  	// cond:
  1056  	// result: (LoweredAtomicCas64 ptr old new_ mem)
  1057  	for {
  1058  		mem := v.Args[3]
  1059  		ptr := v.Args[0]
  1060  		old := v.Args[1]
  1061  		new_ := v.Args[2]
  1062  		v.reset(OpS390XLoweredAtomicCas64)
  1063  		v.AddArg(ptr)
  1064  		v.AddArg(old)
  1065  		v.AddArg(new_)
  1066  		v.AddArg(mem)
  1067  		return true
  1068  	}
  1069  }
  1070  func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool {
  1071  	// match: (AtomicExchange32 ptr val mem)
  1072  	// cond:
  1073  	// result: (LoweredAtomicExchange32 ptr val mem)
  1074  	for {
  1075  		mem := v.Args[2]
  1076  		ptr := v.Args[0]
  1077  		val := v.Args[1]
  1078  		v.reset(OpS390XLoweredAtomicExchange32)
  1079  		v.AddArg(ptr)
  1080  		v.AddArg(val)
  1081  		v.AddArg(mem)
  1082  		return true
  1083  	}
  1084  }
  1085  func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool {
  1086  	// match: (AtomicExchange64 ptr val mem)
  1087  	// cond:
  1088  	// result: (LoweredAtomicExchange64 ptr val mem)
  1089  	for {
  1090  		mem := v.Args[2]
  1091  		ptr := v.Args[0]
  1092  		val := v.Args[1]
  1093  		v.reset(OpS390XLoweredAtomicExchange64)
  1094  		v.AddArg(ptr)
  1095  		v.AddArg(val)
  1096  		v.AddArg(mem)
  1097  		return true
  1098  	}
  1099  }
  1100  func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool {
  1101  	// match: (AtomicLoad32 ptr mem)
  1102  	// cond:
  1103  	// result: (MOVWZatomicload ptr mem)
  1104  	for {
  1105  		mem := v.Args[1]
  1106  		ptr := v.Args[0]
  1107  		v.reset(OpS390XMOVWZatomicload)
  1108  		v.AddArg(ptr)
  1109  		v.AddArg(mem)
  1110  		return true
  1111  	}
  1112  }
  1113  func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool {
  1114  	// match: (AtomicLoad64 ptr mem)
  1115  	// cond:
  1116  	// result: (MOVDatomicload ptr mem)
  1117  	for {
  1118  		mem := v.Args[1]
  1119  		ptr := v.Args[0]
  1120  		v.reset(OpS390XMOVDatomicload)
  1121  		v.AddArg(ptr)
  1122  		v.AddArg(mem)
  1123  		return true
  1124  	}
  1125  }
  1126  func rewriteValueS390X_OpAtomicLoad8_0(v *Value) bool {
  1127  	// match: (AtomicLoad8 ptr mem)
  1128  	// cond:
  1129  	// result: (MOVBZatomicload ptr mem)
  1130  	for {
  1131  		mem := v.Args[1]
  1132  		ptr := v.Args[0]
  1133  		v.reset(OpS390XMOVBZatomicload)
  1134  		v.AddArg(ptr)
  1135  		v.AddArg(mem)
  1136  		return true
  1137  	}
  1138  }
  1139  func rewriteValueS390X_OpAtomicLoadAcq32_0(v *Value) bool {
  1140  	// match: (AtomicLoadAcq32 ptr mem)
  1141  	// cond:
  1142  	// result: (MOVWZatomicload ptr mem)
  1143  	for {
  1144  		mem := v.Args[1]
  1145  		ptr := v.Args[0]
  1146  		v.reset(OpS390XMOVWZatomicload)
  1147  		v.AddArg(ptr)
  1148  		v.AddArg(mem)
  1149  		return true
  1150  	}
  1151  }
  1152  func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool {
  1153  	// match: (AtomicLoadPtr ptr mem)
  1154  	// cond:
  1155  	// result: (MOVDatomicload ptr mem)
  1156  	for {
  1157  		mem := v.Args[1]
  1158  		ptr := v.Args[0]
  1159  		v.reset(OpS390XMOVDatomicload)
  1160  		v.AddArg(ptr)
  1161  		v.AddArg(mem)
  1162  		return true
  1163  	}
  1164  }
  1165  func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool {
  1166  	b := v.Block
  1167  	// match: (AtomicStore32 ptr val mem)
  1168  	// cond:
  1169  	// result: (SYNC (MOVWatomicstore ptr val mem))
  1170  	for {
  1171  		mem := v.Args[2]
  1172  		ptr := v.Args[0]
  1173  		val := v.Args[1]
  1174  		v.reset(OpS390XSYNC)
  1175  		v0 := b.NewValue0(v.Pos, OpS390XMOVWatomicstore, types.TypeMem)
  1176  		v0.AddArg(ptr)
  1177  		v0.AddArg(val)
  1178  		v0.AddArg(mem)
  1179  		v.AddArg(v0)
  1180  		return true
  1181  	}
  1182  }
  1183  func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool {
  1184  	b := v.Block
  1185  	// match: (AtomicStore64 ptr val mem)
  1186  	// cond:
  1187  	// result: (SYNC (MOVDatomicstore ptr val mem))
  1188  	for {
  1189  		mem := v.Args[2]
  1190  		ptr := v.Args[0]
  1191  		val := v.Args[1]
  1192  		v.reset(OpS390XSYNC)
  1193  		v0 := b.NewValue0(v.Pos, OpS390XMOVDatomicstore, types.TypeMem)
  1194  		v0.AddArg(ptr)
  1195  		v0.AddArg(val)
  1196  		v0.AddArg(mem)
  1197  		v.AddArg(v0)
  1198  		return true
  1199  	}
  1200  }
  1201  func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool {
  1202  	b := v.Block
  1203  	// match: (AtomicStorePtrNoWB ptr val mem)
  1204  	// cond:
  1205  	// result: (SYNC (MOVDatomicstore ptr val mem))
  1206  	for {
  1207  		mem := v.Args[2]
  1208  		ptr := v.Args[0]
  1209  		val := v.Args[1]
  1210  		v.reset(OpS390XSYNC)
  1211  		v0 := b.NewValue0(v.Pos, OpS390XMOVDatomicstore, types.TypeMem)
  1212  		v0.AddArg(ptr)
  1213  		v0.AddArg(val)
  1214  		v0.AddArg(mem)
  1215  		v.AddArg(v0)
  1216  		return true
  1217  	}
  1218  }
  1219  func rewriteValueS390X_OpAtomicStoreRel32_0(v *Value) bool {
  1220  	// match: (AtomicStoreRel32 ptr val mem)
  1221  	// cond:
  1222  	// result: (MOVWatomicstore ptr val mem)
  1223  	for {
  1224  		mem := v.Args[2]
  1225  		ptr := v.Args[0]
  1226  		val := v.Args[1]
  1227  		v.reset(OpS390XMOVWatomicstore)
  1228  		v.AddArg(ptr)
  1229  		v.AddArg(val)
  1230  		v.AddArg(mem)
  1231  		return true
  1232  	}
  1233  }
  1234  func rewriteValueS390X_OpAvg64u_0(v *Value) bool {
  1235  	b := v.Block
  1236  	// match: (Avg64u <t> x y)
  1237  	// cond:
  1238  	// result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y)
  1239  	for {
  1240  		t := v.Type
  1241  		y := v.Args[1]
  1242  		x := v.Args[0]
  1243  		v.reset(OpS390XADD)
  1244  		v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t)
  1245  		v0.AuxInt = 1
  1246  		v1 := b.NewValue0(v.Pos, OpS390XSUB, t)
  1247  		v1.AddArg(x)
  1248  		v1.AddArg(y)
  1249  		v0.AddArg(v1)
  1250  		v.AddArg(v0)
  1251  		v.AddArg(y)
  1252  		return true
  1253  	}
  1254  }
  1255  func rewriteValueS390X_OpBitLen64_0(v *Value) bool {
  1256  	b := v.Block
  1257  	typ := &b.Func.Config.Types
  1258  	// match: (BitLen64 x)
  1259  	// cond:
  1260  	// result: (SUB (MOVDconst [64]) (FLOGR x))
  1261  	for {
  1262  		x := v.Args[0]
  1263  		v.reset(OpS390XSUB)
  1264  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1265  		v0.AuxInt = 64
  1266  		v.AddArg(v0)
  1267  		v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64)
  1268  		v1.AddArg(x)
  1269  		v.AddArg(v1)
  1270  		return true
  1271  	}
  1272  }
  1273  func rewriteValueS390X_OpBswap32_0(v *Value) bool {
  1274  	// match: (Bswap32 x)
  1275  	// cond:
  1276  	// result: (MOVWBR x)
  1277  	for {
  1278  		x := v.Args[0]
  1279  		v.reset(OpS390XMOVWBR)
  1280  		v.AddArg(x)
  1281  		return true
  1282  	}
  1283  }
  1284  func rewriteValueS390X_OpBswap64_0(v *Value) bool {
  1285  	// match: (Bswap64 x)
  1286  	// cond:
  1287  	// result: (MOVDBR x)
  1288  	for {
  1289  		x := v.Args[0]
  1290  		v.reset(OpS390XMOVDBR)
  1291  		v.AddArg(x)
  1292  		return true
  1293  	}
  1294  }
  1295  func rewriteValueS390X_OpCeil_0(v *Value) bool {
  1296  	// match: (Ceil x)
  1297  	// cond:
  1298  	// result: (FIDBR [6] x)
  1299  	for {
  1300  		x := v.Args[0]
  1301  		v.reset(OpS390XFIDBR)
  1302  		v.AuxInt = 6
  1303  		v.AddArg(x)
  1304  		return true
  1305  	}
  1306  }
  1307  func rewriteValueS390X_OpClosureCall_0(v *Value) bool {
  1308  	// match: (ClosureCall [argwid] entry closure mem)
  1309  	// cond:
  1310  	// result: (CALLclosure [argwid] entry closure mem)
  1311  	for {
  1312  		argwid := v.AuxInt
  1313  		mem := v.Args[2]
  1314  		entry := v.Args[0]
  1315  		closure := v.Args[1]
  1316  		v.reset(OpS390XCALLclosure)
  1317  		v.AuxInt = argwid
  1318  		v.AddArg(entry)
  1319  		v.AddArg(closure)
  1320  		v.AddArg(mem)
  1321  		return true
  1322  	}
  1323  }
  1324  func rewriteValueS390X_OpCom16_0(v *Value) bool {
  1325  	// match: (Com16 x)
  1326  	// cond:
  1327  	// result: (NOTW x)
  1328  	for {
  1329  		x := v.Args[0]
  1330  		v.reset(OpS390XNOTW)
  1331  		v.AddArg(x)
  1332  		return true
  1333  	}
  1334  }
  1335  func rewriteValueS390X_OpCom32_0(v *Value) bool {
  1336  	// match: (Com32 x)
  1337  	// cond:
  1338  	// result: (NOTW x)
  1339  	for {
  1340  		x := v.Args[0]
  1341  		v.reset(OpS390XNOTW)
  1342  		v.AddArg(x)
  1343  		return true
  1344  	}
  1345  }
  1346  func rewriteValueS390X_OpCom64_0(v *Value) bool {
  1347  	// match: (Com64 x)
  1348  	// cond:
  1349  	// result: (NOT x)
  1350  	for {
  1351  		x := v.Args[0]
  1352  		v.reset(OpS390XNOT)
  1353  		v.AddArg(x)
  1354  		return true
  1355  	}
  1356  }
  1357  func rewriteValueS390X_OpCom8_0(v *Value) bool {
  1358  	// match: (Com8 x)
  1359  	// cond:
  1360  	// result: (NOTW x)
  1361  	for {
  1362  		x := v.Args[0]
  1363  		v.reset(OpS390XNOTW)
  1364  		v.AddArg(x)
  1365  		return true
  1366  	}
  1367  }
  1368  func rewriteValueS390X_OpConst16_0(v *Value) bool {
  1369  	// match: (Const16 [val])
  1370  	// cond:
  1371  	// result: (MOVDconst [val])
  1372  	for {
  1373  		val := v.AuxInt
  1374  		v.reset(OpS390XMOVDconst)
  1375  		v.AuxInt = val
  1376  		return true
  1377  	}
  1378  }
  1379  func rewriteValueS390X_OpConst32_0(v *Value) bool {
  1380  	// match: (Const32 [val])
  1381  	// cond:
  1382  	// result: (MOVDconst [val])
  1383  	for {
  1384  		val := v.AuxInt
  1385  		v.reset(OpS390XMOVDconst)
  1386  		v.AuxInt = val
  1387  		return true
  1388  	}
  1389  }
  1390  func rewriteValueS390X_OpConst32F_0(v *Value) bool {
  1391  	// match: (Const32F [val])
  1392  	// cond:
  1393  	// result: (FMOVSconst [val])
  1394  	for {
  1395  		val := v.AuxInt
  1396  		v.reset(OpS390XFMOVSconst)
  1397  		v.AuxInt = val
  1398  		return true
  1399  	}
  1400  }
  1401  func rewriteValueS390X_OpConst64_0(v *Value) bool {
  1402  	// match: (Const64 [val])
  1403  	// cond:
  1404  	// result: (MOVDconst [val])
  1405  	for {
  1406  		val := v.AuxInt
  1407  		v.reset(OpS390XMOVDconst)
  1408  		v.AuxInt = val
  1409  		return true
  1410  	}
  1411  }
  1412  func rewriteValueS390X_OpConst64F_0(v *Value) bool {
  1413  	// match: (Const64F [val])
  1414  	// cond:
  1415  	// result: (FMOVDconst [val])
  1416  	for {
  1417  		val := v.AuxInt
  1418  		v.reset(OpS390XFMOVDconst)
  1419  		v.AuxInt = val
  1420  		return true
  1421  	}
  1422  }
  1423  func rewriteValueS390X_OpConst8_0(v *Value) bool {
  1424  	// match: (Const8 [val])
  1425  	// cond:
  1426  	// result: (MOVDconst [val])
  1427  	for {
  1428  		val := v.AuxInt
  1429  		v.reset(OpS390XMOVDconst)
  1430  		v.AuxInt = val
  1431  		return true
  1432  	}
  1433  }
  1434  func rewriteValueS390X_OpConstBool_0(v *Value) bool {
  1435  	// match: (ConstBool [b])
  1436  	// cond:
  1437  	// result: (MOVDconst [b])
  1438  	for {
  1439  		b := v.AuxInt
  1440  		v.reset(OpS390XMOVDconst)
  1441  		v.AuxInt = b
  1442  		return true
  1443  	}
  1444  }
  1445  func rewriteValueS390X_OpConstNil_0(v *Value) bool {
  1446  	// match: (ConstNil)
  1447  	// cond:
  1448  	// result: (MOVDconst [0])
  1449  	for {
  1450  		v.reset(OpS390XMOVDconst)
  1451  		v.AuxInt = 0
  1452  		return true
  1453  	}
  1454  }
  1455  func rewriteValueS390X_OpCtz32_0(v *Value) bool {
  1456  	b := v.Block
  1457  	typ := &b.Func.Config.Types
  1458  	// match: (Ctz32 <t> x)
  1459  	// cond:
  1460  	// result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x)))))
  1461  	for {
  1462  		t := v.Type
  1463  		x := v.Args[0]
  1464  		v.reset(OpS390XSUB)
  1465  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1466  		v0.AuxInt = 64
  1467  		v.AddArg(v0)
  1468  		v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64)
  1469  		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
  1470  		v3 := b.NewValue0(v.Pos, OpS390XANDW, t)
  1471  		v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t)
  1472  		v4.AuxInt = 1
  1473  		v4.AddArg(x)
  1474  		v3.AddArg(v4)
  1475  		v5 := b.NewValue0(v.Pos, OpS390XNOTW, t)
  1476  		v5.AddArg(x)
  1477  		v3.AddArg(v5)
  1478  		v2.AddArg(v3)
  1479  		v1.AddArg(v2)
  1480  		v.AddArg(v1)
  1481  		return true
  1482  	}
  1483  }
  1484  func rewriteValueS390X_OpCtz32NonZero_0(v *Value) bool {
  1485  	// match: (Ctz32NonZero x)
  1486  	// cond:
  1487  	// result: (Ctz32 x)
  1488  	for {
  1489  		x := v.Args[0]
  1490  		v.reset(OpCtz32)
  1491  		v.AddArg(x)
  1492  		return true
  1493  	}
  1494  }
  1495  func rewriteValueS390X_OpCtz64_0(v *Value) bool {
  1496  	b := v.Block
  1497  	typ := &b.Func.Config.Types
  1498  	// match: (Ctz64 <t> x)
  1499  	// cond:
  1500  	// result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x))))
  1501  	for {
  1502  		t := v.Type
  1503  		x := v.Args[0]
  1504  		v.reset(OpS390XSUB)
  1505  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1506  		v0.AuxInt = 64
  1507  		v.AddArg(v0)
  1508  		v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64)
  1509  		v2 := b.NewValue0(v.Pos, OpS390XAND, t)
  1510  		v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t)
  1511  		v3.AuxInt = 1
  1512  		v3.AddArg(x)
  1513  		v2.AddArg(v3)
  1514  		v4 := b.NewValue0(v.Pos, OpS390XNOT, t)
  1515  		v4.AddArg(x)
  1516  		v2.AddArg(v4)
  1517  		v1.AddArg(v2)
  1518  		v.AddArg(v1)
  1519  		return true
  1520  	}
  1521  }
  1522  func rewriteValueS390X_OpCtz64NonZero_0(v *Value) bool {
  1523  	// match: (Ctz64NonZero x)
  1524  	// cond:
  1525  	// result: (Ctz64 x)
  1526  	for {
  1527  		x := v.Args[0]
  1528  		v.reset(OpCtz64)
  1529  		v.AddArg(x)
  1530  		return true
  1531  	}
  1532  }
  1533  func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool {
  1534  	// match: (Cvt32Fto32 x)
  1535  	// cond:
  1536  	// result: (CFEBRA x)
  1537  	for {
  1538  		x := v.Args[0]
  1539  		v.reset(OpS390XCFEBRA)
  1540  		v.AddArg(x)
  1541  		return true
  1542  	}
  1543  }
  1544  func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool {
  1545  	// match: (Cvt32Fto64 x)
  1546  	// cond:
  1547  	// result: (CGEBRA x)
  1548  	for {
  1549  		x := v.Args[0]
  1550  		v.reset(OpS390XCGEBRA)
  1551  		v.AddArg(x)
  1552  		return true
  1553  	}
  1554  }
  1555  func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool {
  1556  	// match: (Cvt32Fto64F x)
  1557  	// cond:
  1558  	// result: (LDEBR x)
  1559  	for {
  1560  		x := v.Args[0]
  1561  		v.reset(OpS390XLDEBR)
  1562  		v.AddArg(x)
  1563  		return true
  1564  	}
  1565  }
  1566  func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool {
  1567  	// match: (Cvt32to32F x)
  1568  	// cond:
  1569  	// result: (CEFBRA x)
  1570  	for {
  1571  		x := v.Args[0]
  1572  		v.reset(OpS390XCEFBRA)
  1573  		v.AddArg(x)
  1574  		return true
  1575  	}
  1576  }
  1577  func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool {
  1578  	// match: (Cvt32to64F x)
  1579  	// cond:
  1580  	// result: (CDFBRA x)
  1581  	for {
  1582  		x := v.Args[0]
  1583  		v.reset(OpS390XCDFBRA)
  1584  		v.AddArg(x)
  1585  		return true
  1586  	}
  1587  }
  1588  func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool {
  1589  	// match: (Cvt64Fto32 x)
  1590  	// cond:
  1591  	// result: (CFDBRA x)
  1592  	for {
  1593  		x := v.Args[0]
  1594  		v.reset(OpS390XCFDBRA)
  1595  		v.AddArg(x)
  1596  		return true
  1597  	}
  1598  }
  1599  func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool {
  1600  	// match: (Cvt64Fto32F x)
  1601  	// cond:
  1602  	// result: (LEDBR x)
  1603  	for {
  1604  		x := v.Args[0]
  1605  		v.reset(OpS390XLEDBR)
  1606  		v.AddArg(x)
  1607  		return true
  1608  	}
  1609  }
  1610  func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool {
  1611  	// match: (Cvt64Fto64 x)
  1612  	// cond:
  1613  	// result: (CGDBRA x)
  1614  	for {
  1615  		x := v.Args[0]
  1616  		v.reset(OpS390XCGDBRA)
  1617  		v.AddArg(x)
  1618  		return true
  1619  	}
  1620  }
  1621  func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool {
  1622  	// match: (Cvt64to32F x)
  1623  	// cond:
  1624  	// result: (CEGBRA x)
  1625  	for {
  1626  		x := v.Args[0]
  1627  		v.reset(OpS390XCEGBRA)
  1628  		v.AddArg(x)
  1629  		return true
  1630  	}
  1631  }
  1632  func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool {
  1633  	// match: (Cvt64to64F x)
  1634  	// cond:
  1635  	// result: (CDGBRA x)
  1636  	for {
  1637  		x := v.Args[0]
  1638  		v.reset(OpS390XCDGBRA)
  1639  		v.AddArg(x)
  1640  		return true
  1641  	}
  1642  }
  1643  func rewriteValueS390X_OpDiv16_0(v *Value) bool {
  1644  	b := v.Block
  1645  	typ := &b.Func.Config.Types
  1646  	// match: (Div16 x y)
  1647  	// cond:
  1648  	// result: (DIVW (MOVHreg x) (MOVHreg y))
  1649  	for {
  1650  		y := v.Args[1]
  1651  		x := v.Args[0]
  1652  		v.reset(OpS390XDIVW)
  1653  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  1654  		v0.AddArg(x)
  1655  		v.AddArg(v0)
  1656  		v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  1657  		v1.AddArg(y)
  1658  		v.AddArg(v1)
  1659  		return true
  1660  	}
  1661  }
  1662  func rewriteValueS390X_OpDiv16u_0(v *Value) bool {
  1663  	b := v.Block
  1664  	typ := &b.Func.Config.Types
  1665  	// match: (Div16u x y)
  1666  	// cond:
  1667  	// result: (DIVWU (MOVHZreg x) (MOVHZreg y))
  1668  	for {
  1669  		y := v.Args[1]
  1670  		x := v.Args[0]
  1671  		v.reset(OpS390XDIVWU)
  1672  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  1673  		v0.AddArg(x)
  1674  		v.AddArg(v0)
  1675  		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  1676  		v1.AddArg(y)
  1677  		v.AddArg(v1)
  1678  		return true
  1679  	}
  1680  }
  1681  func rewriteValueS390X_OpDiv32_0(v *Value) bool {
  1682  	b := v.Block
  1683  	typ := &b.Func.Config.Types
  1684  	// match: (Div32 x y)
  1685  	// cond:
  1686  	// result: (DIVW (MOVWreg x) y)
  1687  	for {
  1688  		y := v.Args[1]
  1689  		x := v.Args[0]
  1690  		v.reset(OpS390XDIVW)
  1691  		v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
  1692  		v0.AddArg(x)
  1693  		v.AddArg(v0)
  1694  		v.AddArg(y)
  1695  		return true
  1696  	}
  1697  }
  1698  func rewriteValueS390X_OpDiv32F_0(v *Value) bool {
  1699  	// match: (Div32F x y)
  1700  	// cond:
  1701  	// result: (FDIVS x y)
  1702  	for {
  1703  		y := v.Args[1]
  1704  		x := v.Args[0]
  1705  		v.reset(OpS390XFDIVS)
  1706  		v.AddArg(x)
  1707  		v.AddArg(y)
  1708  		return true
  1709  	}
  1710  }
  1711  func rewriteValueS390X_OpDiv32u_0(v *Value) bool {
  1712  	b := v.Block
  1713  	typ := &b.Func.Config.Types
  1714  	// match: (Div32u x y)
  1715  	// cond:
  1716  	// result: (DIVWU (MOVWZreg x) y)
  1717  	for {
  1718  		y := v.Args[1]
  1719  		x := v.Args[0]
  1720  		v.reset(OpS390XDIVWU)
  1721  		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
  1722  		v0.AddArg(x)
  1723  		v.AddArg(v0)
  1724  		v.AddArg(y)
  1725  		return true
  1726  	}
  1727  }
  1728  func rewriteValueS390X_OpDiv64_0(v *Value) bool {
  1729  	// match: (Div64 x y)
  1730  	// cond:
  1731  	// result: (DIVD x y)
  1732  	for {
  1733  		y := v.Args[1]
  1734  		x := v.Args[0]
  1735  		v.reset(OpS390XDIVD)
  1736  		v.AddArg(x)
  1737  		v.AddArg(y)
  1738  		return true
  1739  	}
  1740  }
  1741  func rewriteValueS390X_OpDiv64F_0(v *Value) bool {
  1742  	// match: (Div64F x y)
  1743  	// cond:
  1744  	// result: (FDIV x y)
  1745  	for {
  1746  		y := v.Args[1]
  1747  		x := v.Args[0]
  1748  		v.reset(OpS390XFDIV)
  1749  		v.AddArg(x)
  1750  		v.AddArg(y)
  1751  		return true
  1752  	}
  1753  }
  1754  func rewriteValueS390X_OpDiv64u_0(v *Value) bool {
  1755  	// match: (Div64u x y)
  1756  	// cond:
  1757  	// result: (DIVDU x y)
  1758  	for {
  1759  		y := v.Args[1]
  1760  		x := v.Args[0]
  1761  		v.reset(OpS390XDIVDU)
  1762  		v.AddArg(x)
  1763  		v.AddArg(y)
  1764  		return true
  1765  	}
  1766  }
  1767  func rewriteValueS390X_OpDiv8_0(v *Value) bool {
  1768  	b := v.Block
  1769  	typ := &b.Func.Config.Types
  1770  	// match: (Div8 x y)
  1771  	// cond:
  1772  	// result: (DIVW (MOVBreg x) (MOVBreg y))
  1773  	for {
  1774  		y := v.Args[1]
  1775  		x := v.Args[0]
  1776  		v.reset(OpS390XDIVW)
  1777  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  1778  		v0.AddArg(x)
  1779  		v.AddArg(v0)
  1780  		v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  1781  		v1.AddArg(y)
  1782  		v.AddArg(v1)
  1783  		return true
  1784  	}
  1785  }
  1786  func rewriteValueS390X_OpDiv8u_0(v *Value) bool {
  1787  	b := v.Block
  1788  	typ := &b.Func.Config.Types
  1789  	// match: (Div8u x y)
  1790  	// cond:
  1791  	// result: (DIVWU (MOVBZreg x) (MOVBZreg y))
  1792  	for {
  1793  		y := v.Args[1]
  1794  		x := v.Args[0]
  1795  		v.reset(OpS390XDIVWU)
  1796  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  1797  		v0.AddArg(x)
  1798  		v.AddArg(v0)
  1799  		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  1800  		v1.AddArg(y)
  1801  		v.AddArg(v1)
  1802  		return true
  1803  	}
  1804  }
  1805  func rewriteValueS390X_OpEq16_0(v *Value) bool {
  1806  	b := v.Block
  1807  	typ := &b.Func.Config.Types
  1808  	// match: (Eq16 x y)
  1809  	// cond:
  1810  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y)))
  1811  	for {
  1812  		y := v.Args[1]
  1813  		x := v.Args[0]
  1814  		v.reset(OpS390XMOVDEQ)
  1815  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1816  		v0.AuxInt = 0
  1817  		v.AddArg(v0)
  1818  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1819  		v1.AuxInt = 1
  1820  		v.AddArg(v1)
  1821  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  1822  		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  1823  		v3.AddArg(x)
  1824  		v2.AddArg(v3)
  1825  		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  1826  		v4.AddArg(y)
  1827  		v2.AddArg(v4)
  1828  		v.AddArg(v2)
  1829  		return true
  1830  	}
  1831  }
  1832  func rewriteValueS390X_OpEq32_0(v *Value) bool {
  1833  	b := v.Block
  1834  	typ := &b.Func.Config.Types
  1835  	// match: (Eq32 x y)
  1836  	// cond:
  1837  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
  1838  	for {
  1839  		y := v.Args[1]
  1840  		x := v.Args[0]
  1841  		v.reset(OpS390XMOVDEQ)
  1842  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1843  		v0.AuxInt = 0
  1844  		v.AddArg(v0)
  1845  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1846  		v1.AuxInt = 1
  1847  		v.AddArg(v1)
  1848  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  1849  		v2.AddArg(x)
  1850  		v2.AddArg(y)
  1851  		v.AddArg(v2)
  1852  		return true
  1853  	}
  1854  }
  1855  func rewriteValueS390X_OpEq32F_0(v *Value) bool {
  1856  	b := v.Block
  1857  	typ := &b.Func.Config.Types
  1858  	// match: (Eq32F x y)
  1859  	// cond:
  1860  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
  1861  	for {
  1862  		y := v.Args[1]
  1863  		x := v.Args[0]
  1864  		v.reset(OpS390XMOVDEQ)
  1865  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1866  		v0.AuxInt = 0
  1867  		v.AddArg(v0)
  1868  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1869  		v1.AuxInt = 1
  1870  		v.AddArg(v1)
  1871  		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
  1872  		v2.AddArg(x)
  1873  		v2.AddArg(y)
  1874  		v.AddArg(v2)
  1875  		return true
  1876  	}
  1877  }
  1878  func rewriteValueS390X_OpEq64_0(v *Value) bool {
  1879  	b := v.Block
  1880  	typ := &b.Func.Config.Types
  1881  	// match: (Eq64 x y)
  1882  	// cond:
  1883  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  1884  	for {
  1885  		y := v.Args[1]
  1886  		x := v.Args[0]
  1887  		v.reset(OpS390XMOVDEQ)
  1888  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1889  		v0.AuxInt = 0
  1890  		v.AddArg(v0)
  1891  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1892  		v1.AuxInt = 1
  1893  		v.AddArg(v1)
  1894  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  1895  		v2.AddArg(x)
  1896  		v2.AddArg(y)
  1897  		v.AddArg(v2)
  1898  		return true
  1899  	}
  1900  }
  1901  func rewriteValueS390X_OpEq64F_0(v *Value) bool {
  1902  	b := v.Block
  1903  	typ := &b.Func.Config.Types
  1904  	// match: (Eq64F x y)
  1905  	// cond:
  1906  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
  1907  	for {
  1908  		y := v.Args[1]
  1909  		x := v.Args[0]
  1910  		v.reset(OpS390XMOVDEQ)
  1911  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1912  		v0.AuxInt = 0
  1913  		v.AddArg(v0)
  1914  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1915  		v1.AuxInt = 1
  1916  		v.AddArg(v1)
  1917  		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
  1918  		v2.AddArg(x)
  1919  		v2.AddArg(y)
  1920  		v.AddArg(v2)
  1921  		return true
  1922  	}
  1923  }
  1924  func rewriteValueS390X_OpEq8_0(v *Value) bool {
  1925  	b := v.Block
  1926  	typ := &b.Func.Config.Types
  1927  	// match: (Eq8 x y)
  1928  	// cond:
  1929  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  1930  	for {
  1931  		y := v.Args[1]
  1932  		x := v.Args[0]
  1933  		v.reset(OpS390XMOVDEQ)
  1934  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1935  		v0.AuxInt = 0
  1936  		v.AddArg(v0)
  1937  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1938  		v1.AuxInt = 1
  1939  		v.AddArg(v1)
  1940  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  1941  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  1942  		v3.AddArg(x)
  1943  		v2.AddArg(v3)
  1944  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  1945  		v4.AddArg(y)
  1946  		v2.AddArg(v4)
  1947  		v.AddArg(v2)
  1948  		return true
  1949  	}
  1950  }
  1951  func rewriteValueS390X_OpEqB_0(v *Value) bool {
  1952  	b := v.Block
  1953  	typ := &b.Func.Config.Types
  1954  	// match: (EqB x y)
  1955  	// cond:
  1956  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  1957  	for {
  1958  		y := v.Args[1]
  1959  		x := v.Args[0]
  1960  		v.reset(OpS390XMOVDEQ)
  1961  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1962  		v0.AuxInt = 0
  1963  		v.AddArg(v0)
  1964  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1965  		v1.AuxInt = 1
  1966  		v.AddArg(v1)
  1967  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  1968  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  1969  		v3.AddArg(x)
  1970  		v2.AddArg(v3)
  1971  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  1972  		v4.AddArg(y)
  1973  		v2.AddArg(v4)
  1974  		v.AddArg(v2)
  1975  		return true
  1976  	}
  1977  }
  1978  func rewriteValueS390X_OpEqPtr_0(v *Value) bool {
  1979  	b := v.Block
  1980  	typ := &b.Func.Config.Types
  1981  	// match: (EqPtr x y)
  1982  	// cond:
  1983  	// result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  1984  	for {
  1985  		y := v.Args[1]
  1986  		x := v.Args[0]
  1987  		v.reset(OpS390XMOVDEQ)
  1988  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1989  		v0.AuxInt = 0
  1990  		v.AddArg(v0)
  1991  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  1992  		v1.AuxInt = 1
  1993  		v.AddArg(v1)
  1994  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  1995  		v2.AddArg(x)
  1996  		v2.AddArg(y)
  1997  		v.AddArg(v2)
  1998  		return true
  1999  	}
  2000  }
  2001  func rewriteValueS390X_OpFloor_0(v *Value) bool {
  2002  	// match: (Floor x)
  2003  	// cond:
  2004  	// result: (FIDBR [7] x)
  2005  	for {
  2006  		x := v.Args[0]
  2007  		v.reset(OpS390XFIDBR)
  2008  		v.AuxInt = 7
  2009  		v.AddArg(x)
  2010  		return true
  2011  	}
  2012  }
  2013  func rewriteValueS390X_OpGeq16_0(v *Value) bool {
  2014  	b := v.Block
  2015  	typ := &b.Func.Config.Types
  2016  	// match: (Geq16 x y)
  2017  	// cond:
  2018  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y)))
  2019  	for {
  2020  		y := v.Args[1]
  2021  		x := v.Args[0]
  2022  		v.reset(OpS390XMOVDGE)
  2023  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2024  		v0.AuxInt = 0
  2025  		v.AddArg(v0)
  2026  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2027  		v1.AuxInt = 1
  2028  		v.AddArg(v1)
  2029  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2030  		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2031  		v3.AddArg(x)
  2032  		v2.AddArg(v3)
  2033  		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2034  		v4.AddArg(y)
  2035  		v2.AddArg(v4)
  2036  		v.AddArg(v2)
  2037  		return true
  2038  	}
  2039  }
  2040  func rewriteValueS390X_OpGeq16U_0(v *Value) bool {
  2041  	b := v.Block
  2042  	typ := &b.Func.Config.Types
  2043  	// match: (Geq16U x y)
  2044  	// cond:
  2045  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y)))
  2046  	for {
  2047  		y := v.Args[1]
  2048  		x := v.Args[0]
  2049  		v.reset(OpS390XMOVDGE)
  2050  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2051  		v0.AuxInt = 0
  2052  		v.AddArg(v0)
  2053  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2054  		v1.AuxInt = 1
  2055  		v.AddArg(v1)
  2056  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2057  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  2058  		v3.AddArg(x)
  2059  		v2.AddArg(v3)
  2060  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  2061  		v4.AddArg(y)
  2062  		v2.AddArg(v4)
  2063  		v.AddArg(v2)
  2064  		return true
  2065  	}
  2066  }
  2067  func rewriteValueS390X_OpGeq32_0(v *Value) bool {
  2068  	b := v.Block
  2069  	typ := &b.Func.Config.Types
  2070  	// match: (Geq32 x y)
  2071  	// cond:
  2072  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
  2073  	for {
  2074  		y := v.Args[1]
  2075  		x := v.Args[0]
  2076  		v.reset(OpS390XMOVDGE)
  2077  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2078  		v0.AuxInt = 0
  2079  		v.AddArg(v0)
  2080  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2081  		v1.AuxInt = 1
  2082  		v.AddArg(v1)
  2083  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2084  		v2.AddArg(x)
  2085  		v2.AddArg(y)
  2086  		v.AddArg(v2)
  2087  		return true
  2088  	}
  2089  }
  2090  func rewriteValueS390X_OpGeq32F_0(v *Value) bool {
  2091  	b := v.Block
  2092  	typ := &b.Func.Config.Types
  2093  	// match: (Geq32F x y)
  2094  	// cond:
  2095  	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
  2096  	for {
  2097  		y := v.Args[1]
  2098  		x := v.Args[0]
  2099  		v.reset(OpS390XMOVDGEnoinv)
  2100  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2101  		v0.AuxInt = 0
  2102  		v.AddArg(v0)
  2103  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2104  		v1.AuxInt = 1
  2105  		v.AddArg(v1)
  2106  		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
  2107  		v2.AddArg(x)
  2108  		v2.AddArg(y)
  2109  		v.AddArg(v2)
  2110  		return true
  2111  	}
  2112  }
  2113  func rewriteValueS390X_OpGeq32U_0(v *Value) bool {
  2114  	b := v.Block
  2115  	typ := &b.Func.Config.Types
  2116  	// match: (Geq32U x y)
  2117  	// cond:
  2118  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
  2119  	for {
  2120  		y := v.Args[1]
  2121  		x := v.Args[0]
  2122  		v.reset(OpS390XMOVDGE)
  2123  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2124  		v0.AuxInt = 0
  2125  		v.AddArg(v0)
  2126  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2127  		v1.AuxInt = 1
  2128  		v.AddArg(v1)
  2129  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2130  		v2.AddArg(x)
  2131  		v2.AddArg(y)
  2132  		v.AddArg(v2)
  2133  		return true
  2134  	}
  2135  }
  2136  func rewriteValueS390X_OpGeq64_0(v *Value) bool {
  2137  	b := v.Block
  2138  	typ := &b.Func.Config.Types
  2139  	// match: (Geq64 x y)
  2140  	// cond:
  2141  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  2142  	for {
  2143  		y := v.Args[1]
  2144  		x := v.Args[0]
  2145  		v.reset(OpS390XMOVDGE)
  2146  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2147  		v0.AuxInt = 0
  2148  		v.AddArg(v0)
  2149  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2150  		v1.AuxInt = 1
  2151  		v.AddArg(v1)
  2152  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  2153  		v2.AddArg(x)
  2154  		v2.AddArg(y)
  2155  		v.AddArg(v2)
  2156  		return true
  2157  	}
  2158  }
  2159  func rewriteValueS390X_OpGeq64F_0(v *Value) bool {
  2160  	b := v.Block
  2161  	typ := &b.Func.Config.Types
  2162  	// match: (Geq64F x y)
  2163  	// cond:
  2164  	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
  2165  	for {
  2166  		y := v.Args[1]
  2167  		x := v.Args[0]
  2168  		v.reset(OpS390XMOVDGEnoinv)
  2169  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2170  		v0.AuxInt = 0
  2171  		v.AddArg(v0)
  2172  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2173  		v1.AuxInt = 1
  2174  		v.AddArg(v1)
  2175  		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
  2176  		v2.AddArg(x)
  2177  		v2.AddArg(y)
  2178  		v.AddArg(v2)
  2179  		return true
  2180  	}
  2181  }
  2182  func rewriteValueS390X_OpGeq64U_0(v *Value) bool {
  2183  	b := v.Block
  2184  	typ := &b.Func.Config.Types
  2185  	// match: (Geq64U x y)
  2186  	// cond:
  2187  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
  2188  	for {
  2189  		y := v.Args[1]
  2190  		x := v.Args[0]
  2191  		v.reset(OpS390XMOVDGE)
  2192  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2193  		v0.AuxInt = 0
  2194  		v.AddArg(v0)
  2195  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2196  		v1.AuxInt = 1
  2197  		v.AddArg(v1)
  2198  		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
  2199  		v2.AddArg(x)
  2200  		v2.AddArg(y)
  2201  		v.AddArg(v2)
  2202  		return true
  2203  	}
  2204  }
  2205  func rewriteValueS390X_OpGeq8_0(v *Value) bool {
  2206  	b := v.Block
  2207  	typ := &b.Func.Config.Types
  2208  	// match: (Geq8 x y)
  2209  	// cond:
  2210  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  2211  	for {
  2212  		y := v.Args[1]
  2213  		x := v.Args[0]
  2214  		v.reset(OpS390XMOVDGE)
  2215  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2216  		v0.AuxInt = 0
  2217  		v.AddArg(v0)
  2218  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2219  		v1.AuxInt = 1
  2220  		v.AddArg(v1)
  2221  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2222  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  2223  		v3.AddArg(x)
  2224  		v2.AddArg(v3)
  2225  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  2226  		v4.AddArg(y)
  2227  		v2.AddArg(v4)
  2228  		v.AddArg(v2)
  2229  		return true
  2230  	}
  2231  }
  2232  func rewriteValueS390X_OpGeq8U_0(v *Value) bool {
  2233  	b := v.Block
  2234  	typ := &b.Func.Config.Types
  2235  	// match: (Geq8U x y)
  2236  	// cond:
  2237  	// result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y)))
  2238  	for {
  2239  		y := v.Args[1]
  2240  		x := v.Args[0]
  2241  		v.reset(OpS390XMOVDGE)
  2242  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2243  		v0.AuxInt = 0
  2244  		v.AddArg(v0)
  2245  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2246  		v1.AuxInt = 1
  2247  		v.AddArg(v1)
  2248  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2249  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  2250  		v3.AddArg(x)
  2251  		v2.AddArg(v3)
  2252  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  2253  		v4.AddArg(y)
  2254  		v2.AddArg(v4)
  2255  		v.AddArg(v2)
  2256  		return true
  2257  	}
  2258  }
  2259  func rewriteValueS390X_OpGetCallerPC_0(v *Value) bool {
  2260  	// match: (GetCallerPC)
  2261  	// cond:
  2262  	// result: (LoweredGetCallerPC)
  2263  	for {
  2264  		v.reset(OpS390XLoweredGetCallerPC)
  2265  		return true
  2266  	}
  2267  }
  2268  func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool {
  2269  	// match: (GetCallerSP)
  2270  	// cond:
  2271  	// result: (LoweredGetCallerSP)
  2272  	for {
  2273  		v.reset(OpS390XLoweredGetCallerSP)
  2274  		return true
  2275  	}
  2276  }
  2277  func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool {
  2278  	// match: (GetClosurePtr)
  2279  	// cond:
  2280  	// result: (LoweredGetClosurePtr)
  2281  	for {
  2282  		v.reset(OpS390XLoweredGetClosurePtr)
  2283  		return true
  2284  	}
  2285  }
  2286  func rewriteValueS390X_OpGetG_0(v *Value) bool {
  2287  	// match: (GetG mem)
  2288  	// cond:
  2289  	// result: (LoweredGetG mem)
  2290  	for {
  2291  		mem := v.Args[0]
  2292  		v.reset(OpS390XLoweredGetG)
  2293  		v.AddArg(mem)
  2294  		return true
  2295  	}
  2296  }
  2297  func rewriteValueS390X_OpGreater16_0(v *Value) bool {
  2298  	b := v.Block
  2299  	typ := &b.Func.Config.Types
  2300  	// match: (Greater16 x y)
  2301  	// cond:
  2302  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y)))
  2303  	for {
  2304  		y := v.Args[1]
  2305  		x := v.Args[0]
  2306  		v.reset(OpS390XMOVDGT)
  2307  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2308  		v0.AuxInt = 0
  2309  		v.AddArg(v0)
  2310  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2311  		v1.AuxInt = 1
  2312  		v.AddArg(v1)
  2313  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2314  		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2315  		v3.AddArg(x)
  2316  		v2.AddArg(v3)
  2317  		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2318  		v4.AddArg(y)
  2319  		v2.AddArg(v4)
  2320  		v.AddArg(v2)
  2321  		return true
  2322  	}
  2323  }
  2324  func rewriteValueS390X_OpGreater16U_0(v *Value) bool {
  2325  	b := v.Block
  2326  	typ := &b.Func.Config.Types
  2327  	// match: (Greater16U x y)
  2328  	// cond:
  2329  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y)))
  2330  	for {
  2331  		y := v.Args[1]
  2332  		x := v.Args[0]
  2333  		v.reset(OpS390XMOVDGT)
  2334  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2335  		v0.AuxInt = 0
  2336  		v.AddArg(v0)
  2337  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2338  		v1.AuxInt = 1
  2339  		v.AddArg(v1)
  2340  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2341  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  2342  		v3.AddArg(x)
  2343  		v2.AddArg(v3)
  2344  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  2345  		v4.AddArg(y)
  2346  		v2.AddArg(v4)
  2347  		v.AddArg(v2)
  2348  		return true
  2349  	}
  2350  }
  2351  func rewriteValueS390X_OpGreater32_0(v *Value) bool {
  2352  	b := v.Block
  2353  	typ := &b.Func.Config.Types
  2354  	// match: (Greater32 x y)
  2355  	// cond:
  2356  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
  2357  	for {
  2358  		y := v.Args[1]
  2359  		x := v.Args[0]
  2360  		v.reset(OpS390XMOVDGT)
  2361  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2362  		v0.AuxInt = 0
  2363  		v.AddArg(v0)
  2364  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2365  		v1.AuxInt = 1
  2366  		v.AddArg(v1)
  2367  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2368  		v2.AddArg(x)
  2369  		v2.AddArg(y)
  2370  		v.AddArg(v2)
  2371  		return true
  2372  	}
  2373  }
  2374  func rewriteValueS390X_OpGreater32F_0(v *Value) bool {
  2375  	b := v.Block
  2376  	typ := &b.Func.Config.Types
  2377  	// match: (Greater32F x y)
  2378  	// cond:
  2379  	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
  2380  	for {
  2381  		y := v.Args[1]
  2382  		x := v.Args[0]
  2383  		v.reset(OpS390XMOVDGTnoinv)
  2384  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2385  		v0.AuxInt = 0
  2386  		v.AddArg(v0)
  2387  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2388  		v1.AuxInt = 1
  2389  		v.AddArg(v1)
  2390  		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
  2391  		v2.AddArg(x)
  2392  		v2.AddArg(y)
  2393  		v.AddArg(v2)
  2394  		return true
  2395  	}
  2396  }
  2397  func rewriteValueS390X_OpGreater32U_0(v *Value) bool {
  2398  	b := v.Block
  2399  	typ := &b.Func.Config.Types
  2400  	// match: (Greater32U x y)
  2401  	// cond:
  2402  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
  2403  	for {
  2404  		y := v.Args[1]
  2405  		x := v.Args[0]
  2406  		v.reset(OpS390XMOVDGT)
  2407  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2408  		v0.AuxInt = 0
  2409  		v.AddArg(v0)
  2410  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2411  		v1.AuxInt = 1
  2412  		v.AddArg(v1)
  2413  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2414  		v2.AddArg(x)
  2415  		v2.AddArg(y)
  2416  		v.AddArg(v2)
  2417  		return true
  2418  	}
  2419  }
  2420  func rewriteValueS390X_OpGreater64_0(v *Value) bool {
  2421  	b := v.Block
  2422  	typ := &b.Func.Config.Types
  2423  	// match: (Greater64 x y)
  2424  	// cond:
  2425  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  2426  	for {
  2427  		y := v.Args[1]
  2428  		x := v.Args[0]
  2429  		v.reset(OpS390XMOVDGT)
  2430  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2431  		v0.AuxInt = 0
  2432  		v.AddArg(v0)
  2433  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2434  		v1.AuxInt = 1
  2435  		v.AddArg(v1)
  2436  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  2437  		v2.AddArg(x)
  2438  		v2.AddArg(y)
  2439  		v.AddArg(v2)
  2440  		return true
  2441  	}
  2442  }
  2443  func rewriteValueS390X_OpGreater64F_0(v *Value) bool {
  2444  	b := v.Block
  2445  	typ := &b.Func.Config.Types
  2446  	// match: (Greater64F x y)
  2447  	// cond:
  2448  	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
  2449  	for {
  2450  		y := v.Args[1]
  2451  		x := v.Args[0]
  2452  		v.reset(OpS390XMOVDGTnoinv)
  2453  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2454  		v0.AuxInt = 0
  2455  		v.AddArg(v0)
  2456  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2457  		v1.AuxInt = 1
  2458  		v.AddArg(v1)
  2459  		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
  2460  		v2.AddArg(x)
  2461  		v2.AddArg(y)
  2462  		v.AddArg(v2)
  2463  		return true
  2464  	}
  2465  }
  2466  func rewriteValueS390X_OpGreater64U_0(v *Value) bool {
  2467  	b := v.Block
  2468  	typ := &b.Func.Config.Types
  2469  	// match: (Greater64U x y)
  2470  	// cond:
  2471  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
  2472  	for {
  2473  		y := v.Args[1]
  2474  		x := v.Args[0]
  2475  		v.reset(OpS390XMOVDGT)
  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, OpS390XCMPU, types.TypeFlags)
  2483  		v2.AddArg(x)
  2484  		v2.AddArg(y)
  2485  		v.AddArg(v2)
  2486  		return true
  2487  	}
  2488  }
  2489  func rewriteValueS390X_OpGreater8_0(v *Value) bool {
  2490  	b := v.Block
  2491  	typ := &b.Func.Config.Types
  2492  	// match: (Greater8 x y)
  2493  	// cond:
  2494  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  2495  	for {
  2496  		y := v.Args[1]
  2497  		x := v.Args[0]
  2498  		v.reset(OpS390XMOVDGT)
  2499  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2500  		v0.AuxInt = 0
  2501  		v.AddArg(v0)
  2502  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2503  		v1.AuxInt = 1
  2504  		v.AddArg(v1)
  2505  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2506  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  2507  		v3.AddArg(x)
  2508  		v2.AddArg(v3)
  2509  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  2510  		v4.AddArg(y)
  2511  		v2.AddArg(v4)
  2512  		v.AddArg(v2)
  2513  		return true
  2514  	}
  2515  }
  2516  func rewriteValueS390X_OpGreater8U_0(v *Value) bool {
  2517  	b := v.Block
  2518  	typ := &b.Func.Config.Types
  2519  	// match: (Greater8U x y)
  2520  	// cond:
  2521  	// result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y)))
  2522  	for {
  2523  		y := v.Args[1]
  2524  		x := v.Args[0]
  2525  		v.reset(OpS390XMOVDGT)
  2526  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2527  		v0.AuxInt = 0
  2528  		v.AddArg(v0)
  2529  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2530  		v1.AuxInt = 1
  2531  		v.AddArg(v1)
  2532  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2533  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  2534  		v3.AddArg(x)
  2535  		v2.AddArg(v3)
  2536  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  2537  		v4.AddArg(y)
  2538  		v2.AddArg(v4)
  2539  		v.AddArg(v2)
  2540  		return true
  2541  	}
  2542  }
  2543  func rewriteValueS390X_OpHmul32_0(v *Value) bool {
  2544  	b := v.Block
  2545  	typ := &b.Func.Config.Types
  2546  	// match: (Hmul32 x y)
  2547  	// cond:
  2548  	// result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y)))
  2549  	for {
  2550  		y := v.Args[1]
  2551  		x := v.Args[0]
  2552  		v.reset(OpS390XSRDconst)
  2553  		v.AuxInt = 32
  2554  		v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64)
  2555  		v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
  2556  		v1.AddArg(x)
  2557  		v0.AddArg(v1)
  2558  		v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
  2559  		v2.AddArg(y)
  2560  		v0.AddArg(v2)
  2561  		v.AddArg(v0)
  2562  		return true
  2563  	}
  2564  }
  2565  func rewriteValueS390X_OpHmul32u_0(v *Value) bool {
  2566  	b := v.Block
  2567  	typ := &b.Func.Config.Types
  2568  	// match: (Hmul32u x y)
  2569  	// cond:
  2570  	// result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y)))
  2571  	for {
  2572  		y := v.Args[1]
  2573  		x := v.Args[0]
  2574  		v.reset(OpS390XSRDconst)
  2575  		v.AuxInt = 32
  2576  		v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64)
  2577  		v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
  2578  		v1.AddArg(x)
  2579  		v0.AddArg(v1)
  2580  		v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
  2581  		v2.AddArg(y)
  2582  		v0.AddArg(v2)
  2583  		v.AddArg(v0)
  2584  		return true
  2585  	}
  2586  }
  2587  func rewriteValueS390X_OpHmul64_0(v *Value) bool {
  2588  	// match: (Hmul64 x y)
  2589  	// cond:
  2590  	// result: (MULHD x y)
  2591  	for {
  2592  		y := v.Args[1]
  2593  		x := v.Args[0]
  2594  		v.reset(OpS390XMULHD)
  2595  		v.AddArg(x)
  2596  		v.AddArg(y)
  2597  		return true
  2598  	}
  2599  }
  2600  func rewriteValueS390X_OpHmul64u_0(v *Value) bool {
  2601  	// match: (Hmul64u x y)
  2602  	// cond:
  2603  	// result: (MULHDU x y)
  2604  	for {
  2605  		y := v.Args[1]
  2606  		x := v.Args[0]
  2607  		v.reset(OpS390XMULHDU)
  2608  		v.AddArg(x)
  2609  		v.AddArg(y)
  2610  		return true
  2611  	}
  2612  }
  2613  func rewriteValueS390X_OpITab_0(v *Value) bool {
  2614  	// match: (ITab (Load ptr mem))
  2615  	// cond:
  2616  	// result: (MOVDload ptr mem)
  2617  	for {
  2618  		v_0 := v.Args[0]
  2619  		if v_0.Op != OpLoad {
  2620  			break
  2621  		}
  2622  		mem := v_0.Args[1]
  2623  		ptr := v_0.Args[0]
  2624  		v.reset(OpS390XMOVDload)
  2625  		v.AddArg(ptr)
  2626  		v.AddArg(mem)
  2627  		return true
  2628  	}
  2629  	return false
  2630  }
  2631  func rewriteValueS390X_OpInterCall_0(v *Value) bool {
  2632  	// match: (InterCall [argwid] entry mem)
  2633  	// cond:
  2634  	// result: (CALLinter [argwid] entry mem)
  2635  	for {
  2636  		argwid := v.AuxInt
  2637  		mem := v.Args[1]
  2638  		entry := v.Args[0]
  2639  		v.reset(OpS390XCALLinter)
  2640  		v.AuxInt = argwid
  2641  		v.AddArg(entry)
  2642  		v.AddArg(mem)
  2643  		return true
  2644  	}
  2645  }
  2646  func rewriteValueS390X_OpIsInBounds_0(v *Value) bool {
  2647  	b := v.Block
  2648  	typ := &b.Func.Config.Types
  2649  	// match: (IsInBounds idx len)
  2650  	// cond:
  2651  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len))
  2652  	for {
  2653  		len := v.Args[1]
  2654  		idx := v.Args[0]
  2655  		v.reset(OpS390XMOVDLT)
  2656  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2657  		v0.AuxInt = 0
  2658  		v.AddArg(v0)
  2659  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2660  		v1.AuxInt = 1
  2661  		v.AddArg(v1)
  2662  		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
  2663  		v2.AddArg(idx)
  2664  		v2.AddArg(len)
  2665  		v.AddArg(v2)
  2666  		return true
  2667  	}
  2668  }
  2669  func rewriteValueS390X_OpIsNonNil_0(v *Value) bool {
  2670  	b := v.Block
  2671  	typ := &b.Func.Config.Types
  2672  	// match: (IsNonNil p)
  2673  	// cond:
  2674  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0]))
  2675  	for {
  2676  		p := v.Args[0]
  2677  		v.reset(OpS390XMOVDNE)
  2678  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2679  		v0.AuxInt = 0
  2680  		v.AddArg(v0)
  2681  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2682  		v1.AuxInt = 1
  2683  		v.AddArg(v1)
  2684  		v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags)
  2685  		v2.AuxInt = 0
  2686  		v2.AddArg(p)
  2687  		v.AddArg(v2)
  2688  		return true
  2689  	}
  2690  }
  2691  func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool {
  2692  	b := v.Block
  2693  	typ := &b.Func.Config.Types
  2694  	// match: (IsSliceInBounds idx len)
  2695  	// cond:
  2696  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len))
  2697  	for {
  2698  		len := v.Args[1]
  2699  		idx := v.Args[0]
  2700  		v.reset(OpS390XMOVDLE)
  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_OpLeq16_0(v *Value) bool {
  2715  	b := v.Block
  2716  	typ := &b.Func.Config.Types
  2717  	// match: (Leq16 x y)
  2718  	// cond:
  2719  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y)))
  2720  	for {
  2721  		y := v.Args[1]
  2722  		x := v.Args[0]
  2723  		v.reset(OpS390XMOVDLE)
  2724  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2725  		v0.AuxInt = 0
  2726  		v.AddArg(v0)
  2727  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2728  		v1.AuxInt = 1
  2729  		v.AddArg(v1)
  2730  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2731  		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2732  		v3.AddArg(x)
  2733  		v2.AddArg(v3)
  2734  		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2735  		v4.AddArg(y)
  2736  		v2.AddArg(v4)
  2737  		v.AddArg(v2)
  2738  		return true
  2739  	}
  2740  }
  2741  func rewriteValueS390X_OpLeq16U_0(v *Value) bool {
  2742  	b := v.Block
  2743  	typ := &b.Func.Config.Types
  2744  	// match: (Leq16U x y)
  2745  	// cond:
  2746  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y)))
  2747  	for {
  2748  		y := v.Args[1]
  2749  		x := v.Args[0]
  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, OpS390XCMPWU, types.TypeFlags)
  2758  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  2759  		v3.AddArg(x)
  2760  		v2.AddArg(v3)
  2761  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  2762  		v4.AddArg(y)
  2763  		v2.AddArg(v4)
  2764  		v.AddArg(v2)
  2765  		return true
  2766  	}
  2767  }
  2768  func rewriteValueS390X_OpLeq32_0(v *Value) bool {
  2769  	b := v.Block
  2770  	typ := &b.Func.Config.Types
  2771  	// match: (Leq32 x y)
  2772  	// cond:
  2773  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
  2774  	for {
  2775  		y := v.Args[1]
  2776  		x := v.Args[0]
  2777  		v.reset(OpS390XMOVDLE)
  2778  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2779  		v0.AuxInt = 0
  2780  		v.AddArg(v0)
  2781  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2782  		v1.AuxInt = 1
  2783  		v.AddArg(v1)
  2784  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2785  		v2.AddArg(x)
  2786  		v2.AddArg(y)
  2787  		v.AddArg(v2)
  2788  		return true
  2789  	}
  2790  }
  2791  func rewriteValueS390X_OpLeq32F_0(v *Value) bool {
  2792  	b := v.Block
  2793  	typ := &b.Func.Config.Types
  2794  	// match: (Leq32F x y)
  2795  	// cond:
  2796  	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x))
  2797  	for {
  2798  		y := v.Args[1]
  2799  		x := v.Args[0]
  2800  		v.reset(OpS390XMOVDGEnoinv)
  2801  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2802  		v0.AuxInt = 0
  2803  		v.AddArg(v0)
  2804  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2805  		v1.AuxInt = 1
  2806  		v.AddArg(v1)
  2807  		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
  2808  		v2.AddArg(y)
  2809  		v2.AddArg(x)
  2810  		v.AddArg(v2)
  2811  		return true
  2812  	}
  2813  }
  2814  func rewriteValueS390X_OpLeq32U_0(v *Value) bool {
  2815  	b := v.Block
  2816  	typ := &b.Func.Config.Types
  2817  	// match: (Leq32U x y)
  2818  	// cond:
  2819  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
  2820  	for {
  2821  		y := v.Args[1]
  2822  		x := v.Args[0]
  2823  		v.reset(OpS390XMOVDLE)
  2824  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2825  		v0.AuxInt = 0
  2826  		v.AddArg(v0)
  2827  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2828  		v1.AuxInt = 1
  2829  		v.AddArg(v1)
  2830  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2831  		v2.AddArg(x)
  2832  		v2.AddArg(y)
  2833  		v.AddArg(v2)
  2834  		return true
  2835  	}
  2836  }
  2837  func rewriteValueS390X_OpLeq64_0(v *Value) bool {
  2838  	b := v.Block
  2839  	typ := &b.Func.Config.Types
  2840  	// match: (Leq64 x y)
  2841  	// cond:
  2842  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  2843  	for {
  2844  		y := v.Args[1]
  2845  		x := v.Args[0]
  2846  		v.reset(OpS390XMOVDLE)
  2847  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2848  		v0.AuxInt = 0
  2849  		v.AddArg(v0)
  2850  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2851  		v1.AuxInt = 1
  2852  		v.AddArg(v1)
  2853  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  2854  		v2.AddArg(x)
  2855  		v2.AddArg(y)
  2856  		v.AddArg(v2)
  2857  		return true
  2858  	}
  2859  }
  2860  func rewriteValueS390X_OpLeq64F_0(v *Value) bool {
  2861  	b := v.Block
  2862  	typ := &b.Func.Config.Types
  2863  	// match: (Leq64F x y)
  2864  	// cond:
  2865  	// result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x))
  2866  	for {
  2867  		y := v.Args[1]
  2868  		x := v.Args[0]
  2869  		v.reset(OpS390XMOVDGEnoinv)
  2870  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2871  		v0.AuxInt = 0
  2872  		v.AddArg(v0)
  2873  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2874  		v1.AuxInt = 1
  2875  		v.AddArg(v1)
  2876  		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
  2877  		v2.AddArg(y)
  2878  		v2.AddArg(x)
  2879  		v.AddArg(v2)
  2880  		return true
  2881  	}
  2882  }
  2883  func rewriteValueS390X_OpLeq64U_0(v *Value) bool {
  2884  	b := v.Block
  2885  	typ := &b.Func.Config.Types
  2886  	// match: (Leq64U x y)
  2887  	// cond:
  2888  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
  2889  	for {
  2890  		y := v.Args[1]
  2891  		x := v.Args[0]
  2892  		v.reset(OpS390XMOVDLE)
  2893  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2894  		v0.AuxInt = 0
  2895  		v.AddArg(v0)
  2896  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2897  		v1.AuxInt = 1
  2898  		v.AddArg(v1)
  2899  		v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags)
  2900  		v2.AddArg(x)
  2901  		v2.AddArg(y)
  2902  		v.AddArg(v2)
  2903  		return true
  2904  	}
  2905  }
  2906  func rewriteValueS390X_OpLeq8_0(v *Value) bool {
  2907  	b := v.Block
  2908  	typ := &b.Func.Config.Types
  2909  	// match: (Leq8 x y)
  2910  	// cond:
  2911  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  2912  	for {
  2913  		y := v.Args[1]
  2914  		x := v.Args[0]
  2915  		v.reset(OpS390XMOVDLE)
  2916  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2917  		v0.AuxInt = 0
  2918  		v.AddArg(v0)
  2919  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2920  		v1.AuxInt = 1
  2921  		v.AddArg(v1)
  2922  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2923  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  2924  		v3.AddArg(x)
  2925  		v2.AddArg(v3)
  2926  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  2927  		v4.AddArg(y)
  2928  		v2.AddArg(v4)
  2929  		v.AddArg(v2)
  2930  		return true
  2931  	}
  2932  }
  2933  func rewriteValueS390X_OpLeq8U_0(v *Value) bool {
  2934  	b := v.Block
  2935  	typ := &b.Func.Config.Types
  2936  	// match: (Leq8U x y)
  2937  	// cond:
  2938  	// result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y)))
  2939  	for {
  2940  		y := v.Args[1]
  2941  		x := v.Args[0]
  2942  		v.reset(OpS390XMOVDLE)
  2943  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2944  		v0.AuxInt = 0
  2945  		v.AddArg(v0)
  2946  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2947  		v1.AuxInt = 1
  2948  		v.AddArg(v1)
  2949  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  2950  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  2951  		v3.AddArg(x)
  2952  		v2.AddArg(v3)
  2953  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  2954  		v4.AddArg(y)
  2955  		v2.AddArg(v4)
  2956  		v.AddArg(v2)
  2957  		return true
  2958  	}
  2959  }
  2960  func rewriteValueS390X_OpLess16_0(v *Value) bool {
  2961  	b := v.Block
  2962  	typ := &b.Func.Config.Types
  2963  	// match: (Less16 x y)
  2964  	// cond:
  2965  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y)))
  2966  	for {
  2967  		y := v.Args[1]
  2968  		x := v.Args[0]
  2969  		v.reset(OpS390XMOVDLT)
  2970  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2971  		v0.AuxInt = 0
  2972  		v.AddArg(v0)
  2973  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2974  		v1.AuxInt = 1
  2975  		v.AddArg(v1)
  2976  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  2977  		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2978  		v3.AddArg(x)
  2979  		v2.AddArg(v3)
  2980  		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  2981  		v4.AddArg(y)
  2982  		v2.AddArg(v4)
  2983  		v.AddArg(v2)
  2984  		return true
  2985  	}
  2986  }
  2987  func rewriteValueS390X_OpLess16U_0(v *Value) bool {
  2988  	b := v.Block
  2989  	typ := &b.Func.Config.Types
  2990  	// match: (Less16U x y)
  2991  	// cond:
  2992  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y)))
  2993  	for {
  2994  		y := v.Args[1]
  2995  		x := v.Args[0]
  2996  		v.reset(OpS390XMOVDLT)
  2997  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  2998  		v0.AuxInt = 0
  2999  		v.AddArg(v0)
  3000  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3001  		v1.AuxInt = 1
  3002  		v.AddArg(v1)
  3003  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  3004  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  3005  		v3.AddArg(x)
  3006  		v2.AddArg(v3)
  3007  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  3008  		v4.AddArg(y)
  3009  		v2.AddArg(v4)
  3010  		v.AddArg(v2)
  3011  		return true
  3012  	}
  3013  }
  3014  func rewriteValueS390X_OpLess32_0(v *Value) bool {
  3015  	b := v.Block
  3016  	typ := &b.Func.Config.Types
  3017  	// match: (Less32 x y)
  3018  	// cond:
  3019  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
  3020  	for {
  3021  		y := v.Args[1]
  3022  		x := v.Args[0]
  3023  		v.reset(OpS390XMOVDLT)
  3024  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3025  		v0.AuxInt = 0
  3026  		v.AddArg(v0)
  3027  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3028  		v1.AuxInt = 1
  3029  		v.AddArg(v1)
  3030  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  3031  		v2.AddArg(x)
  3032  		v2.AddArg(y)
  3033  		v.AddArg(v2)
  3034  		return true
  3035  	}
  3036  }
  3037  func rewriteValueS390X_OpLess32F_0(v *Value) bool {
  3038  	b := v.Block
  3039  	typ := &b.Func.Config.Types
  3040  	// match: (Less32F x y)
  3041  	// cond:
  3042  	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x))
  3043  	for {
  3044  		y := v.Args[1]
  3045  		x := v.Args[0]
  3046  		v.reset(OpS390XMOVDGTnoinv)
  3047  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3048  		v0.AuxInt = 0
  3049  		v.AddArg(v0)
  3050  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3051  		v1.AuxInt = 1
  3052  		v.AddArg(v1)
  3053  		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
  3054  		v2.AddArg(y)
  3055  		v2.AddArg(x)
  3056  		v.AddArg(v2)
  3057  		return true
  3058  	}
  3059  }
  3060  func rewriteValueS390X_OpLess32U_0(v *Value) bool {
  3061  	b := v.Block
  3062  	typ := &b.Func.Config.Types
  3063  	// match: (Less32U x y)
  3064  	// cond:
  3065  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y))
  3066  	for {
  3067  		y := v.Args[1]
  3068  		x := v.Args[0]
  3069  		v.reset(OpS390XMOVDLT)
  3070  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3071  		v0.AuxInt = 0
  3072  		v.AddArg(v0)
  3073  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3074  		v1.AuxInt = 1
  3075  		v.AddArg(v1)
  3076  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  3077  		v2.AddArg(x)
  3078  		v2.AddArg(y)
  3079  		v.AddArg(v2)
  3080  		return true
  3081  	}
  3082  }
  3083  func rewriteValueS390X_OpLess64_0(v *Value) bool {
  3084  	b := v.Block
  3085  	typ := &b.Func.Config.Types
  3086  	// match: (Less64 x y)
  3087  	// cond:
  3088  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  3089  	for {
  3090  		y := v.Args[1]
  3091  		x := v.Args[0]
  3092  		v.reset(OpS390XMOVDLT)
  3093  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3094  		v0.AuxInt = 0
  3095  		v.AddArg(v0)
  3096  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3097  		v1.AuxInt = 1
  3098  		v.AddArg(v1)
  3099  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  3100  		v2.AddArg(x)
  3101  		v2.AddArg(y)
  3102  		v.AddArg(v2)
  3103  		return true
  3104  	}
  3105  }
  3106  func rewriteValueS390X_OpLess64F_0(v *Value) bool {
  3107  	b := v.Block
  3108  	typ := &b.Func.Config.Types
  3109  	// match: (Less64F x y)
  3110  	// cond:
  3111  	// result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x))
  3112  	for {
  3113  		y := v.Args[1]
  3114  		x := v.Args[0]
  3115  		v.reset(OpS390XMOVDGTnoinv)
  3116  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3117  		v0.AuxInt = 0
  3118  		v.AddArg(v0)
  3119  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3120  		v1.AuxInt = 1
  3121  		v.AddArg(v1)
  3122  		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
  3123  		v2.AddArg(y)
  3124  		v2.AddArg(x)
  3125  		v.AddArg(v2)
  3126  		return true
  3127  	}
  3128  }
  3129  func rewriteValueS390X_OpLess64U_0(v *Value) bool {
  3130  	b := v.Block
  3131  	typ := &b.Func.Config.Types
  3132  	// match: (Less64U x y)
  3133  	// cond:
  3134  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y))
  3135  	for {
  3136  		y := v.Args[1]
  3137  		x := v.Args[0]
  3138  		v.reset(OpS390XMOVDLT)
  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, OpS390XCMPU, types.TypeFlags)
  3146  		v2.AddArg(x)
  3147  		v2.AddArg(y)
  3148  		v.AddArg(v2)
  3149  		return true
  3150  	}
  3151  }
  3152  func rewriteValueS390X_OpLess8_0(v *Value) bool {
  3153  	b := v.Block
  3154  	typ := &b.Func.Config.Types
  3155  	// match: (Less8 x y)
  3156  	// cond:
  3157  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  3158  	for {
  3159  		y := v.Args[1]
  3160  		x := v.Args[0]
  3161  		v.reset(OpS390XMOVDLT)
  3162  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3163  		v0.AuxInt = 0
  3164  		v.AddArg(v0)
  3165  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3166  		v1.AuxInt = 1
  3167  		v.AddArg(v1)
  3168  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  3169  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  3170  		v3.AddArg(x)
  3171  		v2.AddArg(v3)
  3172  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  3173  		v4.AddArg(y)
  3174  		v2.AddArg(v4)
  3175  		v.AddArg(v2)
  3176  		return true
  3177  	}
  3178  }
  3179  func rewriteValueS390X_OpLess8U_0(v *Value) bool {
  3180  	b := v.Block
  3181  	typ := &b.Func.Config.Types
  3182  	// match: (Less8U x y)
  3183  	// cond:
  3184  	// result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y)))
  3185  	for {
  3186  		y := v.Args[1]
  3187  		x := v.Args[0]
  3188  		v.reset(OpS390XMOVDLT)
  3189  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3190  		v0.AuxInt = 0
  3191  		v.AddArg(v0)
  3192  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3193  		v1.AuxInt = 1
  3194  		v.AddArg(v1)
  3195  		v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags)
  3196  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  3197  		v3.AddArg(x)
  3198  		v2.AddArg(v3)
  3199  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  3200  		v4.AddArg(y)
  3201  		v2.AddArg(v4)
  3202  		v.AddArg(v2)
  3203  		return true
  3204  	}
  3205  }
  3206  func rewriteValueS390X_OpLoad_0(v *Value) bool {
  3207  	// match: (Load <t> ptr mem)
  3208  	// cond: (is64BitInt(t) || isPtr(t))
  3209  	// result: (MOVDload ptr mem)
  3210  	for {
  3211  		t := v.Type
  3212  		mem := v.Args[1]
  3213  		ptr := v.Args[0]
  3214  		if !(is64BitInt(t) || isPtr(t)) {
  3215  			break
  3216  		}
  3217  		v.reset(OpS390XMOVDload)
  3218  		v.AddArg(ptr)
  3219  		v.AddArg(mem)
  3220  		return true
  3221  	}
  3222  	// match: (Load <t> ptr mem)
  3223  	// cond: is32BitInt(t) && isSigned(t)
  3224  	// result: (MOVWload ptr mem)
  3225  	for {
  3226  		t := v.Type
  3227  		mem := v.Args[1]
  3228  		ptr := v.Args[0]
  3229  		if !(is32BitInt(t) && isSigned(t)) {
  3230  			break
  3231  		}
  3232  		v.reset(OpS390XMOVWload)
  3233  		v.AddArg(ptr)
  3234  		v.AddArg(mem)
  3235  		return true
  3236  	}
  3237  	// match: (Load <t> ptr mem)
  3238  	// cond: is32BitInt(t) && !isSigned(t)
  3239  	// result: (MOVWZload ptr mem)
  3240  	for {
  3241  		t := v.Type
  3242  		mem := v.Args[1]
  3243  		ptr := v.Args[0]
  3244  		if !(is32BitInt(t) && !isSigned(t)) {
  3245  			break
  3246  		}
  3247  		v.reset(OpS390XMOVWZload)
  3248  		v.AddArg(ptr)
  3249  		v.AddArg(mem)
  3250  		return true
  3251  	}
  3252  	// match: (Load <t> ptr mem)
  3253  	// cond: is16BitInt(t) && isSigned(t)
  3254  	// result: (MOVHload ptr mem)
  3255  	for {
  3256  		t := v.Type
  3257  		mem := v.Args[1]
  3258  		ptr := v.Args[0]
  3259  		if !(is16BitInt(t) && isSigned(t)) {
  3260  			break
  3261  		}
  3262  		v.reset(OpS390XMOVHload)
  3263  		v.AddArg(ptr)
  3264  		v.AddArg(mem)
  3265  		return true
  3266  	}
  3267  	// match: (Load <t> ptr mem)
  3268  	// cond: is16BitInt(t) && !isSigned(t)
  3269  	// result: (MOVHZload ptr mem)
  3270  	for {
  3271  		t := v.Type
  3272  		mem := v.Args[1]
  3273  		ptr := v.Args[0]
  3274  		if !(is16BitInt(t) && !isSigned(t)) {
  3275  			break
  3276  		}
  3277  		v.reset(OpS390XMOVHZload)
  3278  		v.AddArg(ptr)
  3279  		v.AddArg(mem)
  3280  		return true
  3281  	}
  3282  	// match: (Load <t> ptr mem)
  3283  	// cond: is8BitInt(t) && isSigned(t)
  3284  	// result: (MOVBload ptr mem)
  3285  	for {
  3286  		t := v.Type
  3287  		mem := v.Args[1]
  3288  		ptr := v.Args[0]
  3289  		if !(is8BitInt(t) && isSigned(t)) {
  3290  			break
  3291  		}
  3292  		v.reset(OpS390XMOVBload)
  3293  		v.AddArg(ptr)
  3294  		v.AddArg(mem)
  3295  		return true
  3296  	}
  3297  	// match: (Load <t> ptr mem)
  3298  	// cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t)))
  3299  	// result: (MOVBZload ptr mem)
  3300  	for {
  3301  		t := v.Type
  3302  		mem := v.Args[1]
  3303  		ptr := v.Args[0]
  3304  		if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) {
  3305  			break
  3306  		}
  3307  		v.reset(OpS390XMOVBZload)
  3308  		v.AddArg(ptr)
  3309  		v.AddArg(mem)
  3310  		return true
  3311  	}
  3312  	// match: (Load <t> ptr mem)
  3313  	// cond: is32BitFloat(t)
  3314  	// result: (FMOVSload ptr mem)
  3315  	for {
  3316  		t := v.Type
  3317  		mem := v.Args[1]
  3318  		ptr := v.Args[0]
  3319  		if !(is32BitFloat(t)) {
  3320  			break
  3321  		}
  3322  		v.reset(OpS390XFMOVSload)
  3323  		v.AddArg(ptr)
  3324  		v.AddArg(mem)
  3325  		return true
  3326  	}
  3327  	// match: (Load <t> ptr mem)
  3328  	// cond: is64BitFloat(t)
  3329  	// result: (FMOVDload ptr mem)
  3330  	for {
  3331  		t := v.Type
  3332  		mem := v.Args[1]
  3333  		ptr := v.Args[0]
  3334  		if !(is64BitFloat(t)) {
  3335  			break
  3336  		}
  3337  		v.reset(OpS390XFMOVDload)
  3338  		v.AddArg(ptr)
  3339  		v.AddArg(mem)
  3340  		return true
  3341  	}
  3342  	return false
  3343  }
  3344  func rewriteValueS390X_OpLocalAddr_0(v *Value) bool {
  3345  	// match: (LocalAddr {sym} base _)
  3346  	// cond:
  3347  	// result: (MOVDaddr {sym} base)
  3348  	for {
  3349  		sym := v.Aux
  3350  		_ = v.Args[1]
  3351  		base := v.Args[0]
  3352  		v.reset(OpS390XMOVDaddr)
  3353  		v.Aux = sym
  3354  		v.AddArg(base)
  3355  		return true
  3356  	}
  3357  }
  3358  func rewriteValueS390X_OpLsh16x16_0(v *Value) bool {
  3359  	b := v.Block
  3360  	typ := &b.Func.Config.Types
  3361  	// match: (Lsh16x16 x y)
  3362  	// cond: shiftIsBounded(v)
  3363  	// result: (SLW x y)
  3364  	for {
  3365  		y := v.Args[1]
  3366  		x := v.Args[0]
  3367  		if !(shiftIsBounded(v)) {
  3368  			break
  3369  		}
  3370  		v.reset(OpS390XSLW)
  3371  		v.AddArg(x)
  3372  		v.AddArg(y)
  3373  		return true
  3374  	}
  3375  	// match: (Lsh16x16 <t> x y)
  3376  	// cond:
  3377  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  3378  	for {
  3379  		t := v.Type
  3380  		y := v.Args[1]
  3381  		x := v.Args[0]
  3382  		v.reset(OpS390XMOVDGE)
  3383  		v.Type = t
  3384  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3385  		v0.AddArg(x)
  3386  		v0.AddArg(y)
  3387  		v.AddArg(v0)
  3388  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3389  		v1.AuxInt = 0
  3390  		v.AddArg(v1)
  3391  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3392  		v2.AuxInt = 64
  3393  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  3394  		v3.AddArg(y)
  3395  		v2.AddArg(v3)
  3396  		v.AddArg(v2)
  3397  		return true
  3398  	}
  3399  }
  3400  func rewriteValueS390X_OpLsh16x32_0(v *Value) bool {
  3401  	b := v.Block
  3402  	typ := &b.Func.Config.Types
  3403  	// match: (Lsh16x32 x y)
  3404  	// cond: shiftIsBounded(v)
  3405  	// result: (SLW x y)
  3406  	for {
  3407  		y := v.Args[1]
  3408  		x := v.Args[0]
  3409  		if !(shiftIsBounded(v)) {
  3410  			break
  3411  		}
  3412  		v.reset(OpS390XSLW)
  3413  		v.AddArg(x)
  3414  		v.AddArg(y)
  3415  		return true
  3416  	}
  3417  	// match: (Lsh16x32 <t> x y)
  3418  	// cond:
  3419  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
  3420  	for {
  3421  		t := v.Type
  3422  		y := v.Args[1]
  3423  		x := v.Args[0]
  3424  		v.reset(OpS390XMOVDGE)
  3425  		v.Type = t
  3426  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3427  		v0.AddArg(x)
  3428  		v0.AddArg(y)
  3429  		v.AddArg(v0)
  3430  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3431  		v1.AuxInt = 0
  3432  		v.AddArg(v1)
  3433  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3434  		v2.AuxInt = 64
  3435  		v2.AddArg(y)
  3436  		v.AddArg(v2)
  3437  		return true
  3438  	}
  3439  }
  3440  func rewriteValueS390X_OpLsh16x64_0(v *Value) bool {
  3441  	b := v.Block
  3442  	typ := &b.Func.Config.Types
  3443  	// match: (Lsh16x64 x y)
  3444  	// cond: shiftIsBounded(v)
  3445  	// result: (SLW x y)
  3446  	for {
  3447  		y := v.Args[1]
  3448  		x := v.Args[0]
  3449  		if !(shiftIsBounded(v)) {
  3450  			break
  3451  		}
  3452  		v.reset(OpS390XSLW)
  3453  		v.AddArg(x)
  3454  		v.AddArg(y)
  3455  		return true
  3456  	}
  3457  	// match: (Lsh16x64 <t> x y)
  3458  	// cond:
  3459  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
  3460  	for {
  3461  		t := v.Type
  3462  		y := v.Args[1]
  3463  		x := v.Args[0]
  3464  		v.reset(OpS390XMOVDGE)
  3465  		v.Type = t
  3466  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3467  		v0.AddArg(x)
  3468  		v0.AddArg(y)
  3469  		v.AddArg(v0)
  3470  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3471  		v1.AuxInt = 0
  3472  		v.AddArg(v1)
  3473  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  3474  		v2.AuxInt = 64
  3475  		v2.AddArg(y)
  3476  		v.AddArg(v2)
  3477  		return true
  3478  	}
  3479  }
  3480  func rewriteValueS390X_OpLsh16x8_0(v *Value) bool {
  3481  	b := v.Block
  3482  	typ := &b.Func.Config.Types
  3483  	// match: (Lsh16x8 x y)
  3484  	// cond: shiftIsBounded(v)
  3485  	// result: (SLW x y)
  3486  	for {
  3487  		y := v.Args[1]
  3488  		x := v.Args[0]
  3489  		if !(shiftIsBounded(v)) {
  3490  			break
  3491  		}
  3492  		v.reset(OpS390XSLW)
  3493  		v.AddArg(x)
  3494  		v.AddArg(y)
  3495  		return true
  3496  	}
  3497  	// match: (Lsh16x8 <t> x y)
  3498  	// cond:
  3499  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  3500  	for {
  3501  		t := v.Type
  3502  		y := v.Args[1]
  3503  		x := v.Args[0]
  3504  		v.reset(OpS390XMOVDGE)
  3505  		v.Type = t
  3506  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3507  		v0.AddArg(x)
  3508  		v0.AddArg(y)
  3509  		v.AddArg(v0)
  3510  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3511  		v1.AuxInt = 0
  3512  		v.AddArg(v1)
  3513  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3514  		v2.AuxInt = 64
  3515  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  3516  		v3.AddArg(y)
  3517  		v2.AddArg(v3)
  3518  		v.AddArg(v2)
  3519  		return true
  3520  	}
  3521  }
  3522  func rewriteValueS390X_OpLsh32x16_0(v *Value) bool {
  3523  	b := v.Block
  3524  	typ := &b.Func.Config.Types
  3525  	// match: (Lsh32x16 x y)
  3526  	// cond: shiftIsBounded(v)
  3527  	// result: (SLW x y)
  3528  	for {
  3529  		y := v.Args[1]
  3530  		x := v.Args[0]
  3531  		if !(shiftIsBounded(v)) {
  3532  			break
  3533  		}
  3534  		v.reset(OpS390XSLW)
  3535  		v.AddArg(x)
  3536  		v.AddArg(y)
  3537  		return true
  3538  	}
  3539  	// match: (Lsh32x16 <t> x y)
  3540  	// cond:
  3541  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  3542  	for {
  3543  		t := v.Type
  3544  		y := v.Args[1]
  3545  		x := v.Args[0]
  3546  		v.reset(OpS390XMOVDGE)
  3547  		v.Type = t
  3548  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3549  		v0.AddArg(x)
  3550  		v0.AddArg(y)
  3551  		v.AddArg(v0)
  3552  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3553  		v1.AuxInt = 0
  3554  		v.AddArg(v1)
  3555  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3556  		v2.AuxInt = 64
  3557  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  3558  		v3.AddArg(y)
  3559  		v2.AddArg(v3)
  3560  		v.AddArg(v2)
  3561  		return true
  3562  	}
  3563  }
  3564  func rewriteValueS390X_OpLsh32x32_0(v *Value) bool {
  3565  	b := v.Block
  3566  	typ := &b.Func.Config.Types
  3567  	// match: (Lsh32x32 x y)
  3568  	// cond: shiftIsBounded(v)
  3569  	// result: (SLW x y)
  3570  	for {
  3571  		y := v.Args[1]
  3572  		x := v.Args[0]
  3573  		if !(shiftIsBounded(v)) {
  3574  			break
  3575  		}
  3576  		v.reset(OpS390XSLW)
  3577  		v.AddArg(x)
  3578  		v.AddArg(y)
  3579  		return true
  3580  	}
  3581  	// match: (Lsh32x32 <t> x y)
  3582  	// cond:
  3583  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
  3584  	for {
  3585  		t := v.Type
  3586  		y := v.Args[1]
  3587  		x := v.Args[0]
  3588  		v.reset(OpS390XMOVDGE)
  3589  		v.Type = t
  3590  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3591  		v0.AddArg(x)
  3592  		v0.AddArg(y)
  3593  		v.AddArg(v0)
  3594  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3595  		v1.AuxInt = 0
  3596  		v.AddArg(v1)
  3597  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3598  		v2.AuxInt = 64
  3599  		v2.AddArg(y)
  3600  		v.AddArg(v2)
  3601  		return true
  3602  	}
  3603  }
  3604  func rewriteValueS390X_OpLsh32x64_0(v *Value) bool {
  3605  	b := v.Block
  3606  	typ := &b.Func.Config.Types
  3607  	// match: (Lsh32x64 x y)
  3608  	// cond: shiftIsBounded(v)
  3609  	// result: (SLW x y)
  3610  	for {
  3611  		y := v.Args[1]
  3612  		x := v.Args[0]
  3613  		if !(shiftIsBounded(v)) {
  3614  			break
  3615  		}
  3616  		v.reset(OpS390XSLW)
  3617  		v.AddArg(x)
  3618  		v.AddArg(y)
  3619  		return true
  3620  	}
  3621  	// match: (Lsh32x64 <t> x y)
  3622  	// cond:
  3623  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
  3624  	for {
  3625  		t := v.Type
  3626  		y := v.Args[1]
  3627  		x := v.Args[0]
  3628  		v.reset(OpS390XMOVDGE)
  3629  		v.Type = t
  3630  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3631  		v0.AddArg(x)
  3632  		v0.AddArg(y)
  3633  		v.AddArg(v0)
  3634  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3635  		v1.AuxInt = 0
  3636  		v.AddArg(v1)
  3637  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  3638  		v2.AuxInt = 64
  3639  		v2.AddArg(y)
  3640  		v.AddArg(v2)
  3641  		return true
  3642  	}
  3643  }
  3644  func rewriteValueS390X_OpLsh32x8_0(v *Value) bool {
  3645  	b := v.Block
  3646  	typ := &b.Func.Config.Types
  3647  	// match: (Lsh32x8 x y)
  3648  	// cond: shiftIsBounded(v)
  3649  	// result: (SLW x y)
  3650  	for {
  3651  		y := v.Args[1]
  3652  		x := v.Args[0]
  3653  		if !(shiftIsBounded(v)) {
  3654  			break
  3655  		}
  3656  		v.reset(OpS390XSLW)
  3657  		v.AddArg(x)
  3658  		v.AddArg(y)
  3659  		return true
  3660  	}
  3661  	// match: (Lsh32x8 <t> x y)
  3662  	// cond:
  3663  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  3664  	for {
  3665  		t := v.Type
  3666  		y := v.Args[1]
  3667  		x := v.Args[0]
  3668  		v.reset(OpS390XMOVDGE)
  3669  		v.Type = t
  3670  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3671  		v0.AddArg(x)
  3672  		v0.AddArg(y)
  3673  		v.AddArg(v0)
  3674  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3675  		v1.AuxInt = 0
  3676  		v.AddArg(v1)
  3677  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3678  		v2.AuxInt = 64
  3679  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  3680  		v3.AddArg(y)
  3681  		v2.AddArg(v3)
  3682  		v.AddArg(v2)
  3683  		return true
  3684  	}
  3685  }
  3686  func rewriteValueS390X_OpLsh64x16_0(v *Value) bool {
  3687  	b := v.Block
  3688  	typ := &b.Func.Config.Types
  3689  	// match: (Lsh64x16 x y)
  3690  	// cond: shiftIsBounded(v)
  3691  	// result: (SLD x y)
  3692  	for {
  3693  		y := v.Args[1]
  3694  		x := v.Args[0]
  3695  		if !(shiftIsBounded(v)) {
  3696  			break
  3697  		}
  3698  		v.reset(OpS390XSLD)
  3699  		v.AddArg(x)
  3700  		v.AddArg(y)
  3701  		return true
  3702  	}
  3703  	// match: (Lsh64x16 <t> x y)
  3704  	// cond:
  3705  	// result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  3706  	for {
  3707  		t := v.Type
  3708  		y := v.Args[1]
  3709  		x := v.Args[0]
  3710  		v.reset(OpS390XMOVDGE)
  3711  		v.Type = t
  3712  		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
  3713  		v0.AddArg(x)
  3714  		v0.AddArg(y)
  3715  		v.AddArg(v0)
  3716  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3717  		v1.AuxInt = 0
  3718  		v.AddArg(v1)
  3719  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3720  		v2.AuxInt = 64
  3721  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  3722  		v3.AddArg(y)
  3723  		v2.AddArg(v3)
  3724  		v.AddArg(v2)
  3725  		return true
  3726  	}
  3727  }
  3728  func rewriteValueS390X_OpLsh64x32_0(v *Value) bool {
  3729  	b := v.Block
  3730  	typ := &b.Func.Config.Types
  3731  	// match: (Lsh64x32 x y)
  3732  	// cond: shiftIsBounded(v)
  3733  	// result: (SLD x y)
  3734  	for {
  3735  		y := v.Args[1]
  3736  		x := v.Args[0]
  3737  		if !(shiftIsBounded(v)) {
  3738  			break
  3739  		}
  3740  		v.reset(OpS390XSLD)
  3741  		v.AddArg(x)
  3742  		v.AddArg(y)
  3743  		return true
  3744  	}
  3745  	// match: (Lsh64x32 <t> x y)
  3746  	// cond:
  3747  	// result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
  3748  	for {
  3749  		t := v.Type
  3750  		y := v.Args[1]
  3751  		x := v.Args[0]
  3752  		v.reset(OpS390XMOVDGE)
  3753  		v.Type = t
  3754  		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
  3755  		v0.AddArg(x)
  3756  		v0.AddArg(y)
  3757  		v.AddArg(v0)
  3758  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3759  		v1.AuxInt = 0
  3760  		v.AddArg(v1)
  3761  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3762  		v2.AuxInt = 64
  3763  		v2.AddArg(y)
  3764  		v.AddArg(v2)
  3765  		return true
  3766  	}
  3767  }
  3768  func rewriteValueS390X_OpLsh64x64_0(v *Value) bool {
  3769  	b := v.Block
  3770  	typ := &b.Func.Config.Types
  3771  	// match: (Lsh64x64 x y)
  3772  	// cond: shiftIsBounded(v)
  3773  	// result: (SLD x y)
  3774  	for {
  3775  		y := v.Args[1]
  3776  		x := v.Args[0]
  3777  		if !(shiftIsBounded(v)) {
  3778  			break
  3779  		}
  3780  		v.reset(OpS390XSLD)
  3781  		v.AddArg(x)
  3782  		v.AddArg(y)
  3783  		return true
  3784  	}
  3785  	// match: (Lsh64x64 <t> x y)
  3786  	// cond:
  3787  	// result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
  3788  	for {
  3789  		t := v.Type
  3790  		y := v.Args[1]
  3791  		x := v.Args[0]
  3792  		v.reset(OpS390XMOVDGE)
  3793  		v.Type = t
  3794  		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
  3795  		v0.AddArg(x)
  3796  		v0.AddArg(y)
  3797  		v.AddArg(v0)
  3798  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3799  		v1.AuxInt = 0
  3800  		v.AddArg(v1)
  3801  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  3802  		v2.AuxInt = 64
  3803  		v2.AddArg(y)
  3804  		v.AddArg(v2)
  3805  		return true
  3806  	}
  3807  }
  3808  func rewriteValueS390X_OpLsh64x8_0(v *Value) bool {
  3809  	b := v.Block
  3810  	typ := &b.Func.Config.Types
  3811  	// match: (Lsh64x8 x y)
  3812  	// cond: shiftIsBounded(v)
  3813  	// result: (SLD x y)
  3814  	for {
  3815  		y := v.Args[1]
  3816  		x := v.Args[0]
  3817  		if !(shiftIsBounded(v)) {
  3818  			break
  3819  		}
  3820  		v.reset(OpS390XSLD)
  3821  		v.AddArg(x)
  3822  		v.AddArg(y)
  3823  		return true
  3824  	}
  3825  	// match: (Lsh64x8 <t> x y)
  3826  	// cond:
  3827  	// result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  3828  	for {
  3829  		t := v.Type
  3830  		y := v.Args[1]
  3831  		x := v.Args[0]
  3832  		v.reset(OpS390XMOVDGE)
  3833  		v.Type = t
  3834  		v0 := b.NewValue0(v.Pos, OpS390XSLD, t)
  3835  		v0.AddArg(x)
  3836  		v0.AddArg(y)
  3837  		v.AddArg(v0)
  3838  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3839  		v1.AuxInt = 0
  3840  		v.AddArg(v1)
  3841  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3842  		v2.AuxInt = 64
  3843  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  3844  		v3.AddArg(y)
  3845  		v2.AddArg(v3)
  3846  		v.AddArg(v2)
  3847  		return true
  3848  	}
  3849  }
  3850  func rewriteValueS390X_OpLsh8x16_0(v *Value) bool {
  3851  	b := v.Block
  3852  	typ := &b.Func.Config.Types
  3853  	// match: (Lsh8x16 x y)
  3854  	// cond: shiftIsBounded(v)
  3855  	// result: (SLW x y)
  3856  	for {
  3857  		y := v.Args[1]
  3858  		x := v.Args[0]
  3859  		if !(shiftIsBounded(v)) {
  3860  			break
  3861  		}
  3862  		v.reset(OpS390XSLW)
  3863  		v.AddArg(x)
  3864  		v.AddArg(y)
  3865  		return true
  3866  	}
  3867  	// match: (Lsh8x16 <t> x y)
  3868  	// cond:
  3869  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  3870  	for {
  3871  		t := v.Type
  3872  		y := v.Args[1]
  3873  		x := v.Args[0]
  3874  		v.reset(OpS390XMOVDGE)
  3875  		v.Type = t
  3876  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3877  		v0.AddArg(x)
  3878  		v0.AddArg(y)
  3879  		v.AddArg(v0)
  3880  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3881  		v1.AuxInt = 0
  3882  		v.AddArg(v1)
  3883  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3884  		v2.AuxInt = 64
  3885  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  3886  		v3.AddArg(y)
  3887  		v2.AddArg(v3)
  3888  		v.AddArg(v2)
  3889  		return true
  3890  	}
  3891  }
  3892  func rewriteValueS390X_OpLsh8x32_0(v *Value) bool {
  3893  	b := v.Block
  3894  	typ := &b.Func.Config.Types
  3895  	// match: (Lsh8x32 x y)
  3896  	// cond: shiftIsBounded(v)
  3897  	// result: (SLW x y)
  3898  	for {
  3899  		y := v.Args[1]
  3900  		x := v.Args[0]
  3901  		if !(shiftIsBounded(v)) {
  3902  			break
  3903  		}
  3904  		v.reset(OpS390XSLW)
  3905  		v.AddArg(x)
  3906  		v.AddArg(y)
  3907  		return true
  3908  	}
  3909  	// match: (Lsh8x32 <t> x y)
  3910  	// cond:
  3911  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
  3912  	for {
  3913  		t := v.Type
  3914  		y := v.Args[1]
  3915  		x := v.Args[0]
  3916  		v.reset(OpS390XMOVDGE)
  3917  		v.Type = t
  3918  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3919  		v0.AddArg(x)
  3920  		v0.AddArg(y)
  3921  		v.AddArg(v0)
  3922  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3923  		v1.AuxInt = 0
  3924  		v.AddArg(v1)
  3925  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  3926  		v2.AuxInt = 64
  3927  		v2.AddArg(y)
  3928  		v.AddArg(v2)
  3929  		return true
  3930  	}
  3931  }
  3932  func rewriteValueS390X_OpLsh8x64_0(v *Value) bool {
  3933  	b := v.Block
  3934  	typ := &b.Func.Config.Types
  3935  	// match: (Lsh8x64 x y)
  3936  	// cond: shiftIsBounded(v)
  3937  	// result: (SLW x y)
  3938  	for {
  3939  		y := v.Args[1]
  3940  		x := v.Args[0]
  3941  		if !(shiftIsBounded(v)) {
  3942  			break
  3943  		}
  3944  		v.reset(OpS390XSLW)
  3945  		v.AddArg(x)
  3946  		v.AddArg(y)
  3947  		return true
  3948  	}
  3949  	// match: (Lsh8x64 <t> x y)
  3950  	// cond:
  3951  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
  3952  	for {
  3953  		t := v.Type
  3954  		y := v.Args[1]
  3955  		x := v.Args[0]
  3956  		v.reset(OpS390XMOVDGE)
  3957  		v.Type = t
  3958  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3959  		v0.AddArg(x)
  3960  		v0.AddArg(y)
  3961  		v.AddArg(v0)
  3962  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  3963  		v1.AuxInt = 0
  3964  		v.AddArg(v1)
  3965  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  3966  		v2.AuxInt = 64
  3967  		v2.AddArg(y)
  3968  		v.AddArg(v2)
  3969  		return true
  3970  	}
  3971  }
  3972  func rewriteValueS390X_OpLsh8x8_0(v *Value) bool {
  3973  	b := v.Block
  3974  	typ := &b.Func.Config.Types
  3975  	// match: (Lsh8x8 x y)
  3976  	// cond: shiftIsBounded(v)
  3977  	// result: (SLW x y)
  3978  	for {
  3979  		y := v.Args[1]
  3980  		x := v.Args[0]
  3981  		if !(shiftIsBounded(v)) {
  3982  			break
  3983  		}
  3984  		v.reset(OpS390XSLW)
  3985  		v.AddArg(x)
  3986  		v.AddArg(y)
  3987  		return true
  3988  	}
  3989  	// match: (Lsh8x8 <t> x y)
  3990  	// cond:
  3991  	// result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  3992  	for {
  3993  		t := v.Type
  3994  		y := v.Args[1]
  3995  		x := v.Args[0]
  3996  		v.reset(OpS390XMOVDGE)
  3997  		v.Type = t
  3998  		v0 := b.NewValue0(v.Pos, OpS390XSLW, t)
  3999  		v0.AddArg(x)
  4000  		v0.AddArg(y)
  4001  		v.AddArg(v0)
  4002  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4003  		v1.AuxInt = 0
  4004  		v.AddArg(v1)
  4005  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  4006  		v2.AuxInt = 64
  4007  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  4008  		v3.AddArg(y)
  4009  		v2.AddArg(v3)
  4010  		v.AddArg(v2)
  4011  		return true
  4012  	}
  4013  }
  4014  func rewriteValueS390X_OpMod16_0(v *Value) bool {
  4015  	b := v.Block
  4016  	typ := &b.Func.Config.Types
  4017  	// match: (Mod16 x y)
  4018  	// cond:
  4019  	// result: (MODW (MOVHreg x) (MOVHreg y))
  4020  	for {
  4021  		y := v.Args[1]
  4022  		x := v.Args[0]
  4023  		v.reset(OpS390XMODW)
  4024  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  4025  		v0.AddArg(x)
  4026  		v.AddArg(v0)
  4027  		v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  4028  		v1.AddArg(y)
  4029  		v.AddArg(v1)
  4030  		return true
  4031  	}
  4032  }
  4033  func rewriteValueS390X_OpMod16u_0(v *Value) bool {
  4034  	b := v.Block
  4035  	typ := &b.Func.Config.Types
  4036  	// match: (Mod16u x y)
  4037  	// cond:
  4038  	// result: (MODWU (MOVHZreg x) (MOVHZreg y))
  4039  	for {
  4040  		y := v.Args[1]
  4041  		x := v.Args[0]
  4042  		v.reset(OpS390XMODWU)
  4043  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  4044  		v0.AddArg(x)
  4045  		v.AddArg(v0)
  4046  		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  4047  		v1.AddArg(y)
  4048  		v.AddArg(v1)
  4049  		return true
  4050  	}
  4051  }
  4052  func rewriteValueS390X_OpMod32_0(v *Value) bool {
  4053  	b := v.Block
  4054  	typ := &b.Func.Config.Types
  4055  	// match: (Mod32 x y)
  4056  	// cond:
  4057  	// result: (MODW (MOVWreg x) y)
  4058  	for {
  4059  		y := v.Args[1]
  4060  		x := v.Args[0]
  4061  		v.reset(OpS390XMODW)
  4062  		v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64)
  4063  		v0.AddArg(x)
  4064  		v.AddArg(v0)
  4065  		v.AddArg(y)
  4066  		return true
  4067  	}
  4068  }
  4069  func rewriteValueS390X_OpMod32u_0(v *Value) bool {
  4070  	b := v.Block
  4071  	typ := &b.Func.Config.Types
  4072  	// match: (Mod32u x y)
  4073  	// cond:
  4074  	// result: (MODWU (MOVWZreg x) y)
  4075  	for {
  4076  		y := v.Args[1]
  4077  		x := v.Args[0]
  4078  		v.reset(OpS390XMODWU)
  4079  		v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64)
  4080  		v0.AddArg(x)
  4081  		v.AddArg(v0)
  4082  		v.AddArg(y)
  4083  		return true
  4084  	}
  4085  }
  4086  func rewriteValueS390X_OpMod64_0(v *Value) bool {
  4087  	// match: (Mod64 x y)
  4088  	// cond:
  4089  	// result: (MODD x y)
  4090  	for {
  4091  		y := v.Args[1]
  4092  		x := v.Args[0]
  4093  		v.reset(OpS390XMODD)
  4094  		v.AddArg(x)
  4095  		v.AddArg(y)
  4096  		return true
  4097  	}
  4098  }
  4099  func rewriteValueS390X_OpMod64u_0(v *Value) bool {
  4100  	// match: (Mod64u x y)
  4101  	// cond:
  4102  	// result: (MODDU x y)
  4103  	for {
  4104  		y := v.Args[1]
  4105  		x := v.Args[0]
  4106  		v.reset(OpS390XMODDU)
  4107  		v.AddArg(x)
  4108  		v.AddArg(y)
  4109  		return true
  4110  	}
  4111  }
  4112  func rewriteValueS390X_OpMod8_0(v *Value) bool {
  4113  	b := v.Block
  4114  	typ := &b.Func.Config.Types
  4115  	// match: (Mod8 x y)
  4116  	// cond:
  4117  	// result: (MODW (MOVBreg x) (MOVBreg y))
  4118  	for {
  4119  		y := v.Args[1]
  4120  		x := v.Args[0]
  4121  		v.reset(OpS390XMODW)
  4122  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  4123  		v0.AddArg(x)
  4124  		v.AddArg(v0)
  4125  		v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  4126  		v1.AddArg(y)
  4127  		v.AddArg(v1)
  4128  		return true
  4129  	}
  4130  }
  4131  func rewriteValueS390X_OpMod8u_0(v *Value) bool {
  4132  	b := v.Block
  4133  	typ := &b.Func.Config.Types
  4134  	// match: (Mod8u x y)
  4135  	// cond:
  4136  	// result: (MODWU (MOVBZreg x) (MOVBZreg y))
  4137  	for {
  4138  		y := v.Args[1]
  4139  		x := v.Args[0]
  4140  		v.reset(OpS390XMODWU)
  4141  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  4142  		v0.AddArg(x)
  4143  		v.AddArg(v0)
  4144  		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  4145  		v1.AddArg(y)
  4146  		v.AddArg(v1)
  4147  		return true
  4148  	}
  4149  }
  4150  func rewriteValueS390X_OpMove_0(v *Value) bool {
  4151  	b := v.Block
  4152  	typ := &b.Func.Config.Types
  4153  	// match: (Move [0] _ _ mem)
  4154  	// cond:
  4155  	// result: mem
  4156  	for {
  4157  		if v.AuxInt != 0 {
  4158  			break
  4159  		}
  4160  		mem := v.Args[2]
  4161  		v.reset(OpCopy)
  4162  		v.Type = mem.Type
  4163  		v.AddArg(mem)
  4164  		return true
  4165  	}
  4166  	// match: (Move [1] dst src mem)
  4167  	// cond:
  4168  	// result: (MOVBstore dst (MOVBZload src mem) mem)
  4169  	for {
  4170  		if v.AuxInt != 1 {
  4171  			break
  4172  		}
  4173  		mem := v.Args[2]
  4174  		dst := v.Args[0]
  4175  		src := v.Args[1]
  4176  		v.reset(OpS390XMOVBstore)
  4177  		v.AddArg(dst)
  4178  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
  4179  		v0.AddArg(src)
  4180  		v0.AddArg(mem)
  4181  		v.AddArg(v0)
  4182  		v.AddArg(mem)
  4183  		return true
  4184  	}
  4185  	// match: (Move [2] dst src mem)
  4186  	// cond:
  4187  	// result: (MOVHstore dst (MOVHZload src mem) mem)
  4188  	for {
  4189  		if v.AuxInt != 2 {
  4190  			break
  4191  		}
  4192  		mem := v.Args[2]
  4193  		dst := v.Args[0]
  4194  		src := v.Args[1]
  4195  		v.reset(OpS390XMOVHstore)
  4196  		v.AddArg(dst)
  4197  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
  4198  		v0.AddArg(src)
  4199  		v0.AddArg(mem)
  4200  		v.AddArg(v0)
  4201  		v.AddArg(mem)
  4202  		return true
  4203  	}
  4204  	// match: (Move [4] dst src mem)
  4205  	// cond:
  4206  	// result: (MOVWstore dst (MOVWZload src mem) mem)
  4207  	for {
  4208  		if v.AuxInt != 4 {
  4209  			break
  4210  		}
  4211  		mem := v.Args[2]
  4212  		dst := v.Args[0]
  4213  		src := v.Args[1]
  4214  		v.reset(OpS390XMOVWstore)
  4215  		v.AddArg(dst)
  4216  		v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
  4217  		v0.AddArg(src)
  4218  		v0.AddArg(mem)
  4219  		v.AddArg(v0)
  4220  		v.AddArg(mem)
  4221  		return true
  4222  	}
  4223  	// match: (Move [8] dst src mem)
  4224  	// cond:
  4225  	// result: (MOVDstore dst (MOVDload src mem) mem)
  4226  	for {
  4227  		if v.AuxInt != 8 {
  4228  			break
  4229  		}
  4230  		mem := v.Args[2]
  4231  		dst := v.Args[0]
  4232  		src := v.Args[1]
  4233  		v.reset(OpS390XMOVDstore)
  4234  		v.AddArg(dst)
  4235  		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
  4236  		v0.AddArg(src)
  4237  		v0.AddArg(mem)
  4238  		v.AddArg(v0)
  4239  		v.AddArg(mem)
  4240  		return true
  4241  	}
  4242  	// match: (Move [16] dst src mem)
  4243  	// cond:
  4244  	// result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))
  4245  	for {
  4246  		if v.AuxInt != 16 {
  4247  			break
  4248  		}
  4249  		mem := v.Args[2]
  4250  		dst := v.Args[0]
  4251  		src := v.Args[1]
  4252  		v.reset(OpS390XMOVDstore)
  4253  		v.AuxInt = 8
  4254  		v.AddArg(dst)
  4255  		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
  4256  		v0.AuxInt = 8
  4257  		v0.AddArg(src)
  4258  		v0.AddArg(mem)
  4259  		v.AddArg(v0)
  4260  		v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem)
  4261  		v1.AddArg(dst)
  4262  		v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
  4263  		v2.AddArg(src)
  4264  		v2.AddArg(mem)
  4265  		v1.AddArg(v2)
  4266  		v1.AddArg(mem)
  4267  		v.AddArg(v1)
  4268  		return true
  4269  	}
  4270  	// match: (Move [24] dst src mem)
  4271  	// cond:
  4272  	// result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)))
  4273  	for {
  4274  		if v.AuxInt != 24 {
  4275  			break
  4276  		}
  4277  		mem := v.Args[2]
  4278  		dst := v.Args[0]
  4279  		src := v.Args[1]
  4280  		v.reset(OpS390XMOVDstore)
  4281  		v.AuxInt = 16
  4282  		v.AddArg(dst)
  4283  		v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
  4284  		v0.AuxInt = 16
  4285  		v0.AddArg(src)
  4286  		v0.AddArg(mem)
  4287  		v.AddArg(v0)
  4288  		v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem)
  4289  		v1.AuxInt = 8
  4290  		v1.AddArg(dst)
  4291  		v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
  4292  		v2.AuxInt = 8
  4293  		v2.AddArg(src)
  4294  		v2.AddArg(mem)
  4295  		v1.AddArg(v2)
  4296  		v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem)
  4297  		v3.AddArg(dst)
  4298  		v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64)
  4299  		v4.AddArg(src)
  4300  		v4.AddArg(mem)
  4301  		v3.AddArg(v4)
  4302  		v3.AddArg(mem)
  4303  		v1.AddArg(v3)
  4304  		v.AddArg(v1)
  4305  		return true
  4306  	}
  4307  	// match: (Move [3] dst src mem)
  4308  	// cond:
  4309  	// result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem))
  4310  	for {
  4311  		if v.AuxInt != 3 {
  4312  			break
  4313  		}
  4314  		mem := v.Args[2]
  4315  		dst := v.Args[0]
  4316  		src := v.Args[1]
  4317  		v.reset(OpS390XMOVBstore)
  4318  		v.AuxInt = 2
  4319  		v.AddArg(dst)
  4320  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
  4321  		v0.AuxInt = 2
  4322  		v0.AddArg(src)
  4323  		v0.AddArg(mem)
  4324  		v.AddArg(v0)
  4325  		v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem)
  4326  		v1.AddArg(dst)
  4327  		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
  4328  		v2.AddArg(src)
  4329  		v2.AddArg(mem)
  4330  		v1.AddArg(v2)
  4331  		v1.AddArg(mem)
  4332  		v.AddArg(v1)
  4333  		return true
  4334  	}
  4335  	// match: (Move [5] dst src mem)
  4336  	// cond:
  4337  	// result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))
  4338  	for {
  4339  		if v.AuxInt != 5 {
  4340  			break
  4341  		}
  4342  		mem := v.Args[2]
  4343  		dst := v.Args[0]
  4344  		src := v.Args[1]
  4345  		v.reset(OpS390XMOVBstore)
  4346  		v.AuxInt = 4
  4347  		v.AddArg(dst)
  4348  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
  4349  		v0.AuxInt = 4
  4350  		v0.AddArg(src)
  4351  		v0.AddArg(mem)
  4352  		v.AddArg(v0)
  4353  		v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem)
  4354  		v1.AddArg(dst)
  4355  		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
  4356  		v2.AddArg(src)
  4357  		v2.AddArg(mem)
  4358  		v1.AddArg(v2)
  4359  		v1.AddArg(mem)
  4360  		v.AddArg(v1)
  4361  		return true
  4362  	}
  4363  	// match: (Move [6] dst src mem)
  4364  	// cond:
  4365  	// result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))
  4366  	for {
  4367  		if v.AuxInt != 6 {
  4368  			break
  4369  		}
  4370  		mem := v.Args[2]
  4371  		dst := v.Args[0]
  4372  		src := v.Args[1]
  4373  		v.reset(OpS390XMOVHstore)
  4374  		v.AuxInt = 4
  4375  		v.AddArg(dst)
  4376  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
  4377  		v0.AuxInt = 4
  4378  		v0.AddArg(src)
  4379  		v0.AddArg(mem)
  4380  		v.AddArg(v0)
  4381  		v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem)
  4382  		v1.AddArg(dst)
  4383  		v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
  4384  		v2.AddArg(src)
  4385  		v2.AddArg(mem)
  4386  		v1.AddArg(v2)
  4387  		v1.AddArg(mem)
  4388  		v.AddArg(v1)
  4389  		return true
  4390  	}
  4391  	return false
  4392  }
  4393  func rewriteValueS390X_OpMove_10(v *Value) bool {
  4394  	b := v.Block
  4395  	typ := &b.Func.Config.Types
  4396  	// match: (Move [7] dst src mem)
  4397  	// cond:
  4398  	// result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)))
  4399  	for {
  4400  		if v.AuxInt != 7 {
  4401  			break
  4402  		}
  4403  		mem := v.Args[2]
  4404  		dst := v.Args[0]
  4405  		src := v.Args[1]
  4406  		v.reset(OpS390XMOVBstore)
  4407  		v.AuxInt = 6
  4408  		v.AddArg(dst)
  4409  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8)
  4410  		v0.AuxInt = 6
  4411  		v0.AddArg(src)
  4412  		v0.AddArg(mem)
  4413  		v.AddArg(v0)
  4414  		v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem)
  4415  		v1.AuxInt = 4
  4416  		v1.AddArg(dst)
  4417  		v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16)
  4418  		v2.AuxInt = 4
  4419  		v2.AddArg(src)
  4420  		v2.AddArg(mem)
  4421  		v1.AddArg(v2)
  4422  		v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem)
  4423  		v3.AddArg(dst)
  4424  		v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32)
  4425  		v4.AddArg(src)
  4426  		v4.AddArg(mem)
  4427  		v3.AddArg(v4)
  4428  		v3.AddArg(mem)
  4429  		v1.AddArg(v3)
  4430  		v.AddArg(v1)
  4431  		return true
  4432  	}
  4433  	// match: (Move [s] dst src mem)
  4434  	// cond: s > 0 && s <= 256
  4435  	// result: (MVC [makeValAndOff(s, 0)] dst src mem)
  4436  	for {
  4437  		s := v.AuxInt
  4438  		mem := v.Args[2]
  4439  		dst := v.Args[0]
  4440  		src := v.Args[1]
  4441  		if !(s > 0 && s <= 256) {
  4442  			break
  4443  		}
  4444  		v.reset(OpS390XMVC)
  4445  		v.AuxInt = makeValAndOff(s, 0)
  4446  		v.AddArg(dst)
  4447  		v.AddArg(src)
  4448  		v.AddArg(mem)
  4449  		return true
  4450  	}
  4451  	// match: (Move [s] dst src mem)
  4452  	// cond: s > 256 && s <= 512
  4453  	// result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))
  4454  	for {
  4455  		s := v.AuxInt
  4456  		mem := v.Args[2]
  4457  		dst := v.Args[0]
  4458  		src := v.Args[1]
  4459  		if !(s > 256 && s <= 512) {
  4460  			break
  4461  		}
  4462  		v.reset(OpS390XMVC)
  4463  		v.AuxInt = makeValAndOff(s-256, 256)
  4464  		v.AddArg(dst)
  4465  		v.AddArg(src)
  4466  		v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
  4467  		v0.AuxInt = makeValAndOff(256, 0)
  4468  		v0.AddArg(dst)
  4469  		v0.AddArg(src)
  4470  		v0.AddArg(mem)
  4471  		v.AddArg(v0)
  4472  		return true
  4473  	}
  4474  	// match: (Move [s] dst src mem)
  4475  	// cond: s > 512 && s <= 768
  4476  	// result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))
  4477  	for {
  4478  		s := v.AuxInt
  4479  		mem := v.Args[2]
  4480  		dst := v.Args[0]
  4481  		src := v.Args[1]
  4482  		if !(s > 512 && s <= 768) {
  4483  			break
  4484  		}
  4485  		v.reset(OpS390XMVC)
  4486  		v.AuxInt = makeValAndOff(s-512, 512)
  4487  		v.AddArg(dst)
  4488  		v.AddArg(src)
  4489  		v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
  4490  		v0.AuxInt = makeValAndOff(256, 256)
  4491  		v0.AddArg(dst)
  4492  		v0.AddArg(src)
  4493  		v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
  4494  		v1.AuxInt = makeValAndOff(256, 0)
  4495  		v1.AddArg(dst)
  4496  		v1.AddArg(src)
  4497  		v1.AddArg(mem)
  4498  		v0.AddArg(v1)
  4499  		v.AddArg(v0)
  4500  		return true
  4501  	}
  4502  	// match: (Move [s] dst src mem)
  4503  	// cond: s > 768 && s <= 1024
  4504  	// 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))))
  4505  	for {
  4506  		s := v.AuxInt
  4507  		mem := v.Args[2]
  4508  		dst := v.Args[0]
  4509  		src := v.Args[1]
  4510  		if !(s > 768 && s <= 1024) {
  4511  			break
  4512  		}
  4513  		v.reset(OpS390XMVC)
  4514  		v.AuxInt = makeValAndOff(s-768, 768)
  4515  		v.AddArg(dst)
  4516  		v.AddArg(src)
  4517  		v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
  4518  		v0.AuxInt = makeValAndOff(256, 512)
  4519  		v0.AddArg(dst)
  4520  		v0.AddArg(src)
  4521  		v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
  4522  		v1.AuxInt = makeValAndOff(256, 256)
  4523  		v1.AddArg(dst)
  4524  		v1.AddArg(src)
  4525  		v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem)
  4526  		v2.AuxInt = makeValAndOff(256, 0)
  4527  		v2.AddArg(dst)
  4528  		v2.AddArg(src)
  4529  		v2.AddArg(mem)
  4530  		v1.AddArg(v2)
  4531  		v0.AddArg(v1)
  4532  		v.AddArg(v0)
  4533  		return true
  4534  	}
  4535  	// match: (Move [s] dst src mem)
  4536  	// cond: s > 1024
  4537  	// result: (LoweredMove [s%256] dst src (ADD <src.Type> src (MOVDconst [(s/256)*256])) mem)
  4538  	for {
  4539  		s := v.AuxInt
  4540  		mem := v.Args[2]
  4541  		dst := v.Args[0]
  4542  		src := v.Args[1]
  4543  		if !(s > 1024) {
  4544  			break
  4545  		}
  4546  		v.reset(OpS390XLoweredMove)
  4547  		v.AuxInt = s % 256
  4548  		v.AddArg(dst)
  4549  		v.AddArg(src)
  4550  		v0 := b.NewValue0(v.Pos, OpS390XADD, src.Type)
  4551  		v0.AddArg(src)
  4552  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4553  		v1.AuxInt = (s / 256) * 256
  4554  		v0.AddArg(v1)
  4555  		v.AddArg(v0)
  4556  		v.AddArg(mem)
  4557  		return true
  4558  	}
  4559  	return false
  4560  }
  4561  func rewriteValueS390X_OpMul16_0(v *Value) bool {
  4562  	// match: (Mul16 x y)
  4563  	// cond:
  4564  	// result: (MULLW x y)
  4565  	for {
  4566  		y := v.Args[1]
  4567  		x := v.Args[0]
  4568  		v.reset(OpS390XMULLW)
  4569  		v.AddArg(x)
  4570  		v.AddArg(y)
  4571  		return true
  4572  	}
  4573  }
  4574  func rewriteValueS390X_OpMul32_0(v *Value) bool {
  4575  	// match: (Mul32 x y)
  4576  	// cond:
  4577  	// result: (MULLW x y)
  4578  	for {
  4579  		y := v.Args[1]
  4580  		x := v.Args[0]
  4581  		v.reset(OpS390XMULLW)
  4582  		v.AddArg(x)
  4583  		v.AddArg(y)
  4584  		return true
  4585  	}
  4586  }
  4587  func rewriteValueS390X_OpMul32F_0(v *Value) bool {
  4588  	// match: (Mul32F x y)
  4589  	// cond:
  4590  	// result: (FMULS x y)
  4591  	for {
  4592  		y := v.Args[1]
  4593  		x := v.Args[0]
  4594  		v.reset(OpS390XFMULS)
  4595  		v.AddArg(x)
  4596  		v.AddArg(y)
  4597  		return true
  4598  	}
  4599  }
  4600  func rewriteValueS390X_OpMul64_0(v *Value) bool {
  4601  	// match: (Mul64 x y)
  4602  	// cond:
  4603  	// result: (MULLD x y)
  4604  	for {
  4605  		y := v.Args[1]
  4606  		x := v.Args[0]
  4607  		v.reset(OpS390XMULLD)
  4608  		v.AddArg(x)
  4609  		v.AddArg(y)
  4610  		return true
  4611  	}
  4612  }
  4613  func rewriteValueS390X_OpMul64F_0(v *Value) bool {
  4614  	// match: (Mul64F x y)
  4615  	// cond:
  4616  	// result: (FMUL x y)
  4617  	for {
  4618  		y := v.Args[1]
  4619  		x := v.Args[0]
  4620  		v.reset(OpS390XFMUL)
  4621  		v.AddArg(x)
  4622  		v.AddArg(y)
  4623  		return true
  4624  	}
  4625  }
  4626  func rewriteValueS390X_OpMul8_0(v *Value) bool {
  4627  	// match: (Mul8 x y)
  4628  	// cond:
  4629  	// result: (MULLW x y)
  4630  	for {
  4631  		y := v.Args[1]
  4632  		x := v.Args[0]
  4633  		v.reset(OpS390XMULLW)
  4634  		v.AddArg(x)
  4635  		v.AddArg(y)
  4636  		return true
  4637  	}
  4638  }
  4639  func rewriteValueS390X_OpNeg16_0(v *Value) bool {
  4640  	// match: (Neg16 x)
  4641  	// cond:
  4642  	// result: (NEGW x)
  4643  	for {
  4644  		x := v.Args[0]
  4645  		v.reset(OpS390XNEGW)
  4646  		v.AddArg(x)
  4647  		return true
  4648  	}
  4649  }
  4650  func rewriteValueS390X_OpNeg32_0(v *Value) bool {
  4651  	// match: (Neg32 x)
  4652  	// cond:
  4653  	// result: (NEGW x)
  4654  	for {
  4655  		x := v.Args[0]
  4656  		v.reset(OpS390XNEGW)
  4657  		v.AddArg(x)
  4658  		return true
  4659  	}
  4660  }
  4661  func rewriteValueS390X_OpNeg32F_0(v *Value) bool {
  4662  	// match: (Neg32F x)
  4663  	// cond:
  4664  	// result: (FNEGS x)
  4665  	for {
  4666  		x := v.Args[0]
  4667  		v.reset(OpS390XFNEGS)
  4668  		v.AddArg(x)
  4669  		return true
  4670  	}
  4671  }
  4672  func rewriteValueS390X_OpNeg64_0(v *Value) bool {
  4673  	// match: (Neg64 x)
  4674  	// cond:
  4675  	// result: (NEG x)
  4676  	for {
  4677  		x := v.Args[0]
  4678  		v.reset(OpS390XNEG)
  4679  		v.AddArg(x)
  4680  		return true
  4681  	}
  4682  }
  4683  func rewriteValueS390X_OpNeg64F_0(v *Value) bool {
  4684  	// match: (Neg64F x)
  4685  	// cond:
  4686  	// result: (FNEG x)
  4687  	for {
  4688  		x := v.Args[0]
  4689  		v.reset(OpS390XFNEG)
  4690  		v.AddArg(x)
  4691  		return true
  4692  	}
  4693  }
  4694  func rewriteValueS390X_OpNeg8_0(v *Value) bool {
  4695  	// match: (Neg8 x)
  4696  	// cond:
  4697  	// result: (NEGW x)
  4698  	for {
  4699  		x := v.Args[0]
  4700  		v.reset(OpS390XNEGW)
  4701  		v.AddArg(x)
  4702  		return true
  4703  	}
  4704  }
  4705  func rewriteValueS390X_OpNeq16_0(v *Value) bool {
  4706  	b := v.Block
  4707  	typ := &b.Func.Config.Types
  4708  	// match: (Neq16 x y)
  4709  	// cond:
  4710  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y)))
  4711  	for {
  4712  		y := v.Args[1]
  4713  		x := v.Args[0]
  4714  		v.reset(OpS390XMOVDNE)
  4715  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4716  		v0.AuxInt = 0
  4717  		v.AddArg(v0)
  4718  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4719  		v1.AuxInt = 1
  4720  		v.AddArg(v1)
  4721  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  4722  		v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  4723  		v3.AddArg(x)
  4724  		v2.AddArg(v3)
  4725  		v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  4726  		v4.AddArg(y)
  4727  		v2.AddArg(v4)
  4728  		v.AddArg(v2)
  4729  		return true
  4730  	}
  4731  }
  4732  func rewriteValueS390X_OpNeq32_0(v *Value) bool {
  4733  	b := v.Block
  4734  	typ := &b.Func.Config.Types
  4735  	// match: (Neq32 x y)
  4736  	// cond:
  4737  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y))
  4738  	for {
  4739  		y := v.Args[1]
  4740  		x := v.Args[0]
  4741  		v.reset(OpS390XMOVDNE)
  4742  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4743  		v0.AuxInt = 0
  4744  		v.AddArg(v0)
  4745  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4746  		v1.AuxInt = 1
  4747  		v.AddArg(v1)
  4748  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  4749  		v2.AddArg(x)
  4750  		v2.AddArg(y)
  4751  		v.AddArg(v2)
  4752  		return true
  4753  	}
  4754  }
  4755  func rewriteValueS390X_OpNeq32F_0(v *Value) bool {
  4756  	b := v.Block
  4757  	typ := &b.Func.Config.Types
  4758  	// match: (Neq32F x y)
  4759  	// cond:
  4760  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y))
  4761  	for {
  4762  		y := v.Args[1]
  4763  		x := v.Args[0]
  4764  		v.reset(OpS390XMOVDNE)
  4765  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4766  		v0.AuxInt = 0
  4767  		v.AddArg(v0)
  4768  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4769  		v1.AuxInt = 1
  4770  		v.AddArg(v1)
  4771  		v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags)
  4772  		v2.AddArg(x)
  4773  		v2.AddArg(y)
  4774  		v.AddArg(v2)
  4775  		return true
  4776  	}
  4777  }
  4778  func rewriteValueS390X_OpNeq64_0(v *Value) bool {
  4779  	b := v.Block
  4780  	typ := &b.Func.Config.Types
  4781  	// match: (Neq64 x y)
  4782  	// cond:
  4783  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  4784  	for {
  4785  		y := v.Args[1]
  4786  		x := v.Args[0]
  4787  		v.reset(OpS390XMOVDNE)
  4788  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4789  		v0.AuxInt = 0
  4790  		v.AddArg(v0)
  4791  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4792  		v1.AuxInt = 1
  4793  		v.AddArg(v1)
  4794  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  4795  		v2.AddArg(x)
  4796  		v2.AddArg(y)
  4797  		v.AddArg(v2)
  4798  		return true
  4799  	}
  4800  }
  4801  func rewriteValueS390X_OpNeq64F_0(v *Value) bool {
  4802  	b := v.Block
  4803  	typ := &b.Func.Config.Types
  4804  	// match: (Neq64F x y)
  4805  	// cond:
  4806  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y))
  4807  	for {
  4808  		y := v.Args[1]
  4809  		x := v.Args[0]
  4810  		v.reset(OpS390XMOVDNE)
  4811  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4812  		v0.AuxInt = 0
  4813  		v.AddArg(v0)
  4814  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4815  		v1.AuxInt = 1
  4816  		v.AddArg(v1)
  4817  		v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags)
  4818  		v2.AddArg(x)
  4819  		v2.AddArg(y)
  4820  		v.AddArg(v2)
  4821  		return true
  4822  	}
  4823  }
  4824  func rewriteValueS390X_OpNeq8_0(v *Value) bool {
  4825  	b := v.Block
  4826  	typ := &b.Func.Config.Types
  4827  	// match: (Neq8 x y)
  4828  	// cond:
  4829  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  4830  	for {
  4831  		y := v.Args[1]
  4832  		x := v.Args[0]
  4833  		v.reset(OpS390XMOVDNE)
  4834  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4835  		v0.AuxInt = 0
  4836  		v.AddArg(v0)
  4837  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4838  		v1.AuxInt = 1
  4839  		v.AddArg(v1)
  4840  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  4841  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  4842  		v3.AddArg(x)
  4843  		v2.AddArg(v3)
  4844  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  4845  		v4.AddArg(y)
  4846  		v2.AddArg(v4)
  4847  		v.AddArg(v2)
  4848  		return true
  4849  	}
  4850  }
  4851  func rewriteValueS390X_OpNeqB_0(v *Value) bool {
  4852  	b := v.Block
  4853  	typ := &b.Func.Config.Types
  4854  	// match: (NeqB x y)
  4855  	// cond:
  4856  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y)))
  4857  	for {
  4858  		y := v.Args[1]
  4859  		x := v.Args[0]
  4860  		v.reset(OpS390XMOVDNE)
  4861  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4862  		v0.AuxInt = 0
  4863  		v.AddArg(v0)
  4864  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4865  		v1.AuxInt = 1
  4866  		v.AddArg(v1)
  4867  		v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags)
  4868  		v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  4869  		v3.AddArg(x)
  4870  		v2.AddArg(v3)
  4871  		v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  4872  		v4.AddArg(y)
  4873  		v2.AddArg(v4)
  4874  		v.AddArg(v2)
  4875  		return true
  4876  	}
  4877  }
  4878  func rewriteValueS390X_OpNeqPtr_0(v *Value) bool {
  4879  	b := v.Block
  4880  	typ := &b.Func.Config.Types
  4881  	// match: (NeqPtr x y)
  4882  	// cond:
  4883  	// result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y))
  4884  	for {
  4885  		y := v.Args[1]
  4886  		x := v.Args[0]
  4887  		v.reset(OpS390XMOVDNE)
  4888  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4889  		v0.AuxInt = 0
  4890  		v.AddArg(v0)
  4891  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4892  		v1.AuxInt = 1
  4893  		v.AddArg(v1)
  4894  		v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags)
  4895  		v2.AddArg(x)
  4896  		v2.AddArg(y)
  4897  		v.AddArg(v2)
  4898  		return true
  4899  	}
  4900  }
  4901  func rewriteValueS390X_OpNilCheck_0(v *Value) bool {
  4902  	// match: (NilCheck ptr mem)
  4903  	// cond:
  4904  	// result: (LoweredNilCheck ptr mem)
  4905  	for {
  4906  		mem := v.Args[1]
  4907  		ptr := v.Args[0]
  4908  		v.reset(OpS390XLoweredNilCheck)
  4909  		v.AddArg(ptr)
  4910  		v.AddArg(mem)
  4911  		return true
  4912  	}
  4913  }
  4914  func rewriteValueS390X_OpNot_0(v *Value) bool {
  4915  	// match: (Not x)
  4916  	// cond:
  4917  	// result: (XORWconst [1] x)
  4918  	for {
  4919  		x := v.Args[0]
  4920  		v.reset(OpS390XXORWconst)
  4921  		v.AuxInt = 1
  4922  		v.AddArg(x)
  4923  		return true
  4924  	}
  4925  }
  4926  func rewriteValueS390X_OpOffPtr_0(v *Value) bool {
  4927  	b := v.Block
  4928  	typ := &b.Func.Config.Types
  4929  	// match: (OffPtr [off] ptr:(SP))
  4930  	// cond:
  4931  	// result: (MOVDaddr [off] ptr)
  4932  	for {
  4933  		off := v.AuxInt
  4934  		ptr := v.Args[0]
  4935  		if ptr.Op != OpSP {
  4936  			break
  4937  		}
  4938  		v.reset(OpS390XMOVDaddr)
  4939  		v.AuxInt = off
  4940  		v.AddArg(ptr)
  4941  		return true
  4942  	}
  4943  	// match: (OffPtr [off] ptr)
  4944  	// cond: is32Bit(off)
  4945  	// result: (ADDconst [off] ptr)
  4946  	for {
  4947  		off := v.AuxInt
  4948  		ptr := v.Args[0]
  4949  		if !(is32Bit(off)) {
  4950  			break
  4951  		}
  4952  		v.reset(OpS390XADDconst)
  4953  		v.AuxInt = off
  4954  		v.AddArg(ptr)
  4955  		return true
  4956  	}
  4957  	// match: (OffPtr [off] ptr)
  4958  	// cond:
  4959  	// result: (ADD (MOVDconst [off]) ptr)
  4960  	for {
  4961  		off := v.AuxInt
  4962  		ptr := v.Args[0]
  4963  		v.reset(OpS390XADD)
  4964  		v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  4965  		v0.AuxInt = off
  4966  		v.AddArg(v0)
  4967  		v.AddArg(ptr)
  4968  		return true
  4969  	}
  4970  }
  4971  func rewriteValueS390X_OpOr16_0(v *Value) bool {
  4972  	// match: (Or16 x y)
  4973  	// cond:
  4974  	// result: (ORW x y)
  4975  	for {
  4976  		y := v.Args[1]
  4977  		x := v.Args[0]
  4978  		v.reset(OpS390XORW)
  4979  		v.AddArg(x)
  4980  		v.AddArg(y)
  4981  		return true
  4982  	}
  4983  }
  4984  func rewriteValueS390X_OpOr32_0(v *Value) bool {
  4985  	// match: (Or32 x y)
  4986  	// cond:
  4987  	// result: (ORW x y)
  4988  	for {
  4989  		y := v.Args[1]
  4990  		x := v.Args[0]
  4991  		v.reset(OpS390XORW)
  4992  		v.AddArg(x)
  4993  		v.AddArg(y)
  4994  		return true
  4995  	}
  4996  }
  4997  func rewriteValueS390X_OpOr64_0(v *Value) bool {
  4998  	// match: (Or64 x y)
  4999  	// cond:
  5000  	// result: (OR x y)
  5001  	for {
  5002  		y := v.Args[1]
  5003  		x := v.Args[0]
  5004  		v.reset(OpS390XOR)
  5005  		v.AddArg(x)
  5006  		v.AddArg(y)
  5007  		return true
  5008  	}
  5009  }
  5010  func rewriteValueS390X_OpOr8_0(v *Value) bool {
  5011  	// match: (Or8 x y)
  5012  	// cond:
  5013  	// result: (ORW x y)
  5014  	for {
  5015  		y := v.Args[1]
  5016  		x := v.Args[0]
  5017  		v.reset(OpS390XORW)
  5018  		v.AddArg(x)
  5019  		v.AddArg(y)
  5020  		return true
  5021  	}
  5022  }
  5023  func rewriteValueS390X_OpOrB_0(v *Value) bool {
  5024  	// match: (OrB x y)
  5025  	// cond:
  5026  	// result: (ORW x y)
  5027  	for {
  5028  		y := v.Args[1]
  5029  		x := v.Args[0]
  5030  		v.reset(OpS390XORW)
  5031  		v.AddArg(x)
  5032  		v.AddArg(y)
  5033  		return true
  5034  	}
  5035  }
  5036  func rewriteValueS390X_OpPanicBounds_0(v *Value) bool {
  5037  	// match: (PanicBounds [kind] x y mem)
  5038  	// cond: boundsABI(kind) == 0
  5039  	// result: (LoweredPanicBoundsA [kind] x y mem)
  5040  	for {
  5041  		kind := v.AuxInt
  5042  		mem := v.Args[2]
  5043  		x := v.Args[0]
  5044  		y := v.Args[1]
  5045  		if !(boundsABI(kind) == 0) {
  5046  			break
  5047  		}
  5048  		v.reset(OpS390XLoweredPanicBoundsA)
  5049  		v.AuxInt = kind
  5050  		v.AddArg(x)
  5051  		v.AddArg(y)
  5052  		v.AddArg(mem)
  5053  		return true
  5054  	}
  5055  	// match: (PanicBounds [kind] x y mem)
  5056  	// cond: boundsABI(kind) == 1
  5057  	// result: (LoweredPanicBoundsB [kind] x y mem)
  5058  	for {
  5059  		kind := v.AuxInt
  5060  		mem := v.Args[2]
  5061  		x := v.Args[0]
  5062  		y := v.Args[1]
  5063  		if !(boundsABI(kind) == 1) {
  5064  			break
  5065  		}
  5066  		v.reset(OpS390XLoweredPanicBoundsB)
  5067  		v.AuxInt = kind
  5068  		v.AddArg(x)
  5069  		v.AddArg(y)
  5070  		v.AddArg(mem)
  5071  		return true
  5072  	}
  5073  	// match: (PanicBounds [kind] x y mem)
  5074  	// cond: boundsABI(kind) == 2
  5075  	// result: (LoweredPanicBoundsC [kind] x y mem)
  5076  	for {
  5077  		kind := v.AuxInt
  5078  		mem := v.Args[2]
  5079  		x := v.Args[0]
  5080  		y := v.Args[1]
  5081  		if !(boundsABI(kind) == 2) {
  5082  			break
  5083  		}
  5084  		v.reset(OpS390XLoweredPanicBoundsC)
  5085  		v.AuxInt = kind
  5086  		v.AddArg(x)
  5087  		v.AddArg(y)
  5088  		v.AddArg(mem)
  5089  		return true
  5090  	}
  5091  	return false
  5092  }
  5093  func rewriteValueS390X_OpPopCount16_0(v *Value) bool {
  5094  	b := v.Block
  5095  	typ := &b.Func.Config.Types
  5096  	// match: (PopCount16 x)
  5097  	// cond:
  5098  	// result: (MOVBZreg (SumBytes2 (POPCNT <typ.UInt16> x)))
  5099  	for {
  5100  		x := v.Args[0]
  5101  		v.reset(OpS390XMOVBZreg)
  5102  		v0 := b.NewValue0(v.Pos, OpS390XSumBytes2, typ.UInt8)
  5103  		v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt16)
  5104  		v1.AddArg(x)
  5105  		v0.AddArg(v1)
  5106  		v.AddArg(v0)
  5107  		return true
  5108  	}
  5109  }
  5110  func rewriteValueS390X_OpPopCount32_0(v *Value) bool {
  5111  	b := v.Block
  5112  	typ := &b.Func.Config.Types
  5113  	// match: (PopCount32 x)
  5114  	// cond:
  5115  	// result: (MOVBZreg (SumBytes4 (POPCNT <typ.UInt32> x)))
  5116  	for {
  5117  		x := v.Args[0]
  5118  		v.reset(OpS390XMOVBZreg)
  5119  		v0 := b.NewValue0(v.Pos, OpS390XSumBytes4, typ.UInt8)
  5120  		v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt32)
  5121  		v1.AddArg(x)
  5122  		v0.AddArg(v1)
  5123  		v.AddArg(v0)
  5124  		return true
  5125  	}
  5126  }
  5127  func rewriteValueS390X_OpPopCount64_0(v *Value) bool {
  5128  	b := v.Block
  5129  	typ := &b.Func.Config.Types
  5130  	// match: (PopCount64 x)
  5131  	// cond:
  5132  	// result: (MOVBZreg (SumBytes8 (POPCNT <typ.UInt64> x)))
  5133  	for {
  5134  		x := v.Args[0]
  5135  		v.reset(OpS390XMOVBZreg)
  5136  		v0 := b.NewValue0(v.Pos, OpS390XSumBytes8, typ.UInt8)
  5137  		v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt64)
  5138  		v1.AddArg(x)
  5139  		v0.AddArg(v1)
  5140  		v.AddArg(v0)
  5141  		return true
  5142  	}
  5143  }
  5144  func rewriteValueS390X_OpPopCount8_0(v *Value) bool {
  5145  	b := v.Block
  5146  	typ := &b.Func.Config.Types
  5147  	// match: (PopCount8 x)
  5148  	// cond:
  5149  	// result: (POPCNT (MOVBZreg x))
  5150  	for {
  5151  		x := v.Args[0]
  5152  		v.reset(OpS390XPOPCNT)
  5153  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  5154  		v0.AddArg(x)
  5155  		v.AddArg(v0)
  5156  		return true
  5157  	}
  5158  }
  5159  func rewriteValueS390X_OpRotateLeft16_0(v *Value) bool {
  5160  	b := v.Block
  5161  	typ := &b.Func.Config.Types
  5162  	// match: (RotateLeft16 <t> x (MOVDconst [c]))
  5163  	// cond:
  5164  	// result: (Or16 (Lsh16x64 <t> x (MOVDconst [c&15])) (Rsh16Ux64 <t> x (MOVDconst [-c&15])))
  5165  	for {
  5166  		t := v.Type
  5167  		_ = v.Args[1]
  5168  		x := v.Args[0]
  5169  		v_1 := v.Args[1]
  5170  		if v_1.Op != OpS390XMOVDconst {
  5171  			break
  5172  		}
  5173  		c := v_1.AuxInt
  5174  		v.reset(OpOr16)
  5175  		v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
  5176  		v0.AddArg(x)
  5177  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5178  		v1.AuxInt = c & 15
  5179  		v0.AddArg(v1)
  5180  		v.AddArg(v0)
  5181  		v2 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
  5182  		v2.AddArg(x)
  5183  		v3 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5184  		v3.AuxInt = -c & 15
  5185  		v2.AddArg(v3)
  5186  		v.AddArg(v2)
  5187  		return true
  5188  	}
  5189  	return false
  5190  }
  5191  func rewriteValueS390X_OpRotateLeft32_0(v *Value) bool {
  5192  	// match: (RotateLeft32 x y)
  5193  	// cond:
  5194  	// result: (RLL x y)
  5195  	for {
  5196  		y := v.Args[1]
  5197  		x := v.Args[0]
  5198  		v.reset(OpS390XRLL)
  5199  		v.AddArg(x)
  5200  		v.AddArg(y)
  5201  		return true
  5202  	}
  5203  }
  5204  func rewriteValueS390X_OpRotateLeft64_0(v *Value) bool {
  5205  	// match: (RotateLeft64 x y)
  5206  	// cond:
  5207  	// result: (RLLG x y)
  5208  	for {
  5209  		y := v.Args[1]
  5210  		x := v.Args[0]
  5211  		v.reset(OpS390XRLLG)
  5212  		v.AddArg(x)
  5213  		v.AddArg(y)
  5214  		return true
  5215  	}
  5216  }
  5217  func rewriteValueS390X_OpRotateLeft8_0(v *Value) bool {
  5218  	b := v.Block
  5219  	typ := &b.Func.Config.Types
  5220  	// match: (RotateLeft8 <t> x (MOVDconst [c]))
  5221  	// cond:
  5222  	// result: (Or8 (Lsh8x64 <t> x (MOVDconst [c&7])) (Rsh8Ux64 <t> x (MOVDconst [-c&7])))
  5223  	for {
  5224  		t := v.Type
  5225  		_ = v.Args[1]
  5226  		x := v.Args[0]
  5227  		v_1 := v.Args[1]
  5228  		if v_1.Op != OpS390XMOVDconst {
  5229  			break
  5230  		}
  5231  		c := v_1.AuxInt
  5232  		v.reset(OpOr8)
  5233  		v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
  5234  		v0.AddArg(x)
  5235  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5236  		v1.AuxInt = c & 7
  5237  		v0.AddArg(v1)
  5238  		v.AddArg(v0)
  5239  		v2 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
  5240  		v2.AddArg(x)
  5241  		v3 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5242  		v3.AuxInt = -c & 7
  5243  		v2.AddArg(v3)
  5244  		v.AddArg(v2)
  5245  		return true
  5246  	}
  5247  	return false
  5248  }
  5249  func rewriteValueS390X_OpRound_0(v *Value) bool {
  5250  	// match: (Round x)
  5251  	// cond:
  5252  	// result: (FIDBR [1] x)
  5253  	for {
  5254  		x := v.Args[0]
  5255  		v.reset(OpS390XFIDBR)
  5256  		v.AuxInt = 1
  5257  		v.AddArg(x)
  5258  		return true
  5259  	}
  5260  }
  5261  func rewriteValueS390X_OpRound32F_0(v *Value) bool {
  5262  	// match: (Round32F x)
  5263  	// cond:
  5264  	// result: (LoweredRound32F x)
  5265  	for {
  5266  		x := v.Args[0]
  5267  		v.reset(OpS390XLoweredRound32F)
  5268  		v.AddArg(x)
  5269  		return true
  5270  	}
  5271  }
  5272  func rewriteValueS390X_OpRound64F_0(v *Value) bool {
  5273  	// match: (Round64F x)
  5274  	// cond:
  5275  	// result: (LoweredRound64F x)
  5276  	for {
  5277  		x := v.Args[0]
  5278  		v.reset(OpS390XLoweredRound64F)
  5279  		v.AddArg(x)
  5280  		return true
  5281  	}
  5282  }
  5283  func rewriteValueS390X_OpRoundToEven_0(v *Value) bool {
  5284  	// match: (RoundToEven x)
  5285  	// cond:
  5286  	// result: (FIDBR [4] x)
  5287  	for {
  5288  		x := v.Args[0]
  5289  		v.reset(OpS390XFIDBR)
  5290  		v.AuxInt = 4
  5291  		v.AddArg(x)
  5292  		return true
  5293  	}
  5294  }
  5295  func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool {
  5296  	b := v.Block
  5297  	typ := &b.Func.Config.Types
  5298  	// match: (Rsh16Ux16 x y)
  5299  	// cond: shiftIsBounded(v)
  5300  	// result: (SRW (MOVHZreg x) y)
  5301  	for {
  5302  		y := v.Args[1]
  5303  		x := v.Args[0]
  5304  		if !(shiftIsBounded(v)) {
  5305  			break
  5306  		}
  5307  		v.reset(OpS390XSRW)
  5308  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5309  		v0.AddArg(x)
  5310  		v.AddArg(v0)
  5311  		v.AddArg(y)
  5312  		return true
  5313  	}
  5314  	// match: (Rsh16Ux16 <t> x y)
  5315  	// cond:
  5316  	// result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  5317  	for {
  5318  		t := v.Type
  5319  		y := v.Args[1]
  5320  		x := v.Args[0]
  5321  		v.reset(OpS390XMOVDGE)
  5322  		v.Type = t
  5323  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5324  		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5325  		v1.AddArg(x)
  5326  		v0.AddArg(v1)
  5327  		v0.AddArg(y)
  5328  		v.AddArg(v0)
  5329  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5330  		v2.AuxInt = 0
  5331  		v.AddArg(v2)
  5332  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5333  		v3.AuxInt = 64
  5334  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5335  		v4.AddArg(y)
  5336  		v3.AddArg(v4)
  5337  		v.AddArg(v3)
  5338  		return true
  5339  	}
  5340  }
  5341  func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool {
  5342  	b := v.Block
  5343  	typ := &b.Func.Config.Types
  5344  	// match: (Rsh16Ux32 x y)
  5345  	// cond: shiftIsBounded(v)
  5346  	// result: (SRW (MOVHZreg x) y)
  5347  	for {
  5348  		y := v.Args[1]
  5349  		x := v.Args[0]
  5350  		if !(shiftIsBounded(v)) {
  5351  			break
  5352  		}
  5353  		v.reset(OpS390XSRW)
  5354  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5355  		v0.AddArg(x)
  5356  		v.AddArg(v0)
  5357  		v.AddArg(y)
  5358  		return true
  5359  	}
  5360  	// match: (Rsh16Ux32 <t> x y)
  5361  	// cond:
  5362  	// result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst y [64]))
  5363  	for {
  5364  		t := v.Type
  5365  		y := v.Args[1]
  5366  		x := v.Args[0]
  5367  		v.reset(OpS390XMOVDGE)
  5368  		v.Type = t
  5369  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5370  		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5371  		v1.AddArg(x)
  5372  		v0.AddArg(v1)
  5373  		v0.AddArg(y)
  5374  		v.AddArg(v0)
  5375  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5376  		v2.AuxInt = 0
  5377  		v.AddArg(v2)
  5378  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5379  		v3.AuxInt = 64
  5380  		v3.AddArg(y)
  5381  		v.AddArg(v3)
  5382  		return true
  5383  	}
  5384  }
  5385  func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool {
  5386  	b := v.Block
  5387  	typ := &b.Func.Config.Types
  5388  	// match: (Rsh16Ux64 x y)
  5389  	// cond: shiftIsBounded(v)
  5390  	// result: (SRW (MOVHZreg x) y)
  5391  	for {
  5392  		y := v.Args[1]
  5393  		x := v.Args[0]
  5394  		if !(shiftIsBounded(v)) {
  5395  			break
  5396  		}
  5397  		v.reset(OpS390XSRW)
  5398  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5399  		v0.AddArg(x)
  5400  		v.AddArg(v0)
  5401  		v.AddArg(y)
  5402  		return true
  5403  	}
  5404  	// match: (Rsh16Ux64 <t> x y)
  5405  	// cond:
  5406  	// result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPUconst y [64]))
  5407  	for {
  5408  		t := v.Type
  5409  		y := v.Args[1]
  5410  		x := v.Args[0]
  5411  		v.reset(OpS390XMOVDGE)
  5412  		v.Type = t
  5413  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5414  		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5415  		v1.AddArg(x)
  5416  		v0.AddArg(v1)
  5417  		v0.AddArg(y)
  5418  		v.AddArg(v0)
  5419  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5420  		v2.AuxInt = 0
  5421  		v.AddArg(v2)
  5422  		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  5423  		v3.AuxInt = 64
  5424  		v3.AddArg(y)
  5425  		v.AddArg(v3)
  5426  		return true
  5427  	}
  5428  }
  5429  func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool {
  5430  	b := v.Block
  5431  	typ := &b.Func.Config.Types
  5432  	// match: (Rsh16Ux8 x y)
  5433  	// cond: shiftIsBounded(v)
  5434  	// result: (SRW (MOVHZreg x) y)
  5435  	for {
  5436  		y := v.Args[1]
  5437  		x := v.Args[0]
  5438  		if !(shiftIsBounded(v)) {
  5439  			break
  5440  		}
  5441  		v.reset(OpS390XSRW)
  5442  		v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5443  		v0.AddArg(x)
  5444  		v.AddArg(v0)
  5445  		v.AddArg(y)
  5446  		return true
  5447  	}
  5448  	// match: (Rsh16Ux8 <t> x y)
  5449  	// cond:
  5450  	// result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  5451  	for {
  5452  		t := v.Type
  5453  		y := v.Args[1]
  5454  		x := v.Args[0]
  5455  		v.reset(OpS390XMOVDGE)
  5456  		v.Type = t
  5457  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5458  		v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5459  		v1.AddArg(x)
  5460  		v0.AddArg(v1)
  5461  		v0.AddArg(y)
  5462  		v.AddArg(v0)
  5463  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5464  		v2.AuxInt = 0
  5465  		v.AddArg(v2)
  5466  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5467  		v3.AuxInt = 64
  5468  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  5469  		v4.AddArg(y)
  5470  		v3.AddArg(v4)
  5471  		v.AddArg(v3)
  5472  		return true
  5473  	}
  5474  }
  5475  func rewriteValueS390X_OpRsh16x16_0(v *Value) bool {
  5476  	b := v.Block
  5477  	typ := &b.Func.Config.Types
  5478  	// match: (Rsh16x16 x y)
  5479  	// cond: shiftIsBounded(v)
  5480  	// result: (SRAW (MOVHreg x) y)
  5481  	for {
  5482  		y := v.Args[1]
  5483  		x := v.Args[0]
  5484  		if !(shiftIsBounded(v)) {
  5485  			break
  5486  		}
  5487  		v.reset(OpS390XSRAW)
  5488  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5489  		v0.AddArg(x)
  5490  		v.AddArg(v0)
  5491  		v.AddArg(y)
  5492  		return true
  5493  	}
  5494  	// match: (Rsh16x16 x y)
  5495  	// cond:
  5496  	// result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64])))
  5497  	for {
  5498  		y := v.Args[1]
  5499  		x := v.Args[0]
  5500  		v.reset(OpS390XSRAW)
  5501  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5502  		v0.AddArg(x)
  5503  		v.AddArg(v0)
  5504  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5505  		v1.AddArg(y)
  5506  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5507  		v2.AuxInt = 63
  5508  		v1.AddArg(v2)
  5509  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5510  		v3.AuxInt = 64
  5511  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5512  		v4.AddArg(y)
  5513  		v3.AddArg(v4)
  5514  		v1.AddArg(v3)
  5515  		v.AddArg(v1)
  5516  		return true
  5517  	}
  5518  }
  5519  func rewriteValueS390X_OpRsh16x32_0(v *Value) bool {
  5520  	b := v.Block
  5521  	typ := &b.Func.Config.Types
  5522  	// match: (Rsh16x32 x y)
  5523  	// cond: shiftIsBounded(v)
  5524  	// result: (SRAW (MOVHreg x) y)
  5525  	for {
  5526  		y := v.Args[1]
  5527  		x := v.Args[0]
  5528  		if !(shiftIsBounded(v)) {
  5529  			break
  5530  		}
  5531  		v.reset(OpS390XSRAW)
  5532  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5533  		v0.AddArg(x)
  5534  		v.AddArg(v0)
  5535  		v.AddArg(y)
  5536  		return true
  5537  	}
  5538  	// match: (Rsh16x32 x y)
  5539  	// cond:
  5540  	// result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64])))
  5541  	for {
  5542  		y := v.Args[1]
  5543  		x := v.Args[0]
  5544  		v.reset(OpS390XSRAW)
  5545  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5546  		v0.AddArg(x)
  5547  		v.AddArg(v0)
  5548  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5549  		v1.AddArg(y)
  5550  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5551  		v2.AuxInt = 63
  5552  		v1.AddArg(v2)
  5553  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5554  		v3.AuxInt = 64
  5555  		v3.AddArg(y)
  5556  		v1.AddArg(v3)
  5557  		v.AddArg(v1)
  5558  		return true
  5559  	}
  5560  }
  5561  func rewriteValueS390X_OpRsh16x64_0(v *Value) bool {
  5562  	b := v.Block
  5563  	typ := &b.Func.Config.Types
  5564  	// match: (Rsh16x64 x y)
  5565  	// cond: shiftIsBounded(v)
  5566  	// result: (SRAW (MOVHreg x) y)
  5567  	for {
  5568  		y := v.Args[1]
  5569  		x := v.Args[0]
  5570  		if !(shiftIsBounded(v)) {
  5571  			break
  5572  		}
  5573  		v.reset(OpS390XSRAW)
  5574  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5575  		v0.AddArg(x)
  5576  		v.AddArg(v0)
  5577  		v.AddArg(y)
  5578  		return true
  5579  	}
  5580  	// match: (Rsh16x64 x y)
  5581  	// cond:
  5582  	// result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64])))
  5583  	for {
  5584  		y := v.Args[1]
  5585  		x := v.Args[0]
  5586  		v.reset(OpS390XSRAW)
  5587  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5588  		v0.AddArg(x)
  5589  		v.AddArg(v0)
  5590  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5591  		v1.AddArg(y)
  5592  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5593  		v2.AuxInt = 63
  5594  		v1.AddArg(v2)
  5595  		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  5596  		v3.AuxInt = 64
  5597  		v3.AddArg(y)
  5598  		v1.AddArg(v3)
  5599  		v.AddArg(v1)
  5600  		return true
  5601  	}
  5602  }
  5603  func rewriteValueS390X_OpRsh16x8_0(v *Value) bool {
  5604  	b := v.Block
  5605  	typ := &b.Func.Config.Types
  5606  	// match: (Rsh16x8 x y)
  5607  	// cond: shiftIsBounded(v)
  5608  	// result: (SRAW (MOVHreg x) y)
  5609  	for {
  5610  		y := v.Args[1]
  5611  		x := v.Args[0]
  5612  		if !(shiftIsBounded(v)) {
  5613  			break
  5614  		}
  5615  		v.reset(OpS390XSRAW)
  5616  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5617  		v0.AddArg(x)
  5618  		v.AddArg(v0)
  5619  		v.AddArg(y)
  5620  		return true
  5621  	}
  5622  	// match: (Rsh16x8 x y)
  5623  	// cond:
  5624  	// result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64])))
  5625  	for {
  5626  		y := v.Args[1]
  5627  		x := v.Args[0]
  5628  		v.reset(OpS390XSRAW)
  5629  		v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64)
  5630  		v0.AddArg(x)
  5631  		v.AddArg(v0)
  5632  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5633  		v1.AddArg(y)
  5634  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5635  		v2.AuxInt = 63
  5636  		v1.AddArg(v2)
  5637  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5638  		v3.AuxInt = 64
  5639  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  5640  		v4.AddArg(y)
  5641  		v3.AddArg(v4)
  5642  		v1.AddArg(v3)
  5643  		v.AddArg(v1)
  5644  		return true
  5645  	}
  5646  }
  5647  func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool {
  5648  	b := v.Block
  5649  	typ := &b.Func.Config.Types
  5650  	// match: (Rsh32Ux16 x y)
  5651  	// cond: shiftIsBounded(v)
  5652  	// result: (SRW x y)
  5653  	for {
  5654  		y := v.Args[1]
  5655  		x := v.Args[0]
  5656  		if !(shiftIsBounded(v)) {
  5657  			break
  5658  		}
  5659  		v.reset(OpS390XSRW)
  5660  		v.AddArg(x)
  5661  		v.AddArg(y)
  5662  		return true
  5663  	}
  5664  	// match: (Rsh32Ux16 <t> x y)
  5665  	// cond:
  5666  	// result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  5667  	for {
  5668  		t := v.Type
  5669  		y := v.Args[1]
  5670  		x := v.Args[0]
  5671  		v.reset(OpS390XMOVDGE)
  5672  		v.Type = t
  5673  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5674  		v0.AddArg(x)
  5675  		v0.AddArg(y)
  5676  		v.AddArg(v0)
  5677  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5678  		v1.AuxInt = 0
  5679  		v.AddArg(v1)
  5680  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5681  		v2.AuxInt = 64
  5682  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5683  		v3.AddArg(y)
  5684  		v2.AddArg(v3)
  5685  		v.AddArg(v2)
  5686  		return true
  5687  	}
  5688  }
  5689  func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool {
  5690  	b := v.Block
  5691  	typ := &b.Func.Config.Types
  5692  	// match: (Rsh32Ux32 x y)
  5693  	// cond: shiftIsBounded(v)
  5694  	// result: (SRW x y)
  5695  	for {
  5696  		y := v.Args[1]
  5697  		x := v.Args[0]
  5698  		if !(shiftIsBounded(v)) {
  5699  			break
  5700  		}
  5701  		v.reset(OpS390XSRW)
  5702  		v.AddArg(x)
  5703  		v.AddArg(y)
  5704  		return true
  5705  	}
  5706  	// match: (Rsh32Ux32 <t> x y)
  5707  	// cond:
  5708  	// result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
  5709  	for {
  5710  		t := v.Type
  5711  		y := v.Args[1]
  5712  		x := v.Args[0]
  5713  		v.reset(OpS390XMOVDGE)
  5714  		v.Type = t
  5715  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5716  		v0.AddArg(x)
  5717  		v0.AddArg(y)
  5718  		v.AddArg(v0)
  5719  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5720  		v1.AuxInt = 0
  5721  		v.AddArg(v1)
  5722  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5723  		v2.AuxInt = 64
  5724  		v2.AddArg(y)
  5725  		v.AddArg(v2)
  5726  		return true
  5727  	}
  5728  }
  5729  func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool {
  5730  	b := v.Block
  5731  	typ := &b.Func.Config.Types
  5732  	// match: (Rsh32Ux64 x y)
  5733  	// cond: shiftIsBounded(v)
  5734  	// result: (SRW x y)
  5735  	for {
  5736  		y := v.Args[1]
  5737  		x := v.Args[0]
  5738  		if !(shiftIsBounded(v)) {
  5739  			break
  5740  		}
  5741  		v.reset(OpS390XSRW)
  5742  		v.AddArg(x)
  5743  		v.AddArg(y)
  5744  		return true
  5745  	}
  5746  	// match: (Rsh32Ux64 <t> x y)
  5747  	// cond:
  5748  	// result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
  5749  	for {
  5750  		t := v.Type
  5751  		y := v.Args[1]
  5752  		x := v.Args[0]
  5753  		v.reset(OpS390XMOVDGE)
  5754  		v.Type = t
  5755  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5756  		v0.AddArg(x)
  5757  		v0.AddArg(y)
  5758  		v.AddArg(v0)
  5759  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5760  		v1.AuxInt = 0
  5761  		v.AddArg(v1)
  5762  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  5763  		v2.AuxInt = 64
  5764  		v2.AddArg(y)
  5765  		v.AddArg(v2)
  5766  		return true
  5767  	}
  5768  }
  5769  func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool {
  5770  	b := v.Block
  5771  	typ := &b.Func.Config.Types
  5772  	// match: (Rsh32Ux8 x y)
  5773  	// cond: shiftIsBounded(v)
  5774  	// result: (SRW x y)
  5775  	for {
  5776  		y := v.Args[1]
  5777  		x := v.Args[0]
  5778  		if !(shiftIsBounded(v)) {
  5779  			break
  5780  		}
  5781  		v.reset(OpS390XSRW)
  5782  		v.AddArg(x)
  5783  		v.AddArg(y)
  5784  		return true
  5785  	}
  5786  	// match: (Rsh32Ux8 <t> x y)
  5787  	// cond:
  5788  	// result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  5789  	for {
  5790  		t := v.Type
  5791  		y := v.Args[1]
  5792  		x := v.Args[0]
  5793  		v.reset(OpS390XMOVDGE)
  5794  		v.Type = t
  5795  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  5796  		v0.AddArg(x)
  5797  		v0.AddArg(y)
  5798  		v.AddArg(v0)
  5799  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5800  		v1.AuxInt = 0
  5801  		v.AddArg(v1)
  5802  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5803  		v2.AuxInt = 64
  5804  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  5805  		v3.AddArg(y)
  5806  		v2.AddArg(v3)
  5807  		v.AddArg(v2)
  5808  		return true
  5809  	}
  5810  }
  5811  func rewriteValueS390X_OpRsh32x16_0(v *Value) bool {
  5812  	b := v.Block
  5813  	typ := &b.Func.Config.Types
  5814  	// match: (Rsh32x16 x y)
  5815  	// cond: shiftIsBounded(v)
  5816  	// result: (SRAW x y)
  5817  	for {
  5818  		y := v.Args[1]
  5819  		x := v.Args[0]
  5820  		if !(shiftIsBounded(v)) {
  5821  			break
  5822  		}
  5823  		v.reset(OpS390XSRAW)
  5824  		v.AddArg(x)
  5825  		v.AddArg(y)
  5826  		return true
  5827  	}
  5828  	// match: (Rsh32x16 x y)
  5829  	// cond:
  5830  	// result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64])))
  5831  	for {
  5832  		y := v.Args[1]
  5833  		x := v.Args[0]
  5834  		v.reset(OpS390XSRAW)
  5835  		v.AddArg(x)
  5836  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5837  		v0.AddArg(y)
  5838  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5839  		v1.AuxInt = 63
  5840  		v0.AddArg(v1)
  5841  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5842  		v2.AuxInt = 64
  5843  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  5844  		v3.AddArg(y)
  5845  		v2.AddArg(v3)
  5846  		v0.AddArg(v2)
  5847  		v.AddArg(v0)
  5848  		return true
  5849  	}
  5850  }
  5851  func rewriteValueS390X_OpRsh32x32_0(v *Value) bool {
  5852  	b := v.Block
  5853  	// match: (Rsh32x32 x y)
  5854  	// cond: shiftIsBounded(v)
  5855  	// result: (SRAW x y)
  5856  	for {
  5857  		y := v.Args[1]
  5858  		x := v.Args[0]
  5859  		if !(shiftIsBounded(v)) {
  5860  			break
  5861  		}
  5862  		v.reset(OpS390XSRAW)
  5863  		v.AddArg(x)
  5864  		v.AddArg(y)
  5865  		return true
  5866  	}
  5867  	// match: (Rsh32x32 x y)
  5868  	// cond:
  5869  	// result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64])))
  5870  	for {
  5871  		y := v.Args[1]
  5872  		x := v.Args[0]
  5873  		v.reset(OpS390XSRAW)
  5874  		v.AddArg(x)
  5875  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5876  		v0.AddArg(y)
  5877  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5878  		v1.AuxInt = 63
  5879  		v0.AddArg(v1)
  5880  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5881  		v2.AuxInt = 64
  5882  		v2.AddArg(y)
  5883  		v0.AddArg(v2)
  5884  		v.AddArg(v0)
  5885  		return true
  5886  	}
  5887  }
  5888  func rewriteValueS390X_OpRsh32x64_0(v *Value) bool {
  5889  	b := v.Block
  5890  	// match: (Rsh32x64 x y)
  5891  	// cond: shiftIsBounded(v)
  5892  	// result: (SRAW x y)
  5893  	for {
  5894  		y := v.Args[1]
  5895  		x := v.Args[0]
  5896  		if !(shiftIsBounded(v)) {
  5897  			break
  5898  		}
  5899  		v.reset(OpS390XSRAW)
  5900  		v.AddArg(x)
  5901  		v.AddArg(y)
  5902  		return true
  5903  	}
  5904  	// match: (Rsh32x64 x y)
  5905  	// cond:
  5906  	// result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64])))
  5907  	for {
  5908  		y := v.Args[1]
  5909  		x := v.Args[0]
  5910  		v.reset(OpS390XSRAW)
  5911  		v.AddArg(x)
  5912  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5913  		v0.AddArg(y)
  5914  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5915  		v1.AuxInt = 63
  5916  		v0.AddArg(v1)
  5917  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  5918  		v2.AuxInt = 64
  5919  		v2.AddArg(y)
  5920  		v0.AddArg(v2)
  5921  		v.AddArg(v0)
  5922  		return true
  5923  	}
  5924  }
  5925  func rewriteValueS390X_OpRsh32x8_0(v *Value) bool {
  5926  	b := v.Block
  5927  	typ := &b.Func.Config.Types
  5928  	// match: (Rsh32x8 x y)
  5929  	// cond: shiftIsBounded(v)
  5930  	// result: (SRAW x y)
  5931  	for {
  5932  		y := v.Args[1]
  5933  		x := v.Args[0]
  5934  		if !(shiftIsBounded(v)) {
  5935  			break
  5936  		}
  5937  		v.reset(OpS390XSRAW)
  5938  		v.AddArg(x)
  5939  		v.AddArg(y)
  5940  		return true
  5941  	}
  5942  	// match: (Rsh32x8 x y)
  5943  	// cond:
  5944  	// result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64])))
  5945  	for {
  5946  		y := v.Args[1]
  5947  		x := v.Args[0]
  5948  		v.reset(OpS390XSRAW)
  5949  		v.AddArg(x)
  5950  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  5951  		v0.AddArg(y)
  5952  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  5953  		v1.AuxInt = 63
  5954  		v0.AddArg(v1)
  5955  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5956  		v2.AuxInt = 64
  5957  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  5958  		v3.AddArg(y)
  5959  		v2.AddArg(v3)
  5960  		v0.AddArg(v2)
  5961  		v.AddArg(v0)
  5962  		return true
  5963  	}
  5964  }
  5965  func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool {
  5966  	b := v.Block
  5967  	typ := &b.Func.Config.Types
  5968  	// match: (Rsh64Ux16 x y)
  5969  	// cond: shiftIsBounded(v)
  5970  	// result: (SRD x y)
  5971  	for {
  5972  		y := v.Args[1]
  5973  		x := v.Args[0]
  5974  		if !(shiftIsBounded(v)) {
  5975  			break
  5976  		}
  5977  		v.reset(OpS390XSRD)
  5978  		v.AddArg(x)
  5979  		v.AddArg(y)
  5980  		return true
  5981  	}
  5982  	// match: (Rsh64Ux16 <t> x y)
  5983  	// cond:
  5984  	// result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  5985  	for {
  5986  		t := v.Type
  5987  		y := v.Args[1]
  5988  		x := v.Args[0]
  5989  		v.reset(OpS390XMOVDGE)
  5990  		v.Type = t
  5991  		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
  5992  		v0.AddArg(x)
  5993  		v0.AddArg(y)
  5994  		v.AddArg(v0)
  5995  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  5996  		v1.AuxInt = 0
  5997  		v.AddArg(v1)
  5998  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  5999  		v2.AuxInt = 64
  6000  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  6001  		v3.AddArg(y)
  6002  		v2.AddArg(v3)
  6003  		v.AddArg(v2)
  6004  		return true
  6005  	}
  6006  }
  6007  func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool {
  6008  	b := v.Block
  6009  	typ := &b.Func.Config.Types
  6010  	// match: (Rsh64Ux32 x y)
  6011  	// cond: shiftIsBounded(v)
  6012  	// result: (SRD x y)
  6013  	for {
  6014  		y := v.Args[1]
  6015  		x := v.Args[0]
  6016  		if !(shiftIsBounded(v)) {
  6017  			break
  6018  		}
  6019  		v.reset(OpS390XSRD)
  6020  		v.AddArg(x)
  6021  		v.AddArg(y)
  6022  		return true
  6023  	}
  6024  	// match: (Rsh64Ux32 <t> x y)
  6025  	// cond:
  6026  	// result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst y [64]))
  6027  	for {
  6028  		t := v.Type
  6029  		y := v.Args[1]
  6030  		x := v.Args[0]
  6031  		v.reset(OpS390XMOVDGE)
  6032  		v.Type = t
  6033  		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
  6034  		v0.AddArg(x)
  6035  		v0.AddArg(y)
  6036  		v.AddArg(v0)
  6037  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6038  		v1.AuxInt = 0
  6039  		v.AddArg(v1)
  6040  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6041  		v2.AuxInt = 64
  6042  		v2.AddArg(y)
  6043  		v.AddArg(v2)
  6044  		return true
  6045  	}
  6046  }
  6047  func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool {
  6048  	b := v.Block
  6049  	typ := &b.Func.Config.Types
  6050  	// match: (Rsh64Ux64 x y)
  6051  	// cond: shiftIsBounded(v)
  6052  	// result: (SRD x y)
  6053  	for {
  6054  		y := v.Args[1]
  6055  		x := v.Args[0]
  6056  		if !(shiftIsBounded(v)) {
  6057  			break
  6058  		}
  6059  		v.reset(OpS390XSRD)
  6060  		v.AddArg(x)
  6061  		v.AddArg(y)
  6062  		return true
  6063  	}
  6064  	// match: (Rsh64Ux64 <t> x y)
  6065  	// cond:
  6066  	// result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPUconst y [64]))
  6067  	for {
  6068  		t := v.Type
  6069  		y := v.Args[1]
  6070  		x := v.Args[0]
  6071  		v.reset(OpS390XMOVDGE)
  6072  		v.Type = t
  6073  		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
  6074  		v0.AddArg(x)
  6075  		v0.AddArg(y)
  6076  		v.AddArg(v0)
  6077  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6078  		v1.AuxInt = 0
  6079  		v.AddArg(v1)
  6080  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  6081  		v2.AuxInt = 64
  6082  		v2.AddArg(y)
  6083  		v.AddArg(v2)
  6084  		return true
  6085  	}
  6086  }
  6087  func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool {
  6088  	b := v.Block
  6089  	typ := &b.Func.Config.Types
  6090  	// match: (Rsh64Ux8 x y)
  6091  	// cond: shiftIsBounded(v)
  6092  	// result: (SRD x y)
  6093  	for {
  6094  		y := v.Args[1]
  6095  		x := v.Args[0]
  6096  		if !(shiftIsBounded(v)) {
  6097  			break
  6098  		}
  6099  		v.reset(OpS390XSRD)
  6100  		v.AddArg(x)
  6101  		v.AddArg(y)
  6102  		return true
  6103  	}
  6104  	// match: (Rsh64Ux8 <t> x y)
  6105  	// cond:
  6106  	// result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  6107  	for {
  6108  		t := v.Type
  6109  		y := v.Args[1]
  6110  		x := v.Args[0]
  6111  		v.reset(OpS390XMOVDGE)
  6112  		v.Type = t
  6113  		v0 := b.NewValue0(v.Pos, OpS390XSRD, t)
  6114  		v0.AddArg(x)
  6115  		v0.AddArg(y)
  6116  		v.AddArg(v0)
  6117  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6118  		v1.AuxInt = 0
  6119  		v.AddArg(v1)
  6120  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6121  		v2.AuxInt = 64
  6122  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6123  		v3.AddArg(y)
  6124  		v2.AddArg(v3)
  6125  		v.AddArg(v2)
  6126  		return true
  6127  	}
  6128  }
  6129  func rewriteValueS390X_OpRsh64x16_0(v *Value) bool {
  6130  	b := v.Block
  6131  	typ := &b.Func.Config.Types
  6132  	// match: (Rsh64x16 x y)
  6133  	// cond: shiftIsBounded(v)
  6134  	// result: (SRAD x y)
  6135  	for {
  6136  		y := v.Args[1]
  6137  		x := v.Args[0]
  6138  		if !(shiftIsBounded(v)) {
  6139  			break
  6140  		}
  6141  		v.reset(OpS390XSRAD)
  6142  		v.AddArg(x)
  6143  		v.AddArg(y)
  6144  		return true
  6145  	}
  6146  	// match: (Rsh64x16 x y)
  6147  	// cond:
  6148  	// result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64])))
  6149  	for {
  6150  		y := v.Args[1]
  6151  		x := v.Args[0]
  6152  		v.reset(OpS390XSRAD)
  6153  		v.AddArg(x)
  6154  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6155  		v0.AddArg(y)
  6156  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6157  		v1.AuxInt = 63
  6158  		v0.AddArg(v1)
  6159  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6160  		v2.AuxInt = 64
  6161  		v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  6162  		v3.AddArg(y)
  6163  		v2.AddArg(v3)
  6164  		v0.AddArg(v2)
  6165  		v.AddArg(v0)
  6166  		return true
  6167  	}
  6168  }
  6169  func rewriteValueS390X_OpRsh64x32_0(v *Value) bool {
  6170  	b := v.Block
  6171  	// match: (Rsh64x32 x y)
  6172  	// cond: shiftIsBounded(v)
  6173  	// result: (SRAD x y)
  6174  	for {
  6175  		y := v.Args[1]
  6176  		x := v.Args[0]
  6177  		if !(shiftIsBounded(v)) {
  6178  			break
  6179  		}
  6180  		v.reset(OpS390XSRAD)
  6181  		v.AddArg(x)
  6182  		v.AddArg(y)
  6183  		return true
  6184  	}
  6185  	// match: (Rsh64x32 x y)
  6186  	// cond:
  6187  	// result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64])))
  6188  	for {
  6189  		y := v.Args[1]
  6190  		x := v.Args[0]
  6191  		v.reset(OpS390XSRAD)
  6192  		v.AddArg(x)
  6193  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6194  		v0.AddArg(y)
  6195  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6196  		v1.AuxInt = 63
  6197  		v0.AddArg(v1)
  6198  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6199  		v2.AuxInt = 64
  6200  		v2.AddArg(y)
  6201  		v0.AddArg(v2)
  6202  		v.AddArg(v0)
  6203  		return true
  6204  	}
  6205  }
  6206  func rewriteValueS390X_OpRsh64x64_0(v *Value) bool {
  6207  	b := v.Block
  6208  	// match: (Rsh64x64 x y)
  6209  	// cond: shiftIsBounded(v)
  6210  	// result: (SRAD x y)
  6211  	for {
  6212  		y := v.Args[1]
  6213  		x := v.Args[0]
  6214  		if !(shiftIsBounded(v)) {
  6215  			break
  6216  		}
  6217  		v.reset(OpS390XSRAD)
  6218  		v.AddArg(x)
  6219  		v.AddArg(y)
  6220  		return true
  6221  	}
  6222  	// match: (Rsh64x64 x y)
  6223  	// cond:
  6224  	// result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64])))
  6225  	for {
  6226  		y := v.Args[1]
  6227  		x := v.Args[0]
  6228  		v.reset(OpS390XSRAD)
  6229  		v.AddArg(x)
  6230  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6231  		v0.AddArg(y)
  6232  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6233  		v1.AuxInt = 63
  6234  		v0.AddArg(v1)
  6235  		v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  6236  		v2.AuxInt = 64
  6237  		v2.AddArg(y)
  6238  		v0.AddArg(v2)
  6239  		v.AddArg(v0)
  6240  		return true
  6241  	}
  6242  }
  6243  func rewriteValueS390X_OpRsh64x8_0(v *Value) bool {
  6244  	b := v.Block
  6245  	typ := &b.Func.Config.Types
  6246  	// match: (Rsh64x8 x y)
  6247  	// cond: shiftIsBounded(v)
  6248  	// result: (SRAD x y)
  6249  	for {
  6250  		y := v.Args[1]
  6251  		x := v.Args[0]
  6252  		if !(shiftIsBounded(v)) {
  6253  			break
  6254  		}
  6255  		v.reset(OpS390XSRAD)
  6256  		v.AddArg(x)
  6257  		v.AddArg(y)
  6258  		return true
  6259  	}
  6260  	// match: (Rsh64x8 x y)
  6261  	// cond:
  6262  	// result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64])))
  6263  	for {
  6264  		y := v.Args[1]
  6265  		x := v.Args[0]
  6266  		v.reset(OpS390XSRAD)
  6267  		v.AddArg(x)
  6268  		v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6269  		v0.AddArg(y)
  6270  		v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6271  		v1.AuxInt = 63
  6272  		v0.AddArg(v1)
  6273  		v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6274  		v2.AuxInt = 64
  6275  		v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6276  		v3.AddArg(y)
  6277  		v2.AddArg(v3)
  6278  		v0.AddArg(v2)
  6279  		v.AddArg(v0)
  6280  		return true
  6281  	}
  6282  }
  6283  func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool {
  6284  	b := v.Block
  6285  	typ := &b.Func.Config.Types
  6286  	// match: (Rsh8Ux16 x y)
  6287  	// cond: shiftIsBounded(v)
  6288  	// result: (SRW (MOVBZreg x) y)
  6289  	for {
  6290  		y := v.Args[1]
  6291  		x := v.Args[0]
  6292  		if !(shiftIsBounded(v)) {
  6293  			break
  6294  		}
  6295  		v.reset(OpS390XSRW)
  6296  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6297  		v0.AddArg(x)
  6298  		v.AddArg(v0)
  6299  		v.AddArg(y)
  6300  		return true
  6301  	}
  6302  	// match: (Rsh8Ux16 <t> x y)
  6303  	// cond:
  6304  	// result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64]))
  6305  	for {
  6306  		t := v.Type
  6307  		y := v.Args[1]
  6308  		x := v.Args[0]
  6309  		v.reset(OpS390XMOVDGE)
  6310  		v.Type = t
  6311  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  6312  		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6313  		v1.AddArg(x)
  6314  		v0.AddArg(v1)
  6315  		v0.AddArg(y)
  6316  		v.AddArg(v0)
  6317  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6318  		v2.AuxInt = 0
  6319  		v.AddArg(v2)
  6320  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6321  		v3.AuxInt = 64
  6322  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  6323  		v4.AddArg(y)
  6324  		v3.AddArg(v4)
  6325  		v.AddArg(v3)
  6326  		return true
  6327  	}
  6328  }
  6329  func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool {
  6330  	b := v.Block
  6331  	typ := &b.Func.Config.Types
  6332  	// match: (Rsh8Ux32 x y)
  6333  	// cond: shiftIsBounded(v)
  6334  	// result: (SRW (MOVBZreg x) y)
  6335  	for {
  6336  		y := v.Args[1]
  6337  		x := v.Args[0]
  6338  		if !(shiftIsBounded(v)) {
  6339  			break
  6340  		}
  6341  		v.reset(OpS390XSRW)
  6342  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6343  		v0.AddArg(x)
  6344  		v.AddArg(v0)
  6345  		v.AddArg(y)
  6346  		return true
  6347  	}
  6348  	// match: (Rsh8Ux32 <t> x y)
  6349  	// cond:
  6350  	// result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst y [64]))
  6351  	for {
  6352  		t := v.Type
  6353  		y := v.Args[1]
  6354  		x := v.Args[0]
  6355  		v.reset(OpS390XMOVDGE)
  6356  		v.Type = t
  6357  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  6358  		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6359  		v1.AddArg(x)
  6360  		v0.AddArg(v1)
  6361  		v0.AddArg(y)
  6362  		v.AddArg(v0)
  6363  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6364  		v2.AuxInt = 0
  6365  		v.AddArg(v2)
  6366  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6367  		v3.AuxInt = 64
  6368  		v3.AddArg(y)
  6369  		v.AddArg(v3)
  6370  		return true
  6371  	}
  6372  }
  6373  func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool {
  6374  	b := v.Block
  6375  	typ := &b.Func.Config.Types
  6376  	// match: (Rsh8Ux64 x y)
  6377  	// cond: shiftIsBounded(v)
  6378  	// result: (SRW (MOVBZreg x) y)
  6379  	for {
  6380  		y := v.Args[1]
  6381  		x := v.Args[0]
  6382  		if !(shiftIsBounded(v)) {
  6383  			break
  6384  		}
  6385  		v.reset(OpS390XSRW)
  6386  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6387  		v0.AddArg(x)
  6388  		v.AddArg(v0)
  6389  		v.AddArg(y)
  6390  		return true
  6391  	}
  6392  	// match: (Rsh8Ux64 <t> x y)
  6393  	// cond:
  6394  	// result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPUconst y [64]))
  6395  	for {
  6396  		t := v.Type
  6397  		y := v.Args[1]
  6398  		x := v.Args[0]
  6399  		v.reset(OpS390XMOVDGE)
  6400  		v.Type = t
  6401  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  6402  		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6403  		v1.AddArg(x)
  6404  		v0.AddArg(v1)
  6405  		v0.AddArg(y)
  6406  		v.AddArg(v0)
  6407  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6408  		v2.AuxInt = 0
  6409  		v.AddArg(v2)
  6410  		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  6411  		v3.AuxInt = 64
  6412  		v3.AddArg(y)
  6413  		v.AddArg(v3)
  6414  		return true
  6415  	}
  6416  }
  6417  func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool {
  6418  	b := v.Block
  6419  	typ := &b.Func.Config.Types
  6420  	// match: (Rsh8Ux8 x y)
  6421  	// cond: shiftIsBounded(v)
  6422  	// result: (SRW (MOVBZreg x) y)
  6423  	for {
  6424  		y := v.Args[1]
  6425  		x := v.Args[0]
  6426  		if !(shiftIsBounded(v)) {
  6427  			break
  6428  		}
  6429  		v.reset(OpS390XSRW)
  6430  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6431  		v0.AddArg(x)
  6432  		v.AddArg(v0)
  6433  		v.AddArg(y)
  6434  		return true
  6435  	}
  6436  	// match: (Rsh8Ux8 <t> x y)
  6437  	// cond:
  6438  	// result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64]))
  6439  	for {
  6440  		t := v.Type
  6441  		y := v.Args[1]
  6442  		x := v.Args[0]
  6443  		v.reset(OpS390XMOVDGE)
  6444  		v.Type = t
  6445  		v0 := b.NewValue0(v.Pos, OpS390XSRW, t)
  6446  		v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6447  		v1.AddArg(x)
  6448  		v0.AddArg(v1)
  6449  		v0.AddArg(y)
  6450  		v.AddArg(v0)
  6451  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64)
  6452  		v2.AuxInt = 0
  6453  		v.AddArg(v2)
  6454  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6455  		v3.AuxInt = 64
  6456  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6457  		v4.AddArg(y)
  6458  		v3.AddArg(v4)
  6459  		v.AddArg(v3)
  6460  		return true
  6461  	}
  6462  }
  6463  func rewriteValueS390X_OpRsh8x16_0(v *Value) bool {
  6464  	b := v.Block
  6465  	typ := &b.Func.Config.Types
  6466  	// match: (Rsh8x16 x y)
  6467  	// cond: shiftIsBounded(v)
  6468  	// result: (SRAW (MOVBreg x) y)
  6469  	for {
  6470  		y := v.Args[1]
  6471  		x := v.Args[0]
  6472  		if !(shiftIsBounded(v)) {
  6473  			break
  6474  		}
  6475  		v.reset(OpS390XSRAW)
  6476  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6477  		v0.AddArg(x)
  6478  		v.AddArg(v0)
  6479  		v.AddArg(y)
  6480  		return true
  6481  	}
  6482  	// match: (Rsh8x16 x y)
  6483  	// cond:
  6484  	// result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64])))
  6485  	for {
  6486  		y := v.Args[1]
  6487  		x := v.Args[0]
  6488  		v.reset(OpS390XSRAW)
  6489  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6490  		v0.AddArg(x)
  6491  		v.AddArg(v0)
  6492  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6493  		v1.AddArg(y)
  6494  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6495  		v2.AuxInt = 63
  6496  		v1.AddArg(v2)
  6497  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6498  		v3.AuxInt = 64
  6499  		v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64)
  6500  		v4.AddArg(y)
  6501  		v3.AddArg(v4)
  6502  		v1.AddArg(v3)
  6503  		v.AddArg(v1)
  6504  		return true
  6505  	}
  6506  }
  6507  func rewriteValueS390X_OpRsh8x32_0(v *Value) bool {
  6508  	b := v.Block
  6509  	typ := &b.Func.Config.Types
  6510  	// match: (Rsh8x32 x y)
  6511  	// cond: shiftIsBounded(v)
  6512  	// result: (SRAW (MOVBreg x) y)
  6513  	for {
  6514  		y := v.Args[1]
  6515  		x := v.Args[0]
  6516  		if !(shiftIsBounded(v)) {
  6517  			break
  6518  		}
  6519  		v.reset(OpS390XSRAW)
  6520  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6521  		v0.AddArg(x)
  6522  		v.AddArg(v0)
  6523  		v.AddArg(y)
  6524  		return true
  6525  	}
  6526  	// match: (Rsh8x32 x y)
  6527  	// cond:
  6528  	// result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64])))
  6529  	for {
  6530  		y := v.Args[1]
  6531  		x := v.Args[0]
  6532  		v.reset(OpS390XSRAW)
  6533  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6534  		v0.AddArg(x)
  6535  		v.AddArg(v0)
  6536  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6537  		v1.AddArg(y)
  6538  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6539  		v2.AuxInt = 63
  6540  		v1.AddArg(v2)
  6541  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6542  		v3.AuxInt = 64
  6543  		v3.AddArg(y)
  6544  		v1.AddArg(v3)
  6545  		v.AddArg(v1)
  6546  		return true
  6547  	}
  6548  }
  6549  func rewriteValueS390X_OpRsh8x64_0(v *Value) bool {
  6550  	b := v.Block
  6551  	typ := &b.Func.Config.Types
  6552  	// match: (Rsh8x64 x y)
  6553  	// cond: shiftIsBounded(v)
  6554  	// result: (SRAW (MOVBreg x) y)
  6555  	for {
  6556  		y := v.Args[1]
  6557  		x := v.Args[0]
  6558  		if !(shiftIsBounded(v)) {
  6559  			break
  6560  		}
  6561  		v.reset(OpS390XSRAW)
  6562  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6563  		v0.AddArg(x)
  6564  		v.AddArg(v0)
  6565  		v.AddArg(y)
  6566  		return true
  6567  	}
  6568  	// match: (Rsh8x64 x y)
  6569  	// cond:
  6570  	// result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64])))
  6571  	for {
  6572  		y := v.Args[1]
  6573  		x := v.Args[0]
  6574  		v.reset(OpS390XSRAW)
  6575  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6576  		v0.AddArg(x)
  6577  		v.AddArg(v0)
  6578  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6579  		v1.AddArg(y)
  6580  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6581  		v2.AuxInt = 63
  6582  		v1.AddArg(v2)
  6583  		v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  6584  		v3.AuxInt = 64
  6585  		v3.AddArg(y)
  6586  		v1.AddArg(v3)
  6587  		v.AddArg(v1)
  6588  		return true
  6589  	}
  6590  }
  6591  func rewriteValueS390X_OpRsh8x8_0(v *Value) bool {
  6592  	b := v.Block
  6593  	typ := &b.Func.Config.Types
  6594  	// match: (Rsh8x8 x y)
  6595  	// cond: shiftIsBounded(v)
  6596  	// result: (SRAW (MOVBreg x) y)
  6597  	for {
  6598  		y := v.Args[1]
  6599  		x := v.Args[0]
  6600  		if !(shiftIsBounded(v)) {
  6601  			break
  6602  		}
  6603  		v.reset(OpS390XSRAW)
  6604  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6605  		v0.AddArg(x)
  6606  		v.AddArg(v0)
  6607  		v.AddArg(y)
  6608  		return true
  6609  	}
  6610  	// match: (Rsh8x8 x y)
  6611  	// cond:
  6612  	// result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64])))
  6613  	for {
  6614  		y := v.Args[1]
  6615  		x := v.Args[0]
  6616  		v.reset(OpS390XSRAW)
  6617  		v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64)
  6618  		v0.AddArg(x)
  6619  		v.AddArg(v0)
  6620  		v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type)
  6621  		v1.AddArg(y)
  6622  		v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type)
  6623  		v2.AuxInt = 63
  6624  		v1.AddArg(v2)
  6625  		v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  6626  		v3.AuxInt = 64
  6627  		v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64)
  6628  		v4.AddArg(y)
  6629  		v3.AddArg(v4)
  6630  		v1.AddArg(v3)
  6631  		v.AddArg(v1)
  6632  		return true
  6633  	}
  6634  }
  6635  func rewriteValueS390X_OpS390XADD_0(v *Value) bool {
  6636  	// match: (ADD x (MOVDconst [c]))
  6637  	// cond: is32Bit(c)
  6638  	// result: (ADDconst [c] x)
  6639  	for {
  6640  		_ = v.Args[1]
  6641  		x := v.Args[0]
  6642  		v_1 := v.Args[1]
  6643  		if v_1.Op != OpS390XMOVDconst {
  6644  			break
  6645  		}
  6646  		c := v_1.AuxInt
  6647  		if !(is32Bit(c)) {
  6648  			break
  6649  		}
  6650  		v.reset(OpS390XADDconst)
  6651  		v.AuxInt = c
  6652  		v.AddArg(x)
  6653  		return true
  6654  	}
  6655  	// match: (ADD (MOVDconst [c]) x)
  6656  	// cond: is32Bit(c)
  6657  	// result: (ADDconst [c] x)
  6658  	for {
  6659  		x := v.Args[1]
  6660  		v_0 := v.Args[0]
  6661  		if v_0.Op != OpS390XMOVDconst {
  6662  			break
  6663  		}
  6664  		c := v_0.AuxInt
  6665  		if !(is32Bit(c)) {
  6666  			break
  6667  		}
  6668  		v.reset(OpS390XADDconst)
  6669  		v.AuxInt = c
  6670  		v.AddArg(x)
  6671  		return true
  6672  	}
  6673  	// match: (ADD (SLDconst x [c]) (SRDconst x [d]))
  6674  	// cond: d == 64-c
  6675  	// result: (RLLGconst [c] x)
  6676  	for {
  6677  		_ = v.Args[1]
  6678  		v_0 := v.Args[0]
  6679  		if v_0.Op != OpS390XSLDconst {
  6680  			break
  6681  		}
  6682  		c := v_0.AuxInt
  6683  		x := v_0.Args[0]
  6684  		v_1 := v.Args[1]
  6685  		if v_1.Op != OpS390XSRDconst {
  6686  			break
  6687  		}
  6688  		d := v_1.AuxInt
  6689  		if x != v_1.Args[0] {
  6690  			break
  6691  		}
  6692  		if !(d == 64-c) {
  6693  			break
  6694  		}
  6695  		v.reset(OpS390XRLLGconst)
  6696  		v.AuxInt = c
  6697  		v.AddArg(x)
  6698  		return true
  6699  	}
  6700  	// match: (ADD (SRDconst x [d]) (SLDconst x [c]))
  6701  	// cond: d == 64-c
  6702  	// result: (RLLGconst [c] x)
  6703  	for {
  6704  		_ = v.Args[1]
  6705  		v_0 := v.Args[0]
  6706  		if v_0.Op != OpS390XSRDconst {
  6707  			break
  6708  		}
  6709  		d := v_0.AuxInt
  6710  		x := v_0.Args[0]
  6711  		v_1 := v.Args[1]
  6712  		if v_1.Op != OpS390XSLDconst {
  6713  			break
  6714  		}
  6715  		c := v_1.AuxInt
  6716  		if x != v_1.Args[0] {
  6717  			break
  6718  		}
  6719  		if !(d == 64-c) {
  6720  			break
  6721  		}
  6722  		v.reset(OpS390XRLLGconst)
  6723  		v.AuxInt = c
  6724  		v.AddArg(x)
  6725  		return true
  6726  	}
  6727  	// match: (ADD idx (MOVDaddr [c] {s} ptr))
  6728  	// cond: ptr.Op != OpSB && idx.Op != OpSB
  6729  	// result: (MOVDaddridx [c] {s} ptr idx)
  6730  	for {
  6731  		_ = v.Args[1]
  6732  		idx := v.Args[0]
  6733  		v_1 := v.Args[1]
  6734  		if v_1.Op != OpS390XMOVDaddr {
  6735  			break
  6736  		}
  6737  		c := v_1.AuxInt
  6738  		s := v_1.Aux
  6739  		ptr := v_1.Args[0]
  6740  		if !(ptr.Op != OpSB && idx.Op != OpSB) {
  6741  			break
  6742  		}
  6743  		v.reset(OpS390XMOVDaddridx)
  6744  		v.AuxInt = c
  6745  		v.Aux = s
  6746  		v.AddArg(ptr)
  6747  		v.AddArg(idx)
  6748  		return true
  6749  	}
  6750  	// match: (ADD (MOVDaddr [c] {s} ptr) idx)
  6751  	// cond: ptr.Op != OpSB && idx.Op != OpSB
  6752  	// result: (MOVDaddridx [c] {s} ptr idx)
  6753  	for {
  6754  		idx := v.Args[1]
  6755  		v_0 := v.Args[0]
  6756  		if v_0.Op != OpS390XMOVDaddr {
  6757  			break
  6758  		}
  6759  		c := v_0.AuxInt
  6760  		s := v_0.Aux
  6761  		ptr := v_0.Args[0]
  6762  		if !(ptr.Op != OpSB && idx.Op != OpSB) {
  6763  			break
  6764  		}
  6765  		v.reset(OpS390XMOVDaddridx)
  6766  		v.AuxInt = c
  6767  		v.Aux = s
  6768  		v.AddArg(ptr)
  6769  		v.AddArg(idx)
  6770  		return true
  6771  	}
  6772  	// match: (ADD x (NEG y))
  6773  	// cond:
  6774  	// result: (SUB x y)
  6775  	for {
  6776  		_ = v.Args[1]
  6777  		x := v.Args[0]
  6778  		v_1 := v.Args[1]
  6779  		if v_1.Op != OpS390XNEG {
  6780  			break
  6781  		}
  6782  		y := v_1.Args[0]
  6783  		v.reset(OpS390XSUB)
  6784  		v.AddArg(x)
  6785  		v.AddArg(y)
  6786  		return true
  6787  	}
  6788  	// match: (ADD (NEG y) x)
  6789  	// cond:
  6790  	// result: (SUB x y)
  6791  	for {
  6792  		x := v.Args[1]
  6793  		v_0 := v.Args[0]
  6794  		if v_0.Op != OpS390XNEG {
  6795  			break
  6796  		}
  6797  		y := v_0.Args[0]
  6798  		v.reset(OpS390XSUB)
  6799  		v.AddArg(x)
  6800  		v.AddArg(y)
  6801  		return true
  6802  	}
  6803  	// match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem))
  6804  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  6805  	// result: (ADDload <t> [off] {sym} x ptr mem)
  6806  	for {
  6807  		t := v.Type
  6808  		_ = v.Args[1]
  6809  		x := v.Args[0]
  6810  		g := v.Args[1]
  6811  		if g.Op != OpS390XMOVDload {
  6812  			break
  6813  		}
  6814  		off := g.AuxInt
  6815  		sym := g.Aux
  6816  		mem := g.Args[1]
  6817  		ptr := g.Args[0]
  6818  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  6819  			break
  6820  		}
  6821  		v.reset(OpS390XADDload)
  6822  		v.Type = t
  6823  		v.AuxInt = off
  6824  		v.Aux = sym
  6825  		v.AddArg(x)
  6826  		v.AddArg(ptr)
  6827  		v.AddArg(mem)
  6828  		return true
  6829  	}
  6830  	// match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x)
  6831  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  6832  	// result: (ADDload <t> [off] {sym} x ptr mem)
  6833  	for {
  6834  		t := v.Type
  6835  		x := v.Args[1]
  6836  		g := v.Args[0]
  6837  		if g.Op != OpS390XMOVDload {
  6838  			break
  6839  		}
  6840  		off := g.AuxInt
  6841  		sym := g.Aux
  6842  		mem := g.Args[1]
  6843  		ptr := g.Args[0]
  6844  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  6845  			break
  6846  		}
  6847  		v.reset(OpS390XADDload)
  6848  		v.Type = t
  6849  		v.AuxInt = off
  6850  		v.Aux = sym
  6851  		v.AddArg(x)
  6852  		v.AddArg(ptr)
  6853  		v.AddArg(mem)
  6854  		return true
  6855  	}
  6856  	return false
  6857  }
  6858  func rewriteValueS390X_OpS390XADD_10(v *Value) bool {
  6859  	// match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x)
  6860  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  6861  	// result: (ADDload <t> [off] {sym} x ptr mem)
  6862  	for {
  6863  		t := v.Type
  6864  		x := v.Args[1]
  6865  		g := v.Args[0]
  6866  		if g.Op != OpS390XMOVDload {
  6867  			break
  6868  		}
  6869  		off := g.AuxInt
  6870  		sym := g.Aux
  6871  		mem := g.Args[1]
  6872  		ptr := g.Args[0]
  6873  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  6874  			break
  6875  		}
  6876  		v.reset(OpS390XADDload)
  6877  		v.Type = t
  6878  		v.AuxInt = off
  6879  		v.Aux = sym
  6880  		v.AddArg(x)
  6881  		v.AddArg(ptr)
  6882  		v.AddArg(mem)
  6883  		return true
  6884  	}
  6885  	// match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem))
  6886  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  6887  	// result: (ADDload <t> [off] {sym} x ptr mem)
  6888  	for {
  6889  		t := v.Type
  6890  		_ = v.Args[1]
  6891  		x := v.Args[0]
  6892  		g := v.Args[1]
  6893  		if g.Op != OpS390XMOVDload {
  6894  			break
  6895  		}
  6896  		off := g.AuxInt
  6897  		sym := g.Aux
  6898  		mem := g.Args[1]
  6899  		ptr := g.Args[0]
  6900  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  6901  			break
  6902  		}
  6903  		v.reset(OpS390XADDload)
  6904  		v.Type = t
  6905  		v.AuxInt = off
  6906  		v.Aux = sym
  6907  		v.AddArg(x)
  6908  		v.AddArg(ptr)
  6909  		v.AddArg(mem)
  6910  		return true
  6911  	}
  6912  	return false
  6913  }
  6914  func rewriteValueS390X_OpS390XADDC_0(v *Value) bool {
  6915  	// match: (ADDC x (MOVDconst [c]))
  6916  	// cond: is16Bit(c)
  6917  	// result: (ADDCconst x [c])
  6918  	for {
  6919  		_ = v.Args[1]
  6920  		x := v.Args[0]
  6921  		v_1 := v.Args[1]
  6922  		if v_1.Op != OpS390XMOVDconst {
  6923  			break
  6924  		}
  6925  		c := v_1.AuxInt
  6926  		if !(is16Bit(c)) {
  6927  			break
  6928  		}
  6929  		v.reset(OpS390XADDCconst)
  6930  		v.AuxInt = c
  6931  		v.AddArg(x)
  6932  		return true
  6933  	}
  6934  	// match: (ADDC (MOVDconst [c]) x)
  6935  	// cond: is16Bit(c)
  6936  	// result: (ADDCconst x [c])
  6937  	for {
  6938  		x := v.Args[1]
  6939  		v_0 := v.Args[0]
  6940  		if v_0.Op != OpS390XMOVDconst {
  6941  			break
  6942  		}
  6943  		c := v_0.AuxInt
  6944  		if !(is16Bit(c)) {
  6945  			break
  6946  		}
  6947  		v.reset(OpS390XADDCconst)
  6948  		v.AuxInt = c
  6949  		v.AddArg(x)
  6950  		return true
  6951  	}
  6952  	return false
  6953  }
  6954  func rewriteValueS390X_OpS390XADDE_0(v *Value) bool {
  6955  	// match: (ADDE x y (FlagEQ))
  6956  	// cond:
  6957  	// result: (ADDC x y)
  6958  	for {
  6959  		_ = v.Args[2]
  6960  		x := v.Args[0]
  6961  		y := v.Args[1]
  6962  		v_2 := v.Args[2]
  6963  		if v_2.Op != OpS390XFlagEQ {
  6964  			break
  6965  		}
  6966  		v.reset(OpS390XADDC)
  6967  		v.AddArg(x)
  6968  		v.AddArg(y)
  6969  		return true
  6970  	}
  6971  	// match: (ADDE x y (FlagLT))
  6972  	// cond:
  6973  	// result: (ADDC x y)
  6974  	for {
  6975  		_ = v.Args[2]
  6976  		x := v.Args[0]
  6977  		y := v.Args[1]
  6978  		v_2 := v.Args[2]
  6979  		if v_2.Op != OpS390XFlagLT {
  6980  			break
  6981  		}
  6982  		v.reset(OpS390XADDC)
  6983  		v.AddArg(x)
  6984  		v.AddArg(y)
  6985  		return true
  6986  	}
  6987  	// match: (ADDE x y (Select1 (ADDCconst [-1] (Select0 (ADDE (MOVDconst [0]) (MOVDconst [0]) c)))))
  6988  	// cond:
  6989  	// result: (ADDE x y c)
  6990  	for {
  6991  		_ = v.Args[2]
  6992  		x := v.Args[0]
  6993  		y := v.Args[1]
  6994  		v_2 := v.Args[2]
  6995  		if v_2.Op != OpSelect1 {
  6996  			break
  6997  		}
  6998  		v_2_0 := v_2.Args[0]
  6999  		if v_2_0.Op != OpS390XADDCconst {
  7000  			break
  7001  		}
  7002  		if v_2_0.AuxInt != -1 {
  7003  			break
  7004  		}
  7005  		v_2_0_0 := v_2_0.Args[0]
  7006  		if v_2_0_0.Op != OpSelect0 {
  7007  			break
  7008  		}
  7009  		v_2_0_0_0 := v_2_0_0.Args[0]
  7010  		if v_2_0_0_0.Op != OpS390XADDE {
  7011  			break
  7012  		}
  7013  		c := v_2_0_0_0.Args[2]
  7014  		v_2_0_0_0_0 := v_2_0_0_0.Args[0]
  7015  		if v_2_0_0_0_0.Op != OpS390XMOVDconst {
  7016  			break
  7017  		}
  7018  		if v_2_0_0_0_0.AuxInt != 0 {
  7019  			break
  7020  		}
  7021  		v_2_0_0_0_1 := v_2_0_0_0.Args[1]
  7022  		if v_2_0_0_0_1.Op != OpS390XMOVDconst {
  7023  			break
  7024  		}
  7025  		if v_2_0_0_0_1.AuxInt != 0 {
  7026  			break
  7027  		}
  7028  		v.reset(OpS390XADDE)
  7029  		v.AddArg(x)
  7030  		v.AddArg(y)
  7031  		v.AddArg(c)
  7032  		return true
  7033  	}
  7034  	// match: (ADDE x y (Select1 (ADDCconst [-1] (Select0 (ADDE (MOVDconst [0]) (MOVDconst [0]) c)))))
  7035  	// cond:
  7036  	// result: (ADDE x y c)
  7037  	for {
  7038  		_ = v.Args[2]
  7039  		x := v.Args[0]
  7040  		y := v.Args[1]
  7041  		v_2 := v.Args[2]
  7042  		if v_2.Op != OpSelect1 {
  7043  			break
  7044  		}
  7045  		v_2_0 := v_2.Args[0]
  7046  		if v_2_0.Op != OpS390XADDCconst {
  7047  			break
  7048  		}
  7049  		if v_2_0.AuxInt != -1 {
  7050  			break
  7051  		}
  7052  		v_2_0_0 := v_2_0.Args[0]
  7053  		if v_2_0_0.Op != OpSelect0 {
  7054  			break
  7055  		}
  7056  		v_2_0_0_0 := v_2_0_0.Args[0]
  7057  		if v_2_0_0_0.Op != OpS390XADDE {
  7058  			break
  7059  		}
  7060  		c := v_2_0_0_0.Args[2]
  7061  		v_2_0_0_0_0 := v_2_0_0_0.Args[0]
  7062  		if v_2_0_0_0_0.Op != OpS390XMOVDconst {
  7063  			break
  7064  		}
  7065  		if v_2_0_0_0_0.AuxInt != 0 {
  7066  			break
  7067  		}
  7068  		v_2_0_0_0_1 := v_2_0_0_0.Args[1]
  7069  		if v_2_0_0_0_1.Op != OpS390XMOVDconst {
  7070  			break
  7071  		}
  7072  		if v_2_0_0_0_1.AuxInt != 0 {
  7073  			break
  7074  		}
  7075  		v.reset(OpS390XADDE)
  7076  		v.AddArg(x)
  7077  		v.AddArg(y)
  7078  		v.AddArg(c)
  7079  		return true
  7080  	}
  7081  	return false
  7082  }
  7083  func rewriteValueS390X_OpS390XADDW_0(v *Value) bool {
  7084  	// match: (ADDW x (MOVDconst [c]))
  7085  	// cond:
  7086  	// result: (ADDWconst [int64(int32(c))] x)
  7087  	for {
  7088  		_ = v.Args[1]
  7089  		x := v.Args[0]
  7090  		v_1 := v.Args[1]
  7091  		if v_1.Op != OpS390XMOVDconst {
  7092  			break
  7093  		}
  7094  		c := v_1.AuxInt
  7095  		v.reset(OpS390XADDWconst)
  7096  		v.AuxInt = int64(int32(c))
  7097  		v.AddArg(x)
  7098  		return true
  7099  	}
  7100  	// match: (ADDW (MOVDconst [c]) x)
  7101  	// cond:
  7102  	// result: (ADDWconst [int64(int32(c))] x)
  7103  	for {
  7104  		x := 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.reset(OpS390XADDWconst)
  7111  		v.AuxInt = int64(int32(c))
  7112  		v.AddArg(x)
  7113  		return true
  7114  	}
  7115  	// match: (ADDW (SLWconst x [c]) (SRWconst x [d]))
  7116  	// cond: d == 32-c
  7117  	// result: (RLLconst [c] x)
  7118  	for {
  7119  		_ = v.Args[1]
  7120  		v_0 := v.Args[0]
  7121  		if v_0.Op != OpS390XSLWconst {
  7122  			break
  7123  		}
  7124  		c := v_0.AuxInt
  7125  		x := v_0.Args[0]
  7126  		v_1 := v.Args[1]
  7127  		if v_1.Op != OpS390XSRWconst {
  7128  			break
  7129  		}
  7130  		d := v_1.AuxInt
  7131  		if x != v_1.Args[0] {
  7132  			break
  7133  		}
  7134  		if !(d == 32-c) {
  7135  			break
  7136  		}
  7137  		v.reset(OpS390XRLLconst)
  7138  		v.AuxInt = c
  7139  		v.AddArg(x)
  7140  		return true
  7141  	}
  7142  	// match: (ADDW (SRWconst x [d]) (SLWconst x [c]))
  7143  	// cond: d == 32-c
  7144  	// result: (RLLconst [c] x)
  7145  	for {
  7146  		_ = v.Args[1]
  7147  		v_0 := v.Args[0]
  7148  		if v_0.Op != OpS390XSRWconst {
  7149  			break
  7150  		}
  7151  		d := v_0.AuxInt
  7152  		x := v_0.Args[0]
  7153  		v_1 := v.Args[1]
  7154  		if v_1.Op != OpS390XSLWconst {
  7155  			break
  7156  		}
  7157  		c := v_1.AuxInt
  7158  		if x != v_1.Args[0] {
  7159  			break
  7160  		}
  7161  		if !(d == 32-c) {
  7162  			break
  7163  		}
  7164  		v.reset(OpS390XRLLconst)
  7165  		v.AuxInt = c
  7166  		v.AddArg(x)
  7167  		return true
  7168  	}
  7169  	// match: (ADDW x (NEGW y))
  7170  	// cond:
  7171  	// result: (SUBW x y)
  7172  	for {
  7173  		_ = v.Args[1]
  7174  		x := v.Args[0]
  7175  		v_1 := v.Args[1]
  7176  		if v_1.Op != OpS390XNEGW {
  7177  			break
  7178  		}
  7179  		y := v_1.Args[0]
  7180  		v.reset(OpS390XSUBW)
  7181  		v.AddArg(x)
  7182  		v.AddArg(y)
  7183  		return true
  7184  	}
  7185  	// match: (ADDW (NEGW y) x)
  7186  	// cond:
  7187  	// result: (SUBW x y)
  7188  	for {
  7189  		x := v.Args[1]
  7190  		v_0 := v.Args[0]
  7191  		if v_0.Op != OpS390XNEGW {
  7192  			break
  7193  		}
  7194  		y := v_0.Args[0]
  7195  		v.reset(OpS390XSUBW)
  7196  		v.AddArg(x)
  7197  		v.AddArg(y)
  7198  		return true
  7199  	}
  7200  	// match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem))
  7201  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7202  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7203  	for {
  7204  		t := v.Type
  7205  		_ = v.Args[1]
  7206  		x := v.Args[0]
  7207  		g := v.Args[1]
  7208  		if g.Op != OpS390XMOVWload {
  7209  			break
  7210  		}
  7211  		off := g.AuxInt
  7212  		sym := g.Aux
  7213  		mem := g.Args[1]
  7214  		ptr := g.Args[0]
  7215  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7216  			break
  7217  		}
  7218  		v.reset(OpS390XADDWload)
  7219  		v.Type = t
  7220  		v.AuxInt = off
  7221  		v.Aux = sym
  7222  		v.AddArg(x)
  7223  		v.AddArg(ptr)
  7224  		v.AddArg(mem)
  7225  		return true
  7226  	}
  7227  	// match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x)
  7228  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7229  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7230  	for {
  7231  		t := v.Type
  7232  		x := v.Args[1]
  7233  		g := v.Args[0]
  7234  		if g.Op != OpS390XMOVWload {
  7235  			break
  7236  		}
  7237  		off := g.AuxInt
  7238  		sym := g.Aux
  7239  		mem := g.Args[1]
  7240  		ptr := g.Args[0]
  7241  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7242  			break
  7243  		}
  7244  		v.reset(OpS390XADDWload)
  7245  		v.Type = t
  7246  		v.AuxInt = off
  7247  		v.Aux = sym
  7248  		v.AddArg(x)
  7249  		v.AddArg(ptr)
  7250  		v.AddArg(mem)
  7251  		return true
  7252  	}
  7253  	// match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x)
  7254  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7255  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7256  	for {
  7257  		t := v.Type
  7258  		x := v.Args[1]
  7259  		g := v.Args[0]
  7260  		if g.Op != OpS390XMOVWload {
  7261  			break
  7262  		}
  7263  		off := g.AuxInt
  7264  		sym := g.Aux
  7265  		mem := g.Args[1]
  7266  		ptr := g.Args[0]
  7267  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7268  			break
  7269  		}
  7270  		v.reset(OpS390XADDWload)
  7271  		v.Type = t
  7272  		v.AuxInt = off
  7273  		v.Aux = sym
  7274  		v.AddArg(x)
  7275  		v.AddArg(ptr)
  7276  		v.AddArg(mem)
  7277  		return true
  7278  	}
  7279  	// match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem))
  7280  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7281  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7282  	for {
  7283  		t := v.Type
  7284  		_ = v.Args[1]
  7285  		x := v.Args[0]
  7286  		g := v.Args[1]
  7287  		if g.Op != OpS390XMOVWload {
  7288  			break
  7289  		}
  7290  		off := g.AuxInt
  7291  		sym := g.Aux
  7292  		mem := g.Args[1]
  7293  		ptr := g.Args[0]
  7294  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7295  			break
  7296  		}
  7297  		v.reset(OpS390XADDWload)
  7298  		v.Type = t
  7299  		v.AuxInt = off
  7300  		v.Aux = sym
  7301  		v.AddArg(x)
  7302  		v.AddArg(ptr)
  7303  		v.AddArg(mem)
  7304  		return true
  7305  	}
  7306  	return false
  7307  }
  7308  func rewriteValueS390X_OpS390XADDW_10(v *Value) bool {
  7309  	// match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem))
  7310  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7311  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7312  	for {
  7313  		t := v.Type
  7314  		_ = v.Args[1]
  7315  		x := v.Args[0]
  7316  		g := v.Args[1]
  7317  		if g.Op != OpS390XMOVWZload {
  7318  			break
  7319  		}
  7320  		off := g.AuxInt
  7321  		sym := g.Aux
  7322  		mem := g.Args[1]
  7323  		ptr := g.Args[0]
  7324  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7325  			break
  7326  		}
  7327  		v.reset(OpS390XADDWload)
  7328  		v.Type = t
  7329  		v.AuxInt = off
  7330  		v.Aux = sym
  7331  		v.AddArg(x)
  7332  		v.AddArg(ptr)
  7333  		v.AddArg(mem)
  7334  		return true
  7335  	}
  7336  	// match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
  7337  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7338  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7339  	for {
  7340  		t := v.Type
  7341  		x := v.Args[1]
  7342  		g := v.Args[0]
  7343  		if g.Op != OpS390XMOVWZload {
  7344  			break
  7345  		}
  7346  		off := g.AuxInt
  7347  		sym := g.Aux
  7348  		mem := g.Args[1]
  7349  		ptr := g.Args[0]
  7350  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7351  			break
  7352  		}
  7353  		v.reset(OpS390XADDWload)
  7354  		v.Type = t
  7355  		v.AuxInt = off
  7356  		v.Aux = sym
  7357  		v.AddArg(x)
  7358  		v.AddArg(ptr)
  7359  		v.AddArg(mem)
  7360  		return true
  7361  	}
  7362  	// match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
  7363  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7364  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7365  	for {
  7366  		t := v.Type
  7367  		x := v.Args[1]
  7368  		g := v.Args[0]
  7369  		if g.Op != OpS390XMOVWZload {
  7370  			break
  7371  		}
  7372  		off := g.AuxInt
  7373  		sym := g.Aux
  7374  		mem := g.Args[1]
  7375  		ptr := g.Args[0]
  7376  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7377  			break
  7378  		}
  7379  		v.reset(OpS390XADDWload)
  7380  		v.Type = t
  7381  		v.AuxInt = off
  7382  		v.Aux = sym
  7383  		v.AddArg(x)
  7384  		v.AddArg(ptr)
  7385  		v.AddArg(mem)
  7386  		return true
  7387  	}
  7388  	// match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem))
  7389  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7390  	// result: (ADDWload <t> [off] {sym} x ptr mem)
  7391  	for {
  7392  		t := v.Type
  7393  		_ = v.Args[1]
  7394  		x := v.Args[0]
  7395  		g := v.Args[1]
  7396  		if g.Op != OpS390XMOVWZload {
  7397  			break
  7398  		}
  7399  		off := g.AuxInt
  7400  		sym := g.Aux
  7401  		mem := g.Args[1]
  7402  		ptr := g.Args[0]
  7403  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7404  			break
  7405  		}
  7406  		v.reset(OpS390XADDWload)
  7407  		v.Type = t
  7408  		v.AuxInt = off
  7409  		v.Aux = sym
  7410  		v.AddArg(x)
  7411  		v.AddArg(ptr)
  7412  		v.AddArg(mem)
  7413  		return true
  7414  	}
  7415  	return false
  7416  }
  7417  func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool {
  7418  	// match: (ADDWconst [c] x)
  7419  	// cond: int32(c)==0
  7420  	// result: x
  7421  	for {
  7422  		c := v.AuxInt
  7423  		x := v.Args[0]
  7424  		if !(int32(c) == 0) {
  7425  			break
  7426  		}
  7427  		v.reset(OpCopy)
  7428  		v.Type = x.Type
  7429  		v.AddArg(x)
  7430  		return true
  7431  	}
  7432  	// match: (ADDWconst [c] (MOVDconst [d]))
  7433  	// cond:
  7434  	// result: (MOVDconst [int64(int32(c+d))])
  7435  	for {
  7436  		c := v.AuxInt
  7437  		v_0 := v.Args[0]
  7438  		if v_0.Op != OpS390XMOVDconst {
  7439  			break
  7440  		}
  7441  		d := v_0.AuxInt
  7442  		v.reset(OpS390XMOVDconst)
  7443  		v.AuxInt = int64(int32(c + d))
  7444  		return true
  7445  	}
  7446  	// match: (ADDWconst [c] (ADDWconst [d] x))
  7447  	// cond:
  7448  	// result: (ADDWconst [int64(int32(c+d))] x)
  7449  	for {
  7450  		c := v.AuxInt
  7451  		v_0 := v.Args[0]
  7452  		if v_0.Op != OpS390XADDWconst {
  7453  			break
  7454  		}
  7455  		d := v_0.AuxInt
  7456  		x := v_0.Args[0]
  7457  		v.reset(OpS390XADDWconst)
  7458  		v.AuxInt = int64(int32(c + d))
  7459  		v.AddArg(x)
  7460  		return true
  7461  	}
  7462  	return false
  7463  }
  7464  func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool {
  7465  	// match: (ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem)
  7466  	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
  7467  	// result: (ADDWload [off1+off2] {sym} x ptr mem)
  7468  	for {
  7469  		off1 := v.AuxInt
  7470  		sym := v.Aux
  7471  		mem := v.Args[2]
  7472  		x := v.Args[0]
  7473  		v_1 := v.Args[1]
  7474  		if v_1.Op != OpS390XADDconst {
  7475  			break
  7476  		}
  7477  		off2 := v_1.AuxInt
  7478  		ptr := v_1.Args[0]
  7479  		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
  7480  			break
  7481  		}
  7482  		v.reset(OpS390XADDWload)
  7483  		v.AuxInt = off1 + off2
  7484  		v.Aux = sym
  7485  		v.AddArg(x)
  7486  		v.AddArg(ptr)
  7487  		v.AddArg(mem)
  7488  		return true
  7489  	}
  7490  	// match: (ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
  7491  	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
  7492  	// result: (ADDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem)
  7493  	for {
  7494  		o1 := v.AuxInt
  7495  		s1 := v.Aux
  7496  		mem := v.Args[2]
  7497  		x := v.Args[0]
  7498  		v_1 := v.Args[1]
  7499  		if v_1.Op != OpS390XMOVDaddr {
  7500  			break
  7501  		}
  7502  		o2 := v_1.AuxInt
  7503  		s2 := v_1.Aux
  7504  		ptr := v_1.Args[0]
  7505  		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
  7506  			break
  7507  		}
  7508  		v.reset(OpS390XADDWload)
  7509  		v.AuxInt = o1 + o2
  7510  		v.Aux = mergeSym(s1, s2)
  7511  		v.AddArg(x)
  7512  		v.AddArg(ptr)
  7513  		v.AddArg(mem)
  7514  		return true
  7515  	}
  7516  	return false
  7517  }
  7518  func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool {
  7519  	// match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB)))
  7520  	// cond: ((c+d)&1 == 0) && is32Bit(c+d)
  7521  	// result: (MOVDaddr [c+d] {s} x)
  7522  	for {
  7523  		c := v.AuxInt
  7524  		v_0 := v.Args[0]
  7525  		if v_0.Op != OpS390XMOVDaddr {
  7526  			break
  7527  		}
  7528  		d := v_0.AuxInt
  7529  		s := v_0.Aux
  7530  		x := v_0.Args[0]
  7531  		if x.Op != OpSB {
  7532  			break
  7533  		}
  7534  		if !(((c+d)&1 == 0) && is32Bit(c+d)) {
  7535  			break
  7536  		}
  7537  		v.reset(OpS390XMOVDaddr)
  7538  		v.AuxInt = c + d
  7539  		v.Aux = s
  7540  		v.AddArg(x)
  7541  		return true
  7542  	}
  7543  	// match: (ADDconst [c] (MOVDaddr [d] {s} x))
  7544  	// cond: x.Op != OpSB && is20Bit(c+d)
  7545  	// result: (MOVDaddr [c+d] {s} x)
  7546  	for {
  7547  		c := v.AuxInt
  7548  		v_0 := v.Args[0]
  7549  		if v_0.Op != OpS390XMOVDaddr {
  7550  			break
  7551  		}
  7552  		d := v_0.AuxInt
  7553  		s := v_0.Aux
  7554  		x := v_0.Args[0]
  7555  		if !(x.Op != OpSB && is20Bit(c+d)) {
  7556  			break
  7557  		}
  7558  		v.reset(OpS390XMOVDaddr)
  7559  		v.AuxInt = c + d
  7560  		v.Aux = s
  7561  		v.AddArg(x)
  7562  		return true
  7563  	}
  7564  	// match: (ADDconst [c] (MOVDaddridx [d] {s} x y))
  7565  	// cond: is20Bit(c+d)
  7566  	// result: (MOVDaddridx [c+d] {s} x y)
  7567  	for {
  7568  		c := v.AuxInt
  7569  		v_0 := v.Args[0]
  7570  		if v_0.Op != OpS390XMOVDaddridx {
  7571  			break
  7572  		}
  7573  		d := v_0.AuxInt
  7574  		s := v_0.Aux
  7575  		y := v_0.Args[1]
  7576  		x := v_0.Args[0]
  7577  		if !(is20Bit(c + d)) {
  7578  			break
  7579  		}
  7580  		v.reset(OpS390XMOVDaddridx)
  7581  		v.AuxInt = c + d
  7582  		v.Aux = s
  7583  		v.AddArg(x)
  7584  		v.AddArg(y)
  7585  		return true
  7586  	}
  7587  	// match: (ADDconst [0] x)
  7588  	// cond:
  7589  	// result: x
  7590  	for {
  7591  		if v.AuxInt != 0 {
  7592  			break
  7593  		}
  7594  		x := v.Args[0]
  7595  		v.reset(OpCopy)
  7596  		v.Type = x.Type
  7597  		v.AddArg(x)
  7598  		return true
  7599  	}
  7600  	// match: (ADDconst [c] (MOVDconst [d]))
  7601  	// cond:
  7602  	// result: (MOVDconst [c+d])
  7603  	for {
  7604  		c := v.AuxInt
  7605  		v_0 := v.Args[0]
  7606  		if v_0.Op != OpS390XMOVDconst {
  7607  			break
  7608  		}
  7609  		d := v_0.AuxInt
  7610  		v.reset(OpS390XMOVDconst)
  7611  		v.AuxInt = c + d
  7612  		return true
  7613  	}
  7614  	// match: (ADDconst [c] (ADDconst [d] x))
  7615  	// cond: is32Bit(c+d)
  7616  	// result: (ADDconst [c+d] x)
  7617  	for {
  7618  		c := v.AuxInt
  7619  		v_0 := v.Args[0]
  7620  		if v_0.Op != OpS390XADDconst {
  7621  			break
  7622  		}
  7623  		d := v_0.AuxInt
  7624  		x := v_0.Args[0]
  7625  		if !(is32Bit(c + d)) {
  7626  			break
  7627  		}
  7628  		v.reset(OpS390XADDconst)
  7629  		v.AuxInt = c + d
  7630  		v.AddArg(x)
  7631  		return true
  7632  	}
  7633  	return false
  7634  }
  7635  func rewriteValueS390X_OpS390XADDload_0(v *Value) bool {
  7636  	b := v.Block
  7637  	// match: (ADDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
  7638  	// cond: isSamePtr(ptr1, ptr2)
  7639  	// result: (ADD x (LGDR <t> y))
  7640  	for {
  7641  		t := v.Type
  7642  		off := v.AuxInt
  7643  		sym := v.Aux
  7644  		_ = v.Args[2]
  7645  		x := v.Args[0]
  7646  		ptr1 := v.Args[1]
  7647  		v_2 := v.Args[2]
  7648  		if v_2.Op != OpS390XFMOVDstore {
  7649  			break
  7650  		}
  7651  		if v_2.AuxInt != off {
  7652  			break
  7653  		}
  7654  		if v_2.Aux != sym {
  7655  			break
  7656  		}
  7657  		_ = v_2.Args[2]
  7658  		ptr2 := v_2.Args[0]
  7659  		y := v_2.Args[1]
  7660  		if !(isSamePtr(ptr1, ptr2)) {
  7661  			break
  7662  		}
  7663  		v.reset(OpS390XADD)
  7664  		v.AddArg(x)
  7665  		v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t)
  7666  		v0.AddArg(y)
  7667  		v.AddArg(v0)
  7668  		return true
  7669  	}
  7670  	// match: (ADDload [off1] {sym} x (ADDconst [off2] ptr) mem)
  7671  	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
  7672  	// result: (ADDload [off1+off2] {sym} x ptr mem)
  7673  	for {
  7674  		off1 := v.AuxInt
  7675  		sym := v.Aux
  7676  		mem := v.Args[2]
  7677  		x := v.Args[0]
  7678  		v_1 := v.Args[1]
  7679  		if v_1.Op != OpS390XADDconst {
  7680  			break
  7681  		}
  7682  		off2 := v_1.AuxInt
  7683  		ptr := v_1.Args[0]
  7684  		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
  7685  			break
  7686  		}
  7687  		v.reset(OpS390XADDload)
  7688  		v.AuxInt = off1 + off2
  7689  		v.Aux = sym
  7690  		v.AddArg(x)
  7691  		v.AddArg(ptr)
  7692  		v.AddArg(mem)
  7693  		return true
  7694  	}
  7695  	// match: (ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
  7696  	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
  7697  	// result: (ADDload [o1+o2] {mergeSym(s1, s2)} x ptr mem)
  7698  	for {
  7699  		o1 := v.AuxInt
  7700  		s1 := v.Aux
  7701  		mem := v.Args[2]
  7702  		x := v.Args[0]
  7703  		v_1 := v.Args[1]
  7704  		if v_1.Op != OpS390XMOVDaddr {
  7705  			break
  7706  		}
  7707  		o2 := v_1.AuxInt
  7708  		s2 := v_1.Aux
  7709  		ptr := v_1.Args[0]
  7710  		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
  7711  			break
  7712  		}
  7713  		v.reset(OpS390XADDload)
  7714  		v.AuxInt = o1 + o2
  7715  		v.Aux = mergeSym(s1, s2)
  7716  		v.AddArg(x)
  7717  		v.AddArg(ptr)
  7718  		v.AddArg(mem)
  7719  		return true
  7720  	}
  7721  	return false
  7722  }
  7723  func rewriteValueS390X_OpS390XAND_0(v *Value) bool {
  7724  	b := v.Block
  7725  	typ := &b.Func.Config.Types
  7726  	// match: (AND x (MOVDconst [c]))
  7727  	// cond: is32Bit(c) && c < 0
  7728  	// result: (ANDconst [c] x)
  7729  	for {
  7730  		_ = v.Args[1]
  7731  		x := v.Args[0]
  7732  		v_1 := v.Args[1]
  7733  		if v_1.Op != OpS390XMOVDconst {
  7734  			break
  7735  		}
  7736  		c := v_1.AuxInt
  7737  		if !(is32Bit(c) && c < 0) {
  7738  			break
  7739  		}
  7740  		v.reset(OpS390XANDconst)
  7741  		v.AuxInt = c
  7742  		v.AddArg(x)
  7743  		return true
  7744  	}
  7745  	// match: (AND (MOVDconst [c]) x)
  7746  	// cond: is32Bit(c) && c < 0
  7747  	// result: (ANDconst [c] x)
  7748  	for {
  7749  		x := v.Args[1]
  7750  		v_0 := v.Args[0]
  7751  		if v_0.Op != OpS390XMOVDconst {
  7752  			break
  7753  		}
  7754  		c := v_0.AuxInt
  7755  		if !(is32Bit(c) && c < 0) {
  7756  			break
  7757  		}
  7758  		v.reset(OpS390XANDconst)
  7759  		v.AuxInt = c
  7760  		v.AddArg(x)
  7761  		return true
  7762  	}
  7763  	// match: (AND x (MOVDconst [c]))
  7764  	// cond: is32Bit(c) && c >= 0
  7765  	// result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(int32(c))] x))
  7766  	for {
  7767  		_ = v.Args[1]
  7768  		x := v.Args[0]
  7769  		v_1 := v.Args[1]
  7770  		if v_1.Op != OpS390XMOVDconst {
  7771  			break
  7772  		}
  7773  		c := v_1.AuxInt
  7774  		if !(is32Bit(c) && c >= 0) {
  7775  			break
  7776  		}
  7777  		v.reset(OpS390XMOVWZreg)
  7778  		v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32)
  7779  		v0.AuxInt = int64(int32(c))
  7780  		v0.AddArg(x)
  7781  		v.AddArg(v0)
  7782  		return true
  7783  	}
  7784  	// match: (AND (MOVDconst [c]) x)
  7785  	// cond: is32Bit(c) && c >= 0
  7786  	// result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(int32(c))] x))
  7787  	for {
  7788  		x := v.Args[1]
  7789  		v_0 := v.Args[0]
  7790  		if v_0.Op != OpS390XMOVDconst {
  7791  			break
  7792  		}
  7793  		c := v_0.AuxInt
  7794  		if !(is32Bit(c) && c >= 0) {
  7795  			break
  7796  		}
  7797  		v.reset(OpS390XMOVWZreg)
  7798  		v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32)
  7799  		v0.AuxInt = int64(int32(c))
  7800  		v0.AddArg(x)
  7801  		v.AddArg(v0)
  7802  		return true
  7803  	}
  7804  	// match: (AND x (MOVDconst [0xFF]))
  7805  	// cond:
  7806  	// result: (MOVBZreg x)
  7807  	for {
  7808  		_ = v.Args[1]
  7809  		x := v.Args[0]
  7810  		v_1 := v.Args[1]
  7811  		if v_1.Op != OpS390XMOVDconst {
  7812  			break
  7813  		}
  7814  		if v_1.AuxInt != 0xFF {
  7815  			break
  7816  		}
  7817  		v.reset(OpS390XMOVBZreg)
  7818  		v.AddArg(x)
  7819  		return true
  7820  	}
  7821  	// match: (AND (MOVDconst [0xFF]) x)
  7822  	// cond:
  7823  	// result: (MOVBZreg x)
  7824  	for {
  7825  		x := v.Args[1]
  7826  		v_0 := v.Args[0]
  7827  		if v_0.Op != OpS390XMOVDconst {
  7828  			break
  7829  		}
  7830  		if v_0.AuxInt != 0xFF {
  7831  			break
  7832  		}
  7833  		v.reset(OpS390XMOVBZreg)
  7834  		v.AddArg(x)
  7835  		return true
  7836  	}
  7837  	// match: (AND x (MOVDconst [0xFFFF]))
  7838  	// cond:
  7839  	// result: (MOVHZreg x)
  7840  	for {
  7841  		_ = v.Args[1]
  7842  		x := v.Args[0]
  7843  		v_1 := v.Args[1]
  7844  		if v_1.Op != OpS390XMOVDconst {
  7845  			break
  7846  		}
  7847  		if v_1.AuxInt != 0xFFFF {
  7848  			break
  7849  		}
  7850  		v.reset(OpS390XMOVHZreg)
  7851  		v.AddArg(x)
  7852  		return true
  7853  	}
  7854  	// match: (AND (MOVDconst [0xFFFF]) x)
  7855  	// cond:
  7856  	// result: (MOVHZreg x)
  7857  	for {
  7858  		x := v.Args[1]
  7859  		v_0 := v.Args[0]
  7860  		if v_0.Op != OpS390XMOVDconst {
  7861  			break
  7862  		}
  7863  		if v_0.AuxInt != 0xFFFF {
  7864  			break
  7865  		}
  7866  		v.reset(OpS390XMOVHZreg)
  7867  		v.AddArg(x)
  7868  		return true
  7869  	}
  7870  	// match: (AND x (MOVDconst [0xFFFFFFFF]))
  7871  	// cond:
  7872  	// result: (MOVWZreg x)
  7873  	for {
  7874  		_ = v.Args[1]
  7875  		x := v.Args[0]
  7876  		v_1 := v.Args[1]
  7877  		if v_1.Op != OpS390XMOVDconst {
  7878  			break
  7879  		}
  7880  		if v_1.AuxInt != 0xFFFFFFFF {
  7881  			break
  7882  		}
  7883  		v.reset(OpS390XMOVWZreg)
  7884  		v.AddArg(x)
  7885  		return true
  7886  	}
  7887  	// match: (AND (MOVDconst [0xFFFFFFFF]) x)
  7888  	// cond:
  7889  	// result: (MOVWZreg x)
  7890  	for {
  7891  		x := v.Args[1]
  7892  		v_0 := v.Args[0]
  7893  		if v_0.Op != OpS390XMOVDconst {
  7894  			break
  7895  		}
  7896  		if v_0.AuxInt != 0xFFFFFFFF {
  7897  			break
  7898  		}
  7899  		v.reset(OpS390XMOVWZreg)
  7900  		v.AddArg(x)
  7901  		return true
  7902  	}
  7903  	return false
  7904  }
  7905  func rewriteValueS390X_OpS390XAND_10(v *Value) bool {
  7906  	// match: (AND (MOVDconst [c]) (MOVDconst [d]))
  7907  	// cond:
  7908  	// result: (MOVDconst [c&d])
  7909  	for {
  7910  		_ = v.Args[1]
  7911  		v_0 := v.Args[0]
  7912  		if v_0.Op != OpS390XMOVDconst {
  7913  			break
  7914  		}
  7915  		c := v_0.AuxInt
  7916  		v_1 := v.Args[1]
  7917  		if v_1.Op != OpS390XMOVDconst {
  7918  			break
  7919  		}
  7920  		d := v_1.AuxInt
  7921  		v.reset(OpS390XMOVDconst)
  7922  		v.AuxInt = c & d
  7923  		return true
  7924  	}
  7925  	// match: (AND (MOVDconst [d]) (MOVDconst [c]))
  7926  	// cond:
  7927  	// result: (MOVDconst [c&d])
  7928  	for {
  7929  		_ = v.Args[1]
  7930  		v_0 := v.Args[0]
  7931  		if v_0.Op != OpS390XMOVDconst {
  7932  			break
  7933  		}
  7934  		d := v_0.AuxInt
  7935  		v_1 := v.Args[1]
  7936  		if v_1.Op != OpS390XMOVDconst {
  7937  			break
  7938  		}
  7939  		c := v_1.AuxInt
  7940  		v.reset(OpS390XMOVDconst)
  7941  		v.AuxInt = c & d
  7942  		return true
  7943  	}
  7944  	// match: (AND x x)
  7945  	// cond:
  7946  	// result: x
  7947  	for {
  7948  		x := v.Args[1]
  7949  		if x != v.Args[0] {
  7950  			break
  7951  		}
  7952  		v.reset(OpCopy)
  7953  		v.Type = x.Type
  7954  		v.AddArg(x)
  7955  		return true
  7956  	}
  7957  	// match: (AND <t> x g:(MOVDload [off] {sym} ptr mem))
  7958  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7959  	// result: (ANDload <t> [off] {sym} x ptr mem)
  7960  	for {
  7961  		t := v.Type
  7962  		_ = v.Args[1]
  7963  		x := v.Args[0]
  7964  		g := v.Args[1]
  7965  		if g.Op != OpS390XMOVDload {
  7966  			break
  7967  		}
  7968  		off := g.AuxInt
  7969  		sym := g.Aux
  7970  		mem := g.Args[1]
  7971  		ptr := g.Args[0]
  7972  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7973  			break
  7974  		}
  7975  		v.reset(OpS390XANDload)
  7976  		v.Type = t
  7977  		v.AuxInt = off
  7978  		v.Aux = sym
  7979  		v.AddArg(x)
  7980  		v.AddArg(ptr)
  7981  		v.AddArg(mem)
  7982  		return true
  7983  	}
  7984  	// match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x)
  7985  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  7986  	// result: (ANDload <t> [off] {sym} x ptr mem)
  7987  	for {
  7988  		t := v.Type
  7989  		x := v.Args[1]
  7990  		g := v.Args[0]
  7991  		if g.Op != OpS390XMOVDload {
  7992  			break
  7993  		}
  7994  		off := g.AuxInt
  7995  		sym := g.Aux
  7996  		mem := g.Args[1]
  7997  		ptr := g.Args[0]
  7998  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  7999  			break
  8000  		}
  8001  		v.reset(OpS390XANDload)
  8002  		v.Type = t
  8003  		v.AuxInt = off
  8004  		v.Aux = sym
  8005  		v.AddArg(x)
  8006  		v.AddArg(ptr)
  8007  		v.AddArg(mem)
  8008  		return true
  8009  	}
  8010  	// match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x)
  8011  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8012  	// result: (ANDload <t> [off] {sym} x ptr mem)
  8013  	for {
  8014  		t := v.Type
  8015  		x := v.Args[1]
  8016  		g := v.Args[0]
  8017  		if g.Op != OpS390XMOVDload {
  8018  			break
  8019  		}
  8020  		off := g.AuxInt
  8021  		sym := g.Aux
  8022  		mem := g.Args[1]
  8023  		ptr := g.Args[0]
  8024  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8025  			break
  8026  		}
  8027  		v.reset(OpS390XANDload)
  8028  		v.Type = t
  8029  		v.AuxInt = off
  8030  		v.Aux = sym
  8031  		v.AddArg(x)
  8032  		v.AddArg(ptr)
  8033  		v.AddArg(mem)
  8034  		return true
  8035  	}
  8036  	// match: (AND <t> x g:(MOVDload [off] {sym} ptr mem))
  8037  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8038  	// result: (ANDload <t> [off] {sym} x ptr mem)
  8039  	for {
  8040  		t := v.Type
  8041  		_ = v.Args[1]
  8042  		x := v.Args[0]
  8043  		g := v.Args[1]
  8044  		if g.Op != OpS390XMOVDload {
  8045  			break
  8046  		}
  8047  		off := g.AuxInt
  8048  		sym := g.Aux
  8049  		mem := g.Args[1]
  8050  		ptr := g.Args[0]
  8051  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8052  			break
  8053  		}
  8054  		v.reset(OpS390XANDload)
  8055  		v.Type = t
  8056  		v.AuxInt = off
  8057  		v.Aux = sym
  8058  		v.AddArg(x)
  8059  		v.AddArg(ptr)
  8060  		v.AddArg(mem)
  8061  		return true
  8062  	}
  8063  	return false
  8064  }
  8065  func rewriteValueS390X_OpS390XANDW_0(v *Value) bool {
  8066  	// match: (ANDW x (MOVDconst [c]))
  8067  	// cond:
  8068  	// result: (ANDWconst [int64(int32(c))] x)
  8069  	for {
  8070  		_ = v.Args[1]
  8071  		x := v.Args[0]
  8072  		v_1 := v.Args[1]
  8073  		if v_1.Op != OpS390XMOVDconst {
  8074  			break
  8075  		}
  8076  		c := v_1.AuxInt
  8077  		v.reset(OpS390XANDWconst)
  8078  		v.AuxInt = int64(int32(c))
  8079  		v.AddArg(x)
  8080  		return true
  8081  	}
  8082  	// match: (ANDW (MOVDconst [c]) x)
  8083  	// cond:
  8084  	// result: (ANDWconst [int64(int32(c))] x)
  8085  	for {
  8086  		x := v.Args[1]
  8087  		v_0 := v.Args[0]
  8088  		if v_0.Op != OpS390XMOVDconst {
  8089  			break
  8090  		}
  8091  		c := v_0.AuxInt
  8092  		v.reset(OpS390XANDWconst)
  8093  		v.AuxInt = int64(int32(c))
  8094  		v.AddArg(x)
  8095  		return true
  8096  	}
  8097  	// match: (ANDW x x)
  8098  	// cond:
  8099  	// result: x
  8100  	for {
  8101  		x := v.Args[1]
  8102  		if x != v.Args[0] {
  8103  			break
  8104  		}
  8105  		v.reset(OpCopy)
  8106  		v.Type = x.Type
  8107  		v.AddArg(x)
  8108  		return true
  8109  	}
  8110  	// match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem))
  8111  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8112  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8113  	for {
  8114  		t := v.Type
  8115  		_ = v.Args[1]
  8116  		x := v.Args[0]
  8117  		g := v.Args[1]
  8118  		if g.Op != OpS390XMOVWload {
  8119  			break
  8120  		}
  8121  		off := g.AuxInt
  8122  		sym := g.Aux
  8123  		mem := g.Args[1]
  8124  		ptr := g.Args[0]
  8125  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8126  			break
  8127  		}
  8128  		v.reset(OpS390XANDWload)
  8129  		v.Type = t
  8130  		v.AuxInt = off
  8131  		v.Aux = sym
  8132  		v.AddArg(x)
  8133  		v.AddArg(ptr)
  8134  		v.AddArg(mem)
  8135  		return true
  8136  	}
  8137  	// match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x)
  8138  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8139  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8140  	for {
  8141  		t := v.Type
  8142  		x := v.Args[1]
  8143  		g := v.Args[0]
  8144  		if g.Op != OpS390XMOVWload {
  8145  			break
  8146  		}
  8147  		off := g.AuxInt
  8148  		sym := g.Aux
  8149  		mem := g.Args[1]
  8150  		ptr := g.Args[0]
  8151  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8152  			break
  8153  		}
  8154  		v.reset(OpS390XANDWload)
  8155  		v.Type = t
  8156  		v.AuxInt = off
  8157  		v.Aux = sym
  8158  		v.AddArg(x)
  8159  		v.AddArg(ptr)
  8160  		v.AddArg(mem)
  8161  		return true
  8162  	}
  8163  	// match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x)
  8164  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8165  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8166  	for {
  8167  		t := v.Type
  8168  		x := v.Args[1]
  8169  		g := v.Args[0]
  8170  		if g.Op != OpS390XMOVWload {
  8171  			break
  8172  		}
  8173  		off := g.AuxInt
  8174  		sym := g.Aux
  8175  		mem := g.Args[1]
  8176  		ptr := g.Args[0]
  8177  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8178  			break
  8179  		}
  8180  		v.reset(OpS390XANDWload)
  8181  		v.Type = t
  8182  		v.AuxInt = off
  8183  		v.Aux = sym
  8184  		v.AddArg(x)
  8185  		v.AddArg(ptr)
  8186  		v.AddArg(mem)
  8187  		return true
  8188  	}
  8189  	// match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem))
  8190  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8191  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8192  	for {
  8193  		t := v.Type
  8194  		_ = v.Args[1]
  8195  		x := v.Args[0]
  8196  		g := v.Args[1]
  8197  		if g.Op != OpS390XMOVWload {
  8198  			break
  8199  		}
  8200  		off := g.AuxInt
  8201  		sym := g.Aux
  8202  		mem := g.Args[1]
  8203  		ptr := g.Args[0]
  8204  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8205  			break
  8206  		}
  8207  		v.reset(OpS390XANDWload)
  8208  		v.Type = t
  8209  		v.AuxInt = off
  8210  		v.Aux = sym
  8211  		v.AddArg(x)
  8212  		v.AddArg(ptr)
  8213  		v.AddArg(mem)
  8214  		return true
  8215  	}
  8216  	// match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem))
  8217  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8218  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8219  	for {
  8220  		t := v.Type
  8221  		_ = v.Args[1]
  8222  		x := v.Args[0]
  8223  		g := v.Args[1]
  8224  		if g.Op != OpS390XMOVWZload {
  8225  			break
  8226  		}
  8227  		off := g.AuxInt
  8228  		sym := g.Aux
  8229  		mem := g.Args[1]
  8230  		ptr := g.Args[0]
  8231  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8232  			break
  8233  		}
  8234  		v.reset(OpS390XANDWload)
  8235  		v.Type = t
  8236  		v.AuxInt = off
  8237  		v.Aux = sym
  8238  		v.AddArg(x)
  8239  		v.AddArg(ptr)
  8240  		v.AddArg(mem)
  8241  		return true
  8242  	}
  8243  	// match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
  8244  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8245  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8246  	for {
  8247  		t := v.Type
  8248  		x := v.Args[1]
  8249  		g := v.Args[0]
  8250  		if g.Op != OpS390XMOVWZload {
  8251  			break
  8252  		}
  8253  		off := g.AuxInt
  8254  		sym := g.Aux
  8255  		mem := g.Args[1]
  8256  		ptr := g.Args[0]
  8257  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8258  			break
  8259  		}
  8260  		v.reset(OpS390XANDWload)
  8261  		v.Type = t
  8262  		v.AuxInt = off
  8263  		v.Aux = sym
  8264  		v.AddArg(x)
  8265  		v.AddArg(ptr)
  8266  		v.AddArg(mem)
  8267  		return true
  8268  	}
  8269  	// match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x)
  8270  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8271  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8272  	for {
  8273  		t := v.Type
  8274  		x := v.Args[1]
  8275  		g := v.Args[0]
  8276  		if g.Op != OpS390XMOVWZload {
  8277  			break
  8278  		}
  8279  		off := g.AuxInt
  8280  		sym := g.Aux
  8281  		mem := g.Args[1]
  8282  		ptr := g.Args[0]
  8283  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8284  			break
  8285  		}
  8286  		v.reset(OpS390XANDWload)
  8287  		v.Type = t
  8288  		v.AuxInt = off
  8289  		v.Aux = sym
  8290  		v.AddArg(x)
  8291  		v.AddArg(ptr)
  8292  		v.AddArg(mem)
  8293  		return true
  8294  	}
  8295  	return false
  8296  }
  8297  func rewriteValueS390X_OpS390XANDW_10(v *Value) bool {
  8298  	// match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem))
  8299  	// cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)
  8300  	// result: (ANDWload <t> [off] {sym} x ptr mem)
  8301  	for {
  8302  		t := v.Type
  8303  		_ = v.Args[1]
  8304  		x := v.Args[0]
  8305  		g := v.Args[1]
  8306  		if g.Op != OpS390XMOVWZload {
  8307  			break
  8308  		}
  8309  		off := g.AuxInt
  8310  		sym := g.Aux
  8311  		mem := g.Args[1]
  8312  		ptr := g.Args[0]
  8313  		if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) {
  8314  			break
  8315  		}
  8316  		v.reset(OpS390XANDWload)
  8317  		v.Type = t
  8318  		v.AuxInt = off
  8319  		v.Aux = sym
  8320  		v.AddArg(x)
  8321  		v.AddArg(ptr)
  8322  		v.AddArg(mem)
  8323  		return true
  8324  	}
  8325  	return false
  8326  }
  8327  func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool {
  8328  	// match: (ANDWconst [c] (ANDWconst [d] x))
  8329  	// cond:
  8330  	// result: (ANDWconst [c & d] x)
  8331  	for {
  8332  		c := v.AuxInt
  8333  		v_0 := v.Args[0]
  8334  		if v_0.Op != OpS390XANDWconst {
  8335  			break
  8336  		}
  8337  		d := v_0.AuxInt
  8338  		x := v_0.Args[0]
  8339  		v.reset(OpS390XANDWconst)
  8340  		v.AuxInt = c & d
  8341  		v.AddArg(x)
  8342  		return true
  8343  	}
  8344  	// match: (ANDWconst [0xFF] x)
  8345  	// cond:
  8346  	// result: (MOVBZreg x)
  8347  	for {
  8348  		if v.AuxInt != 0xFF {
  8349  			break
  8350  		}
  8351  		x := v.Args[0]
  8352  		v.reset(OpS390XMOVBZreg)
  8353  		v.AddArg(x)
  8354  		return true
  8355  	}
  8356  	// match: (ANDWconst [0xFFFF] x)
  8357  	// cond:
  8358  	// result: (MOVHZreg x)
  8359  	for {
  8360  		if v.AuxInt != 0xFFFF {
  8361  			break
  8362  		}
  8363  		x := v.Args[0]
  8364  		v.reset(OpS390XMOVHZreg)
  8365  		v.AddArg(x)
  8366  		return true
  8367  	}
  8368  	// match: (ANDWconst [c] _)
  8369  	// cond: int32(c)==0
  8370  	// result: (MOVDconst [0])
  8371  	for {
  8372  		c := v.AuxInt
  8373  		if !(int32(c) == 0) {
  8374  			break
  8375  		}
  8376  		v.reset(OpS390XMOVDconst)
  8377  		v.AuxInt = 0
  8378  		return true
  8379  	}
  8380  	// match: (ANDWconst [c] x)
  8381  	// cond: int32(c)==-1
  8382  	// result: x
  8383  	for {
  8384  		c := v.AuxInt
  8385  		x := v.Args[0]
  8386  		if !(int32(c) == -1) {
  8387  			break
  8388  		}
  8389  		v.reset(OpCopy)
  8390  		v.Type = x.Type
  8391  		v.AddArg(x)
  8392  		return true
  8393  	}
  8394  	// match: (ANDWconst [c] (MOVDconst [d]))
  8395  	// cond:
  8396  	// result: (MOVDconst [c&d])
  8397  	for {
  8398  		c := v.AuxInt
  8399  		v_0 := v.Args[0]
  8400  		if v_0.Op != OpS390XMOVDconst {
  8401  			break
  8402  		}
  8403  		d := v_0.AuxInt
  8404  		v.reset(OpS390XMOVDconst)
  8405  		v.AuxInt = c & d
  8406  		return true
  8407  	}
  8408  	return false
  8409  }
  8410  func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool {
  8411  	// match: (ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem)
  8412  	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
  8413  	// result: (ANDWload [off1+off2] {sym} x ptr mem)
  8414  	for {
  8415  		off1 := v.AuxInt
  8416  		sym := v.Aux
  8417  		mem := v.Args[2]
  8418  		x := v.Args[0]
  8419  		v_1 := v.Args[1]
  8420  		if v_1.Op != OpS390XADDconst {
  8421  			break
  8422  		}
  8423  		off2 := v_1.AuxInt
  8424  		ptr := v_1.Args[0]
  8425  		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
  8426  			break
  8427  		}
  8428  		v.reset(OpS390XANDWload)
  8429  		v.AuxInt = off1 + off2
  8430  		v.Aux = sym
  8431  		v.AddArg(x)
  8432  		v.AddArg(ptr)
  8433  		v.AddArg(mem)
  8434  		return true
  8435  	}
  8436  	// match: (ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
  8437  	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
  8438  	// result: (ANDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem)
  8439  	for {
  8440  		o1 := v.AuxInt
  8441  		s1 := v.Aux
  8442  		mem := v.Args[2]
  8443  		x := v.Args[0]
  8444  		v_1 := v.Args[1]
  8445  		if v_1.Op != OpS390XMOVDaddr {
  8446  			break
  8447  		}
  8448  		o2 := v_1.AuxInt
  8449  		s2 := v_1.Aux
  8450  		ptr := v_1.Args[0]
  8451  		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
  8452  			break
  8453  		}
  8454  		v.reset(OpS390XANDWload)
  8455  		v.AuxInt = o1 + o2
  8456  		v.Aux = mergeSym(s1, s2)
  8457  		v.AddArg(x)
  8458  		v.AddArg(ptr)
  8459  		v.AddArg(mem)
  8460  		return true
  8461  	}
  8462  	return false
  8463  }
  8464  func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool {
  8465  	// match: (ANDconst [c] (ANDconst [d] x))
  8466  	// cond:
  8467  	// result: (ANDconst [c & d] x)
  8468  	for {
  8469  		c := v.AuxInt
  8470  		v_0 := v.Args[0]
  8471  		if v_0.Op != OpS390XANDconst {
  8472  			break
  8473  		}
  8474  		d := v_0.AuxInt
  8475  		x := v_0.Args[0]
  8476  		v.reset(OpS390XANDconst)
  8477  		v.AuxInt = c & d
  8478  		v.AddArg(x)
  8479  		return true
  8480  	}
  8481  	// match: (ANDconst [0] _)
  8482  	// cond:
  8483  	// result: (MOVDconst [0])
  8484  	for {
  8485  		if v.AuxInt != 0 {
  8486  			break
  8487  		}
  8488  		v.reset(OpS390XMOVDconst)
  8489  		v.AuxInt = 0
  8490  		return true
  8491  	}
  8492  	// match: (ANDconst [-1] x)
  8493  	// cond:
  8494  	// result: x
  8495  	for {
  8496  		if v.AuxInt != -1 {
  8497  			break
  8498  		}
  8499  		x := v.Args[0]
  8500  		v.reset(OpCopy)
  8501  		v.Type = x.Type
  8502  		v.AddArg(x)
  8503  		return true
  8504  	}
  8505  	// match: (ANDconst [c] (MOVDconst [d]))
  8506  	// cond:
  8507  	// result: (MOVDconst [c&d])
  8508  	for {
  8509  		c := v.AuxInt
  8510  		v_0 := v.Args[0]
  8511  		if v_0.Op != OpS390XMOVDconst {
  8512  			break
  8513  		}
  8514  		d := v_0.AuxInt
  8515  		v.reset(OpS390XMOVDconst)
  8516  		v.AuxInt = c & d
  8517  		return true
  8518  	}
  8519  	return false
  8520  }
  8521  func rewriteValueS390X_OpS390XANDload_0(v *Value) bool {
  8522  	b := v.Block
  8523  	// match: (ANDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _))
  8524  	// cond: isSamePtr(ptr1, ptr2)
  8525  	// result: (AND x (LGDR <t> y))
  8526  	for {
  8527  		t := v.Type
  8528  		off := v.AuxInt
  8529  		sym := v.Aux
  8530  		_ = v.Args[2]
  8531  		x := v.Args[0]
  8532  		ptr1 := v.Args[1]
  8533  		v_2 := v.Args[2]
  8534  		if v_2.Op != OpS390XFMOVDstore {
  8535  			break
  8536  		}
  8537  		if v_2.AuxInt != off {
  8538  			break
  8539  		}
  8540  		if v_2.Aux != sym {
  8541  			break
  8542  		}
  8543  		_ = v_2.Args[2]
  8544  		ptr2 := v_2.Args[0]
  8545  		y := v_2.Args[1]
  8546  		if !(isSamePtr(ptr1, ptr2)) {
  8547  			break
  8548  		}
  8549  		v.reset(OpS390XAND)
  8550  		v.AddArg(x)
  8551  		v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t)
  8552  		v0.AddArg(y)
  8553  		v.AddArg(v0)
  8554  		return true
  8555  	}
  8556  	// match: (ANDload [off1] {sym} x (ADDconst [off2] ptr) mem)
  8557  	// cond: ptr.Op != OpSB && is20Bit(off1+off2)
  8558  	// result: (ANDload [off1+off2] {sym} x ptr mem)
  8559  	for {
  8560  		off1 := v.AuxInt
  8561  		sym := v.Aux
  8562  		mem := v.Args[2]
  8563  		x := v.Args[0]
  8564  		v_1 := v.Args[1]
  8565  		if v_1.Op != OpS390XADDconst {
  8566  			break
  8567  		}
  8568  		off2 := v_1.AuxInt
  8569  		ptr := v_1.Args[0]
  8570  		if !(ptr.Op != OpSB && is20Bit(off1+off2)) {
  8571  			break
  8572  		}
  8573  		v.reset(OpS390XANDload)
  8574  		v.AuxInt = off1 + off2
  8575  		v.Aux = sym
  8576  		v.AddArg(x)
  8577  		v.AddArg(ptr)
  8578  		v.AddArg(mem)
  8579  		return true
  8580  	}
  8581  	// match: (ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem)
  8582  	// cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)
  8583  	// result: (ANDload [o1+o2] {mergeSym(s1, s2)} x ptr mem)
  8584  	for {
  8585  		o1 := v.AuxInt
  8586  		s1 := v.Aux
  8587  		mem := v.Args[2]
  8588  		x := v.Args[0]
  8589  		v_1 := v.Args[1]
  8590  		if v_1.Op != OpS390XMOVDaddr {
  8591  			break
  8592  		}
  8593  		o2 := v_1.AuxInt
  8594  		s2 := v_1.Aux
  8595  		ptr := v_1.Args[0]
  8596  		if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) {
  8597  			break
  8598  		}
  8599  		v.reset(OpS390XANDload)
  8600  		v.AuxInt = o1 + o2
  8601  		v.Aux = mergeSym(s1, s2)
  8602  		v.AddArg(x)
  8603  		v.AddArg(ptr)
  8604  		v.AddArg(mem)
  8605  		return true
  8606  	}
  8607  	return false
  8608  }
  8609  func rewriteValueS390X_OpS390XCMP_0(v *Value) bool {
  8610  	b := v.Block
  8611  	// match: (CMP x (MOVDconst [c]))
  8612  	// cond: is32Bit(c)
  8613  	// result: (CMPconst x [c])
  8614  	for {
  8615  		_ = v.Args[1]
  8616  		x := v.Args[0]
  8617  		v_1 := v.Args[1]
  8618  		if v_1.Op != OpS390XMOVDconst {
  8619  			break
  8620  		}
  8621  		c := v_1.AuxInt
  8622  		if !(is32Bit(c)) {
  8623  			break
  8624  		}
  8625  		v.reset(OpS390XCMPconst)
  8626  		v.AuxInt = c
  8627  		v.AddArg(x)
  8628  		return true
  8629  	}
  8630  	// match: (CMP (MOVDconst [c]) x)
  8631  	// cond: is32Bit(c)
  8632  	// result: (InvertFlags (CMPconst x [c]))
  8633  	for {
  8634  		x := v.Args[1]
  8635  		v_0 := v.Args[0]
  8636  		if v_0.Op != OpS390XMOVDconst {
  8637  			break
  8638  		}
  8639  		c := v_0.AuxInt
  8640  		if !(is32Bit(c)) {
  8641  			break
  8642  		}
  8643  		v.reset(OpS390XInvertFlags)
  8644  		v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags)
  8645  		v0.AuxInt = c
  8646  		v0.AddArg(x)
  8647  		v.AddArg(v0)
  8648  		return true
  8649  	}
  8650  	return false
  8651  }
  8652  func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool {
  8653  	b := v.Block
  8654  	// match: (CMPU x (MOVDconst [c]))
  8655  	// cond: isU32Bit(c)
  8656  	// result: (CMPUconst x [int64(int32(c))])
  8657  	for {
  8658  		_ = v.Args[1]
  8659  		x := v.Args[0]
  8660  		v_1 := v.Args[1]
  8661  		if v_1.Op != OpS390XMOVDconst {
  8662  			break
  8663  		}
  8664  		c := v_1.AuxInt
  8665  		if !(isU32Bit(c)) {
  8666  			break
  8667  		}
  8668  		v.reset(OpS390XCMPUconst)
  8669  		v.AuxInt = int64(int32(c))
  8670  		v.AddArg(x)
  8671  		return true
  8672  	}
  8673  	// match: (CMPU (MOVDconst [c]) x)
  8674  	// cond: isU32Bit(c)
  8675  	// result: (InvertFlags (CMPUconst x [int64(int32(c))]))
  8676  	for {
  8677  		x := v.Args[1]
  8678  		v_0 := v.Args[0]
  8679  		if v_0.Op != OpS390XMOVDconst {
  8680  			break
  8681  		}
  8682  		c := v_0.AuxInt
  8683  		if !(isU32Bit(c)) {
  8684  			break
  8685  		}
  8686  		v.reset(OpS390XInvertFlags)
  8687  		v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags)
  8688  		v0.AuxInt = int64(int32(c))
  8689  		v0.AddArg(x)
  8690  		v.AddArg(v0)
  8691  		return true
  8692  	}
  8693  	return false
  8694  }
  8695  func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool {
  8696  	// match: (CMPUconst (MOVDconst [x]) [y])
  8697  	// cond: uint64(x)==uint64(y)
  8698  	// result: (FlagEQ)
  8699  	for {
  8700  		y := v.AuxInt
  8701  		v_0 := v.Args[0]
  8702  		if v_0.Op != OpS390XMOVDconst {
  8703  			break
  8704  		}
  8705  		x := v_0.AuxInt
  8706  		if !(uint64(x) == uint64(y)) {
  8707  			break
  8708  		}
  8709  		v.reset(OpS390XFlagEQ)
  8710  		return true
  8711  	}
  8712  	// match: (CMPUconst (MOVDconst [x]) [y])
  8713  	// cond: uint64(x)<uint64(y)
  8714  	// result: (FlagLT)
  8715  	for {
  8716  		y := v.AuxInt
  8717  		v_0 := v.Args[0]
  8718  		if v_0.Op != OpS390XMOVDconst {
  8719  			break
  8720  		}
  8721  		x := v_0.AuxInt
  8722  		if !(uint64(x) < uint64(y)) {
  8723  			break
  8724  		}
  8725  		v.reset(OpS390XFlagLT)
  8726  		return true
  8727  	}
  8728  	// match: (CMPUconst (MOVDconst [x]) [y])
  8729  	// cond: uint64(x)>uint64(y)
  8730  	// result: (FlagGT)
  8731  	for {
  8732  		y := v.AuxInt
  8733  		v_0 := v.Args[0]
  8734  		if v_0.Op != OpS390XMOVDconst {
  8735  			break
  8736  		}
  8737  		x := v_0.AuxInt
  8738  		if !(uint64(x) > uint64(y)) {
  8739  			break
  8740  		}
  8741  		v.reset(OpS390XFlagGT)
  8742  		return true
  8743  	}
  8744  	// match: (CMPUconst (SRDconst _ [c]) [n])
  8745  	// cond: c > 0 && c < 64 && (1<<uint(64-c)) <= uint64(n)
  8746  	// result: (FlagLT)
  8747  	for {
  8748  		n := v.AuxInt
  8749  		v_0 := v.Args[0]
  8750  		if v_0.Op != OpS390XSRDconst {
  8751  			break
  8752  		}
  8753  		c := v_0.AuxInt
  8754  		if !(c > 0 && c < 64 && (1<<uint(64-c)) <= uint64(n)) {
  8755  			break
  8756  		}
  8757  		v.reset(OpS390XFlagLT)
  8758  		return true
  8759  	}
  8760  	// match: (CMPUconst (MOVWZreg x) [c])
  8761  	// cond:
  8762  	// result: (CMPWUconst x [c])
  8763  	for {
  8764  		c := v.AuxInt
  8765  		v_0 := v.Args[0]
  8766  		if v_0.Op != OpS390XMOVWZreg {
  8767  			break
  8768  		}
  8769  		x := v_0.Args[0]
  8770  		v.reset(OpS390XCMPWUconst)
  8771  		v.AuxInt = c
  8772  		v.AddArg(x)
  8773  		return true
  8774  	}
  8775  	// match: (CMPUconst x:(MOVHreg _) [c])
  8776  	// cond:
  8777  	// result: (CMPWUconst x [c])
  8778  	for {
  8779  		c := v.AuxInt
  8780  		x := v.Args[0]
  8781  		if x.Op != OpS390XMOVHreg {
  8782  			break
  8783  		}
  8784  		v.reset(OpS390XCMPWUconst)
  8785  		v.AuxInt = c
  8786  		v.AddArg(x)
  8787  		return true
  8788  	}
  8789  	// match: (CMPUconst x:(MOVHZreg _) [c])
  8790  	// cond:
  8791  	// result: (CMPWUconst x [c])
  8792  	for {
  8793  		c := v.AuxInt
  8794  		x := v.Args[0]
  8795  		if x.Op != OpS390XMOVHZreg {
  8796  			break
  8797  		}
  8798  		v.reset(OpS390XCMPWUconst)
  8799  		v.AuxInt = c
  8800  		v.AddArg(x)
  8801  		return true
  8802  	}
  8803  	// match: (CMPUconst x:(MOVBreg _) [c])
  8804  	// cond:
  8805  	// result: (CMPWUconst x [c])
  8806  	for {
  8807  		c := v.AuxInt
  8808  		x := v.Args[0]
  8809  		if x.Op != OpS390XMOVBreg {
  8810  			break
  8811  		}
  8812  		v.reset(OpS390XCMPWUconst)
  8813  		v.AuxInt = c
  8814  		v.AddArg(x)
  8815  		return true
  8816  	}
  8817  	// match: (CMPUconst x:(MOVBZreg _) [c])
  8818  	// cond:
  8819  	// result: (CMPWUconst x [c])
  8820  	for {
  8821  		c := v.AuxInt
  8822  		x := v.Args[0]
  8823  		if x.Op != OpS390XMOVBZreg {
  8824  			break
  8825  		}
  8826  		v.reset(OpS390XCMPWUconst)
  8827  		v.AuxInt = c
  8828  		v.AddArg(x)
  8829  		return true
  8830  	}
  8831  	// match: (CMPUconst (MOVWZreg x:(ANDWconst [m] _)) [c])
  8832  	// cond: int32(m) >= 0
  8833  	// result: (CMPWUconst x [c])
  8834  	for {
  8835  		c := v.AuxInt
  8836  		v_0 := v.Args[0]
  8837  		if v_0.Op != OpS390XMOVWZreg {
  8838  			break
  8839  		}
  8840  		x := v_0.Args[0]
  8841  		if x.Op != OpS390XANDWconst {
  8842  			break
  8843  		}
  8844  		m := x.AuxInt
  8845  		if !(int32(m) >= 0) {
  8846  			break
  8847  		}
  8848  		v.reset(OpS390XCMPWUconst)
  8849  		v.AuxInt = c
  8850  		v.AddArg(x)
  8851  		return true
  8852  	}
  8853  	return false
  8854  }
  8855  func rewriteValueS390X_OpS390XCMPUconst_10(v *Value) bool {
  8856  	// match: (CMPUconst (MOVWreg x:(ANDWconst [m] _)) [c])
  8857  	// cond: int32(m) >= 0
  8858  	// result: (CMPWUconst x [c])
  8859  	for {
  8860  		c := v.AuxInt
  8861  		v_0 := v.Args[0]
  8862  		if v_0.Op != OpS390XMOVWreg {
  8863  			break
  8864  		}
  8865  		x := v_0.Args[0]
  8866  		if x.Op != OpS390XANDWconst {
  8867  			break
  8868  		}
  8869  		m := x.AuxInt
  8870  		if !(int32(m) >= 0) {
  8871  			break
  8872  		}
  8873  		v.reset(OpS390XCMPWUconst)
  8874  		v.AuxInt = c
  8875  		v.AddArg(x)
  8876  		return true
  8877  	}
  8878  	return false
  8879  }
  8880  func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool {
  8881  	b := v.Block
  8882  	// match: (CMPW x (MOVDconst [c]))
  8883  	// cond:
  8884  	// result: (CMPWconst x [int64(int32(c))])
  8885  	for {
  8886  		_ = v.Args[1]
  8887  		x := v.Args[0]
  8888  		v_1 := v.Args[1]
  8889  		if v_1.Op != OpS390XMOVDconst {
  8890  			break
  8891  		}
  8892  		c := v_1.AuxInt
  8893  		v.reset(OpS390XCMPWconst)
  8894  		v.AuxInt = int64(int32(c))
  8895  		v.AddArg(x)
  8896  		return true
  8897  	}
  8898  	// match: (CMPW (MOVDconst [c]) x)
  8899  	// cond:
  8900  	// result: (InvertFlags (CMPWconst x [int64(int32(c))]))
  8901  	for {
  8902  		x := v.Args[1]
  8903  		v_0 := v.Args[0]
  8904  		if v_0.Op != OpS390XMOVDconst {
  8905  			break
  8906  		}
  8907  		c := v_0.AuxInt
  8908  		v.reset(OpS390XInvertFlags)
  8909  		v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags)
  8910  		v0.AuxInt = int64(int32(c))
  8911  		v0.AddArg(x)
  8912  		v.AddArg(v0)
  8913  		return true
  8914  	}
  8915  	// match: (CMPW x (MOVWreg y))
  8916  	// cond:
  8917  	// result: (CMPW x y)
  8918  	for {
  8919  		_ = v.Args[1]
  8920  		x := v.Args[0]
  8921  		v_1 := v.Args[1]
  8922  		if v_1.Op != OpS390XMOVWreg {
  8923  			break
  8924  		}
  8925  		y := v_1.Args[0]
  8926  		v.reset(OpS390XCMPW)
  8927  		v.AddArg(x)
  8928  		v.AddArg(y)
  8929  		return true
  8930  	}
  8931  	// match: (CMPW x (MOVWZreg y))
  8932  	// cond:
  8933  	// result: (CMPW x y)
  8934  	for {
  8935  		_ = v.Args[1]
  8936  		x := v.Args[0]
  8937  		v_1 := v.Args[1]
  8938  		if v_1.Op != OpS390XMOVWZreg {
  8939  			break
  8940  		}
  8941  		y := v_1.Args[0]
  8942  		v.reset(OpS390XCMPW)
  8943  		v.AddArg(x)
  8944  		v.AddArg(y)
  8945  		return true
  8946  	}
  8947  	// match: (CMPW (MOVWreg x) y)
  8948  	// cond:
  8949  	// result: (CMPW x y)
  8950  	for {
  8951  		y := v.Args[1]
  8952  		v_0 := v.Args[0]
  8953  		if v_0.Op != OpS390XMOVWreg {
  8954  			break
  8955  		}
  8956  		x := v_0.Args[0]
  8957  		v.reset(OpS390XCMPW)
  8958  		v.AddArg(x)
  8959  		v.AddArg(y)
  8960  		return true
  8961  	}
  8962  	// match: (CMPW (MOVWZreg x) y)
  8963  	// cond:
  8964  	// result: (CMPW x y)
  8965  	for {
  8966  		y := v.Args[1]
  8967  		v_0 := v.Args[0]
  8968  		if v_0.Op != OpS390XMOVWZreg {
  8969  			break
  8970  		}
  8971  		x := v_0.Args[0]
  8972  		v.reset(OpS390XCMPW)
  8973  		v.AddArg(x)
  8974  		v.AddArg(y)
  8975  		return true
  8976  	}
  8977  	return false
  8978  }
  8979  func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool {
  8980  	b := v.Block
  8981  	// match: (CMPWU x (MOVDconst [c]))
  8982  	// cond:
  8983  	// result: (CMPWUconst x [int64(int32(c))])
  8984  	for {
  8985  		_ = v.Args[1]
  8986  		x := v.Args[0]
  8987  		v_1 := v.Args[1]
  8988  		if v_1.Op != OpS390XMOVDconst {
  8989  			break
  8990  		}
  8991  		c := v_1.AuxInt
  8992  		v.reset(OpS390XCMPWUconst)
  8993  		v.AuxInt = int64(int32(c))
  8994  		v.AddArg(x)
  8995  		return true
  8996  	}
  8997  	// match: (CMPWU (MOVDconst [c]) x)
  8998  	// cond:
  8999  	// result: (InvertFlags (CMPWUconst x [int64(int32(c))]))
  9000  	for {
  9001  		x := v.Args[1]
  9002  		v_0 := v.Args[0]
  9003  		if v_0.Op != OpS390XMOVDconst {
  9004  			break
  9005  		}
  9006  		c := v_0.AuxInt
  9007  		v.reset(OpS390XInvertFlags)
  9008  		v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags)
  9009  		v0.AuxInt = int64(int32(c))
  9010  		v0.AddArg(x)
  9011  		v.AddArg(v0)
  9012  		return true
  9013  	}
  9014  	// match: (CMPWU x (MOVWreg y))
  9015  	// cond:
  9016  	// result: (CMPWU x y)
  9017  	for {
  9018  		_ = v.Args[1]
  9019  		x := v.Args[0]
  9020  		v_1 := v.Args[1]
  9021  		if v_1.Op != OpS390XMOVWreg {
  9022  			break
  9023  		}
  9024  		y := v_1.Args[0]
  9025  		v.reset(OpS390XCMPWU)
  9026  		v.AddArg(x)
  9027  		v.AddArg(y)
  9028  		return true
  9029  	}
  9030  	// match: (CMPWU x (MOVWZreg y))
  9031  	// cond:
  9032  	// result: (CMPWU x y)
  9033  	for {
  9034  		_ = v.Args[1]
  9035  		x := v.Args[0]
  9036  		v_1 := v.Args[1]
  9037  		if v_1.Op != OpS390XMOVWZreg {
  9038  			break
  9039  		}
  9040  		y := v_1.Args[0]
  9041  		v.reset(OpS390XCMPWU)
  9042  		v.AddArg(x)
  9043  		v.AddArg(y)
  9044  		return true
  9045  	}
  9046  	// match: (CMPWU (MOVWreg x) y)
  9047  	// cond:
  9048  	// result: (CMPWU x y)
  9049  	for {
  9050  		y := v.Args[1]
  9051  		v_0 := v.Args[0]
  9052  		if v_0.Op != OpS390XMOVWreg {
  9053  			break
  9054  		}
  9055  		x := v_0.Args[0]
  9056  		v.reset(OpS390XCMPWU)
  9057  		v.AddArg(x)
  9058  		v.AddArg(y)
  9059  		return true
  9060  	}
  9061  	// match: (CMPWU (MOVWZreg x) y)
  9062  	// cond:
  9063  	// result: (CMPWU x y)
  9064  	for {
  9065  		y := v.Args[1]
  9066  		v_0 := v.Args[0]
  9067  		if v_0.Op != OpS390XMOVWZreg {
  9068  			break
  9069  		}
  9070  		x := v_0.Args[0]
  9071  		v.reset(OpS390XCMPWU)
  9072  		v.AddArg(x)
  9073  		v.AddArg(y)
  9074  		return true
  9075  	}
  9076  	return false
  9077  }
  9078  func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool {
  9079  	// match: (CMPWUconst (MOVDconst [x]) [y])
  9080  	// cond: uint32(x)==uint32(y)
  9081  	// result: (FlagEQ)
  9082  	for {
  9083  		y := v.AuxInt
  9084  		v_0 := v.Args[0]
  9085  		if v_0.Op != OpS390XMOVDconst {
  9086  			break
  9087  		}
  9088  		x := v_0.AuxInt
  9089  		if !(uint32(x) == uint32(y)) {
  9090  			break
  9091  		}
  9092  		v.reset(OpS390XFlagEQ)
  9093  		return true
  9094  	}
  9095  	// match: (CMPWUconst (MOVDconst [x]) [y])
  9096  	// cond: uint32(x)<uint32(y)
  9097  	// result: (FlagLT)
  9098  	for {
  9099  		y := v.AuxInt
  9100  		v_0 := v.Args[0]
  9101  		if v_0.Op != OpS390XMOVDconst {
  9102  			break
  9103  		}
  9104  		x := v_0.AuxInt
  9105  		if !(uint32(x) < uint32(y)) {
  9106  			break
  9107  		}
  9108  		v.reset(OpS390XFlagLT)
  9109  		return true
  9110  	}
  9111  	// match: (CMPWUconst (MOVDconst [x]) [y])
  9112  	// cond: uint32(x)>uint32(y)
  9113  	// result: (FlagGT)
  9114  	for {
  9115  		y := v.AuxInt
  9116  		v_0 := v.Args[0]
  9117  		if v_0.Op != OpS390XMOVDconst {
  9118  			break
  9119  		}
  9120  		x := v_0.AuxInt
  9121  		if !(uint32(x) > uint32(y)) {
  9122  			break
  9123  		}
  9124  		v.reset(OpS390XFlagGT)
  9125  		return true
  9126  	}
  9127  	// match: (CMPWUconst (MOVBZreg _) [c])
  9128  	// cond: 0xff < c
  9129  	// result: (FlagLT)
  9130  	for {
  9131  		c := v.AuxInt
  9132  		v_0 := v.Args[0]
  9133  		if v_0.Op != OpS390XMOVBZreg {
  9134  			break
  9135  		}
  9136  		if !(0xff < c) {
  9137  			break
  9138  		}
  9139  		v.reset(OpS390XFlagLT)
  9140  		return true
  9141  	}
  9142  	// match: (CMPWUconst (MOVHZreg _) [c])
  9143  	// cond: 0xffff < c
  9144  	// result: (FlagLT)
  9145  	for {
  9146  		c := v.AuxInt
  9147  		v_0 := v.Args[0]
  9148  		if v_0.Op != OpS390XMOVHZreg {
  9149  			break
  9150  		}
  9151  		if !(0xffff < c) {
  9152  			break
  9153  		}
  9154  		v.reset(OpS390XFlagLT)
  9155  		return true
  9156  	}
  9157  	// match: (CMPWUconst (SRWconst _ [c]) [n])
  9158  	// cond: c > 0 && c < 32 && (1<<uint(32-c)) <= uint32(n)
  9159  	// result: (FlagLT)
  9160  	for {
  9161  		n := v.AuxInt
  9162  		v_0 := v.Args[0]
  9163  		if v_0.Op != OpS390XSRWconst {
  9164  			break
  9165  		}
  9166  		c := v_0.AuxInt
  9167  		if !(c > 0 && c < 32 && (1<<uint(32-c)) <= uint32(n)) {
  9168  			break
  9169  		}
  9170  		v.reset(OpS390XFlagLT)
  9171  		return true
  9172  	}
  9173  	// match: (CMPWUconst (ANDWconst _ [m]) [n])
  9174  	// cond: uint32(m) < uint32(n)
  9175  	// result: (FlagLT)
  9176  	for {
  9177  		n := v.AuxInt
  9178  		v_0 := v.Args[0]
  9179  		if v_0.Op != OpS390XANDWconst {
  9180  			break
  9181  		}
  9182  		m := v_0.AuxInt
  9183  		if !(uint32(m) < uint32(n)) {
  9184  			break
  9185  		}
  9186  		v.reset(OpS390XFlagLT)
  9187  		return true
  9188  	}
  9189  	// match: (CMPWUconst (MOVWreg x) [c])
  9190  	// cond:
  9191  	// result: (CMPWUconst x [c])
  9192  	for {
  9193  		c := v.AuxInt
  9194  		v_0 := v.Args[0]
  9195  		if v_0.Op != OpS390XMOVWreg {
  9196  			break
  9197  		}
  9198  		x := v_0.Args[0]
  9199  		v.reset(OpS390XCMPWUconst)
  9200  		v.AuxInt = c
  9201  		v.AddArg(x)
  9202  		return true
  9203  	}
  9204  	// match: (CMPWUconst (MOVWZreg x) [c])
  9205  	// cond:
  9206  	// result: (CMPWUconst x [c])
  9207  	for {
  9208  		c := v.AuxInt
  9209  		v_0 := v.Args[0]
  9210  		if v_0.Op != OpS390XMOVWZreg {
  9211  			break
  9212  		}
  9213  		x := v_0.Args[0]
  9214  		v.reset(OpS390XCMPWUconst)
  9215  		v.AuxInt = c
  9216  		v.AddArg(x)
  9217  		return true
  9218  	}
  9219  	return false
  9220  }
  9221  func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool {
  9222  	// match: (CMPWconst (MOVDconst [x]) [y])
  9223  	// cond: int32(x)==int32(y)
  9224  	// result: (FlagEQ)
  9225  	for {
  9226  		y := v.AuxInt
  9227  		v_0 := v.Args[0]
  9228  		if v_0.Op != OpS390XMOVDconst {
  9229  			break
  9230  		}
  9231  		x := v_0.AuxInt
  9232  		if !(int32(x) == int32(y)) {
  9233  			break
  9234  		}
  9235  		v.reset(OpS390XFlagEQ)
  9236  		return true
  9237  	}
  9238  	// match: (CMPWconst (MOVDconst [x]) [y])
  9239  	// cond: int32(x)<int32(y)
  9240  	// result: (FlagLT)
  9241  	for {
  9242  		y := v.AuxInt
  9243  		v_0 := v.Args[0]
  9244  		if v_0.Op != OpS390XMOVDconst {
  9245  			break
  9246  		}
  9247  		x := v_0.AuxInt
  9248  		if !(int32(x) < int32(y)) {
  9249  			break
  9250  		}
  9251  		v.reset(OpS390XFlagLT)
  9252  		return true
  9253  	}
  9254  	// match: (CMPWconst (MOVDconst [x]) [y])
  9255  	// cond: int32(x)>int32(y)
  9256  	// result: (FlagGT)
  9257  	for {
  9258  		y := v.AuxInt
  9259  		v_0 := v.Args[0]
  9260  		if v_0.Op != OpS390XMOVDconst {
  9261  			break
  9262  		}
  9263  		x := v_0.AuxInt
  9264  		if !(int32(x) > int32(y)) {
  9265  			break
  9266  		}
  9267  		v.reset(OpS390XFlagGT)
  9268  		return true
  9269  	}
  9270  	// match: (CMPWconst (MOVBZreg _) [c])
  9271  	// cond: 0xff < c
  9272  	// result: (FlagLT)
  9273  	for {
  9274  		c := v.AuxInt
  9275  		v_0 := v.Args[0]
  9276  		if v_0.Op != OpS390XMOVBZreg {
  9277  			break
  9278  		}
  9279  		if !(0xff < c) {
  9280  			break
  9281  		}
  9282  		v.reset(OpS390XFlagLT)
  9283  		return true
  9284  	}
  9285  	// match: (CMPWconst (MOVHZreg _) [c])
  9286  	// cond: 0xffff < c
  9287  	// result: (FlagLT)
  9288  	for {
  9289  		c := v.AuxInt
  9290  		v_0 := v.Args[0]
  9291  		if v_0.Op != OpS390XMOVHZreg {
  9292  			break
  9293  		}
  9294  		if !(0xffff < c) {
  9295  			break
  9296  		}
  9297  		v.reset(OpS390XFlagLT)
  9298  		return true
  9299  	}
  9300  	// match: (CMPWconst (SRWconst _ [c]) [n])
  9301  	// cond: c > 0 && n < 0
  9302  	// result: (FlagGT)
  9303  	for {
  9304  		n := v.AuxInt
  9305  		v_0 := v.Args[0]
  9306  		if v_0.Op != OpS390XSRWconst {
  9307  			break
  9308  		}
  9309  		c := v_0.AuxInt
  9310  		if !(c > 0 && n < 0) {
  9311  			break
  9312  		}
  9313  		v.reset(OpS390XFlagGT)
  9314  		return true
  9315  	}
  9316  	// match: (CMPWconst (ANDWconst _ [m]) [n])
  9317  	// cond: int32(m) >= 0 && int32(m) < int32(n)
  9318  	// result: (FlagLT)
  9319  	for {
  9320  		n := v.AuxInt
  9321  		v_0 := v.Args[0]
  9322  		if v_0.Op != OpS390XANDWconst {
  9323  			break
  9324  		}
  9325  		m := v_0.AuxInt
  9326  		if !(int32(m) >= 0 && int32(m) < int32(n)) {
  9327  			break
  9328  		}
  9329  		v.reset(OpS390XFlagLT)
  9330  		return true
  9331  	}
  9332  	// match: (CMPWconst x:(SRWconst _ [c]) [n])
  9333  	// cond: c > 0 && n >= 0
  9334  	// result: (CMPWUconst x [n])
  9335  	for {
  9336  		n := v.AuxInt
  9337  		x := v.Args[0]
  9338  		if x.Op != OpS390XSRWconst {
  9339  			break
  9340  		}
  9341  		c := x.AuxInt
  9342  		if !(c > 0 && n >= 0) {
  9343  			break
  9344  		}
  9345  		v.reset(OpS390XCMPWUconst)
  9346  		v.AuxInt = n
  9347  		v.AddArg(x)
  9348  		return true
  9349  	}
  9350  	// match: (CMPWconst (MOVWreg x) [c])
  9351  	// cond:
  9352  	// result: (CMPWconst x [c])
  9353  	for {
  9354  		c := v.AuxInt
  9355  		v_0 := v.Args[0]
  9356  		if v_0.Op != OpS390XMOVWreg {
  9357  			break
  9358  		}
  9359  		x := v_0.Args[0]
  9360  		v.reset(OpS390XCMPWconst)
  9361  		v.AuxInt = c
  9362  		v.AddArg(x)
  9363  		return true
  9364  	}
  9365  	// match: (CMPWconst (MOVWZreg x) [c])
  9366  	// cond:
  9367  	// result: (CMPWconst x [c])
  9368  	for {
  9369  		c := v.AuxInt
  9370  		v_0 := v.Args[0]
  9371  		if v_0.Op != OpS390XMOVWZreg {
  9372  			break
  9373  		}
  9374  		x := v_0.Args[0]
  9375  		v.reset(OpS390XCMPWconst)
  9376  		v.AuxInt = c
  9377  		v.AddArg(x)
  9378  		return true
  9379  	}
  9380  	return false
  9381  }
  9382  func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool {
  9383  	// match: (CMPconst (MOVDconst [x]) [y])
  9384  	// cond: x==y
  9385  	// result: (FlagEQ)
  9386  	for {
  9387  		y := v.AuxInt
  9388  		v_0 := v.Args[0]
  9389  		if v_0.Op != OpS390XMOVDconst {
  9390  			break
  9391  		}
  9392  		x := v_0.AuxInt
  9393  		if !(x == y) {
  9394  			break
  9395  		}
  9396  		v.reset(OpS390XFlagEQ)
  9397  		return true
  9398  	}
  9399  	// match: (CMPconst (MOVDconst [x]) [y])
  9400  	// cond: x<y
  9401  	// result: (FlagLT)
  9402  	for {
  9403  		y := v.AuxInt
  9404  		v_0 := v.Args[0]
  9405  		if v_0.Op != OpS390XMOVDconst {
  9406  			break
  9407  		}
  9408  		x := v_0.AuxInt
  9409  		if !(x < y) {
  9410  			break
  9411  		}
  9412  		v.reset(OpS390XFlagLT)
  9413  		return true
  9414  	}
  9415  	// match: (CMPconst (MOVDconst [x]) [y])
  9416  	// cond: x>y
  9417  	// result: (FlagGT)
  9418  	for {
  9419  		y := v.AuxInt
  9420  		v_0 := v.Args[0]
  9421  		if v_0.Op != OpS390XMOVDconst {
  9422  			break
  9423  		}
  9424  		x := v_0.AuxInt
  9425  		if !(x > y) {
  9426  			break
  9427  		}
  9428  		v.reset(OpS390XFlagGT)
  9429  		return true
  9430  	}
  9431  	// match: (CMPconst (SRDconst _ [c]) [n])
  9432  	// cond: c > 0 && n < 0
  9433  	// result: (FlagGT)
  9434  	for {
  9435  		n := v.AuxInt
  9436  		v_0 := v.Args[0]
  9437  		if v_0.Op != OpS390XSRDconst {
  9438  			break
  9439  		}
  9440  		c := v_0.AuxInt
  9441  		if !(c > 0 && n < 0) {
  9442  			break
  9443  		}
  9444  		v.reset(OpS390XFlagGT)
  9445  		return true
  9446  	}
  9447  	// match: (CMPconst (MOVWreg x) [c])
  9448  	// cond:
  9449  	// result: (CMPWconst x [c])
  9450  	for {
  9451  		c := v.AuxInt
  9452  		v_0 := v.Args[0]
  9453  		if v_0.Op != OpS390XMOVWreg {
  9454  			break
  9455  		}
  9456  		x := v_0.Args[0]
  9457  		v.reset(OpS390XCMPWconst)
  9458  		v.AuxInt = c
  9459  		v.AddArg(x)
  9460  		return true
  9461  	}
  9462  	// match: (CMPconst x:(MOVHreg _) [c])
  9463  	// cond:
  9464  	// result: (CMPWconst x [c])
  9465  	for {
  9466  		c := v.AuxInt
  9467  		x := v.Args[0]
  9468  		if x.Op != OpS390XMOVHreg {
  9469  			break
  9470  		}
  9471  		v.reset(OpS390XCMPWconst)
  9472  		v.AuxInt = c
  9473  		v.AddArg(x)
  9474  		return true
  9475  	}
  9476  	// match: (CMPconst x:(MOVHZreg _) [c])
  9477  	// cond:
  9478  	// result: (CMPWconst x [c])
  9479  	for {
  9480  		c := v.AuxInt
  9481  		x := v.Args[0]
  9482  		if x.Op != OpS390XMOVHZreg {
  9483  			break
  9484  		}
  9485  		v.reset(OpS390XCMPWconst)
  9486  		v.AuxInt = c
  9487  		v.AddArg(x)
  9488  		return true
  9489  	}
  9490  	// match: (CMPconst x:(MOVBreg _) [c])
  9491  	// cond:
  9492  	// result: (CMPWconst x [c])
  9493  	for {
  9494  		c := v.AuxInt
  9495  		x := v.Args[0]
  9496  		if x.Op != OpS390XMOVBreg {
  9497  			break
  9498  		}
  9499  		v.reset(OpS390XCMPWconst)
  9500  		v.AuxInt = c
  9501  		v.AddArg(x)
  9502  		return true
  9503  	}
  9504  	// match: (CMPconst x:(MOVBZreg _) [c])
  9505  	// cond:
  9506  	// result: (CMPWconst x [c])
  9507  	for {
  9508  		c := v.AuxInt
  9509  		x := v.Args[0]
  9510  		if x.Op != OpS390XMOVBZreg {
  9511  			break
  9512  		}
  9513  		v.reset(OpS390XCMPWconst)
  9514  		v.AuxInt = c
  9515  		v.AddArg(x)
  9516  		return true
  9517  	}
  9518  	// match: (CMPconst (MOVWZreg x:(ANDWconst [m] _)) [c])
  9519  	// cond: int32(m) >= 0 && c >= 0
  9520  	// result: (CMPWUconst x [c])
  9521  	for {
  9522  		c := v.AuxInt
  9523  		v_0 := v.Args[0]
  9524  		if v_0.Op != OpS390XMOVWZreg {
  9525  			break
  9526  		}
  9527  		x := v_0.Args[0]
  9528  		if x.Op != OpS390XANDWconst {
  9529  			break
  9530  		}
  9531  		m := x.AuxInt
  9532  		if !(int32(m) >= 0 && c >= 0) {
  9533  			break
  9534  		}
  9535  		v.reset(OpS390XCMPWUconst)
  9536  		v.AuxInt = c
  9537  		v.AddArg(x)
  9538  		return true
  9539  	}
  9540  	return false
  9541  }
  9542  func rewriteValueS390X_OpS390XCMPconst_10(v *Value) bool {
  9543  	// match: (CMPconst (MOVWreg x:(ANDWconst [m] _)) [c])
  9544  	// cond: int32(m) >= 0 && c >= 0
  9545  	// result: (CMPWUconst x [c])
  9546  	for {
  9547  		c := v.AuxInt
  9548  		v_0 := v.Args[0]
  9549  		if v_0.Op != OpS390XMOVWreg {
  9550  			break
  9551  		}
  9552  		x := v_0.Args[0]
  9553  		if x.Op != OpS390XANDWconst {
  9554  			break
  9555  		}
  9556  		m := x.AuxInt
  9557  		if !(int32(m) >= 0 && c >= 0) {
  9558  			break
  9559  		}
  9560  		v.reset(OpS390XCMPWUconst)
  9561  		v.AuxInt = c
  9562  		v.AddArg(x)
  9563  		return true
  9564  	}
  9565  	// match: (CMPconst x:(SRDconst _ [c]) [n])
  9566  	// cond: c > 0 && n >= 0
  9567  	// result: (CMPUconst x [n])
  9568  	for {
  9569  		n := v.AuxInt
  9570  		x := v.Args[0]
  9571  		if x.Op != OpS390XSRDconst {
  9572  			break
  9573  		}
  9574  		c := x.AuxInt
  9575  		if !(c > 0 && n >= 0) {
  9576  			break
  9577  		}
  9578  		v.reset(OpS390XCMPUconst)
  9579  		v.AuxInt = n
  9580  		v.AddArg(x)
  9581  		return true
  9582  	}
  9583  	return false
  9584  }
  9585  func rewriteValueS390X_OpS390XCPSDR_0(v *Value) bool {
  9586  	// match: (CPSDR y (FMOVDconst [c]))
  9587  	// cond: c & -1<<63 == 0
  9588  	// result: (LPDFR y)
  9589  	for {
  9590  		_ = v.Args[1]
  9591  		y := v.Args[0]
  9592  		v_1 := v.Args[1]
  9593  		if v_1.Op != OpS390XFMOVDconst {
  9594  			break
  9595  		}
  9596  		c := v_1.AuxInt
  9597  		if !(c&-1<<63 == 0) {
  9598  			break
  9599  		}
  9600  		v.reset(OpS390XLPDFR)
  9601  		v.AddArg(y)
  9602  		return true
  9603  	}
  9604  	// match: (CPSDR y (FMOVDconst [c]))
  9605  	// cond: c & -1<<63 != 0
  9606  	// result: (LNDFR y)
  9607  	for {
  9608  		_ = v.Args[1]
  9609  		y := v.Args[0]
  9610  		v_1 := v.Args[1]
  9611  		if v_1.Op != OpS390XFMOVDconst {
  9612  			break
  9613  		}
  9614  		c := v_1.AuxInt
  9615  		if !(c&-1<<63 != 0) {
  9616  			break
  9617  		}
  9618  		v.reset(OpS390XLNDFR)
  9619  		v.AddArg(y)
  9620  		return true
  9621  	}
  9622  	return false
  9623  }
  9624  func rewriteValueS390X_OpS390XFADD_0(v *Value) bool {
  9625  	// match: (FADD (FMUL y z) x)
  9626  	// cond:
  9627  	// result: (FMADD x y z)
  9628  	for {
  9629  		x := v.Args[1]
  9630  		v_0 := v.Args[0]
  9631  		if v_0.Op != OpS390XFMUL {
  9632  			break
  9633  		}
  9634  		z := v_0.Args[1]
  9635  		y := v_0.Args[0]
  9636  		v.reset(OpS390XFMADD)
  9637  		v.AddArg(x)
  9638  		v.AddArg(y)
  9639  		v.AddArg(z)
  9640  		return true
  9641  	}
  9642  	// match: (FADD x (FMUL y z))
  9643  	// cond:
  9644  	// result: (FMADD x y z)
  9645  	for {
  9646  		_ = v.Args[1]
  9647  		x := v.Args[0]
  9648  		v_1 := v.Args[1]
  9649  		if v_1.Op != OpS390XFMUL {
  9650  			break
  9651  		}
  9652  		z := v_1.Args[1]
  9653  		y := v_1.Args[0]
  9654  		v.reset(OpS390XFMADD)
  9655  		v.AddArg(x)
  9656  		v.AddArg(y)
  9657  		v.AddArg(z)
  9658  		return true
  9659  	}
  9660  	return false
  9661  }
  9662  func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool {
  9663  	// match: (FADDS (FMULS y z) x)
  9664  	// cond:
  9665  	// result: (FMADDS x y z)
  9666  	for {
  9667  		x := v.Args[1]
  9668  		v_0 := v.Args[0]
  9669  		if v_0.Op != OpS390XFMULS {
  9670  			break
  9671  		}
  9672  		z := v_0.Args[1]
  9673  		y := v_0.Args[0]
  9674  		v.reset(OpS390XFMADDS)
  9675  		v.AddArg(x)
  9676  		v.AddArg(y)
  9677  		v.AddArg(z)
  9678  		return true
  9679  	}
  9680  	// match: (FADDS x (FMULS y z))
  9681  	// cond:
  9682  	// result: (FMADDS x y z)
  9683  	for {
  9684  		_ = v.Args[1]
  9685  		x := v.Args[0]
  9686  		v_1 := v.Args[1]
  9687  		if v_1.Op != OpS390XFMULS {
  9688  			break
  9689  		}
  9690  		z := v_1.Args[1]
  9691  		y := v_1.Args[0]
  9692  		v.reset(OpS390XFMADDS)
  9693  		v.AddArg(x)
  9694  		v.AddArg(y)
  9695  		v.AddArg(z)
  9696  		return true
  9697  	}
  9698  	return false
  9699  }
  9700  func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool {
  9701  	// match: (FMOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _))
  9702  	// cond: isSamePtr(ptr1, ptr2)
  9703  	// result: (LDGR x)
  9704  	for {
  9705  		off := v.AuxInt
  9706  		sym := v.Aux
  9707  		_ = v.Args[1]
  9708  		ptr1 := v.Args[0]
  9709  		v_1 := v.Args[1]
  9710  		if v_1.Op != OpS390XMOVDstore {
  9711  			break
  9712  		}
  9713  		if v_1.AuxInt != off {
  9714  			break
  9715  		}
  9716  		if v_1.Aux != sym {
  9717  			break
  9718  		}
  9719  		_ = v_1.Args[2]
  9720  		ptr2 := v_1.Args[0]
  9721  		x := v_1.Args[1]
  9722  		if !(isSamePtr(ptr1, ptr2)) {
  9723  			break
  9724  		}
  9725  		v.reset(OpS390XLDGR)
  9726  		v.AddArg(x)
  9727  		return true
  9728  	}
  9729  	// match: (FMOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _))
  9730  	// cond: isSamePtr(ptr1, ptr2)
  9731  	// result: x
  9732  	for {
  9733  		off := v.AuxInt
  9734  		sym := v.Aux
  9735  		_ = v.Args[1]
  9736  		ptr1 := v.Args[0]
  9737  		v_1 := v.Args[1]
  9738  		if v_1.Op != OpS390XFMOVDstore {
  9739  			break
  9740  		}
  9741  		if v_1.AuxInt != off {
  9742  			break
  9743  		}
  9744  		if v_1.Aux != sym {
  9745  			break
  9746  		}
  9747  		_ = v_1.Args[2]
  9748  		ptr2 := v_1.Args[0]
  9749  		x := v_1.Args[1]
  9750  		if !(isSamePtr(ptr1, ptr2)) {
  9751  			break
  9752  		}
  9753  		v.reset(OpCopy)
  9754  		v.Type = x.Type
  9755  		v.AddArg(x)
  9756  		return true
  9757  	}
  9758  	// match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem)
  9759  	// cond: is20Bit(off1+off2)
  9760  	// result: (FMOVDload [off1+off2] {sym} ptr mem)
  9761  	for {
  9762  		off1 := v.AuxInt
  9763  		sym := v.Aux
  9764  		mem := v.Args[1]
  9765  		v_0 := v.Args[0]
  9766  		if v_0.Op != OpS390XADDconst {
  9767  			break
  9768  		}
  9769  		off2 := v_0.AuxInt
  9770  		ptr := v_0.Args[0]
  9771  		if !(is20Bit(off1 + off2)) {
  9772  			break
  9773  		}
  9774  		v.reset(OpS390XFMOVDload)
  9775  		v.AuxInt = off1 + off2
  9776  		v.Aux = sym
  9777  		v.AddArg(ptr)
  9778  		v.AddArg(mem)
  9779  		return true
  9780  	}
  9781  	// match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
  9782  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
  9783  	// result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem)
  9784  	for {
  9785  		off1 := v.AuxInt
  9786  		sym1 := v.Aux
  9787  		mem := v.Args[1]
  9788  		v_0 := v.Args[0]
  9789  		if v_0.Op != OpS390XMOVDaddr {
  9790  			break
  9791  		}
  9792  		off2 := v_0.AuxInt
  9793  		sym2 := v_0.Aux
  9794  		base := v_0.Args[0]
  9795  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
  9796  			break
  9797  		}
  9798  		v.reset(OpS390XFMOVDload)
  9799  		v.AuxInt = off1 + off2
  9800  		v.Aux = mergeSym(sym1, sym2)
  9801  		v.AddArg(base)
  9802  		v.AddArg(mem)
  9803  		return true
  9804  	}
  9805  	// match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
  9806  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
  9807  	// result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
  9808  	for {
  9809  		off1 := v.AuxInt
  9810  		sym1 := v.Aux
  9811  		mem := v.Args[1]
  9812  		v_0 := v.Args[0]
  9813  		if v_0.Op != OpS390XMOVDaddridx {
  9814  			break
  9815  		}
  9816  		off2 := v_0.AuxInt
  9817  		sym2 := v_0.Aux
  9818  		idx := v_0.Args[1]
  9819  		ptr := v_0.Args[0]
  9820  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
  9821  			break
  9822  		}
  9823  		v.reset(OpS390XFMOVDloadidx)
  9824  		v.AuxInt = off1 + off2
  9825  		v.Aux = mergeSym(sym1, sym2)
  9826  		v.AddArg(ptr)
  9827  		v.AddArg(idx)
  9828  		v.AddArg(mem)
  9829  		return true
  9830  	}
  9831  	// match: (FMOVDload [off] {sym} (ADD ptr idx) mem)
  9832  	// cond: ptr.Op != OpSB
  9833  	// result: (FMOVDloadidx [off] {sym} ptr idx mem)
  9834  	for {
  9835  		off := v.AuxInt
  9836  		sym := v.Aux
  9837  		mem := v.Args[1]
  9838  		v_0 := v.Args[0]
  9839  		if v_0.Op != OpS390XADD {
  9840  			break
  9841  		}
  9842  		idx := v_0.Args[1]
  9843  		ptr := v_0.Args[0]
  9844  		if !(ptr.Op != OpSB) {
  9845  			break
  9846  		}
  9847  		v.reset(OpS390XFMOVDloadidx)
  9848  		v.AuxInt = off
  9849  		v.Aux = sym
  9850  		v.AddArg(ptr)
  9851  		v.AddArg(idx)
  9852  		v.AddArg(mem)
  9853  		return true
  9854  	}
  9855  	return false
  9856  }
  9857  func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool {
  9858  	// match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
  9859  	// cond: is20Bit(c+d)
  9860  	// result: (FMOVDloadidx [c+d] {sym} ptr idx mem)
  9861  	for {
  9862  		c := v.AuxInt
  9863  		sym := v.Aux
  9864  		mem := v.Args[2]
  9865  		v_0 := v.Args[0]
  9866  		if v_0.Op != OpS390XADDconst {
  9867  			break
  9868  		}
  9869  		d := v_0.AuxInt
  9870  		ptr := v_0.Args[0]
  9871  		idx := v.Args[1]
  9872  		if !(is20Bit(c + d)) {
  9873  			break
  9874  		}
  9875  		v.reset(OpS390XFMOVDloadidx)
  9876  		v.AuxInt = c + d
  9877  		v.Aux = sym
  9878  		v.AddArg(ptr)
  9879  		v.AddArg(idx)
  9880  		v.AddArg(mem)
  9881  		return true
  9882  	}
  9883  	// match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
  9884  	// cond: is20Bit(c+d)
  9885  	// result: (FMOVDloadidx [c+d] {sym} ptr idx mem)
  9886  	for {
  9887  		c := v.AuxInt
  9888  		sym := v.Aux
  9889  		mem := v.Args[2]
  9890  		ptr := v.Args[0]
  9891  		v_1 := v.Args[1]
  9892  		if v_1.Op != OpS390XADDconst {
  9893  			break
  9894  		}
  9895  		d := v_1.AuxInt
  9896  		idx := v_1.Args[0]
  9897  		if !(is20Bit(c + d)) {
  9898  			break
  9899  		}
  9900  		v.reset(OpS390XFMOVDloadidx)
  9901  		v.AuxInt = c + d
  9902  		v.Aux = sym
  9903  		v.AddArg(ptr)
  9904  		v.AddArg(idx)
  9905  		v.AddArg(mem)
  9906  		return true
  9907  	}
  9908  	return false
  9909  }
  9910  func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool {
  9911  	// match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem)
  9912  	// cond: is20Bit(off1+off2)
  9913  	// result: (FMOVDstore [off1+off2] {sym} ptr val mem)
  9914  	for {
  9915  		off1 := v.AuxInt
  9916  		sym := v.Aux
  9917  		mem := v.Args[2]
  9918  		v_0 := v.Args[0]
  9919  		if v_0.Op != OpS390XADDconst {
  9920  			break
  9921  		}
  9922  		off2 := v_0.AuxInt
  9923  		ptr := v_0.Args[0]
  9924  		val := v.Args[1]
  9925  		if !(is20Bit(off1 + off2)) {
  9926  			break
  9927  		}
  9928  		v.reset(OpS390XFMOVDstore)
  9929  		v.AuxInt = off1 + off2
  9930  		v.Aux = sym
  9931  		v.AddArg(ptr)
  9932  		v.AddArg(val)
  9933  		v.AddArg(mem)
  9934  		return true
  9935  	}
  9936  	// match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem)
  9937  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
  9938  	// result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
  9939  	for {
  9940  		off1 := v.AuxInt
  9941  		sym1 := v.Aux
  9942  		mem := v.Args[2]
  9943  		v_0 := v.Args[0]
  9944  		if v_0.Op != OpS390XMOVDaddr {
  9945  			break
  9946  		}
  9947  		off2 := v_0.AuxInt
  9948  		sym2 := v_0.Aux
  9949  		base := v_0.Args[0]
  9950  		val := v.Args[1]
  9951  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
  9952  			break
  9953  		}
  9954  		v.reset(OpS390XFMOVDstore)
  9955  		v.AuxInt = off1 + off2
  9956  		v.Aux = mergeSym(sym1, sym2)
  9957  		v.AddArg(base)
  9958  		v.AddArg(val)
  9959  		v.AddArg(mem)
  9960  		return true
  9961  	}
  9962  	// match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
  9963  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
  9964  	// result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
  9965  	for {
  9966  		off1 := v.AuxInt
  9967  		sym1 := v.Aux
  9968  		mem := v.Args[2]
  9969  		v_0 := v.Args[0]
  9970  		if v_0.Op != OpS390XMOVDaddridx {
  9971  			break
  9972  		}
  9973  		off2 := v_0.AuxInt
  9974  		sym2 := v_0.Aux
  9975  		idx := v_0.Args[1]
  9976  		ptr := v_0.Args[0]
  9977  		val := v.Args[1]
  9978  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
  9979  			break
  9980  		}
  9981  		v.reset(OpS390XFMOVDstoreidx)
  9982  		v.AuxInt = off1 + off2
  9983  		v.Aux = mergeSym(sym1, sym2)
  9984  		v.AddArg(ptr)
  9985  		v.AddArg(idx)
  9986  		v.AddArg(val)
  9987  		v.AddArg(mem)
  9988  		return true
  9989  	}
  9990  	// match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem)
  9991  	// cond: ptr.Op != OpSB
  9992  	// result: (FMOVDstoreidx [off] {sym} ptr idx val mem)
  9993  	for {
  9994  		off := v.AuxInt
  9995  		sym := v.Aux
  9996  		mem := v.Args[2]
  9997  		v_0 := v.Args[0]
  9998  		if v_0.Op != OpS390XADD {
  9999  			break
 10000  		}
 10001  		idx := v_0.Args[1]
 10002  		ptr := v_0.Args[0]
 10003  		val := v.Args[1]
 10004  		if !(ptr.Op != OpSB) {
 10005  			break
 10006  		}
 10007  		v.reset(OpS390XFMOVDstoreidx)
 10008  		v.AuxInt = off
 10009  		v.Aux = sym
 10010  		v.AddArg(ptr)
 10011  		v.AddArg(idx)
 10012  		v.AddArg(val)
 10013  		v.AddArg(mem)
 10014  		return true
 10015  	}
 10016  	return false
 10017  }
 10018  func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool {
 10019  	// match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
 10020  	// cond: is20Bit(c+d)
 10021  	// result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem)
 10022  	for {
 10023  		c := v.AuxInt
 10024  		sym := v.Aux
 10025  		mem := v.Args[3]
 10026  		v_0 := v.Args[0]
 10027  		if v_0.Op != OpS390XADDconst {
 10028  			break
 10029  		}
 10030  		d := v_0.AuxInt
 10031  		ptr := v_0.Args[0]
 10032  		idx := v.Args[1]
 10033  		val := v.Args[2]
 10034  		if !(is20Bit(c + d)) {
 10035  			break
 10036  		}
 10037  		v.reset(OpS390XFMOVDstoreidx)
 10038  		v.AuxInt = c + d
 10039  		v.Aux = sym
 10040  		v.AddArg(ptr)
 10041  		v.AddArg(idx)
 10042  		v.AddArg(val)
 10043  		v.AddArg(mem)
 10044  		return true
 10045  	}
 10046  	// match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
 10047  	// cond: is20Bit(c+d)
 10048  	// result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem)
 10049  	for {
 10050  		c := v.AuxInt
 10051  		sym := v.Aux
 10052  		mem := v.Args[3]
 10053  		ptr := v.Args[0]
 10054  		v_1 := v.Args[1]
 10055  		if v_1.Op != OpS390XADDconst {
 10056  			break
 10057  		}
 10058  		d := v_1.AuxInt
 10059  		idx := v_1.Args[0]
 10060  		val := v.Args[2]
 10061  		if !(is20Bit(c + d)) {
 10062  			break
 10063  		}
 10064  		v.reset(OpS390XFMOVDstoreidx)
 10065  		v.AuxInt = c + d
 10066  		v.Aux = sym
 10067  		v.AddArg(ptr)
 10068  		v.AddArg(idx)
 10069  		v.AddArg(val)
 10070  		v.AddArg(mem)
 10071  		return true
 10072  	}
 10073  	return false
 10074  }
 10075  func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool {
 10076  	// match: (FMOVSload [off] {sym} ptr1 (FMOVSstore [off] {sym} ptr2 x _))
 10077  	// cond: isSamePtr(ptr1, ptr2)
 10078  	// result: x
 10079  	for {
 10080  		off := v.AuxInt
 10081  		sym := v.Aux
 10082  		_ = v.Args[1]
 10083  		ptr1 := v.Args[0]
 10084  		v_1 := v.Args[1]
 10085  		if v_1.Op != OpS390XFMOVSstore {
 10086  			break
 10087  		}
 10088  		if v_1.AuxInt != off {
 10089  			break
 10090  		}
 10091  		if v_1.Aux != sym {
 10092  			break
 10093  		}
 10094  		_ = v_1.Args[2]
 10095  		ptr2 := v_1.Args[0]
 10096  		x := v_1.Args[1]
 10097  		if !(isSamePtr(ptr1, ptr2)) {
 10098  			break
 10099  		}
 10100  		v.reset(OpCopy)
 10101  		v.Type = x.Type
 10102  		v.AddArg(x)
 10103  		return true
 10104  	}
 10105  	// match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem)
 10106  	// cond: is20Bit(off1+off2)
 10107  	// result: (FMOVSload [off1+off2] {sym} ptr mem)
 10108  	for {
 10109  		off1 := v.AuxInt
 10110  		sym := v.Aux
 10111  		mem := v.Args[1]
 10112  		v_0 := v.Args[0]
 10113  		if v_0.Op != OpS390XADDconst {
 10114  			break
 10115  		}
 10116  		off2 := v_0.AuxInt
 10117  		ptr := v_0.Args[0]
 10118  		if !(is20Bit(off1 + off2)) {
 10119  			break
 10120  		}
 10121  		v.reset(OpS390XFMOVSload)
 10122  		v.AuxInt = off1 + off2
 10123  		v.Aux = sym
 10124  		v.AddArg(ptr)
 10125  		v.AddArg(mem)
 10126  		return true
 10127  	}
 10128  	// match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
 10129  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 10130  	// result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem)
 10131  	for {
 10132  		off1 := v.AuxInt
 10133  		sym1 := v.Aux
 10134  		mem := v.Args[1]
 10135  		v_0 := v.Args[0]
 10136  		if v_0.Op != OpS390XMOVDaddr {
 10137  			break
 10138  		}
 10139  		off2 := v_0.AuxInt
 10140  		sym2 := v_0.Aux
 10141  		base := v_0.Args[0]
 10142  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 10143  			break
 10144  		}
 10145  		v.reset(OpS390XFMOVSload)
 10146  		v.AuxInt = off1 + off2
 10147  		v.Aux = mergeSym(sym1, sym2)
 10148  		v.AddArg(base)
 10149  		v.AddArg(mem)
 10150  		return true
 10151  	}
 10152  	// match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
 10153  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 10154  	// result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
 10155  	for {
 10156  		off1 := v.AuxInt
 10157  		sym1 := v.Aux
 10158  		mem := v.Args[1]
 10159  		v_0 := v.Args[0]
 10160  		if v_0.Op != OpS390XMOVDaddridx {
 10161  			break
 10162  		}
 10163  		off2 := v_0.AuxInt
 10164  		sym2 := v_0.Aux
 10165  		idx := v_0.Args[1]
 10166  		ptr := v_0.Args[0]
 10167  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 10168  			break
 10169  		}
 10170  		v.reset(OpS390XFMOVSloadidx)
 10171  		v.AuxInt = off1 + off2
 10172  		v.Aux = mergeSym(sym1, sym2)
 10173  		v.AddArg(ptr)
 10174  		v.AddArg(idx)
 10175  		v.AddArg(mem)
 10176  		return true
 10177  	}
 10178  	// match: (FMOVSload [off] {sym} (ADD ptr idx) mem)
 10179  	// cond: ptr.Op != OpSB
 10180  	// result: (FMOVSloadidx [off] {sym} ptr idx mem)
 10181  	for {
 10182  		off := v.AuxInt
 10183  		sym := v.Aux
 10184  		mem := v.Args[1]
 10185  		v_0 := v.Args[0]
 10186  		if v_0.Op != OpS390XADD {
 10187  			break
 10188  		}
 10189  		idx := v_0.Args[1]
 10190  		ptr := v_0.Args[0]
 10191  		if !(ptr.Op != OpSB) {
 10192  			break
 10193  		}
 10194  		v.reset(OpS390XFMOVSloadidx)
 10195  		v.AuxInt = off
 10196  		v.Aux = sym
 10197  		v.AddArg(ptr)
 10198  		v.AddArg(idx)
 10199  		v.AddArg(mem)
 10200  		return true
 10201  	}
 10202  	return false
 10203  }
 10204  func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool {
 10205  	// match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
 10206  	// cond: is20Bit(c+d)
 10207  	// result: (FMOVSloadidx [c+d] {sym} ptr idx mem)
 10208  	for {
 10209  		c := v.AuxInt
 10210  		sym := v.Aux
 10211  		mem := v.Args[2]
 10212  		v_0 := v.Args[0]
 10213  		if v_0.Op != OpS390XADDconst {
 10214  			break
 10215  		}
 10216  		d := v_0.AuxInt
 10217  		ptr := v_0.Args[0]
 10218  		idx := v.Args[1]
 10219  		if !(is20Bit(c + d)) {
 10220  			break
 10221  		}
 10222  		v.reset(OpS390XFMOVSloadidx)
 10223  		v.AuxInt = c + d
 10224  		v.Aux = sym
 10225  		v.AddArg(ptr)
 10226  		v.AddArg(idx)
 10227  		v.AddArg(mem)
 10228  		return true
 10229  	}
 10230  	// match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
 10231  	// cond: is20Bit(c+d)
 10232  	// result: (FMOVSloadidx [c+d] {sym} ptr idx mem)
 10233  	for {
 10234  		c := v.AuxInt
 10235  		sym := v.Aux
 10236  		mem := v.Args[2]
 10237  		ptr := v.Args[0]
 10238  		v_1 := v.Args[1]
 10239  		if v_1.Op != OpS390XADDconst {
 10240  			break
 10241  		}
 10242  		d := v_1.AuxInt
 10243  		idx := v_1.Args[0]
 10244  		if !(is20Bit(c + d)) {
 10245  			break
 10246  		}
 10247  		v.reset(OpS390XFMOVSloadidx)
 10248  		v.AuxInt = c + d
 10249  		v.Aux = sym
 10250  		v.AddArg(ptr)
 10251  		v.AddArg(idx)
 10252  		v.AddArg(mem)
 10253  		return true
 10254  	}
 10255  	return false
 10256  }
 10257  func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool {
 10258  	// match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem)
 10259  	// cond: is20Bit(off1+off2)
 10260  	// result: (FMOVSstore [off1+off2] {sym} ptr val mem)
 10261  	for {
 10262  		off1 := v.AuxInt
 10263  		sym := v.Aux
 10264  		mem := v.Args[2]
 10265  		v_0 := v.Args[0]
 10266  		if v_0.Op != OpS390XADDconst {
 10267  			break
 10268  		}
 10269  		off2 := v_0.AuxInt
 10270  		ptr := v_0.Args[0]
 10271  		val := v.Args[1]
 10272  		if !(is20Bit(off1 + off2)) {
 10273  			break
 10274  		}
 10275  		v.reset(OpS390XFMOVSstore)
 10276  		v.AuxInt = off1 + off2
 10277  		v.Aux = sym
 10278  		v.AddArg(ptr)
 10279  		v.AddArg(val)
 10280  		v.AddArg(mem)
 10281  		return true
 10282  	}
 10283  	// match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem)
 10284  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 10285  	// result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
 10286  	for {
 10287  		off1 := v.AuxInt
 10288  		sym1 := v.Aux
 10289  		mem := v.Args[2]
 10290  		v_0 := v.Args[0]
 10291  		if v_0.Op != OpS390XMOVDaddr {
 10292  			break
 10293  		}
 10294  		off2 := v_0.AuxInt
 10295  		sym2 := v_0.Aux
 10296  		base := v_0.Args[0]
 10297  		val := v.Args[1]
 10298  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 10299  			break
 10300  		}
 10301  		v.reset(OpS390XFMOVSstore)
 10302  		v.AuxInt = off1 + off2
 10303  		v.Aux = mergeSym(sym1, sym2)
 10304  		v.AddArg(base)
 10305  		v.AddArg(val)
 10306  		v.AddArg(mem)
 10307  		return true
 10308  	}
 10309  	// match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
 10310  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 10311  	// result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
 10312  	for {
 10313  		off1 := v.AuxInt
 10314  		sym1 := v.Aux
 10315  		mem := v.Args[2]
 10316  		v_0 := v.Args[0]
 10317  		if v_0.Op != OpS390XMOVDaddridx {
 10318  			break
 10319  		}
 10320  		off2 := v_0.AuxInt
 10321  		sym2 := v_0.Aux
 10322  		idx := v_0.Args[1]
 10323  		ptr := v_0.Args[0]
 10324  		val := v.Args[1]
 10325  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 10326  			break
 10327  		}
 10328  		v.reset(OpS390XFMOVSstoreidx)
 10329  		v.AuxInt = off1 + off2
 10330  		v.Aux = mergeSym(sym1, sym2)
 10331  		v.AddArg(ptr)
 10332  		v.AddArg(idx)
 10333  		v.AddArg(val)
 10334  		v.AddArg(mem)
 10335  		return true
 10336  	}
 10337  	// match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem)
 10338  	// cond: ptr.Op != OpSB
 10339  	// result: (FMOVSstoreidx [off] {sym} ptr idx val mem)
 10340  	for {
 10341  		off := v.AuxInt
 10342  		sym := v.Aux
 10343  		mem := v.Args[2]
 10344  		v_0 := v.Args[0]
 10345  		if v_0.Op != OpS390XADD {
 10346  			break
 10347  		}
 10348  		idx := v_0.Args[1]
 10349  		ptr := v_0.Args[0]
 10350  		val := v.Args[1]
 10351  		if !(ptr.Op != OpSB) {
 10352  			break
 10353  		}
 10354  		v.reset(OpS390XFMOVSstoreidx)
 10355  		v.AuxInt = off
 10356  		v.Aux = sym
 10357  		v.AddArg(ptr)
 10358  		v.AddArg(idx)
 10359  		v.AddArg(val)
 10360  		v.AddArg(mem)
 10361  		return true
 10362  	}
 10363  	return false
 10364  }
 10365  func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool {
 10366  	// match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
 10367  	// cond: is20Bit(c+d)
 10368  	// result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem)
 10369  	for {
 10370  		c := v.AuxInt
 10371  		sym := v.Aux
 10372  		mem := v.Args[3]
 10373  		v_0 := v.Args[0]
 10374  		if v_0.Op != OpS390XADDconst {
 10375  			break
 10376  		}
 10377  		d := v_0.AuxInt
 10378  		ptr := v_0.Args[0]
 10379  		idx := v.Args[1]
 10380  		val := v.Args[2]
 10381  		if !(is20Bit(c + d)) {
 10382  			break
 10383  		}
 10384  		v.reset(OpS390XFMOVSstoreidx)
 10385  		v.AuxInt = c + d
 10386  		v.Aux = sym
 10387  		v.AddArg(ptr)
 10388  		v.AddArg(idx)
 10389  		v.AddArg(val)
 10390  		v.AddArg(mem)
 10391  		return true
 10392  	}
 10393  	// match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
 10394  	// cond: is20Bit(c+d)
 10395  	// result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem)
 10396  	for {
 10397  		c := v.AuxInt
 10398  		sym := v.Aux
 10399  		mem := v.Args[3]
 10400  		ptr := v.Args[0]
 10401  		v_1 := v.Args[1]
 10402  		if v_1.Op != OpS390XADDconst {
 10403  			break
 10404  		}
 10405  		d := v_1.AuxInt
 10406  		idx := v_1.Args[0]
 10407  		val := v.Args[2]
 10408  		if !(is20Bit(c + d)) {
 10409  			break
 10410  		}
 10411  		v.reset(OpS390XFMOVSstoreidx)
 10412  		v.AuxInt = c + d
 10413  		v.Aux = sym
 10414  		v.AddArg(ptr)
 10415  		v.AddArg(idx)
 10416  		v.AddArg(val)
 10417  		v.AddArg(mem)
 10418  		return true
 10419  	}
 10420  	return false
 10421  }
 10422  func rewriteValueS390X_OpS390XFNEG_0(v *Value) bool {
 10423  	// match: (FNEG (LPDFR x))
 10424  	// cond:
 10425  	// result: (LNDFR x)
 10426  	for {
 10427  		v_0 := v.Args[0]
 10428  		if v_0.Op != OpS390XLPDFR {
 10429  			break
 10430  		}
 10431  		x := v_0.Args[0]
 10432  		v.reset(OpS390XLNDFR)
 10433  		v.AddArg(x)
 10434  		return true
 10435  	}
 10436  	// match: (FNEG (LNDFR x))
 10437  	// cond:
 10438  	// result: (LPDFR x)
 10439  	for {
 10440  		v_0 := v.Args[0]
 10441  		if v_0.Op != OpS390XLNDFR {
 10442  			break
 10443  		}
 10444  		x := v_0.Args[0]
 10445  		v.reset(OpS390XLPDFR)
 10446  		v.AddArg(x)
 10447  		return true
 10448  	}
 10449  	return false
 10450  }
 10451  func rewriteValueS390X_OpS390XFNEGS_0(v *Value) bool {
 10452  	// match: (FNEGS (LPDFR x))
 10453  	// cond:
 10454  	// result: (LNDFR x)
 10455  	for {
 10456  		v_0 := v.Args[0]
 10457  		if v_0.Op != OpS390XLPDFR {
 10458  			break
 10459  		}
 10460  		x := v_0.Args[0]
 10461  		v.reset(OpS390XLNDFR)
 10462  		v.AddArg(x)
 10463  		return true
 10464  	}
 10465  	// match: (FNEGS (LNDFR x))
 10466  	// cond:
 10467  	// result: (LPDFR x)
 10468  	for {
 10469  		v_0 := v.Args[0]
 10470  		if v_0.Op != OpS390XLNDFR {
 10471  			break
 10472  		}
 10473  		x := v_0.Args[0]
 10474  		v.reset(OpS390XLPDFR)
 10475  		v.AddArg(x)
 10476  		return true
 10477  	}
 10478  	return false
 10479  }
 10480  func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool {
 10481  	// match: (FSUB (FMUL y z) x)
 10482  	// cond:
 10483  	// result: (FMSUB x y z)
 10484  	for {
 10485  		x := v.Args[1]
 10486  		v_0 := v.Args[0]
 10487  		if v_0.Op != OpS390XFMUL {
 10488  			break
 10489  		}
 10490  		z := v_0.Args[1]
 10491  		y := v_0.Args[0]
 10492  		v.reset(OpS390XFMSUB)
 10493  		v.AddArg(x)
 10494  		v.AddArg(y)
 10495  		v.AddArg(z)
 10496  		return true
 10497  	}
 10498  	return false
 10499  }
 10500  func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool {
 10501  	// match: (FSUBS (FMULS y z) x)
 10502  	// cond:
 10503  	// result: (FMSUBS x y z)
 10504  	for {
 10505  		x := v.Args[1]
 10506  		v_0 := v.Args[0]
 10507  		if v_0.Op != OpS390XFMULS {
 10508  			break
 10509  		}
 10510  		z := v_0.Args[1]
 10511  		y := v_0.Args[0]
 10512  		v.reset(OpS390XFMSUBS)
 10513  		v.AddArg(x)
 10514  		v.AddArg(y)
 10515  		v.AddArg(z)
 10516  		return true
 10517  	}
 10518  	return false
 10519  }
 10520  func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool {
 10521  	b := v.Block
 10522  	// match: (LDGR <t> (SRDconst [1] (SLDconst [1] x)))
 10523  	// cond:
 10524  	// result: (LPDFR (LDGR <t> x))
 10525  	for {
 10526  		t := v.Type
 10527  		v_0 := v.Args[0]
 10528  		if v_0.Op != OpS390XSRDconst {
 10529  			break
 10530  		}
 10531  		if v_0.AuxInt != 1 {
 10532  			break
 10533  		}
 10534  		v_0_0 := v_0.Args[0]
 10535  		if v_0_0.Op != OpS390XSLDconst {
 10536  			break
 10537  		}
 10538  		if v_0_0.AuxInt != 1 {
 10539  			break
 10540  		}
 10541  		x := v_0_0.Args[0]
 10542  		v.reset(OpS390XLPDFR)
 10543  		v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
 10544  		v0.AddArg(x)
 10545  		v.AddArg(v0)
 10546  		return true
 10547  	}
 10548  	// match: (LDGR <t> (OR (MOVDconst [-1<<63]) x))
 10549  	// cond:
 10550  	// result: (LNDFR (LDGR <t> x))
 10551  	for {
 10552  		t := v.Type
 10553  		v_0 := v.Args[0]
 10554  		if v_0.Op != OpS390XOR {
 10555  			break
 10556  		}
 10557  		x := v_0.Args[1]
 10558  		v_0_0 := v_0.Args[0]
 10559  		if v_0_0.Op != OpS390XMOVDconst {
 10560  			break
 10561  		}
 10562  		if v_0_0.AuxInt != -1<<63 {
 10563  			break
 10564  		}
 10565  		v.reset(OpS390XLNDFR)
 10566  		v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
 10567  		v0.AddArg(x)
 10568  		v.AddArg(v0)
 10569  		return true
 10570  	}
 10571  	// match: (LDGR <t> (OR x (MOVDconst [-1<<63])))
 10572  	// cond:
 10573  	// result: (LNDFR (LDGR <t> x))
 10574  	for {
 10575  		t := v.Type
 10576  		v_0 := v.Args[0]
 10577  		if v_0.Op != OpS390XOR {
 10578  			break
 10579  		}
 10580  		_ = v_0.Args[1]
 10581  		x := v_0.Args[0]
 10582  		v_0_1 := v_0.Args[1]
 10583  		if v_0_1.Op != OpS390XMOVDconst {
 10584  			break
 10585  		}
 10586  		if v_0_1.AuxInt != -1<<63 {
 10587  			break
 10588  		}
 10589  		v.reset(OpS390XLNDFR)
 10590  		v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
 10591  		v0.AddArg(x)
 10592  		v.AddArg(v0)
 10593  		return true
 10594  	}
 10595  	// match: (LDGR <t> x:(ORload <t1> [off] {sym} (MOVDconst [-1<<63]) ptr mem))
 10596  	// cond: x.Uses == 1 && clobber(x)
 10597  	// result: @x.Block (LNDFR <t> (LDGR <t> (MOVDload <t1> [off] {sym} ptr mem)))
 10598  	for {
 10599  		t := v.Type
 10600  		x := v.Args[0]
 10601  		if x.Op != OpS390XORload {
 10602  			break
 10603  		}
 10604  		t1 := x.Type
 10605  		off := x.AuxInt
 10606  		sym := x.Aux
 10607  		mem := x.Args[2]
 10608  		x_0 := x.Args[0]
 10609  		if x_0.Op != OpS390XMOVDconst {
 10610  			break
 10611  		}
 10612  		if x_0.AuxInt != -1<<63 {
 10613  			break
 10614  		}
 10615  		ptr := x.Args[1]
 10616  		if !(x.Uses == 1 && clobber(x)) {
 10617  			break
 10618  		}
 10619  		b = x.Block
 10620  		v0 := b.NewValue0(x.Pos, OpS390XLNDFR, t)
 10621  		v.reset(OpCopy)
 10622  		v.AddArg(v0)
 10623  		v1 := b.NewValue0(x.Pos, OpS390XLDGR, t)
 10624  		v2 := b.NewValue0(x.Pos, OpS390XMOVDload, t1)
 10625  		v2.AuxInt = off
 10626  		v2.Aux = sym
 10627  		v2.AddArg(ptr)
 10628  		v2.AddArg(mem)
 10629  		v1.AddArg(v2)
 10630  		v0.AddArg(v1)
 10631  		return true
 10632  	}
 10633  	// match: (LDGR (LGDR x))
 10634  	// cond:
 10635  	// result: x
 10636  	for {
 10637  		v_0 := v.Args[0]
 10638  		if v_0.Op != OpS390XLGDR {
 10639  			break
 10640  		}
 10641  		x := v_0.Args[0]
 10642  		v.reset(OpCopy)
 10643  		v.Type = x.Type
 10644  		v.AddArg(x)
 10645  		return true
 10646  	}
 10647  	return false
 10648  }
 10649  func rewriteValueS390X_OpS390XLEDBR_0(v *Value) bool {
 10650  	// match: (LEDBR (LPDFR (LDEBR x)))
 10651  	// cond:
 10652  	// result: (LPDFR x)
 10653  	for {
 10654  		v_0 := v.Args[0]
 10655  		if v_0.Op != OpS390XLPDFR {
 10656  			break
 10657  		}
 10658  		v_0_0 := v_0.Args[0]
 10659  		if v_0_0.Op != OpS390XLDEBR {
 10660  			break
 10661  		}
 10662  		x := v_0_0.Args[0]
 10663  		v.reset(OpS390XLPDFR)
 10664  		v.AddArg(x)
 10665  		return true
 10666  	}
 10667  	// match: (LEDBR (LNDFR (LDEBR x)))
 10668  	// cond:
 10669  	// result: (LNDFR x)
 10670  	for {
 10671  		v_0 := v.Args[0]
 10672  		if v_0.Op != OpS390XLNDFR {
 10673  			break
 10674  		}
 10675  		v_0_0 := v_0.Args[0]
 10676  		if v_0_0.Op != OpS390XLDEBR {
 10677  			break
 10678  		}
 10679  		x := v_0_0.Args[0]
 10680  		v.reset(OpS390XLNDFR)
 10681  		v.AddArg(x)
 10682  		return true
 10683  	}
 10684  	return false
 10685  }
 10686  func rewriteValueS390X_OpS390XLGDR_0(v *Value) bool {
 10687  	// match: (LGDR (LDGR x))
 10688  	// cond:
 10689  	// result: (MOVDreg x)
 10690  	for {
 10691  		v_0 := v.Args[0]
 10692  		if v_0.Op != OpS390XLDGR {
 10693  			break
 10694  		}
 10695  		x := v_0.Args[0]
 10696  		v.reset(OpS390XMOVDreg)
 10697  		v.AddArg(x)
 10698  		return true
 10699  	}
 10700  	return false
 10701  }
 10702  func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool {
 10703  	// match: (LoweredRound32F x:(FMOVSconst))
 10704  	// cond:
 10705  	// result: x
 10706  	for {
 10707  		x := v.Args[0]
 10708  		if x.Op != OpS390XFMOVSconst {
 10709  			break
 10710  		}
 10711  		v.reset(OpCopy)
 10712  		v.Type = x.Type
 10713  		v.AddArg(x)
 10714  		return true
 10715  	}
 10716  	return false
 10717  }
 10718  func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool {
 10719  	// match: (LoweredRound64F x:(FMOVDconst))
 10720  	// cond:
 10721  	// result: x
 10722  	for {
 10723  		x := v.Args[0]
 10724  		if x.Op != OpS390XFMOVDconst {
 10725  			break
 10726  		}
 10727  		v.reset(OpCopy)
 10728  		v.Type = x.Type
 10729  		v.AddArg(x)
 10730  		return true
 10731  	}
 10732  	return false
 10733  }
 10734  func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool {
 10735  	// match: (MOVBZload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _))
 10736  	// cond: isSamePtr(ptr1, ptr2)
 10737  	// result: (MOVBZreg x)
 10738  	for {
 10739  		off := v.AuxInt
 10740  		sym := v.Aux
 10741  		_ = v.Args[1]
 10742  		ptr1 := v.Args[0]
 10743  		v_1 := v.Args[1]
 10744  		if v_1.Op != OpS390XMOVBstore {
 10745  			break
 10746  		}
 10747  		if v_1.AuxInt != off {
 10748  			break
 10749  		}
 10750  		if v_1.Aux != sym {
 10751  			break
 10752  		}
 10753  		_ = v_1.Args[2]
 10754  		ptr2 := v_1.Args[0]
 10755  		x := v_1.Args[1]
 10756  		if !(isSamePtr(ptr1, ptr2)) {
 10757  			break
 10758  		}
 10759  		v.reset(OpS390XMOVBZreg)
 10760  		v.AddArg(x)
 10761  		return true
 10762  	}
 10763  	// match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem)
 10764  	// cond: is20Bit(off1+off2)
 10765  	// result: (MOVBZload [off1+off2] {sym} ptr mem)
 10766  	for {
 10767  		off1 := v.AuxInt
 10768  		sym := v.Aux
 10769  		mem := v.Args[1]
 10770  		v_0 := v.Args[0]
 10771  		if v_0.Op != OpS390XADDconst {
 10772  			break
 10773  		}
 10774  		off2 := v_0.AuxInt
 10775  		ptr := v_0.Args[0]
 10776  		if !(is20Bit(off1 + off2)) {
 10777  			break
 10778  		}
 10779  		v.reset(OpS390XMOVBZload)
 10780  		v.AuxInt = off1 + off2
 10781  		v.Aux = sym
 10782  		v.AddArg(ptr)
 10783  		v.AddArg(mem)
 10784  		return true
 10785  	}
 10786  	// match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
 10787  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 10788  	// result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem)
 10789  	for {
 10790  		off1 := v.AuxInt
 10791  		sym1 := v.Aux
 10792  		mem := v.Args[1]
 10793  		v_0 := v.Args[0]
 10794  		if v_0.Op != OpS390XMOVDaddr {
 10795  			break
 10796  		}
 10797  		off2 := v_0.AuxInt
 10798  		sym2 := v_0.Aux
 10799  		base := v_0.Args[0]
 10800  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 10801  			break
 10802  		}
 10803  		v.reset(OpS390XMOVBZload)
 10804  		v.AuxInt = off1 + off2
 10805  		v.Aux = mergeSym(sym1, sym2)
 10806  		v.AddArg(base)
 10807  		v.AddArg(mem)
 10808  		return true
 10809  	}
 10810  	// match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
 10811  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 10812  	// result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
 10813  	for {
 10814  		off1 := v.AuxInt
 10815  		sym1 := v.Aux
 10816  		mem := v.Args[1]
 10817  		v_0 := v.Args[0]
 10818  		if v_0.Op != OpS390XMOVDaddridx {
 10819  			break
 10820  		}
 10821  		off2 := v_0.AuxInt
 10822  		sym2 := v_0.Aux
 10823  		idx := v_0.Args[1]
 10824  		ptr := v_0.Args[0]
 10825  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 10826  			break
 10827  		}
 10828  		v.reset(OpS390XMOVBZloadidx)
 10829  		v.AuxInt = off1 + off2
 10830  		v.Aux = mergeSym(sym1, sym2)
 10831  		v.AddArg(ptr)
 10832  		v.AddArg(idx)
 10833  		v.AddArg(mem)
 10834  		return true
 10835  	}
 10836  	// match: (MOVBZload [off] {sym} (ADD ptr idx) mem)
 10837  	// cond: ptr.Op != OpSB
 10838  	// result: (MOVBZloadidx [off] {sym} ptr idx mem)
 10839  	for {
 10840  		off := v.AuxInt
 10841  		sym := v.Aux
 10842  		mem := v.Args[1]
 10843  		v_0 := v.Args[0]
 10844  		if v_0.Op != OpS390XADD {
 10845  			break
 10846  		}
 10847  		idx := v_0.Args[1]
 10848  		ptr := v_0.Args[0]
 10849  		if !(ptr.Op != OpSB) {
 10850  			break
 10851  		}
 10852  		v.reset(OpS390XMOVBZloadidx)
 10853  		v.AuxInt = off
 10854  		v.Aux = sym
 10855  		v.AddArg(ptr)
 10856  		v.AddArg(idx)
 10857  		v.AddArg(mem)
 10858  		return true
 10859  	}
 10860  	return false
 10861  }
 10862  func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool {
 10863  	// match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
 10864  	// cond: is20Bit(c+d)
 10865  	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
 10866  	for {
 10867  		c := v.AuxInt
 10868  		sym := v.Aux
 10869  		mem := v.Args[2]
 10870  		v_0 := v.Args[0]
 10871  		if v_0.Op != OpS390XADDconst {
 10872  			break
 10873  		}
 10874  		d := v_0.AuxInt
 10875  		ptr := v_0.Args[0]
 10876  		idx := v.Args[1]
 10877  		if !(is20Bit(c + d)) {
 10878  			break
 10879  		}
 10880  		v.reset(OpS390XMOVBZloadidx)
 10881  		v.AuxInt = c + d
 10882  		v.Aux = sym
 10883  		v.AddArg(ptr)
 10884  		v.AddArg(idx)
 10885  		v.AddArg(mem)
 10886  		return true
 10887  	}
 10888  	// match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
 10889  	// cond: is20Bit(c+d)
 10890  	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
 10891  	for {
 10892  		c := v.AuxInt
 10893  		sym := v.Aux
 10894  		mem := v.Args[2]
 10895  		idx := v.Args[0]
 10896  		v_1 := v.Args[1]
 10897  		if v_1.Op != OpS390XADDconst {
 10898  			break
 10899  		}
 10900  		d := v_1.AuxInt
 10901  		ptr := v_1.Args[0]
 10902  		if !(is20Bit(c + d)) {
 10903  			break
 10904  		}
 10905  		v.reset(OpS390XMOVBZloadidx)
 10906  		v.AuxInt = c + d
 10907  		v.Aux = sym
 10908  		v.AddArg(ptr)
 10909  		v.AddArg(idx)
 10910  		v.AddArg(mem)
 10911  		return true
 10912  	}
 10913  	// match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
 10914  	// cond: is20Bit(c+d)
 10915  	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
 10916  	for {
 10917  		c := v.AuxInt
 10918  		sym := v.Aux
 10919  		mem := v.Args[2]
 10920  		ptr := v.Args[0]
 10921  		v_1 := v.Args[1]
 10922  		if v_1.Op != OpS390XADDconst {
 10923  			break
 10924  		}
 10925  		d := v_1.AuxInt
 10926  		idx := v_1.Args[0]
 10927  		if !(is20Bit(c + d)) {
 10928  			break
 10929  		}
 10930  		v.reset(OpS390XMOVBZloadidx)
 10931  		v.AuxInt = c + d
 10932  		v.Aux = sym
 10933  		v.AddArg(ptr)
 10934  		v.AddArg(idx)
 10935  		v.AddArg(mem)
 10936  		return true
 10937  	}
 10938  	// match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
 10939  	// cond: is20Bit(c+d)
 10940  	// result: (MOVBZloadidx [c+d] {sym} ptr idx mem)
 10941  	for {
 10942  		c := v.AuxInt
 10943  		sym := v.Aux
 10944  		mem := v.Args[2]
 10945  		v_0 := v.Args[0]
 10946  		if v_0.Op != OpS390XADDconst {
 10947  			break
 10948  		}
 10949  		d := v_0.AuxInt
 10950  		idx := v_0.Args[0]
 10951  		ptr := v.Args[1]
 10952  		if !(is20Bit(c + d)) {
 10953  			break
 10954  		}
 10955  		v.reset(OpS390XMOVBZloadidx)
 10956  		v.AuxInt = c + d
 10957  		v.Aux = sym
 10958  		v.AddArg(ptr)
 10959  		v.AddArg(idx)
 10960  		v.AddArg(mem)
 10961  		return true
 10962  	}
 10963  	return false
 10964  }
 10965  func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool {
 10966  	// match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _))
 10967  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 10968  	// result: (MOVDreg x)
 10969  	for {
 10970  		x := v.Args[0]
 10971  		if x.Op != OpS390XMOVDLT {
 10972  			break
 10973  		}
 10974  		_ = x.Args[2]
 10975  		x_0 := x.Args[0]
 10976  		if x_0.Op != OpS390XMOVDconst {
 10977  			break
 10978  		}
 10979  		c := x_0.AuxInt
 10980  		x_1 := x.Args[1]
 10981  		if x_1.Op != OpS390XMOVDconst {
 10982  			break
 10983  		}
 10984  		d := x_1.AuxInt
 10985  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 10986  			break
 10987  		}
 10988  		v.reset(OpS390XMOVDreg)
 10989  		v.AddArg(x)
 10990  		return true
 10991  	}
 10992  	// match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _))
 10993  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 10994  	// result: (MOVDreg x)
 10995  	for {
 10996  		x := v.Args[0]
 10997  		if x.Op != OpS390XMOVDLE {
 10998  			break
 10999  		}
 11000  		_ = x.Args[2]
 11001  		x_0 := x.Args[0]
 11002  		if x_0.Op != OpS390XMOVDconst {
 11003  			break
 11004  		}
 11005  		c := x_0.AuxInt
 11006  		x_1 := x.Args[1]
 11007  		if x_1.Op != OpS390XMOVDconst {
 11008  			break
 11009  		}
 11010  		d := x_1.AuxInt
 11011  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11012  			break
 11013  		}
 11014  		v.reset(OpS390XMOVDreg)
 11015  		v.AddArg(x)
 11016  		return true
 11017  	}
 11018  	// match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _))
 11019  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 11020  	// result: (MOVDreg x)
 11021  	for {
 11022  		x := v.Args[0]
 11023  		if x.Op != OpS390XMOVDGT {
 11024  			break
 11025  		}
 11026  		_ = x.Args[2]
 11027  		x_0 := x.Args[0]
 11028  		if x_0.Op != OpS390XMOVDconst {
 11029  			break
 11030  		}
 11031  		c := x_0.AuxInt
 11032  		x_1 := x.Args[1]
 11033  		if x_1.Op != OpS390XMOVDconst {
 11034  			break
 11035  		}
 11036  		d := x_1.AuxInt
 11037  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11038  			break
 11039  		}
 11040  		v.reset(OpS390XMOVDreg)
 11041  		v.AddArg(x)
 11042  		return true
 11043  	}
 11044  	// match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _))
 11045  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 11046  	// result: (MOVDreg x)
 11047  	for {
 11048  		x := v.Args[0]
 11049  		if x.Op != OpS390XMOVDGE {
 11050  			break
 11051  		}
 11052  		_ = x.Args[2]
 11053  		x_0 := x.Args[0]
 11054  		if x_0.Op != OpS390XMOVDconst {
 11055  			break
 11056  		}
 11057  		c := x_0.AuxInt
 11058  		x_1 := x.Args[1]
 11059  		if x_1.Op != OpS390XMOVDconst {
 11060  			break
 11061  		}
 11062  		d := x_1.AuxInt
 11063  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11064  			break
 11065  		}
 11066  		v.reset(OpS390XMOVDreg)
 11067  		v.AddArg(x)
 11068  		return true
 11069  	}
 11070  	// match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _))
 11071  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 11072  	// result: (MOVDreg x)
 11073  	for {
 11074  		x := v.Args[0]
 11075  		if x.Op != OpS390XMOVDEQ {
 11076  			break
 11077  		}
 11078  		_ = x.Args[2]
 11079  		x_0 := x.Args[0]
 11080  		if x_0.Op != OpS390XMOVDconst {
 11081  			break
 11082  		}
 11083  		c := x_0.AuxInt
 11084  		x_1 := x.Args[1]
 11085  		if x_1.Op != OpS390XMOVDconst {
 11086  			break
 11087  		}
 11088  		d := x_1.AuxInt
 11089  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11090  			break
 11091  		}
 11092  		v.reset(OpS390XMOVDreg)
 11093  		v.AddArg(x)
 11094  		return true
 11095  	}
 11096  	// match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _))
 11097  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 11098  	// result: (MOVDreg x)
 11099  	for {
 11100  		x := v.Args[0]
 11101  		if x.Op != OpS390XMOVDNE {
 11102  			break
 11103  		}
 11104  		_ = x.Args[2]
 11105  		x_0 := x.Args[0]
 11106  		if x_0.Op != OpS390XMOVDconst {
 11107  			break
 11108  		}
 11109  		c := x_0.AuxInt
 11110  		x_1 := x.Args[1]
 11111  		if x_1.Op != OpS390XMOVDconst {
 11112  			break
 11113  		}
 11114  		d := x_1.AuxInt
 11115  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11116  			break
 11117  		}
 11118  		v.reset(OpS390XMOVDreg)
 11119  		v.AddArg(x)
 11120  		return true
 11121  	}
 11122  	// match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _))
 11123  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 11124  	// result: (MOVDreg x)
 11125  	for {
 11126  		x := v.Args[0]
 11127  		if x.Op != OpS390XMOVDGTnoinv {
 11128  			break
 11129  		}
 11130  		_ = x.Args[2]
 11131  		x_0 := x.Args[0]
 11132  		if x_0.Op != OpS390XMOVDconst {
 11133  			break
 11134  		}
 11135  		c := x_0.AuxInt
 11136  		x_1 := x.Args[1]
 11137  		if x_1.Op != OpS390XMOVDconst {
 11138  			break
 11139  		}
 11140  		d := x_1.AuxInt
 11141  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11142  			break
 11143  		}
 11144  		v.reset(OpS390XMOVDreg)
 11145  		v.AddArg(x)
 11146  		return true
 11147  	}
 11148  	// match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _))
 11149  	// cond: int64(uint8(c)) == c && int64(uint8(d)) == d
 11150  	// result: (MOVDreg x)
 11151  	for {
 11152  		x := v.Args[0]
 11153  		if x.Op != OpS390XMOVDGEnoinv {
 11154  			break
 11155  		}
 11156  		_ = x.Args[2]
 11157  		x_0 := x.Args[0]
 11158  		if x_0.Op != OpS390XMOVDconst {
 11159  			break
 11160  		}
 11161  		c := x_0.AuxInt
 11162  		x_1 := x.Args[1]
 11163  		if x_1.Op != OpS390XMOVDconst {
 11164  			break
 11165  		}
 11166  		d := x_1.AuxInt
 11167  		if !(int64(uint8(c)) == c && int64(uint8(d)) == d) {
 11168  			break
 11169  		}
 11170  		v.reset(OpS390XMOVDreg)
 11171  		v.AddArg(x)
 11172  		return true
 11173  	}
 11174  	// match: (MOVBZreg x:(MOVBZload _ _))
 11175  	// cond:
 11176  	// result: (MOVDreg x)
 11177  	for {
 11178  		x := v.Args[0]
 11179  		if x.Op != OpS390XMOVBZload {
 11180  			break
 11181  		}
 11182  		_ = x.Args[1]
 11183  		v.reset(OpS390XMOVDreg)
 11184  		v.AddArg(x)
 11185  		return true
 11186  	}
 11187  	// match: (MOVBZreg x:(Arg <t>))
 11188  	// cond: is8BitInt(t) && !isSigned(t)
 11189  	// result: (MOVDreg x)
 11190  	for {
 11191  		x := v.Args[0]
 11192  		if x.Op != OpArg {
 11193  			break
 11194  		}
 11195  		t := x.Type
 11196  		if !(is8BitInt(t) && !isSigned(t)) {
 11197  			break
 11198  		}
 11199  		v.reset(OpS390XMOVDreg)
 11200  		v.AddArg(x)
 11201  		return true
 11202  	}
 11203  	return false
 11204  }
 11205  func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool {
 11206  	b := v.Block
 11207  	typ := &b.Func.Config.Types
 11208  	// match: (MOVBZreg x:(MOVBZreg _))
 11209  	// cond:
 11210  	// result: (MOVDreg x)
 11211  	for {
 11212  		x := v.Args[0]
 11213  		if x.Op != OpS390XMOVBZreg {
 11214  			break
 11215  		}
 11216  		v.reset(OpS390XMOVDreg)
 11217  		v.AddArg(x)
 11218  		return true
 11219  	}
 11220  	// match: (MOVBZreg (MOVBreg x))
 11221  	// cond:
 11222  	// result: (MOVBZreg x)
 11223  	for {
 11224  		v_0 := v.Args[0]
 11225  		if v_0.Op != OpS390XMOVBreg {
 11226  			break
 11227  		}
 11228  		x := v_0.Args[0]
 11229  		v.reset(OpS390XMOVBZreg)
 11230  		v.AddArg(x)
 11231  		return true
 11232  	}
 11233  	// match: (MOVBZreg (MOVDconst [c]))
 11234  	// cond:
 11235  	// result: (MOVDconst [int64(uint8(c))])
 11236  	for {
 11237  		v_0 := v.Args[0]
 11238  		if v_0.Op != OpS390XMOVDconst {
 11239  			break
 11240  		}
 11241  		c := v_0.AuxInt
 11242  		v.reset(OpS390XMOVDconst)
 11243  		v.AuxInt = int64(uint8(c))
 11244  		return true
 11245  	}
 11246  	// match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem))
 11247  	// cond: x.Uses == 1 && clobber(x)
 11248  	// result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem)
 11249  	for {
 11250  		x := v.Args[0]
 11251  		if x.Op != OpS390XMOVBZload {
 11252  			break
 11253  		}
 11254  		off := x.AuxInt
 11255  		sym := x.Aux
 11256  		mem := x.Args[1]
 11257  		ptr := x.Args[0]
 11258  		if !(x.Uses == 1 && clobber(x)) {
 11259  			break
 11260  		}
 11261  		b = x.Block
 11262  		v0 := b.NewValue0(x.Pos, OpS390XMOVBZload, v.Type)
 11263  		v.reset(OpCopy)
 11264  		v.AddArg(v0)
 11265  		v0.AuxInt = off
 11266  		v0.Aux = sym
 11267  		v0.AddArg(ptr)
 11268  		v0.AddArg(mem)
 11269  		return true
 11270  	}
 11271  	// match: (MOVBZreg x:(MOVBload [off] {sym} ptr mem))
 11272  	// cond: x.Uses == 1 && clobber(x)
 11273  	// result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem)
 11274  	for {
 11275  		x := v.Args[0]
 11276  		if x.Op != OpS390XMOVBload {
 11277  			break
 11278  		}
 11279  		off := x.AuxInt
 11280  		sym := x.Aux
 11281  		mem := x.Args[1]
 11282  		ptr := x.Args[0]
 11283  		if !(x.Uses == 1 && clobber(x)) {
 11284  			break
 11285  		}
 11286  		b = x.Block
 11287  		v0 := b.NewValue0(x.Pos, OpS390XMOVBZload, v.Type)
 11288  		v.reset(OpCopy)
 11289  		v.AddArg(v0)
 11290  		v0.AuxInt = off
 11291  		v0.Aux = sym
 11292  		v0.AddArg(ptr)
 11293  		v0.AddArg(mem)
 11294  		return true
 11295  	}
 11296  	// match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem))
 11297  	// cond: x.Uses == 1 && clobber(x)
 11298  	// result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem)
 11299  	for {
 11300  		x := v.Args[0]
 11301  		if x.Op != OpS390XMOVBZloadidx {
 11302  			break
 11303  		}
 11304  		off := x.AuxInt
 11305  		sym := x.Aux
 11306  		mem := x.Args[2]
 11307  		ptr := x.Args[0]
 11308  		idx := x.Args[1]
 11309  		if !(x.Uses == 1 && clobber(x)) {
 11310  			break
 11311  		}
 11312  		b = x.Block
 11313  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type)
 11314  		v.reset(OpCopy)
 11315  		v.AddArg(v0)
 11316  		v0.AuxInt = off
 11317  		v0.Aux = sym
 11318  		v0.AddArg(ptr)
 11319  		v0.AddArg(idx)
 11320  		v0.AddArg(mem)
 11321  		return true
 11322  	}
 11323  	// match: (MOVBZreg x:(MOVBloadidx [off] {sym} ptr idx mem))
 11324  	// cond: x.Uses == 1 && clobber(x)
 11325  	// result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem)
 11326  	for {
 11327  		x := v.Args[0]
 11328  		if x.Op != OpS390XMOVBloadidx {
 11329  			break
 11330  		}
 11331  		off := x.AuxInt
 11332  		sym := x.Aux
 11333  		mem := x.Args[2]
 11334  		ptr := x.Args[0]
 11335  		idx := x.Args[1]
 11336  		if !(x.Uses == 1 && clobber(x)) {
 11337  			break
 11338  		}
 11339  		b = x.Block
 11340  		v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type)
 11341  		v.reset(OpCopy)
 11342  		v.AddArg(v0)
 11343  		v0.AuxInt = off
 11344  		v0.Aux = sym
 11345  		v0.AddArg(ptr)
 11346  		v0.AddArg(idx)
 11347  		v0.AddArg(mem)
 11348  		return true
 11349  	}
 11350  	// match: (MOVBZreg (ANDWconst [m] x))
 11351  	// cond:
 11352  	// result: (MOVWZreg (ANDWconst <typ.UInt32> [int64( uint8(m))] x))
 11353  	for {
 11354  		v_0 := v.Args[0]
 11355  		if v_0.Op != OpS390XANDWconst {
 11356  			break
 11357  		}
 11358  		m := v_0.AuxInt
 11359  		x := v_0.Args[0]
 11360  		v.reset(OpS390XMOVWZreg)
 11361  		v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32)
 11362  		v0.AuxInt = int64(uint8(m))
 11363  		v0.AddArg(x)
 11364  		v.AddArg(v0)
 11365  		return true
 11366  	}
 11367  	return false
 11368  }
 11369  func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool {
 11370  	// match: (MOVBload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _))
 11371  	// cond: isSamePtr(ptr1, ptr2)
 11372  	// result: (MOVBreg x)
 11373  	for {
 11374  		off := v.AuxInt
 11375  		sym := v.Aux
 11376  		_ = v.Args[1]
 11377  		ptr1 := v.Args[0]
 11378  		v_1 := v.Args[1]
 11379  		if v_1.Op != OpS390XMOVBstore {
 11380  			break
 11381  		}
 11382  		if v_1.AuxInt != off {
 11383  			break
 11384  		}
 11385  		if v_1.Aux != sym {
 11386  			break
 11387  		}
 11388  		_ = v_1.Args[2]
 11389  		ptr2 := v_1.Args[0]
 11390  		x := v_1.Args[1]
 11391  		if !(isSamePtr(ptr1, ptr2)) {
 11392  			break
 11393  		}
 11394  		v.reset(OpS390XMOVBreg)
 11395  		v.AddArg(x)
 11396  		return true
 11397  	}
 11398  	// match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem)
 11399  	// cond: is20Bit(off1+off2)
 11400  	// result: (MOVBload [off1+off2] {sym} ptr mem)
 11401  	for {
 11402  		off1 := v.AuxInt
 11403  		sym := v.Aux
 11404  		mem := v.Args[1]
 11405  		v_0 := v.Args[0]
 11406  		if v_0.Op != OpS390XADDconst {
 11407  			break
 11408  		}
 11409  		off2 := v_0.AuxInt
 11410  		ptr := v_0.Args[0]
 11411  		if !(is20Bit(off1 + off2)) {
 11412  			break
 11413  		}
 11414  		v.reset(OpS390XMOVBload)
 11415  		v.AuxInt = off1 + off2
 11416  		v.Aux = sym
 11417  		v.AddArg(ptr)
 11418  		v.AddArg(mem)
 11419  		return true
 11420  	}
 11421  	// match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem)
 11422  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 11423  	// result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem)
 11424  	for {
 11425  		off1 := v.AuxInt
 11426  		sym1 := v.Aux
 11427  		mem := v.Args[1]
 11428  		v_0 := v.Args[0]
 11429  		if v_0.Op != OpS390XMOVDaddr {
 11430  			break
 11431  		}
 11432  		off2 := v_0.AuxInt
 11433  		sym2 := v_0.Aux
 11434  		base := v_0.Args[0]
 11435  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 11436  			break
 11437  		}
 11438  		v.reset(OpS390XMOVBload)
 11439  		v.AuxInt = off1 + off2
 11440  		v.Aux = mergeSym(sym1, sym2)
 11441  		v.AddArg(base)
 11442  		v.AddArg(mem)
 11443  		return true
 11444  	}
 11445  	// match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem)
 11446  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 11447  	// result: (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem)
 11448  	for {
 11449  		off1 := v.AuxInt
 11450  		sym1 := v.Aux
 11451  		mem := v.Args[1]
 11452  		v_0 := v.Args[0]
 11453  		if v_0.Op != OpS390XMOVDaddridx {
 11454  			break
 11455  		}
 11456  		off2 := v_0.AuxInt
 11457  		sym2 := v_0.Aux
 11458  		idx := v_0.Args[1]
 11459  		ptr := v_0.Args[0]
 11460  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 11461  			break
 11462  		}
 11463  		v.reset(OpS390XMOVBloadidx)
 11464  		v.AuxInt = off1 + off2
 11465  		v.Aux = mergeSym(sym1, sym2)
 11466  		v.AddArg(ptr)
 11467  		v.AddArg(idx)
 11468  		v.AddArg(mem)
 11469  		return true
 11470  	}
 11471  	// match: (MOVBload [off] {sym} (ADD ptr idx) mem)
 11472  	// cond: ptr.Op != OpSB
 11473  	// result: (MOVBloadidx [off] {sym} ptr idx mem)
 11474  	for {
 11475  		off := v.AuxInt
 11476  		sym := v.Aux
 11477  		mem := v.Args[1]
 11478  		v_0 := v.Args[0]
 11479  		if v_0.Op != OpS390XADD {
 11480  			break
 11481  		}
 11482  		idx := v_0.Args[1]
 11483  		ptr := v_0.Args[0]
 11484  		if !(ptr.Op != OpSB) {
 11485  			break
 11486  		}
 11487  		v.reset(OpS390XMOVBloadidx)
 11488  		v.AuxInt = off
 11489  		v.Aux = sym
 11490  		v.AddArg(ptr)
 11491  		v.AddArg(idx)
 11492  		v.AddArg(mem)
 11493  		return true
 11494  	}
 11495  	return false
 11496  }
 11497  func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool {
 11498  	// match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem)
 11499  	// cond: is20Bit(c+d)
 11500  	// result: (MOVBloadidx [c+d] {sym} ptr idx mem)
 11501  	for {
 11502  		c := v.AuxInt
 11503  		sym := v.Aux
 11504  		mem := v.Args[2]
 11505  		v_0 := v.Args[0]
 11506  		if v_0.Op != OpS390XADDconst {
 11507  			break
 11508  		}
 11509  		d := v_0.AuxInt
 11510  		ptr := v_0.Args[0]
 11511  		idx := v.Args[1]
 11512  		if !(is20Bit(c + d)) {
 11513  			break
 11514  		}
 11515  		v.reset(OpS390XMOVBloadidx)
 11516  		v.AuxInt = c + d
 11517  		v.Aux = sym
 11518  		v.AddArg(ptr)
 11519  		v.AddArg(idx)
 11520  		v.AddArg(mem)
 11521  		return true
 11522  	}
 11523  	// match: (MOVBloadidx [c] {sym} idx (ADDconst [d] ptr) mem)
 11524  	// cond: is20Bit(c+d)
 11525  	// result: (MOVBloadidx [c+d] {sym} ptr idx mem)
 11526  	for {
 11527  		c := v.AuxInt
 11528  		sym := v.Aux
 11529  		mem := v.Args[2]
 11530  		idx := v.Args[0]
 11531  		v_1 := v.Args[1]
 11532  		if v_1.Op != OpS390XADDconst {
 11533  			break
 11534  		}
 11535  		d := v_1.AuxInt
 11536  		ptr := v_1.Args[0]
 11537  		if !(is20Bit(c + d)) {
 11538  			break
 11539  		}
 11540  		v.reset(OpS390XMOVBloadidx)
 11541  		v.AuxInt = c + d
 11542  		v.Aux = sym
 11543  		v.AddArg(ptr)
 11544  		v.AddArg(idx)
 11545  		v.AddArg(mem)
 11546  		return true
 11547  	}
 11548  	// match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem)
 11549  	// cond: is20Bit(c+d)
 11550  	// result: (MOVBloadidx [c+d] {sym} ptr idx mem)
 11551  	for {
 11552  		c := v.AuxInt
 11553  		sym := v.Aux
 11554  		mem := v.Args[2]
 11555  		ptr := v.Args[0]
 11556  		v_1 := v.Args[1]
 11557  		if v_1.Op != OpS390XADDconst {
 11558  			break
 11559  		}
 11560  		d := v_1.AuxInt
 11561  		idx := v_1.Args[0]
 11562  		if !(is20Bit(c + d)) {
 11563  			break
 11564  		}
 11565  		v.reset(OpS390XMOVBloadidx)
 11566  		v.AuxInt = c + d
 11567  		v.Aux = sym
 11568  		v.AddArg(ptr)
 11569  		v.AddArg(idx)
 11570  		v.AddArg(mem)
 11571  		return true
 11572  	}
 11573  	// match: (MOVBloadidx [c] {sym} (ADDconst [d] idx) ptr mem)
 11574  	// cond: is20Bit(c+d)
 11575  	// result: (MOVBloadidx [c+d] {sym} ptr idx mem)
 11576  	for {
 11577  		c := v.AuxInt
 11578  		sym := v.Aux
 11579  		mem := v.Args[2]
 11580  		v_0 := v.Args[0]
 11581  		if v_0.Op != OpS390XADDconst {
 11582  			break
 11583  		}
 11584  		d := v_0.AuxInt
 11585  		idx := v_0.Args[0]
 11586  		ptr := v.Args[1]
 11587  		if !(is20Bit(c + d)) {
 11588  			break
 11589  		}
 11590  		v.reset(OpS390XMOVBloadidx)
 11591  		v.AuxInt = c + d
 11592  		v.Aux = sym
 11593  		v.AddArg(ptr)
 11594  		v.AddArg(idx)
 11595  		v.AddArg(mem)
 11596  		return true
 11597  	}
 11598  	return false
 11599  }
 11600  func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool {
 11601  	b := v.Block
 11602  	typ := &b.Func.Config.Types
 11603  	// match: (MOVBreg x:(MOVBload _ _))
 11604  	// cond:
 11605  	// result: (MOVDreg x)
 11606  	for {
 11607  		x := v.Args[0]
 11608  		if x.Op != OpS390XMOVBload {
 11609  			break
 11610  		}
 11611  		_ = x.Args[1]
 11612  		v.reset(OpS390XMOVDreg)
 11613  		v.AddArg(x)
 11614  		return true
 11615  	}
 11616  	// match: (MOVBreg x:(Arg <t>))
 11617  	// cond: is8BitInt(t) && isSigned(t)
 11618  	// result: (MOVDreg x)
 11619  	for {
 11620  		x := v.Args[0]
 11621  		if x.Op != OpArg {
 11622  			break
 11623  		}
 11624  		t := x.Type
 11625  		if !(is8BitInt(t) && isSigned(t)) {
 11626  			break
 11627  		}
 11628  		v.reset(OpS390XMOVDreg)
 11629  		v.AddArg(x)
 11630  		return true
 11631  	}
 11632  	// match: (MOVBreg x:(MOVBreg _))
 11633  	// cond:
 11634  	// result: (MOVDreg x)
 11635  	for {
 11636  		x := v.Args[0]
 11637  		if x.Op != OpS390XMOVBreg {
 11638  			break
 11639  		}
 11640  		v.reset(OpS390XMOVDreg)
 11641  		v.AddArg(x)
 11642  		return true
 11643  	}
 11644  	// match: (MOVBreg (MOVBZreg x))
 11645  	// cond:
 11646  	// result: (MOVBreg x)
 11647  	for {
 11648  		v_0 := v.Args[0]
 11649  		if v_0.Op != OpS390XMOVBZreg {
 11650  			break
 11651  		}
 11652  		x := v_0.Args[0]
 11653  		v.reset(OpS390XMOVBreg)
 11654  		v.AddArg(x)
 11655  		return true
 11656  	}
 11657  	// match: (MOVBreg (MOVDconst [c]))
 11658  	// cond:
 11659  	// result: (MOVDconst [int64(int8(c))])
 11660  	for {
 11661  		v_0 := v.Args[0]
 11662  		if v_0.Op != OpS390XMOVDconst {
 11663  			break
 11664  		}
 11665  		c := v_0.AuxInt
 11666  		v.reset(OpS390XMOVDconst)
 11667  		v.AuxInt = int64(int8(c))
 11668  		return true
 11669  	}
 11670  	// match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem))
 11671  	// cond: x.Uses == 1 && clobber(x)
 11672  	// result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem)
 11673  	for {
 11674  		x := v.Args[0]
 11675  		if x.Op != OpS390XMOVBZload {
 11676  			break
 11677  		}
 11678  		off := x.AuxInt
 11679  		sym := x.Aux
 11680  		mem := x.Args[1]
 11681  		ptr := x.Args[0]
 11682  		if !(x.Uses == 1 && clobber(x)) {
 11683  			break
 11684  		}
 11685  		b = x.Block
 11686  		v0 := b.NewValue0(x.Pos, OpS390XMOVBload, v.Type)
 11687  		v.reset(OpCopy)
 11688  		v.AddArg(v0)
 11689  		v0.AuxInt = off
 11690  		v0.Aux = sym
 11691  		v0.AddArg(ptr)
 11692  		v0.AddArg(mem)
 11693  		return true
 11694  	}
 11695  	// match: (MOVBreg x:(MOVBload [off] {sym} ptr mem))
 11696  	// cond: x.Uses == 1 && clobber(x)
 11697  	// result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem)
 11698  	for {
 11699  		x := v.Args[0]
 11700  		if x.Op != OpS390XMOVBload {
 11701  			break
 11702  		}
 11703  		off := x.AuxInt
 11704  		sym := x.Aux
 11705  		mem := x.Args[1]
 11706  		ptr := x.Args[0]
 11707  		if !(x.Uses == 1 && clobber(x)) {
 11708  			break
 11709  		}
 11710  		b = x.Block
 11711  		v0 := b.NewValue0(x.Pos, OpS390XMOVBload, v.Type)
 11712  		v.reset(OpCopy)
 11713  		v.AddArg(v0)
 11714  		v0.AuxInt = off
 11715  		v0.Aux = sym
 11716  		v0.AddArg(ptr)
 11717  		v0.AddArg(mem)
 11718  		return true
 11719  	}
 11720  	// match: (MOVBreg x:(MOVBZloadidx [off] {sym} ptr idx mem))
 11721  	// cond: x.Uses == 1 && clobber(x)
 11722  	// result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem)
 11723  	for {
 11724  		x := v.Args[0]
 11725  		if x.Op != OpS390XMOVBZloadidx {
 11726  			break
 11727  		}
 11728  		off := x.AuxInt
 11729  		sym := x.Aux
 11730  		mem := x.Args[2]
 11731  		ptr := x.Args[0]
 11732  		idx := x.Args[1]
 11733  		if !(x.Uses == 1 && clobber(x)) {
 11734  			break
 11735  		}
 11736  		b = x.Block
 11737  		v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type)
 11738  		v.reset(OpCopy)
 11739  		v.AddArg(v0)
 11740  		v0.AuxInt = off
 11741  		v0.Aux = sym
 11742  		v0.AddArg(ptr)
 11743  		v0.AddArg(idx)
 11744  		v0.AddArg(mem)
 11745  		return true
 11746  	}
 11747  	// match: (MOVBreg x:(MOVBloadidx [off] {sym} ptr idx mem))
 11748  	// cond: x.Uses == 1 && clobber(x)
 11749  	// result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem)
 11750  	for {
 11751  		x := v.Args[0]
 11752  		if x.Op != OpS390XMOVBloadidx {
 11753  			break
 11754  		}
 11755  		off := x.AuxInt
 11756  		sym := x.Aux
 11757  		mem := x.Args[2]
 11758  		ptr := x.Args[0]
 11759  		idx := x.Args[1]
 11760  		if !(x.Uses == 1 && clobber(x)) {
 11761  			break
 11762  		}
 11763  		b = x.Block
 11764  		v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type)
 11765  		v.reset(OpCopy)
 11766  		v.AddArg(v0)
 11767  		v0.AuxInt = off
 11768  		v0.Aux = sym
 11769  		v0.AddArg(ptr)
 11770  		v0.AddArg(idx)
 11771  		v0.AddArg(mem)
 11772  		return true
 11773  	}
 11774  	// match: (MOVBreg (ANDWconst [m] x))
 11775  	// cond: int8(m) >= 0
 11776  	// result: (MOVWZreg (ANDWconst <typ.UInt32> [int64( uint8(m))] x))
 11777  	for {
 11778  		v_0 := v.Args[0]
 11779  		if v_0.Op != OpS390XANDWconst {
 11780  			break
 11781  		}
 11782  		m := v_0.AuxInt
 11783  		x := v_0.Args[0]
 11784  		if !(int8(m) >= 0) {
 11785  			break
 11786  		}
 11787  		v.reset(OpS390XMOVWZreg)
 11788  		v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32)
 11789  		v0.AuxInt = int64(uint8(m))
 11790  		v0.AddArg(x)
 11791  		v.AddArg(v0)
 11792  		return true
 11793  	}
 11794  	return false
 11795  }
 11796  func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool {
 11797  	// match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem)
 11798  	// cond:
 11799  	// result: (MOVBstore [off] {sym} ptr x mem)
 11800  	for {
 11801  		off := v.AuxInt
 11802  		sym := v.Aux
 11803  		mem := v.Args[2]
 11804  		ptr := v.Args[0]
 11805  		v_1 := v.Args[1]
 11806  		if v_1.Op != OpS390XMOVBreg {
 11807  			break
 11808  		}
 11809  		x := v_1.Args[0]
 11810  		v.reset(OpS390XMOVBstore)
 11811  		v.AuxInt = off
 11812  		v.Aux = sym
 11813  		v.AddArg(ptr)
 11814  		v.AddArg(x)
 11815  		v.AddArg(mem)
 11816  		return true
 11817  	}
 11818  	// match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem)
 11819  	// cond:
 11820  	// result: (MOVBstore [off] {sym} ptr x mem)
 11821  	for {
 11822  		off := v.AuxInt
 11823  		sym := v.Aux
 11824  		mem := v.Args[2]
 11825  		ptr := v.Args[0]
 11826  		v_1 := v.Args[1]
 11827  		if v_1.Op != OpS390XMOVBZreg {
 11828  			break
 11829  		}
 11830  		x := v_1.Args[0]
 11831  		v.reset(OpS390XMOVBstore)
 11832  		v.AuxInt = off
 11833  		v.Aux = sym
 11834  		v.AddArg(ptr)
 11835  		v.AddArg(x)
 11836  		v.AddArg(mem)
 11837  		return true
 11838  	}
 11839  	// match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem)
 11840  	// cond: is20Bit(off1+off2)
 11841  	// result: (MOVBstore [off1+off2] {sym} ptr val mem)
 11842  	for {
 11843  		off1 := v.AuxInt
 11844  		sym := v.Aux
 11845  		mem := v.Args[2]
 11846  		v_0 := v.Args[0]
 11847  		if v_0.Op != OpS390XADDconst {
 11848  			break
 11849  		}
 11850  		off2 := v_0.AuxInt
 11851  		ptr := v_0.Args[0]
 11852  		val := v.Args[1]
 11853  		if !(is20Bit(off1 + off2)) {
 11854  			break
 11855  		}
 11856  		v.reset(OpS390XMOVBstore)
 11857  		v.AuxInt = off1 + off2
 11858  		v.Aux = sym
 11859  		v.AddArg(ptr)
 11860  		v.AddArg(val)
 11861  		v.AddArg(mem)
 11862  		return true
 11863  	}
 11864  	// match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem)
 11865  	// cond: is20Bit(off) && ptr.Op != OpSB
 11866  	// result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem)
 11867  	for {
 11868  		off := v.AuxInt
 11869  		sym := v.Aux
 11870  		mem := v.Args[2]
 11871  		ptr := v.Args[0]
 11872  		v_1 := v.Args[1]
 11873  		if v_1.Op != OpS390XMOVDconst {
 11874  			break
 11875  		}
 11876  		c := v_1.AuxInt
 11877  		if !(is20Bit(off) && ptr.Op != OpSB) {
 11878  			break
 11879  		}
 11880  		v.reset(OpS390XMOVBstoreconst)
 11881  		v.AuxInt = makeValAndOff(int64(int8(c)), off)
 11882  		v.Aux = sym
 11883  		v.AddArg(ptr)
 11884  		v.AddArg(mem)
 11885  		return true
 11886  	}
 11887  	// match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem)
 11888  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 11889  	// result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
 11890  	for {
 11891  		off1 := v.AuxInt
 11892  		sym1 := v.Aux
 11893  		mem := v.Args[2]
 11894  		v_0 := v.Args[0]
 11895  		if v_0.Op != OpS390XMOVDaddr {
 11896  			break
 11897  		}
 11898  		off2 := v_0.AuxInt
 11899  		sym2 := v_0.Aux
 11900  		base := v_0.Args[0]
 11901  		val := v.Args[1]
 11902  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 11903  			break
 11904  		}
 11905  		v.reset(OpS390XMOVBstore)
 11906  		v.AuxInt = off1 + off2
 11907  		v.Aux = mergeSym(sym1, sym2)
 11908  		v.AddArg(base)
 11909  		v.AddArg(val)
 11910  		v.AddArg(mem)
 11911  		return true
 11912  	}
 11913  	// match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem)
 11914  	// cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2)
 11915  	// result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem)
 11916  	for {
 11917  		off1 := v.AuxInt
 11918  		sym1 := v.Aux
 11919  		mem := v.Args[2]
 11920  		v_0 := v.Args[0]
 11921  		if v_0.Op != OpS390XMOVDaddridx {
 11922  			break
 11923  		}
 11924  		off2 := v_0.AuxInt
 11925  		sym2 := v_0.Aux
 11926  		idx := v_0.Args[1]
 11927  		ptr := v_0.Args[0]
 11928  		val := v.Args[1]
 11929  		if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) {
 11930  			break
 11931  		}
 11932  		v.reset(OpS390XMOVBstoreidx)
 11933  		v.AuxInt = off1 + off2
 11934  		v.Aux = mergeSym(sym1, sym2)
 11935  		v.AddArg(ptr)
 11936  		v.AddArg(idx)
 11937  		v.AddArg(val)
 11938  		v.AddArg(mem)
 11939  		return true
 11940  	}
 11941  	// match: (MOVBstore [off] {sym} (ADD ptr idx) val mem)
 11942  	// cond: ptr.Op != OpSB
 11943  	// result: (MOVBstoreidx [off] {sym} ptr idx val mem)
 11944  	for {
 11945  		off := v.AuxInt
 11946  		sym := v.Aux
 11947  		mem := v.Args[2]
 11948  		v_0 := v.Args[0]
 11949  		if v_0.Op != OpS390XADD {
 11950  			break
 11951  		}
 11952  		idx := v_0.Args[1]
 11953  		ptr := v_0.Args[0]
 11954  		val := v.Args[1]
 11955  		if !(ptr.Op != OpSB) {
 11956  			break
 11957  		}
 11958  		v.reset(OpS390XMOVBstoreidx)
 11959  		v.AuxInt = off
 11960  		v.Aux = sym
 11961  		v.AddArg(ptr)
 11962  		v.AddArg(idx)
 11963  		v.AddArg(val)
 11964  		v.AddArg(mem)
 11965  		return true
 11966  	}
 11967  	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem))
 11968  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 11969  	// result: (MOVHstore [i-1] {s} p w mem)
 11970  	for {
 11971  		i := v.AuxInt
 11972  		s := v.Aux
 11973  		_ = v.Args[2]
 11974  		p := v.Args[0]
 11975  		w := v.Args[1]
 11976  		x := v.Args[2]
 11977  		if x.Op != OpS390XMOVBstore {
 11978  			break
 11979  		}
 11980  		if x.AuxInt != i-1 {
 11981  			break
 11982  		}
 11983  		if x.Aux != s {
 11984  			break
 11985  		}
 11986  		mem := x.Args[2]
 11987  		if p != x.Args[0] {
 11988  			break
 11989  		}
 11990  		x_1 := x.Args[1]
 11991  		if x_1.Op != OpS390XSRDconst {
 11992  			break
 11993  		}
 11994  		if x_1.AuxInt != 8 {
 11995  			break
 11996  		}
 11997  		if w != x_1.Args[0] {
 11998  			break
 11999  		}
 12000  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12001  			break
 12002  		}
 12003  		v.reset(OpS390XMOVHstore)
 12004  		v.AuxInt = i - 1
 12005  		v.Aux = s
 12006  		v.AddArg(p)
 12007  		v.AddArg(w)
 12008  		v.AddArg(mem)
 12009  		return true
 12010  	}
 12011  	// match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem))
 12012  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12013  	// result: (MOVHstore [i-1] {s} p w0 mem)
 12014  	for {
 12015  		i := v.AuxInt
 12016  		s := v.Aux
 12017  		_ = v.Args[2]
 12018  		p := v.Args[0]
 12019  		w0 := v.Args[1]
 12020  		if w0.Op != OpS390XSRDconst {
 12021  			break
 12022  		}
 12023  		j := w0.AuxInt
 12024  		w := w0.Args[0]
 12025  		x := v.Args[2]
 12026  		if x.Op != OpS390XMOVBstore {
 12027  			break
 12028  		}
 12029  		if x.AuxInt != i-1 {
 12030  			break
 12031  		}
 12032  		if x.Aux != s {
 12033  			break
 12034  		}
 12035  		mem := x.Args[2]
 12036  		if p != x.Args[0] {
 12037  			break
 12038  		}
 12039  		x_1 := x.Args[1]
 12040  		if x_1.Op != OpS390XSRDconst {
 12041  			break
 12042  		}
 12043  		if x_1.AuxInt != j+8 {
 12044  			break
 12045  		}
 12046  		if w != x_1.Args[0] {
 12047  			break
 12048  		}
 12049  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12050  			break
 12051  		}
 12052  		v.reset(OpS390XMOVHstore)
 12053  		v.AuxInt = i - 1
 12054  		v.Aux = s
 12055  		v.AddArg(p)
 12056  		v.AddArg(w0)
 12057  		v.AddArg(mem)
 12058  		return true
 12059  	}
 12060  	// match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem))
 12061  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12062  	// result: (MOVHstore [i-1] {s} p w mem)
 12063  	for {
 12064  		i := v.AuxInt
 12065  		s := v.Aux
 12066  		_ = v.Args[2]
 12067  		p := v.Args[0]
 12068  		w := v.Args[1]
 12069  		x := v.Args[2]
 12070  		if x.Op != OpS390XMOVBstore {
 12071  			break
 12072  		}
 12073  		if x.AuxInt != i-1 {
 12074  			break
 12075  		}
 12076  		if x.Aux != s {
 12077  			break
 12078  		}
 12079  		mem := x.Args[2]
 12080  		if p != x.Args[0] {
 12081  			break
 12082  		}
 12083  		x_1 := x.Args[1]
 12084  		if x_1.Op != OpS390XSRWconst {
 12085  			break
 12086  		}
 12087  		if x_1.AuxInt != 8 {
 12088  			break
 12089  		}
 12090  		if w != x_1.Args[0] {
 12091  			break
 12092  		}
 12093  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12094  			break
 12095  		}
 12096  		v.reset(OpS390XMOVHstore)
 12097  		v.AuxInt = i - 1
 12098  		v.Aux = s
 12099  		v.AddArg(p)
 12100  		v.AddArg(w)
 12101  		v.AddArg(mem)
 12102  		return true
 12103  	}
 12104  	return false
 12105  }
 12106  func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool {
 12107  	// match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem))
 12108  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12109  	// result: (MOVHstore [i-1] {s} p w0 mem)
 12110  	for {
 12111  		i := v.AuxInt
 12112  		s := v.Aux
 12113  		_ = v.Args[2]
 12114  		p := v.Args[0]
 12115  		w0 := v.Args[1]
 12116  		if w0.Op != OpS390XSRWconst {
 12117  			break
 12118  		}
 12119  		j := w0.AuxInt
 12120  		w := w0.Args[0]
 12121  		x := v.Args[2]
 12122  		if x.Op != OpS390XMOVBstore {
 12123  			break
 12124  		}
 12125  		if x.AuxInt != i-1 {
 12126  			break
 12127  		}
 12128  		if x.Aux != s {
 12129  			break
 12130  		}
 12131  		mem := x.Args[2]
 12132  		if p != x.Args[0] {
 12133  			break
 12134  		}
 12135  		x_1 := x.Args[1]
 12136  		if x_1.Op != OpS390XSRWconst {
 12137  			break
 12138  		}
 12139  		if x_1.AuxInt != j+8 {
 12140  			break
 12141  		}
 12142  		if w != x_1.Args[0] {
 12143  			break
 12144  		}
 12145  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12146  			break
 12147  		}
 12148  		v.reset(OpS390XMOVHstore)
 12149  		v.AuxInt = i - 1
 12150  		v.Aux = s
 12151  		v.AddArg(p)
 12152  		v.AddArg(w0)
 12153  		v.AddArg(mem)
 12154  		return true
 12155  	}
 12156  	// match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
 12157  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12158  	// result: (MOVHBRstore [i-1] {s} p w mem)
 12159  	for {
 12160  		i := v.AuxInt
 12161  		s := v.Aux
 12162  		_ = v.Args[2]
 12163  		p := v.Args[0]
 12164  		v_1 := v.Args[1]
 12165  		if v_1.Op != OpS390XSRDconst {
 12166  			break
 12167  		}
 12168  		if v_1.AuxInt != 8 {
 12169  			break
 12170  		}
 12171  		w := v_1.Args[0]
 12172  		x := v.Args[2]
 12173  		if x.Op != OpS390XMOVBstore {
 12174  			break
 12175  		}
 12176  		if x.AuxInt != i-1 {
 12177  			break
 12178  		}
 12179  		if x.Aux != s {
 12180  			break
 12181  		}
 12182  		mem := x.Args[2]
 12183  		if p != x.Args[0] {
 12184  			break
 12185  		}
 12186  		if w != x.Args[1] {
 12187  			break
 12188  		}
 12189  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12190  			break
 12191  		}
 12192  		v.reset(OpS390XMOVHBRstore)
 12193  		v.AuxInt = i - 1
 12194  		v.Aux = s
 12195  		v.AddArg(p)
 12196  		v.AddArg(w)
 12197  		v.AddArg(mem)
 12198  		return true
 12199  	}
 12200  	// match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem))
 12201  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12202  	// result: (MOVHBRstore [i-1] {s} p w0 mem)
 12203  	for {
 12204  		i := v.AuxInt
 12205  		s := v.Aux
 12206  		_ = v.Args[2]
 12207  		p := v.Args[0]
 12208  		v_1 := v.Args[1]
 12209  		if v_1.Op != OpS390XSRDconst {
 12210  			break
 12211  		}
 12212  		j := v_1.AuxInt
 12213  		w := v_1.Args[0]
 12214  		x := v.Args[2]
 12215  		if x.Op != OpS390XMOVBstore {
 12216  			break
 12217  		}
 12218  		if x.AuxInt != i-1 {
 12219  			break
 12220  		}
 12221  		if x.Aux != s {
 12222  			break
 12223  		}
 12224  		mem := x.Args[2]
 12225  		if p != x.Args[0] {
 12226  			break
 12227  		}
 12228  		w0 := x.Args[1]
 12229  		if w0.Op != OpS390XSRDconst {
 12230  			break
 12231  		}
 12232  		if w0.AuxInt != j-8 {
 12233  			break
 12234  		}
 12235  		if w != w0.Args[0] {
 12236  			break
 12237  		}
 12238  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12239  			break
 12240  		}
 12241  		v.reset(OpS390XMOVHBRstore)
 12242  		v.AuxInt = i - 1
 12243  		v.Aux = s
 12244  		v.AddArg(p)
 12245  		v.AddArg(w0)
 12246  		v.AddArg(mem)
 12247  		return true
 12248  	}
 12249  	// match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem))
 12250  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12251  	// result: (MOVHBRstore [i-1] {s} p w mem)
 12252  	for {
 12253  		i := v.AuxInt
 12254  		s := v.Aux
 12255  		_ = v.Args[2]
 12256  		p := v.Args[0]
 12257  		v_1 := v.Args[1]
 12258  		if v_1.Op != OpS390XSRWconst {
 12259  			break
 12260  		}
 12261  		if v_1.AuxInt != 8 {
 12262  			break
 12263  		}
 12264  		w := v_1.Args[0]
 12265  		x := v.Args[2]
 12266  		if x.Op != OpS390XMOVBstore {
 12267  			break
 12268  		}
 12269  		if x.AuxInt != i-1 {
 12270  			break
 12271  		}
 12272  		if x.Aux != s {
 12273  			break
 12274  		}
 12275  		mem := x.Args[2]
 12276  		if p != x.Args[0] {
 12277  			break
 12278  		}
 12279  		if w != x.Args[1] {
 12280  			break
 12281  		}
 12282  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12283  			break
 12284  		}
 12285  		v.reset(OpS390XMOVHBRstore)
 12286  		v.AuxInt = i - 1
 12287  		v.Aux = s
 12288  		v.AddArg(p)
 12289  		v.AddArg(w)
 12290  		v.AddArg(mem)
 12291  		return true
 12292  	}
 12293  	// match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem))
 12294  	// cond: p.Op != OpSB && x.Uses == 1 && clobber(x)
 12295  	// result: (MOVHBRstore [i-1] {s} p w0 mem)
 12296  	for {
 12297  		i := v.AuxInt
 12298  		s := v.Aux
 12299  		_ = v.Args[2]
 12300  		p := v.Args[0]
 12301  		v_1 := v.Args[1]
 12302  		if v_1.Op != OpS390XSRWconst {
 12303  			break
 12304  		}
 12305  		j := v_1.AuxInt
 12306  		w := v_1.Args[0]
 12307  		x := v.Args[2]
 12308  		if x.Op != OpS390XMOVBstore {
 12309  			break
 12310  		}
 12311  		if x.AuxInt != i-1 {
 12312  			break
 12313  		}
 12314  		if x.Aux != s {
 12315  			break
 12316  		}
 12317  		mem := x.Args[2]
 12318  		if p != x.Args[0] {
 12319  			break
 12320  		}
 12321  		w0 := x.Args[1]
 12322  		if w0.Op != OpS390XSRWconst {
 12323  			break
 12324  		}
 12325  		if w0.AuxInt != j-8 {
 12326  			break
 12327  		}
 12328  		if w != w0.Args[0] {
 12329  			break
 12330  		}
 12331  		if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) {
 12332  			break
 12333  		}
 12334  		v.reset(OpS390XMOVHBRstore)
 12335  		v.AuxInt = i - 1
 12336  		v.Aux = s
 12337  		v.AddArg(p)
 12338  		v.AddArg(w0)
 12339  		v.AddArg(mem)
 12340  		return true
 12341  	}
 12342  	return false
 12343  }
 12344  func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool {
 12345  	// match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem)
 12346  	// cond: is20Bit(ValAndOff(sc).Off()+off)
 12347  	// result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem)
 12348  	for {
 12349  		sc := v.AuxInt
 12350  		s := v.Aux
 12351  		mem := v.Args[1]
 12352  		v_0 := v.Args[0]
 12353  		if v_0.Op != OpS390XADDconst {
 12354  			break
 12355  		}
 12356  		off := v_0.AuxInt
 12357  		ptr := v_0.Args[0]
 12358  		if !(is20Bit(ValAndOff(sc).Off() + off)) {
 12359  			break
 12360  		}
 12361  		v.reset(OpS390XMOVBstoreconst)
 12362  		v.AuxInt = ValAndOff(sc).add(off)
 12363  		v.Aux = s
 12364  		v.AddArg(ptr)
 12365  		v.AddArg(mem)
 12366  		return true
 12367  	}
 12368  	// match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem)
 12369  	// cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)
 12370  	// result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem)
 12371  	for {
 12372  		sc := v.AuxInt
 12373  		sym1 := v.Aux
 12374  		mem := v.Args[1]
 12375  		v_0 := v.Args[0]
 12376  		if v_0.Op != OpS390XMOVDaddr {
 12377  			break
 12378  		}
 12379  		off := v_0.AuxInt
 12380  		sym2 := v_0.Aux
 12381  		ptr := v_0.Args[0]
 12382  		if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) {
 12383  			break
 12384  		}
 12385  		v.reset(OpS390XMOVBstoreconst)
 12386  		v.AuxInt = ValAndOff(sc).add(off)
 12387  		v.Aux = mergeSym(sym1, sym2)
 12388  		v.AddArg(ptr)
 12389  		v.AddArg(mem)
 12390  		return true
 12391  	}
 12392  	// match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem))
 12393  	// cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x)
 12394  	// result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem)
 12395  	for {
 12396  		c := v.AuxInt
 12397  		s := v.Aux
 12398  		_ = v.Args[1]
 12399  		p := v.Args[0]
 12400  		x := v.Args[1]
 12401  		if x.Op != OpS390XMOVBstoreconst {
 12402  			break
 12403  		}
 12404  		a := x.AuxInt
 12405  		if x.Aux != s {
 12406  			break
 12407  		}
 12408  		mem := x.Args[1]
 12409  		if p != x.Args[0] {
 12410  			break
 12411  		}
 12412  		if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) {
 12413  			break
 12414  		}
 12415  		v.reset(OpS390XMOVHstoreconst)
 12416  		v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off())
 12417  		v.Aux = s
 12418  		v.AddArg(p)
 12419  		v.AddArg(mem)
 12420  		return true
 12421  	}
 12422  	return false
 12423  }
 12424  func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool {
 12425  	// match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem)
 12426  	// cond: is20Bit(c+d)
 12427  	// result: (MOVBstoreidx [c+d] {sym} ptr idx val mem)
 12428  	for {
 12429  		c := v.AuxInt
 12430  		sym := v.Aux
 12431  		mem := v.Args[3]
 12432  		v_0 := v.Args[0]
 12433  		if v_0.Op != OpS390XADDconst {
 12434  			break
 12435  		}
 12436  		d := v_0.AuxInt
 12437  		ptr := v_0.Args[0]
 12438  		idx := v.Args[1]
 12439  		val := v.Args[2]
 12440  		if !(is20Bit(c + d)) {
 12441  			break
 12442  		}
 12443  		v.reset(OpS390XMOVBstoreidx)
 12444  		v.AuxInt = c + d
 12445  		v.Aux = sym
 12446  		v.AddArg(ptr)
 12447  		v.AddArg(idx)
 12448  		v.AddArg(val)
 12449  		v.AddArg(mem)
 12450  		return true
 12451  	}
 12452  	// match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem)
 12453  	// cond: is20Bit(c+d)
 12454  	// result: (MOVBstoreidx [c+d] {sym} ptr idx val mem)
 12455  	for {
 12456  		c := v.AuxInt
 12457  		sym := v.Aux
 12458  		mem := v.Args[3]
 12459  		idx := v.Args[0]
 12460  		v_1 := v.Args[1]
 12461  		if v_1.Op != OpS390XADDconst {
 12462  			break
 12463  		}
 12464  		d := v_1.AuxInt
 12465  		ptr := v_1.Args[0]
 12466  		val := v.Args[2]
 12467  		if !(is20Bit(c + d)) {
 12468  			break
 12469  		}
 12470  		v.reset(OpS390XMOVBstoreidx)
 12471  		v.AuxInt = c + d
 12472  		v.Aux = sym
 12473  		v.AddArg(ptr)
 12474  		v.AddArg(idx)
 12475  		v.AddArg(val)
 12476  		v.AddArg(mem)
 12477  		return true
 12478  	}
 12479  	// match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem)
 12480  	// cond: is20Bit(c+d)
 12481  	// result: (MOVBstoreidx [c+d] {sym} ptr idx val mem)
 12482  	for {
 12483  		c := v.AuxInt
 12484  		sym := v.Aux
 12485  		mem := v.Args[3]
 12486  		ptr := v.Args[0]
 12487  		v_1 := v.Args[1]
 12488  		if v_1.Op != OpS390XADDconst {
 12489  			break
 12490  		}
 12491  		d := v_1.AuxInt
 12492  		idx := v_1.Args[0]
 12493  		val := v.Args[2]
 12494  		if !(is20Bit(c + d)) {
 12495  			break
 12496  		}
 12497  		v.reset(OpS390XMOVBstoreidx)
 12498  		v.AuxInt = c + d
 12499  		v.Aux = sym
 12500  		v.AddArg(ptr)
 12501  		v.AddArg(idx)
 12502  		v.AddArg(val)
 12503  		v.AddArg(mem)
 12504  		return true
 12505  	}
 12506  	// match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem)
 12507  	// cond: is20Bit(c+d)
 12508  	// result: (MOVBstoreidx [c+d] {sym} ptr idx val mem)
 12509  	for {
 12510  		c := v.AuxInt
 12511  		sym := v.Aux
 12512  		mem := v.Args[3]
 12513  		v_0 := v.Args[0]
 12514  		if v_0.Op != OpS390XADDconst {
 12515  			break
 12516  		}
 12517  		d := v_0.AuxInt
 12518  		idx := v_0.Args[0]
 12519  		ptr := v.Args[1]
 12520  		val := v.Args[2]
 12521  		if !(is20Bit(c + d)) {
 12522  			break
 12523  		}
 12524  		v.reset(OpS390XMOVBstoreidx)
 12525  		v.AuxInt = c + d
 12526  		v.Aux = sym
 12527  		v.AddArg(ptr)
 12528  		v.AddArg(idx)
 12529  		v.AddArg(val)
 12530  		v.AddArg(mem)
 12531  		return true
 12532  	}
 12533  	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem))
 12534  	// cond: x.Uses == 1 && clobber(x)
 12535  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 12536  	for {
 12537  		i := v.AuxInt
 12538  		s := v.Aux
 12539  		_ = v.Args[3]
 12540  		p := v.Args[0]
 12541  		idx := v.Args[1]
 12542  		w := v.Args[2]
 12543  		x := v.Args[3]
 12544  		if x.Op != OpS390XMOVBstoreidx {
 12545  			break
 12546  		}
 12547  		if x.AuxInt != i-1 {
 12548  			break
 12549  		}
 12550  		if x.Aux != s {
 12551  			break
 12552  		}
 12553  		mem := x.Args[3]
 12554  		if p != x.Args[0] {
 12555  			break
 12556  		}
 12557  		if idx != x.Args[1] {
 12558  			break
 12559  		}
 12560  		x_2 := x.Args[2]
 12561  		if x_2.Op != OpS390XSRDconst {
 12562  			break
 12563  		}
 12564  		if x_2.AuxInt != 8 {
 12565  			break
 12566  		}
 12567  		if w != x_2.Args[0] {
 12568  			break
 12569  		}
 12570  		if !(x.Uses == 1 && clobber(x)) {
 12571  			break
 12572  		}
 12573  		v.reset(OpS390XMOVHstoreidx)
 12574  		v.AuxInt = i - 1
 12575  		v.Aux = s
 12576  		v.AddArg(p)
 12577  		v.AddArg(idx)
 12578  		v.AddArg(w)
 12579  		v.AddArg(mem)
 12580  		return true
 12581  	}
 12582  	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem))
 12583  	// cond: x.Uses == 1 && clobber(x)
 12584  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 12585  	for {
 12586  		i := v.AuxInt
 12587  		s := v.Aux
 12588  		_ = v.Args[3]
 12589  		p := v.Args[0]
 12590  		idx := v.Args[1]
 12591  		w := v.Args[2]
 12592  		x := v.Args[3]
 12593  		if x.Op != OpS390XMOVBstoreidx {
 12594  			break
 12595  		}
 12596  		if x.AuxInt != i-1 {
 12597  			break
 12598  		}
 12599  		if x.Aux != s {
 12600  			break
 12601  		}
 12602  		mem := x.Args[3]
 12603  		if idx != x.Args[0] {
 12604  			break
 12605  		}
 12606  		if p != x.Args[1] {
 12607  			break
 12608  		}
 12609  		x_2 := x.Args[2]
 12610  		if x_2.Op != OpS390XSRDconst {
 12611  			break
 12612  		}
 12613  		if x_2.AuxInt != 8 {
 12614  			break
 12615  		}
 12616  		if w != x_2.Args[0] {
 12617  			break
 12618  		}
 12619  		if !(x.Uses == 1 && clobber(x)) {
 12620  			break
 12621  		}
 12622  		v.reset(OpS390XMOVHstoreidx)
 12623  		v.AuxInt = i - 1
 12624  		v.Aux = s
 12625  		v.AddArg(p)
 12626  		v.AddArg(idx)
 12627  		v.AddArg(w)
 12628  		v.AddArg(mem)
 12629  		return true
 12630  	}
 12631  	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem))
 12632  	// cond: x.Uses == 1 && clobber(x)
 12633  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 12634  	for {
 12635  		i := v.AuxInt
 12636  		s := v.Aux
 12637  		_ = v.Args[3]
 12638  		idx := v.Args[0]
 12639  		p := v.Args[1]
 12640  		w := v.Args[2]
 12641  		x := v.Args[3]
 12642  		if x.Op != OpS390XMOVBstoreidx {
 12643  			break
 12644  		}
 12645  		if x.AuxInt != i-1 {
 12646  			break
 12647  		}
 12648  		if x.Aux != s {
 12649  			break
 12650  		}
 12651  		mem := x.Args[3]
 12652  		if p != x.Args[0] {
 12653  			break
 12654  		}
 12655  		if idx != x.Args[1] {
 12656  			break
 12657  		}
 12658  		x_2 := x.Args[2]
 12659  		if x_2.Op != OpS390XSRDconst {
 12660  			break
 12661  		}
 12662  		if x_2.AuxInt != 8 {
 12663  			break
 12664  		}
 12665  		if w != x_2.Args[0] {
 12666  			break
 12667  		}
 12668  		if !(x.Uses == 1 && clobber(x)) {
 12669  			break
 12670  		}
 12671  		v.reset(OpS390XMOVHstoreidx)
 12672  		v.AuxInt = i - 1
 12673  		v.Aux = s
 12674  		v.AddArg(p)
 12675  		v.AddArg(idx)
 12676  		v.AddArg(w)
 12677  		v.AddArg(mem)
 12678  		return true
 12679  	}
 12680  	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem))
 12681  	// cond: x.Uses == 1 && clobber(x)
 12682  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 12683  	for {
 12684  		i := v.AuxInt
 12685  		s := v.Aux
 12686  		_ = v.Args[3]
 12687  		idx := v.Args[0]
 12688  		p := v.Args[1]
 12689  		w := v.Args[2]
 12690  		x := v.Args[3]
 12691  		if x.Op != OpS390XMOVBstoreidx {
 12692  			break
 12693  		}
 12694  		if x.AuxInt != i-1 {
 12695  			break
 12696  		}
 12697  		if x.Aux != s {
 12698  			break
 12699  		}
 12700  		mem := x.Args[3]
 12701  		if idx != x.Args[0] {
 12702  			break
 12703  		}
 12704  		if p != x.Args[1] {
 12705  			break
 12706  		}
 12707  		x_2 := x.Args[2]
 12708  		if x_2.Op != OpS390XSRDconst {
 12709  			break
 12710  		}
 12711  		if x_2.AuxInt != 8 {
 12712  			break
 12713  		}
 12714  		if w != x_2.Args[0] {
 12715  			break
 12716  		}
 12717  		if !(x.Uses == 1 && clobber(x)) {
 12718  			break
 12719  		}
 12720  		v.reset(OpS390XMOVHstoreidx)
 12721  		v.AuxInt = i - 1
 12722  		v.Aux = s
 12723  		v.AddArg(p)
 12724  		v.AddArg(idx)
 12725  		v.AddArg(w)
 12726  		v.AddArg(mem)
 12727  		return true
 12728  	}
 12729  	// match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem))
 12730  	// cond: x.Uses == 1 && clobber(x)
 12731  	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
 12732  	for {
 12733  		i := v.AuxInt
 12734  		s := v.Aux
 12735  		_ = v.Args[3]
 12736  		p := v.Args[0]
 12737  		idx := v.Args[1]
 12738  		w0 := v.Args[2]
 12739  		if w0.Op != OpS390XSRDconst {
 12740  			break
 12741  		}
 12742  		j := w0.AuxInt
 12743  		w := w0.Args[0]
 12744  		x := v.Args[3]
 12745  		if x.Op != OpS390XMOVBstoreidx {
 12746  			break
 12747  		}
 12748  		if x.AuxInt != i-1 {
 12749  			break
 12750  		}
 12751  		if x.Aux != s {
 12752  			break
 12753  		}
 12754  		mem := x.Args[3]
 12755  		if p != x.Args[0] {
 12756  			break
 12757  		}
 12758  		if idx != x.Args[1] {
 12759  			break
 12760  		}
 12761  		x_2 := x.Args[2]
 12762  		if x_2.Op != OpS390XSRDconst {
 12763  			break
 12764  		}
 12765  		if x_2.AuxInt != j+8 {
 12766  			break
 12767  		}
 12768  		if w != x_2.Args[0] {
 12769  			break
 12770  		}
 12771  		if !(x.Uses == 1 && clobber(x)) {
 12772  			break
 12773  		}
 12774  		v.reset(OpS390XMOVHstoreidx)
 12775  		v.AuxInt = i - 1
 12776  		v.Aux = s
 12777  		v.AddArg(p)
 12778  		v.AddArg(idx)
 12779  		v.AddArg(w0)
 12780  		v.AddArg(mem)
 12781  		return true
 12782  	}
 12783  	// match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem))
 12784  	// cond: x.Uses == 1 && clobber(x)
 12785  	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
 12786  	for {
 12787  		i := v.AuxInt
 12788  		s := v.Aux
 12789  		_ = v.Args[3]
 12790  		p := v.Args[0]
 12791  		idx := v.Args[1]
 12792  		w0 := v.Args[2]
 12793  		if w0.Op != OpS390XSRDconst {
 12794  			break
 12795  		}
 12796  		j := w0.AuxInt
 12797  		w := w0.Args[0]
 12798  		x := v.Args[3]
 12799  		if x.Op != OpS390XMOVBstoreidx {
 12800  			break
 12801  		}
 12802  		if x.AuxInt != i-1 {
 12803  			break
 12804  		}
 12805  		if x.Aux != s {
 12806  			break
 12807  		}
 12808  		mem := x.Args[3]
 12809  		if idx != x.Args[0] {
 12810  			break
 12811  		}
 12812  		if p != x.Args[1] {
 12813  			break
 12814  		}
 12815  		x_2 := x.Args[2]
 12816  		if x_2.Op != OpS390XSRDconst {
 12817  			break
 12818  		}
 12819  		if x_2.AuxInt != j+8 {
 12820  			break
 12821  		}
 12822  		if w != x_2.Args[0] {
 12823  			break
 12824  		}
 12825  		if !(x.Uses == 1 && clobber(x)) {
 12826  			break
 12827  		}
 12828  		v.reset(OpS390XMOVHstoreidx)
 12829  		v.AuxInt = i - 1
 12830  		v.Aux = s
 12831  		v.AddArg(p)
 12832  		v.AddArg(idx)
 12833  		v.AddArg(w0)
 12834  		v.AddArg(mem)
 12835  		return true
 12836  	}
 12837  	return false
 12838  }
 12839  func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool {
 12840  	// match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem))
 12841  	// cond: x.Uses == 1 && clobber(x)
 12842  	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
 12843  	for {
 12844  		i := v.AuxInt
 12845  		s := v.Aux
 12846  		_ = v.Args[3]
 12847  		idx := v.Args[0]
 12848  		p := v.Args[1]
 12849  		w0 := v.Args[2]
 12850  		if w0.Op != OpS390XSRDconst {
 12851  			break
 12852  		}
 12853  		j := w0.AuxInt
 12854  		w := w0.Args[0]
 12855  		x := v.Args[3]
 12856  		if x.Op != OpS390XMOVBstoreidx {
 12857  			break
 12858  		}
 12859  		if x.AuxInt != i-1 {
 12860  			break
 12861  		}
 12862  		if x.Aux != s {
 12863  			break
 12864  		}
 12865  		mem := x.Args[3]
 12866  		if p != x.Args[0] {
 12867  			break
 12868  		}
 12869  		if idx != x.Args[1] {
 12870  			break
 12871  		}
 12872  		x_2 := x.Args[2]
 12873  		if x_2.Op != OpS390XSRDconst {
 12874  			break
 12875  		}
 12876  		if x_2.AuxInt != j+8 {
 12877  			break
 12878  		}
 12879  		if w != x_2.Args[0] {
 12880  			break
 12881  		}
 12882  		if !(x.Uses == 1 && clobber(x)) {
 12883  			break
 12884  		}
 12885  		v.reset(OpS390XMOVHstoreidx)
 12886  		v.AuxInt = i - 1
 12887  		v.Aux = s
 12888  		v.AddArg(p)
 12889  		v.AddArg(idx)
 12890  		v.AddArg(w0)
 12891  		v.AddArg(mem)
 12892  		return true
 12893  	}
 12894  	// match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem))
 12895  	// cond: x.Uses == 1 && clobber(x)
 12896  	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
 12897  	for {
 12898  		i := v.AuxInt
 12899  		s := v.Aux
 12900  		_ = v.Args[3]
 12901  		idx := v.Args[0]
 12902  		p := v.Args[1]
 12903  		w0 := v.Args[2]
 12904  		if w0.Op != OpS390XSRDconst {
 12905  			break
 12906  		}
 12907  		j := w0.AuxInt
 12908  		w := w0.Args[0]
 12909  		x := v.Args[3]
 12910  		if x.Op != OpS390XMOVBstoreidx {
 12911  			break
 12912  		}
 12913  		if x.AuxInt != i-1 {
 12914  			break
 12915  		}
 12916  		if x.Aux != s {
 12917  			break
 12918  		}
 12919  		mem := x.Args[3]
 12920  		if idx != x.Args[0] {
 12921  			break
 12922  		}
 12923  		if p != x.Args[1] {
 12924  			break
 12925  		}
 12926  		x_2 := x.Args[2]
 12927  		if x_2.Op != OpS390XSRDconst {
 12928  			break
 12929  		}
 12930  		if x_2.AuxInt != j+8 {
 12931  			break
 12932  		}
 12933  		if w != x_2.Args[0] {
 12934  			break
 12935  		}
 12936  		if !(x.Uses == 1 && clobber(x)) {
 12937  			break
 12938  		}
 12939  		v.reset(OpS390XMOVHstoreidx)
 12940  		v.AuxInt = i - 1
 12941  		v.Aux = s
 12942  		v.AddArg(p)
 12943  		v.AddArg(idx)
 12944  		v.AddArg(w0)
 12945  		v.AddArg(mem)
 12946  		return true
 12947  	}
 12948  	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem))
 12949  	// cond: x.Uses == 1 && clobber(x)
 12950  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 12951  	for {
 12952  		i := v.AuxInt
 12953  		s := v.Aux
 12954  		_ = v.Args[3]
 12955  		p := v.Args[0]
 12956  		idx := v.Args[1]
 12957  		w := v.Args[2]
 12958  		x := v.Args[3]
 12959  		if x.Op != OpS390XMOVBstoreidx {
 12960  			break
 12961  		}
 12962  		if x.AuxInt != i-1 {
 12963  			break
 12964  		}
 12965  		if x.Aux != s {
 12966  			break
 12967  		}
 12968  		mem := x.Args[3]
 12969  		if p != x.Args[0] {
 12970  			break
 12971  		}
 12972  		if idx != x.Args[1] {
 12973  			break
 12974  		}
 12975  		x_2 := x.Args[2]
 12976  		if x_2.Op != OpS390XSRWconst {
 12977  			break
 12978  		}
 12979  		if x_2.AuxInt != 8 {
 12980  			break
 12981  		}
 12982  		if w != x_2.Args[0] {
 12983  			break
 12984  		}
 12985  		if !(x.Uses == 1 && clobber(x)) {
 12986  			break
 12987  		}
 12988  		v.reset(OpS390XMOVHstoreidx)
 12989  		v.AuxInt = i - 1
 12990  		v.Aux = s
 12991  		v.AddArg(p)
 12992  		v.AddArg(idx)
 12993  		v.AddArg(w)
 12994  		v.AddArg(mem)
 12995  		return true
 12996  	}
 12997  	// match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem))
 12998  	// cond: x.Uses == 1 && clobber(x)
 12999  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 13000  	for {
 13001  		i := v.AuxInt
 13002  		s := v.Aux
 13003  		_ = v.Args[3]
 13004  		p := v.Args[0]
 13005  		idx := v.Args[1]
 13006  		w := v.Args[2]
 13007  		x := v.Args[3]
 13008  		if x.Op != OpS390XMOVBstoreidx {
 13009  			break
 13010  		}
 13011  		if x.AuxInt != i-1 {
 13012  			break
 13013  		}
 13014  		if x.Aux != s {
 13015  			break
 13016  		}
 13017  		mem := x.Args[3]
 13018  		if idx != x.Args[0] {
 13019  			break
 13020  		}
 13021  		if p != x.Args[1] {
 13022  			break
 13023  		}
 13024  		x_2 := x.Args[2]
 13025  		if x_2.Op != OpS390XSRWconst {
 13026  			break
 13027  		}
 13028  		if x_2.AuxInt != 8 {
 13029  			break
 13030  		}
 13031  		if w != x_2.Args[0] {
 13032  			break
 13033  		}
 13034  		if !(x.Uses == 1 && clobber(x)) {
 13035  			break
 13036  		}
 13037  		v.reset(OpS390XMOVHstoreidx)
 13038  		v.AuxInt = i - 1
 13039  		v.Aux = s
 13040  		v.AddArg(p)
 13041  		v.AddArg(idx)
 13042  		v.AddArg(w)
 13043  		v.AddArg(mem)
 13044  		return true
 13045  	}
 13046  	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem))
 13047  	// cond: x.Uses == 1 && clobber(x)
 13048  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 13049  	for {
 13050  		i := v.AuxInt
 13051  		s := v.Aux
 13052  		_ = v.Args[3]
 13053  		idx := v.Args[0]
 13054  		p := v.Args[1]
 13055  		w := v.Args[2]
 13056  		x := v.Args[3]
 13057  		if x.Op != OpS390XMOVBstoreidx {
 13058  			break
 13059  		}
 13060  		if x.AuxInt != i-1 {
 13061  			break
 13062  		}
 13063  		if x.Aux != s {
 13064  			break
 13065  		}
 13066  		mem := x.Args[3]
 13067  		if p != x.Args[0] {
 13068  			break
 13069  		}
 13070  		if idx != x.Args[1] {
 13071  			break
 13072  		}
 13073  		x_2 := x.Args[2]
 13074  		if x_2.Op != OpS390XSRWconst {
 13075  			break
 13076  		}
 13077  		if x_2.AuxInt != 8 {
 13078  			break
 13079  		}
 13080  		if w != x_2.Args[0] {
 13081  			break
 13082  		}
 13083  		if !(x.Uses == 1 && clobber(x)) {
 13084  			break
 13085  		}
 13086  		v.reset(OpS390XMOVHstoreidx)
 13087  		v.AuxInt = i - 1
 13088  		v.Aux = s
 13089  		v.AddArg(p)
 13090  		v.AddArg(idx)
 13091  		v.AddArg(w)
 13092  		v.AddArg(mem)
 13093  		return true
 13094  	}
 13095  	// match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem))
 13096  	// cond: x.Uses == 1 && clobber(x)
 13097  	// result: (MOVHstoreidx [i-1] {s} p idx w mem)
 13098  	for {
 13099  		i := v.AuxInt
 13100  		s := v.Aux
 13101  		_ = v.Args[3]
 13102  		idx := v.Args[0]
 13103  		p := v.Args[1]
 13104  		w := v.Args[2]
 13105  		x := v.Args[3]
 13106  		if x.Op != OpS390XMOVBstoreidx {
 13107  			break
 13108  		}
 13109  		if x.AuxInt != i-1 {
 13110  			break
 13111  		}
 13112  		if x.Aux != s {
 13113  			break
 13114  		}
 13115  		mem := x.Args[3]
 13116  		if idx != x.Args[0] {
 13117  			break
 13118  		}
 13119  		if p != x.Args[1] {
 13120  			break
 13121  		}
 13122  		x_2 := x.Args[2]
 13123  		if x_2.Op != OpS390XSRWconst {
 13124  			break
 13125  		}
 13126  		if x_2.AuxInt != 8 {
 13127  			break
 13128  		}
 13129  		if w != x_2.Args[0] {
 13130  			break
 13131  		}
 13132  		if !(x.Uses == 1 && clobber(x)) {
 13133  			break
 13134  		}
 13135  		v.reset(OpS390XMOVHstoreidx)
 13136  		v.AuxInt = i - 1
 13137  		v.Aux = s
 13138  		v.AddArg(p)
 13139  		v.AddArg(idx)
 13140  		v.AddArg(w)
 13141  		v.AddArg(mem)
 13142  		return true
 13143  	}
 13144  	// match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem))
 13145  	// cond: x.Uses == 1 && clobber(x)
 13146  	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
 13147  	for {
 13148  		i := v.AuxInt
 13149  		s := v.Aux
 13150  		_ = v.Args[3]
 13151  		p := v.Args[0]
 13152  		idx := v.Args[1]
 13153  		w0 := v.Args[2]
 13154  		if w0.Op != OpS390XSRWconst {
 13155  			break
 13156  		}
 13157  		j := w0.AuxInt
 13158  		w := w0.Args[0]
 13159  		x := v.Args[3]
 13160  		if x.Op != OpS390XMOVBstoreidx {
 13161  			break
 13162  		}
 13163  		if x.AuxInt != i-1 {
 13164  			break
 13165  		}
 13166  		if x.Aux != s {
 13167  			break
 13168  		}
 13169  		mem := x.Args[3]
 13170  		if p != x.Args[0] {
 13171  			break
 13172  		}
 13173  		if idx != x.Args[1] {
 13174  			break
 13175  		}
 13176  		x_2 := x.Args[2]
 13177  		if x_2.Op != OpS390XSRWconst {
 13178  			break
 13179  		}
 13180  		if x_2.AuxInt != j+8 {
 13181  			break
 13182  		}
 13183  		if w != x_2.Args[0] {
 13184  			break
 13185  		}
 13186  		if !(x.Uses == 1 && clobber(x)) {
 13187  			break
 13188  		}
 13189  		v.reset(OpS390XMOVHstoreidx)
 13190  		v.AuxInt = i - 1
 13191  		v.Aux = s
 13192  		v.AddArg(p)
 13193  		v.AddArg(idx)
 13194  		v.AddArg(w0)
 13195  		v.AddArg(mem)
 13196  		return true
 13197  	}
 13198  	// match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem))
 13199  	// cond: x.Uses == 1 && clobber(x)
 13200  	// result: (MOVHstoreidx [i-1] {s} p idx w0 mem)
 13201  	for {
 13202  		i := v.AuxInt
 13203  		s := v.Aux
 13204  		_ = v.Args[3]
 13205  		p := v.Args[0]
 13206  		idx := v.Args[1]
 13207  		w0 := v.Args[2]
 13208  		if w0.Op != OpS390XSRWconst {
 13209  			break
 13210  		}
 13211  		j := w0.AuxInt
 13212  		w := w0.Args[0]
 13213  		x := v.Args[3]
 13214  		if x.Op != OpS390XMOVBstoreidx {
 13215  			break
 13216  		}
 13217  		if x.AuxInt != i-1 {
 13218  			break
 13219  		}
 13220  		if x.Aux != s {
 13221  			break
 13222  		}
 13223  		mem := x.Args[3]
 13224  		if idx != x.Args[0] {
 13225  			break
 13226  		}
 13227  		if p != x.Args[1] {
 13228  			break
 13229  		}
 13230  		x_2 := x.Args[2]
 13231  		if x_2.Op != OpS390XSRWconst {
 13232  			break
 13233&