github.com/FenixAra/go@v0.0.0-20170127160404-96ea0918e670/src/cmd/compile/internal/ssa/rewritegeneric.go (about)

     1  // autogenerated from gen/generic.rules: do not edit!
     2  // generated with: cd gen; go run *.go
     3  
     4  package ssa
     5  
     6  import "math"
     7  
     8  var _ = math.MinInt8 // in case not otherwise used
     9  func rewriteValuegeneric(v *Value, config *Config) bool {
    10  	switch v.Op {
    11  	case OpAdd16:
    12  		return rewriteValuegeneric_OpAdd16(v, config)
    13  	case OpAdd32:
    14  		return rewriteValuegeneric_OpAdd32(v, config)
    15  	case OpAdd32F:
    16  		return rewriteValuegeneric_OpAdd32F(v, config)
    17  	case OpAdd64:
    18  		return rewriteValuegeneric_OpAdd64(v, config)
    19  	case OpAdd64F:
    20  		return rewriteValuegeneric_OpAdd64F(v, config)
    21  	case OpAdd8:
    22  		return rewriteValuegeneric_OpAdd8(v, config)
    23  	case OpAddPtr:
    24  		return rewriteValuegeneric_OpAddPtr(v, config)
    25  	case OpAnd16:
    26  		return rewriteValuegeneric_OpAnd16(v, config)
    27  	case OpAnd32:
    28  		return rewriteValuegeneric_OpAnd32(v, config)
    29  	case OpAnd64:
    30  		return rewriteValuegeneric_OpAnd64(v, config)
    31  	case OpAnd8:
    32  		return rewriteValuegeneric_OpAnd8(v, config)
    33  	case OpArg:
    34  		return rewriteValuegeneric_OpArg(v, config)
    35  	case OpArraySelect:
    36  		return rewriteValuegeneric_OpArraySelect(v, config)
    37  	case OpCom16:
    38  		return rewriteValuegeneric_OpCom16(v, config)
    39  	case OpCom32:
    40  		return rewriteValuegeneric_OpCom32(v, config)
    41  	case OpCom64:
    42  		return rewriteValuegeneric_OpCom64(v, config)
    43  	case OpCom8:
    44  		return rewriteValuegeneric_OpCom8(v, config)
    45  	case OpConstInterface:
    46  		return rewriteValuegeneric_OpConstInterface(v, config)
    47  	case OpConstSlice:
    48  		return rewriteValuegeneric_OpConstSlice(v, config)
    49  	case OpConstString:
    50  		return rewriteValuegeneric_OpConstString(v, config)
    51  	case OpConvert:
    52  		return rewriteValuegeneric_OpConvert(v, config)
    53  	case OpCvt32Fto64F:
    54  		return rewriteValuegeneric_OpCvt32Fto64F(v, config)
    55  	case OpCvt64Fto32F:
    56  		return rewriteValuegeneric_OpCvt64Fto32F(v, config)
    57  	case OpDiv32F:
    58  		return rewriteValuegeneric_OpDiv32F(v, config)
    59  	case OpDiv64:
    60  		return rewriteValuegeneric_OpDiv64(v, config)
    61  	case OpDiv64F:
    62  		return rewriteValuegeneric_OpDiv64F(v, config)
    63  	case OpDiv64u:
    64  		return rewriteValuegeneric_OpDiv64u(v, config)
    65  	case OpEq16:
    66  		return rewriteValuegeneric_OpEq16(v, config)
    67  	case OpEq32:
    68  		return rewriteValuegeneric_OpEq32(v, config)
    69  	case OpEq64:
    70  		return rewriteValuegeneric_OpEq64(v, config)
    71  	case OpEq8:
    72  		return rewriteValuegeneric_OpEq8(v, config)
    73  	case OpEqB:
    74  		return rewriteValuegeneric_OpEqB(v, config)
    75  	case OpEqInter:
    76  		return rewriteValuegeneric_OpEqInter(v, config)
    77  	case OpEqPtr:
    78  		return rewriteValuegeneric_OpEqPtr(v, config)
    79  	case OpEqSlice:
    80  		return rewriteValuegeneric_OpEqSlice(v, config)
    81  	case OpGeq16:
    82  		return rewriteValuegeneric_OpGeq16(v, config)
    83  	case OpGeq16U:
    84  		return rewriteValuegeneric_OpGeq16U(v, config)
    85  	case OpGeq32:
    86  		return rewriteValuegeneric_OpGeq32(v, config)
    87  	case OpGeq32U:
    88  		return rewriteValuegeneric_OpGeq32U(v, config)
    89  	case OpGeq64:
    90  		return rewriteValuegeneric_OpGeq64(v, config)
    91  	case OpGeq64U:
    92  		return rewriteValuegeneric_OpGeq64U(v, config)
    93  	case OpGeq8:
    94  		return rewriteValuegeneric_OpGeq8(v, config)
    95  	case OpGeq8U:
    96  		return rewriteValuegeneric_OpGeq8U(v, config)
    97  	case OpGreater16:
    98  		return rewriteValuegeneric_OpGreater16(v, config)
    99  	case OpGreater16U:
   100  		return rewriteValuegeneric_OpGreater16U(v, config)
   101  	case OpGreater32:
   102  		return rewriteValuegeneric_OpGreater32(v, config)
   103  	case OpGreater32U:
   104  		return rewriteValuegeneric_OpGreater32U(v, config)
   105  	case OpGreater64:
   106  		return rewriteValuegeneric_OpGreater64(v, config)
   107  	case OpGreater64U:
   108  		return rewriteValuegeneric_OpGreater64U(v, config)
   109  	case OpGreater8:
   110  		return rewriteValuegeneric_OpGreater8(v, config)
   111  	case OpGreater8U:
   112  		return rewriteValuegeneric_OpGreater8U(v, config)
   113  	case OpIMake:
   114  		return rewriteValuegeneric_OpIMake(v, config)
   115  	case OpIsInBounds:
   116  		return rewriteValuegeneric_OpIsInBounds(v, config)
   117  	case OpIsSliceInBounds:
   118  		return rewriteValuegeneric_OpIsSliceInBounds(v, config)
   119  	case OpLeq16:
   120  		return rewriteValuegeneric_OpLeq16(v, config)
   121  	case OpLeq16U:
   122  		return rewriteValuegeneric_OpLeq16U(v, config)
   123  	case OpLeq32:
   124  		return rewriteValuegeneric_OpLeq32(v, config)
   125  	case OpLeq32U:
   126  		return rewriteValuegeneric_OpLeq32U(v, config)
   127  	case OpLeq64:
   128  		return rewriteValuegeneric_OpLeq64(v, config)
   129  	case OpLeq64U:
   130  		return rewriteValuegeneric_OpLeq64U(v, config)
   131  	case OpLeq8:
   132  		return rewriteValuegeneric_OpLeq8(v, config)
   133  	case OpLeq8U:
   134  		return rewriteValuegeneric_OpLeq8U(v, config)
   135  	case OpLess16:
   136  		return rewriteValuegeneric_OpLess16(v, config)
   137  	case OpLess16U:
   138  		return rewriteValuegeneric_OpLess16U(v, config)
   139  	case OpLess32:
   140  		return rewriteValuegeneric_OpLess32(v, config)
   141  	case OpLess32U:
   142  		return rewriteValuegeneric_OpLess32U(v, config)
   143  	case OpLess64:
   144  		return rewriteValuegeneric_OpLess64(v, config)
   145  	case OpLess64U:
   146  		return rewriteValuegeneric_OpLess64U(v, config)
   147  	case OpLess8:
   148  		return rewriteValuegeneric_OpLess8(v, config)
   149  	case OpLess8U:
   150  		return rewriteValuegeneric_OpLess8U(v, config)
   151  	case OpLoad:
   152  		return rewriteValuegeneric_OpLoad(v, config)
   153  	case OpLsh16x16:
   154  		return rewriteValuegeneric_OpLsh16x16(v, config)
   155  	case OpLsh16x32:
   156  		return rewriteValuegeneric_OpLsh16x32(v, config)
   157  	case OpLsh16x64:
   158  		return rewriteValuegeneric_OpLsh16x64(v, config)
   159  	case OpLsh16x8:
   160  		return rewriteValuegeneric_OpLsh16x8(v, config)
   161  	case OpLsh32x16:
   162  		return rewriteValuegeneric_OpLsh32x16(v, config)
   163  	case OpLsh32x32:
   164  		return rewriteValuegeneric_OpLsh32x32(v, config)
   165  	case OpLsh32x64:
   166  		return rewriteValuegeneric_OpLsh32x64(v, config)
   167  	case OpLsh32x8:
   168  		return rewriteValuegeneric_OpLsh32x8(v, config)
   169  	case OpLsh64x16:
   170  		return rewriteValuegeneric_OpLsh64x16(v, config)
   171  	case OpLsh64x32:
   172  		return rewriteValuegeneric_OpLsh64x32(v, config)
   173  	case OpLsh64x64:
   174  		return rewriteValuegeneric_OpLsh64x64(v, config)
   175  	case OpLsh64x8:
   176  		return rewriteValuegeneric_OpLsh64x8(v, config)
   177  	case OpLsh8x16:
   178  		return rewriteValuegeneric_OpLsh8x16(v, config)
   179  	case OpLsh8x32:
   180  		return rewriteValuegeneric_OpLsh8x32(v, config)
   181  	case OpLsh8x64:
   182  		return rewriteValuegeneric_OpLsh8x64(v, config)
   183  	case OpLsh8x8:
   184  		return rewriteValuegeneric_OpLsh8x8(v, config)
   185  	case OpMod16:
   186  		return rewriteValuegeneric_OpMod16(v, config)
   187  	case OpMod16u:
   188  		return rewriteValuegeneric_OpMod16u(v, config)
   189  	case OpMod32:
   190  		return rewriteValuegeneric_OpMod32(v, config)
   191  	case OpMod32u:
   192  		return rewriteValuegeneric_OpMod32u(v, config)
   193  	case OpMod64:
   194  		return rewriteValuegeneric_OpMod64(v, config)
   195  	case OpMod64u:
   196  		return rewriteValuegeneric_OpMod64u(v, config)
   197  	case OpMod8:
   198  		return rewriteValuegeneric_OpMod8(v, config)
   199  	case OpMod8u:
   200  		return rewriteValuegeneric_OpMod8u(v, config)
   201  	case OpMul16:
   202  		return rewriteValuegeneric_OpMul16(v, config)
   203  	case OpMul32:
   204  		return rewriteValuegeneric_OpMul32(v, config)
   205  	case OpMul32F:
   206  		return rewriteValuegeneric_OpMul32F(v, config)
   207  	case OpMul64:
   208  		return rewriteValuegeneric_OpMul64(v, config)
   209  	case OpMul64F:
   210  		return rewriteValuegeneric_OpMul64F(v, config)
   211  	case OpMul8:
   212  		return rewriteValuegeneric_OpMul8(v, config)
   213  	case OpNeg16:
   214  		return rewriteValuegeneric_OpNeg16(v, config)
   215  	case OpNeg32:
   216  		return rewriteValuegeneric_OpNeg32(v, config)
   217  	case OpNeg64:
   218  		return rewriteValuegeneric_OpNeg64(v, config)
   219  	case OpNeg8:
   220  		return rewriteValuegeneric_OpNeg8(v, config)
   221  	case OpNeq16:
   222  		return rewriteValuegeneric_OpNeq16(v, config)
   223  	case OpNeq32:
   224  		return rewriteValuegeneric_OpNeq32(v, config)
   225  	case OpNeq64:
   226  		return rewriteValuegeneric_OpNeq64(v, config)
   227  	case OpNeq8:
   228  		return rewriteValuegeneric_OpNeq8(v, config)
   229  	case OpNeqB:
   230  		return rewriteValuegeneric_OpNeqB(v, config)
   231  	case OpNeqInter:
   232  		return rewriteValuegeneric_OpNeqInter(v, config)
   233  	case OpNeqPtr:
   234  		return rewriteValuegeneric_OpNeqPtr(v, config)
   235  	case OpNeqSlice:
   236  		return rewriteValuegeneric_OpNeqSlice(v, config)
   237  	case OpNilCheck:
   238  		return rewriteValuegeneric_OpNilCheck(v, config)
   239  	case OpNot:
   240  		return rewriteValuegeneric_OpNot(v, config)
   241  	case OpOffPtr:
   242  		return rewriteValuegeneric_OpOffPtr(v, config)
   243  	case OpOr16:
   244  		return rewriteValuegeneric_OpOr16(v, config)
   245  	case OpOr32:
   246  		return rewriteValuegeneric_OpOr32(v, config)
   247  	case OpOr64:
   248  		return rewriteValuegeneric_OpOr64(v, config)
   249  	case OpOr8:
   250  		return rewriteValuegeneric_OpOr8(v, config)
   251  	case OpPhi:
   252  		return rewriteValuegeneric_OpPhi(v, config)
   253  	case OpPtrIndex:
   254  		return rewriteValuegeneric_OpPtrIndex(v, config)
   255  	case OpRsh16Ux16:
   256  		return rewriteValuegeneric_OpRsh16Ux16(v, config)
   257  	case OpRsh16Ux32:
   258  		return rewriteValuegeneric_OpRsh16Ux32(v, config)
   259  	case OpRsh16Ux64:
   260  		return rewriteValuegeneric_OpRsh16Ux64(v, config)
   261  	case OpRsh16Ux8:
   262  		return rewriteValuegeneric_OpRsh16Ux8(v, config)
   263  	case OpRsh16x16:
   264  		return rewriteValuegeneric_OpRsh16x16(v, config)
   265  	case OpRsh16x32:
   266  		return rewriteValuegeneric_OpRsh16x32(v, config)
   267  	case OpRsh16x64:
   268  		return rewriteValuegeneric_OpRsh16x64(v, config)
   269  	case OpRsh16x8:
   270  		return rewriteValuegeneric_OpRsh16x8(v, config)
   271  	case OpRsh32Ux16:
   272  		return rewriteValuegeneric_OpRsh32Ux16(v, config)
   273  	case OpRsh32Ux32:
   274  		return rewriteValuegeneric_OpRsh32Ux32(v, config)
   275  	case OpRsh32Ux64:
   276  		return rewriteValuegeneric_OpRsh32Ux64(v, config)
   277  	case OpRsh32Ux8:
   278  		return rewriteValuegeneric_OpRsh32Ux8(v, config)
   279  	case OpRsh32x16:
   280  		return rewriteValuegeneric_OpRsh32x16(v, config)
   281  	case OpRsh32x32:
   282  		return rewriteValuegeneric_OpRsh32x32(v, config)
   283  	case OpRsh32x64:
   284  		return rewriteValuegeneric_OpRsh32x64(v, config)
   285  	case OpRsh32x8:
   286  		return rewriteValuegeneric_OpRsh32x8(v, config)
   287  	case OpRsh64Ux16:
   288  		return rewriteValuegeneric_OpRsh64Ux16(v, config)
   289  	case OpRsh64Ux32:
   290  		return rewriteValuegeneric_OpRsh64Ux32(v, config)
   291  	case OpRsh64Ux64:
   292  		return rewriteValuegeneric_OpRsh64Ux64(v, config)
   293  	case OpRsh64Ux8:
   294  		return rewriteValuegeneric_OpRsh64Ux8(v, config)
   295  	case OpRsh64x16:
   296  		return rewriteValuegeneric_OpRsh64x16(v, config)
   297  	case OpRsh64x32:
   298  		return rewriteValuegeneric_OpRsh64x32(v, config)
   299  	case OpRsh64x64:
   300  		return rewriteValuegeneric_OpRsh64x64(v, config)
   301  	case OpRsh64x8:
   302  		return rewriteValuegeneric_OpRsh64x8(v, config)
   303  	case OpRsh8Ux16:
   304  		return rewriteValuegeneric_OpRsh8Ux16(v, config)
   305  	case OpRsh8Ux32:
   306  		return rewriteValuegeneric_OpRsh8Ux32(v, config)
   307  	case OpRsh8Ux64:
   308  		return rewriteValuegeneric_OpRsh8Ux64(v, config)
   309  	case OpRsh8Ux8:
   310  		return rewriteValuegeneric_OpRsh8Ux8(v, config)
   311  	case OpRsh8x16:
   312  		return rewriteValuegeneric_OpRsh8x16(v, config)
   313  	case OpRsh8x32:
   314  		return rewriteValuegeneric_OpRsh8x32(v, config)
   315  	case OpRsh8x64:
   316  		return rewriteValuegeneric_OpRsh8x64(v, config)
   317  	case OpRsh8x8:
   318  		return rewriteValuegeneric_OpRsh8x8(v, config)
   319  	case OpSignExt16to32:
   320  		return rewriteValuegeneric_OpSignExt16to32(v, config)
   321  	case OpSignExt16to64:
   322  		return rewriteValuegeneric_OpSignExt16to64(v, config)
   323  	case OpSignExt32to64:
   324  		return rewriteValuegeneric_OpSignExt32to64(v, config)
   325  	case OpSignExt8to16:
   326  		return rewriteValuegeneric_OpSignExt8to16(v, config)
   327  	case OpSignExt8to32:
   328  		return rewriteValuegeneric_OpSignExt8to32(v, config)
   329  	case OpSignExt8to64:
   330  		return rewriteValuegeneric_OpSignExt8to64(v, config)
   331  	case OpSliceCap:
   332  		return rewriteValuegeneric_OpSliceCap(v, config)
   333  	case OpSliceLen:
   334  		return rewriteValuegeneric_OpSliceLen(v, config)
   335  	case OpSlicePtr:
   336  		return rewriteValuegeneric_OpSlicePtr(v, config)
   337  	case OpSlicemask:
   338  		return rewriteValuegeneric_OpSlicemask(v, config)
   339  	case OpSqrt:
   340  		return rewriteValuegeneric_OpSqrt(v, config)
   341  	case OpStore:
   342  		return rewriteValuegeneric_OpStore(v, config)
   343  	case OpStringLen:
   344  		return rewriteValuegeneric_OpStringLen(v, config)
   345  	case OpStringPtr:
   346  		return rewriteValuegeneric_OpStringPtr(v, config)
   347  	case OpStructSelect:
   348  		return rewriteValuegeneric_OpStructSelect(v, config)
   349  	case OpSub16:
   350  		return rewriteValuegeneric_OpSub16(v, config)
   351  	case OpSub32:
   352  		return rewriteValuegeneric_OpSub32(v, config)
   353  	case OpSub32F:
   354  		return rewriteValuegeneric_OpSub32F(v, config)
   355  	case OpSub64:
   356  		return rewriteValuegeneric_OpSub64(v, config)
   357  	case OpSub64F:
   358  		return rewriteValuegeneric_OpSub64F(v, config)
   359  	case OpSub8:
   360  		return rewriteValuegeneric_OpSub8(v, config)
   361  	case OpTrunc16to8:
   362  		return rewriteValuegeneric_OpTrunc16to8(v, config)
   363  	case OpTrunc32to16:
   364  		return rewriteValuegeneric_OpTrunc32to16(v, config)
   365  	case OpTrunc32to8:
   366  		return rewriteValuegeneric_OpTrunc32to8(v, config)
   367  	case OpTrunc64to16:
   368  		return rewriteValuegeneric_OpTrunc64to16(v, config)
   369  	case OpTrunc64to32:
   370  		return rewriteValuegeneric_OpTrunc64to32(v, config)
   371  	case OpTrunc64to8:
   372  		return rewriteValuegeneric_OpTrunc64to8(v, config)
   373  	case OpXor16:
   374  		return rewriteValuegeneric_OpXor16(v, config)
   375  	case OpXor32:
   376  		return rewriteValuegeneric_OpXor32(v, config)
   377  	case OpXor64:
   378  		return rewriteValuegeneric_OpXor64(v, config)
   379  	case OpXor8:
   380  		return rewriteValuegeneric_OpXor8(v, config)
   381  	case OpZero:
   382  		return rewriteValuegeneric_OpZero(v, config)
   383  	case OpZeroExt16to32:
   384  		return rewriteValuegeneric_OpZeroExt16to32(v, config)
   385  	case OpZeroExt16to64:
   386  		return rewriteValuegeneric_OpZeroExt16to64(v, config)
   387  	case OpZeroExt32to64:
   388  		return rewriteValuegeneric_OpZeroExt32to64(v, config)
   389  	case OpZeroExt8to16:
   390  		return rewriteValuegeneric_OpZeroExt8to16(v, config)
   391  	case OpZeroExt8to32:
   392  		return rewriteValuegeneric_OpZeroExt8to32(v, config)
   393  	case OpZeroExt8to64:
   394  		return rewriteValuegeneric_OpZeroExt8to64(v, config)
   395  	}
   396  	return false
   397  }
   398  func rewriteValuegeneric_OpAdd16(v *Value, config *Config) bool {
   399  	b := v.Block
   400  	_ = b
   401  	// match: (Add16  (Const16 [c])  (Const16 [d]))
   402  	// cond:
   403  	// result: (Const16 [int64(int16(c+d))])
   404  	for {
   405  		v_0 := v.Args[0]
   406  		if v_0.Op != OpConst16 {
   407  			break
   408  		}
   409  		c := v_0.AuxInt
   410  		v_1 := v.Args[1]
   411  		if v_1.Op != OpConst16 {
   412  			break
   413  		}
   414  		d := v_1.AuxInt
   415  		v.reset(OpConst16)
   416  		v.AuxInt = int64(int16(c + d))
   417  		return true
   418  	}
   419  	// match: (Add16 x (Const16 <t> [c]))
   420  	// cond: x.Op != OpConst16
   421  	// result: (Add16 (Const16 <t> [c]) x)
   422  	for {
   423  		x := v.Args[0]
   424  		v_1 := v.Args[1]
   425  		if v_1.Op != OpConst16 {
   426  			break
   427  		}
   428  		t := v_1.Type
   429  		c := v_1.AuxInt
   430  		if !(x.Op != OpConst16) {
   431  			break
   432  		}
   433  		v.reset(OpAdd16)
   434  		v0 := b.NewValue0(v.Line, OpConst16, t)
   435  		v0.AuxInt = c
   436  		v.AddArg(v0)
   437  		v.AddArg(x)
   438  		return true
   439  	}
   440  	// match: (Add16 (Const16 [0]) x)
   441  	// cond:
   442  	// result: x
   443  	for {
   444  		v_0 := v.Args[0]
   445  		if v_0.Op != OpConst16 {
   446  			break
   447  		}
   448  		if v_0.AuxInt != 0 {
   449  			break
   450  		}
   451  		x := v.Args[1]
   452  		v.reset(OpCopy)
   453  		v.Type = x.Type
   454  		v.AddArg(x)
   455  		return true
   456  	}
   457  	return false
   458  }
   459  func rewriteValuegeneric_OpAdd32(v *Value, config *Config) bool {
   460  	b := v.Block
   461  	_ = b
   462  	// match: (Add32  (Const32 [c])  (Const32 [d]))
   463  	// cond:
   464  	// result: (Const32 [int64(int32(c+d))])
   465  	for {
   466  		v_0 := v.Args[0]
   467  		if v_0.Op != OpConst32 {
   468  			break
   469  		}
   470  		c := v_0.AuxInt
   471  		v_1 := v.Args[1]
   472  		if v_1.Op != OpConst32 {
   473  			break
   474  		}
   475  		d := v_1.AuxInt
   476  		v.reset(OpConst32)
   477  		v.AuxInt = int64(int32(c + d))
   478  		return true
   479  	}
   480  	// match: (Add32 x (Const32 <t> [c]))
   481  	// cond: x.Op != OpConst32
   482  	// result: (Add32 (Const32 <t> [c]) x)
   483  	for {
   484  		x := v.Args[0]
   485  		v_1 := v.Args[1]
   486  		if v_1.Op != OpConst32 {
   487  			break
   488  		}
   489  		t := v_1.Type
   490  		c := v_1.AuxInt
   491  		if !(x.Op != OpConst32) {
   492  			break
   493  		}
   494  		v.reset(OpAdd32)
   495  		v0 := b.NewValue0(v.Line, OpConst32, t)
   496  		v0.AuxInt = c
   497  		v.AddArg(v0)
   498  		v.AddArg(x)
   499  		return true
   500  	}
   501  	// match: (Add32 (Const32 [0]) x)
   502  	// cond:
   503  	// result: x
   504  	for {
   505  		v_0 := v.Args[0]
   506  		if v_0.Op != OpConst32 {
   507  			break
   508  		}
   509  		if v_0.AuxInt != 0 {
   510  			break
   511  		}
   512  		x := v.Args[1]
   513  		v.reset(OpCopy)
   514  		v.Type = x.Type
   515  		v.AddArg(x)
   516  		return true
   517  	}
   518  	return false
   519  }
   520  func rewriteValuegeneric_OpAdd32F(v *Value, config *Config) bool {
   521  	b := v.Block
   522  	_ = b
   523  	// match: (Add32F (Const32F [c]) (Const32F [d]))
   524  	// cond:
   525  	// result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))])
   526  	for {
   527  		v_0 := v.Args[0]
   528  		if v_0.Op != OpConst32F {
   529  			break
   530  		}
   531  		c := v_0.AuxInt
   532  		v_1 := v.Args[1]
   533  		if v_1.Op != OpConst32F {
   534  			break
   535  		}
   536  		d := v_1.AuxInt
   537  		v.reset(OpConst32F)
   538  		v.AuxInt = f2i(float64(i2f32(c) + i2f32(d)))
   539  		return true
   540  	}
   541  	// match: (Add32F x (Const32F [0]))
   542  	// cond:
   543  	// result: x
   544  	for {
   545  		x := v.Args[0]
   546  		v_1 := v.Args[1]
   547  		if v_1.Op != OpConst32F {
   548  			break
   549  		}
   550  		if v_1.AuxInt != 0 {
   551  			break
   552  		}
   553  		v.reset(OpCopy)
   554  		v.Type = x.Type
   555  		v.AddArg(x)
   556  		return true
   557  	}
   558  	// match: (Add32F (Const32F [0]) x)
   559  	// cond:
   560  	// result: x
   561  	for {
   562  		v_0 := v.Args[0]
   563  		if v_0.Op != OpConst32F {
   564  			break
   565  		}
   566  		if v_0.AuxInt != 0 {
   567  			break
   568  		}
   569  		x := v.Args[1]
   570  		v.reset(OpCopy)
   571  		v.Type = x.Type
   572  		v.AddArg(x)
   573  		return true
   574  	}
   575  	return false
   576  }
   577  func rewriteValuegeneric_OpAdd64(v *Value, config *Config) bool {
   578  	b := v.Block
   579  	_ = b
   580  	// match: (Add64  (Const64 [c])  (Const64 [d]))
   581  	// cond:
   582  	// result: (Const64 [c+d])
   583  	for {
   584  		v_0 := v.Args[0]
   585  		if v_0.Op != OpConst64 {
   586  			break
   587  		}
   588  		c := v_0.AuxInt
   589  		v_1 := v.Args[1]
   590  		if v_1.Op != OpConst64 {
   591  			break
   592  		}
   593  		d := v_1.AuxInt
   594  		v.reset(OpConst64)
   595  		v.AuxInt = c + d
   596  		return true
   597  	}
   598  	// match: (Add64 x (Const64 <t> [c]))
   599  	// cond: x.Op != OpConst64
   600  	// result: (Add64 (Const64 <t> [c]) x)
   601  	for {
   602  		x := v.Args[0]
   603  		v_1 := v.Args[1]
   604  		if v_1.Op != OpConst64 {
   605  			break
   606  		}
   607  		t := v_1.Type
   608  		c := v_1.AuxInt
   609  		if !(x.Op != OpConst64) {
   610  			break
   611  		}
   612  		v.reset(OpAdd64)
   613  		v0 := b.NewValue0(v.Line, OpConst64, t)
   614  		v0.AuxInt = c
   615  		v.AddArg(v0)
   616  		v.AddArg(x)
   617  		return true
   618  	}
   619  	// match: (Add64 (Const64 [0]) x)
   620  	// cond:
   621  	// result: x
   622  	for {
   623  		v_0 := v.Args[0]
   624  		if v_0.Op != OpConst64 {
   625  			break
   626  		}
   627  		if v_0.AuxInt != 0 {
   628  			break
   629  		}
   630  		x := v.Args[1]
   631  		v.reset(OpCopy)
   632  		v.Type = x.Type
   633  		v.AddArg(x)
   634  		return true
   635  	}
   636  	return false
   637  }
   638  func rewriteValuegeneric_OpAdd64F(v *Value, config *Config) bool {
   639  	b := v.Block
   640  	_ = b
   641  	// match: (Add64F (Const64F [c]) (Const64F [d]))
   642  	// cond:
   643  	// result: (Const64F [f2i(i2f(c) + i2f(d))])
   644  	for {
   645  		v_0 := v.Args[0]
   646  		if v_0.Op != OpConst64F {
   647  			break
   648  		}
   649  		c := v_0.AuxInt
   650  		v_1 := v.Args[1]
   651  		if v_1.Op != OpConst64F {
   652  			break
   653  		}
   654  		d := v_1.AuxInt
   655  		v.reset(OpConst64F)
   656  		v.AuxInt = f2i(i2f(c) + i2f(d))
   657  		return true
   658  	}
   659  	// match: (Add64F x (Const64F [0]))
   660  	// cond:
   661  	// result: x
   662  	for {
   663  		x := v.Args[0]
   664  		v_1 := v.Args[1]
   665  		if v_1.Op != OpConst64F {
   666  			break
   667  		}
   668  		if v_1.AuxInt != 0 {
   669  			break
   670  		}
   671  		v.reset(OpCopy)
   672  		v.Type = x.Type
   673  		v.AddArg(x)
   674  		return true
   675  	}
   676  	// match: (Add64F (Const64F [0]) x)
   677  	// cond:
   678  	// result: x
   679  	for {
   680  		v_0 := v.Args[0]
   681  		if v_0.Op != OpConst64F {
   682  			break
   683  		}
   684  		if v_0.AuxInt != 0 {
   685  			break
   686  		}
   687  		x := v.Args[1]
   688  		v.reset(OpCopy)
   689  		v.Type = x.Type
   690  		v.AddArg(x)
   691  		return true
   692  	}
   693  	return false
   694  }
   695  func rewriteValuegeneric_OpAdd8(v *Value, config *Config) bool {
   696  	b := v.Block
   697  	_ = b
   698  	// match: (Add8   (Const8 [c])   (Const8 [d]))
   699  	// cond:
   700  	// result: (Const8  [int64(int8(c+d))])
   701  	for {
   702  		v_0 := v.Args[0]
   703  		if v_0.Op != OpConst8 {
   704  			break
   705  		}
   706  		c := v_0.AuxInt
   707  		v_1 := v.Args[1]
   708  		if v_1.Op != OpConst8 {
   709  			break
   710  		}
   711  		d := v_1.AuxInt
   712  		v.reset(OpConst8)
   713  		v.AuxInt = int64(int8(c + d))
   714  		return true
   715  	}
   716  	// match: (Add8  x (Const8  <t> [c]))
   717  	// cond: x.Op != OpConst8
   718  	// result: (Add8  (Const8  <t> [c]) x)
   719  	for {
   720  		x := v.Args[0]
   721  		v_1 := v.Args[1]
   722  		if v_1.Op != OpConst8 {
   723  			break
   724  		}
   725  		t := v_1.Type
   726  		c := v_1.AuxInt
   727  		if !(x.Op != OpConst8) {
   728  			break
   729  		}
   730  		v.reset(OpAdd8)
   731  		v0 := b.NewValue0(v.Line, OpConst8, t)
   732  		v0.AuxInt = c
   733  		v.AddArg(v0)
   734  		v.AddArg(x)
   735  		return true
   736  	}
   737  	// match: (Add8  (Const8  [0]) x)
   738  	// cond:
   739  	// result: x
   740  	for {
   741  		v_0 := v.Args[0]
   742  		if v_0.Op != OpConst8 {
   743  			break
   744  		}
   745  		if v_0.AuxInt != 0 {
   746  			break
   747  		}
   748  		x := v.Args[1]
   749  		v.reset(OpCopy)
   750  		v.Type = x.Type
   751  		v.AddArg(x)
   752  		return true
   753  	}
   754  	return false
   755  }
   756  func rewriteValuegeneric_OpAddPtr(v *Value, config *Config) bool {
   757  	b := v.Block
   758  	_ = b
   759  	// match: (AddPtr <t> x (Const64 [c]))
   760  	// cond:
   761  	// result: (OffPtr <t> x [c])
   762  	for {
   763  		t := v.Type
   764  		x := v.Args[0]
   765  		v_1 := v.Args[1]
   766  		if v_1.Op != OpConst64 {
   767  			break
   768  		}
   769  		c := v_1.AuxInt
   770  		v.reset(OpOffPtr)
   771  		v.Type = t
   772  		v.AuxInt = c
   773  		v.AddArg(x)
   774  		return true
   775  	}
   776  	return false
   777  }
   778  func rewriteValuegeneric_OpAnd16(v *Value, config *Config) bool {
   779  	b := v.Block
   780  	_ = b
   781  	// match: (And16 x (Const16 <t> [c]))
   782  	// cond: x.Op != OpConst16
   783  	// result: (And16 (Const16 <t> [c]) x)
   784  	for {
   785  		x := v.Args[0]
   786  		v_1 := v.Args[1]
   787  		if v_1.Op != OpConst16 {
   788  			break
   789  		}
   790  		t := v_1.Type
   791  		c := v_1.AuxInt
   792  		if !(x.Op != OpConst16) {
   793  			break
   794  		}
   795  		v.reset(OpAnd16)
   796  		v0 := b.NewValue0(v.Line, OpConst16, t)
   797  		v0.AuxInt = c
   798  		v.AddArg(v0)
   799  		v.AddArg(x)
   800  		return true
   801  	}
   802  	// match: (And16 x x)
   803  	// cond:
   804  	// result: x
   805  	for {
   806  		x := v.Args[0]
   807  		if x != v.Args[1] {
   808  			break
   809  		}
   810  		v.reset(OpCopy)
   811  		v.Type = x.Type
   812  		v.AddArg(x)
   813  		return true
   814  	}
   815  	// match: (And16 (Const16 [-1]) x)
   816  	// cond:
   817  	// result: x
   818  	for {
   819  		v_0 := v.Args[0]
   820  		if v_0.Op != OpConst16 {
   821  			break
   822  		}
   823  		if v_0.AuxInt != -1 {
   824  			break
   825  		}
   826  		x := v.Args[1]
   827  		v.reset(OpCopy)
   828  		v.Type = x.Type
   829  		v.AddArg(x)
   830  		return true
   831  	}
   832  	// match: (And16 (Const16 [0]) _)
   833  	// cond:
   834  	// result: (Const16 [0])
   835  	for {
   836  		v_0 := v.Args[0]
   837  		if v_0.Op != OpConst16 {
   838  			break
   839  		}
   840  		if v_0.AuxInt != 0 {
   841  			break
   842  		}
   843  		v.reset(OpConst16)
   844  		v.AuxInt = 0
   845  		return true
   846  	}
   847  	// match: (And16 x (And16 x y))
   848  	// cond:
   849  	// result: (And16 x y)
   850  	for {
   851  		x := v.Args[0]
   852  		v_1 := v.Args[1]
   853  		if v_1.Op != OpAnd16 {
   854  			break
   855  		}
   856  		if x != v_1.Args[0] {
   857  			break
   858  		}
   859  		y := v_1.Args[1]
   860  		v.reset(OpAnd16)
   861  		v.AddArg(x)
   862  		v.AddArg(y)
   863  		return true
   864  	}
   865  	// match: (And16 x (And16 y x))
   866  	// cond:
   867  	// result: (And16 x y)
   868  	for {
   869  		x := v.Args[0]
   870  		v_1 := v.Args[1]
   871  		if v_1.Op != OpAnd16 {
   872  			break
   873  		}
   874  		y := v_1.Args[0]
   875  		if x != v_1.Args[1] {
   876  			break
   877  		}
   878  		v.reset(OpAnd16)
   879  		v.AddArg(x)
   880  		v.AddArg(y)
   881  		return true
   882  	}
   883  	// match: (And16 (And16 x y) x)
   884  	// cond:
   885  	// result: (And16 x y)
   886  	for {
   887  		v_0 := v.Args[0]
   888  		if v_0.Op != OpAnd16 {
   889  			break
   890  		}
   891  		x := v_0.Args[0]
   892  		y := v_0.Args[1]
   893  		if x != v.Args[1] {
   894  			break
   895  		}
   896  		v.reset(OpAnd16)
   897  		v.AddArg(x)
   898  		v.AddArg(y)
   899  		return true
   900  	}
   901  	// match: (And16 (And16 x y) y)
   902  	// cond:
   903  	// result: (And16 x y)
   904  	for {
   905  		v_0 := v.Args[0]
   906  		if v_0.Op != OpAnd16 {
   907  			break
   908  		}
   909  		x := v_0.Args[0]
   910  		y := v_0.Args[1]
   911  		if y != v.Args[1] {
   912  			break
   913  		}
   914  		v.reset(OpAnd16)
   915  		v.AddArg(x)
   916  		v.AddArg(y)
   917  		return true
   918  	}
   919  	return false
   920  }
   921  func rewriteValuegeneric_OpAnd32(v *Value, config *Config) bool {
   922  	b := v.Block
   923  	_ = b
   924  	// match: (And32 x (Const32 <t> [c]))
   925  	// cond: x.Op != OpConst32
   926  	// result: (And32 (Const32 <t> [c]) x)
   927  	for {
   928  		x := v.Args[0]
   929  		v_1 := v.Args[1]
   930  		if v_1.Op != OpConst32 {
   931  			break
   932  		}
   933  		t := v_1.Type
   934  		c := v_1.AuxInt
   935  		if !(x.Op != OpConst32) {
   936  			break
   937  		}
   938  		v.reset(OpAnd32)
   939  		v0 := b.NewValue0(v.Line, OpConst32, t)
   940  		v0.AuxInt = c
   941  		v.AddArg(v0)
   942  		v.AddArg(x)
   943  		return true
   944  	}
   945  	// match: (And32 x x)
   946  	// cond:
   947  	// result: x
   948  	for {
   949  		x := v.Args[0]
   950  		if x != v.Args[1] {
   951  			break
   952  		}
   953  		v.reset(OpCopy)
   954  		v.Type = x.Type
   955  		v.AddArg(x)
   956  		return true
   957  	}
   958  	// match: (And32 (Const32 [-1]) x)
   959  	// cond:
   960  	// result: x
   961  	for {
   962  		v_0 := v.Args[0]
   963  		if v_0.Op != OpConst32 {
   964  			break
   965  		}
   966  		if v_0.AuxInt != -1 {
   967  			break
   968  		}
   969  		x := v.Args[1]
   970  		v.reset(OpCopy)
   971  		v.Type = x.Type
   972  		v.AddArg(x)
   973  		return true
   974  	}
   975  	// match: (And32 (Const32 [0]) _)
   976  	// cond:
   977  	// result: (Const32 [0])
   978  	for {
   979  		v_0 := v.Args[0]
   980  		if v_0.Op != OpConst32 {
   981  			break
   982  		}
   983  		if v_0.AuxInt != 0 {
   984  			break
   985  		}
   986  		v.reset(OpConst32)
   987  		v.AuxInt = 0
   988  		return true
   989  	}
   990  	// match: (And32 x (And32 x y))
   991  	// cond:
   992  	// result: (And32 x y)
   993  	for {
   994  		x := v.Args[0]
   995  		v_1 := v.Args[1]
   996  		if v_1.Op != OpAnd32 {
   997  			break
   998  		}
   999  		if x != v_1.Args[0] {
  1000  			break
  1001  		}
  1002  		y := v_1.Args[1]
  1003  		v.reset(OpAnd32)
  1004  		v.AddArg(x)
  1005  		v.AddArg(y)
  1006  		return true
  1007  	}
  1008  	// match: (And32 x (And32 y x))
  1009  	// cond:
  1010  	// result: (And32 x y)
  1011  	for {
  1012  		x := v.Args[0]
  1013  		v_1 := v.Args[1]
  1014  		if v_1.Op != OpAnd32 {
  1015  			break
  1016  		}
  1017  		y := v_1.Args[0]
  1018  		if x != v_1.Args[1] {
  1019  			break
  1020  		}
  1021  		v.reset(OpAnd32)
  1022  		v.AddArg(x)
  1023  		v.AddArg(y)
  1024  		return true
  1025  	}
  1026  	// match: (And32 (And32 x y) x)
  1027  	// cond:
  1028  	// result: (And32 x y)
  1029  	for {
  1030  		v_0 := v.Args[0]
  1031  		if v_0.Op != OpAnd32 {
  1032  			break
  1033  		}
  1034  		x := v_0.Args[0]
  1035  		y := v_0.Args[1]
  1036  		if x != v.Args[1] {
  1037  			break
  1038  		}
  1039  		v.reset(OpAnd32)
  1040  		v.AddArg(x)
  1041  		v.AddArg(y)
  1042  		return true
  1043  	}
  1044  	// match: (And32 (And32 x y) y)
  1045  	// cond:
  1046  	// result: (And32 x y)
  1047  	for {
  1048  		v_0 := v.Args[0]
  1049  		if v_0.Op != OpAnd32 {
  1050  			break
  1051  		}
  1052  		x := v_0.Args[0]
  1053  		y := v_0.Args[1]
  1054  		if y != v.Args[1] {
  1055  			break
  1056  		}
  1057  		v.reset(OpAnd32)
  1058  		v.AddArg(x)
  1059  		v.AddArg(y)
  1060  		return true
  1061  	}
  1062  	return false
  1063  }
  1064  func rewriteValuegeneric_OpAnd64(v *Value, config *Config) bool {
  1065  	b := v.Block
  1066  	_ = b
  1067  	// match: (And64 x (Const64 <t> [c]))
  1068  	// cond: x.Op != OpConst64
  1069  	// result: (And64 (Const64 <t> [c]) x)
  1070  	for {
  1071  		x := v.Args[0]
  1072  		v_1 := v.Args[1]
  1073  		if v_1.Op != OpConst64 {
  1074  			break
  1075  		}
  1076  		t := v_1.Type
  1077  		c := v_1.AuxInt
  1078  		if !(x.Op != OpConst64) {
  1079  			break
  1080  		}
  1081  		v.reset(OpAnd64)
  1082  		v0 := b.NewValue0(v.Line, OpConst64, t)
  1083  		v0.AuxInt = c
  1084  		v.AddArg(v0)
  1085  		v.AddArg(x)
  1086  		return true
  1087  	}
  1088  	// match: (And64 x x)
  1089  	// cond:
  1090  	// result: x
  1091  	for {
  1092  		x := v.Args[0]
  1093  		if x != v.Args[1] {
  1094  			break
  1095  		}
  1096  		v.reset(OpCopy)
  1097  		v.Type = x.Type
  1098  		v.AddArg(x)
  1099  		return true
  1100  	}
  1101  	// match: (And64 (Const64 [-1]) x)
  1102  	// cond:
  1103  	// result: x
  1104  	for {
  1105  		v_0 := v.Args[0]
  1106  		if v_0.Op != OpConst64 {
  1107  			break
  1108  		}
  1109  		if v_0.AuxInt != -1 {
  1110  			break
  1111  		}
  1112  		x := v.Args[1]
  1113  		v.reset(OpCopy)
  1114  		v.Type = x.Type
  1115  		v.AddArg(x)
  1116  		return true
  1117  	}
  1118  	// match: (And64 (Const64 [0]) _)
  1119  	// cond:
  1120  	// result: (Const64 [0])
  1121  	for {
  1122  		v_0 := v.Args[0]
  1123  		if v_0.Op != OpConst64 {
  1124  			break
  1125  		}
  1126  		if v_0.AuxInt != 0 {
  1127  			break
  1128  		}
  1129  		v.reset(OpConst64)
  1130  		v.AuxInt = 0
  1131  		return true
  1132  	}
  1133  	// match: (And64 x (And64 x y))
  1134  	// cond:
  1135  	// result: (And64 x y)
  1136  	for {
  1137  		x := v.Args[0]
  1138  		v_1 := v.Args[1]
  1139  		if v_1.Op != OpAnd64 {
  1140  			break
  1141  		}
  1142  		if x != v_1.Args[0] {
  1143  			break
  1144  		}
  1145  		y := v_1.Args[1]
  1146  		v.reset(OpAnd64)
  1147  		v.AddArg(x)
  1148  		v.AddArg(y)
  1149  		return true
  1150  	}
  1151  	// match: (And64 x (And64 y x))
  1152  	// cond:
  1153  	// result: (And64 x y)
  1154  	for {
  1155  		x := v.Args[0]
  1156  		v_1 := v.Args[1]
  1157  		if v_1.Op != OpAnd64 {
  1158  			break
  1159  		}
  1160  		y := v_1.Args[0]
  1161  		if x != v_1.Args[1] {
  1162  			break
  1163  		}
  1164  		v.reset(OpAnd64)
  1165  		v.AddArg(x)
  1166  		v.AddArg(y)
  1167  		return true
  1168  	}
  1169  	// match: (And64 (And64 x y) x)
  1170  	// cond:
  1171  	// result: (And64 x y)
  1172  	for {
  1173  		v_0 := v.Args[0]
  1174  		if v_0.Op != OpAnd64 {
  1175  			break
  1176  		}
  1177  		x := v_0.Args[0]
  1178  		y := v_0.Args[1]
  1179  		if x != v.Args[1] {
  1180  			break
  1181  		}
  1182  		v.reset(OpAnd64)
  1183  		v.AddArg(x)
  1184  		v.AddArg(y)
  1185  		return true
  1186  	}
  1187  	// match: (And64 (And64 x y) y)
  1188  	// cond:
  1189  	// result: (And64 x y)
  1190  	for {
  1191  		v_0 := v.Args[0]
  1192  		if v_0.Op != OpAnd64 {
  1193  			break
  1194  		}
  1195  		x := v_0.Args[0]
  1196  		y := v_0.Args[1]
  1197  		if y != v.Args[1] {
  1198  			break
  1199  		}
  1200  		v.reset(OpAnd64)
  1201  		v.AddArg(x)
  1202  		v.AddArg(y)
  1203  		return true
  1204  	}
  1205  	// match: (And64 <t> (Const64 [y]) x)
  1206  	// cond: nlz(y) + nto(y) == 64 && nto(y) >= 32
  1207  	// result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)]))
  1208  	for {
  1209  		t := v.Type
  1210  		v_0 := v.Args[0]
  1211  		if v_0.Op != OpConst64 {
  1212  			break
  1213  		}
  1214  		y := v_0.AuxInt
  1215  		x := v.Args[1]
  1216  		if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) {
  1217  			break
  1218  		}
  1219  		v.reset(OpRsh64Ux64)
  1220  		v0 := b.NewValue0(v.Line, OpLsh64x64, t)
  1221  		v0.AddArg(x)
  1222  		v1 := b.NewValue0(v.Line, OpConst64, t)
  1223  		v1.AuxInt = nlz(y)
  1224  		v0.AddArg(v1)
  1225  		v.AddArg(v0)
  1226  		v2 := b.NewValue0(v.Line, OpConst64, t)
  1227  		v2.AuxInt = nlz(y)
  1228  		v.AddArg(v2)
  1229  		return true
  1230  	}
  1231  	// match: (And64 <t> (Const64 [y]) x)
  1232  	// cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32
  1233  	// result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)]))
  1234  	for {
  1235  		t := v.Type
  1236  		v_0 := v.Args[0]
  1237  		if v_0.Op != OpConst64 {
  1238  			break
  1239  		}
  1240  		y := v_0.AuxInt
  1241  		x := v.Args[1]
  1242  		if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) {
  1243  			break
  1244  		}
  1245  		v.reset(OpLsh64x64)
  1246  		v0 := b.NewValue0(v.Line, OpRsh64Ux64, t)
  1247  		v0.AddArg(x)
  1248  		v1 := b.NewValue0(v.Line, OpConst64, t)
  1249  		v1.AuxInt = ntz(y)
  1250  		v0.AddArg(v1)
  1251  		v.AddArg(v0)
  1252  		v2 := b.NewValue0(v.Line, OpConst64, t)
  1253  		v2.AuxInt = ntz(y)
  1254  		v.AddArg(v2)
  1255  		return true
  1256  	}
  1257  	return false
  1258  }
  1259  func rewriteValuegeneric_OpAnd8(v *Value, config *Config) bool {
  1260  	b := v.Block
  1261  	_ = b
  1262  	// match: (And8  x (Const8  <t> [c]))
  1263  	// cond: x.Op != OpConst8
  1264  	// result: (And8  (Const8  <t> [c]) x)
  1265  	for {
  1266  		x := v.Args[0]
  1267  		v_1 := v.Args[1]
  1268  		if v_1.Op != OpConst8 {
  1269  			break
  1270  		}
  1271  		t := v_1.Type
  1272  		c := v_1.AuxInt
  1273  		if !(x.Op != OpConst8) {
  1274  			break
  1275  		}
  1276  		v.reset(OpAnd8)
  1277  		v0 := b.NewValue0(v.Line, OpConst8, t)
  1278  		v0.AuxInt = c
  1279  		v.AddArg(v0)
  1280  		v.AddArg(x)
  1281  		return true
  1282  	}
  1283  	// match: (And8  x x)
  1284  	// cond:
  1285  	// result: x
  1286  	for {
  1287  		x := v.Args[0]
  1288  		if x != v.Args[1] {
  1289  			break
  1290  		}
  1291  		v.reset(OpCopy)
  1292  		v.Type = x.Type
  1293  		v.AddArg(x)
  1294  		return true
  1295  	}
  1296  	// match: (And8  (Const8  [-1]) x)
  1297  	// cond:
  1298  	// result: x
  1299  	for {
  1300  		v_0 := v.Args[0]
  1301  		if v_0.Op != OpConst8 {
  1302  			break
  1303  		}
  1304  		if v_0.AuxInt != -1 {
  1305  			break
  1306  		}
  1307  		x := v.Args[1]
  1308  		v.reset(OpCopy)
  1309  		v.Type = x.Type
  1310  		v.AddArg(x)
  1311  		return true
  1312  	}
  1313  	// match: (And8  (Const8  [0]) _)
  1314  	// cond:
  1315  	// result: (Const8  [0])
  1316  	for {
  1317  		v_0 := v.Args[0]
  1318  		if v_0.Op != OpConst8 {
  1319  			break
  1320  		}
  1321  		if v_0.AuxInt != 0 {
  1322  			break
  1323  		}
  1324  		v.reset(OpConst8)
  1325  		v.AuxInt = 0
  1326  		return true
  1327  	}
  1328  	// match: (And8  x (And8  x y))
  1329  	// cond:
  1330  	// result: (And8  x y)
  1331  	for {
  1332  		x := v.Args[0]
  1333  		v_1 := v.Args[1]
  1334  		if v_1.Op != OpAnd8 {
  1335  			break
  1336  		}
  1337  		if x != v_1.Args[0] {
  1338  			break
  1339  		}
  1340  		y := v_1.Args[1]
  1341  		v.reset(OpAnd8)
  1342  		v.AddArg(x)
  1343  		v.AddArg(y)
  1344  		return true
  1345  	}
  1346  	// match: (And8  x (And8  y x))
  1347  	// cond:
  1348  	// result: (And8  x y)
  1349  	for {
  1350  		x := v.Args[0]
  1351  		v_1 := v.Args[1]
  1352  		if v_1.Op != OpAnd8 {
  1353  			break
  1354  		}
  1355  		y := v_1.Args[0]
  1356  		if x != v_1.Args[1] {
  1357  			break
  1358  		}
  1359  		v.reset(OpAnd8)
  1360  		v.AddArg(x)
  1361  		v.AddArg(y)
  1362  		return true
  1363  	}
  1364  	// match: (And8  (And8  x y) x)
  1365  	// cond:
  1366  	// result: (And8  x y)
  1367  	for {
  1368  		v_0 := v.Args[0]
  1369  		if v_0.Op != OpAnd8 {
  1370  			break
  1371  		}
  1372  		x := v_0.Args[0]
  1373  		y := v_0.Args[1]
  1374  		if x != v.Args[1] {
  1375  			break
  1376  		}
  1377  		v.reset(OpAnd8)
  1378  		v.AddArg(x)
  1379  		v.AddArg(y)
  1380  		return true
  1381  	}
  1382  	// match: (And8  (And8  x y) y)
  1383  	// cond:
  1384  	// result: (And8  x y)
  1385  	for {
  1386  		v_0 := v.Args[0]
  1387  		if v_0.Op != OpAnd8 {
  1388  			break
  1389  		}
  1390  		x := v_0.Args[0]
  1391  		y := v_0.Args[1]
  1392  		if y != v.Args[1] {
  1393  			break
  1394  		}
  1395  		v.reset(OpAnd8)
  1396  		v.AddArg(x)
  1397  		v.AddArg(y)
  1398  		return true
  1399  	}
  1400  	return false
  1401  }
  1402  func rewriteValuegeneric_OpArg(v *Value, config *Config) bool {
  1403  	b := v.Block
  1404  	_ = b
  1405  	// match: (Arg {n} [off])
  1406  	// cond: v.Type.IsString()
  1407  	// result: (StringMake     (Arg <config.fe.TypeBytePtr()> {n} [off])     (Arg <config.fe.TypeInt()> {n} [off+config.PtrSize]))
  1408  	for {
  1409  		off := v.AuxInt
  1410  		n := v.Aux
  1411  		if !(v.Type.IsString()) {
  1412  			break
  1413  		}
  1414  		v.reset(OpStringMake)
  1415  		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
  1416  		v0.AuxInt = off
  1417  		v0.Aux = n
  1418  		v.AddArg(v0)
  1419  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
  1420  		v1.AuxInt = off + config.PtrSize
  1421  		v1.Aux = n
  1422  		v.AddArg(v1)
  1423  		return true
  1424  	}
  1425  	// match: (Arg {n} [off])
  1426  	// cond: v.Type.IsSlice()
  1427  	// result: (SliceMake     (Arg <v.Type.ElemType().PtrTo()> {n} [off])     (Arg <config.fe.TypeInt()> {n} [off+config.PtrSize])     (Arg <config.fe.TypeInt()> {n} [off+2*config.PtrSize]))
  1428  	for {
  1429  		off := v.AuxInt
  1430  		n := v.Aux
  1431  		if !(v.Type.IsSlice()) {
  1432  			break
  1433  		}
  1434  		v.reset(OpSliceMake)
  1435  		v0 := b.NewValue0(v.Line, OpArg, v.Type.ElemType().PtrTo())
  1436  		v0.AuxInt = off
  1437  		v0.Aux = n
  1438  		v.AddArg(v0)
  1439  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
  1440  		v1.AuxInt = off + config.PtrSize
  1441  		v1.Aux = n
  1442  		v.AddArg(v1)
  1443  		v2 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
  1444  		v2.AuxInt = off + 2*config.PtrSize
  1445  		v2.Aux = n
  1446  		v.AddArg(v2)
  1447  		return true
  1448  	}
  1449  	// match: (Arg {n} [off])
  1450  	// cond: v.Type.IsInterface()
  1451  	// result: (IMake     (Arg <config.fe.TypeBytePtr()> {n} [off])     (Arg <config.fe.TypeBytePtr()> {n} [off+config.PtrSize]))
  1452  	for {
  1453  		off := v.AuxInt
  1454  		n := v.Aux
  1455  		if !(v.Type.IsInterface()) {
  1456  			break
  1457  		}
  1458  		v.reset(OpIMake)
  1459  		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
  1460  		v0.AuxInt = off
  1461  		v0.Aux = n
  1462  		v.AddArg(v0)
  1463  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
  1464  		v1.AuxInt = off + config.PtrSize
  1465  		v1.Aux = n
  1466  		v.AddArg(v1)
  1467  		return true
  1468  	}
  1469  	// match: (Arg {n} [off])
  1470  	// cond: v.Type.IsComplex() && v.Type.Size() == 16
  1471  	// result: (ComplexMake     (Arg <config.fe.TypeFloat64()> {n} [off])     (Arg <config.fe.TypeFloat64()> {n} [off+8]))
  1472  	for {
  1473  		off := v.AuxInt
  1474  		n := v.Aux
  1475  		if !(v.Type.IsComplex() && v.Type.Size() == 16) {
  1476  			break
  1477  		}
  1478  		v.reset(OpComplexMake)
  1479  		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat64())
  1480  		v0.AuxInt = off
  1481  		v0.Aux = n
  1482  		v.AddArg(v0)
  1483  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat64())
  1484  		v1.AuxInt = off + 8
  1485  		v1.Aux = n
  1486  		v.AddArg(v1)
  1487  		return true
  1488  	}
  1489  	// match: (Arg {n} [off])
  1490  	// cond: v.Type.IsComplex() && v.Type.Size() == 8
  1491  	// result: (ComplexMake     (Arg <config.fe.TypeFloat32()> {n} [off])     (Arg <config.fe.TypeFloat32()> {n} [off+4]))
  1492  	for {
  1493  		off := v.AuxInt
  1494  		n := v.Aux
  1495  		if !(v.Type.IsComplex() && v.Type.Size() == 8) {
  1496  			break
  1497  		}
  1498  		v.reset(OpComplexMake)
  1499  		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat32())
  1500  		v0.AuxInt = off
  1501  		v0.Aux = n
  1502  		v.AddArg(v0)
  1503  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat32())
  1504  		v1.AuxInt = off + 4
  1505  		v1.Aux = n
  1506  		v.AddArg(v1)
  1507  		return true
  1508  	}
  1509  	// match: (Arg <t>)
  1510  	// cond: t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)
  1511  	// result: (StructMake0)
  1512  	for {
  1513  		t := v.Type
  1514  		if !(t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)) {
  1515  			break
  1516  		}
  1517  		v.reset(OpStructMake0)
  1518  		return true
  1519  	}
  1520  	// match: (Arg <t> {n} [off])
  1521  	// cond: t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)
  1522  	// result: (StructMake1     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]))
  1523  	for {
  1524  		t := v.Type
  1525  		off := v.AuxInt
  1526  		n := v.Aux
  1527  		if !(t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)) {
  1528  			break
  1529  		}
  1530  		v.reset(OpStructMake1)
  1531  		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
  1532  		v0.AuxInt = off + t.FieldOff(0)
  1533  		v0.Aux = n
  1534  		v.AddArg(v0)
  1535  		return true
  1536  	}
  1537  	// match: (Arg <t> {n} [off])
  1538  	// cond: t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)
  1539  	// result: (StructMake2     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])     (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]))
  1540  	for {
  1541  		t := v.Type
  1542  		off := v.AuxInt
  1543  		n := v.Aux
  1544  		if !(t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)) {
  1545  			break
  1546  		}
  1547  		v.reset(OpStructMake2)
  1548  		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
  1549  		v0.AuxInt = off + t.FieldOff(0)
  1550  		v0.Aux = n
  1551  		v.AddArg(v0)
  1552  		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
  1553  		v1.AuxInt = off + t.FieldOff(1)
  1554  		v1.Aux = n
  1555  		v.AddArg(v1)
  1556  		return true
  1557  	}
  1558  	// match: (Arg <t> {n} [off])
  1559  	// cond: t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)
  1560  	// result: (StructMake3     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])     (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])     (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)]))
  1561  	for {
  1562  		t := v.Type
  1563  		off := v.AuxInt
  1564  		n := v.Aux
  1565  		if !(t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)) {
  1566  			break
  1567  		}
  1568  		v.reset(OpStructMake3)
  1569  		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
  1570  		v0.AuxInt = off + t.FieldOff(0)
  1571  		v0.Aux = n
  1572  		v.AddArg(v0)
  1573  		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
  1574  		v1.AuxInt = off + t.FieldOff(1)
  1575  		v1.Aux = n
  1576  		v.AddArg(v1)
  1577  		v2 := b.NewValue0(v.Line, OpArg, t.FieldType(2))
  1578  		v2.AuxInt = off + t.FieldOff(2)
  1579  		v2.Aux = n
  1580  		v.AddArg(v2)
  1581  		return true
  1582  	}
  1583  	// match: (Arg <t> {n} [off])
  1584  	// cond: t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)
  1585  	// result: (StructMake4     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])     (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])     (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)])     (Arg <t.FieldType(3)> {n} [off+t.FieldOff(3)]))
  1586  	for {
  1587  		t := v.Type
  1588  		off := v.AuxInt
  1589  		n := v.Aux
  1590  		if !(t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)) {
  1591  			break
  1592  		}
  1593  		v.reset(OpStructMake4)
  1594  		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
  1595  		v0.AuxInt = off + t.FieldOff(0)
  1596  		v0.Aux = n
  1597  		v.AddArg(v0)
  1598  		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
  1599  		v1.AuxInt = off + t.FieldOff(1)
  1600  		v1.Aux = n
  1601  		v.AddArg(v1)
  1602  		v2 := b.NewValue0(v.Line, OpArg, t.FieldType(2))
  1603  		v2.AuxInt = off + t.FieldOff(2)
  1604  		v2.Aux = n
  1605  		v.AddArg(v2)
  1606  		v3 := b.NewValue0(v.Line, OpArg, t.FieldType(3))
  1607  		v3.AuxInt = off + t.FieldOff(3)
  1608  		v3.Aux = n
  1609  		v.AddArg(v3)
  1610  		return true
  1611  	}
  1612  	// match: (Arg <t>)
  1613  	// cond: t.IsArray() && t.NumElem() == 0
  1614  	// result: (ArrayMake0)
  1615  	for {
  1616  		t := v.Type
  1617  		if !(t.IsArray() && t.NumElem() == 0) {
  1618  			break
  1619  		}
  1620  		v.reset(OpArrayMake0)
  1621  		return true
  1622  	}
  1623  	// match: (Arg <t> {n} [off])
  1624  	// cond: t.IsArray() && t.NumElem() == 1 && config.fe.CanSSA(t)
  1625  	// result: (ArrayMake1 (Arg <t.ElemType()> {n} [off]))
  1626  	for {
  1627  		t := v.Type
  1628  		off := v.AuxInt
  1629  		n := v.Aux
  1630  		if !(t.IsArray() && t.NumElem() == 1 && config.fe.CanSSA(t)) {
  1631  			break
  1632  		}
  1633  		v.reset(OpArrayMake1)
  1634  		v0 := b.NewValue0(v.Line, OpArg, t.ElemType())
  1635  		v0.AuxInt = off
  1636  		v0.Aux = n
  1637  		v.AddArg(v0)
  1638  		return true
  1639  	}
  1640  	return false
  1641  }
  1642  func rewriteValuegeneric_OpArraySelect(v *Value, config *Config) bool {
  1643  	b := v.Block
  1644  	_ = b
  1645  	// match: (ArraySelect (ArrayMake1 x))
  1646  	// cond:
  1647  	// result: x
  1648  	for {
  1649  		v_0 := v.Args[0]
  1650  		if v_0.Op != OpArrayMake1 {
  1651  			break
  1652  		}
  1653  		x := v_0.Args[0]
  1654  		v.reset(OpCopy)
  1655  		v.Type = x.Type
  1656  		v.AddArg(x)
  1657  		return true
  1658  	}
  1659  	// match: (ArraySelect [0] (Load ptr mem))
  1660  	// cond:
  1661  	// result: (Load ptr mem)
  1662  	for {
  1663  		if v.AuxInt != 0 {
  1664  			break
  1665  		}
  1666  		v_0 := v.Args[0]
  1667  		if v_0.Op != OpLoad {
  1668  			break
  1669  		}
  1670  		ptr := v_0.Args[0]
  1671  		mem := v_0.Args[1]
  1672  		v.reset(OpLoad)
  1673  		v.AddArg(ptr)
  1674  		v.AddArg(mem)
  1675  		return true
  1676  	}
  1677  	// match: (ArraySelect [0] x:(IData _))
  1678  	// cond:
  1679  	// result: x
  1680  	for {
  1681  		if v.AuxInt != 0 {
  1682  			break
  1683  		}
  1684  		x := v.Args[0]
  1685  		if x.Op != OpIData {
  1686  			break
  1687  		}
  1688  		v.reset(OpCopy)
  1689  		v.Type = x.Type
  1690  		v.AddArg(x)
  1691  		return true
  1692  	}
  1693  	return false
  1694  }
  1695  func rewriteValuegeneric_OpCom16(v *Value, config *Config) bool {
  1696  	b := v.Block
  1697  	_ = b
  1698  	// match: (Com16 (Com16 x))
  1699  	// cond:
  1700  	// result: x
  1701  	for {
  1702  		v_0 := v.Args[0]
  1703  		if v_0.Op != OpCom16 {
  1704  			break
  1705  		}
  1706  		x := v_0.Args[0]
  1707  		v.reset(OpCopy)
  1708  		v.Type = x.Type
  1709  		v.AddArg(x)
  1710  		return true
  1711  	}
  1712  	return false
  1713  }
  1714  func rewriteValuegeneric_OpCom32(v *Value, config *Config) bool {
  1715  	b := v.Block
  1716  	_ = b
  1717  	// match: (Com32 (Com32 x))
  1718  	// cond:
  1719  	// result: x
  1720  	for {
  1721  		v_0 := v.Args[0]
  1722  		if v_0.Op != OpCom32 {
  1723  			break
  1724  		}
  1725  		x := v_0.Args[0]
  1726  		v.reset(OpCopy)
  1727  		v.Type = x.Type
  1728  		v.AddArg(x)
  1729  		return true
  1730  	}
  1731  	return false
  1732  }
  1733  func rewriteValuegeneric_OpCom64(v *Value, config *Config) bool {
  1734  	b := v.Block
  1735  	_ = b
  1736  	// match: (Com64 (Com64 x))
  1737  	// cond:
  1738  	// result: x
  1739  	for {
  1740  		v_0 := v.Args[0]
  1741  		if v_0.Op != OpCom64 {
  1742  			break
  1743  		}
  1744  		x := v_0.Args[0]
  1745  		v.reset(OpCopy)
  1746  		v.Type = x.Type
  1747  		v.AddArg(x)
  1748  		return true
  1749  	}
  1750  	return false
  1751  }
  1752  func rewriteValuegeneric_OpCom8(v *Value, config *Config) bool {
  1753  	b := v.Block
  1754  	_ = b
  1755  	// match: (Com8  (Com8  x))
  1756  	// cond:
  1757  	// result: x
  1758  	for {
  1759  		v_0 := v.Args[0]
  1760  		if v_0.Op != OpCom8 {
  1761  			break
  1762  		}
  1763  		x := v_0.Args[0]
  1764  		v.reset(OpCopy)
  1765  		v.Type = x.Type
  1766  		v.AddArg(x)
  1767  		return true
  1768  	}
  1769  	return false
  1770  }
  1771  func rewriteValuegeneric_OpConstInterface(v *Value, config *Config) bool {
  1772  	b := v.Block
  1773  	_ = b
  1774  	// match: (ConstInterface)
  1775  	// cond:
  1776  	// result: (IMake     (ConstNil <config.fe.TypeBytePtr()>)     (ConstNil <config.fe.TypeBytePtr()>))
  1777  	for {
  1778  		v.reset(OpIMake)
  1779  		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
  1780  		v.AddArg(v0)
  1781  		v1 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
  1782  		v.AddArg(v1)
  1783  		return true
  1784  	}
  1785  }
  1786  func rewriteValuegeneric_OpConstSlice(v *Value, config *Config) bool {
  1787  	b := v.Block
  1788  	_ = b
  1789  	// match: (ConstSlice)
  1790  	// cond: config.PtrSize == 4
  1791  	// result: (SliceMake     (ConstNil <v.Type.ElemType().PtrTo()>)     (Const32 <config.fe.TypeInt()> [0])     (Const32 <config.fe.TypeInt()> [0]))
  1792  	for {
  1793  		if !(config.PtrSize == 4) {
  1794  			break
  1795  		}
  1796  		v.reset(OpSliceMake)
  1797  		v0 := b.NewValue0(v.Line, OpConstNil, v.Type.ElemType().PtrTo())
  1798  		v.AddArg(v0)
  1799  		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
  1800  		v1.AuxInt = 0
  1801  		v.AddArg(v1)
  1802  		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
  1803  		v2.AuxInt = 0
  1804  		v.AddArg(v2)
  1805  		return true
  1806  	}
  1807  	// match: (ConstSlice)
  1808  	// cond: config.PtrSize == 8
  1809  	// result: (SliceMake     (ConstNil <v.Type.ElemType().PtrTo()>)     (Const64 <config.fe.TypeInt()> [0])     (Const64 <config.fe.TypeInt()> [0]))
  1810  	for {
  1811  		if !(config.PtrSize == 8) {
  1812  			break
  1813  		}
  1814  		v.reset(OpSliceMake)
  1815  		v0 := b.NewValue0(v.Line, OpConstNil, v.Type.ElemType().PtrTo())
  1816  		v.AddArg(v0)
  1817  		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
  1818  		v1.AuxInt = 0
  1819  		v.AddArg(v1)
  1820  		v2 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
  1821  		v2.AuxInt = 0
  1822  		v.AddArg(v2)
  1823  		return true
  1824  	}
  1825  	return false
  1826  }
  1827  func rewriteValuegeneric_OpConstString(v *Value, config *Config) bool {
  1828  	b := v.Block
  1829  	_ = b
  1830  	// match: (ConstString {s})
  1831  	// cond: config.PtrSize == 4 && s.(string) == ""
  1832  	// result: (StringMake (ConstNil) (Const32 <config.fe.TypeInt()> [0]))
  1833  	for {
  1834  		s := v.Aux
  1835  		if !(config.PtrSize == 4 && s.(string) == "") {
  1836  			break
  1837  		}
  1838  		v.reset(OpStringMake)
  1839  		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
  1840  		v.AddArg(v0)
  1841  		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
  1842  		v1.AuxInt = 0
  1843  		v.AddArg(v1)
  1844  		return true
  1845  	}
  1846  	// match: (ConstString {s})
  1847  	// cond: config.PtrSize == 8 && s.(string) == ""
  1848  	// result: (StringMake (ConstNil) (Const64 <config.fe.TypeInt()> [0]))
  1849  	for {
  1850  		s := v.Aux
  1851  		if !(config.PtrSize == 8 && s.(string) == "") {
  1852  			break
  1853  		}
  1854  		v.reset(OpStringMake)
  1855  		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
  1856  		v.AddArg(v0)
  1857  		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
  1858  		v1.AuxInt = 0
  1859  		v.AddArg(v1)
  1860  		return true
  1861  	}
  1862  	// match: (ConstString {s})
  1863  	// cond: config.PtrSize == 4 && s.(string) != ""
  1864  	// result: (StringMake     (Addr <config.fe.TypeBytePtr()> {config.fe.StringData(s.(string))}       (SB))     (Const32 <config.fe.TypeInt()> [int64(len(s.(string)))]))
  1865  	for {
  1866  		s := v.Aux
  1867  		if !(config.PtrSize == 4 && s.(string) != "") {
  1868  			break
  1869  		}
  1870  		v.reset(OpStringMake)
  1871  		v0 := b.NewValue0(v.Line, OpAddr, config.fe.TypeBytePtr())
  1872  		v0.Aux = config.fe.StringData(s.(string))
  1873  		v1 := b.NewValue0(v.Line, OpSB, config.fe.TypeUintptr())
  1874  		v0.AddArg(v1)
  1875  		v.AddArg(v0)
  1876  		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
  1877  		v2.AuxInt = int64(len(s.(string)))
  1878  		v.AddArg(v2)
  1879  		return true
  1880  	}
  1881  	// match: (ConstString {s})
  1882  	// cond: config.PtrSize == 8 && s.(string) != ""
  1883  	// result: (StringMake     (Addr <config.fe.TypeBytePtr()> {config.fe.StringData(s.(string))}       (SB))     (Const64 <config.fe.TypeInt()> [int64(len(s.(string)))]))
  1884  	for {
  1885  		s := v.Aux
  1886  		if !(config.PtrSize == 8 && s.(string) != "") {
  1887  			break
  1888  		}
  1889  		v.reset(OpStringMake)
  1890  		v0 := b.NewValue0(v.Line, OpAddr, config.fe.TypeBytePtr())
  1891  		v0.Aux = config.fe.StringData(s.(string))
  1892  		v1 := b.NewValue0(v.Line, OpSB, config.fe.TypeUintptr())
  1893  		v0.AddArg(v1)
  1894  		v.AddArg(v0)
  1895  		v2 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
  1896  		v2.AuxInt = int64(len(s.(string)))
  1897  		v.AddArg(v2)
  1898  		return true
  1899  	}
  1900  	return false
  1901  }
  1902  func rewriteValuegeneric_OpConvert(v *Value, config *Config) bool {
  1903  	b := v.Block
  1904  	_ = b
  1905  	// match: (Convert (Add64 (Convert ptr mem) off) mem)
  1906  	// cond:
  1907  	// result: (Add64 ptr off)
  1908  	for {
  1909  		v_0 := v.Args[0]
  1910  		if v_0.Op != OpAdd64 {
  1911  			break
  1912  		}
  1913  		v_0_0 := v_0.Args[0]
  1914  		if v_0_0.Op != OpConvert {
  1915  			break
  1916  		}
  1917  		ptr := v_0_0.Args[0]
  1918  		mem := v_0_0.Args[1]
  1919  		off := v_0.Args[1]
  1920  		if mem != v.Args[1] {
  1921  			break
  1922  		}
  1923  		v.reset(OpAdd64)
  1924  		v.AddArg(ptr)
  1925  		v.AddArg(off)
  1926  		return true
  1927  	}
  1928  	// match: (Convert (Add64 off (Convert ptr mem)) mem)
  1929  	// cond:
  1930  	// result: (Add64 ptr off)
  1931  	for {
  1932  		v_0 := v.Args[0]
  1933  		if v_0.Op != OpAdd64 {
  1934  			break
  1935  		}
  1936  		off := v_0.Args[0]
  1937  		v_0_1 := v_0.Args[1]
  1938  		if v_0_1.Op != OpConvert {
  1939  			break
  1940  		}
  1941  		ptr := v_0_1.Args[0]
  1942  		mem := v_0_1.Args[1]
  1943  		if mem != v.Args[1] {
  1944  			break
  1945  		}
  1946  		v.reset(OpAdd64)
  1947  		v.AddArg(ptr)
  1948  		v.AddArg(off)
  1949  		return true
  1950  	}
  1951  	// match: (Convert (Convert ptr mem) mem)
  1952  	// cond:
  1953  	// result: ptr
  1954  	for {
  1955  		v_0 := v.Args[0]
  1956  		if v_0.Op != OpConvert {
  1957  			break
  1958  		}
  1959  		ptr := v_0.Args[0]
  1960  		mem := v_0.Args[1]
  1961  		if mem != v.Args[1] {
  1962  			break
  1963  		}
  1964  		v.reset(OpCopy)
  1965  		v.Type = ptr.Type
  1966  		v.AddArg(ptr)
  1967  		return true
  1968  	}
  1969  	return false
  1970  }
  1971  func rewriteValuegeneric_OpCvt32Fto64F(v *Value, config *Config) bool {
  1972  	b := v.Block
  1973  	_ = b
  1974  	// match: (Cvt32Fto64F (Const32F [c]))
  1975  	// cond:
  1976  	// result: (Const64F [c])
  1977  	for {
  1978  		v_0 := v.Args[0]
  1979  		if v_0.Op != OpConst32F {
  1980  			break
  1981  		}
  1982  		c := v_0.AuxInt
  1983  		v.reset(OpConst64F)
  1984  		v.AuxInt = c
  1985  		return true
  1986  	}
  1987  	return false
  1988  }
  1989  func rewriteValuegeneric_OpCvt64Fto32F(v *Value, config *Config) bool {
  1990  	b := v.Block
  1991  	_ = b
  1992  	// match: (Cvt64Fto32F (Const64F [c]))
  1993  	// cond:
  1994  	// result: (Const32F [f2i(float64(i2f32(c)))])
  1995  	for {
  1996  		v_0 := v.Args[0]
  1997  		if v_0.Op != OpConst64F {
  1998  			break
  1999  		}
  2000  		c := v_0.AuxInt
  2001  		v.reset(OpConst32F)
  2002  		v.AuxInt = f2i(float64(i2f32(c)))
  2003  		return true
  2004  	}
  2005  	return false
  2006  }
  2007  func rewriteValuegeneric_OpDiv32F(v *Value, config *Config) bool {
  2008  	b := v.Block
  2009  	_ = b
  2010  	// match: (Div32F x (Const32F [f2i(1)]))
  2011  	// cond:
  2012  	// result: x
  2013  	for {
  2014  		x := v.Args[0]
  2015  		v_1 := v.Args[1]
  2016  		if v_1.Op != OpConst32F {
  2017  			break
  2018  		}
  2019  		if v_1.AuxInt != f2i(1) {
  2020  			break
  2021  		}
  2022  		v.reset(OpCopy)
  2023  		v.Type = x.Type
  2024  		v.AddArg(x)
  2025  		return true
  2026  	}
  2027  	// match: (Div32F x (Const32F [f2i(-1)]))
  2028  	// cond:
  2029  	// result: (Neg32F x)
  2030  	for {
  2031  		x := v.Args[0]
  2032  		v_1 := v.Args[1]
  2033  		if v_1.Op != OpConst32F {
  2034  			break
  2035  		}
  2036  		if v_1.AuxInt != f2i(-1) {
  2037  			break
  2038  		}
  2039  		v.reset(OpNeg32F)
  2040  		v.AddArg(x)
  2041  		return true
  2042  	}
  2043  	return false
  2044  }
  2045  func rewriteValuegeneric_OpDiv64(v *Value, config *Config) bool {
  2046  	b := v.Block
  2047  	_ = b
  2048  	// match: (Div64 <t> x (Const64 [c]))
  2049  	// cond: c > 0 && smagic64ok(c) && smagic64m(c) > 0
  2050  	// result: (Sub64 <t>     (Rsh64x64 <t>       (Hmul64 <t>         (Const64 <t> [smagic64m(c)])         x)       (Const64 <t> [smagic64s(c)]))     (Rsh64x64 <t>       x       (Const64 <t> [63])))
  2051  	for {
  2052  		t := v.Type
  2053  		x := v.Args[0]
  2054  		v_1 := v.Args[1]
  2055  		if v_1.Op != OpConst64 {
  2056  			break
  2057  		}
  2058  		c := v_1.AuxInt
  2059  		if !(c > 0 && smagic64ok(c) && smagic64m(c) > 0) {
  2060  			break
  2061  		}
  2062  		v.reset(OpSub64)
  2063  		v.Type = t
  2064  		v0 := b.NewValue0(v.Line, OpRsh64x64, t)
  2065  		v1 := b.NewValue0(v.Line, OpHmul64, t)
  2066  		v2 := b.NewValue0(v.Line, OpConst64, t)
  2067  		v2.AuxInt = smagic64m(c)
  2068  		v1.AddArg(v2)
  2069  		v1.AddArg(x)
  2070  		v0.AddArg(v1)
  2071  		v3 := b.NewValue0(v.Line, OpConst64, t)
  2072  		v3.AuxInt = smagic64s(c)
  2073  		v0.AddArg(v3)
  2074  		v.AddArg(v0)
  2075  		v4 := b.NewValue0(v.Line, OpRsh64x64, t)
  2076  		v4.AddArg(x)
  2077  		v5 := b.NewValue0(v.Line, OpConst64, t)
  2078  		v5.AuxInt = 63
  2079  		v4.AddArg(v5)
  2080  		v.AddArg(v4)
  2081  		return true
  2082  	}
  2083  	// match: (Div64 <t> x (Const64 [c]))
  2084  	// cond: c > 0 && smagic64ok(c) && smagic64m(c) < 0
  2085  	// result: (Sub64 <t>     (Rsh64x64 <t>       (Add64 <t>         (Hmul64 <t>           (Const64 <t> [smagic64m(c)])           x)         x)       (Const64 <t> [smagic64s(c)]))     (Rsh64x64 <t>       x       (Const64 <t> [63])))
  2086  	for {
  2087  		t := v.Type
  2088  		x := v.Args[0]
  2089  		v_1 := v.Args[1]
  2090  		if v_1.Op != OpConst64 {
  2091  			break
  2092  		}
  2093  		c := v_1.AuxInt
  2094  		if !(c > 0 && smagic64ok(c) && smagic64m(c) < 0) {
  2095  			break
  2096  		}
  2097  		v.reset(OpSub64)
  2098  		v.Type = t
  2099  		v0 := b.NewValue0(v.Line, OpRsh64x64, t)
  2100  		v1 := b.NewValue0(v.Line, OpAdd64, t)
  2101  		v2 := b.NewValue0(v.Line, OpHmul64, t)
  2102  		v3 := b.NewValue0(v.Line, OpConst64, t)
  2103  		v3.AuxInt = smagic64m(c)
  2104  		v2.AddArg(v3)
  2105  		v2.AddArg(x)
  2106  		v1.AddArg(v2)
  2107  		v1.AddArg(x)
  2108  		v0.AddArg(v1)
  2109  		v4 := b.NewValue0(v.Line, OpConst64, t)
  2110  		v4.AuxInt = smagic64s(c)
  2111  		v0.AddArg(v4)
  2112  		v.AddArg(v0)
  2113  		v5 := b.NewValue0(v.Line, OpRsh64x64, t)
  2114  		v5.AddArg(x)
  2115  		v6 := b.NewValue0(v.Line, OpConst64, t)
  2116  		v6.AuxInt = 63
  2117  		v5.AddArg(v6)
  2118  		v.AddArg(v5)
  2119  		return true
  2120  	}
  2121  	// match: (Div64 <t> x (Const64 [c]))
  2122  	// cond: c < 0 && smagic64ok(c) && smagic64m(c) > 0
  2123  	// result: (Neg64 <t>     (Sub64 <t>       (Rsh64x64 <t>         (Hmul64 <t>           (Const64 <t> [smagic64m(c)])           x)         (Const64 <t> [smagic64s(c)]))       (Rsh64x64 <t>         x         (Const64 <t> [63]))))
  2124  	for {
  2125  		t := v.Type
  2126  		x := v.Args[0]
  2127  		v_1 := v.Args[1]
  2128  		if v_1.Op != OpConst64 {
  2129  			break
  2130  		}
  2131  		c := v_1.AuxInt
  2132  		if !(c < 0 && smagic64ok(c) && smagic64m(c) > 0) {
  2133  			break
  2134  		}
  2135  		v.reset(OpNeg64)
  2136  		v.Type = t
  2137  		v0 := b.NewValue0(v.Line, OpSub64, t)
  2138  		v1 := b.NewValue0(v.Line, OpRsh64x64, t)
  2139  		v2 := b.NewValue0(v.Line, OpHmul64, t)
  2140  		v3 := b.NewValue0(v.Line, OpConst64, t)
  2141  		v3.AuxInt = smagic64m(c)
  2142  		v2.AddArg(v3)
  2143  		v2.AddArg(x)
  2144  		v1.AddArg(v2)
  2145  		v4 := b.NewValue0(v.Line, OpConst64, t)
  2146  		v4.AuxInt = smagic64s(c)
  2147  		v1.AddArg(v4)
  2148  		v0.AddArg(v1)
  2149  		v5 := b.NewValue0(v.Line, OpRsh64x64, t)
  2150  		v5.AddArg(x)
  2151  		v6 := b.NewValue0(v.Line, OpConst64, t)
  2152  		v6.AuxInt = 63
  2153  		v5.AddArg(v6)
  2154  		v0.AddArg(v5)
  2155  		v.AddArg(v0)
  2156  		return true
  2157  	}
  2158  	// match: (Div64 <t> x (Const64 [c]))
  2159  	// cond: c < 0 && smagic64ok(c) && smagic64m(c) < 0
  2160  	// result: (Neg64 <t>     (Sub64 <t>       (Rsh64x64 <t>         (Add64 <t>           (Hmul64 <t>             (Const64 <t> [smagic64m(c)])             x)           x)         (Const64 <t> [smagic64s(c)]))       (Rsh64x64 <t>         x         (Const64 <t> [63]))))
  2161  	for {
  2162  		t := v.Type
  2163  		x := v.Args[0]
  2164  		v_1 := v.Args[1]
  2165  		if v_1.Op != OpConst64 {
  2166  			break
  2167  		}
  2168  		c := v_1.AuxInt
  2169  		if !(c < 0 && smagic64ok(c) && smagic64m(c) < 0) {
  2170  			break
  2171  		}
  2172  		v.reset(OpNeg64)
  2173  		v.Type = t
  2174  		v0 := b.NewValue0(v.Line, OpSub64, t)
  2175  		v1 := b.NewValue0(v.Line, OpRsh64x64, t)
  2176  		v2 := b.NewValue0(v.Line, OpAdd64, t)
  2177  		v3 := b.NewValue0(v.Line, OpHmul64, t)
  2178  		v4 := b.NewValue0(v.Line, OpConst64, t)
  2179  		v4.AuxInt = smagic64m(c)
  2180  		v3.AddArg(v4)
  2181  		v3.AddArg(x)
  2182  		v2.AddArg(v3)
  2183  		v2.AddArg(x)
  2184  		v1.AddArg(v2)
  2185  		v5 := b.NewValue0(v.Line, OpConst64, t)
  2186  		v5.AuxInt = smagic64s(c)
  2187  		v1.AddArg(v5)
  2188  		v0.AddArg(v1)
  2189  		v6 := b.NewValue0(v.Line, OpRsh64x64, t)
  2190  		v6.AddArg(x)
  2191  		v7 := b.NewValue0(v.Line, OpConst64, t)
  2192  		v7.AuxInt = 63
  2193  		v6.AddArg(v7)
  2194  		v0.AddArg(v6)
  2195  		v.AddArg(v0)
  2196  		return true
  2197  	}
  2198  	return false
  2199  }
  2200  func rewriteValuegeneric_OpDiv64F(v *Value, config *Config) bool {
  2201  	b := v.Block
  2202  	_ = b
  2203  	// match: (Div64F x (Const64F [f2i(1)]))
  2204  	// cond:
  2205  	// result: x
  2206  	for {
  2207  		x := v.Args[0]
  2208  		v_1 := v.Args[1]
  2209  		if v_1.Op != OpConst64F {
  2210  			break
  2211  		}
  2212  		if v_1.AuxInt != f2i(1) {
  2213  			break
  2214  		}
  2215  		v.reset(OpCopy)
  2216  		v.Type = x.Type
  2217  		v.AddArg(x)
  2218  		return true
  2219  	}
  2220  	// match: (Div64F x (Const64F [f2i(-1)]))
  2221  	// cond:
  2222  	// result: (Neg32F x)
  2223  	for {
  2224  		x := v.Args[0]
  2225  		v_1 := v.Args[1]
  2226  		if v_1.Op != OpConst64F {
  2227  			break
  2228  		}
  2229  		if v_1.AuxInt != f2i(-1) {
  2230  			break
  2231  		}
  2232  		v.reset(OpNeg32F)
  2233  		v.AddArg(x)
  2234  		return true
  2235  	}
  2236  	return false
  2237  }
  2238  func rewriteValuegeneric_OpDiv64u(v *Value, config *Config) bool {
  2239  	b := v.Block
  2240  	_ = b
  2241  	// match: (Div64u <t> n (Const64 [c]))
  2242  	// cond: isPowerOfTwo(c)
  2243  	// result: (Rsh64Ux64 n (Const64 <t> [log2(c)]))
  2244  	for {
  2245  		t := v.Type
  2246  		n := v.Args[0]
  2247  		v_1 := v.Args[1]
  2248  		if v_1.Op != OpConst64 {
  2249  			break
  2250  		}
  2251  		c := v_1.AuxInt
  2252  		if !(isPowerOfTwo(c)) {
  2253  			break
  2254  		}
  2255  		v.reset(OpRsh64Ux64)
  2256  		v.AddArg(n)
  2257  		v0 := b.NewValue0(v.Line, OpConst64, t)
  2258  		v0.AuxInt = log2(c)
  2259  		v.AddArg(v0)
  2260  		return true
  2261  	}
  2262  	// match: (Div64u <t> x (Const64 [c]))
  2263  	// cond: umagic64ok(c) && !umagic64a(c)
  2264  	// result: (Rsh64Ux64     (Hmul64u <t>       (Const64 <t> [umagic64m(c)])       x)     (Const64 <t> [umagic64s(c)]))
  2265  	for {
  2266  		t := v.Type
  2267  		x := v.Args[0]
  2268  		v_1 := v.Args[1]
  2269  		if v_1.Op != OpConst64 {
  2270  			break
  2271  		}
  2272  		c := v_1.AuxInt
  2273  		if !(umagic64ok(c) && !umagic64a(c)) {
  2274  			break
  2275  		}
  2276  		v.reset(OpRsh64Ux64)
  2277  		v0 := b.NewValue0(v.Line, OpHmul64u, t)
  2278  		v1 := b.NewValue0(v.Line, OpConst64, t)
  2279  		v1.AuxInt = umagic64m(c)
  2280  		v0.AddArg(v1)
  2281  		v0.AddArg(x)
  2282  		v.AddArg(v0)
  2283  		v2 := b.NewValue0(v.Line, OpConst64, t)
  2284  		v2.AuxInt = umagic64s(c)
  2285  		v.AddArg(v2)
  2286  		return true
  2287  	}
  2288  	// match: (Div64u <t> x (Const64 [c]))
  2289  	// cond: umagic64ok(c) && umagic64a(c)
  2290  	// result: (Rsh64Ux64     (Avg64u <t>       (Hmul64u <t>         x         (Const64 <t> [umagic64m(c)]))       x)     (Const64 <t> [umagic64s(c)-1]))
  2291  	for {
  2292  		t := v.Type
  2293  		x := v.Args[0]
  2294  		v_1 := v.Args[1]
  2295  		if v_1.Op != OpConst64 {
  2296  			break
  2297  		}
  2298  		c := v_1.AuxInt
  2299  		if !(umagic64ok(c) && umagic64a(c)) {
  2300  			break
  2301  		}
  2302  		v.reset(OpRsh64Ux64)
  2303  		v0 := b.NewValue0(v.Line, OpAvg64u, t)
  2304  		v1 := b.NewValue0(v.Line, OpHmul64u, t)
  2305  		v1.AddArg(x)
  2306  		v2 := b.NewValue0(v.Line, OpConst64, t)
  2307  		v2.AuxInt = umagic64m(c)
  2308  		v1.AddArg(v2)
  2309  		v0.AddArg(v1)
  2310  		v0.AddArg(x)
  2311  		v.AddArg(v0)
  2312  		v3 := b.NewValue0(v.Line, OpConst64, t)
  2313  		v3.AuxInt = umagic64s(c) - 1
  2314  		v.AddArg(v3)
  2315  		return true
  2316  	}
  2317  	return false
  2318  }
  2319  func rewriteValuegeneric_OpEq16(v *Value, config *Config) bool {
  2320  	b := v.Block
  2321  	_ = b
  2322  	// match: (Eq16 x x)
  2323  	// cond:
  2324  	// result: (ConstBool [1])
  2325  	for {
  2326  		x := v.Args[0]
  2327  		if x != v.Args[1] {
  2328  			break
  2329  		}
  2330  		v.reset(OpConstBool)
  2331  		v.AuxInt = 1
  2332  		return true
  2333  	}
  2334  	// match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x))
  2335  	// cond:
  2336  	// result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x)
  2337  	for {
  2338  		v_0 := v.Args[0]
  2339  		if v_0.Op != OpConst16 {
  2340  			break
  2341  		}
  2342  		t := v_0.Type
  2343  		c := v_0.AuxInt
  2344  		v_1 := v.Args[1]
  2345  		if v_1.Op != OpAdd16 {
  2346  			break
  2347  		}
  2348  		v_1_0 := v_1.Args[0]
  2349  		if v_1_0.Op != OpConst16 {
  2350  			break
  2351  		}
  2352  		if v_1_0.Type != t {
  2353  			break
  2354  		}
  2355  		d := v_1_0.AuxInt
  2356  		x := v_1.Args[1]
  2357  		v.reset(OpEq16)
  2358  		v0 := b.NewValue0(v.Line, OpConst16, t)
  2359  		v0.AuxInt = int64(int16(c - d))
  2360  		v.AddArg(v0)
  2361  		v.AddArg(x)
  2362  		return true
  2363  	}
  2364  	// match: (Eq16 x (Const16 <t> [c]))
  2365  	// cond: x.Op != OpConst16
  2366  	// result: (Eq16 (Const16 <t> [c]) x)
  2367  	for {
  2368  		x := v.Args[0]
  2369  		v_1 := v.Args[1]
  2370  		if v_1.Op != OpConst16 {
  2371  			break
  2372  		}
  2373  		t := v_1.Type
  2374  		c := v_1.AuxInt
  2375  		if !(x.Op != OpConst16) {
  2376  			break
  2377  		}
  2378  		v.reset(OpEq16)
  2379  		v0 := b.NewValue0(v.Line, OpConst16, t)
  2380  		v0.AuxInt = c
  2381  		v.AddArg(v0)
  2382  		v.AddArg(x)
  2383  		return true
  2384  	}
  2385  	// match: (Eq16 (Const16 [c]) (Const16 [d]))
  2386  	// cond:
  2387  	// result: (ConstBool [b2i(c == d)])
  2388  	for {
  2389  		v_0 := v.Args[0]
  2390  		if v_0.Op != OpConst16 {
  2391  			break
  2392  		}
  2393  		c := v_0.AuxInt
  2394  		v_1 := v.Args[1]
  2395  		if v_1.Op != OpConst16 {
  2396  			break
  2397  		}
  2398  		d := v_1.AuxInt
  2399  		v.reset(OpConstBool)
  2400  		v.AuxInt = b2i(c == d)
  2401  		return true
  2402  	}
  2403  	return false
  2404  }
  2405  func rewriteValuegeneric_OpEq32(v *Value, config *Config) bool {
  2406  	b := v.Block
  2407  	_ = b
  2408  	// match: (Eq32 x x)
  2409  	// cond:
  2410  	// result: (ConstBool [1])
  2411  	for {
  2412  		x := v.Args[0]
  2413  		if x != v.Args[1] {
  2414  			break
  2415  		}
  2416  		v.reset(OpConstBool)
  2417  		v.AuxInt = 1
  2418  		return true
  2419  	}
  2420  	// match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x))
  2421  	// cond:
  2422  	// result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x)
  2423  	for {
  2424  		v_0 := v.Args[0]
  2425  		if v_0.Op != OpConst32 {
  2426  			break
  2427  		}
  2428  		t := v_0.Type
  2429  		c := v_0.AuxInt
  2430  		v_1 := v.Args[1]
  2431  		if v_1.Op != OpAdd32 {
  2432  			break
  2433  		}
  2434  		v_1_0 := v_1.Args[0]
  2435  		if v_1_0.Op != OpConst32 {
  2436  			break
  2437  		}
  2438  		if v_1_0.Type != t {
  2439  			break
  2440  		}
  2441  		d := v_1_0.AuxInt
  2442  		x := v_1.Args[1]
  2443  		v.reset(OpEq32)
  2444  		v0 := b.NewValue0(v.Line, OpConst32, t)
  2445  		v0.AuxInt = int64(int32(c - d))
  2446  		v.AddArg(v0)
  2447  		v.AddArg(x)
  2448  		return true
  2449  	}
  2450  	// match: (Eq32 x (Const32 <t> [c]))
  2451  	// cond: x.Op != OpConst32
  2452  	// result: (Eq32 (Const32 <t> [c]) x)
  2453  	for {
  2454  		x := v.Args[0]
  2455  		v_1 := v.Args[1]
  2456  		if v_1.Op != OpConst32 {
  2457  			break
  2458  		}
  2459  		t := v_1.Type
  2460  		c := v_1.AuxInt
  2461  		if !(x.Op != OpConst32) {
  2462  			break
  2463  		}
  2464  		v.reset(OpEq32)
  2465  		v0 := b.NewValue0(v.Line, OpConst32, t)
  2466  		v0.AuxInt = c
  2467  		v.AddArg(v0)
  2468  		v.AddArg(x)
  2469  		return true
  2470  	}
  2471  	// match: (Eq32 (Const32 [c]) (Const32 [d]))
  2472  	// cond:
  2473  	// result: (ConstBool [b2i(c == d)])
  2474  	for {
  2475  		v_0 := v.Args[0]
  2476  		if v_0.Op != OpConst32 {
  2477  			break
  2478  		}
  2479  		c := v_0.AuxInt
  2480  		v_1 := v.Args[1]
  2481  		if v_1.Op != OpConst32 {
  2482  			break
  2483  		}
  2484  		d := v_1.AuxInt
  2485  		v.reset(OpConstBool)
  2486  		v.AuxInt = b2i(c == d)
  2487  		return true
  2488  	}
  2489  	return false
  2490  }
  2491  func rewriteValuegeneric_OpEq64(v *Value, config *Config) bool {
  2492  	b := v.Block
  2493  	_ = b
  2494  	// match: (Eq64 x x)
  2495  	// cond:
  2496  	// result: (ConstBool [1])
  2497  	for {
  2498  		x := v.Args[0]
  2499  		if x != v.Args[1] {
  2500  			break
  2501  		}
  2502  		v.reset(OpConstBool)
  2503  		v.AuxInt = 1
  2504  		return true
  2505  	}
  2506  	// match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x))
  2507  	// cond:
  2508  	// result: (Eq64 (Const64 <t> [c-d]) x)
  2509  	for {
  2510  		v_0 := v.Args[0]
  2511  		if v_0.Op != OpConst64 {
  2512  			break
  2513  		}
  2514  		t := v_0.Type
  2515  		c := v_0.AuxInt
  2516  		v_1 := v.Args[1]
  2517  		if v_1.Op != OpAdd64 {
  2518  			break
  2519  		}
  2520  		v_1_0 := v_1.Args[0]
  2521  		if v_1_0.Op != OpConst64 {
  2522  			break
  2523  		}
  2524  		if v_1_0.Type != t {
  2525  			break
  2526  		}
  2527  		d := v_1_0.AuxInt
  2528  		x := v_1.Args[1]
  2529  		v.reset(OpEq64)
  2530  		v0 := b.NewValue0(v.Line, OpConst64, t)
  2531  		v0.AuxInt = c - d
  2532  		v.AddArg(v0)
  2533  		v.AddArg(x)
  2534  		return true
  2535  	}
  2536  	// match: (Eq64 x (Const64 <t> [c]))
  2537  	// cond: x.Op != OpConst64
  2538  	// result: (Eq64 (Const64 <t> [c]) x)
  2539  	for {
  2540  		x := v.Args[0]
  2541  		v_1 := v.Args[1]
  2542  		if v_1.Op != OpConst64 {
  2543  			break
  2544  		}
  2545  		t := v_1.Type
  2546  		c := v_1.AuxInt
  2547  		if !(x.Op != OpConst64) {
  2548  			break
  2549  		}
  2550  		v.reset(OpEq64)
  2551  		v0 := b.NewValue0(v.Line, OpConst64, t)
  2552  		v0.AuxInt = c
  2553  		v.AddArg(v0)
  2554  		v.AddArg(x)
  2555  		return true
  2556  	}
  2557  	// match: (Eq64 (Const64 [c]) (Const64 [d]))
  2558  	// cond:
  2559  	// result: (ConstBool [b2i(c == d)])
  2560  	for {
  2561  		v_0 := v.Args[0]
  2562  		if v_0.Op != OpConst64 {
  2563  			break
  2564  		}
  2565  		c := v_0.AuxInt
  2566  		v_1 := v.Args[1]
  2567  		if v_1.Op != OpConst64 {
  2568  			break
  2569  		}
  2570  		d := v_1.AuxInt
  2571  		v.reset(OpConstBool)
  2572  		v.AuxInt = b2i(c == d)
  2573  		return true
  2574  	}
  2575  	return false
  2576  }
  2577  func rewriteValuegeneric_OpEq8(v *Value, config *Config) bool {
  2578  	b := v.Block
  2579  	_ = b
  2580  	// match: (Eq8  x x)
  2581  	// cond:
  2582  	// result: (ConstBool [1])
  2583  	for {
  2584  		x := v.Args[0]
  2585  		if x != v.Args[1] {
  2586  			break
  2587  		}
  2588  		v.reset(OpConstBool)
  2589  		v.AuxInt = 1
  2590  		return true
  2591  	}
  2592  	// match: (Eq8  (Const8  <t> [c]) (Add8  (Const8  <t> [d]) x))
  2593  	// cond:
  2594  	// result: (Eq8  (Const8 <t> [int64(int8(c-d))]) x)
  2595  	for {
  2596  		v_0 := v.Args[0]
  2597  		if v_0.Op != OpConst8 {
  2598  			break
  2599  		}
  2600  		t := v_0.Type
  2601  		c := v_0.AuxInt
  2602  		v_1 := v.Args[1]
  2603  		if v_1.Op != OpAdd8 {
  2604  			break
  2605  		}
  2606  		v_1_0 := v_1.Args[0]
  2607  		if v_1_0.Op != OpConst8 {
  2608  			break
  2609  		}
  2610  		if v_1_0.Type != t {
  2611  			break
  2612  		}
  2613  		d := v_1_0.AuxInt
  2614  		x := v_1.Args[1]
  2615  		v.reset(OpEq8)
  2616  		v0 := b.NewValue0(v.Line, OpConst8, t)
  2617  		v0.AuxInt = int64(int8(c - d))
  2618  		v.AddArg(v0)
  2619  		v.AddArg(x)
  2620  		return true
  2621  	}
  2622  	// match: (Eq8  x (Const8  <t> [c]))
  2623  	// cond: x.Op != OpConst8
  2624  	// result: (Eq8  (Const8  <t> [c]) x)
  2625  	for {
  2626  		x := v.Args[0]
  2627  		v_1 := v.Args[1]
  2628  		if v_1.Op != OpConst8 {
  2629  			break
  2630  		}
  2631  		t := v_1.Type
  2632  		c := v_1.AuxInt
  2633  		if !(x.Op != OpConst8) {
  2634  			break
  2635  		}
  2636  		v.reset(OpEq8)
  2637  		v0 := b.NewValue0(v.Line, OpConst8, t)
  2638  		v0.AuxInt = c
  2639  		v.AddArg(v0)
  2640  		v.AddArg(x)
  2641  		return true
  2642  	}
  2643  	// match: (Eq8  (Const8  [c]) (Const8  [d]))
  2644  	// cond:
  2645  	// result: (ConstBool [b2i(c == d)])
  2646  	for {
  2647  		v_0 := v.Args[0]
  2648  		if v_0.Op != OpConst8 {
  2649  			break
  2650  		}
  2651  		c := v_0.AuxInt
  2652  		v_1 := v.Args[1]
  2653  		if v_1.Op != OpConst8 {
  2654  			break
  2655  		}
  2656  		d := v_1.AuxInt
  2657  		v.reset(OpConstBool)
  2658  		v.AuxInt = b2i(c == d)
  2659  		return true
  2660  	}
  2661  	return false
  2662  }
  2663  func rewriteValuegeneric_OpEqB(v *Value, config *Config) bool {
  2664  	b := v.Block
  2665  	_ = b
  2666  	// match: (EqB (ConstBool [c]) (ConstBool [d]))
  2667  	// cond:
  2668  	// result: (ConstBool [b2i(c == d)])
  2669  	for {
  2670  		v_0 := v.Args[0]
  2671  		if v_0.Op != OpConstBool {
  2672  			break
  2673  		}
  2674  		c := v_0.AuxInt
  2675  		v_1 := v.Args[1]
  2676  		if v_1.Op != OpConstBool {
  2677  			break
  2678  		}
  2679  		d := v_1.AuxInt
  2680  		v.reset(OpConstBool)
  2681  		v.AuxInt = b2i(c == d)
  2682  		return true
  2683  	}
  2684  	// match: (EqB (ConstBool [0]) x)
  2685  	// cond:
  2686  	// result: (Not x)
  2687  	for {
  2688  		v_0 := v.Args[0]
  2689  		if v_0.Op != OpConstBool {
  2690  			break
  2691  		}
  2692  		if v_0.AuxInt != 0 {
  2693  			break
  2694  		}
  2695  		x := v.Args[1]
  2696  		v.reset(OpNot)
  2697  		v.AddArg(x)
  2698  		return true
  2699  	}
  2700  	// match: (EqB (ConstBool [1]) x)
  2701  	// cond:
  2702  	// result: x
  2703  	for {
  2704  		v_0 := v.Args[0]
  2705  		if v_0.Op != OpConstBool {
  2706  			break
  2707  		}
  2708  		if v_0.AuxInt != 1 {
  2709  			break
  2710  		}
  2711  		x := v.Args[1]
  2712  		v.reset(OpCopy)
  2713  		v.Type = x.Type
  2714  		v.AddArg(x)
  2715  		return true
  2716  	}
  2717  	return false
  2718  }
  2719  func rewriteValuegeneric_OpEqInter(v *Value, config *Config) bool {
  2720  	b := v.Block
  2721  	_ = b
  2722  	// match: (EqInter x y)
  2723  	// cond:
  2724  	// result: (EqPtr  (ITab x) (ITab y))
  2725  	for {
  2726  		x := v.Args[0]
  2727  		y := v.Args[1]
  2728  		v.reset(OpEqPtr)
  2729  		v0 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
  2730  		v0.AddArg(x)
  2731  		v.AddArg(v0)
  2732  		v1 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
  2733  		v1.AddArg(y)
  2734  		v.AddArg(v1)
  2735  		return true
  2736  	}
  2737  }
  2738  func rewriteValuegeneric_OpEqPtr(v *Value, config *Config) bool {
  2739  	b := v.Block
  2740  	_ = b
  2741  	// match: (EqPtr p (ConstNil))
  2742  	// cond:
  2743  	// result: (Not (IsNonNil p))
  2744  	for {
  2745  		p := v.Args[0]
  2746  		v_1 := v.Args[1]
  2747  		if v_1.Op != OpConstNil {
  2748  			break
  2749  		}
  2750  		v.reset(OpNot)
  2751  		v0 := b.NewValue0(v.Line, OpIsNonNil, config.fe.TypeBool())
  2752  		v0.AddArg(p)
  2753  		v.AddArg(v0)
  2754  		return true
  2755  	}
  2756  	// match: (EqPtr (ConstNil) p)
  2757  	// cond:
  2758  	// result: (Not (IsNonNil p))
  2759  	for {
  2760  		v_0 := v.Args[0]
  2761  		if v_0.Op != OpConstNil {
  2762  			break
  2763  		}
  2764  		p := v.Args[1]
  2765  		v.reset(OpNot)
  2766  		v0 := b.NewValue0(v.Line, OpIsNonNil, config.fe.TypeBool())
  2767  		v0.AddArg(p)
  2768  		v.AddArg(v0)
  2769  		return true
  2770  	}
  2771  	return false
  2772  }
  2773  func rewriteValuegeneric_OpEqSlice(v *Value, config *Config) bool {
  2774  	b := v.Block
  2775  	_ = b
  2776  	// match: (EqSlice x y)
  2777  	// cond:
  2778  	// result: (EqPtr  (SlicePtr x) (SlicePtr y))
  2779  	for {
  2780  		x := v.Args[0]
  2781  		y := v.Args[1]
  2782  		v.reset(OpEqPtr)
  2783  		v0 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
  2784  		v0.AddArg(x)
  2785  		v.AddArg(v0)
  2786  		v1 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
  2787  		v1.AddArg(y)
  2788  		v.AddArg(v1)
  2789  		return true
  2790  	}
  2791  }
  2792  func rewriteValuegeneric_OpGeq16(v *Value, config *Config) bool {
  2793  	b := v.Block
  2794  	_ = b
  2795  	// match: (Geq16 (Const16 [c]) (Const16 [d]))
  2796  	// cond:
  2797  	// result: (ConstBool [b2i(c >= d)])
  2798  	for {
  2799  		v_0 := v.Args[0]
  2800  		if v_0.Op != OpConst16 {
  2801  			break
  2802  		}
  2803  		c := v_0.AuxInt
  2804  		v_1 := v.Args[1]
  2805  		if v_1.Op != OpConst16 {
  2806  			break
  2807  		}
  2808  		d := v_1.AuxInt
  2809  		v.reset(OpConstBool)
  2810  		v.AuxInt = b2i(c >= d)
  2811  		return true
  2812  	}
  2813  	return false
  2814  }
  2815  func rewriteValuegeneric_OpGeq16U(v *Value, config *Config) bool {
  2816  	b := v.Block
  2817  	_ = b
  2818  	// match: (Geq16U (Const16 [c]) (Const16 [d]))
  2819  	// cond:
  2820  	// result: (ConstBool [b2i(uint16(c) >= uint16(d))])
  2821  	for {
  2822  		v_0 := v.Args[0]
  2823  		if v_0.Op != OpConst16 {
  2824  			break
  2825  		}
  2826  		c := v_0.AuxInt
  2827  		v_1 := v.Args[1]
  2828  		if v_1.Op != OpConst16 {
  2829  			break
  2830  		}
  2831  		d := v_1.AuxInt
  2832  		v.reset(OpConstBool)
  2833  		v.AuxInt = b2i(uint16(c) >= uint16(d))
  2834  		return true
  2835  	}
  2836  	return false
  2837  }
  2838  func rewriteValuegeneric_OpGeq32(v *Value, config *Config) bool {
  2839  	b := v.Block
  2840  	_ = b
  2841  	// match: (Geq32 (Const32 [c]) (Const32 [d]))
  2842  	// cond:
  2843  	// result: (ConstBool [b2i(c >= d)])
  2844  	for {
  2845  		v_0 := v.Args[0]
  2846  		if v_0.Op != OpConst32 {
  2847  			break
  2848  		}
  2849  		c := v_0.AuxInt
  2850  		v_1 := v.Args[1]
  2851  		if v_1.Op != OpConst32 {
  2852  			break
  2853  		}
  2854  		d := v_1.AuxInt
  2855  		v.reset(OpConstBool)
  2856  		v.AuxInt = b2i(c >= d)
  2857  		return true
  2858  	}
  2859  	return false
  2860  }
  2861  func rewriteValuegeneric_OpGeq32U(v *Value, config *Config) bool {
  2862  	b := v.Block
  2863  	_ = b
  2864  	// match: (Geq32U (Const32 [c]) (Const32 [d]))
  2865  	// cond:
  2866  	// result: (ConstBool [b2i(uint32(c) >= uint32(d))])
  2867  	for {
  2868  		v_0 := v.Args[0]
  2869  		if v_0.Op != OpConst32 {
  2870  			break
  2871  		}
  2872  		c := v_0.AuxInt
  2873  		v_1 := v.Args[1]
  2874  		if v_1.Op != OpConst32 {
  2875  			break
  2876  		}
  2877  		d := v_1.AuxInt
  2878  		v.reset(OpConstBool)
  2879  		v.AuxInt = b2i(uint32(c) >= uint32(d))
  2880  		return true
  2881  	}
  2882  	return false
  2883  }
  2884  func rewriteValuegeneric_OpGeq64(v *Value, config *Config) bool {
  2885  	b := v.Block
  2886  	_ = b
  2887  	// match: (Geq64 (Const64 [c]) (Const64 [d]))
  2888  	// cond:
  2889  	// result: (ConstBool [b2i(c >= d)])
  2890  	for {
  2891  		v_0 := v.Args[0]
  2892  		if v_0.Op != OpConst64 {
  2893  			break
  2894  		}
  2895  		c := v_0.AuxInt
  2896  		v_1 := v.Args[1]
  2897  		if v_1.Op != OpConst64 {
  2898  			break
  2899  		}
  2900  		d := v_1.AuxInt
  2901  		v.reset(OpConstBool)
  2902  		v.AuxInt = b2i(c >= d)
  2903  		return true
  2904  	}
  2905  	return false
  2906  }
  2907  func rewriteValuegeneric_OpGeq64U(v *Value, config *Config) bool {
  2908  	b := v.Block
  2909  	_ = b
  2910  	// match: (Geq64U (Const64 [c]) (Const64 [d]))
  2911  	// cond:
  2912  	// result: (ConstBool [b2i(uint64(c) >= uint64(d))])
  2913  	for {
  2914  		v_0 := v.Args[0]
  2915  		if v_0.Op != OpConst64 {
  2916  			break
  2917  		}
  2918  		c := v_0.AuxInt
  2919  		v_1 := v.Args[1]
  2920  		if v_1.Op != OpConst64 {
  2921  			break
  2922  		}
  2923  		d := v_1.AuxInt
  2924  		v.reset(OpConstBool)
  2925  		v.AuxInt = b2i(uint64(c) >= uint64(d))
  2926  		return true
  2927  	}
  2928  	return false
  2929  }
  2930  func rewriteValuegeneric_OpGeq8(v *Value, config *Config) bool {
  2931  	b := v.Block
  2932  	_ = b
  2933  	// match: (Geq8  (Const8  [c]) (Const8  [d]))
  2934  	// cond:
  2935  	// result: (ConstBool [b2i(c >= d)])
  2936  	for {
  2937  		v_0 := v.Args[0]
  2938  		if v_0.Op != OpConst8 {
  2939  			break
  2940  		}
  2941  		c := v_0.AuxInt
  2942  		v_1 := v.Args[1]
  2943  		if v_1.Op != OpConst8 {
  2944  			break
  2945  		}
  2946  		d := v_1.AuxInt
  2947  		v.reset(OpConstBool)
  2948  		v.AuxInt = b2i(c >= d)
  2949  		return true
  2950  	}
  2951  	return false
  2952  }
  2953  func rewriteValuegeneric_OpGeq8U(v *Value, config *Config) bool {
  2954  	b := v.Block
  2955  	_ = b
  2956  	// match: (Geq8U  (Const8  [c]) (Const8  [d]))
  2957  	// cond:
  2958  	// result: (ConstBool [b2i(uint8(c)  >= uint8(d))])
  2959  	for {
  2960  		v_0 := v.Args[0]
  2961  		if v_0.Op != OpConst8 {
  2962  			break
  2963  		}
  2964  		c := v_0.AuxInt
  2965  		v_1 := v.Args[1]
  2966  		if v_1.Op != OpConst8 {
  2967  			break
  2968  		}
  2969  		d := v_1.AuxInt
  2970  		v.reset(OpConstBool)
  2971  		v.AuxInt = b2i(uint8(c) >= uint8(d))
  2972  		return true
  2973  	}
  2974  	return false
  2975  }
  2976  func rewriteValuegeneric_OpGreater16(v *Value, config *Config) bool {
  2977  	b := v.Block
  2978  	_ = b
  2979  	// match: (Greater16 (Const16 [c]) (Const16 [d]))
  2980  	// cond:
  2981  	// result: (ConstBool [b2i(c > d)])
  2982  	for {
  2983  		v_0 := v.Args[0]
  2984  		if v_0.Op != OpConst16 {
  2985  			break
  2986  		}
  2987  		c := v_0.AuxInt
  2988  		v_1 := v.Args[1]
  2989  		if v_1.Op != OpConst16 {
  2990  			break
  2991  		}
  2992  		d := v_1.AuxInt
  2993  		v.reset(OpConstBool)
  2994  		v.AuxInt = b2i(c > d)
  2995  		return true
  2996  	}
  2997  	return false
  2998  }
  2999  func rewriteValuegeneric_OpGreater16U(v *Value, config *Config) bool {
  3000  	b := v.Block
  3001  	_ = b
  3002  	// match: (Greater16U (Const16 [c]) (Const16 [d]))
  3003  	// cond:
  3004  	// result: (ConstBool [b2i(uint16(c) > uint16(d))])
  3005  	for {
  3006  		v_0 := v.Args[0]
  3007  		if v_0.Op != OpConst16 {
  3008  			break
  3009  		}
  3010  		c := v_0.AuxInt
  3011  		v_1 := v.Args[1]
  3012  		if v_1.Op != OpConst16 {
  3013  			break
  3014  		}
  3015  		d := v_1.AuxInt
  3016  		v.reset(OpConstBool)
  3017  		v.AuxInt = b2i(uint16(c) > uint16(d))
  3018  		return true
  3019  	}
  3020  	return false
  3021  }
  3022  func rewriteValuegeneric_OpGreater32(v *Value, config *Config) bool {
  3023  	b := v.Block
  3024  	_ = b
  3025  	// match: (Greater32 (Const32 [c]) (Const32 [d]))
  3026  	// cond:
  3027  	// result: (ConstBool [b2i(c > d)])
  3028  	for {
  3029  		v_0 := v.Args[0]
  3030  		if v_0.Op != OpConst32 {
  3031  			break
  3032  		}
  3033  		c := v_0.AuxInt
  3034  		v_1 := v.Args[1]
  3035  		if v_1.Op != OpConst32 {
  3036  			break
  3037  		}
  3038  		d := v_1.AuxInt
  3039  		v.reset(OpConstBool)
  3040  		v.AuxInt = b2i(c > d)
  3041  		return true
  3042  	}
  3043  	return false
  3044  }
  3045  func rewriteValuegeneric_OpGreater32U(v *Value, config *Config) bool {
  3046  	b := v.Block
  3047  	_ = b
  3048  	// match: (Greater32U (Const32 [c]) (Const32 [d]))
  3049  	// cond:
  3050  	// result: (ConstBool [b2i(uint32(c) > uint32(d))])
  3051  	for {
  3052  		v_0 := v.Args[0]
  3053  		if v_0.Op != OpConst32 {
  3054  			break
  3055  		}
  3056  		c := v_0.AuxInt
  3057  		v_1 := v.Args[1]
  3058  		if v_1.Op != OpConst32 {
  3059  			break
  3060  		}
  3061  		d := v_1.AuxInt
  3062  		v.reset(OpConstBool)
  3063  		v.AuxInt = b2i(uint32(c) > uint32(d))
  3064  		return true
  3065  	}
  3066  	return false
  3067  }
  3068  func rewriteValuegeneric_OpGreater64(v *Value, config *Config) bool {
  3069  	b := v.Block
  3070  	_ = b
  3071  	// match: (Greater64 (Const64 [c]) (Const64 [d]))
  3072  	// cond:
  3073  	// result: (ConstBool [b2i(c > d)])
  3074  	for {
  3075  		v_0 := v.Args[0]
  3076  		if v_0.Op != OpConst64 {
  3077  			break
  3078  		}
  3079  		c := v_0.AuxInt
  3080  		v_1 := v.Args[1]
  3081  		if v_1.Op != OpConst64 {
  3082  			break
  3083  		}
  3084  		d := v_1.AuxInt
  3085  		v.reset(OpConstBool)
  3086  		v.AuxInt = b2i(c > d)
  3087  		return true
  3088  	}
  3089  	return false
  3090  }
  3091  func rewriteValuegeneric_OpGreater64U(v *Value, config *Config) bool {
  3092  	b := v.Block
  3093  	_ = b
  3094  	// match: (Greater64U (Const64 [c]) (Const64 [d]))
  3095  	// cond:
  3096  	// result: (ConstBool [b2i(uint64(c) > uint64(d))])
  3097  	for {
  3098  		v_0 := v.Args[0]
  3099  		if v_0.Op != OpConst64 {
  3100  			break
  3101  		}
  3102  		c := v_0.AuxInt
  3103  		v_1 := v.Args[1]
  3104  		if v_1.Op != OpConst64 {
  3105  			break
  3106  		}
  3107  		d := v_1.AuxInt
  3108  		v.reset(OpConstBool)
  3109  		v.AuxInt = b2i(uint64(c) > uint64(d))
  3110  		return true
  3111  	}
  3112  	return false
  3113  }
  3114  func rewriteValuegeneric_OpGreater8(v *Value, config *Config) bool {
  3115  	b := v.Block
  3116  	_ = b
  3117  	// match: (Greater8  (Const8  [c]) (Const8  [d]))
  3118  	// cond:
  3119  	// result: (ConstBool [b2i(c > d)])
  3120  	for {
  3121  		v_0 := v.Args[0]
  3122  		if v_0.Op != OpConst8 {
  3123  			break
  3124  		}
  3125  		c := v_0.AuxInt
  3126  		v_1 := v.Args[1]
  3127  		if v_1.Op != OpConst8 {
  3128  			break
  3129  		}
  3130  		d := v_1.AuxInt
  3131  		v.reset(OpConstBool)
  3132  		v.AuxInt = b2i(c > d)
  3133  		return true
  3134  	}
  3135  	return false
  3136  }
  3137  func rewriteValuegeneric_OpGreater8U(v *Value, config *Config) bool {
  3138  	b := v.Block
  3139  	_ = b
  3140  	// match: (Greater8U  (Const8  [c]) (Const8  [d]))
  3141  	// cond:
  3142  	// result: (ConstBool [b2i(uint8(c)  > uint8(d))])
  3143  	for {
  3144  		v_0 := v.Args[0]
  3145  		if v_0.Op != OpConst8 {
  3146  			break
  3147  		}
  3148  		c := v_0.AuxInt
  3149  		v_1 := v.Args[1]
  3150  		if v_1.Op != OpConst8 {
  3151  			break
  3152  		}
  3153  		d := v_1.AuxInt
  3154  		v.reset(OpConstBool)
  3155  		v.AuxInt = b2i(uint8(c) > uint8(d))
  3156  		return true
  3157  	}
  3158  	return false
  3159  }
  3160  func rewriteValuegeneric_OpIMake(v *Value, config *Config) bool {
  3161  	b := v.Block
  3162  	_ = b
  3163  	// match: (IMake typ (StructMake1 val))
  3164  	// cond:
  3165  	// result: (IMake typ val)
  3166  	for {
  3167  		typ := v.Args[0]
  3168  		v_1 := v.Args[1]
  3169  		if v_1.Op != OpStructMake1 {
  3170  			break
  3171  		}
  3172  		val := v_1.Args[0]
  3173  		v.reset(OpIMake)
  3174  		v.AddArg(typ)
  3175  		v.AddArg(val)
  3176  		return true
  3177  	}
  3178  	// match: (IMake typ (ArrayMake1 val))
  3179  	// cond:
  3180  	// result: (IMake typ val)
  3181  	for {
  3182  		typ := v.Args[0]
  3183  		v_1 := v.Args[1]
  3184  		if v_1.Op != OpArrayMake1 {
  3185  			break
  3186  		}
  3187  		val := v_1.Args[0]
  3188  		v.reset(OpIMake)
  3189  		v.AddArg(typ)
  3190  		v.AddArg(val)
  3191  		return true
  3192  	}
  3193  	return false
  3194  }
  3195  func rewriteValuegeneric_OpIsInBounds(v *Value, config *Config) bool {
  3196  	b := v.Block
  3197  	_ = b
  3198  	// match: (IsInBounds (ZeroExt8to32  _) (Const32 [c]))
  3199  	// cond: (1 << 8)  <= c
  3200  	// result: (ConstBool [1])
  3201  	for {
  3202  		v_0 := v.Args[0]
  3203  		if v_0.Op != OpZeroExt8to32 {
  3204  			break
  3205  		}
  3206  		v_1 := v.Args[1]
  3207  		if v_1.Op != OpConst32 {
  3208  			break
  3209  		}
  3210  		c := v_1.AuxInt
  3211  		if !((1 << 8) <= c) {
  3212  			break
  3213  		}
  3214  		v.reset(OpConstBool)
  3215  		v.AuxInt = 1
  3216  		return true
  3217  	}
  3218  	// match: (IsInBounds (ZeroExt8to64  _) (Const64 [c]))
  3219  	// cond: (1 << 8)  <= c
  3220  	// result: (ConstBool [1])
  3221  	for {
  3222  		v_0 := v.Args[0]
  3223  		if v_0.Op != OpZeroExt8to64 {
  3224  			break
  3225  		}
  3226  		v_1 := v.Args[1]
  3227  		if v_1.Op != OpConst64 {
  3228  			break
  3229  		}
  3230  		c := v_1.AuxInt
  3231  		if !((1 << 8) <= c) {
  3232  			break
  3233  		}
  3234  		v.reset(OpConstBool)
  3235  		v.AuxInt = 1
  3236  		return true
  3237  	}
  3238  	// match: (IsInBounds (ZeroExt16to32 _) (Const32 [c]))
  3239  	// cond: (1 << 16) <= c
  3240  	// result: (ConstBool [1])
  3241  	for {
  3242  		v_0 := v.Args[0]
  3243  		if v_0.Op != OpZeroExt16to32 {
  3244  			break
  3245  		}
  3246  		v_1 := v.Args[1]
  3247  		if v_1.Op != OpConst32 {
  3248  			break
  3249  		}
  3250  		c := v_1.AuxInt
  3251  		if !((1 << 16) <= c) {
  3252  			break
  3253  		}
  3254  		v.reset(OpConstBool)
  3255  		v.AuxInt = 1
  3256  		return true
  3257  	}
  3258  	// match: (IsInBounds (ZeroExt16to64 _) (Const64 [c]))
  3259  	// cond: (1 << 16) <= c
  3260  	// result: (ConstBool [1])
  3261  	for {
  3262  		v_0 := v.Args[0]
  3263  		if v_0.Op != OpZeroExt16to64 {
  3264  			break
  3265  		}
  3266  		v_1 := v.Args[1]
  3267  		if v_1.Op != OpConst64 {
  3268  			break
  3269  		}
  3270  		c := v_1.AuxInt
  3271  		if !((1 << 16) <= c) {
  3272  			break
  3273  		}
  3274  		v.reset(OpConstBool)
  3275  		v.AuxInt = 1
  3276  		return true
  3277  	}
  3278  	// match: (IsInBounds x x)
  3279  	// cond:
  3280  	// result: (ConstBool [0])
  3281  	for {
  3282  		x := v.Args[0]
  3283  		if x != v.Args[1] {
  3284  			break
  3285  		}
  3286  		v.reset(OpConstBool)
  3287  		v.AuxInt = 0
  3288  		return true
  3289  	}
  3290  	// match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d]))
  3291  	// cond: 0 <= c && c < d
  3292  	// result: (ConstBool [1])
  3293  	for {
  3294  		v_0 := v.Args[0]
  3295  		if v_0.Op != OpAnd32 {
  3296  			break
  3297  		}
  3298  		v_0_0 := v_0.Args[0]
  3299  		if v_0_0.Op != OpConst32 {
  3300  			break
  3301  		}
  3302  		c := v_0_0.AuxInt
  3303  		v_1 := v.Args[1]
  3304  		if v_1.Op != OpConst32 {
  3305  			break
  3306  		}
  3307  		d := v_1.AuxInt
  3308  		if !(0 <= c && c < d) {
  3309  			break
  3310  		}
  3311  		v.reset(OpConstBool)
  3312  		v.AuxInt = 1
  3313  		return true
  3314  	}
  3315  	// match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d]))
  3316  	// cond: 0 <= c && c < d
  3317  	// result: (ConstBool [1])
  3318  	for {
  3319  		v_0 := v.Args[0]
  3320  		if v_0.Op != OpAnd64 {
  3321  			break
  3322  		}
  3323  		v_0_0 := v_0.Args[0]
  3324  		if v_0_0.Op != OpConst64 {
  3325  			break
  3326  		}
  3327  		c := v_0_0.AuxInt
  3328  		v_1 := v.Args[1]
  3329  		if v_1.Op != OpConst64 {
  3330  			break
  3331  		}
  3332  		d := v_1.AuxInt
  3333  		if !(0 <= c && c < d) {
  3334  			break
  3335  		}
  3336  		v.reset(OpConstBool)
  3337  		v.AuxInt = 1
  3338  		return true
  3339  	}
  3340  	// match: (IsInBounds (Const32 [c]) (Const32 [d]))
  3341  	// cond:
  3342  	// result: (ConstBool [b2i(0 <= c && c < d)])
  3343  	for {
  3344  		v_0 := v.Args[0]
  3345  		if v_0.Op != OpConst32 {
  3346  			break
  3347  		}
  3348  		c := v_0.AuxInt
  3349  		v_1 := v.Args[1]
  3350  		if v_1.Op != OpConst32 {
  3351  			break
  3352  		}
  3353  		d := v_1.AuxInt
  3354  		v.reset(OpConstBool)
  3355  		v.AuxInt = b2i(0 <= c && c < d)
  3356  		return true
  3357  	}
  3358  	// match: (IsInBounds (Const64 [c]) (Const64 [d]))
  3359  	// cond:
  3360  	// result: (ConstBool [b2i(0 <= c && c < d)])
  3361  	for {
  3362  		v_0 := v.Args[0]
  3363  		if v_0.Op != OpConst64 {
  3364  			break
  3365  		}
  3366  		c := v_0.AuxInt
  3367  		v_1 := v.Args[1]
  3368  		if v_1.Op != OpConst64 {
  3369  			break
  3370  		}
  3371  		d := v_1.AuxInt
  3372  		v.reset(OpConstBool)
  3373  		v.AuxInt = b2i(0 <= c && c < d)
  3374  		return true
  3375  	}
  3376  	// match: (IsInBounds (Mod32u _ y) y)
  3377  	// cond:
  3378  	// result: (ConstBool [1])
  3379  	for {
  3380  		v_0 := v.Args[0]
  3381  		if v_0.Op != OpMod32u {
  3382  			break
  3383  		}
  3384  		y := v_0.Args[1]
  3385  		if y != v.Args[1] {
  3386  			break
  3387  		}
  3388  		v.reset(OpConstBool)
  3389  		v.AuxInt = 1
  3390  		return true
  3391  	}
  3392  	// match: (IsInBounds (Mod64u _ y) y)
  3393  	// cond:
  3394  	// result: (ConstBool [1])
  3395  	for {
  3396  		v_0 := v.Args[0]
  3397  		if v_0.Op != OpMod64u {
  3398  			break
  3399  		}
  3400  		y := v_0.Args[1]
  3401  		if y != v.Args[1] {
  3402  			break
  3403  		}
  3404  		v.reset(OpConstBool)
  3405  		v.AuxInt = 1
  3406  		return true
  3407  	}
  3408  	return false
  3409  }
  3410  func rewriteValuegeneric_OpIsSliceInBounds(v *Value, config *Config) bool {
  3411  	b := v.Block
  3412  	_ = b
  3413  	// match: (IsSliceInBounds x x)
  3414  	// cond:
  3415  	// result: (ConstBool [1])
  3416  	for {
  3417  		x := v.Args[0]
  3418  		if x != v.Args[1] {
  3419  			break
  3420  		}
  3421  		v.reset(OpConstBool)
  3422  		v.AuxInt = 1
  3423  		return true
  3424  	}
  3425  	// match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d]))
  3426  	// cond: 0 <= c && c <= d
  3427  	// result: (ConstBool [1])
  3428  	for {
  3429  		v_0 := v.Args[0]
  3430  		if v_0.Op != OpAnd32 {
  3431  			break
  3432  		}
  3433  		v_0_0 := v_0.Args[0]
  3434  		if v_0_0.Op != OpConst32 {
  3435  			break
  3436  		}
  3437  		c := v_0_0.AuxInt
  3438  		v_1 := v.Args[1]
  3439  		if v_1.Op != OpConst32 {
  3440  			break
  3441  		}
  3442  		d := v_1.AuxInt
  3443  		if !(0 <= c && c <= d) {
  3444  			break
  3445  		}
  3446  		v.reset(OpConstBool)
  3447  		v.AuxInt = 1
  3448  		return true
  3449  	}
  3450  	// match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d]))
  3451  	// cond: 0 <= c && c <= d
  3452  	// result: (ConstBool [1])
  3453  	for {
  3454  		v_0 := v.Args[0]
  3455  		if v_0.Op != OpAnd64 {
  3456  			break
  3457  		}
  3458  		v_0_0 := v_0.Args[0]
  3459  		if v_0_0.Op != OpConst64 {
  3460  			break
  3461  		}
  3462  		c := v_0_0.AuxInt
  3463  		v_1 := v.Args[1]
  3464  		if v_1.Op != OpConst64 {
  3465  			break
  3466  		}
  3467  		d := v_1.AuxInt
  3468  		if !(0 <= c && c <= d) {
  3469  			break
  3470  		}
  3471  		v.reset(OpConstBool)
  3472  		v.AuxInt = 1
  3473  		return true
  3474  	}
  3475  	// match: (IsSliceInBounds (Const32 [0]) _)
  3476  	// cond:
  3477  	// result: (ConstBool [1])
  3478  	for {
  3479  		v_0 := v.Args[0]
  3480  		if v_0.Op != OpConst32 {
  3481  			break
  3482  		}
  3483  		if v_0.AuxInt != 0 {
  3484  			break
  3485  		}
  3486  		v.reset(OpConstBool)
  3487  		v.AuxInt = 1
  3488  		return true
  3489  	}
  3490  	// match: (IsSliceInBounds (Const64 [0]) _)
  3491  	// cond:
  3492  	// result: (ConstBool [1])
  3493  	for {
  3494  		v_0 := v.Args[0]
  3495  		if v_0.Op != OpConst64 {
  3496  			break
  3497  		}
  3498  		if v_0.AuxInt != 0 {
  3499  			break
  3500  		}
  3501  		v.reset(OpConstBool)
  3502  		v.AuxInt = 1
  3503  		return true
  3504  	}
  3505  	// match: (IsSliceInBounds (Const32 [c]) (Const32 [d]))
  3506  	// cond:
  3507  	// result: (ConstBool [b2i(0 <= c && c <= d)])
  3508  	for {
  3509  		v_0 := v.Args[0]
  3510  		if v_0.Op != OpConst32 {
  3511  			break
  3512  		}
  3513  		c := v_0.AuxInt
  3514  		v_1 := v.Args[1]
  3515  		if v_1.Op != OpConst32 {
  3516  			break
  3517  		}
  3518  		d := v_1.AuxInt
  3519  		v.reset(OpConstBool)
  3520  		v.AuxInt = b2i(0 <= c && c <= d)
  3521  		return true
  3522  	}
  3523  	// match: (IsSliceInBounds (Const64 [c]) (Const64 [d]))
  3524  	// cond:
  3525  	// result: (ConstBool [b2i(0 <= c && c <= d)])
  3526  	for {
  3527  		v_0 := v.Args[0]
  3528  		if v_0.Op != OpConst64 {
  3529  			break
  3530  		}
  3531  		c := v_0.AuxInt
  3532  		v_1 := v.Args[1]
  3533  		if v_1.Op != OpConst64 {
  3534  			break
  3535  		}
  3536  		d := v_1.AuxInt
  3537  		v.reset(OpConstBool)
  3538  		v.AuxInt = b2i(0 <= c && c <= d)
  3539  		return true
  3540  	}
  3541  	// match: (IsSliceInBounds (SliceLen x) (SliceCap x))
  3542  	// cond:
  3543  	// result: (ConstBool [1])
  3544  	for {
  3545  		v_0 := v.Args[0]
  3546  		if v_0.Op != OpSliceLen {
  3547  			break
  3548  		}
  3549  		x := v_0.Args[0]
  3550  		v_1 := v.Args[1]
  3551  		if v_1.Op != OpSliceCap {
  3552  			break
  3553  		}
  3554  		if x != v_1.Args[0] {
  3555  			break
  3556  		}
  3557  		v.reset(OpConstBool)
  3558  		v.AuxInt = 1
  3559  		return true
  3560  	}
  3561  	return false
  3562  }
  3563  func rewriteValuegeneric_OpLeq16(v *Value, config *Config) bool {
  3564  	b := v.Block
  3565  	_ = b
  3566  	// match: (Leq16 (Const16 [c]) (Const16 [d]))
  3567  	// cond:
  3568  	// result: (ConstBool [b2i(c <= d)])
  3569  	for {
  3570  		v_0 := v.Args[0]
  3571  		if v_0.Op != OpConst16 {
  3572  			break
  3573  		}
  3574  		c := v_0.AuxInt
  3575  		v_1 := v.Args[1]
  3576  		if v_1.Op != OpConst16 {
  3577  			break
  3578  		}
  3579  		d := v_1.AuxInt
  3580  		v.reset(OpConstBool)
  3581  		v.AuxInt = b2i(c <= d)
  3582  		return true
  3583  	}
  3584  	return false
  3585  }
  3586  func rewriteValuegeneric_OpLeq16U(v *Value, config *Config) bool {
  3587  	b := v.Block
  3588  	_ = b
  3589  	// match: (Leq16U (Const16 [c]) (Const16 [d]))
  3590  	// cond:
  3591  	// result: (ConstBool [b2i(uint16(c) <= uint16(d))])
  3592  	for {
  3593  		v_0 := v.Args[0]
  3594  		if v_0.Op != OpConst16 {
  3595  			break
  3596  		}
  3597  		c := v_0.AuxInt
  3598  		v_1 := v.Args[1]
  3599  		if v_1.Op != OpConst16 {
  3600  			break
  3601  		}
  3602  		d := v_1.AuxInt
  3603  		v.reset(OpConstBool)
  3604  		v.AuxInt = b2i(uint16(c) <= uint16(d))
  3605  		return true
  3606  	}
  3607  	return false
  3608  }
  3609  func rewriteValuegeneric_OpLeq32(v *Value, config *Config) bool {
  3610  	b := v.Block
  3611  	_ = b
  3612  	// match: (Leq32 (Const32 [c]) (Const32 [d]))
  3613  	// cond:
  3614  	// result: (ConstBool [b2i(c <= d)])
  3615  	for {
  3616  		v_0 := v.Args[0]
  3617  		if v_0.Op != OpConst32 {
  3618  			break
  3619  		}
  3620  		c := v_0.AuxInt
  3621  		v_1 := v.Args[1]
  3622  		if v_1.Op != OpConst32 {
  3623  			break
  3624  		}
  3625  		d := v_1.AuxInt
  3626  		v.reset(OpConstBool)
  3627  		v.AuxInt = b2i(c <= d)
  3628  		return true
  3629  	}
  3630  	return false
  3631  }
  3632  func rewriteValuegeneric_OpLeq32U(v *Value, config *Config) bool {
  3633  	b := v.Block
  3634  	_ = b
  3635  	// match: (Leq32U (Const32 [c]) (Const32 [d]))
  3636  	// cond:
  3637  	// result: (ConstBool [b2i(uint32(c) <= uint32(d))])
  3638  	for {
  3639  		v_0 := v.Args[0]
  3640  		if v_0.Op != OpConst32 {
  3641  			break
  3642  		}
  3643  		c := v_0.AuxInt
  3644  		v_1 := v.Args[1]
  3645  		if v_1.Op != OpConst32 {
  3646  			break
  3647  		}
  3648  		d := v_1.AuxInt
  3649  		v.reset(OpConstBool)
  3650  		v.AuxInt = b2i(uint32(c) <= uint32(d))
  3651  		return true
  3652  	}
  3653  	return false
  3654  }
  3655  func rewriteValuegeneric_OpLeq64(v *Value, config *Config) bool {
  3656  	b := v.Block
  3657  	_ = b
  3658  	// match: (Leq64 (Const64 [c]) (Const64 [d]))
  3659  	// cond:
  3660  	// result: (ConstBool [b2i(c <= d)])
  3661  	for {
  3662  		v_0 := v.Args[0]
  3663  		if v_0.Op != OpConst64 {
  3664  			break
  3665  		}
  3666  		c := v_0.AuxInt
  3667  		v_1 := v.Args[1]
  3668  		if v_1.Op != OpConst64 {
  3669  			break
  3670  		}
  3671  		d := v_1.AuxInt
  3672  		v.reset(OpConstBool)
  3673  		v.AuxInt = b2i(c <= d)
  3674  		return true
  3675  	}
  3676  	return false
  3677  }
  3678  func rewriteValuegeneric_OpLeq64U(v *Value, config *Config) bool {
  3679  	b := v.Block
  3680  	_ = b
  3681  	// match: (Leq64U (Const64 [c]) (Const64 [d]))
  3682  	// cond:
  3683  	// result: (ConstBool [b2i(uint64(c) <= uint64(d))])
  3684  	for {
  3685  		v_0 := v.Args[0]
  3686  		if v_0.Op != OpConst64 {
  3687  			break
  3688  		}
  3689  		c := v_0.AuxInt
  3690  		v_1 := v.Args[1]
  3691  		if v_1.Op != OpConst64 {
  3692  			break
  3693  		}
  3694  		d := v_1.AuxInt
  3695  		v.reset(OpConstBool)
  3696  		v.AuxInt = b2i(uint64(c) <= uint64(d))
  3697  		return true
  3698  	}
  3699  	return false
  3700  }
  3701  func rewriteValuegeneric_OpLeq8(v *Value, config *Config) bool {
  3702  	b := v.Block
  3703  	_ = b
  3704  	// match: (Leq8  (Const8  [c]) (Const8  [d]))
  3705  	// cond:
  3706  	// result: (ConstBool [b2i(c <= d)])
  3707  	for {
  3708  		v_0 := v.Args[0]
  3709  		if v_0.Op != OpConst8 {
  3710  			break
  3711  		}
  3712  		c := v_0.AuxInt
  3713  		v_1 := v.Args[1]
  3714  		if v_1.Op != OpConst8 {
  3715  			break
  3716  		}
  3717  		d := v_1.AuxInt
  3718  		v.reset(OpConstBool)
  3719  		v.AuxInt = b2i(c <= d)
  3720  		return true
  3721  	}
  3722  	return false
  3723  }
  3724  func rewriteValuegeneric_OpLeq8U(v *Value, config *Config) bool {
  3725  	b := v.Block
  3726  	_ = b
  3727  	// match: (Leq8U  (Const8  [c]) (Const8  [d]))
  3728  	// cond:
  3729  	// result: (ConstBool [b2i(uint8(c)  <= uint8(d))])
  3730  	for {
  3731  		v_0 := v.Args[0]
  3732  		if v_0.Op != OpConst8 {
  3733  			break
  3734  		}
  3735  		c := v_0.AuxInt
  3736  		v_1 := v.Args[1]
  3737  		if v_1.Op != OpConst8 {
  3738  			break
  3739  		}
  3740  		d := v_1.AuxInt
  3741  		v.reset(OpConstBool)
  3742  		v.AuxInt = b2i(uint8(c) <= uint8(d))
  3743  		return true
  3744  	}
  3745  	return false
  3746  }
  3747  func rewriteValuegeneric_OpLess16(v *Value, config *Config) bool {
  3748  	b := v.Block
  3749  	_ = b
  3750  	// match: (Less16 (Const16 [c]) (Const16 [d]))
  3751  	// cond:
  3752  	// result: (ConstBool [b2i(c < d)])
  3753  	for {
  3754  		v_0 := v.Args[0]
  3755  		if v_0.Op != OpConst16 {
  3756  			break
  3757  		}
  3758  		c := v_0.AuxInt
  3759  		v_1 := v.Args[1]
  3760  		if v_1.Op != OpConst16 {
  3761  			break
  3762  		}
  3763  		d := v_1.AuxInt
  3764  		v.reset(OpConstBool)
  3765  		v.AuxInt = b2i(c < d)
  3766  		return true
  3767  	}
  3768  	return false
  3769  }
  3770  func rewriteValuegeneric_OpLess16U(v *Value, config *Config) bool {
  3771  	b := v.Block
  3772  	_ = b
  3773  	// match: (Less16U (Const16 [c]) (Const16 [d]))
  3774  	// cond:
  3775  	// result: (ConstBool [b2i(uint16(c) < uint16(d))])
  3776  	for {
  3777  		v_0 := v.Args[0]
  3778  		if v_0.Op != OpConst16 {
  3779  			break
  3780  		}
  3781  		c := v_0.AuxInt
  3782  		v_1 := v.Args[1]
  3783  		if v_1.Op != OpConst16 {
  3784  			break
  3785  		}
  3786  		d := v_1.AuxInt
  3787  		v.reset(OpConstBool)
  3788  		v.AuxInt = b2i(uint16(c) < uint16(d))
  3789  		return true
  3790  	}
  3791  	return false
  3792  }
  3793  func rewriteValuegeneric_OpLess32(v *Value, config *Config) bool {
  3794  	b := v.Block
  3795  	_ = b
  3796  	// match: (Less32 (Const32 [c]) (Const32 [d]))
  3797  	// cond:
  3798  	// result: (ConstBool [b2i(c < d)])
  3799  	for {
  3800  		v_0 := v.Args[0]
  3801  		if v_0.Op != OpConst32 {
  3802  			break
  3803  		}
  3804  		c := v_0.AuxInt
  3805  		v_1 := v.Args[1]
  3806  		if v_1.Op != OpConst32 {
  3807  			break
  3808  		}
  3809  		d := v_1.AuxInt
  3810  		v.reset(OpConstBool)
  3811  		v.AuxInt = b2i(c < d)
  3812  		return true
  3813  	}
  3814  	return false
  3815  }
  3816  func rewriteValuegeneric_OpLess32U(v *Value, config *Config) bool {
  3817  	b := v.Block
  3818  	_ = b
  3819  	// match: (Less32U (Const32 [c]) (Const32 [d]))
  3820  	// cond:
  3821  	// result: (ConstBool [b2i(uint32(c) < uint32(d))])
  3822  	for {
  3823  		v_0 := v.Args[0]
  3824  		if v_0.Op != OpConst32 {
  3825  			break
  3826  		}
  3827  		c := v_0.AuxInt
  3828  		v_1 := v.Args[1]
  3829  		if v_1.Op != OpConst32 {
  3830  			break
  3831  		}
  3832  		d := v_1.AuxInt
  3833  		v.reset(OpConstBool)
  3834  		v.AuxInt = b2i(uint32(c) < uint32(d))
  3835  		return true
  3836  	}
  3837  	return false
  3838  }
  3839  func rewriteValuegeneric_OpLess64(v *Value, config *Config) bool {
  3840  	b := v.Block
  3841  	_ = b
  3842  	// match: (Less64 (Const64 [c]) (Const64 [d]))
  3843  	// cond:
  3844  	// result: (ConstBool [b2i(c < d)])
  3845  	for {
  3846  		v_0 := v.Args[0]
  3847  		if v_0.Op != OpConst64 {
  3848  			break
  3849  		}
  3850  		c := v_0.AuxInt
  3851  		v_1 := v.Args[1]
  3852  		if v_1.Op != OpConst64 {
  3853  			break
  3854  		}
  3855  		d := v_1.AuxInt
  3856  		v.reset(OpConstBool)
  3857  		v.AuxInt = b2i(c < d)
  3858  		return true
  3859  	}
  3860  	return false
  3861  }
  3862  func rewriteValuegeneric_OpLess64U(v *Value, config *Config) bool {
  3863  	b := v.Block
  3864  	_ = b
  3865  	// match: (Less64U (Const64 [c]) (Const64 [d]))
  3866  	// cond:
  3867  	// result: (ConstBool [b2i(uint64(c) < uint64(d))])
  3868  	for {
  3869  		v_0 := v.Args[0]
  3870  		if v_0.Op != OpConst64 {
  3871  			break
  3872  		}
  3873  		c := v_0.AuxInt
  3874  		v_1 := v.Args[1]
  3875  		if v_1.Op != OpConst64 {
  3876  			break
  3877  		}
  3878  		d := v_1.AuxInt
  3879  		v.reset(OpConstBool)
  3880  		v.AuxInt = b2i(uint64(c) < uint64(d))
  3881  		return true
  3882  	}
  3883  	return false
  3884  }
  3885  func rewriteValuegeneric_OpLess8(v *Value, config *Config) bool {
  3886  	b := v.Block
  3887  	_ = b
  3888  	// match: (Less8  (Const8  [c]) (Const8  [d]))
  3889  	// cond:
  3890  	// result: (ConstBool [b2i(c < d)])
  3891  	for {
  3892  		v_0 := v.Args[0]
  3893  		if v_0.Op != OpConst8 {
  3894  			break
  3895  		}
  3896  		c := v_0.AuxInt
  3897  		v_1 := v.Args[1]
  3898  		if v_1.Op != OpConst8 {
  3899  			break
  3900  		}
  3901  		d := v_1.AuxInt
  3902  		v.reset(OpConstBool)
  3903  		v.AuxInt = b2i(c < d)
  3904  		return true
  3905  	}
  3906  	return false
  3907  }
  3908  func rewriteValuegeneric_OpLess8U(v *Value, config *Config) bool {
  3909  	b := v.Block
  3910  	_ = b
  3911  	// match: (Less8U  (Const8  [c]) (Const8  [d]))
  3912  	// cond:
  3913  	// result: (ConstBool [b2i(uint8(c)  < uint8(d))])
  3914  	for {
  3915  		v_0 := v.Args[0]
  3916  		if v_0.Op != OpConst8 {
  3917  			break
  3918  		}
  3919  		c := v_0.AuxInt
  3920  		v_1 := v.Args[1]
  3921  		if v_1.Op != OpConst8 {
  3922  			break
  3923  		}
  3924  		d := v_1.AuxInt
  3925  		v.reset(OpConstBool)
  3926  		v.AuxInt = b2i(uint8(c) < uint8(d))
  3927  		return true
  3928  	}
  3929  	return false
  3930  }
  3931  func rewriteValuegeneric_OpLoad(v *Value, config *Config) bool {
  3932  	b := v.Block
  3933  	_ = b
  3934  	// match: (Load <t1> p1 (Store [w] p2 x _))
  3935  	// cond: isSamePtr(p1,p2) && t1.Compare(x.Type)==CMPeq && w == t1.Size()
  3936  	// result: x
  3937  	for {
  3938  		t1 := v.Type
  3939  		p1 := v.Args[0]
  3940  		v_1 := v.Args[1]
  3941  		if v_1.Op != OpStore {
  3942  			break
  3943  		}
  3944  		w := v_1.AuxInt
  3945  		p2 := v_1.Args[0]
  3946  		x := v_1.Args[1]
  3947  		if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == CMPeq && w == t1.Size()) {
  3948  			break
  3949  		}
  3950  		v.reset(OpCopy)
  3951  		v.Type = x.Type
  3952  		v.AddArg(x)
  3953  		return true
  3954  	}
  3955  	// match: (Load <t> _ _)
  3956  	// cond: t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)
  3957  	// result: (StructMake0)
  3958  	for {
  3959  		t := v.Type
  3960  		if !(t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)) {
  3961  			break
  3962  		}
  3963  		v.reset(OpStructMake0)
  3964  		return true
  3965  	}
  3966  	// match: (Load <t> ptr mem)
  3967  	// cond: t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)
  3968  	// result: (StructMake1     (Load <t.FieldType(0)> ptr mem))
  3969  	for {
  3970  		t := v.Type
  3971  		ptr := v.Args[0]
  3972  		mem := v.Args[1]
  3973  		if !(t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)) {
  3974  			break
  3975  		}
  3976  		v.reset(OpStructMake1)
  3977  		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
  3978  		v0.AddArg(ptr)
  3979  		v0.AddArg(mem)
  3980  		v.AddArg(v0)
  3981  		return true
  3982  	}
  3983  	// match: (Load <t> ptr mem)
  3984  	// cond: t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)
  3985  	// result: (StructMake2     (Load <t.FieldType(0)> ptr mem)     (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem))
  3986  	for {
  3987  		t := v.Type
  3988  		ptr := v.Args[0]
  3989  		mem := v.Args[1]
  3990  		if !(t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)) {
  3991  			break
  3992  		}
  3993  		v.reset(OpStructMake2)
  3994  		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
  3995  		v0.AddArg(ptr)
  3996  		v0.AddArg(mem)
  3997  		v.AddArg(v0)
  3998  		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
  3999  		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
  4000  		v2.AuxInt = t.FieldOff(1)
  4001  		v2.AddArg(ptr)
  4002  		v1.AddArg(v2)
  4003  		v1.AddArg(mem)
  4004  		v.AddArg(v1)
  4005  		return true
  4006  	}
  4007  	// match: (Load <t> ptr mem)
  4008  	// cond: t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)
  4009  	// result: (StructMake3     (Load <t.FieldType(0)> ptr mem)     (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)     (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem))
  4010  	for {
  4011  		t := v.Type
  4012  		ptr := v.Args[0]
  4013  		mem := v.Args[1]
  4014  		if !(t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)) {
  4015  			break
  4016  		}
  4017  		v.reset(OpStructMake3)
  4018  		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
  4019  		v0.AddArg(ptr)
  4020  		v0.AddArg(mem)
  4021  		v.AddArg(v0)
  4022  		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
  4023  		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
  4024  		v2.AuxInt = t.FieldOff(1)
  4025  		v2.AddArg(ptr)
  4026  		v1.AddArg(v2)
  4027  		v1.AddArg(mem)
  4028  		v.AddArg(v1)
  4029  		v3 := b.NewValue0(v.Line, OpLoad, t.FieldType(2))
  4030  		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
  4031  		v4.AuxInt = t.FieldOff(2)
  4032  		v4.AddArg(ptr)
  4033  		v3.AddArg(v4)
  4034  		v3.AddArg(mem)
  4035  		v.AddArg(v3)
  4036  		return true
  4037  	}
  4038  	// match: (Load <t> ptr mem)
  4039  	// cond: t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)
  4040  	// result: (StructMake4     (Load <t.FieldType(0)> ptr mem)     (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)     (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem)     (Load <t.FieldType(3)> (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] ptr) mem))
  4041  	for {
  4042  		t := v.Type
  4043  		ptr := v.Args[0]
  4044  		mem := v.Args[1]
  4045  		if !(t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)) {
  4046  			break
  4047  		}
  4048  		v.reset(OpStructMake4)
  4049  		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
  4050  		v0.AddArg(ptr)
  4051  		v0.AddArg(mem)
  4052  		v.AddArg(v0)
  4053  		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
  4054  		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
  4055  		v2.AuxInt = t.FieldOff(1)
  4056  		v2.AddArg(ptr)
  4057  		v1.AddArg(v2)
  4058  		v1.AddArg(mem)
  4059  		v.AddArg(v1)
  4060  		v3 := b.NewValue0(v.Line, OpLoad, t.FieldType(2))
  4061  		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
  4062  		v4.AuxInt = t.FieldOff(2)
  4063  		v4.AddArg(ptr)
  4064  		v3.AddArg(v4)
  4065  		v3.AddArg(mem)
  4066  		v.AddArg(v3)
  4067  		v5 := b.NewValue0(v.Line, OpLoad, t.FieldType(3))
  4068  		v6 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(3).PtrTo())
  4069  		v6.AuxInt = t.FieldOff(3)
  4070  		v6.AddArg(ptr)
  4071  		v5.AddArg(v6)
  4072  		v5.AddArg(mem)
  4073  		v.AddArg(v5)
  4074  		return true
  4075  	}
  4076  	// match: (Load <t> _ _)
  4077  	// cond: t.IsArray() && t.NumElem() == 0
  4078  	// result: (ArrayMake0)
  4079  	for {
  4080  		t := v.Type
  4081  		if !(t.IsArray() && t.NumElem() == 0) {
  4082  			break
  4083  		}
  4084  		v.reset(OpArrayMake0)
  4085  		return true
  4086  	}
  4087  	// match: (Load <t> ptr mem)
  4088  	// cond: t.IsArray() && t.NumElem() == 1 && config.fe.CanSSA(t)
  4089  	// result: (ArrayMake1 (Load <t.ElemType()> ptr mem))
  4090  	for {
  4091  		t := v.Type
  4092  		ptr := v.Args[0]
  4093  		mem := v.Args[1]
  4094  		if !(t.IsArray() && t.NumElem() == 1 && config.fe.CanSSA(t)) {
  4095  			break
  4096  		}
  4097  		v.reset(OpArrayMake1)
  4098  		v0 := b.NewValue0(v.Line, OpLoad, t.ElemType())
  4099  		v0.AddArg(ptr)
  4100  		v0.AddArg(mem)
  4101  		v.AddArg(v0)
  4102  		return true
  4103  	}
  4104  	return false
  4105  }
  4106  func rewriteValuegeneric_OpLsh16x16(v *Value, config *Config) bool {
  4107  	b := v.Block
  4108  	_ = b
  4109  	// match: (Lsh16x16  <t> x (Const16 [c]))
  4110  	// cond:
  4111  	// result: (Lsh16x64  x (Const64 <t> [int64(uint16(c))]))
  4112  	for {
  4113  		t := v.Type
  4114  		x := v.Args[0]
  4115  		v_1 := v.Args[1]
  4116  		if v_1.Op != OpConst16 {
  4117  			break
  4118  		}
  4119  		c := v_1.AuxInt
  4120  		v.reset(OpLsh16x64)
  4121  		v.AddArg(x)
  4122  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4123  		v0.AuxInt = int64(uint16(c))
  4124  		v.AddArg(v0)
  4125  		return true
  4126  	}
  4127  	// match: (Lsh16x16  (Const16 [0]) _)
  4128  	// cond:
  4129  	// result: (Const16 [0])
  4130  	for {
  4131  		v_0 := v.Args[0]
  4132  		if v_0.Op != OpConst16 {
  4133  			break
  4134  		}
  4135  		if v_0.AuxInt != 0 {
  4136  			break
  4137  		}
  4138  		v.reset(OpConst16)
  4139  		v.AuxInt = 0
  4140  		return true
  4141  	}
  4142  	return false
  4143  }
  4144  func rewriteValuegeneric_OpLsh16x32(v *Value, config *Config) bool {
  4145  	b := v.Block
  4146  	_ = b
  4147  	// match: (Lsh16x32  <t> x (Const32 [c]))
  4148  	// cond:
  4149  	// result: (Lsh16x64  x (Const64 <t> [int64(uint32(c))]))
  4150  	for {
  4151  		t := v.Type
  4152  		x := v.Args[0]
  4153  		v_1 := v.Args[1]
  4154  		if v_1.Op != OpConst32 {
  4155  			break
  4156  		}
  4157  		c := v_1.AuxInt
  4158  		v.reset(OpLsh16x64)
  4159  		v.AddArg(x)
  4160  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4161  		v0.AuxInt = int64(uint32(c))
  4162  		v.AddArg(v0)
  4163  		return true
  4164  	}
  4165  	// match: (Lsh16x32  (Const16 [0]) _)
  4166  	// cond:
  4167  	// result: (Const16 [0])
  4168  	for {
  4169  		v_0 := v.Args[0]
  4170  		if v_0.Op != OpConst16 {
  4171  			break
  4172  		}
  4173  		if v_0.AuxInt != 0 {
  4174  			break
  4175  		}
  4176  		v.reset(OpConst16)
  4177  		v.AuxInt = 0
  4178  		return true
  4179  	}
  4180  	return false
  4181  }
  4182  func rewriteValuegeneric_OpLsh16x64(v *Value, config *Config) bool {
  4183  	b := v.Block
  4184  	_ = b
  4185  	// match: (Lsh16x64  (Const16 [c]) (Const64 [d]))
  4186  	// cond:
  4187  	// result: (Const16 [int64(int16(c) << uint64(d))])
  4188  	for {
  4189  		v_0 := v.Args[0]
  4190  		if v_0.Op != OpConst16 {
  4191  			break
  4192  		}
  4193  		c := v_0.AuxInt
  4194  		v_1 := v.Args[1]
  4195  		if v_1.Op != OpConst64 {
  4196  			break
  4197  		}
  4198  		d := v_1.AuxInt
  4199  		v.reset(OpConst16)
  4200  		v.AuxInt = int64(int16(c) << uint64(d))
  4201  		return true
  4202  	}
  4203  	// match: (Lsh16x64  x (Const64 [0]))
  4204  	// cond:
  4205  	// result: x
  4206  	for {
  4207  		x := v.Args[0]
  4208  		v_1 := v.Args[1]
  4209  		if v_1.Op != OpConst64 {
  4210  			break
  4211  		}
  4212  		if v_1.AuxInt != 0 {
  4213  			break
  4214  		}
  4215  		v.reset(OpCopy)
  4216  		v.Type = x.Type
  4217  		v.AddArg(x)
  4218  		return true
  4219  	}
  4220  	// match: (Lsh16x64  (Const16 [0]) _)
  4221  	// cond:
  4222  	// result: (Const16 [0])
  4223  	for {
  4224  		v_0 := v.Args[0]
  4225  		if v_0.Op != OpConst16 {
  4226  			break
  4227  		}
  4228  		if v_0.AuxInt != 0 {
  4229  			break
  4230  		}
  4231  		v.reset(OpConst16)
  4232  		v.AuxInt = 0
  4233  		return true
  4234  	}
  4235  	// match: (Lsh16x64  _ (Const64 [c]))
  4236  	// cond: uint64(c) >= 16
  4237  	// result: (Const16 [0])
  4238  	for {
  4239  		v_1 := v.Args[1]
  4240  		if v_1.Op != OpConst64 {
  4241  			break
  4242  		}
  4243  		c := v_1.AuxInt
  4244  		if !(uint64(c) >= 16) {
  4245  			break
  4246  		}
  4247  		v.reset(OpConst16)
  4248  		v.AuxInt = 0
  4249  		return true
  4250  	}
  4251  	// match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d]))
  4252  	// cond: !uaddOvf(c,d)
  4253  	// result: (Lsh16x64 x (Const64 <t> [c+d]))
  4254  	for {
  4255  		t := v.Type
  4256  		v_0 := v.Args[0]
  4257  		if v_0.Op != OpLsh16x64 {
  4258  			break
  4259  		}
  4260  		x := v_0.Args[0]
  4261  		v_0_1 := v_0.Args[1]
  4262  		if v_0_1.Op != OpConst64 {
  4263  			break
  4264  		}
  4265  		c := v_0_1.AuxInt
  4266  		v_1 := v.Args[1]
  4267  		if v_1.Op != OpConst64 {
  4268  			break
  4269  		}
  4270  		d := v_1.AuxInt
  4271  		if !(!uaddOvf(c, d)) {
  4272  			break
  4273  		}
  4274  		v.reset(OpLsh16x64)
  4275  		v.AddArg(x)
  4276  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4277  		v0.AuxInt = c + d
  4278  		v.AddArg(v0)
  4279  		return true
  4280  	}
  4281  	// match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  4282  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  4283  	// result: (Lsh16x64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  4284  	for {
  4285  		v_0 := v.Args[0]
  4286  		if v_0.Op != OpRsh16Ux64 {
  4287  			break
  4288  		}
  4289  		v_0_0 := v_0.Args[0]
  4290  		if v_0_0.Op != OpLsh16x64 {
  4291  			break
  4292  		}
  4293  		x := v_0_0.Args[0]
  4294  		v_0_0_1 := v_0_0.Args[1]
  4295  		if v_0_0_1.Op != OpConst64 {
  4296  			break
  4297  		}
  4298  		c1 := v_0_0_1.AuxInt
  4299  		v_0_1 := v_0.Args[1]
  4300  		if v_0_1.Op != OpConst64 {
  4301  			break
  4302  		}
  4303  		c2 := v_0_1.AuxInt
  4304  		v_1 := v.Args[1]
  4305  		if v_1.Op != OpConst64 {
  4306  			break
  4307  		}
  4308  		c3 := v_1.AuxInt
  4309  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  4310  			break
  4311  		}
  4312  		v.reset(OpLsh16x64)
  4313  		v.AddArg(x)
  4314  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  4315  		v0.AuxInt = c1 - c2 + c3
  4316  		v.AddArg(v0)
  4317  		return true
  4318  	}
  4319  	return false
  4320  }
  4321  func rewriteValuegeneric_OpLsh16x8(v *Value, config *Config) bool {
  4322  	b := v.Block
  4323  	_ = b
  4324  	// match: (Lsh16x8   <t> x (Const8  [c]))
  4325  	// cond:
  4326  	// result: (Lsh16x64  x (Const64 <t> [int64(uint8(c))]))
  4327  	for {
  4328  		t := v.Type
  4329  		x := v.Args[0]
  4330  		v_1 := v.Args[1]
  4331  		if v_1.Op != OpConst8 {
  4332  			break
  4333  		}
  4334  		c := v_1.AuxInt
  4335  		v.reset(OpLsh16x64)
  4336  		v.AddArg(x)
  4337  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4338  		v0.AuxInt = int64(uint8(c))
  4339  		v.AddArg(v0)
  4340  		return true
  4341  	}
  4342  	// match: (Lsh16x8  (Const16 [0]) _)
  4343  	// cond:
  4344  	// result: (Const16 [0])
  4345  	for {
  4346  		v_0 := v.Args[0]
  4347  		if v_0.Op != OpConst16 {
  4348  			break
  4349  		}
  4350  		if v_0.AuxInt != 0 {
  4351  			break
  4352  		}
  4353  		v.reset(OpConst16)
  4354  		v.AuxInt = 0
  4355  		return true
  4356  	}
  4357  	return false
  4358  }
  4359  func rewriteValuegeneric_OpLsh32x16(v *Value, config *Config) bool {
  4360  	b := v.Block
  4361  	_ = b
  4362  	// match: (Lsh32x16  <t> x (Const16 [c]))
  4363  	// cond:
  4364  	// result: (Lsh32x64  x (Const64 <t> [int64(uint16(c))]))
  4365  	for {
  4366  		t := v.Type
  4367  		x := v.Args[0]
  4368  		v_1 := v.Args[1]
  4369  		if v_1.Op != OpConst16 {
  4370  			break
  4371  		}
  4372  		c := v_1.AuxInt
  4373  		v.reset(OpLsh32x64)
  4374  		v.AddArg(x)
  4375  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4376  		v0.AuxInt = int64(uint16(c))
  4377  		v.AddArg(v0)
  4378  		return true
  4379  	}
  4380  	// match: (Lsh32x16  (Const32 [0]) _)
  4381  	// cond:
  4382  	// result: (Const32 [0])
  4383  	for {
  4384  		v_0 := v.Args[0]
  4385  		if v_0.Op != OpConst32 {
  4386  			break
  4387  		}
  4388  		if v_0.AuxInt != 0 {
  4389  			break
  4390  		}
  4391  		v.reset(OpConst32)
  4392  		v.AuxInt = 0
  4393  		return true
  4394  	}
  4395  	return false
  4396  }
  4397  func rewriteValuegeneric_OpLsh32x32(v *Value, config *Config) bool {
  4398  	b := v.Block
  4399  	_ = b
  4400  	// match: (Lsh32x32  <t> x (Const32 [c]))
  4401  	// cond:
  4402  	// result: (Lsh32x64  x (Const64 <t> [int64(uint32(c))]))
  4403  	for {
  4404  		t := v.Type
  4405  		x := v.Args[0]
  4406  		v_1 := v.Args[1]
  4407  		if v_1.Op != OpConst32 {
  4408  			break
  4409  		}
  4410  		c := v_1.AuxInt
  4411  		v.reset(OpLsh32x64)
  4412  		v.AddArg(x)
  4413  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4414  		v0.AuxInt = int64(uint32(c))
  4415  		v.AddArg(v0)
  4416  		return true
  4417  	}
  4418  	// match: (Lsh32x32  (Const32 [0]) _)
  4419  	// cond:
  4420  	// result: (Const32 [0])
  4421  	for {
  4422  		v_0 := v.Args[0]
  4423  		if v_0.Op != OpConst32 {
  4424  			break
  4425  		}
  4426  		if v_0.AuxInt != 0 {
  4427  			break
  4428  		}
  4429  		v.reset(OpConst32)
  4430  		v.AuxInt = 0
  4431  		return true
  4432  	}
  4433  	return false
  4434  }
  4435  func rewriteValuegeneric_OpLsh32x64(v *Value, config *Config) bool {
  4436  	b := v.Block
  4437  	_ = b
  4438  	// match: (Lsh32x64  (Const32 [c]) (Const64 [d]))
  4439  	// cond:
  4440  	// result: (Const32 [int64(int32(c) << uint64(d))])
  4441  	for {
  4442  		v_0 := v.Args[0]
  4443  		if v_0.Op != OpConst32 {
  4444  			break
  4445  		}
  4446  		c := v_0.AuxInt
  4447  		v_1 := v.Args[1]
  4448  		if v_1.Op != OpConst64 {
  4449  			break
  4450  		}
  4451  		d := v_1.AuxInt
  4452  		v.reset(OpConst32)
  4453  		v.AuxInt = int64(int32(c) << uint64(d))
  4454  		return true
  4455  	}
  4456  	// match: (Lsh32x64  x (Const64 [0]))
  4457  	// cond:
  4458  	// result: x
  4459  	for {
  4460  		x := v.Args[0]
  4461  		v_1 := v.Args[1]
  4462  		if v_1.Op != OpConst64 {
  4463  			break
  4464  		}
  4465  		if v_1.AuxInt != 0 {
  4466  			break
  4467  		}
  4468  		v.reset(OpCopy)
  4469  		v.Type = x.Type
  4470  		v.AddArg(x)
  4471  		return true
  4472  	}
  4473  	// match: (Lsh32x64  (Const32 [0]) _)
  4474  	// cond:
  4475  	// result: (Const32 [0])
  4476  	for {
  4477  		v_0 := v.Args[0]
  4478  		if v_0.Op != OpConst32 {
  4479  			break
  4480  		}
  4481  		if v_0.AuxInt != 0 {
  4482  			break
  4483  		}
  4484  		v.reset(OpConst32)
  4485  		v.AuxInt = 0
  4486  		return true
  4487  	}
  4488  	// match: (Lsh32x64  _ (Const64 [c]))
  4489  	// cond: uint64(c) >= 32
  4490  	// result: (Const32 [0])
  4491  	for {
  4492  		v_1 := v.Args[1]
  4493  		if v_1.Op != OpConst64 {
  4494  			break
  4495  		}
  4496  		c := v_1.AuxInt
  4497  		if !(uint64(c) >= 32) {
  4498  			break
  4499  		}
  4500  		v.reset(OpConst32)
  4501  		v.AuxInt = 0
  4502  		return true
  4503  	}
  4504  	// match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d]))
  4505  	// cond: !uaddOvf(c,d)
  4506  	// result: (Lsh32x64 x (Const64 <t> [c+d]))
  4507  	for {
  4508  		t := v.Type
  4509  		v_0 := v.Args[0]
  4510  		if v_0.Op != OpLsh32x64 {
  4511  			break
  4512  		}
  4513  		x := v_0.Args[0]
  4514  		v_0_1 := v_0.Args[1]
  4515  		if v_0_1.Op != OpConst64 {
  4516  			break
  4517  		}
  4518  		c := v_0_1.AuxInt
  4519  		v_1 := v.Args[1]
  4520  		if v_1.Op != OpConst64 {
  4521  			break
  4522  		}
  4523  		d := v_1.AuxInt
  4524  		if !(!uaddOvf(c, d)) {
  4525  			break
  4526  		}
  4527  		v.reset(OpLsh32x64)
  4528  		v.AddArg(x)
  4529  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4530  		v0.AuxInt = c + d
  4531  		v.AddArg(v0)
  4532  		return true
  4533  	}
  4534  	// match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  4535  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  4536  	// result: (Lsh32x64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  4537  	for {
  4538  		v_0 := v.Args[0]
  4539  		if v_0.Op != OpRsh32Ux64 {
  4540  			break
  4541  		}
  4542  		v_0_0 := v_0.Args[0]
  4543  		if v_0_0.Op != OpLsh32x64 {
  4544  			break
  4545  		}
  4546  		x := v_0_0.Args[0]
  4547  		v_0_0_1 := v_0_0.Args[1]
  4548  		if v_0_0_1.Op != OpConst64 {
  4549  			break
  4550  		}
  4551  		c1 := v_0_0_1.AuxInt
  4552  		v_0_1 := v_0.Args[1]
  4553  		if v_0_1.Op != OpConst64 {
  4554  			break
  4555  		}
  4556  		c2 := v_0_1.AuxInt
  4557  		v_1 := v.Args[1]
  4558  		if v_1.Op != OpConst64 {
  4559  			break
  4560  		}
  4561  		c3 := v_1.AuxInt
  4562  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  4563  			break
  4564  		}
  4565  		v.reset(OpLsh32x64)
  4566  		v.AddArg(x)
  4567  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  4568  		v0.AuxInt = c1 - c2 + c3
  4569  		v.AddArg(v0)
  4570  		return true
  4571  	}
  4572  	return false
  4573  }
  4574  func rewriteValuegeneric_OpLsh32x8(v *Value, config *Config) bool {
  4575  	b := v.Block
  4576  	_ = b
  4577  	// match: (Lsh32x8   <t> x (Const8  [c]))
  4578  	// cond:
  4579  	// result: (Lsh32x64  x (Const64 <t> [int64(uint8(c))]))
  4580  	for {
  4581  		t := v.Type
  4582  		x := v.Args[0]
  4583  		v_1 := v.Args[1]
  4584  		if v_1.Op != OpConst8 {
  4585  			break
  4586  		}
  4587  		c := v_1.AuxInt
  4588  		v.reset(OpLsh32x64)
  4589  		v.AddArg(x)
  4590  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4591  		v0.AuxInt = int64(uint8(c))
  4592  		v.AddArg(v0)
  4593  		return true
  4594  	}
  4595  	// match: (Lsh32x8  (Const32 [0]) _)
  4596  	// cond:
  4597  	// result: (Const32 [0])
  4598  	for {
  4599  		v_0 := v.Args[0]
  4600  		if v_0.Op != OpConst32 {
  4601  			break
  4602  		}
  4603  		if v_0.AuxInt != 0 {
  4604  			break
  4605  		}
  4606  		v.reset(OpConst32)
  4607  		v.AuxInt = 0
  4608  		return true
  4609  	}
  4610  	return false
  4611  }
  4612  func rewriteValuegeneric_OpLsh64x16(v *Value, config *Config) bool {
  4613  	b := v.Block
  4614  	_ = b
  4615  	// match: (Lsh64x16  <t> x (Const16 [c]))
  4616  	// cond:
  4617  	// result: (Lsh64x64  x (Const64 <t> [int64(uint16(c))]))
  4618  	for {
  4619  		t := v.Type
  4620  		x := v.Args[0]
  4621  		v_1 := v.Args[1]
  4622  		if v_1.Op != OpConst16 {
  4623  			break
  4624  		}
  4625  		c := v_1.AuxInt
  4626  		v.reset(OpLsh64x64)
  4627  		v.AddArg(x)
  4628  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4629  		v0.AuxInt = int64(uint16(c))
  4630  		v.AddArg(v0)
  4631  		return true
  4632  	}
  4633  	// match: (Lsh64x16  (Const64 [0]) _)
  4634  	// cond:
  4635  	// result: (Const64 [0])
  4636  	for {
  4637  		v_0 := v.Args[0]
  4638  		if v_0.Op != OpConst64 {
  4639  			break
  4640  		}
  4641  		if v_0.AuxInt != 0 {
  4642  			break
  4643  		}
  4644  		v.reset(OpConst64)
  4645  		v.AuxInt = 0
  4646  		return true
  4647  	}
  4648  	return false
  4649  }
  4650  func rewriteValuegeneric_OpLsh64x32(v *Value, config *Config) bool {
  4651  	b := v.Block
  4652  	_ = b
  4653  	// match: (Lsh64x32  <t> x (Const32 [c]))
  4654  	// cond:
  4655  	// result: (Lsh64x64  x (Const64 <t> [int64(uint32(c))]))
  4656  	for {
  4657  		t := v.Type
  4658  		x := v.Args[0]
  4659  		v_1 := v.Args[1]
  4660  		if v_1.Op != OpConst32 {
  4661  			break
  4662  		}
  4663  		c := v_1.AuxInt
  4664  		v.reset(OpLsh64x64)
  4665  		v.AddArg(x)
  4666  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4667  		v0.AuxInt = int64(uint32(c))
  4668  		v.AddArg(v0)
  4669  		return true
  4670  	}
  4671  	// match: (Lsh64x32  (Const64 [0]) _)
  4672  	// cond:
  4673  	// result: (Const64 [0])
  4674  	for {
  4675  		v_0 := v.Args[0]
  4676  		if v_0.Op != OpConst64 {
  4677  			break
  4678  		}
  4679  		if v_0.AuxInt != 0 {
  4680  			break
  4681  		}
  4682  		v.reset(OpConst64)
  4683  		v.AuxInt = 0
  4684  		return true
  4685  	}
  4686  	return false
  4687  }
  4688  func rewriteValuegeneric_OpLsh64x64(v *Value, config *Config) bool {
  4689  	b := v.Block
  4690  	_ = b
  4691  	// match: (Lsh64x64  (Const64 [c]) (Const64 [d]))
  4692  	// cond:
  4693  	// result: (Const64 [c << uint64(d)])
  4694  	for {
  4695  		v_0 := v.Args[0]
  4696  		if v_0.Op != OpConst64 {
  4697  			break
  4698  		}
  4699  		c := v_0.AuxInt
  4700  		v_1 := v.Args[1]
  4701  		if v_1.Op != OpConst64 {
  4702  			break
  4703  		}
  4704  		d := v_1.AuxInt
  4705  		v.reset(OpConst64)
  4706  		v.AuxInt = c << uint64(d)
  4707  		return true
  4708  	}
  4709  	// match: (Lsh64x64  x (Const64 [0]))
  4710  	// cond:
  4711  	// result: x
  4712  	for {
  4713  		x := v.Args[0]
  4714  		v_1 := v.Args[1]
  4715  		if v_1.Op != OpConst64 {
  4716  			break
  4717  		}
  4718  		if v_1.AuxInt != 0 {
  4719  			break
  4720  		}
  4721  		v.reset(OpCopy)
  4722  		v.Type = x.Type
  4723  		v.AddArg(x)
  4724  		return true
  4725  	}
  4726  	// match: (Lsh64x64  (Const64 [0]) _)
  4727  	// cond:
  4728  	// result: (Const64 [0])
  4729  	for {
  4730  		v_0 := v.Args[0]
  4731  		if v_0.Op != OpConst64 {
  4732  			break
  4733  		}
  4734  		if v_0.AuxInt != 0 {
  4735  			break
  4736  		}
  4737  		v.reset(OpConst64)
  4738  		v.AuxInt = 0
  4739  		return true
  4740  	}
  4741  	// match: (Lsh64x64  _ (Const64 [c]))
  4742  	// cond: uint64(c) >= 64
  4743  	// result: (Const64 [0])
  4744  	for {
  4745  		v_1 := v.Args[1]
  4746  		if v_1.Op != OpConst64 {
  4747  			break
  4748  		}
  4749  		c := v_1.AuxInt
  4750  		if !(uint64(c) >= 64) {
  4751  			break
  4752  		}
  4753  		v.reset(OpConst64)
  4754  		v.AuxInt = 0
  4755  		return true
  4756  	}
  4757  	// match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d]))
  4758  	// cond: !uaddOvf(c,d)
  4759  	// result: (Lsh64x64 x (Const64 <t> [c+d]))
  4760  	for {
  4761  		t := v.Type
  4762  		v_0 := v.Args[0]
  4763  		if v_0.Op != OpLsh64x64 {
  4764  			break
  4765  		}
  4766  		x := v_0.Args[0]
  4767  		v_0_1 := v_0.Args[1]
  4768  		if v_0_1.Op != OpConst64 {
  4769  			break
  4770  		}
  4771  		c := v_0_1.AuxInt
  4772  		v_1 := v.Args[1]
  4773  		if v_1.Op != OpConst64 {
  4774  			break
  4775  		}
  4776  		d := v_1.AuxInt
  4777  		if !(!uaddOvf(c, d)) {
  4778  			break
  4779  		}
  4780  		v.reset(OpLsh64x64)
  4781  		v.AddArg(x)
  4782  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4783  		v0.AuxInt = c + d
  4784  		v.AddArg(v0)
  4785  		return true
  4786  	}
  4787  	// match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  4788  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  4789  	// result: (Lsh64x64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  4790  	for {
  4791  		v_0 := v.Args[0]
  4792  		if v_0.Op != OpRsh64Ux64 {
  4793  			break
  4794  		}
  4795  		v_0_0 := v_0.Args[0]
  4796  		if v_0_0.Op != OpLsh64x64 {
  4797  			break
  4798  		}
  4799  		x := v_0_0.Args[0]
  4800  		v_0_0_1 := v_0_0.Args[1]
  4801  		if v_0_0_1.Op != OpConst64 {
  4802  			break
  4803  		}
  4804  		c1 := v_0_0_1.AuxInt
  4805  		v_0_1 := v_0.Args[1]
  4806  		if v_0_1.Op != OpConst64 {
  4807  			break
  4808  		}
  4809  		c2 := v_0_1.AuxInt
  4810  		v_1 := v.Args[1]
  4811  		if v_1.Op != OpConst64 {
  4812  			break
  4813  		}
  4814  		c3 := v_1.AuxInt
  4815  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  4816  			break
  4817  		}
  4818  		v.reset(OpLsh64x64)
  4819  		v.AddArg(x)
  4820  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  4821  		v0.AuxInt = c1 - c2 + c3
  4822  		v.AddArg(v0)
  4823  		return true
  4824  	}
  4825  	return false
  4826  }
  4827  func rewriteValuegeneric_OpLsh64x8(v *Value, config *Config) bool {
  4828  	b := v.Block
  4829  	_ = b
  4830  	// match: (Lsh64x8   <t> x (Const8  [c]))
  4831  	// cond:
  4832  	// result: (Lsh64x64  x (Const64 <t> [int64(uint8(c))]))
  4833  	for {
  4834  		t := v.Type
  4835  		x := v.Args[0]
  4836  		v_1 := v.Args[1]
  4837  		if v_1.Op != OpConst8 {
  4838  			break
  4839  		}
  4840  		c := v_1.AuxInt
  4841  		v.reset(OpLsh64x64)
  4842  		v.AddArg(x)
  4843  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4844  		v0.AuxInt = int64(uint8(c))
  4845  		v.AddArg(v0)
  4846  		return true
  4847  	}
  4848  	// match: (Lsh64x8  (Const64 [0]) _)
  4849  	// cond:
  4850  	// result: (Const64 [0])
  4851  	for {
  4852  		v_0 := v.Args[0]
  4853  		if v_0.Op != OpConst64 {
  4854  			break
  4855  		}
  4856  		if v_0.AuxInt != 0 {
  4857  			break
  4858  		}
  4859  		v.reset(OpConst64)
  4860  		v.AuxInt = 0
  4861  		return true
  4862  	}
  4863  	return false
  4864  }
  4865  func rewriteValuegeneric_OpLsh8x16(v *Value, config *Config) bool {
  4866  	b := v.Block
  4867  	_ = b
  4868  	// match: (Lsh8x16  <t> x (Const16 [c]))
  4869  	// cond:
  4870  	// result: (Lsh8x64  x (Const64 <t> [int64(uint16(c))]))
  4871  	for {
  4872  		t := v.Type
  4873  		x := v.Args[0]
  4874  		v_1 := v.Args[1]
  4875  		if v_1.Op != OpConst16 {
  4876  			break
  4877  		}
  4878  		c := v_1.AuxInt
  4879  		v.reset(OpLsh8x64)
  4880  		v.AddArg(x)
  4881  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4882  		v0.AuxInt = int64(uint16(c))
  4883  		v.AddArg(v0)
  4884  		return true
  4885  	}
  4886  	// match: (Lsh8x16   (Const8 [0]) _)
  4887  	// cond:
  4888  	// result: (Const8  [0])
  4889  	for {
  4890  		v_0 := v.Args[0]
  4891  		if v_0.Op != OpConst8 {
  4892  			break
  4893  		}
  4894  		if v_0.AuxInt != 0 {
  4895  			break
  4896  		}
  4897  		v.reset(OpConst8)
  4898  		v.AuxInt = 0
  4899  		return true
  4900  	}
  4901  	return false
  4902  }
  4903  func rewriteValuegeneric_OpLsh8x32(v *Value, config *Config) bool {
  4904  	b := v.Block
  4905  	_ = b
  4906  	// match: (Lsh8x32  <t> x (Const32 [c]))
  4907  	// cond:
  4908  	// result: (Lsh8x64  x (Const64 <t> [int64(uint32(c))]))
  4909  	for {
  4910  		t := v.Type
  4911  		x := v.Args[0]
  4912  		v_1 := v.Args[1]
  4913  		if v_1.Op != OpConst32 {
  4914  			break
  4915  		}
  4916  		c := v_1.AuxInt
  4917  		v.reset(OpLsh8x64)
  4918  		v.AddArg(x)
  4919  		v0 := b.NewValue0(v.Line, OpConst64, t)
  4920  		v0.AuxInt = int64(uint32(c))
  4921  		v.AddArg(v0)
  4922  		return true
  4923  	}
  4924  	// match: (Lsh8x32   (Const8 [0]) _)
  4925  	// cond:
  4926  	// result: (Const8  [0])
  4927  	for {
  4928  		v_0 := v.Args[0]
  4929  		if v_0.Op != OpConst8 {
  4930  			break
  4931  		}
  4932  		if v_0.AuxInt != 0 {
  4933  			break
  4934  		}
  4935  		v.reset(OpConst8)
  4936  		v.AuxInt = 0
  4937  		return true
  4938  	}
  4939  	return false
  4940  }
  4941  func rewriteValuegeneric_OpLsh8x64(v *Value, config *Config) bool {
  4942  	b := v.Block
  4943  	_ = b
  4944  	// match: (Lsh8x64   (Const8  [c]) (Const64 [d]))
  4945  	// cond:
  4946  	// result: (Const8  [int64(int8(c) << uint64(d))])
  4947  	for {
  4948  		v_0 := v.Args[0]
  4949  		if v_0.Op != OpConst8 {
  4950  			break
  4951  		}
  4952  		c := v_0.AuxInt
  4953  		v_1 := v.Args[1]
  4954  		if v_1.Op != OpConst64 {
  4955  			break
  4956  		}
  4957  		d := v_1.AuxInt
  4958  		v.reset(OpConst8)
  4959  		v.AuxInt = int64(int8(c) << uint64(d))
  4960  		return true
  4961  	}
  4962  	// match: (Lsh8x64   x (Const64 [0]))
  4963  	// cond:
  4964  	// result: x
  4965  	for {
  4966  		x := v.Args[0]
  4967  		v_1 := v.Args[1]
  4968  		if v_1.Op != OpConst64 {
  4969  			break
  4970  		}
  4971  		if v_1.AuxInt != 0 {
  4972  			break
  4973  		}
  4974  		v.reset(OpCopy)
  4975  		v.Type = x.Type
  4976  		v.AddArg(x)
  4977  		return true
  4978  	}
  4979  	// match: (Lsh8x64   (Const8 [0]) _)
  4980  	// cond:
  4981  	// result: (Const8  [0])
  4982  	for {
  4983  		v_0 := v.Args[0]
  4984  		if v_0.Op != OpConst8 {
  4985  			break
  4986  		}
  4987  		if v_0.AuxInt != 0 {
  4988  			break
  4989  		}
  4990  		v.reset(OpConst8)
  4991  		v.AuxInt = 0
  4992  		return true
  4993  	}
  4994  	// match: (Lsh8x64   _ (Const64 [c]))
  4995  	// cond: uint64(c) >= 8
  4996  	// result: (Const8  [0])
  4997  	for {
  4998  		v_1 := v.Args[1]
  4999  		if v_1.Op != OpConst64 {
  5000  			break
  5001  		}
  5002  		c := v_1.AuxInt
  5003  		if !(uint64(c) >= 8) {
  5004  			break
  5005  		}
  5006  		v.reset(OpConst8)
  5007  		v.AuxInt = 0
  5008  		return true
  5009  	}
  5010  	// match: (Lsh8x64  <t> (Lsh8x64  x (Const64 [c])) (Const64 [d]))
  5011  	// cond: !uaddOvf(c,d)
  5012  	// result: (Lsh8x64  x (Const64 <t> [c+d]))
  5013  	for {
  5014  		t := v.Type
  5015  		v_0 := v.Args[0]
  5016  		if v_0.Op != OpLsh8x64 {
  5017  			break
  5018  		}
  5019  		x := v_0.Args[0]
  5020  		v_0_1 := v_0.Args[1]
  5021  		if v_0_1.Op != OpConst64 {
  5022  			break
  5023  		}
  5024  		c := v_0_1.AuxInt
  5025  		v_1 := v.Args[1]
  5026  		if v_1.Op != OpConst64 {
  5027  			break
  5028  		}
  5029  		d := v_1.AuxInt
  5030  		if !(!uaddOvf(c, d)) {
  5031  			break
  5032  		}
  5033  		v.reset(OpLsh8x64)
  5034  		v.AddArg(x)
  5035  		v0 := b.NewValue0(v.Line, OpConst64, t)
  5036  		v0.AuxInt = c + d
  5037  		v.AddArg(v0)
  5038  		return true
  5039  	}
  5040  	// match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  5041  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  5042  	// result: (Lsh8x64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  5043  	for {
  5044  		v_0 := v.Args[0]
  5045  		if v_0.Op != OpRsh8Ux64 {
  5046  			break
  5047  		}
  5048  		v_0_0 := v_0.Args[0]
  5049  		if v_0_0.Op != OpLsh8x64 {
  5050  			break
  5051  		}
  5052  		x := v_0_0.Args[0]
  5053  		v_0_0_1 := v_0_0.Args[1]
  5054  		if v_0_0_1.Op != OpConst64 {
  5055  			break
  5056  		}
  5057  		c1 := v_0_0_1.AuxInt
  5058  		v_0_1 := v_0.Args[1]
  5059  		if v_0_1.Op != OpConst64 {
  5060  			break
  5061  		}
  5062  		c2 := v_0_1.AuxInt
  5063  		v_1 := v.Args[1]
  5064  		if v_1.Op != OpConst64 {
  5065  			break
  5066  		}
  5067  		c3 := v_1.AuxInt
  5068  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  5069  			break
  5070  		}
  5071  		v.reset(OpLsh8x64)
  5072  		v.AddArg(x)
  5073  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  5074  		v0.AuxInt = c1 - c2 + c3
  5075  		v.AddArg(v0)
  5076  		return true
  5077  	}
  5078  	return false
  5079  }
  5080  func rewriteValuegeneric_OpLsh8x8(v *Value, config *Config) bool {
  5081  	b := v.Block
  5082  	_ = b
  5083  	// match: (Lsh8x8   <t> x (Const8  [c]))
  5084  	// cond:
  5085  	// result: (Lsh8x64  x (Const64 <t> [int64(uint8(c))]))
  5086  	for {
  5087  		t := v.Type
  5088  		x := v.Args[0]
  5089  		v_1 := v.Args[1]
  5090  		if v_1.Op != OpConst8 {
  5091  			break
  5092  		}
  5093  		c := v_1.AuxInt
  5094  		v.reset(OpLsh8x64)
  5095  		v.AddArg(x)
  5096  		v0 := b.NewValue0(v.Line, OpConst64, t)
  5097  		v0.AuxInt = int64(uint8(c))
  5098  		v.AddArg(v0)
  5099  		return true
  5100  	}
  5101  	// match: (Lsh8x8   (Const8 [0]) _)
  5102  	// cond:
  5103  	// result: (Const8  [0])
  5104  	for {
  5105  		v_0 := v.Args[0]
  5106  		if v_0.Op != OpConst8 {
  5107  			break
  5108  		}
  5109  		if v_0.AuxInt != 0 {
  5110  			break
  5111  		}
  5112  		v.reset(OpConst8)
  5113  		v.AuxInt = 0
  5114  		return true
  5115  	}
  5116  	return false
  5117  }
  5118  func rewriteValuegeneric_OpMod16(v *Value, config *Config) bool {
  5119  	b := v.Block
  5120  	_ = b
  5121  	// match: (Mod16 (Const16 [c]) (Const16 [d]))
  5122  	// cond: d != 0
  5123  	// result: (Const16 [int64(int16(c % d))])
  5124  	for {
  5125  		v_0 := v.Args[0]
  5126  		if v_0.Op != OpConst16 {
  5127  			break
  5128  		}
  5129  		c := v_0.AuxInt
  5130  		v_1 := v.Args[1]
  5131  		if v_1.Op != OpConst16 {
  5132  			break
  5133  		}
  5134  		d := v_1.AuxInt
  5135  		if !(d != 0) {
  5136  			break
  5137  		}
  5138  		v.reset(OpConst16)
  5139  		v.AuxInt = int64(int16(c % d))
  5140  		return true
  5141  	}
  5142  	return false
  5143  }
  5144  func rewriteValuegeneric_OpMod16u(v *Value, config *Config) bool {
  5145  	b := v.Block
  5146  	_ = b
  5147  	// match: (Mod16u (Const16 [c]) (Const16 [d]))
  5148  	// cond: d != 0
  5149  	// result: (Const16 [int64(uint16(c) % uint16(d))])
  5150  	for {
  5151  		v_0 := v.Args[0]
  5152  		if v_0.Op != OpConst16 {
  5153  			break
  5154  		}
  5155  		c := v_0.AuxInt
  5156  		v_1 := v.Args[1]
  5157  		if v_1.Op != OpConst16 {
  5158  			break
  5159  		}
  5160  		d := v_1.AuxInt
  5161  		if !(d != 0) {
  5162  			break
  5163  		}
  5164  		v.reset(OpConst16)
  5165  		v.AuxInt = int64(uint16(c) % uint16(d))
  5166  		return true
  5167  	}
  5168  	return false
  5169  }
  5170  func rewriteValuegeneric_OpMod32(v *Value, config *Config) bool {
  5171  	b := v.Block
  5172  	_ = b
  5173  	// match: (Mod32 (Const32 [c]) (Const32 [d]))
  5174  	// cond: d != 0
  5175  	// result: (Const32 [int64(int32(c % d))])
  5176  	for {
  5177  		v_0 := v.Args[0]
  5178  		if v_0.Op != OpConst32 {
  5179  			break
  5180  		}
  5181  		c := v_0.AuxInt
  5182  		v_1 := v.Args[1]
  5183  		if v_1.Op != OpConst32 {
  5184  			break
  5185  		}
  5186  		d := v_1.AuxInt
  5187  		if !(d != 0) {
  5188  			break
  5189  		}
  5190  		v.reset(OpConst32)
  5191  		v.AuxInt = int64(int32(c % d))
  5192  		return true
  5193  	}
  5194  	return false
  5195  }
  5196  func rewriteValuegeneric_OpMod32u(v *Value, config *Config) bool {
  5197  	b := v.Block
  5198  	_ = b
  5199  	// match: (Mod32u (Const32 [c]) (Const32 [d]))
  5200  	// cond: d != 0
  5201  	// result: (Const32 [int64(uint32(c) % uint32(d))])
  5202  	for {
  5203  		v_0 := v.Args[0]
  5204  		if v_0.Op != OpConst32 {
  5205  			break
  5206  		}
  5207  		c := v_0.AuxInt
  5208  		v_1 := v.Args[1]
  5209  		if v_1.Op != OpConst32 {
  5210  			break
  5211  		}
  5212  		d := v_1.AuxInt
  5213  		if !(d != 0) {
  5214  			break
  5215  		}
  5216  		v.reset(OpConst32)
  5217  		v.AuxInt = int64(uint32(c) % uint32(d))
  5218  		return true
  5219  	}
  5220  	return false
  5221  }
  5222  func rewriteValuegeneric_OpMod64(v *Value, config *Config) bool {
  5223  	b := v.Block
  5224  	_ = b
  5225  	// match: (Mod64 (Const64 [c]) (Const64 [d]))
  5226  	// cond: d != 0
  5227  	// result: (Const64 [c % d])
  5228  	for {
  5229  		v_0 := v.Args[0]
  5230  		if v_0.Op != OpConst64 {
  5231  			break
  5232  		}
  5233  		c := v_0.AuxInt
  5234  		v_1 := v.Args[1]
  5235  		if v_1.Op != OpConst64 {
  5236  			break
  5237  		}
  5238  		d := v_1.AuxInt
  5239  		if !(d != 0) {
  5240  			break
  5241  		}
  5242  		v.reset(OpConst64)
  5243  		v.AuxInt = c % d
  5244  		return true
  5245  	}
  5246  	// match: (Mod64  <t> x (Const64 [c]))
  5247  	// cond: x.Op != OpConst64 && smagic64ok(c)
  5248  	// result: (Sub64 x (Mul64 <t> (Div64  <t> x (Const64 <t> [c])) (Const64 <t> [c])))
  5249  	for {
  5250  		t := v.Type
  5251  		x := v.Args[0]
  5252  		v_1 := v.Args[1]
  5253  		if v_1.Op != OpConst64 {
  5254  			break
  5255  		}
  5256  		c := v_1.AuxInt
  5257  		if !(x.Op != OpConst64 && smagic64ok(c)) {
  5258  			break
  5259  		}
  5260  		v.reset(OpSub64)
  5261  		v.AddArg(x)
  5262  		v0 := b.NewValue0(v.Line, OpMul64, t)
  5263  		v1 := b.NewValue0(v.Line, OpDiv64, t)
  5264  		v1.AddArg(x)
  5265  		v2 := b.NewValue0(v.Line, OpConst64, t)
  5266  		v2.AuxInt = c
  5267  		v1.AddArg(v2)
  5268  		v0.AddArg(v1)
  5269  		v3 := b.NewValue0(v.Line, OpConst64, t)
  5270  		v3.AuxInt = c
  5271  		v0.AddArg(v3)
  5272  		v.AddArg(v0)
  5273  		return true
  5274  	}
  5275  	return false
  5276  }
  5277  func rewriteValuegeneric_OpMod64u(v *Value, config *Config) bool {
  5278  	b := v.Block
  5279  	_ = b
  5280  	// match: (Mod64u (Const64 [c]) (Const64 [d]))
  5281  	// cond: d != 0
  5282  	// result: (Const64 [int64(uint64(c) % uint64(d))])
  5283  	for {
  5284  		v_0 := v.Args[0]
  5285  		if v_0.Op != OpConst64 {
  5286  			break
  5287  		}
  5288  		c := v_0.AuxInt
  5289  		v_1 := v.Args[1]
  5290  		if v_1.Op != OpConst64 {
  5291  			break
  5292  		}
  5293  		d := v_1.AuxInt
  5294  		if !(d != 0) {
  5295  			break
  5296  		}
  5297  		v.reset(OpConst64)
  5298  		v.AuxInt = int64(uint64(c) % uint64(d))
  5299  		return true
  5300  	}
  5301  	// match: (Mod64u <t> n (Const64 [c]))
  5302  	// cond: isPowerOfTwo(c)
  5303  	// result: (And64 n (Const64 <t> [c-1]))
  5304  	for {
  5305  		t := v.Type
  5306  		n := v.Args[0]
  5307  		v_1 := v.Args[1]
  5308  		if v_1.Op != OpConst64 {
  5309  			break
  5310  		}
  5311  		c := v_1.AuxInt
  5312  		if !(isPowerOfTwo(c)) {
  5313  			break
  5314  		}
  5315  		v.reset(OpAnd64)
  5316  		v.AddArg(n)
  5317  		v0 := b.NewValue0(v.Line, OpConst64, t)
  5318  		v0.AuxInt = c - 1
  5319  		v.AddArg(v0)
  5320  		return true
  5321  	}
  5322  	// match: (Mod64u <t> x (Const64 [c]))
  5323  	// cond: x.Op != OpConst64 && umagic64ok(c)
  5324  	// result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c])))
  5325  	for {
  5326  		t := v.Type
  5327  		x := v.Args[0]
  5328  		v_1 := v.Args[1]
  5329  		if v_1.Op != OpConst64 {
  5330  			break
  5331  		}
  5332  		c := v_1.AuxInt
  5333  		if !(x.Op != OpConst64 && umagic64ok(c)) {
  5334  			break
  5335  		}
  5336  		v.reset(OpSub64)
  5337  		v.AddArg(x)
  5338  		v0 := b.NewValue0(v.Line, OpMul64, t)
  5339  		v1 := b.NewValue0(v.Line, OpDiv64u, t)
  5340  		v1.AddArg(x)
  5341  		v2 := b.NewValue0(v.Line, OpConst64, t)
  5342  		v2.AuxInt = c
  5343  		v1.AddArg(v2)
  5344  		v0.AddArg(v1)
  5345  		v3 := b.NewValue0(v.Line, OpConst64, t)
  5346  		v3.AuxInt = c
  5347  		v0.AddArg(v3)
  5348  		v.AddArg(v0)
  5349  		return true
  5350  	}
  5351  	return false
  5352  }
  5353  func rewriteValuegeneric_OpMod8(v *Value, config *Config) bool {
  5354  	b := v.Block
  5355  	_ = b
  5356  	// match: (Mod8  (Const8  [c]) (Const8  [d]))
  5357  	// cond: d != 0
  5358  	// result: (Const8  [int64(int8(c % d))])
  5359  	for {
  5360  		v_0 := v.Args[0]
  5361  		if v_0.Op != OpConst8 {
  5362  			break
  5363  		}
  5364  		c := v_0.AuxInt
  5365  		v_1 := v.Args[1]
  5366  		if v_1.Op != OpConst8 {
  5367  			break
  5368  		}
  5369  		d := v_1.AuxInt
  5370  		if !(d != 0) {
  5371  			break
  5372  		}
  5373  		v.reset(OpConst8)
  5374  		v.AuxInt = int64(int8(c % d))
  5375  		return true
  5376  	}
  5377  	return false
  5378  }
  5379  func rewriteValuegeneric_OpMod8u(v *Value, config *Config) bool {
  5380  	b := v.Block
  5381  	_ = b
  5382  	// match: (Mod8u  (Const8 [c])  (Const8  [d]))
  5383  	// cond: d != 0
  5384  	// result: (Const8  [int64(uint8(c) % uint8(d))])
  5385  	for {
  5386  		v_0 := v.Args[0]
  5387  		if v_0.Op != OpConst8 {
  5388  			break
  5389  		}
  5390  		c := v_0.AuxInt
  5391  		v_1 := v.Args[1]
  5392  		if v_1.Op != OpConst8 {
  5393  			break
  5394  		}
  5395  		d := v_1.AuxInt
  5396  		if !(d != 0) {
  5397  			break
  5398  		}
  5399  		v.reset(OpConst8)
  5400  		v.AuxInt = int64(uint8(c) % uint8(d))
  5401  		return true
  5402  	}
  5403  	return false
  5404  }
  5405  func rewriteValuegeneric_OpMul16(v *Value, config *Config) bool {
  5406  	b := v.Block
  5407  	_ = b
  5408  	// match: (Mul16  (Const16 [c])  (Const16 [d]))
  5409  	// cond:
  5410  	// result: (Const16 [int64(int16(c*d))])
  5411  	for {
  5412  		v_0 := v.Args[0]
  5413  		if v_0.Op != OpConst16 {
  5414  			break
  5415  		}
  5416  		c := v_0.AuxInt
  5417  		v_1 := v.Args[1]
  5418  		if v_1.Op != OpConst16 {
  5419  			break
  5420  		}
  5421  		d := v_1.AuxInt
  5422  		v.reset(OpConst16)
  5423  		v.AuxInt = int64(int16(c * d))
  5424  		return true
  5425  	}
  5426  	// match: (Mul16 (Const16 [-1]) x)
  5427  	// cond:
  5428  	// result: (Neg16 x)
  5429  	for {
  5430  		v_0 := v.Args[0]
  5431  		if v_0.Op != OpConst16 {
  5432  			break
  5433  		}
  5434  		if v_0.AuxInt != -1 {
  5435  			break
  5436  		}
  5437  		x := v.Args[1]
  5438  		v.reset(OpNeg16)
  5439  		v.AddArg(x)
  5440  		return true
  5441  	}
  5442  	// match: (Mul16 x (Const16 <t> [c]))
  5443  	// cond: x.Op != OpConst16
  5444  	// result: (Mul16 (Const16 <t> [c]) x)
  5445  	for {
  5446  		x := v.Args[0]
  5447  		v_1 := v.Args[1]
  5448  		if v_1.Op != OpConst16 {
  5449  			break
  5450  		}
  5451  		t := v_1.Type
  5452  		c := v_1.AuxInt
  5453  		if !(x.Op != OpConst16) {
  5454  			break
  5455  		}
  5456  		v.reset(OpMul16)
  5457  		v0 := b.NewValue0(v.Line, OpConst16, t)
  5458  		v0.AuxInt = c
  5459  		v.AddArg(v0)
  5460  		v.AddArg(x)
  5461  		return true
  5462  	}
  5463  	// match: (Mul16 (Const16 [0]) _)
  5464  	// cond:
  5465  	// result: (Const16 [0])
  5466  	for {
  5467  		v_0 := v.Args[0]
  5468  		if v_0.Op != OpConst16 {
  5469  			break
  5470  		}
  5471  		if v_0.AuxInt != 0 {
  5472  			break
  5473  		}
  5474  		v.reset(OpConst16)
  5475  		v.AuxInt = 0
  5476  		return true
  5477  	}
  5478  	return false
  5479  }
  5480  func rewriteValuegeneric_OpMul32(v *Value, config *Config) bool {
  5481  	b := v.Block
  5482  	_ = b
  5483  	// match: (Mul32  (Const32 [c])  (Const32 [d]))
  5484  	// cond:
  5485  	// result: (Const32 [int64(int32(c*d))])
  5486  	for {
  5487  		v_0 := v.Args[0]
  5488  		if v_0.Op != OpConst32 {
  5489  			break
  5490  		}
  5491  		c := v_0.AuxInt
  5492  		v_1 := v.Args[1]
  5493  		if v_1.Op != OpConst32 {
  5494  			break
  5495  		}
  5496  		d := v_1.AuxInt
  5497  		v.reset(OpConst32)
  5498  		v.AuxInt = int64(int32(c * d))
  5499  		return true
  5500  	}
  5501  	// match: (Mul32 (Const32 [-1]) x)
  5502  	// cond:
  5503  	// result: (Neg32 x)
  5504  	for {
  5505  		v_0 := v.Args[0]
  5506  		if v_0.Op != OpConst32 {
  5507  			break
  5508  		}
  5509  		if v_0.AuxInt != -1 {
  5510  			break
  5511  		}
  5512  		x := v.Args[1]
  5513  		v.reset(OpNeg32)
  5514  		v.AddArg(x)
  5515  		return true
  5516  	}
  5517  	// match: (Mul32 x (Const32 <t> [c]))
  5518  	// cond: x.Op != OpConst32
  5519  	// result: (Mul32 (Const32 <t> [c]) x)
  5520  	for {
  5521  		x := v.Args[0]
  5522  		v_1 := v.Args[1]
  5523  		if v_1.Op != OpConst32 {
  5524  			break
  5525  		}
  5526  		t := v_1.Type
  5527  		c := v_1.AuxInt
  5528  		if !(x.Op != OpConst32) {
  5529  			break
  5530  		}
  5531  		v.reset(OpMul32)
  5532  		v0 := b.NewValue0(v.Line, OpConst32, t)
  5533  		v0.AuxInt = c
  5534  		v.AddArg(v0)
  5535  		v.AddArg(x)
  5536  		return true
  5537  	}
  5538  	// match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x))
  5539  	// cond:
  5540  	// result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x))
  5541  	for {
  5542  		v_0 := v.Args[0]
  5543  		if v_0.Op != OpConst32 {
  5544  			break
  5545  		}
  5546  		t := v_0.Type
  5547  		c := v_0.AuxInt
  5548  		v_1 := v.Args[1]
  5549  		if v_1.Op != OpAdd32 {
  5550  			break
  5551  		}
  5552  		if v_1.Type != t {
  5553  			break
  5554  		}
  5555  		v_1_0 := v_1.Args[0]
  5556  		if v_1_0.Op != OpConst32 {
  5557  			break
  5558  		}
  5559  		if v_1_0.Type != t {
  5560  			break
  5561  		}
  5562  		d := v_1_0.AuxInt
  5563  		x := v_1.Args[1]
  5564  		v.reset(OpAdd32)
  5565  		v0 := b.NewValue0(v.Line, OpConst32, t)
  5566  		v0.AuxInt = int64(int32(c * d))
  5567  		v.AddArg(v0)
  5568  		v1 := b.NewValue0(v.Line, OpMul32, t)
  5569  		v2 := b.NewValue0(v.Line, OpConst32, t)
  5570  		v2.AuxInt = c
  5571  		v1.AddArg(v2)
  5572  		v1.AddArg(x)
  5573  		v.AddArg(v1)
  5574  		return true
  5575  	}
  5576  	// match: (Mul32 (Const32 [0]) _)
  5577  	// cond:
  5578  	// result: (Const32 [0])
  5579  	for {
  5580  		v_0 := v.Args[0]
  5581  		if v_0.Op != OpConst32 {
  5582  			break
  5583  		}
  5584  		if v_0.AuxInt != 0 {
  5585  			break
  5586  		}
  5587  		v.reset(OpConst32)
  5588  		v.AuxInt = 0
  5589  		return true
  5590  	}
  5591  	return false
  5592  }
  5593  func rewriteValuegeneric_OpMul32F(v *Value, config *Config) bool {
  5594  	b := v.Block
  5595  	_ = b
  5596  	// match: (Mul32F (Const32F [c]) (Const32F [d]))
  5597  	// cond:
  5598  	// result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))])
  5599  	for {
  5600  		v_0 := v.Args[0]
  5601  		if v_0.Op != OpConst32F {
  5602  			break
  5603  		}
  5604  		c := v_0.AuxInt
  5605  		v_1 := v.Args[1]
  5606  		if v_1.Op != OpConst32F {
  5607  			break
  5608  		}
  5609  		d := v_1.AuxInt
  5610  		v.reset(OpConst32F)
  5611  		v.AuxInt = f2i(float64(i2f32(c) * i2f32(d)))
  5612  		return true
  5613  	}
  5614  	// match: (Mul32F x (Const32F [f2i(1)]))
  5615  	// cond:
  5616  	// result: x
  5617  	for {
  5618  		x := v.Args[0]
  5619  		v_1 := v.Args[1]
  5620  		if v_1.Op != OpConst32F {
  5621  			break
  5622  		}
  5623  		if v_1.AuxInt != f2i(1) {
  5624  			break
  5625  		}
  5626  		v.reset(OpCopy)
  5627  		v.Type = x.Type
  5628  		v.AddArg(x)
  5629  		return true
  5630  	}
  5631  	// match: (Mul32F (Const32F [f2i(1)]) x)
  5632  	// cond:
  5633  	// result: x
  5634  	for {
  5635  		v_0 := v.Args[0]
  5636  		if v_0.Op != OpConst32F {
  5637  			break
  5638  		}
  5639  		if v_0.AuxInt != f2i(1) {
  5640  			break
  5641  		}
  5642  		x := v.Args[1]
  5643  		v.reset(OpCopy)
  5644  		v.Type = x.Type
  5645  		v.AddArg(x)
  5646  		return true
  5647  	}
  5648  	// match: (Mul32F x (Const32F [f2i(-1)]))
  5649  	// cond:
  5650  	// result: (Neg32F x)
  5651  	for {
  5652  		x := v.Args[0]
  5653  		v_1 := v.Args[1]
  5654  		if v_1.Op != OpConst32F {
  5655  			break
  5656  		}
  5657  		if v_1.AuxInt != f2i(-1) {
  5658  			break
  5659  		}
  5660  		v.reset(OpNeg32F)
  5661  		v.AddArg(x)
  5662  		return true
  5663  	}
  5664  	// match: (Mul32F (Const32F [f2i(-1)]) x)
  5665  	// cond:
  5666  	// result: (Neg32F x)
  5667  	for {
  5668  		v_0 := v.Args[0]
  5669  		if v_0.Op != OpConst32F {
  5670  			break
  5671  		}
  5672  		if v_0.AuxInt != f2i(-1) {
  5673  			break
  5674  		}
  5675  		x := v.Args[1]
  5676  		v.reset(OpNeg32F)
  5677  		v.AddArg(x)
  5678  		return true
  5679  	}
  5680  	return false
  5681  }
  5682  func rewriteValuegeneric_OpMul64(v *Value, config *Config) bool {
  5683  	b := v.Block
  5684  	_ = b
  5685  	// match: (Mul64  (Const64 [c])  (Const64 [d]))
  5686  	// cond:
  5687  	// result: (Const64 [c*d])
  5688  	for {
  5689  		v_0 := v.Args[0]
  5690  		if v_0.Op != OpConst64 {
  5691  			break
  5692  		}
  5693  		c := v_0.AuxInt
  5694  		v_1 := v.Args[1]
  5695  		if v_1.Op != OpConst64 {
  5696  			break
  5697  		}
  5698  		d := v_1.AuxInt
  5699  		v.reset(OpConst64)
  5700  		v.AuxInt = c * d
  5701  		return true
  5702  	}
  5703  	// match: (Mul64 (Const64 [-1]) x)
  5704  	// cond:
  5705  	// result: (Neg64 x)
  5706  	for {
  5707  		v_0 := v.Args[0]
  5708  		if v_0.Op != OpConst64 {
  5709  			break
  5710  		}
  5711  		if v_0.AuxInt != -1 {
  5712  			break
  5713  		}
  5714  		x := v.Args[1]
  5715  		v.reset(OpNeg64)
  5716  		v.AddArg(x)
  5717  		return true
  5718  	}
  5719  	// match: (Mul64 x (Const64 <t> [c]))
  5720  	// cond: x.Op != OpConst64
  5721  	// result: (Mul64 (Const64 <t> [c]) x)
  5722  	for {
  5723  		x := v.Args[0]
  5724  		v_1 := v.Args[1]
  5725  		if v_1.Op != OpConst64 {
  5726  			break
  5727  		}
  5728  		t := v_1.Type
  5729  		c := v_1.AuxInt
  5730  		if !(x.Op != OpConst64) {
  5731  			break
  5732  		}
  5733  		v.reset(OpMul64)
  5734  		v0 := b.NewValue0(v.Line, OpConst64, t)
  5735  		v0.AuxInt = c
  5736  		v.AddArg(v0)
  5737  		v.AddArg(x)
  5738  		return true
  5739  	}
  5740  	// match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x))
  5741  	// cond:
  5742  	// result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x))
  5743  	for {
  5744  		v_0 := v.Args[0]
  5745  		if v_0.Op != OpConst64 {
  5746  			break
  5747  		}
  5748  		t := v_0.Type
  5749  		c := v_0.AuxInt
  5750  		v_1 := v.Args[1]
  5751  		if v_1.Op != OpAdd64 {
  5752  			break
  5753  		}
  5754  		if v_1.Type != t {
  5755  			break
  5756  		}
  5757  		v_1_0 := v_1.Args[0]
  5758  		if v_1_0.Op != OpConst64 {
  5759  			break
  5760  		}
  5761  		if v_1_0.Type != t {
  5762  			break
  5763  		}
  5764  		d := v_1_0.AuxInt
  5765  		x := v_1.Args[1]
  5766  		v.reset(OpAdd64)
  5767  		v0 := b.NewValue0(v.Line, OpConst64, t)
  5768  		v0.AuxInt = c * d
  5769  		v.AddArg(v0)
  5770  		v1 := b.NewValue0(v.Line, OpMul64, t)
  5771  		v2 := b.NewValue0(v.Line, OpConst64, t)
  5772  		v2.AuxInt = c
  5773  		v1.AddArg(v2)
  5774  		v1.AddArg(x)
  5775  		v.AddArg(v1)
  5776  		return true
  5777  	}
  5778  	// match: (Mul64 (Const64 [0]) _)
  5779  	// cond:
  5780  	// result: (Const64 [0])
  5781  	for {
  5782  		v_0 := v.Args[0]
  5783  		if v_0.Op != OpConst64 {
  5784  			break
  5785  		}
  5786  		if v_0.AuxInt != 0 {
  5787  			break
  5788  		}
  5789  		v.reset(OpConst64)
  5790  		v.AuxInt = 0
  5791  		return true
  5792  	}
  5793  	return false
  5794  }
  5795  func rewriteValuegeneric_OpMul64F(v *Value, config *Config) bool {
  5796  	b := v.Block
  5797  	_ = b
  5798  	// match: (Mul64F (Const64F [c]) (Const64F [d]))
  5799  	// cond:
  5800  	// result: (Const64F [f2i(i2f(c) * i2f(d))])
  5801  	for {
  5802  		v_0 := v.Args[0]
  5803  		if v_0.Op != OpConst64F {
  5804  			break
  5805  		}
  5806  		c := v_0.AuxInt
  5807  		v_1 := v.Args[1]
  5808  		if v_1.Op != OpConst64F {
  5809  			break
  5810  		}
  5811  		d := v_1.AuxInt
  5812  		v.reset(OpConst64F)
  5813  		v.AuxInt = f2i(i2f(c) * i2f(d))
  5814  		return true
  5815  	}
  5816  	// match: (Mul64F x (Const64F [f2i(1)]))
  5817  	// cond:
  5818  	// result: x
  5819  	for {
  5820  		x := v.Args[0]
  5821  		v_1 := v.Args[1]
  5822  		if v_1.Op != OpConst64F {
  5823  			break
  5824  		}
  5825  		if v_1.AuxInt != f2i(1) {
  5826  			break
  5827  		}
  5828  		v.reset(OpCopy)
  5829  		v.Type = x.Type
  5830  		v.AddArg(x)
  5831  		return true
  5832  	}
  5833  	// match: (Mul64F (Const64F [f2i(1)]) x)
  5834  	// cond:
  5835  	// result: x
  5836  	for {
  5837  		v_0 := v.Args[0]
  5838  		if v_0.Op != OpConst64F {
  5839  			break
  5840  		}
  5841  		if v_0.AuxInt != f2i(1) {
  5842  			break
  5843  		}
  5844  		x := v.Args[1]
  5845  		v.reset(OpCopy)
  5846  		v.Type = x.Type
  5847  		v.AddArg(x)
  5848  		return true
  5849  	}
  5850  	// match: (Mul64F x (Const64F [f2i(-1)]))
  5851  	// cond:
  5852  	// result: (Neg64F x)
  5853  	for {
  5854  		x := v.Args[0]
  5855  		v_1 := v.Args[1]
  5856  		if v_1.Op != OpConst64F {
  5857  			break
  5858  		}
  5859  		if v_1.AuxInt != f2i(-1) {
  5860  			break
  5861  		}
  5862  		v.reset(OpNeg64F)
  5863  		v.AddArg(x)
  5864  		return true
  5865  	}
  5866  	// match: (Mul64F (Const64F [f2i(-1)]) x)
  5867  	// cond:
  5868  	// result: (Neg64F x)
  5869  	for {
  5870  		v_0 := v.Args[0]
  5871  		if v_0.Op != OpConst64F {
  5872  			break
  5873  		}
  5874  		if v_0.AuxInt != f2i(-1) {
  5875  			break
  5876  		}
  5877  		x := v.Args[1]
  5878  		v.reset(OpNeg64F)
  5879  		v.AddArg(x)
  5880  		return true
  5881  	}
  5882  	return false
  5883  }
  5884  func rewriteValuegeneric_OpMul8(v *Value, config *Config) bool {
  5885  	b := v.Block
  5886  	_ = b
  5887  	// match: (Mul8   (Const8 [c])   (Const8 [d]))
  5888  	// cond:
  5889  	// result: (Const8  [int64(int8(c*d))])
  5890  	for {
  5891  		v_0 := v.Args[0]
  5892  		if v_0.Op != OpConst8 {
  5893  			break
  5894  		}
  5895  		c := v_0.AuxInt
  5896  		v_1 := v.Args[1]
  5897  		if v_1.Op != OpConst8 {
  5898  			break
  5899  		}
  5900  		d := v_1.AuxInt
  5901  		v.reset(OpConst8)
  5902  		v.AuxInt = int64(int8(c * d))
  5903  		return true
  5904  	}
  5905  	// match: (Mul8  (Const8  [-1]) x)
  5906  	// cond:
  5907  	// result: (Neg8  x)
  5908  	for {
  5909  		v_0 := v.Args[0]
  5910  		if v_0.Op != OpConst8 {
  5911  			break
  5912  		}
  5913  		if v_0.AuxInt != -1 {
  5914  			break
  5915  		}
  5916  		x := v.Args[1]
  5917  		v.reset(OpNeg8)
  5918  		v.AddArg(x)
  5919  		return true
  5920  	}
  5921  	// match: (Mul8  x (Const8  <t> [c]))
  5922  	// cond: x.Op != OpConst8
  5923  	// result: (Mul8  (Const8  <t> [c]) x)
  5924  	for {
  5925  		x := v.Args[0]
  5926  		v_1 := v.Args[1]
  5927  		if v_1.Op != OpConst8 {
  5928  			break
  5929  		}
  5930  		t := v_1.Type
  5931  		c := v_1.AuxInt
  5932  		if !(x.Op != OpConst8) {
  5933  			break
  5934  		}
  5935  		v.reset(OpMul8)
  5936  		v0 := b.NewValue0(v.Line, OpConst8, t)
  5937  		v0.AuxInt = c
  5938  		v.AddArg(v0)
  5939  		v.AddArg(x)
  5940  		return true
  5941  	}
  5942  	// match: (Mul8  (Const8  [0]) _)
  5943  	// cond:
  5944  	// result: (Const8  [0])
  5945  	for {
  5946  		v_0 := v.Args[0]
  5947  		if v_0.Op != OpConst8 {
  5948  			break
  5949  		}
  5950  		if v_0.AuxInt != 0 {
  5951  			break
  5952  		}
  5953  		v.reset(OpConst8)
  5954  		v.AuxInt = 0
  5955  		return true
  5956  	}
  5957  	return false
  5958  }
  5959  func rewriteValuegeneric_OpNeg16(v *Value, config *Config) bool {
  5960  	b := v.Block
  5961  	_ = b
  5962  	// match: (Neg16 (Sub16 x y))
  5963  	// cond:
  5964  	// result: (Sub16 y x)
  5965  	for {
  5966  		v_0 := v.Args[0]
  5967  		if v_0.Op != OpSub16 {
  5968  			break
  5969  		}
  5970  		x := v_0.Args[0]
  5971  		y := v_0.Args[1]
  5972  		v.reset(OpSub16)
  5973  		v.AddArg(y)
  5974  		v.AddArg(x)
  5975  		return true
  5976  	}
  5977  	return false
  5978  }
  5979  func rewriteValuegeneric_OpNeg32(v *Value, config *Config) bool {
  5980  	b := v.Block
  5981  	_ = b
  5982  	// match: (Neg32 (Sub32 x y))
  5983  	// cond:
  5984  	// result: (Sub32 y x)
  5985  	for {
  5986  		v_0 := v.Args[0]
  5987  		if v_0.Op != OpSub32 {
  5988  			break
  5989  		}
  5990  		x := v_0.Args[0]
  5991  		y := v_0.Args[1]
  5992  		v.reset(OpSub32)
  5993  		v.AddArg(y)
  5994  		v.AddArg(x)
  5995  		return true
  5996  	}
  5997  	return false
  5998  }
  5999  func rewriteValuegeneric_OpNeg64(v *Value, config *Config) bool {
  6000  	b := v.Block
  6001  	_ = b
  6002  	// match: (Neg64 (Sub64 x y))
  6003  	// cond:
  6004  	// result: (Sub64 y x)
  6005  	for {
  6006  		v_0 := v.Args[0]
  6007  		if v_0.Op != OpSub64 {
  6008  			break
  6009  		}
  6010  		x := v_0.Args[0]
  6011  		y := v_0.Args[1]
  6012  		v.reset(OpSub64)
  6013  		v.AddArg(y)
  6014  		v.AddArg(x)
  6015  		return true
  6016  	}
  6017  	return false
  6018  }
  6019  func rewriteValuegeneric_OpNeg8(v *Value, config *Config) bool {
  6020  	b := v.Block
  6021  	_ = b
  6022  	// match: (Neg8  (Sub8  x y))
  6023  	// cond:
  6024  	// result: (Sub8  y x)
  6025  	for {
  6026  		v_0 := v.Args[0]
  6027  		if v_0.Op != OpSub8 {
  6028  			break
  6029  		}
  6030  		x := v_0.Args[0]
  6031  		y := v_0.Args[1]
  6032  		v.reset(OpSub8)
  6033  		v.AddArg(y)
  6034  		v.AddArg(x)
  6035  		return true
  6036  	}
  6037  	return false
  6038  }
  6039  func rewriteValuegeneric_OpNeq16(v *Value, config *Config) bool {
  6040  	b := v.Block
  6041  	_ = b
  6042  	// match: (Neq16 x x)
  6043  	// cond:
  6044  	// result: (ConstBool [0])
  6045  	for {
  6046  		x := v.Args[0]
  6047  		if x != v.Args[1] {
  6048  			break
  6049  		}
  6050  		v.reset(OpConstBool)
  6051  		v.AuxInt = 0
  6052  		return true
  6053  	}
  6054  	// match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x))
  6055  	// cond:
  6056  	// result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x)
  6057  	for {
  6058  		v_0 := v.Args[0]
  6059  		if v_0.Op != OpConst16 {
  6060  			break
  6061  		}
  6062  		t := v_0.Type
  6063  		c := v_0.AuxInt
  6064  		v_1 := v.Args[1]
  6065  		if v_1.Op != OpAdd16 {
  6066  			break
  6067  		}
  6068  		v_1_0 := v_1.Args[0]
  6069  		if v_1_0.Op != OpConst16 {
  6070  			break
  6071  		}
  6072  		if v_1_0.Type != t {
  6073  			break
  6074  		}
  6075  		d := v_1_0.AuxInt
  6076  		x := v_1.Args[1]
  6077  		v.reset(OpNeq16)
  6078  		v0 := b.NewValue0(v.Line, OpConst16, t)
  6079  		v0.AuxInt = int64(int16(c - d))
  6080  		v.AddArg(v0)
  6081  		v.AddArg(x)
  6082  		return true
  6083  	}
  6084  	// match: (Neq16 x (Const16 <t> [c]))
  6085  	// cond: x.Op != OpConst16
  6086  	// result: (Neq16 (Const16 <t> [c]) x)
  6087  	for {
  6088  		x := v.Args[0]
  6089  		v_1 := v.Args[1]
  6090  		if v_1.Op != OpConst16 {
  6091  			break
  6092  		}
  6093  		t := v_1.Type
  6094  		c := v_1.AuxInt
  6095  		if !(x.Op != OpConst16) {
  6096  			break
  6097  		}
  6098  		v.reset(OpNeq16)
  6099  		v0 := b.NewValue0(v.Line, OpConst16, t)
  6100  		v0.AuxInt = c
  6101  		v.AddArg(v0)
  6102  		v.AddArg(x)
  6103  		return true
  6104  	}
  6105  	// match: (Neq16 (Const16 [c]) (Const16 [d]))
  6106  	// cond:
  6107  	// result: (ConstBool [b2i(c != d)])
  6108  	for {
  6109  		v_0 := v.Args[0]
  6110  		if v_0.Op != OpConst16 {
  6111  			break
  6112  		}
  6113  		c := v_0.AuxInt
  6114  		v_1 := v.Args[1]
  6115  		if v_1.Op != OpConst16 {
  6116  			break
  6117  		}
  6118  		d := v_1.AuxInt
  6119  		v.reset(OpConstBool)
  6120  		v.AuxInt = b2i(c != d)
  6121  		return true
  6122  	}
  6123  	return false
  6124  }
  6125  func rewriteValuegeneric_OpNeq32(v *Value, config *Config) bool {
  6126  	b := v.Block
  6127  	_ = b
  6128  	// match: (Neq32 x x)
  6129  	// cond:
  6130  	// result: (ConstBool [0])
  6131  	for {
  6132  		x := v.Args[0]
  6133  		if x != v.Args[1] {
  6134  			break
  6135  		}
  6136  		v.reset(OpConstBool)
  6137  		v.AuxInt = 0
  6138  		return true
  6139  	}
  6140  	// match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x))
  6141  	// cond:
  6142  	// result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x)
  6143  	for {
  6144  		v_0 := v.Args[0]
  6145  		if v_0.Op != OpConst32 {
  6146  			break
  6147  		}
  6148  		t := v_0.Type
  6149  		c := v_0.AuxInt
  6150  		v_1 := v.Args[1]
  6151  		if v_1.Op != OpAdd32 {
  6152  			break
  6153  		}
  6154  		v_1_0 := v_1.Args[0]
  6155  		if v_1_0.Op != OpConst32 {
  6156  			break
  6157  		}
  6158  		if v_1_0.Type != t {
  6159  			break
  6160  		}
  6161  		d := v_1_0.AuxInt
  6162  		x := v_1.Args[1]
  6163  		v.reset(OpNeq32)
  6164  		v0 := b.NewValue0(v.Line, OpConst32, t)
  6165  		v0.AuxInt = int64(int32(c - d))
  6166  		v.AddArg(v0)
  6167  		v.AddArg(x)
  6168  		return true
  6169  	}
  6170  	// match: (Neq32 x (Const32 <t> [c]))
  6171  	// cond: x.Op != OpConst32
  6172  	// result: (Neq32 (Const32 <t> [c]) x)
  6173  	for {
  6174  		x := v.Args[0]
  6175  		v_1 := v.Args[1]
  6176  		if v_1.Op != OpConst32 {
  6177  			break
  6178  		}
  6179  		t := v_1.Type
  6180  		c := v_1.AuxInt
  6181  		if !(x.Op != OpConst32) {
  6182  			break
  6183  		}
  6184  		v.reset(OpNeq32)
  6185  		v0 := b.NewValue0(v.Line, OpConst32, t)
  6186  		v0.AuxInt = c
  6187  		v.AddArg(v0)
  6188  		v.AddArg(x)
  6189  		return true
  6190  	}
  6191  	// match: (Neq32 (Const32 [c]) (Const32 [d]))
  6192  	// cond:
  6193  	// result: (ConstBool [b2i(c != d)])
  6194  	for {
  6195  		v_0 := v.Args[0]
  6196  		if v_0.Op != OpConst32 {
  6197  			break
  6198  		}
  6199  		c := v_0.AuxInt
  6200  		v_1 := v.Args[1]
  6201  		if v_1.Op != OpConst32 {
  6202  			break
  6203  		}
  6204  		d := v_1.AuxInt
  6205  		v.reset(OpConstBool)
  6206  		v.AuxInt = b2i(c != d)
  6207  		return true
  6208  	}
  6209  	return false
  6210  }
  6211  func rewriteValuegeneric_OpNeq64(v *Value, config *Config) bool {
  6212  	b := v.Block
  6213  	_ = b
  6214  	// match: (Neq64 x x)
  6215  	// cond:
  6216  	// result: (ConstBool [0])
  6217  	for {
  6218  		x := v.Args[0]
  6219  		if x != v.Args[1] {
  6220  			break
  6221  		}
  6222  		v.reset(OpConstBool)
  6223  		v.AuxInt = 0
  6224  		return true
  6225  	}
  6226  	// match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x))
  6227  	// cond:
  6228  	// result: (Neq64 (Const64 <t> [c-d]) x)
  6229  	for {
  6230  		v_0 := v.Args[0]
  6231  		if v_0.Op != OpConst64 {
  6232  			break
  6233  		}
  6234  		t := v_0.Type
  6235  		c := v_0.AuxInt
  6236  		v_1 := v.Args[1]
  6237  		if v_1.Op != OpAdd64 {
  6238  			break
  6239  		}
  6240  		v_1_0 := v_1.Args[0]
  6241  		if v_1_0.Op != OpConst64 {
  6242  			break
  6243  		}
  6244  		if v_1_0.Type != t {
  6245  			break
  6246  		}
  6247  		d := v_1_0.AuxInt
  6248  		x := v_1.Args[1]
  6249  		v.reset(OpNeq64)
  6250  		v0 := b.NewValue0(v.Line, OpConst64, t)
  6251  		v0.AuxInt = c - d
  6252  		v.AddArg(v0)
  6253  		v.AddArg(x)
  6254  		return true
  6255  	}
  6256  	// match: (Neq64 x (Const64 <t> [c]))
  6257  	// cond: x.Op != OpConst64
  6258  	// result: (Neq64 (Const64 <t> [c]) x)
  6259  	for {
  6260  		x := v.Args[0]
  6261  		v_1 := v.Args[1]
  6262  		if v_1.Op != OpConst64 {
  6263  			break
  6264  		}
  6265  		t := v_1.Type
  6266  		c := v_1.AuxInt
  6267  		if !(x.Op != OpConst64) {
  6268  			break
  6269  		}
  6270  		v.reset(OpNeq64)
  6271  		v0 := b.NewValue0(v.Line, OpConst64, t)
  6272  		v0.AuxInt = c
  6273  		v.AddArg(v0)
  6274  		v.AddArg(x)
  6275  		return true
  6276  	}
  6277  	// match: (Neq64 (Const64 [c]) (Const64 [d]))
  6278  	// cond:
  6279  	// result: (ConstBool [b2i(c != d)])
  6280  	for {
  6281  		v_0 := v.Args[0]
  6282  		if v_0.Op != OpConst64 {
  6283  			break
  6284  		}
  6285  		c := v_0.AuxInt
  6286  		v_1 := v.Args[1]
  6287  		if v_1.Op != OpConst64 {
  6288  			break
  6289  		}
  6290  		d := v_1.AuxInt
  6291  		v.reset(OpConstBool)
  6292  		v.AuxInt = b2i(c != d)
  6293  		return true
  6294  	}
  6295  	return false
  6296  }
  6297  func rewriteValuegeneric_OpNeq8(v *Value, config *Config) bool {
  6298  	b := v.Block
  6299  	_ = b
  6300  	// match: (Neq8  x x)
  6301  	// cond:
  6302  	// result: (ConstBool [0])
  6303  	for {
  6304  		x := v.Args[0]
  6305  		if x != v.Args[1] {
  6306  			break
  6307  		}
  6308  		v.reset(OpConstBool)
  6309  		v.AuxInt = 0
  6310  		return true
  6311  	}
  6312  	// match: (Neq8  (Const8  <t> [c]) (Add8  (Const8  <t> [d]) x))
  6313  	// cond:
  6314  	// result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x)
  6315  	for {
  6316  		v_0 := v.Args[0]
  6317  		if v_0.Op != OpConst8 {
  6318  			break
  6319  		}
  6320  		t := v_0.Type
  6321  		c := v_0.AuxInt
  6322  		v_1 := v.Args[1]
  6323  		if v_1.Op != OpAdd8 {
  6324  			break
  6325  		}
  6326  		v_1_0 := v_1.Args[0]
  6327  		if v_1_0.Op != OpConst8 {
  6328  			break
  6329  		}
  6330  		if v_1_0.Type != t {
  6331  			break
  6332  		}
  6333  		d := v_1_0.AuxInt
  6334  		x := v_1.Args[1]
  6335  		v.reset(OpNeq8)
  6336  		v0 := b.NewValue0(v.Line, OpConst8, t)
  6337  		v0.AuxInt = int64(int8(c - d))
  6338  		v.AddArg(v0)
  6339  		v.AddArg(x)
  6340  		return true
  6341  	}
  6342  	// match: (Neq8  x (Const8 <t>  [c]))
  6343  	// cond: x.Op != OpConst8
  6344  	// result: (Neq8  (Const8  <t> [c]) x)
  6345  	for {
  6346  		x := v.Args[0]
  6347  		v_1 := v.Args[1]
  6348  		if v_1.Op != OpConst8 {
  6349  			break
  6350  		}
  6351  		t := v_1.Type
  6352  		c := v_1.AuxInt
  6353  		if !(x.Op != OpConst8) {
  6354  			break
  6355  		}
  6356  		v.reset(OpNeq8)
  6357  		v0 := b.NewValue0(v.Line, OpConst8, t)
  6358  		v0.AuxInt = c
  6359  		v.AddArg(v0)
  6360  		v.AddArg(x)
  6361  		return true
  6362  	}
  6363  	// match: (Neq8  (Const8  [c]) (Const8  [d]))
  6364  	// cond:
  6365  	// result: (ConstBool [b2i(c != d)])
  6366  	for {
  6367  		v_0 := v.Args[0]
  6368  		if v_0.Op != OpConst8 {
  6369  			break
  6370  		}
  6371  		c := v_0.AuxInt
  6372  		v_1 := v.Args[1]
  6373  		if v_1.Op != OpConst8 {
  6374  			break
  6375  		}
  6376  		d := v_1.AuxInt
  6377  		v.reset(OpConstBool)
  6378  		v.AuxInt = b2i(c != d)
  6379  		return true
  6380  	}
  6381  	return false
  6382  }
  6383  func rewriteValuegeneric_OpNeqB(v *Value, config *Config) bool {
  6384  	b := v.Block
  6385  	_ = b
  6386  	// match: (NeqB (ConstBool [c]) (ConstBool [d]))
  6387  	// cond:
  6388  	// result: (ConstBool [b2i(c != d)])
  6389  	for {
  6390  		v_0 := v.Args[0]
  6391  		if v_0.Op != OpConstBool {
  6392  			break
  6393  		}
  6394  		c := v_0.AuxInt
  6395  		v_1 := v.Args[1]
  6396  		if v_1.Op != OpConstBool {
  6397  			break
  6398  		}
  6399  		d := v_1.AuxInt
  6400  		v.reset(OpConstBool)
  6401  		v.AuxInt = b2i(c != d)
  6402  		return true
  6403  	}
  6404  	// match: (NeqB (ConstBool [0]) x)
  6405  	// cond:
  6406  	// result: x
  6407  	for {
  6408  		v_0 := v.Args[0]
  6409  		if v_0.Op != OpConstBool {
  6410  			break
  6411  		}
  6412  		if v_0.AuxInt != 0 {
  6413  			break
  6414  		}
  6415  		x := v.Args[1]
  6416  		v.reset(OpCopy)
  6417  		v.Type = x.Type
  6418  		v.AddArg(x)
  6419  		return true
  6420  	}
  6421  	// match: (NeqB (ConstBool [1]) x)
  6422  	// cond:
  6423  	// result: (Not x)
  6424  	for {
  6425  		v_0 := v.Args[0]
  6426  		if v_0.Op != OpConstBool {
  6427  			break
  6428  		}
  6429  		if v_0.AuxInt != 1 {
  6430  			break
  6431  		}
  6432  		x := v.Args[1]
  6433  		v.reset(OpNot)
  6434  		v.AddArg(x)
  6435  		return true
  6436  	}
  6437  	return false
  6438  }
  6439  func rewriteValuegeneric_OpNeqInter(v *Value, config *Config) bool {
  6440  	b := v.Block
  6441  	_ = b
  6442  	// match: (NeqInter x y)
  6443  	// cond:
  6444  	// result: (NeqPtr (ITab x) (ITab y))
  6445  	for {
  6446  		x := v.Args[0]
  6447  		y := v.Args[1]
  6448  		v.reset(OpNeqPtr)
  6449  		v0 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
  6450  		v0.AddArg(x)
  6451  		v.AddArg(v0)
  6452  		v1 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
  6453  		v1.AddArg(y)
  6454  		v.AddArg(v1)
  6455  		return true
  6456  	}
  6457  }
  6458  func rewriteValuegeneric_OpNeqPtr(v *Value, config *Config) bool {
  6459  	b := v.Block
  6460  	_ = b
  6461  	// match: (NeqPtr p (ConstNil))
  6462  	// cond:
  6463  	// result: (IsNonNil p)
  6464  	for {
  6465  		p := v.Args[0]
  6466  		v_1 := v.Args[1]
  6467  		if v_1.Op != OpConstNil {
  6468  			break
  6469  		}
  6470  		v.reset(OpIsNonNil)
  6471  		v.AddArg(p)
  6472  		return true
  6473  	}
  6474  	// match: (NeqPtr (ConstNil) p)
  6475  	// cond:
  6476  	// result: (IsNonNil p)
  6477  	for {
  6478  		v_0 := v.Args[0]
  6479  		if v_0.Op != OpConstNil {
  6480  			break
  6481  		}
  6482  		p := v.Args[1]
  6483  		v.reset(OpIsNonNil)
  6484  		v.AddArg(p)
  6485  		return true
  6486  	}
  6487  	return false
  6488  }
  6489  func rewriteValuegeneric_OpNeqSlice(v *Value, config *Config) bool {
  6490  	b := v.Block
  6491  	_ = b
  6492  	// match: (NeqSlice x y)
  6493  	// cond:
  6494  	// result: (NeqPtr (SlicePtr x) (SlicePtr y))
  6495  	for {
  6496  		x := v.Args[0]
  6497  		y := v.Args[1]
  6498  		v.reset(OpNeqPtr)
  6499  		v0 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
  6500  		v0.AddArg(x)
  6501  		v.AddArg(v0)
  6502  		v1 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
  6503  		v1.AddArg(y)
  6504  		v.AddArg(v1)
  6505  		return true
  6506  	}
  6507  }
  6508  func rewriteValuegeneric_OpNilCheck(v *Value, config *Config) bool {
  6509  	b := v.Block
  6510  	_ = b
  6511  	// match: (NilCheck (GetG mem) mem)
  6512  	// cond:
  6513  	// result: mem
  6514  	for {
  6515  		v_0 := v.Args[0]
  6516  		if v_0.Op != OpGetG {
  6517  			break
  6518  		}
  6519  		mem := v_0.Args[0]
  6520  		if mem != v.Args[1] {
  6521  			break
  6522  		}
  6523  		v.reset(OpCopy)
  6524  		v.Type = mem.Type
  6525  		v.AddArg(mem)
  6526  		return true
  6527  	}
  6528  	// match: (NilCheck (Load (OffPtr [c] (SP)) mem) mem)
  6529  	// cond: mem.Op == OpStaticCall 	&& isSameSym(mem.Aux, "runtime.newobject") 	&& c == config.ctxt.FixedFrameSize() + config.RegSize 	&& warnRule(config.Debug_checknil() && int(v.Line) > 1, v, "removed nil check")
  6530  	// result: (Invalid)
  6531  	for {
  6532  		v_0 := v.Args[0]
  6533  		if v_0.Op != OpLoad {
  6534  			break
  6535  		}
  6536  		v_0_0 := v_0.Args[0]
  6537  		if v_0_0.Op != OpOffPtr {
  6538  			break
  6539  		}
  6540  		c := v_0_0.AuxInt
  6541  		v_0_0_0 := v_0_0.Args[0]
  6542  		if v_0_0_0.Op != OpSP {
  6543  			break
  6544  		}
  6545  		mem := v_0.Args[1]
  6546  		if mem != v.Args[1] {
  6547  			break
  6548  		}
  6549  		if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(config.Debug_checknil() && int(v.Line) > 1, v, "removed nil check")) {
  6550  			break
  6551  		}
  6552  		v.reset(OpInvalid)
  6553  		return true
  6554  	}
  6555  	// match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem)
  6556  	// cond: mem.Op == OpStaticCall 	&& isSameSym(mem.Aux, "runtime.newobject") 	&& c == config.ctxt.FixedFrameSize() + config.RegSize 	&& warnRule(config.Debug_checknil() && int(v.Line) > 1, v, "removed nil check")
  6557  	// result: (Invalid)
  6558  	for {
  6559  		v_0 := v.Args[0]
  6560  		if v_0.Op != OpOffPtr {
  6561  			break
  6562  		}
  6563  		v_0_0 := v_0.Args[0]
  6564  		if v_0_0.Op != OpLoad {
  6565  			break
  6566  		}
  6567  		v_0_0_0 := v_0_0.Args[0]
  6568  		if v_0_0_0.Op != OpOffPtr {
  6569  			break
  6570  		}
  6571  		c := v_0_0_0.AuxInt
  6572  		v_0_0_0_0 := v_0_0_0.Args[0]
  6573  		if v_0_0_0_0.Op != OpSP {
  6574  			break
  6575  		}
  6576  		mem := v_0_0.Args[1]
  6577  		if mem != v.Args[1] {
  6578  			break
  6579  		}
  6580  		if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(config.Debug_checknil() && int(v.Line) > 1, v, "removed nil check")) {
  6581  			break
  6582  		}
  6583  		v.reset(OpInvalid)
  6584  		return true
  6585  	}
  6586  	return false
  6587  }
  6588  func rewriteValuegeneric_OpNot(v *Value, config *Config) bool {
  6589  	b := v.Block
  6590  	_ = b
  6591  	// match: (Not (Eq64 x y))
  6592  	// cond:
  6593  	// result: (Neq64 x y)
  6594  	for {
  6595  		v_0 := v.Args[0]
  6596  		if v_0.Op != OpEq64 {
  6597  			break
  6598  		}
  6599  		x := v_0.Args[0]
  6600  		y := v_0.Args[1]
  6601  		v.reset(OpNeq64)
  6602  		v.AddArg(x)
  6603  		v.AddArg(y)
  6604  		return true
  6605  	}
  6606  	// match: (Not (Eq32 x y))
  6607  	// cond:
  6608  	// result: (Neq32 x y)
  6609  	for {
  6610  		v_0 := v.Args[0]
  6611  		if v_0.Op != OpEq32 {
  6612  			break
  6613  		}
  6614  		x := v_0.Args[0]
  6615  		y := v_0.Args[1]
  6616  		v.reset(OpNeq32)
  6617  		v.AddArg(x)
  6618  		v.AddArg(y)
  6619  		return true
  6620  	}
  6621  	// match: (Not (Eq16 x y))
  6622  	// cond:
  6623  	// result: (Neq16 x y)
  6624  	for {
  6625  		v_0 := v.Args[0]
  6626  		if v_0.Op != OpEq16 {
  6627  			break
  6628  		}
  6629  		x := v_0.Args[0]
  6630  		y := v_0.Args[1]
  6631  		v.reset(OpNeq16)
  6632  		v.AddArg(x)
  6633  		v.AddArg(y)
  6634  		return true
  6635  	}
  6636  	// match: (Not (Eq8  x y))
  6637  	// cond:
  6638  	// result: (Neq8  x y)
  6639  	for {
  6640  		v_0 := v.Args[0]
  6641  		if v_0.Op != OpEq8 {
  6642  			break
  6643  		}
  6644  		x := v_0.Args[0]
  6645  		y := v_0.Args[1]
  6646  		v.reset(OpNeq8)
  6647  		v.AddArg(x)
  6648  		v.AddArg(y)
  6649  		return true
  6650  	}
  6651  	// match: (Not (EqB  x y))
  6652  	// cond:
  6653  	// result: (NeqB  x y)
  6654  	for {
  6655  		v_0 := v.Args[0]
  6656  		if v_0.Op != OpEqB {
  6657  			break
  6658  		}
  6659  		x := v_0.Args[0]
  6660  		y := v_0.Args[1]
  6661  		v.reset(OpNeqB)
  6662  		v.AddArg(x)
  6663  		v.AddArg(y)
  6664  		return true
  6665  	}
  6666  	// match: (Not (Neq64 x y))
  6667  	// cond:
  6668  	// result: (Eq64 x y)
  6669  	for {
  6670  		v_0 := v.Args[0]
  6671  		if v_0.Op != OpNeq64 {
  6672  			break
  6673  		}
  6674  		x := v_0.Args[0]
  6675  		y := v_0.Args[1]
  6676  		v.reset(OpEq64)
  6677  		v.AddArg(x)
  6678  		v.AddArg(y)
  6679  		return true
  6680  	}
  6681  	// match: (Not (Neq32 x y))
  6682  	// cond:
  6683  	// result: (Eq32 x y)
  6684  	for {
  6685  		v_0 := v.Args[0]
  6686  		if v_0.Op != OpNeq32 {
  6687  			break
  6688  		}
  6689  		x := v_0.Args[0]
  6690  		y := v_0.Args[1]
  6691  		v.reset(OpEq32)
  6692  		v.AddArg(x)
  6693  		v.AddArg(y)
  6694  		return true
  6695  	}
  6696  	// match: (Not (Neq16 x y))
  6697  	// cond:
  6698  	// result: (Eq16 x y)
  6699  	for {
  6700  		v_0 := v.Args[0]
  6701  		if v_0.Op != OpNeq16 {
  6702  			break
  6703  		}
  6704  		x := v_0.Args[0]
  6705  		y := v_0.Args[1]
  6706  		v.reset(OpEq16)
  6707  		v.AddArg(x)
  6708  		v.AddArg(y)
  6709  		return true
  6710  	}
  6711  	// match: (Not (Neq8  x y))
  6712  	// cond:
  6713  	// result: (Eq8  x y)
  6714  	for {
  6715  		v_0 := v.Args[0]
  6716  		if v_0.Op != OpNeq8 {
  6717  			break
  6718  		}
  6719  		x := v_0.Args[0]
  6720  		y := v_0.Args[1]
  6721  		v.reset(OpEq8)
  6722  		v.AddArg(x)
  6723  		v.AddArg(y)
  6724  		return true
  6725  	}
  6726  	// match: (Not (NeqB  x y))
  6727  	// cond:
  6728  	// result: (EqB  x y)
  6729  	for {
  6730  		v_0 := v.Args[0]
  6731  		if v_0.Op != OpNeqB {
  6732  			break
  6733  		}
  6734  		x := v_0.Args[0]
  6735  		y := v_0.Args[1]
  6736  		v.reset(OpEqB)
  6737  		v.AddArg(x)
  6738  		v.AddArg(y)
  6739  		return true
  6740  	}
  6741  	// match: (Not (Greater64 x y))
  6742  	// cond:
  6743  	// result: (Leq64 x y)
  6744  	for {
  6745  		v_0 := v.Args[0]
  6746  		if v_0.Op != OpGreater64 {
  6747  			break
  6748  		}
  6749  		x := v_0.Args[0]
  6750  		y := v_0.Args[1]
  6751  		v.reset(OpLeq64)
  6752  		v.AddArg(x)
  6753  		v.AddArg(y)
  6754  		return true
  6755  	}
  6756  	// match: (Not (Greater32 x y))
  6757  	// cond:
  6758  	// result: (Leq32 x y)
  6759  	for {
  6760  		v_0 := v.Args[0]
  6761  		if v_0.Op != OpGreater32 {
  6762  			break
  6763  		}
  6764  		x := v_0.Args[0]
  6765  		y := v_0.Args[1]
  6766  		v.reset(OpLeq32)
  6767  		v.AddArg(x)
  6768  		v.AddArg(y)
  6769  		return true
  6770  	}
  6771  	// match: (Not (Greater16 x y))
  6772  	// cond:
  6773  	// result: (Leq16 x y)
  6774  	for {
  6775  		v_0 := v.Args[0]
  6776  		if v_0.Op != OpGreater16 {
  6777  			break
  6778  		}
  6779  		x := v_0.Args[0]
  6780  		y := v_0.Args[1]
  6781  		v.reset(OpLeq16)
  6782  		v.AddArg(x)
  6783  		v.AddArg(y)
  6784  		return true
  6785  	}
  6786  	// match: (Not (Greater8  x y))
  6787  	// cond:
  6788  	// result: (Leq8  x y)
  6789  	for {
  6790  		v_0 := v.Args[0]
  6791  		if v_0.Op != OpGreater8 {
  6792  			break
  6793  		}
  6794  		x := v_0.Args[0]
  6795  		y := v_0.Args[1]
  6796  		v.reset(OpLeq8)
  6797  		v.AddArg(x)
  6798  		v.AddArg(y)
  6799  		return true
  6800  	}
  6801  	// match: (Not (Greater64U x y))
  6802  	// cond:
  6803  	// result: (Leq64U x y)
  6804  	for {
  6805  		v_0 := v.Args[0]
  6806  		if v_0.Op != OpGreater64U {
  6807  			break
  6808  		}
  6809  		x := v_0.Args[0]
  6810  		y := v_0.Args[1]
  6811  		v.reset(OpLeq64U)
  6812  		v.AddArg(x)
  6813  		v.AddArg(y)
  6814  		return true
  6815  	}
  6816  	// match: (Not (Greater32U x y))
  6817  	// cond:
  6818  	// result: (Leq32U x y)
  6819  	for {
  6820  		v_0 := v.Args[0]
  6821  		if v_0.Op != OpGreater32U {
  6822  			break
  6823  		}
  6824  		x := v_0.Args[0]
  6825  		y := v_0.Args[1]
  6826  		v.reset(OpLeq32U)
  6827  		v.AddArg(x)
  6828  		v.AddArg(y)
  6829  		return true
  6830  	}
  6831  	// match: (Not (Greater16U x y))
  6832  	// cond:
  6833  	// result: (Leq16U x y)
  6834  	for {
  6835  		v_0 := v.Args[0]
  6836  		if v_0.Op != OpGreater16U {
  6837  			break
  6838  		}
  6839  		x := v_0.Args[0]
  6840  		y := v_0.Args[1]
  6841  		v.reset(OpLeq16U)
  6842  		v.AddArg(x)
  6843  		v.AddArg(y)
  6844  		return true
  6845  	}
  6846  	// match: (Not (Greater8U  x y))
  6847  	// cond:
  6848  	// result: (Leq8U  x y)
  6849  	for {
  6850  		v_0 := v.Args[0]
  6851  		if v_0.Op != OpGreater8U {
  6852  			break
  6853  		}
  6854  		x := v_0.Args[0]
  6855  		y := v_0.Args[1]
  6856  		v.reset(OpLeq8U)
  6857  		v.AddArg(x)
  6858  		v.AddArg(y)
  6859  		return true
  6860  	}
  6861  	// match: (Not (Geq64 x y))
  6862  	// cond:
  6863  	// result: (Less64 x y)
  6864  	for {
  6865  		v_0 := v.Args[0]
  6866  		if v_0.Op != OpGeq64 {
  6867  			break
  6868  		}
  6869  		x := v_0.Args[0]
  6870  		y := v_0.Args[1]
  6871  		v.reset(OpLess64)
  6872  		v.AddArg(x)
  6873  		v.AddArg(y)
  6874  		return true
  6875  	}
  6876  	// match: (Not (Geq32 x y))
  6877  	// cond:
  6878  	// result: (Less32 x y)
  6879  	for {
  6880  		v_0 := v.Args[0]
  6881  		if v_0.Op != OpGeq32 {
  6882  			break
  6883  		}
  6884  		x := v_0.Args[0]
  6885  		y := v_0.Args[1]
  6886  		v.reset(OpLess32)
  6887  		v.AddArg(x)
  6888  		v.AddArg(y)
  6889  		return true
  6890  	}
  6891  	// match: (Not (Geq16 x y))
  6892  	// cond:
  6893  	// result: (Less16 x y)
  6894  	for {
  6895  		v_0 := v.Args[0]
  6896  		if v_0.Op != OpGeq16 {
  6897  			break
  6898  		}
  6899  		x := v_0.Args[0]
  6900  		y := v_0.Args[1]
  6901  		v.reset(OpLess16)
  6902  		v.AddArg(x)
  6903  		v.AddArg(y)
  6904  		return true
  6905  	}
  6906  	// match: (Not (Geq8  x y))
  6907  	// cond:
  6908  	// result: (Less8  x y)
  6909  	for {
  6910  		v_0 := v.Args[0]
  6911  		if v_0.Op != OpGeq8 {
  6912  			break
  6913  		}
  6914  		x := v_0.Args[0]
  6915  		y := v_0.Args[1]
  6916  		v.reset(OpLess8)
  6917  		v.AddArg(x)
  6918  		v.AddArg(y)
  6919  		return true
  6920  	}
  6921  	// match: (Not (Geq64U x y))
  6922  	// cond:
  6923  	// result: (Less64U x y)
  6924  	for {
  6925  		v_0 := v.Args[0]
  6926  		if v_0.Op != OpGeq64U {
  6927  			break
  6928  		}
  6929  		x := v_0.Args[0]
  6930  		y := v_0.Args[1]
  6931  		v.reset(OpLess64U)
  6932  		v.AddArg(x)
  6933  		v.AddArg(y)
  6934  		return true
  6935  	}
  6936  	// match: (Not (Geq32U x y))
  6937  	// cond:
  6938  	// result: (Less32U x y)
  6939  	for {
  6940  		v_0 := v.Args[0]
  6941  		if v_0.Op != OpGeq32U {
  6942  			break
  6943  		}
  6944  		x := v_0.Args[0]
  6945  		y := v_0.Args[1]
  6946  		v.reset(OpLess32U)
  6947  		v.AddArg(x)
  6948  		v.AddArg(y)
  6949  		return true
  6950  	}
  6951  	// match: (Not (Geq16U x y))
  6952  	// cond:
  6953  	// result: (Less16U x y)
  6954  	for {
  6955  		v_0 := v.Args[0]
  6956  		if v_0.Op != OpGeq16U {
  6957  			break
  6958  		}
  6959  		x := v_0.Args[0]
  6960  		y := v_0.Args[1]
  6961  		v.reset(OpLess16U)
  6962  		v.AddArg(x)
  6963  		v.AddArg(y)
  6964  		return true
  6965  	}
  6966  	// match: (Not (Geq8U  x y))
  6967  	// cond:
  6968  	// result: (Less8U  x y)
  6969  	for {
  6970  		v_0 := v.Args[0]
  6971  		if v_0.Op != OpGeq8U {
  6972  			break
  6973  		}
  6974  		x := v_0.Args[0]
  6975  		y := v_0.Args[1]
  6976  		v.reset(OpLess8U)
  6977  		v.AddArg(x)
  6978  		v.AddArg(y)
  6979  		return true
  6980  	}
  6981  	// match: (Not (Less64 x y))
  6982  	// cond:
  6983  	// result: (Geq64 x y)
  6984  	for {
  6985  		v_0 := v.Args[0]
  6986  		if v_0.Op != OpLess64 {
  6987  			break
  6988  		}
  6989  		x := v_0.Args[0]
  6990  		y := v_0.Args[1]
  6991  		v.reset(OpGeq64)
  6992  		v.AddArg(x)
  6993  		v.AddArg(y)
  6994  		return true
  6995  	}
  6996  	// match: (Not (Less32 x y))
  6997  	// cond:
  6998  	// result: (Geq32 x y)
  6999  	for {
  7000  		v_0 := v.Args[0]
  7001  		if v_0.Op != OpLess32 {
  7002  			break
  7003  		}
  7004  		x := v_0.Args[0]
  7005  		y := v_0.Args[1]
  7006  		v.reset(OpGeq32)
  7007  		v.AddArg(x)
  7008  		v.AddArg(y)
  7009  		return true
  7010  	}
  7011  	// match: (Not (Less16 x y))
  7012  	// cond:
  7013  	// result: (Geq16 x y)
  7014  	for {
  7015  		v_0 := v.Args[0]
  7016  		if v_0.Op != OpLess16 {
  7017  			break
  7018  		}
  7019  		x := v_0.Args[0]
  7020  		y := v_0.Args[1]
  7021  		v.reset(OpGeq16)
  7022  		v.AddArg(x)
  7023  		v.AddArg(y)
  7024  		return true
  7025  	}
  7026  	// match: (Not (Less8  x y))
  7027  	// cond:
  7028  	// result: (Geq8  x y)
  7029  	for {
  7030  		v_0 := v.Args[0]
  7031  		if v_0.Op != OpLess8 {
  7032  			break
  7033  		}
  7034  		x := v_0.Args[0]
  7035  		y := v_0.Args[1]
  7036  		v.reset(OpGeq8)
  7037  		v.AddArg(x)
  7038  		v.AddArg(y)
  7039  		return true
  7040  	}
  7041  	// match: (Not (Less64U x y))
  7042  	// cond:
  7043  	// result: (Geq64U x y)
  7044  	for {
  7045  		v_0 := v.Args[0]
  7046  		if v_0.Op != OpLess64U {
  7047  			break
  7048  		}
  7049  		x := v_0.Args[0]
  7050  		y := v_0.Args[1]
  7051  		v.reset(OpGeq64U)
  7052  		v.AddArg(x)
  7053  		v.AddArg(y)
  7054  		return true
  7055  	}
  7056  	// match: (Not (Less32U x y))
  7057  	// cond:
  7058  	// result: (Geq32U x y)
  7059  	for {
  7060  		v_0 := v.Args[0]
  7061  		if v_0.Op != OpLess32U {
  7062  			break
  7063  		}
  7064  		x := v_0.Args[0]
  7065  		y := v_0.Args[1]
  7066  		v.reset(OpGeq32U)
  7067  		v.AddArg(x)
  7068  		v.AddArg(y)
  7069  		return true
  7070  	}
  7071  	// match: (Not (Less16U x y))
  7072  	// cond:
  7073  	// result: (Geq16U x y)
  7074  	for {
  7075  		v_0 := v.Args[0]
  7076  		if v_0.Op != OpLess16U {
  7077  			break
  7078  		}
  7079  		x := v_0.Args[0]
  7080  		y := v_0.Args[1]
  7081  		v.reset(OpGeq16U)
  7082  		v.AddArg(x)
  7083  		v.AddArg(y)
  7084  		return true
  7085  	}
  7086  	// match: (Not (Less8U  x y))
  7087  	// cond:
  7088  	// result: (Geq8U  x y)
  7089  	for {
  7090  		v_0 := v.Args[0]
  7091  		if v_0.Op != OpLess8U {
  7092  			break
  7093  		}
  7094  		x := v_0.Args[0]
  7095  		y := v_0.Args[1]
  7096  		v.reset(OpGeq8U)
  7097  		v.AddArg(x)
  7098  		v.AddArg(y)
  7099  		return true
  7100  	}
  7101  	// match: (Not (Leq64 x y))
  7102  	// cond:
  7103  	// result: (Greater64 x y)
  7104  	for {
  7105  		v_0 := v.Args[0]
  7106  		if v_0.Op != OpLeq64 {
  7107  			break
  7108  		}
  7109  		x := v_0.Args[0]
  7110  		y := v_0.Args[1]
  7111  		v.reset(OpGreater64)
  7112  		v.AddArg(x)
  7113  		v.AddArg(y)
  7114  		return true
  7115  	}
  7116  	// match: (Not (Leq32 x y))
  7117  	// cond:
  7118  	// result: (Greater32 x y)
  7119  	for {
  7120  		v_0 := v.Args[0]
  7121  		if v_0.Op != OpLeq32 {
  7122  			break
  7123  		}
  7124  		x := v_0.Args[0]
  7125  		y := v_0.Args[1]
  7126  		v.reset(OpGreater32)
  7127  		v.AddArg(x)
  7128  		v.AddArg(y)
  7129  		return true
  7130  	}
  7131  	// match: (Not (Leq16 x y))
  7132  	// cond:
  7133  	// result: (Greater16 x y)
  7134  	for {
  7135  		v_0 := v.Args[0]
  7136  		if v_0.Op != OpLeq16 {
  7137  			break
  7138  		}
  7139  		x := v_0.Args[0]
  7140  		y := v_0.Args[1]
  7141  		v.reset(OpGreater16)
  7142  		v.AddArg(x)
  7143  		v.AddArg(y)
  7144  		return true
  7145  	}
  7146  	// match: (Not (Leq8  x y))
  7147  	// cond:
  7148  	// result: (Greater8 x y)
  7149  	for {
  7150  		v_0 := v.Args[0]
  7151  		if v_0.Op != OpLeq8 {
  7152  			break
  7153  		}
  7154  		x := v_0.Args[0]
  7155  		y := v_0.Args[1]
  7156  		v.reset(OpGreater8)
  7157  		v.AddArg(x)
  7158  		v.AddArg(y)
  7159  		return true
  7160  	}
  7161  	// match: (Not (Leq64U x y))
  7162  	// cond:
  7163  	// result: (Greater64U x y)
  7164  	for {
  7165  		v_0 := v.Args[0]
  7166  		if v_0.Op != OpLeq64U {
  7167  			break
  7168  		}
  7169  		x := v_0.Args[0]
  7170  		y := v_0.Args[1]
  7171  		v.reset(OpGreater64U)
  7172  		v.AddArg(x)
  7173  		v.AddArg(y)
  7174  		return true
  7175  	}
  7176  	// match: (Not (Leq32U x y))
  7177  	// cond:
  7178  	// result: (Greater32U x y)
  7179  	for {
  7180  		v_0 := v.Args[0]
  7181  		if v_0.Op != OpLeq32U {
  7182  			break
  7183  		}
  7184  		x := v_0.Args[0]
  7185  		y := v_0.Args[1]
  7186  		v.reset(OpGreater32U)
  7187  		v.AddArg(x)
  7188  		v.AddArg(y)
  7189  		return true
  7190  	}
  7191  	// match: (Not (Leq16U x y))
  7192  	// cond:
  7193  	// result: (Greater16U x y)
  7194  	for {
  7195  		v_0 := v.Args[0]
  7196  		if v_0.Op != OpLeq16U {
  7197  			break
  7198  		}
  7199  		x := v_0.Args[0]
  7200  		y := v_0.Args[1]
  7201  		v.reset(OpGreater16U)
  7202  		v.AddArg(x)
  7203  		v.AddArg(y)
  7204  		return true
  7205  	}
  7206  	// match: (Not (Leq8U  x y))
  7207  	// cond:
  7208  	// result: (Greater8U  x y)
  7209  	for {
  7210  		v_0 := v.Args[0]
  7211  		if v_0.Op != OpLeq8U {
  7212  			break
  7213  		}
  7214  		x := v_0.Args[0]
  7215  		y := v_0.Args[1]
  7216  		v.reset(OpGreater8U)
  7217  		v.AddArg(x)
  7218  		v.AddArg(y)
  7219  		return true
  7220  	}
  7221  	return false
  7222  }
  7223  func rewriteValuegeneric_OpOffPtr(v *Value, config *Config) bool {
  7224  	b := v.Block
  7225  	_ = b
  7226  	// match: (OffPtr (OffPtr p [b]) [a])
  7227  	// cond:
  7228  	// result: (OffPtr p [a+b])
  7229  	for {
  7230  		a := v.AuxInt
  7231  		v_0 := v.Args[0]
  7232  		if v_0.Op != OpOffPtr {
  7233  			break
  7234  		}
  7235  		b := v_0.AuxInt
  7236  		p := v_0.Args[0]
  7237  		v.reset(OpOffPtr)
  7238  		v.AuxInt = a + b
  7239  		v.AddArg(p)
  7240  		return true
  7241  	}
  7242  	// match: (OffPtr p [0])
  7243  	// cond: v.Type.Compare(p.Type) == CMPeq
  7244  	// result: p
  7245  	for {
  7246  		if v.AuxInt != 0 {
  7247  			break
  7248  		}
  7249  		p := v.Args[0]
  7250  		if !(v.Type.Compare(p.Type) == CMPeq) {
  7251  			break
  7252  		}
  7253  		v.reset(OpCopy)
  7254  		v.Type = p.Type
  7255  		v.AddArg(p)
  7256  		return true
  7257  	}
  7258  	return false
  7259  }
  7260  func rewriteValuegeneric_OpOr16(v *Value, config *Config) bool {
  7261  	b := v.Block
  7262  	_ = b
  7263  	// match: (Or16 x (Const16 <t> [c]))
  7264  	// cond: x.Op != OpConst16
  7265  	// result: (Or16 (Const16 <t> [c]) x)
  7266  	for {
  7267  		x := v.Args[0]
  7268  		v_1 := v.Args[1]
  7269  		if v_1.Op != OpConst16 {
  7270  			break
  7271  		}
  7272  		t := v_1.Type
  7273  		c := v_1.AuxInt
  7274  		if !(x.Op != OpConst16) {
  7275  			break
  7276  		}
  7277  		v.reset(OpOr16)
  7278  		v0 := b.NewValue0(v.Line, OpConst16, t)
  7279  		v0.AuxInt = c
  7280  		v.AddArg(v0)
  7281  		v.AddArg(x)
  7282  		return true
  7283  	}
  7284  	// match: (Or16 x x)
  7285  	// cond:
  7286  	// result: x
  7287  	for {
  7288  		x := v.Args[0]
  7289  		if x != v.Args[1] {
  7290  			break
  7291  		}
  7292  		v.reset(OpCopy)
  7293  		v.Type = x.Type
  7294  		v.AddArg(x)
  7295  		return true
  7296  	}
  7297  	// match: (Or16 (Const16 [0]) x)
  7298  	// cond:
  7299  	// result: x
  7300  	for {
  7301  		v_0 := v.Args[0]
  7302  		if v_0.Op != OpConst16 {
  7303  			break
  7304  		}
  7305  		if v_0.AuxInt != 0 {
  7306  			break
  7307  		}
  7308  		x := v.Args[1]
  7309  		v.reset(OpCopy)
  7310  		v.Type = x.Type
  7311  		v.AddArg(x)
  7312  		return true
  7313  	}
  7314  	// match: (Or16 (Const16 [-1]) _)
  7315  	// cond:
  7316  	// result: (Const16 [-1])
  7317  	for {
  7318  		v_0 := v.Args[0]
  7319  		if v_0.Op != OpConst16 {
  7320  			break
  7321  		}
  7322  		if v_0.AuxInt != -1 {
  7323  			break
  7324  		}
  7325  		v.reset(OpConst16)
  7326  		v.AuxInt = -1
  7327  		return true
  7328  	}
  7329  	// match: (Or16 x (Or16 x y))
  7330  	// cond:
  7331  	// result: (Or16 x y)
  7332  	for {
  7333  		x := v.Args[0]
  7334  		v_1 := v.Args[1]
  7335  		if v_1.Op != OpOr16 {
  7336  			break
  7337  		}
  7338  		if x != v_1.Args[0] {
  7339  			break
  7340  		}
  7341  		y := v_1.Args[1]
  7342  		v.reset(OpOr16)
  7343  		v.AddArg(x)
  7344  		v.AddArg(y)
  7345  		return true
  7346  	}
  7347  	// match: (Or16 x (Or16 y x))
  7348  	// cond:
  7349  	// result: (Or16 x y)
  7350  	for {
  7351  		x := v.Args[0]
  7352  		v_1 := v.Args[1]
  7353  		if v_1.Op != OpOr16 {
  7354  			break
  7355  		}
  7356  		y := v_1.Args[0]
  7357  		if x != v_1.Args[1] {
  7358  			break
  7359  		}
  7360  		v.reset(OpOr16)
  7361  		v.AddArg(x)
  7362  		v.AddArg(y)
  7363  		return true
  7364  	}
  7365  	// match: (Or16 (Or16 x y) x)
  7366  	// cond:
  7367  	// result: (Or16 x y)
  7368  	for {
  7369  		v_0 := v.Args[0]
  7370  		if v_0.Op != OpOr16 {
  7371  			break
  7372  		}
  7373  		x := v_0.Args[0]
  7374  		y := v_0.Args[1]
  7375  		if x != v.Args[1] {
  7376  			break
  7377  		}
  7378  		v.reset(OpOr16)
  7379  		v.AddArg(x)
  7380  		v.AddArg(y)
  7381  		return true
  7382  	}
  7383  	// match: (Or16 (Or16 x y) y)
  7384  	// cond:
  7385  	// result: (Or16 x y)
  7386  	for {
  7387  		v_0 := v.Args[0]
  7388  		if v_0.Op != OpOr16 {
  7389  			break
  7390  		}
  7391  		x := v_0.Args[0]
  7392  		y := v_0.Args[1]
  7393  		if y != v.Args[1] {
  7394  			break
  7395  		}
  7396  		v.reset(OpOr16)
  7397  		v.AddArg(x)
  7398  		v.AddArg(y)
  7399  		return true
  7400  	}
  7401  	return false
  7402  }
  7403  func rewriteValuegeneric_OpOr32(v *Value, config *Config) bool {
  7404  	b := v.Block
  7405  	_ = b
  7406  	// match: (Or32 x (Const32 <t> [c]))
  7407  	// cond: x.Op != OpConst32
  7408  	// result: (Or32 (Const32 <t> [c]) x)
  7409  	for {
  7410  		x := v.Args[0]
  7411  		v_1 := v.Args[1]
  7412  		if v_1.Op != OpConst32 {
  7413  			break
  7414  		}
  7415  		t := v_1.Type
  7416  		c := v_1.AuxInt
  7417  		if !(x.Op != OpConst32) {
  7418  			break
  7419  		}
  7420  		v.reset(OpOr32)
  7421  		v0 := b.NewValue0(v.Line, OpConst32, t)
  7422  		v0.AuxInt = c
  7423  		v.AddArg(v0)
  7424  		v.AddArg(x)
  7425  		return true
  7426  	}
  7427  	// match: (Or32 x x)
  7428  	// cond:
  7429  	// result: x
  7430  	for {
  7431  		x := v.Args[0]
  7432  		if x != v.Args[1] {
  7433  			break
  7434  		}
  7435  		v.reset(OpCopy)
  7436  		v.Type = x.Type
  7437  		v.AddArg(x)
  7438  		return true
  7439  	}
  7440  	// match: (Or32 (Const32 [0]) x)
  7441  	// cond:
  7442  	// result: x
  7443  	for {
  7444  		v_0 := v.Args[0]
  7445  		if v_0.Op != OpConst32 {
  7446  			break
  7447  		}
  7448  		if v_0.AuxInt != 0 {
  7449  			break
  7450  		}
  7451  		x := v.Args[1]
  7452  		v.reset(OpCopy)
  7453  		v.Type = x.Type
  7454  		v.AddArg(x)
  7455  		return true
  7456  	}
  7457  	// match: (Or32 (Const32 [-1]) _)
  7458  	// cond:
  7459  	// result: (Const32 [-1])
  7460  	for {
  7461  		v_0 := v.Args[0]
  7462  		if v_0.Op != OpConst32 {
  7463  			break
  7464  		}
  7465  		if v_0.AuxInt != -1 {
  7466  			break
  7467  		}
  7468  		v.reset(OpConst32)
  7469  		v.AuxInt = -1
  7470  		return true
  7471  	}
  7472  	// match: (Or32 x (Or32 x y))
  7473  	// cond:
  7474  	// result: (Or32 x y)
  7475  	for {
  7476  		x := v.Args[0]
  7477  		v_1 := v.Args[1]
  7478  		if v_1.Op != OpOr32 {
  7479  			break
  7480  		}
  7481  		if x != v_1.Args[0] {
  7482  			break
  7483  		}
  7484  		y := v_1.Args[1]
  7485  		v.reset(OpOr32)
  7486  		v.AddArg(x)
  7487  		v.AddArg(y)
  7488  		return true
  7489  	}
  7490  	// match: (Or32 x (Or32 y x))
  7491  	// cond:
  7492  	// result: (Or32 x y)
  7493  	for {
  7494  		x := v.Args[0]
  7495  		v_1 := v.Args[1]
  7496  		if v_1.Op != OpOr32 {
  7497  			break
  7498  		}
  7499  		y := v_1.Args[0]
  7500  		if x != v_1.Args[1] {
  7501  			break
  7502  		}
  7503  		v.reset(OpOr32)
  7504  		v.AddArg(x)
  7505  		v.AddArg(y)
  7506  		return true
  7507  	}
  7508  	// match: (Or32 (Or32 x y) x)
  7509  	// cond:
  7510  	// result: (Or32 x y)
  7511  	for {
  7512  		v_0 := v.Args[0]
  7513  		if v_0.Op != OpOr32 {
  7514  			break
  7515  		}
  7516  		x := v_0.Args[0]
  7517  		y := v_0.Args[1]
  7518  		if x != v.Args[1] {
  7519  			break
  7520  		}
  7521  		v.reset(OpOr32)
  7522  		v.AddArg(x)
  7523  		v.AddArg(y)
  7524  		return true
  7525  	}
  7526  	// match: (Or32 (Or32 x y) y)
  7527  	// cond:
  7528  	// result: (Or32 x y)
  7529  	for {
  7530  		v_0 := v.Args[0]
  7531  		if v_0.Op != OpOr32 {
  7532  			break
  7533  		}
  7534  		x := v_0.Args[0]
  7535  		y := v_0.Args[1]
  7536  		if y != v.Args[1] {
  7537  			break
  7538  		}
  7539  		v.reset(OpOr32)
  7540  		v.AddArg(x)
  7541  		v.AddArg(y)
  7542  		return true
  7543  	}
  7544  	return false
  7545  }
  7546  func rewriteValuegeneric_OpOr64(v *Value, config *Config) bool {
  7547  	b := v.Block
  7548  	_ = b
  7549  	// match: (Or64 x (Const64 <t> [c]))
  7550  	// cond: x.Op != OpConst64
  7551  	// result: (Or64 (Const64 <t> [c]) x)
  7552  	for {
  7553  		x := v.Args[0]
  7554  		v_1 := v.Args[1]
  7555  		if v_1.Op != OpConst64 {
  7556  			break
  7557  		}
  7558  		t := v_1.Type
  7559  		c := v_1.AuxInt
  7560  		if !(x.Op != OpConst64) {
  7561  			break
  7562  		}
  7563  		v.reset(OpOr64)
  7564  		v0 := b.NewValue0(v.Line, OpConst64, t)
  7565  		v0.AuxInt = c
  7566  		v.AddArg(v0)
  7567  		v.AddArg(x)
  7568  		return true
  7569  	}
  7570  	// match: (Or64 x x)
  7571  	// cond:
  7572  	// result: x
  7573  	for {
  7574  		x := v.Args[0]
  7575  		if x != v.Args[1] {
  7576  			break
  7577  		}
  7578  		v.reset(OpCopy)
  7579  		v.Type = x.Type
  7580  		v.AddArg(x)
  7581  		return true
  7582  	}
  7583  	// match: (Or64 (Const64 [0]) x)
  7584  	// cond:
  7585  	// result: x
  7586  	for {
  7587  		v_0 := v.Args[0]
  7588  		if v_0.Op != OpConst64 {
  7589  			break
  7590  		}
  7591  		if v_0.AuxInt != 0 {
  7592  			break
  7593  		}
  7594  		x := v.Args[1]
  7595  		v.reset(OpCopy)
  7596  		v.Type = x.Type
  7597  		v.AddArg(x)
  7598  		return true
  7599  	}
  7600  	// match: (Or64 (Const64 [-1]) _)
  7601  	// cond:
  7602  	// result: (Const64 [-1])
  7603  	for {
  7604  		v_0 := v.Args[0]
  7605  		if v_0.Op != OpConst64 {
  7606  			break
  7607  		}
  7608  		if v_0.AuxInt != -1 {
  7609  			break
  7610  		}
  7611  		v.reset(OpConst64)
  7612  		v.AuxInt = -1
  7613  		return true
  7614  	}
  7615  	// match: (Or64 x (Or64 x y))
  7616  	// cond:
  7617  	// result: (Or64 x y)
  7618  	for {
  7619  		x := v.Args[0]
  7620  		v_1 := v.Args[1]
  7621  		if v_1.Op != OpOr64 {
  7622  			break
  7623  		}
  7624  		if x != v_1.Args[0] {
  7625  			break
  7626  		}
  7627  		y := v_1.Args[1]
  7628  		v.reset(OpOr64)
  7629  		v.AddArg(x)
  7630  		v.AddArg(y)
  7631  		return true
  7632  	}
  7633  	// match: (Or64 x (Or64 y x))
  7634  	// cond:
  7635  	// result: (Or64 x y)
  7636  	for {
  7637  		x := v.Args[0]
  7638  		v_1 := v.Args[1]
  7639  		if v_1.Op != OpOr64 {
  7640  			break
  7641  		}
  7642  		y := v_1.Args[0]
  7643  		if x != v_1.Args[1] {
  7644  			break
  7645  		}
  7646  		v.reset(OpOr64)
  7647  		v.AddArg(x)
  7648  		v.AddArg(y)
  7649  		return true
  7650  	}
  7651  	// match: (Or64 (Or64 x y) x)
  7652  	// cond:
  7653  	// result: (Or64 x y)
  7654  	for {
  7655  		v_0 := v.Args[0]
  7656  		if v_0.Op != OpOr64 {
  7657  			break
  7658  		}
  7659  		x := v_0.Args[0]
  7660  		y := v_0.Args[1]
  7661  		if x != v.Args[1] {
  7662  			break
  7663  		}
  7664  		v.reset(OpOr64)
  7665  		v.AddArg(x)
  7666  		v.AddArg(y)
  7667  		return true
  7668  	}
  7669  	// match: (Or64 (Or64 x y) y)
  7670  	// cond:
  7671  	// result: (Or64 x y)
  7672  	for {
  7673  		v_0 := v.Args[0]
  7674  		if v_0.Op != OpOr64 {
  7675  			break
  7676  		}
  7677  		x := v_0.Args[0]
  7678  		y := v_0.Args[1]
  7679  		if y != v.Args[1] {
  7680  			break
  7681  		}
  7682  		v.reset(OpOr64)
  7683  		v.AddArg(x)
  7684  		v.AddArg(y)
  7685  		return true
  7686  	}
  7687  	return false
  7688  }
  7689  func rewriteValuegeneric_OpOr8(v *Value, config *Config) bool {
  7690  	b := v.Block
  7691  	_ = b
  7692  	// match: (Or8  x (Const8  <t> [c]))
  7693  	// cond: x.Op != OpConst8
  7694  	// result: (Or8  (Const8  <t> [c]) x)
  7695  	for {
  7696  		x := v.Args[0]
  7697  		v_1 := v.Args[1]
  7698  		if v_1.Op != OpConst8 {
  7699  			break
  7700  		}
  7701  		t := v_1.Type
  7702  		c := v_1.AuxInt
  7703  		if !(x.Op != OpConst8) {
  7704  			break
  7705  		}
  7706  		v.reset(OpOr8)
  7707  		v0 := b.NewValue0(v.Line, OpConst8, t)
  7708  		v0.AuxInt = c
  7709  		v.AddArg(v0)
  7710  		v.AddArg(x)
  7711  		return true
  7712  	}
  7713  	// match: (Or8  x x)
  7714  	// cond:
  7715  	// result: x
  7716  	for {
  7717  		x := v.Args[0]
  7718  		if x != v.Args[1] {
  7719  			break
  7720  		}
  7721  		v.reset(OpCopy)
  7722  		v.Type = x.Type
  7723  		v.AddArg(x)
  7724  		return true
  7725  	}
  7726  	// match: (Or8  (Const8  [0]) x)
  7727  	// cond:
  7728  	// result: x
  7729  	for {
  7730  		v_0 := v.Args[0]
  7731  		if v_0.Op != OpConst8 {
  7732  			break
  7733  		}
  7734  		if v_0.AuxInt != 0 {
  7735  			break
  7736  		}
  7737  		x := v.Args[1]
  7738  		v.reset(OpCopy)
  7739  		v.Type = x.Type
  7740  		v.AddArg(x)
  7741  		return true
  7742  	}
  7743  	// match: (Or8  (Const8  [-1]) _)
  7744  	// cond:
  7745  	// result: (Const8  [-1])
  7746  	for {
  7747  		v_0 := v.Args[0]
  7748  		if v_0.Op != OpConst8 {
  7749  			break
  7750  		}
  7751  		if v_0.AuxInt != -1 {
  7752  			break
  7753  		}
  7754  		v.reset(OpConst8)
  7755  		v.AuxInt = -1
  7756  		return true
  7757  	}
  7758  	// match: (Or8  x (Or8  x y))
  7759  	// cond:
  7760  	// result: (Or8  x y)
  7761  	for {
  7762  		x := v.Args[0]
  7763  		v_1 := v.Args[1]
  7764  		if v_1.Op != OpOr8 {
  7765  			break
  7766  		}
  7767  		if x != v_1.Args[0] {
  7768  			break
  7769  		}
  7770  		y := v_1.Args[1]
  7771  		v.reset(OpOr8)
  7772  		v.AddArg(x)
  7773  		v.AddArg(y)
  7774  		return true
  7775  	}
  7776  	// match: (Or8  x (Or8  y x))
  7777  	// cond:
  7778  	// result: (Or8  x y)
  7779  	for {
  7780  		x := v.Args[0]
  7781  		v_1 := v.Args[1]
  7782  		if v_1.Op != OpOr8 {
  7783  			break
  7784  		}
  7785  		y := v_1.Args[0]
  7786  		if x != v_1.Args[1] {
  7787  			break
  7788  		}
  7789  		v.reset(OpOr8)
  7790  		v.AddArg(x)
  7791  		v.AddArg(y)
  7792  		return true
  7793  	}
  7794  	// match: (Or8  (Or8  x y) x)
  7795  	// cond:
  7796  	// result: (Or8  x y)
  7797  	for {
  7798  		v_0 := v.Args[0]
  7799  		if v_0.Op != OpOr8 {
  7800  			break
  7801  		}
  7802  		x := v_0.Args[0]
  7803  		y := v_0.Args[1]
  7804  		if x != v.Args[1] {
  7805  			break
  7806  		}
  7807  		v.reset(OpOr8)
  7808  		v.AddArg(x)
  7809  		v.AddArg(y)
  7810  		return true
  7811  	}
  7812  	// match: (Or8  (Or8  x y) y)
  7813  	// cond:
  7814  	// result: (Or8  x y)
  7815  	for {
  7816  		v_0 := v.Args[0]
  7817  		if v_0.Op != OpOr8 {
  7818  			break
  7819  		}
  7820  		x := v_0.Args[0]
  7821  		y := v_0.Args[1]
  7822  		if y != v.Args[1] {
  7823  			break
  7824  		}
  7825  		v.reset(OpOr8)
  7826  		v.AddArg(x)
  7827  		v.AddArg(y)
  7828  		return true
  7829  	}
  7830  	return false
  7831  }
  7832  func rewriteValuegeneric_OpPhi(v *Value, config *Config) bool {
  7833  	b := v.Block
  7834  	_ = b
  7835  	// match: (Phi (Const8  [c]) (Const8  [c]))
  7836  	// cond:
  7837  	// result: (Const8  [c])
  7838  	for {
  7839  		v_0 := v.Args[0]
  7840  		if v_0.Op != OpConst8 {
  7841  			break
  7842  		}
  7843  		c := v_0.AuxInt
  7844  		v_1 := v.Args[1]
  7845  		if v_1.Op != OpConst8 {
  7846  			break
  7847  		}
  7848  		if v_1.AuxInt != c {
  7849  			break
  7850  		}
  7851  		if len(v.Args) != 2 {
  7852  			break
  7853  		}
  7854  		v.reset(OpConst8)
  7855  		v.AuxInt = c
  7856  		return true
  7857  	}
  7858  	// match: (Phi (Const16 [c]) (Const16 [c]))
  7859  	// cond:
  7860  	// result: (Const16 [c])
  7861  	for {
  7862  		v_0 := v.Args[0]
  7863  		if v_0.Op != OpConst16 {
  7864  			break
  7865  		}
  7866  		c := v_0.AuxInt
  7867  		v_1 := v.Args[1]
  7868  		if v_1.Op != OpConst16 {
  7869  			break
  7870  		}
  7871  		if v_1.AuxInt != c {
  7872  			break
  7873  		}
  7874  		if len(v.Args) != 2 {
  7875  			break
  7876  		}
  7877  		v.reset(OpConst16)
  7878  		v.AuxInt = c
  7879  		return true
  7880  	}
  7881  	// match: (Phi (Const32 [c]) (Const32 [c]))
  7882  	// cond:
  7883  	// result: (Const32 [c])
  7884  	for {
  7885  		v_0 := v.Args[0]
  7886  		if v_0.Op != OpConst32 {
  7887  			break
  7888  		}
  7889  		c := v_0.AuxInt
  7890  		v_1 := v.Args[1]
  7891  		if v_1.Op != OpConst32 {
  7892  			break
  7893  		}
  7894  		if v_1.AuxInt != c {
  7895  			break
  7896  		}
  7897  		if len(v.Args) != 2 {
  7898  			break
  7899  		}
  7900  		v.reset(OpConst32)
  7901  		v.AuxInt = c
  7902  		return true
  7903  	}
  7904  	// match: (Phi (Const64 [c]) (Const64 [c]))
  7905  	// cond:
  7906  	// result: (Const64 [c])
  7907  	for {
  7908  		v_0 := v.Args[0]
  7909  		if v_0.Op != OpConst64 {
  7910  			break
  7911  		}
  7912  		c := v_0.AuxInt
  7913  		v_1 := v.Args[1]
  7914  		if v_1.Op != OpConst64 {
  7915  			break
  7916  		}
  7917  		if v_1.AuxInt != c {
  7918  			break
  7919  		}
  7920  		if len(v.Args) != 2 {
  7921  			break
  7922  		}
  7923  		v.reset(OpConst64)
  7924  		v.AuxInt = c
  7925  		return true
  7926  	}
  7927  	return false
  7928  }
  7929  func rewriteValuegeneric_OpPtrIndex(v *Value, config *Config) bool {
  7930  	b := v.Block
  7931  	_ = b
  7932  	// match: (PtrIndex <t> ptr idx)
  7933  	// cond: config.PtrSize == 4
  7934  	// result: (AddPtr ptr (Mul32 <config.fe.TypeInt()> idx (Const32 <config.fe.TypeInt()> [t.ElemType().Size()])))
  7935  	for {
  7936  		t := v.Type
  7937  		ptr := v.Args[0]
  7938  		idx := v.Args[1]
  7939  		if !(config.PtrSize == 4) {
  7940  			break
  7941  		}
  7942  		v.reset(OpAddPtr)
  7943  		v.AddArg(ptr)
  7944  		v0 := b.NewValue0(v.Line, OpMul32, config.fe.TypeInt())
  7945  		v0.AddArg(idx)
  7946  		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
  7947  		v1.AuxInt = t.ElemType().Size()
  7948  		v0.AddArg(v1)
  7949  		v.AddArg(v0)
  7950  		return true
  7951  	}
  7952  	// match: (PtrIndex <t> ptr idx)
  7953  	// cond: config.PtrSize == 8
  7954  	// result: (AddPtr ptr (Mul64 <config.fe.TypeInt()> idx (Const64 <config.fe.TypeInt()> [t.ElemType().Size()])))
  7955  	for {
  7956  		t := v.Type
  7957  		ptr := v.Args[0]
  7958  		idx := v.Args[1]
  7959  		if !(config.PtrSize == 8) {
  7960  			break
  7961  		}
  7962  		v.reset(OpAddPtr)
  7963  		v.AddArg(ptr)
  7964  		v0 := b.NewValue0(v.Line, OpMul64, config.fe.TypeInt())
  7965  		v0.AddArg(idx)
  7966  		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
  7967  		v1.AuxInt = t.ElemType().Size()
  7968  		v0.AddArg(v1)
  7969  		v.AddArg(v0)
  7970  		return true
  7971  	}
  7972  	return false
  7973  }
  7974  func rewriteValuegeneric_OpRsh16Ux16(v *Value, config *Config) bool {
  7975  	b := v.Block
  7976  	_ = b
  7977  	// match: (Rsh16Ux16 <t> x (Const16 [c]))
  7978  	// cond:
  7979  	// result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))]))
  7980  	for {
  7981  		t := v.Type
  7982  		x := v.Args[0]
  7983  		v_1 := v.Args[1]
  7984  		if v_1.Op != OpConst16 {
  7985  			break
  7986  		}
  7987  		c := v_1.AuxInt
  7988  		v.reset(OpRsh16Ux64)
  7989  		v.AddArg(x)
  7990  		v0 := b.NewValue0(v.Line, OpConst64, t)
  7991  		v0.AuxInt = int64(uint16(c))
  7992  		v.AddArg(v0)
  7993  		return true
  7994  	}
  7995  	// match: (Rsh16Ux16 (Const16 [0]) _)
  7996  	// cond:
  7997  	// result: (Const16 [0])
  7998  	for {
  7999  		v_0 := v.Args[0]
  8000  		if v_0.Op != OpConst16 {
  8001  			break
  8002  		}
  8003  		if v_0.AuxInt != 0 {
  8004  			break
  8005  		}
  8006  		v.reset(OpConst16)
  8007  		v.AuxInt = 0
  8008  		return true
  8009  	}
  8010  	return false
  8011  }
  8012  func rewriteValuegeneric_OpRsh16Ux32(v *Value, config *Config) bool {
  8013  	b := v.Block
  8014  	_ = b
  8015  	// match: (Rsh16Ux32 <t> x (Const32 [c]))
  8016  	// cond:
  8017  	// result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))]))
  8018  	for {
  8019  		t := v.Type
  8020  		x := v.Args[0]
  8021  		v_1 := v.Args[1]
  8022  		if v_1.Op != OpConst32 {
  8023  			break
  8024  		}
  8025  		c := v_1.AuxInt
  8026  		v.reset(OpRsh16Ux64)
  8027  		v.AddArg(x)
  8028  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8029  		v0.AuxInt = int64(uint32(c))
  8030  		v.AddArg(v0)
  8031  		return true
  8032  	}
  8033  	// match: (Rsh16Ux32 (Const16 [0]) _)
  8034  	// cond:
  8035  	// result: (Const16 [0])
  8036  	for {
  8037  		v_0 := v.Args[0]
  8038  		if v_0.Op != OpConst16 {
  8039  			break
  8040  		}
  8041  		if v_0.AuxInt != 0 {
  8042  			break
  8043  		}
  8044  		v.reset(OpConst16)
  8045  		v.AuxInt = 0
  8046  		return true
  8047  	}
  8048  	return false
  8049  }
  8050  func rewriteValuegeneric_OpRsh16Ux64(v *Value, config *Config) bool {
  8051  	b := v.Block
  8052  	_ = b
  8053  	// match: (Rsh16Ux64 (Const16 [c]) (Const64 [d]))
  8054  	// cond:
  8055  	// result: (Const16 [int64(int16(uint16(c) >> uint64(d)))])
  8056  	for {
  8057  		v_0 := v.Args[0]
  8058  		if v_0.Op != OpConst16 {
  8059  			break
  8060  		}
  8061  		c := v_0.AuxInt
  8062  		v_1 := v.Args[1]
  8063  		if v_1.Op != OpConst64 {
  8064  			break
  8065  		}
  8066  		d := v_1.AuxInt
  8067  		v.reset(OpConst16)
  8068  		v.AuxInt = int64(int16(uint16(c) >> uint64(d)))
  8069  		return true
  8070  	}
  8071  	// match: (Rsh16Ux64 x (Const64 [0]))
  8072  	// cond:
  8073  	// result: x
  8074  	for {
  8075  		x := v.Args[0]
  8076  		v_1 := v.Args[1]
  8077  		if v_1.Op != OpConst64 {
  8078  			break
  8079  		}
  8080  		if v_1.AuxInt != 0 {
  8081  			break
  8082  		}
  8083  		v.reset(OpCopy)
  8084  		v.Type = x.Type
  8085  		v.AddArg(x)
  8086  		return true
  8087  	}
  8088  	// match: (Rsh16Ux64 (Const16 [0]) _)
  8089  	// cond:
  8090  	// result: (Const16 [0])
  8091  	for {
  8092  		v_0 := v.Args[0]
  8093  		if v_0.Op != OpConst16 {
  8094  			break
  8095  		}
  8096  		if v_0.AuxInt != 0 {
  8097  			break
  8098  		}
  8099  		v.reset(OpConst16)
  8100  		v.AuxInt = 0
  8101  		return true
  8102  	}
  8103  	// match: (Rsh16Ux64 _ (Const64 [c]))
  8104  	// cond: uint64(c) >= 16
  8105  	// result: (Const16 [0])
  8106  	for {
  8107  		v_1 := v.Args[1]
  8108  		if v_1.Op != OpConst64 {
  8109  			break
  8110  		}
  8111  		c := v_1.AuxInt
  8112  		if !(uint64(c) >= 16) {
  8113  			break
  8114  		}
  8115  		v.reset(OpConst16)
  8116  		v.AuxInt = 0
  8117  		return true
  8118  	}
  8119  	// match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d]))
  8120  	// cond: !uaddOvf(c,d)
  8121  	// result: (Rsh16Ux64 x (Const64 <t> [c+d]))
  8122  	for {
  8123  		t := v.Type
  8124  		v_0 := v.Args[0]
  8125  		if v_0.Op != OpRsh16Ux64 {
  8126  			break
  8127  		}
  8128  		x := v_0.Args[0]
  8129  		v_0_1 := v_0.Args[1]
  8130  		if v_0_1.Op != OpConst64 {
  8131  			break
  8132  		}
  8133  		c := v_0_1.AuxInt
  8134  		v_1 := v.Args[1]
  8135  		if v_1.Op != OpConst64 {
  8136  			break
  8137  		}
  8138  		d := v_1.AuxInt
  8139  		if !(!uaddOvf(c, d)) {
  8140  			break
  8141  		}
  8142  		v.reset(OpRsh16Ux64)
  8143  		v.AddArg(x)
  8144  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8145  		v0.AuxInt = c + d
  8146  		v.AddArg(v0)
  8147  		return true
  8148  	}
  8149  	// match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  8150  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  8151  	// result: (Rsh16Ux64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  8152  	for {
  8153  		v_0 := v.Args[0]
  8154  		if v_0.Op != OpLsh16x64 {
  8155  			break
  8156  		}
  8157  		v_0_0 := v_0.Args[0]
  8158  		if v_0_0.Op != OpRsh16Ux64 {
  8159  			break
  8160  		}
  8161  		x := v_0_0.Args[0]
  8162  		v_0_0_1 := v_0_0.Args[1]
  8163  		if v_0_0_1.Op != OpConst64 {
  8164  			break
  8165  		}
  8166  		c1 := v_0_0_1.AuxInt
  8167  		v_0_1 := v_0.Args[1]
  8168  		if v_0_1.Op != OpConst64 {
  8169  			break
  8170  		}
  8171  		c2 := v_0_1.AuxInt
  8172  		v_1 := v.Args[1]
  8173  		if v_1.Op != OpConst64 {
  8174  			break
  8175  		}
  8176  		c3 := v_1.AuxInt
  8177  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  8178  			break
  8179  		}
  8180  		v.reset(OpRsh16Ux64)
  8181  		v.AddArg(x)
  8182  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  8183  		v0.AuxInt = c1 - c2 + c3
  8184  		v.AddArg(v0)
  8185  		return true
  8186  	}
  8187  	return false
  8188  }
  8189  func rewriteValuegeneric_OpRsh16Ux8(v *Value, config *Config) bool {
  8190  	b := v.Block
  8191  	_ = b
  8192  	// match: (Rsh16Ux8  <t> x (Const8  [c]))
  8193  	// cond:
  8194  	// result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))]))
  8195  	for {
  8196  		t := v.Type
  8197  		x := v.Args[0]
  8198  		v_1 := v.Args[1]
  8199  		if v_1.Op != OpConst8 {
  8200  			break
  8201  		}
  8202  		c := v_1.AuxInt
  8203  		v.reset(OpRsh16Ux64)
  8204  		v.AddArg(x)
  8205  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8206  		v0.AuxInt = int64(uint8(c))
  8207  		v.AddArg(v0)
  8208  		return true
  8209  	}
  8210  	// match: (Rsh16Ux8 (Const16 [0]) _)
  8211  	// cond:
  8212  	// result: (Const16 [0])
  8213  	for {
  8214  		v_0 := v.Args[0]
  8215  		if v_0.Op != OpConst16 {
  8216  			break
  8217  		}
  8218  		if v_0.AuxInt != 0 {
  8219  			break
  8220  		}
  8221  		v.reset(OpConst16)
  8222  		v.AuxInt = 0
  8223  		return true
  8224  	}
  8225  	return false
  8226  }
  8227  func rewriteValuegeneric_OpRsh16x16(v *Value, config *Config) bool {
  8228  	b := v.Block
  8229  	_ = b
  8230  	// match: (Rsh16x16  <t> x (Const16 [c]))
  8231  	// cond:
  8232  	// result: (Rsh16x64  x (Const64 <t> [int64(uint16(c))]))
  8233  	for {
  8234  		t := v.Type
  8235  		x := v.Args[0]
  8236  		v_1 := v.Args[1]
  8237  		if v_1.Op != OpConst16 {
  8238  			break
  8239  		}
  8240  		c := v_1.AuxInt
  8241  		v.reset(OpRsh16x64)
  8242  		v.AddArg(x)
  8243  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8244  		v0.AuxInt = int64(uint16(c))
  8245  		v.AddArg(v0)
  8246  		return true
  8247  	}
  8248  	// match: (Rsh16x16  (Const16 [0]) _)
  8249  	// cond:
  8250  	// result: (Const16 [0])
  8251  	for {
  8252  		v_0 := v.Args[0]
  8253  		if v_0.Op != OpConst16 {
  8254  			break
  8255  		}
  8256  		if v_0.AuxInt != 0 {
  8257  			break
  8258  		}
  8259  		v.reset(OpConst16)
  8260  		v.AuxInt = 0
  8261  		return true
  8262  	}
  8263  	return false
  8264  }
  8265  func rewriteValuegeneric_OpRsh16x32(v *Value, config *Config) bool {
  8266  	b := v.Block
  8267  	_ = b
  8268  	// match: (Rsh16x32  <t> x (Const32 [c]))
  8269  	// cond:
  8270  	// result: (Rsh16x64  x (Const64 <t> [int64(uint32(c))]))
  8271  	for {
  8272  		t := v.Type
  8273  		x := v.Args[0]
  8274  		v_1 := v.Args[1]
  8275  		if v_1.Op != OpConst32 {
  8276  			break
  8277  		}
  8278  		c := v_1.AuxInt
  8279  		v.reset(OpRsh16x64)
  8280  		v.AddArg(x)
  8281  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8282  		v0.AuxInt = int64(uint32(c))
  8283  		v.AddArg(v0)
  8284  		return true
  8285  	}
  8286  	// match: (Rsh16x32  (Const16 [0]) _)
  8287  	// cond:
  8288  	// result: (Const16 [0])
  8289  	for {
  8290  		v_0 := v.Args[0]
  8291  		if v_0.Op != OpConst16 {
  8292  			break
  8293  		}
  8294  		if v_0.AuxInt != 0 {
  8295  			break
  8296  		}
  8297  		v.reset(OpConst16)
  8298  		v.AuxInt = 0
  8299  		return true
  8300  	}
  8301  	return false
  8302  }
  8303  func rewriteValuegeneric_OpRsh16x64(v *Value, config *Config) bool {
  8304  	b := v.Block
  8305  	_ = b
  8306  	// match: (Rsh16x64  (Const16 [c]) (Const64 [d]))
  8307  	// cond:
  8308  	// result: (Const16 [int64(int16(c) >> uint64(d))])
  8309  	for {
  8310  		v_0 := v.Args[0]
  8311  		if v_0.Op != OpConst16 {
  8312  			break
  8313  		}
  8314  		c := v_0.AuxInt
  8315  		v_1 := v.Args[1]
  8316  		if v_1.Op != OpConst64 {
  8317  			break
  8318  		}
  8319  		d := v_1.AuxInt
  8320  		v.reset(OpConst16)
  8321  		v.AuxInt = int64(int16(c) >> uint64(d))
  8322  		return true
  8323  	}
  8324  	// match: (Rsh16x64  x (Const64 [0]))
  8325  	// cond:
  8326  	// result: x
  8327  	for {
  8328  		x := v.Args[0]
  8329  		v_1 := v.Args[1]
  8330  		if v_1.Op != OpConst64 {
  8331  			break
  8332  		}
  8333  		if v_1.AuxInt != 0 {
  8334  			break
  8335  		}
  8336  		v.reset(OpCopy)
  8337  		v.Type = x.Type
  8338  		v.AddArg(x)
  8339  		return true
  8340  	}
  8341  	// match: (Rsh16x64  (Const16 [0]) _)
  8342  	// cond:
  8343  	// result: (Const16 [0])
  8344  	for {
  8345  		v_0 := v.Args[0]
  8346  		if v_0.Op != OpConst16 {
  8347  			break
  8348  		}
  8349  		if v_0.AuxInt != 0 {
  8350  			break
  8351  		}
  8352  		v.reset(OpConst16)
  8353  		v.AuxInt = 0
  8354  		return true
  8355  	}
  8356  	// match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d]))
  8357  	// cond: !uaddOvf(c,d)
  8358  	// result: (Rsh16x64 x (Const64 <t> [c+d]))
  8359  	for {
  8360  		t := v.Type
  8361  		v_0 := v.Args[0]
  8362  		if v_0.Op != OpRsh16x64 {
  8363  			break
  8364  		}
  8365  		x := v_0.Args[0]
  8366  		v_0_1 := v_0.Args[1]
  8367  		if v_0_1.Op != OpConst64 {
  8368  			break
  8369  		}
  8370  		c := v_0_1.AuxInt
  8371  		v_1 := v.Args[1]
  8372  		if v_1.Op != OpConst64 {
  8373  			break
  8374  		}
  8375  		d := v_1.AuxInt
  8376  		if !(!uaddOvf(c, d)) {
  8377  			break
  8378  		}
  8379  		v.reset(OpRsh16x64)
  8380  		v.AddArg(x)
  8381  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8382  		v0.AuxInt = c + d
  8383  		v.AddArg(v0)
  8384  		return true
  8385  	}
  8386  	return false
  8387  }
  8388  func rewriteValuegeneric_OpRsh16x8(v *Value, config *Config) bool {
  8389  	b := v.Block
  8390  	_ = b
  8391  	// match: (Rsh16x8   <t> x (Const8  [c]))
  8392  	// cond:
  8393  	// result: (Rsh16x64  x (Const64 <t> [int64(uint8(c))]))
  8394  	for {
  8395  		t := v.Type
  8396  		x := v.Args[0]
  8397  		v_1 := v.Args[1]
  8398  		if v_1.Op != OpConst8 {
  8399  			break
  8400  		}
  8401  		c := v_1.AuxInt
  8402  		v.reset(OpRsh16x64)
  8403  		v.AddArg(x)
  8404  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8405  		v0.AuxInt = int64(uint8(c))
  8406  		v.AddArg(v0)
  8407  		return true
  8408  	}
  8409  	// match: (Rsh16x8  (Const16 [0]) _)
  8410  	// cond:
  8411  	// result: (Const16 [0])
  8412  	for {
  8413  		v_0 := v.Args[0]
  8414  		if v_0.Op != OpConst16 {
  8415  			break
  8416  		}
  8417  		if v_0.AuxInt != 0 {
  8418  			break
  8419  		}
  8420  		v.reset(OpConst16)
  8421  		v.AuxInt = 0
  8422  		return true
  8423  	}
  8424  	return false
  8425  }
  8426  func rewriteValuegeneric_OpRsh32Ux16(v *Value, config *Config) bool {
  8427  	b := v.Block
  8428  	_ = b
  8429  	// match: (Rsh32Ux16 <t> x (Const16 [c]))
  8430  	// cond:
  8431  	// result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))]))
  8432  	for {
  8433  		t := v.Type
  8434  		x := v.Args[0]
  8435  		v_1 := v.Args[1]
  8436  		if v_1.Op != OpConst16 {
  8437  			break
  8438  		}
  8439  		c := v_1.AuxInt
  8440  		v.reset(OpRsh32Ux64)
  8441  		v.AddArg(x)
  8442  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8443  		v0.AuxInt = int64(uint16(c))
  8444  		v.AddArg(v0)
  8445  		return true
  8446  	}
  8447  	// match: (Rsh32Ux16 (Const32 [0]) _)
  8448  	// cond:
  8449  	// result: (Const32 [0])
  8450  	for {
  8451  		v_0 := v.Args[0]
  8452  		if v_0.Op != OpConst32 {
  8453  			break
  8454  		}
  8455  		if v_0.AuxInt != 0 {
  8456  			break
  8457  		}
  8458  		v.reset(OpConst32)
  8459  		v.AuxInt = 0
  8460  		return true
  8461  	}
  8462  	return false
  8463  }
  8464  func rewriteValuegeneric_OpRsh32Ux32(v *Value, config *Config) bool {
  8465  	b := v.Block
  8466  	_ = b
  8467  	// match: (Rsh32Ux32 <t> x (Const32 [c]))
  8468  	// cond:
  8469  	// result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))]))
  8470  	for {
  8471  		t := v.Type
  8472  		x := v.Args[0]
  8473  		v_1 := v.Args[1]
  8474  		if v_1.Op != OpConst32 {
  8475  			break
  8476  		}
  8477  		c := v_1.AuxInt
  8478  		v.reset(OpRsh32Ux64)
  8479  		v.AddArg(x)
  8480  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8481  		v0.AuxInt = int64(uint32(c))
  8482  		v.AddArg(v0)
  8483  		return true
  8484  	}
  8485  	// match: (Rsh32Ux32 (Const32 [0]) _)
  8486  	// cond:
  8487  	// result: (Const32 [0])
  8488  	for {
  8489  		v_0 := v.Args[0]
  8490  		if v_0.Op != OpConst32 {
  8491  			break
  8492  		}
  8493  		if v_0.AuxInt != 0 {
  8494  			break
  8495  		}
  8496  		v.reset(OpConst32)
  8497  		v.AuxInt = 0
  8498  		return true
  8499  	}
  8500  	return false
  8501  }
  8502  func rewriteValuegeneric_OpRsh32Ux64(v *Value, config *Config) bool {
  8503  	b := v.Block
  8504  	_ = b
  8505  	// match: (Rsh32Ux64 (Const32 [c]) (Const64 [d]))
  8506  	// cond:
  8507  	// result: (Const32 [int64(int32(uint32(c) >> uint64(d)))])
  8508  	for {
  8509  		v_0 := v.Args[0]
  8510  		if v_0.Op != OpConst32 {
  8511  			break
  8512  		}
  8513  		c := v_0.AuxInt
  8514  		v_1 := v.Args[1]
  8515  		if v_1.Op != OpConst64 {
  8516  			break
  8517  		}
  8518  		d := v_1.AuxInt
  8519  		v.reset(OpConst32)
  8520  		v.AuxInt = int64(int32(uint32(c) >> uint64(d)))
  8521  		return true
  8522  	}
  8523  	// match: (Rsh32Ux64 x (Const64 [0]))
  8524  	// cond:
  8525  	// result: x
  8526  	for {
  8527  		x := v.Args[0]
  8528  		v_1 := v.Args[1]
  8529  		if v_1.Op != OpConst64 {
  8530  			break
  8531  		}
  8532  		if v_1.AuxInt != 0 {
  8533  			break
  8534  		}
  8535  		v.reset(OpCopy)
  8536  		v.Type = x.Type
  8537  		v.AddArg(x)
  8538  		return true
  8539  	}
  8540  	// match: (Rsh32Ux64 (Const32 [0]) _)
  8541  	// cond:
  8542  	// result: (Const32 [0])
  8543  	for {
  8544  		v_0 := v.Args[0]
  8545  		if v_0.Op != OpConst32 {
  8546  			break
  8547  		}
  8548  		if v_0.AuxInt != 0 {
  8549  			break
  8550  		}
  8551  		v.reset(OpConst32)
  8552  		v.AuxInt = 0
  8553  		return true
  8554  	}
  8555  	// match: (Rsh32Ux64 _ (Const64 [c]))
  8556  	// cond: uint64(c) >= 32
  8557  	// result: (Const32 [0])
  8558  	for {
  8559  		v_1 := v.Args[1]
  8560  		if v_1.Op != OpConst64 {
  8561  			break
  8562  		}
  8563  		c := v_1.AuxInt
  8564  		if !(uint64(c) >= 32) {
  8565  			break
  8566  		}
  8567  		v.reset(OpConst32)
  8568  		v.AuxInt = 0
  8569  		return true
  8570  	}
  8571  	// match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d]))
  8572  	// cond: !uaddOvf(c,d)
  8573  	// result: (Rsh32Ux64 x (Const64 <t> [c+d]))
  8574  	for {
  8575  		t := v.Type
  8576  		v_0 := v.Args[0]
  8577  		if v_0.Op != OpRsh32Ux64 {
  8578  			break
  8579  		}
  8580  		x := v_0.Args[0]
  8581  		v_0_1 := v_0.Args[1]
  8582  		if v_0_1.Op != OpConst64 {
  8583  			break
  8584  		}
  8585  		c := v_0_1.AuxInt
  8586  		v_1 := v.Args[1]
  8587  		if v_1.Op != OpConst64 {
  8588  			break
  8589  		}
  8590  		d := v_1.AuxInt
  8591  		if !(!uaddOvf(c, d)) {
  8592  			break
  8593  		}
  8594  		v.reset(OpRsh32Ux64)
  8595  		v.AddArg(x)
  8596  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8597  		v0.AuxInt = c + d
  8598  		v.AddArg(v0)
  8599  		return true
  8600  	}
  8601  	// match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  8602  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  8603  	// result: (Rsh32Ux64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  8604  	for {
  8605  		v_0 := v.Args[0]
  8606  		if v_0.Op != OpLsh32x64 {
  8607  			break
  8608  		}
  8609  		v_0_0 := v_0.Args[0]
  8610  		if v_0_0.Op != OpRsh32Ux64 {
  8611  			break
  8612  		}
  8613  		x := v_0_0.Args[0]
  8614  		v_0_0_1 := v_0_0.Args[1]
  8615  		if v_0_0_1.Op != OpConst64 {
  8616  			break
  8617  		}
  8618  		c1 := v_0_0_1.AuxInt
  8619  		v_0_1 := v_0.Args[1]
  8620  		if v_0_1.Op != OpConst64 {
  8621  			break
  8622  		}
  8623  		c2 := v_0_1.AuxInt
  8624  		v_1 := v.Args[1]
  8625  		if v_1.Op != OpConst64 {
  8626  			break
  8627  		}
  8628  		c3 := v_1.AuxInt
  8629  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  8630  			break
  8631  		}
  8632  		v.reset(OpRsh32Ux64)
  8633  		v.AddArg(x)
  8634  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  8635  		v0.AuxInt = c1 - c2 + c3
  8636  		v.AddArg(v0)
  8637  		return true
  8638  	}
  8639  	return false
  8640  }
  8641  func rewriteValuegeneric_OpRsh32Ux8(v *Value, config *Config) bool {
  8642  	b := v.Block
  8643  	_ = b
  8644  	// match: (Rsh32Ux8  <t> x (Const8  [c]))
  8645  	// cond:
  8646  	// result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))]))
  8647  	for {
  8648  		t := v.Type
  8649  		x := v.Args[0]
  8650  		v_1 := v.Args[1]
  8651  		if v_1.Op != OpConst8 {
  8652  			break
  8653  		}
  8654  		c := v_1.AuxInt
  8655  		v.reset(OpRsh32Ux64)
  8656  		v.AddArg(x)
  8657  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8658  		v0.AuxInt = int64(uint8(c))
  8659  		v.AddArg(v0)
  8660  		return true
  8661  	}
  8662  	// match: (Rsh32Ux8 (Const32 [0]) _)
  8663  	// cond:
  8664  	// result: (Const32 [0])
  8665  	for {
  8666  		v_0 := v.Args[0]
  8667  		if v_0.Op != OpConst32 {
  8668  			break
  8669  		}
  8670  		if v_0.AuxInt != 0 {
  8671  			break
  8672  		}
  8673  		v.reset(OpConst32)
  8674  		v.AuxInt = 0
  8675  		return true
  8676  	}
  8677  	return false
  8678  }
  8679  func rewriteValuegeneric_OpRsh32x16(v *Value, config *Config) bool {
  8680  	b := v.Block
  8681  	_ = b
  8682  	// match: (Rsh32x16  <t> x (Const16 [c]))
  8683  	// cond:
  8684  	// result: (Rsh32x64  x (Const64 <t> [int64(uint16(c))]))
  8685  	for {
  8686  		t := v.Type
  8687  		x := v.Args[0]
  8688  		v_1 := v.Args[1]
  8689  		if v_1.Op != OpConst16 {
  8690  			break
  8691  		}
  8692  		c := v_1.AuxInt
  8693  		v.reset(OpRsh32x64)
  8694  		v.AddArg(x)
  8695  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8696  		v0.AuxInt = int64(uint16(c))
  8697  		v.AddArg(v0)
  8698  		return true
  8699  	}
  8700  	// match: (Rsh32x16  (Const32 [0]) _)
  8701  	// cond:
  8702  	// result: (Const32 [0])
  8703  	for {
  8704  		v_0 := v.Args[0]
  8705  		if v_0.Op != OpConst32 {
  8706  			break
  8707  		}
  8708  		if v_0.AuxInt != 0 {
  8709  			break
  8710  		}
  8711  		v.reset(OpConst32)
  8712  		v.AuxInt = 0
  8713  		return true
  8714  	}
  8715  	return false
  8716  }
  8717  func rewriteValuegeneric_OpRsh32x32(v *Value, config *Config) bool {
  8718  	b := v.Block
  8719  	_ = b
  8720  	// match: (Rsh32x32  <t> x (Const32 [c]))
  8721  	// cond:
  8722  	// result: (Rsh32x64  x (Const64 <t> [int64(uint32(c))]))
  8723  	for {
  8724  		t := v.Type
  8725  		x := v.Args[0]
  8726  		v_1 := v.Args[1]
  8727  		if v_1.Op != OpConst32 {
  8728  			break
  8729  		}
  8730  		c := v_1.AuxInt
  8731  		v.reset(OpRsh32x64)
  8732  		v.AddArg(x)
  8733  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8734  		v0.AuxInt = int64(uint32(c))
  8735  		v.AddArg(v0)
  8736  		return true
  8737  	}
  8738  	// match: (Rsh32x32  (Const32 [0]) _)
  8739  	// cond:
  8740  	// result: (Const32 [0])
  8741  	for {
  8742  		v_0 := v.Args[0]
  8743  		if v_0.Op != OpConst32 {
  8744  			break
  8745  		}
  8746  		if v_0.AuxInt != 0 {
  8747  			break
  8748  		}
  8749  		v.reset(OpConst32)
  8750  		v.AuxInt = 0
  8751  		return true
  8752  	}
  8753  	return false
  8754  }
  8755  func rewriteValuegeneric_OpRsh32x64(v *Value, config *Config) bool {
  8756  	b := v.Block
  8757  	_ = b
  8758  	// match: (Rsh32x64  (Const32 [c]) (Const64 [d]))
  8759  	// cond:
  8760  	// result: (Const32 [int64(int32(c) >> uint64(d))])
  8761  	for {
  8762  		v_0 := v.Args[0]
  8763  		if v_0.Op != OpConst32 {
  8764  			break
  8765  		}
  8766  		c := v_0.AuxInt
  8767  		v_1 := v.Args[1]
  8768  		if v_1.Op != OpConst64 {
  8769  			break
  8770  		}
  8771  		d := v_1.AuxInt
  8772  		v.reset(OpConst32)
  8773  		v.AuxInt = int64(int32(c) >> uint64(d))
  8774  		return true
  8775  	}
  8776  	// match: (Rsh32x64  x (Const64 [0]))
  8777  	// cond:
  8778  	// result: x
  8779  	for {
  8780  		x := v.Args[0]
  8781  		v_1 := v.Args[1]
  8782  		if v_1.Op != OpConst64 {
  8783  			break
  8784  		}
  8785  		if v_1.AuxInt != 0 {
  8786  			break
  8787  		}
  8788  		v.reset(OpCopy)
  8789  		v.Type = x.Type
  8790  		v.AddArg(x)
  8791  		return true
  8792  	}
  8793  	// match: (Rsh32x64  (Const32 [0]) _)
  8794  	// cond:
  8795  	// result: (Const32 [0])
  8796  	for {
  8797  		v_0 := v.Args[0]
  8798  		if v_0.Op != OpConst32 {
  8799  			break
  8800  		}
  8801  		if v_0.AuxInt != 0 {
  8802  			break
  8803  		}
  8804  		v.reset(OpConst32)
  8805  		v.AuxInt = 0
  8806  		return true
  8807  	}
  8808  	// match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d]))
  8809  	// cond: !uaddOvf(c,d)
  8810  	// result: (Rsh32x64 x (Const64 <t> [c+d]))
  8811  	for {
  8812  		t := v.Type
  8813  		v_0 := v.Args[0]
  8814  		if v_0.Op != OpRsh32x64 {
  8815  			break
  8816  		}
  8817  		x := v_0.Args[0]
  8818  		v_0_1 := v_0.Args[1]
  8819  		if v_0_1.Op != OpConst64 {
  8820  			break
  8821  		}
  8822  		c := v_0_1.AuxInt
  8823  		v_1 := v.Args[1]
  8824  		if v_1.Op != OpConst64 {
  8825  			break
  8826  		}
  8827  		d := v_1.AuxInt
  8828  		if !(!uaddOvf(c, d)) {
  8829  			break
  8830  		}
  8831  		v.reset(OpRsh32x64)
  8832  		v.AddArg(x)
  8833  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8834  		v0.AuxInt = c + d
  8835  		v.AddArg(v0)
  8836  		return true
  8837  	}
  8838  	return false
  8839  }
  8840  func rewriteValuegeneric_OpRsh32x8(v *Value, config *Config) bool {
  8841  	b := v.Block
  8842  	_ = b
  8843  	// match: (Rsh32x8   <t> x (Const8  [c]))
  8844  	// cond:
  8845  	// result: (Rsh32x64  x (Const64 <t> [int64(uint8(c))]))
  8846  	for {
  8847  		t := v.Type
  8848  		x := v.Args[0]
  8849  		v_1 := v.Args[1]
  8850  		if v_1.Op != OpConst8 {
  8851  			break
  8852  		}
  8853  		c := v_1.AuxInt
  8854  		v.reset(OpRsh32x64)
  8855  		v.AddArg(x)
  8856  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8857  		v0.AuxInt = int64(uint8(c))
  8858  		v.AddArg(v0)
  8859  		return true
  8860  	}
  8861  	// match: (Rsh32x8  (Const32 [0]) _)
  8862  	// cond:
  8863  	// result: (Const32 [0])
  8864  	for {
  8865  		v_0 := v.Args[0]
  8866  		if v_0.Op != OpConst32 {
  8867  			break
  8868  		}
  8869  		if v_0.AuxInt != 0 {
  8870  			break
  8871  		}
  8872  		v.reset(OpConst32)
  8873  		v.AuxInt = 0
  8874  		return true
  8875  	}
  8876  	return false
  8877  }
  8878  func rewriteValuegeneric_OpRsh64Ux16(v *Value, config *Config) bool {
  8879  	b := v.Block
  8880  	_ = b
  8881  	// match: (Rsh64Ux16 <t> x (Const16 [c]))
  8882  	// cond:
  8883  	// result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))]))
  8884  	for {
  8885  		t := v.Type
  8886  		x := v.Args[0]
  8887  		v_1 := v.Args[1]
  8888  		if v_1.Op != OpConst16 {
  8889  			break
  8890  		}
  8891  		c := v_1.AuxInt
  8892  		v.reset(OpRsh64Ux64)
  8893  		v.AddArg(x)
  8894  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8895  		v0.AuxInt = int64(uint16(c))
  8896  		v.AddArg(v0)
  8897  		return true
  8898  	}
  8899  	// match: (Rsh64Ux16 (Const64 [0]) _)
  8900  	// cond:
  8901  	// result: (Const64 [0])
  8902  	for {
  8903  		v_0 := v.Args[0]
  8904  		if v_0.Op != OpConst64 {
  8905  			break
  8906  		}
  8907  		if v_0.AuxInt != 0 {
  8908  			break
  8909  		}
  8910  		v.reset(OpConst64)
  8911  		v.AuxInt = 0
  8912  		return true
  8913  	}
  8914  	return false
  8915  }
  8916  func rewriteValuegeneric_OpRsh64Ux32(v *Value, config *Config) bool {
  8917  	b := v.Block
  8918  	_ = b
  8919  	// match: (Rsh64Ux32 <t> x (Const32 [c]))
  8920  	// cond:
  8921  	// result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))]))
  8922  	for {
  8923  		t := v.Type
  8924  		x := v.Args[0]
  8925  		v_1 := v.Args[1]
  8926  		if v_1.Op != OpConst32 {
  8927  			break
  8928  		}
  8929  		c := v_1.AuxInt
  8930  		v.reset(OpRsh64Ux64)
  8931  		v.AddArg(x)
  8932  		v0 := b.NewValue0(v.Line, OpConst64, t)
  8933  		v0.AuxInt = int64(uint32(c))
  8934  		v.AddArg(v0)
  8935  		return true
  8936  	}
  8937  	// match: (Rsh64Ux32 (Const64 [0]) _)
  8938  	// cond:
  8939  	// result: (Const64 [0])
  8940  	for {
  8941  		v_0 := v.Args[0]
  8942  		if v_0.Op != OpConst64 {
  8943  			break
  8944  		}
  8945  		if v_0.AuxInt != 0 {
  8946  			break
  8947  		}
  8948  		v.reset(OpConst64)
  8949  		v.AuxInt = 0
  8950  		return true
  8951  	}
  8952  	return false
  8953  }
  8954  func rewriteValuegeneric_OpRsh64Ux64(v *Value, config *Config) bool {
  8955  	b := v.Block
  8956  	_ = b
  8957  	// match: (Rsh64Ux64 (Const64 [c]) (Const64 [d]))
  8958  	// cond:
  8959  	// result: (Const64 [int64(uint64(c) >> uint64(d))])
  8960  	for {
  8961  		v_0 := v.Args[0]
  8962  		if v_0.Op != OpConst64 {
  8963  			break
  8964  		}
  8965  		c := v_0.AuxInt
  8966  		v_1 := v.Args[1]
  8967  		if v_1.Op != OpConst64 {
  8968  			break
  8969  		}
  8970  		d := v_1.AuxInt
  8971  		v.reset(OpConst64)
  8972  		v.AuxInt = int64(uint64(c) >> uint64(d))
  8973  		return true
  8974  	}
  8975  	// match: (Rsh64Ux64 x (Const64 [0]))
  8976  	// cond:
  8977  	// result: x
  8978  	for {
  8979  		x := v.Args[0]
  8980  		v_1 := v.Args[1]
  8981  		if v_1.Op != OpConst64 {
  8982  			break
  8983  		}
  8984  		if v_1.AuxInt != 0 {
  8985  			break
  8986  		}
  8987  		v.reset(OpCopy)
  8988  		v.Type = x.Type
  8989  		v.AddArg(x)
  8990  		return true
  8991  	}
  8992  	// match: (Rsh64Ux64 (Const64 [0]) _)
  8993  	// cond:
  8994  	// result: (Const64 [0])
  8995  	for {
  8996  		v_0 := v.Args[0]
  8997  		if v_0.Op != OpConst64 {
  8998  			break
  8999  		}
  9000  		if v_0.AuxInt != 0 {
  9001  			break
  9002  		}
  9003  		v.reset(OpConst64)
  9004  		v.AuxInt = 0
  9005  		return true
  9006  	}
  9007  	// match: (Rsh64Ux64 _ (Const64 [c]))
  9008  	// cond: uint64(c) >= 64
  9009  	// result: (Const64 [0])
  9010  	for {
  9011  		v_1 := v.Args[1]
  9012  		if v_1.Op != OpConst64 {
  9013  			break
  9014  		}
  9015  		c := v_1.AuxInt
  9016  		if !(uint64(c) >= 64) {
  9017  			break
  9018  		}
  9019  		v.reset(OpConst64)
  9020  		v.AuxInt = 0
  9021  		return true
  9022  	}
  9023  	// match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d]))
  9024  	// cond: !uaddOvf(c,d)
  9025  	// result: (Rsh64Ux64 x (Const64 <t> [c+d]))
  9026  	for {
  9027  		t := v.Type
  9028  		v_0 := v.Args[0]
  9029  		if v_0.Op != OpRsh64Ux64 {
  9030  			break
  9031  		}
  9032  		x := v_0.Args[0]
  9033  		v_0_1 := v_0.Args[1]
  9034  		if v_0_1.Op != OpConst64 {
  9035  			break
  9036  		}
  9037  		c := v_0_1.AuxInt
  9038  		v_1 := v.Args[1]
  9039  		if v_1.Op != OpConst64 {
  9040  			break
  9041  		}
  9042  		d := v_1.AuxInt
  9043  		if !(!uaddOvf(c, d)) {
  9044  			break
  9045  		}
  9046  		v.reset(OpRsh64Ux64)
  9047  		v.AddArg(x)
  9048  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9049  		v0.AuxInt = c + d
  9050  		v.AddArg(v0)
  9051  		return true
  9052  	}
  9053  	// match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  9054  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  9055  	// result: (Rsh64Ux64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  9056  	for {
  9057  		v_0 := v.Args[0]
  9058  		if v_0.Op != OpLsh64x64 {
  9059  			break
  9060  		}
  9061  		v_0_0 := v_0.Args[0]
  9062  		if v_0_0.Op != OpRsh64Ux64 {
  9063  			break
  9064  		}
  9065  		x := v_0_0.Args[0]
  9066  		v_0_0_1 := v_0_0.Args[1]
  9067  		if v_0_0_1.Op != OpConst64 {
  9068  			break
  9069  		}
  9070  		c1 := v_0_0_1.AuxInt
  9071  		v_0_1 := v_0.Args[1]
  9072  		if v_0_1.Op != OpConst64 {
  9073  			break
  9074  		}
  9075  		c2 := v_0_1.AuxInt
  9076  		v_1 := v.Args[1]
  9077  		if v_1.Op != OpConst64 {
  9078  			break
  9079  		}
  9080  		c3 := v_1.AuxInt
  9081  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  9082  			break
  9083  		}
  9084  		v.reset(OpRsh64Ux64)
  9085  		v.AddArg(x)
  9086  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  9087  		v0.AuxInt = c1 - c2 + c3
  9088  		v.AddArg(v0)
  9089  		return true
  9090  	}
  9091  	return false
  9092  }
  9093  func rewriteValuegeneric_OpRsh64Ux8(v *Value, config *Config) bool {
  9094  	b := v.Block
  9095  	_ = b
  9096  	// match: (Rsh64Ux8  <t> x (Const8  [c]))
  9097  	// cond:
  9098  	// result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))]))
  9099  	for {
  9100  		t := v.Type
  9101  		x := v.Args[0]
  9102  		v_1 := v.Args[1]
  9103  		if v_1.Op != OpConst8 {
  9104  			break
  9105  		}
  9106  		c := v_1.AuxInt
  9107  		v.reset(OpRsh64Ux64)
  9108  		v.AddArg(x)
  9109  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9110  		v0.AuxInt = int64(uint8(c))
  9111  		v.AddArg(v0)
  9112  		return true
  9113  	}
  9114  	// match: (Rsh64Ux8 (Const64 [0]) _)
  9115  	// cond:
  9116  	// result: (Const64 [0])
  9117  	for {
  9118  		v_0 := v.Args[0]
  9119  		if v_0.Op != OpConst64 {
  9120  			break
  9121  		}
  9122  		if v_0.AuxInt != 0 {
  9123  			break
  9124  		}
  9125  		v.reset(OpConst64)
  9126  		v.AuxInt = 0
  9127  		return true
  9128  	}
  9129  	return false
  9130  }
  9131  func rewriteValuegeneric_OpRsh64x16(v *Value, config *Config) bool {
  9132  	b := v.Block
  9133  	_ = b
  9134  	// match: (Rsh64x16  <t> x (Const16 [c]))
  9135  	// cond:
  9136  	// result: (Rsh64x64  x (Const64 <t> [int64(uint16(c))]))
  9137  	for {
  9138  		t := v.Type
  9139  		x := v.Args[0]
  9140  		v_1 := v.Args[1]
  9141  		if v_1.Op != OpConst16 {
  9142  			break
  9143  		}
  9144  		c := v_1.AuxInt
  9145  		v.reset(OpRsh64x64)
  9146  		v.AddArg(x)
  9147  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9148  		v0.AuxInt = int64(uint16(c))
  9149  		v.AddArg(v0)
  9150  		return true
  9151  	}
  9152  	// match: (Rsh64x16  (Const64 [0]) _)
  9153  	// cond:
  9154  	// result: (Const64 [0])
  9155  	for {
  9156  		v_0 := v.Args[0]
  9157  		if v_0.Op != OpConst64 {
  9158  			break
  9159  		}
  9160  		if v_0.AuxInt != 0 {
  9161  			break
  9162  		}
  9163  		v.reset(OpConst64)
  9164  		v.AuxInt = 0
  9165  		return true
  9166  	}
  9167  	return false
  9168  }
  9169  func rewriteValuegeneric_OpRsh64x32(v *Value, config *Config) bool {
  9170  	b := v.Block
  9171  	_ = b
  9172  	// match: (Rsh64x32  <t> x (Const32 [c]))
  9173  	// cond:
  9174  	// result: (Rsh64x64  x (Const64 <t> [int64(uint32(c))]))
  9175  	for {
  9176  		t := v.Type
  9177  		x := v.Args[0]
  9178  		v_1 := v.Args[1]
  9179  		if v_1.Op != OpConst32 {
  9180  			break
  9181  		}
  9182  		c := v_1.AuxInt
  9183  		v.reset(OpRsh64x64)
  9184  		v.AddArg(x)
  9185  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9186  		v0.AuxInt = int64(uint32(c))
  9187  		v.AddArg(v0)
  9188  		return true
  9189  	}
  9190  	// match: (Rsh64x32  (Const64 [0]) _)
  9191  	// cond:
  9192  	// result: (Const64 [0])
  9193  	for {
  9194  		v_0 := v.Args[0]
  9195  		if v_0.Op != OpConst64 {
  9196  			break
  9197  		}
  9198  		if v_0.AuxInt != 0 {
  9199  			break
  9200  		}
  9201  		v.reset(OpConst64)
  9202  		v.AuxInt = 0
  9203  		return true
  9204  	}
  9205  	return false
  9206  }
  9207  func rewriteValuegeneric_OpRsh64x64(v *Value, config *Config) bool {
  9208  	b := v.Block
  9209  	_ = b
  9210  	// match: (Rsh64x64  (Const64 [c]) (Const64 [d]))
  9211  	// cond:
  9212  	// result: (Const64 [c >> uint64(d)])
  9213  	for {
  9214  		v_0 := v.Args[0]
  9215  		if v_0.Op != OpConst64 {
  9216  			break
  9217  		}
  9218  		c := v_0.AuxInt
  9219  		v_1 := v.Args[1]
  9220  		if v_1.Op != OpConst64 {
  9221  			break
  9222  		}
  9223  		d := v_1.AuxInt
  9224  		v.reset(OpConst64)
  9225  		v.AuxInt = c >> uint64(d)
  9226  		return true
  9227  	}
  9228  	// match: (Rsh64x64  x (Const64 [0]))
  9229  	// cond:
  9230  	// result: x
  9231  	for {
  9232  		x := v.Args[0]
  9233  		v_1 := v.Args[1]
  9234  		if v_1.Op != OpConst64 {
  9235  			break
  9236  		}
  9237  		if v_1.AuxInt != 0 {
  9238  			break
  9239  		}
  9240  		v.reset(OpCopy)
  9241  		v.Type = x.Type
  9242  		v.AddArg(x)
  9243  		return true
  9244  	}
  9245  	// match: (Rsh64x64  (Const64 [0]) _)
  9246  	// cond:
  9247  	// result: (Const64 [0])
  9248  	for {
  9249  		v_0 := v.Args[0]
  9250  		if v_0.Op != OpConst64 {
  9251  			break
  9252  		}
  9253  		if v_0.AuxInt != 0 {
  9254  			break
  9255  		}
  9256  		v.reset(OpConst64)
  9257  		v.AuxInt = 0
  9258  		return true
  9259  	}
  9260  	// match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d]))
  9261  	// cond: !uaddOvf(c,d)
  9262  	// result: (Rsh64x64 x (Const64 <t> [c+d]))
  9263  	for {
  9264  		t := v.Type
  9265  		v_0 := v.Args[0]
  9266  		if v_0.Op != OpRsh64x64 {
  9267  			break
  9268  		}
  9269  		x := v_0.Args[0]
  9270  		v_0_1 := v_0.Args[1]
  9271  		if v_0_1.Op != OpConst64 {
  9272  			break
  9273  		}
  9274  		c := v_0_1.AuxInt
  9275  		v_1 := v.Args[1]
  9276  		if v_1.Op != OpConst64 {
  9277  			break
  9278  		}
  9279  		d := v_1.AuxInt
  9280  		if !(!uaddOvf(c, d)) {
  9281  			break
  9282  		}
  9283  		v.reset(OpRsh64x64)
  9284  		v.AddArg(x)
  9285  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9286  		v0.AuxInt = c + d
  9287  		v.AddArg(v0)
  9288  		return true
  9289  	}
  9290  	return false
  9291  }
  9292  func rewriteValuegeneric_OpRsh64x8(v *Value, config *Config) bool {
  9293  	b := v.Block
  9294  	_ = b
  9295  	// match: (Rsh64x8   <t> x (Const8  [c]))
  9296  	// cond:
  9297  	// result: (Rsh64x64  x (Const64 <t> [int64(uint8(c))]))
  9298  	for {
  9299  		t := v.Type
  9300  		x := v.Args[0]
  9301  		v_1 := v.Args[1]
  9302  		if v_1.Op != OpConst8 {
  9303  			break
  9304  		}
  9305  		c := v_1.AuxInt
  9306  		v.reset(OpRsh64x64)
  9307  		v.AddArg(x)
  9308  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9309  		v0.AuxInt = int64(uint8(c))
  9310  		v.AddArg(v0)
  9311  		return true
  9312  	}
  9313  	// match: (Rsh64x8  (Const64 [0]) _)
  9314  	// cond:
  9315  	// result: (Const64 [0])
  9316  	for {
  9317  		v_0 := v.Args[0]
  9318  		if v_0.Op != OpConst64 {
  9319  			break
  9320  		}
  9321  		if v_0.AuxInt != 0 {
  9322  			break
  9323  		}
  9324  		v.reset(OpConst64)
  9325  		v.AuxInt = 0
  9326  		return true
  9327  	}
  9328  	return false
  9329  }
  9330  func rewriteValuegeneric_OpRsh8Ux16(v *Value, config *Config) bool {
  9331  	b := v.Block
  9332  	_ = b
  9333  	// match: (Rsh8Ux16 <t> x (Const16 [c]))
  9334  	// cond:
  9335  	// result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))]))
  9336  	for {
  9337  		t := v.Type
  9338  		x := v.Args[0]
  9339  		v_1 := v.Args[1]
  9340  		if v_1.Op != OpConst16 {
  9341  			break
  9342  		}
  9343  		c := v_1.AuxInt
  9344  		v.reset(OpRsh8Ux64)
  9345  		v.AddArg(x)
  9346  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9347  		v0.AuxInt = int64(uint16(c))
  9348  		v.AddArg(v0)
  9349  		return true
  9350  	}
  9351  	// match: (Rsh8Ux16  (Const8 [0]) _)
  9352  	// cond:
  9353  	// result: (Const8  [0])
  9354  	for {
  9355  		v_0 := v.Args[0]
  9356  		if v_0.Op != OpConst8 {
  9357  			break
  9358  		}
  9359  		if v_0.AuxInt != 0 {
  9360  			break
  9361  		}
  9362  		v.reset(OpConst8)
  9363  		v.AuxInt = 0
  9364  		return true
  9365  	}
  9366  	return false
  9367  }
  9368  func rewriteValuegeneric_OpRsh8Ux32(v *Value, config *Config) bool {
  9369  	b := v.Block
  9370  	_ = b
  9371  	// match: (Rsh8Ux32 <t> x (Const32 [c]))
  9372  	// cond:
  9373  	// result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))]))
  9374  	for {
  9375  		t := v.Type
  9376  		x := v.Args[0]
  9377  		v_1 := v.Args[1]
  9378  		if v_1.Op != OpConst32 {
  9379  			break
  9380  		}
  9381  		c := v_1.AuxInt
  9382  		v.reset(OpRsh8Ux64)
  9383  		v.AddArg(x)
  9384  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9385  		v0.AuxInt = int64(uint32(c))
  9386  		v.AddArg(v0)
  9387  		return true
  9388  	}
  9389  	// match: (Rsh8Ux32  (Const8 [0]) _)
  9390  	// cond:
  9391  	// result: (Const8  [0])
  9392  	for {
  9393  		v_0 := v.Args[0]
  9394  		if v_0.Op != OpConst8 {
  9395  			break
  9396  		}
  9397  		if v_0.AuxInt != 0 {
  9398  			break
  9399  		}
  9400  		v.reset(OpConst8)
  9401  		v.AuxInt = 0
  9402  		return true
  9403  	}
  9404  	return false
  9405  }
  9406  func rewriteValuegeneric_OpRsh8Ux64(v *Value, config *Config) bool {
  9407  	b := v.Block
  9408  	_ = b
  9409  	// match: (Rsh8Ux64  (Const8  [c]) (Const64 [d]))
  9410  	// cond:
  9411  	// result: (Const8  [int64(int8(uint8(c) >> uint64(d)))])
  9412  	for {
  9413  		v_0 := v.Args[0]
  9414  		if v_0.Op != OpConst8 {
  9415  			break
  9416  		}
  9417  		c := v_0.AuxInt
  9418  		v_1 := v.Args[1]
  9419  		if v_1.Op != OpConst64 {
  9420  			break
  9421  		}
  9422  		d := v_1.AuxInt
  9423  		v.reset(OpConst8)
  9424  		v.AuxInt = int64(int8(uint8(c) >> uint64(d)))
  9425  		return true
  9426  	}
  9427  	// match: (Rsh8Ux64  x (Const64 [0]))
  9428  	// cond:
  9429  	// result: x
  9430  	for {
  9431  		x := v.Args[0]
  9432  		v_1 := v.Args[1]
  9433  		if v_1.Op != OpConst64 {
  9434  			break
  9435  		}
  9436  		if v_1.AuxInt != 0 {
  9437  			break
  9438  		}
  9439  		v.reset(OpCopy)
  9440  		v.Type = x.Type
  9441  		v.AddArg(x)
  9442  		return true
  9443  	}
  9444  	// match: (Rsh8Ux64  (Const8 [0]) _)
  9445  	// cond:
  9446  	// result: (Const8  [0])
  9447  	for {
  9448  		v_0 := v.Args[0]
  9449  		if v_0.Op != OpConst8 {
  9450  			break
  9451  		}
  9452  		if v_0.AuxInt != 0 {
  9453  			break
  9454  		}
  9455  		v.reset(OpConst8)
  9456  		v.AuxInt = 0
  9457  		return true
  9458  	}
  9459  	// match: (Rsh8Ux64  _ (Const64 [c]))
  9460  	// cond: uint64(c) >= 8
  9461  	// result: (Const8  [0])
  9462  	for {
  9463  		v_1 := v.Args[1]
  9464  		if v_1.Op != OpConst64 {
  9465  			break
  9466  		}
  9467  		c := v_1.AuxInt
  9468  		if !(uint64(c) >= 8) {
  9469  			break
  9470  		}
  9471  		v.reset(OpConst8)
  9472  		v.AuxInt = 0
  9473  		return true
  9474  	}
  9475  	// match: (Rsh8Ux64  <t> (Rsh8Ux64  x (Const64 [c])) (Const64 [d]))
  9476  	// cond: !uaddOvf(c,d)
  9477  	// result: (Rsh8Ux64  x (Const64 <t> [c+d]))
  9478  	for {
  9479  		t := v.Type
  9480  		v_0 := v.Args[0]
  9481  		if v_0.Op != OpRsh8Ux64 {
  9482  			break
  9483  		}
  9484  		x := v_0.Args[0]
  9485  		v_0_1 := v_0.Args[1]
  9486  		if v_0_1.Op != OpConst64 {
  9487  			break
  9488  		}
  9489  		c := v_0_1.AuxInt
  9490  		v_1 := v.Args[1]
  9491  		if v_1.Op != OpConst64 {
  9492  			break
  9493  		}
  9494  		d := v_1.AuxInt
  9495  		if !(!uaddOvf(c, d)) {
  9496  			break
  9497  		}
  9498  		v.reset(OpRsh8Ux64)
  9499  		v.AddArg(x)
  9500  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9501  		v0.AuxInt = c + d
  9502  		v.AddArg(v0)
  9503  		return true
  9504  	}
  9505  	// match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3]))
  9506  	// cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)
  9507  	// result: (Rsh8Ux64 x (Const64 <config.fe.TypeUInt64()> [c1-c2+c3]))
  9508  	for {
  9509  		v_0 := v.Args[0]
  9510  		if v_0.Op != OpLsh8x64 {
  9511  			break
  9512  		}
  9513  		v_0_0 := v_0.Args[0]
  9514  		if v_0_0.Op != OpRsh8Ux64 {
  9515  			break
  9516  		}
  9517  		x := v_0_0.Args[0]
  9518  		v_0_0_1 := v_0_0.Args[1]
  9519  		if v_0_0_1.Op != OpConst64 {
  9520  			break
  9521  		}
  9522  		c1 := v_0_0_1.AuxInt
  9523  		v_0_1 := v_0.Args[1]
  9524  		if v_0_1.Op != OpConst64 {
  9525  			break
  9526  		}
  9527  		c2 := v_0_1.AuxInt
  9528  		v_1 := v.Args[1]
  9529  		if v_1.Op != OpConst64 {
  9530  			break
  9531  		}
  9532  		c3 := v_1.AuxInt
  9533  		if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
  9534  			break
  9535  		}
  9536  		v.reset(OpRsh8Ux64)
  9537  		v.AddArg(x)
  9538  		v0 := b.NewValue0(v.Line, OpConst64, config.fe.TypeUInt64())
  9539  		v0.AuxInt = c1 - c2 + c3
  9540  		v.AddArg(v0)
  9541  		return true
  9542  	}
  9543  	return false
  9544  }
  9545  func rewriteValuegeneric_OpRsh8Ux8(v *Value, config *Config) bool {
  9546  	b := v.Block
  9547  	_ = b
  9548  	// match: (Rsh8Ux8  <t> x (Const8  [c]))
  9549  	// cond:
  9550  	// result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))]))
  9551  	for {
  9552  		t := v.Type
  9553  		x := v.Args[0]
  9554  		v_1 := v.Args[1]
  9555  		if v_1.Op != OpConst8 {
  9556  			break
  9557  		}
  9558  		c := v_1.AuxInt
  9559  		v.reset(OpRsh8Ux64)
  9560  		v.AddArg(x)
  9561  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9562  		v0.AuxInt = int64(uint8(c))
  9563  		v.AddArg(v0)
  9564  		return true
  9565  	}
  9566  	// match: (Rsh8Ux8  (Const8 [0]) _)
  9567  	// cond:
  9568  	// result: (Const8  [0])
  9569  	for {
  9570  		v_0 := v.Args[0]
  9571  		if v_0.Op != OpConst8 {
  9572  			break
  9573  		}
  9574  		if v_0.AuxInt != 0 {
  9575  			break
  9576  		}
  9577  		v.reset(OpConst8)
  9578  		v.AuxInt = 0
  9579  		return true
  9580  	}
  9581  	return false
  9582  }
  9583  func rewriteValuegeneric_OpRsh8x16(v *Value, config *Config) bool {
  9584  	b := v.Block
  9585  	_ = b
  9586  	// match: (Rsh8x16  <t> x (Const16 [c]))
  9587  	// cond:
  9588  	// result: (Rsh8x64  x (Const64 <t> [int64(uint16(c))]))
  9589  	for {
  9590  		t := v.Type
  9591  		x := v.Args[0]
  9592  		v_1 := v.Args[1]
  9593  		if v_1.Op != OpConst16 {
  9594  			break
  9595  		}
  9596  		c := v_1.AuxInt
  9597  		v.reset(OpRsh8x64)
  9598  		v.AddArg(x)
  9599  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9600  		v0.AuxInt = int64(uint16(c))
  9601  		v.AddArg(v0)
  9602  		return true
  9603  	}
  9604  	// match: (Rsh8x16   (Const8 [0]) _)
  9605  	// cond:
  9606  	// result: (Const8  [0])
  9607  	for {
  9608  		v_0 := v.Args[0]
  9609  		if v_0.Op != OpConst8 {
  9610  			break
  9611  		}
  9612  		if v_0.AuxInt != 0 {
  9613  			break
  9614  		}
  9615  		v.reset(OpConst8)
  9616  		v.AuxInt = 0
  9617  		return true
  9618  	}
  9619  	return false
  9620  }
  9621  func rewriteValuegeneric_OpRsh8x32(v *Value, config *Config) bool {
  9622  	b := v.Block
  9623  	_ = b
  9624  	// match: (Rsh8x32  <t> x (Const32 [c]))
  9625  	// cond:
  9626  	// result: (Rsh8x64  x (Const64 <t> [int64(uint32(c))]))
  9627  	for {
  9628  		t := v.Type
  9629  		x := v.Args[0]
  9630  		v_1 := v.Args[1]
  9631  		if v_1.Op != OpConst32 {
  9632  			break
  9633  		}
  9634  		c := v_1.AuxInt
  9635  		v.reset(OpRsh8x64)
  9636  		v.AddArg(x)
  9637  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9638  		v0.AuxInt = int64(uint32(c))
  9639  		v.AddArg(v0)
  9640  		return true
  9641  	}
  9642  	// match: (Rsh8x32   (Const8 [0]) _)
  9643  	// cond:
  9644  	// result: (Const8  [0])
  9645  	for {
  9646  		v_0 := v.Args[0]
  9647  		if v_0.Op != OpConst8 {
  9648  			break
  9649  		}
  9650  		if v_0.AuxInt != 0 {
  9651  			break
  9652  		}
  9653  		v.reset(OpConst8)
  9654  		v.AuxInt = 0
  9655  		return true
  9656  	}
  9657  	return false
  9658  }
  9659  func rewriteValuegeneric_OpRsh8x64(v *Value, config *Config) bool {
  9660  	b := v.Block
  9661  	_ = b
  9662  	// match: (Rsh8x64   (Const8  [c]) (Const64 [d]))
  9663  	// cond:
  9664  	// result: (Const8  [int64(int8(c) >> uint64(d))])
  9665  	for {
  9666  		v_0 := v.Args[0]
  9667  		if v_0.Op != OpConst8 {
  9668  			break
  9669  		}
  9670  		c := v_0.AuxInt
  9671  		v_1 := v.Args[1]
  9672  		if v_1.Op != OpConst64 {
  9673  			break
  9674  		}
  9675  		d := v_1.AuxInt
  9676  		v.reset(OpConst8)
  9677  		v.AuxInt = int64(int8(c) >> uint64(d))
  9678  		return true
  9679  	}
  9680  	// match: (Rsh8x64   x (Const64 [0]))
  9681  	// cond:
  9682  	// result: x
  9683  	for {
  9684  		x := v.Args[0]
  9685  		v_1 := v.Args[1]
  9686  		if v_1.Op != OpConst64 {
  9687  			break
  9688  		}
  9689  		if v_1.AuxInt != 0 {
  9690  			break
  9691  		}
  9692  		v.reset(OpCopy)
  9693  		v.Type = x.Type
  9694  		v.AddArg(x)
  9695  		return true
  9696  	}
  9697  	// match: (Rsh8x64   (Const8 [0]) _)
  9698  	// cond:
  9699  	// result: (Const8  [0])
  9700  	for {
  9701  		v_0 := v.Args[0]
  9702  		if v_0.Op != OpConst8 {
  9703  			break
  9704  		}
  9705  		if v_0.AuxInt != 0 {
  9706  			break
  9707  		}
  9708  		v.reset(OpConst8)
  9709  		v.AuxInt = 0
  9710  		return true
  9711  	}
  9712  	// match: (Rsh8x64  <t> (Rsh8x64  x (Const64 [c])) (Const64 [d]))
  9713  	// cond: !uaddOvf(c,d)
  9714  	// result: (Rsh8x64  x (Const64 <t> [c+d]))
  9715  	for {
  9716  		t := v.Type
  9717  		v_0 := v.Args[0]
  9718  		if v_0.Op != OpRsh8x64 {
  9719  			break
  9720  		}
  9721  		x := v_0.Args[0]
  9722  		v_0_1 := v_0.Args[1]
  9723  		if v_0_1.Op != OpConst64 {
  9724  			break
  9725  		}
  9726  		c := v_0_1.AuxInt
  9727  		v_1 := v.Args[1]
  9728  		if v_1.Op != OpConst64 {
  9729  			break
  9730  		}
  9731  		d := v_1.AuxInt
  9732  		if !(!uaddOvf(c, d)) {
  9733  			break
  9734  		}
  9735  		v.reset(OpRsh8x64)
  9736  		v.AddArg(x)
  9737  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9738  		v0.AuxInt = c + d
  9739  		v.AddArg(v0)
  9740  		return true
  9741  	}
  9742  	return false
  9743  }
  9744  func rewriteValuegeneric_OpRsh8x8(v *Value, config *Config) bool {
  9745  	b := v.Block
  9746  	_ = b
  9747  	// match: (Rsh8x8   <t> x (Const8  [c]))
  9748  	// cond:
  9749  	// result: (Rsh8x64  x (Const64 <t> [int64(uint8(c))]))
  9750  	for {
  9751  		t := v.Type
  9752  		x := v.Args[0]
  9753  		v_1 := v.Args[1]
  9754  		if v_1.Op != OpConst8 {
  9755  			break
  9756  		}
  9757  		c := v_1.AuxInt
  9758  		v.reset(OpRsh8x64)
  9759  		v.AddArg(x)
  9760  		v0 := b.NewValue0(v.Line, OpConst64, t)
  9761  		v0.AuxInt = int64(uint8(c))
  9762  		v.AddArg(v0)
  9763  		return true
  9764  	}
  9765  	// match: (Rsh8x8   (Const8 [0]) _)
  9766  	// cond:
  9767  	// result: (Const8  [0])
  9768  	for {
  9769  		v_0 := v.Args[0]
  9770  		if v_0.Op != OpConst8 {
  9771  			break
  9772  		}
  9773  		if v_0.AuxInt != 0 {
  9774  			break
  9775  		}
  9776  		v.reset(OpConst8)
  9777  		v.AuxInt = 0
  9778  		return true
  9779  	}
  9780  	return false
  9781  }
  9782  func rewriteValuegeneric_OpSignExt16to32(v *Value, config *Config) bool {
  9783  	b := v.Block
  9784  	_ = b
  9785  	// match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s]))))
  9786  	// cond: s >= 16
  9787  	// result: x
  9788  	for {
  9789  		v_0 := v.Args[0]
  9790  		if v_0.Op != OpTrunc32to16 {
  9791  			break
  9792  		}
  9793  		x := v_0.Args[0]
  9794  		if x.Op != OpRsh32x64 {
  9795  			break
  9796  		}
  9797  		x_1 := x.Args[1]
  9798  		if x_1.Op != OpConst64 {
  9799  			break
  9800  		}
  9801  		s := x_1.AuxInt
  9802  		if !(s >= 16) {
  9803  			break
  9804  		}
  9805  		v.reset(OpCopy)
  9806  		v.Type = x.Type
  9807  		v.AddArg(x)
  9808  		return true
  9809  	}
  9810  	return false
  9811  }
  9812  func rewriteValuegeneric_OpSignExt16to64(v *Value, config *Config) bool {
  9813  	b := v.Block
  9814  	_ = b
  9815  	// match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s]))))
  9816  	// cond: s >= 48
  9817  	// result: x
  9818  	for {
  9819  		v_0 := v.Args[0]
  9820  		if v_0.Op != OpTrunc64to16 {
  9821  			break
  9822  		}
  9823  		x := v_0.Args[0]
  9824  		if x.Op != OpRsh64x64 {
  9825  			break
  9826  		}
  9827  		x_1 := x.Args[1]
  9828  		if x_1.Op != OpConst64 {
  9829  			break
  9830  		}
  9831  		s := x_1.AuxInt
  9832  		if !(s >= 48) {
  9833  			break
  9834  		}
  9835  		v.reset(OpCopy)
  9836  		v.Type = x.Type
  9837  		v.AddArg(x)
  9838  		return true
  9839  	}
  9840  	return false
  9841  }
  9842  func rewriteValuegeneric_OpSignExt32to64(v *Value, config *Config) bool {
  9843  	b := v.Block
  9844  	_ = b
  9845  	// match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s]))))
  9846  	// cond: s >= 32
  9847  	// result: x
  9848  	for {
  9849  		v_0 := v.Args[0]
  9850  		if v_0.Op != OpTrunc64to32 {
  9851  			break
  9852  		}
  9853  		x := v_0.Args[0]
  9854  		if x.Op != OpRsh64x64 {
  9855  			break
  9856  		}
  9857  		x_1 := x.Args[1]
  9858  		if x_1.Op != OpConst64 {
  9859  			break
  9860  		}
  9861  		s := x_1.AuxInt
  9862  		if !(s >= 32) {
  9863  			break
  9864  		}
  9865  		v.reset(OpCopy)
  9866  		v.Type = x.Type
  9867  		v.AddArg(x)
  9868  		return true
  9869  	}
  9870  	return false
  9871  }
  9872  func rewriteValuegeneric_OpSignExt8to16(v *Value, config *Config) bool {
  9873  	b := v.Block
  9874  	_ = b
  9875  	// match: (SignExt8to16  (Trunc16to8  x:(Rsh16x64 _ (Const64 [s]))))
  9876  	// cond: s >= 8
  9877  	// result: x
  9878  	for {
  9879  		v_0 := v.Args[0]
  9880  		if v_0.Op != OpTrunc16to8 {
  9881  			break
  9882  		}
  9883  		x := v_0.Args[0]
  9884  		if x.Op != OpRsh16x64 {
  9885  			break
  9886  		}
  9887  		x_1 := x.Args[1]
  9888  		if x_1.Op != OpConst64 {
  9889  			break
  9890  		}
  9891  		s := x_1.AuxInt
  9892  		if !(s >= 8) {
  9893  			break
  9894  		}
  9895  		v.reset(OpCopy)
  9896  		v.Type = x.Type
  9897  		v.AddArg(x)
  9898  		return true
  9899  	}
  9900  	return false
  9901  }
  9902  func rewriteValuegeneric_OpSignExt8to32(v *Value, config *Config) bool {
  9903  	b := v.Block
  9904  	_ = b
  9905  	// match: (SignExt8to32  (Trunc32to8  x:(Rsh32x64 _ (Const64 [s]))))
  9906  	// cond: s >= 24
  9907  	// result: x
  9908  	for {
  9909  		v_0 := v.Args[0]
  9910  		if v_0.Op != OpTrunc32to8 {
  9911  			break
  9912  		}
  9913  		x := v_0.Args[0]
  9914  		if x.Op != OpRsh32x64 {
  9915  			break
  9916  		}
  9917  		x_1 := x.Args[1]
  9918  		if x_1.Op != OpConst64 {
  9919  			break
  9920  		}
  9921  		s := x_1.AuxInt
  9922  		if !(s >= 24) {
  9923  			break
  9924  		}
  9925  		v.reset(OpCopy)
  9926  		v.Type = x.Type
  9927  		v.AddArg(x)
  9928  		return true
  9929  	}
  9930  	return false
  9931  }
  9932  func rewriteValuegeneric_OpSignExt8to64(v *Value, config *Config) bool {
  9933  	b := v.Block
  9934  	_ = b
  9935  	// match: (SignExt8to64  (Trunc64to8  x:(Rsh64x64 _ (Const64 [s]))))
  9936  	// cond: s >= 56
  9937  	// result: x
  9938  	for {
  9939  		v_0 := v.Args[0]
  9940  		if v_0.Op != OpTrunc64to8 {
  9941  			break
  9942  		}
  9943  		x := v_0.Args[0]
  9944  		if x.Op != OpRsh64x64 {
  9945  			break
  9946  		}
  9947  		x_1 := x.Args[1]
  9948  		if x_1.Op != OpConst64 {
  9949  			break
  9950  		}
  9951  		s := x_1.AuxInt
  9952  		if !(s >= 56) {
  9953  			break
  9954  		}
  9955  		v.reset(OpCopy)
  9956  		v.Type = x.Type
  9957  		v.AddArg(x)
  9958  		return true
  9959  	}
  9960  	return false
  9961  }
  9962  func rewriteValuegeneric_OpSliceCap(v *Value, config *Config) bool {
  9963  	b := v.Block
  9964  	_ = b
  9965  	// match: (SliceCap (SliceMake _ _ (Const64 <t> [c])))
  9966  	// cond:
  9967  	// result: (Const64 <t> [c])
  9968  	for {
  9969  		v_0 := v.Args[0]
  9970  		if v_0.Op != OpSliceMake {
  9971  			break
  9972  		}
  9973  		v_0_2 := v_0.Args[2]
  9974  		if v_0_2.Op != OpConst64 {
  9975  			break
  9976  		}
  9977  		t := v_0_2.Type
  9978  		c := v_0_2.AuxInt
  9979  		v.reset(OpConst64)
  9980  		v.Type = t
  9981  		v.AuxInt = c
  9982  		return true
  9983  	}
  9984  	// match: (SliceCap (SliceMake _ _ (Const32 <t> [c])))
  9985  	// cond:
  9986  	// result: (Const32 <t> [c])
  9987  	for {
  9988  		v_0 := v.Args[0]
  9989  		if v_0.Op != OpSliceMake {
  9990  			break
  9991  		}
  9992  		v_0_2 := v_0.Args[2]
  9993  		if v_0_2.Op != OpConst32 {
  9994  			break
  9995  		}
  9996  		t := v_0_2.Type
  9997  		c := v_0_2.AuxInt
  9998  		v.reset(OpConst32)
  9999  		v.Type = t
 10000  		v.AuxInt = c
 10001  		return true
 10002  	}
 10003  	// match: (SliceCap (SliceMake _ _ (SliceCap x)))
 10004  	// cond:
 10005  	// result: (SliceCap x)
 10006  	for {
 10007  		v_0 := v.Args[0]
 10008  		if v_0.Op != OpSliceMake {
 10009  			break
 10010  		}
 10011  		v_0_2 := v_0.Args[2]
 10012  		if v_0_2.Op != OpSliceCap {
 10013  			break
 10014  		}
 10015  		x := v_0_2.Args[0]
 10016  		v.reset(OpSliceCap)
 10017  		v.AddArg(x)
 10018  		return true
 10019  	}
 10020  	// match: (SliceCap (SliceMake _ _ (SliceLen x)))
 10021  	// cond:
 10022  	// result: (SliceLen x)
 10023  	for {
 10024  		v_0 := v.Args[0]
 10025  		if v_0.Op != OpSliceMake {
 10026  			break
 10027  		}
 10028  		v_0_2 := v_0.Args[2]
 10029  		if v_0_2.Op != OpSliceLen {
 10030  			break
 10031  		}
 10032  		x := v_0_2.Args[0]
 10033  		v.reset(OpSliceLen)
 10034  		v.AddArg(x)
 10035  		return true
 10036  	}
 10037  	return false
 10038  }
 10039  func rewriteValuegeneric_OpSliceLen(v *Value, config *Config) bool {
 10040  	b := v.Block
 10041  	_ = b
 10042  	// match: (SliceLen (SliceMake _ (Const64 <t> [c]) _))
 10043  	// cond:
 10044  	// result: (Const64 <t> [c])
 10045  	for {
 10046  		v_0 := v.Args[0]
 10047  		if v_0.Op != OpSliceMake {
 10048  			break
 10049  		}
 10050  		v_0_1 := v_0.Args[1]
 10051  		if v_0_1.Op != OpConst64 {
 10052  			break
 10053  		}
 10054  		t := v_0_1.Type
 10055  		c := v_0_1.AuxInt
 10056  		v.reset(OpConst64)
 10057  		v.Type = t
 10058  		v.AuxInt = c
 10059  		return true
 10060  	}
 10061  	// match: (SliceLen (SliceMake _ (Const32 <t> [c]) _))
 10062  	// cond:
 10063  	// result: (Const32 <t> [c])
 10064  	for {
 10065  		v_0 := v.Args[0]
 10066  		if v_0.Op != OpSliceMake {
 10067  			break
 10068  		}
 10069  		v_0_1 := v_0.Args[1]
 10070  		if v_0_1.Op != OpConst32 {
 10071  			break
 10072  		}
 10073  		t := v_0_1.Type
 10074  		c := v_0_1.AuxInt
 10075  		v.reset(OpConst32)
 10076  		v.Type = t
 10077  		v.AuxInt = c
 10078  		return true
 10079  	}
 10080  	// match: (SliceLen (SliceMake _ (SliceLen x) _))
 10081  	// cond:
 10082  	// result: (SliceLen x)
 10083  	for {
 10084  		v_0 := v.Args[0]
 10085  		if v_0.Op != OpSliceMake {
 10086  			break
 10087  		}
 10088  		v_0_1 := v_0.Args[1]
 10089  		if v_0_1.Op != OpSliceLen {
 10090  			break
 10091  		}
 10092  		x := v_0_1.Args[0]
 10093  		v.reset(OpSliceLen)
 10094  		v.AddArg(x)
 10095  		return true
 10096  	}
 10097  	return false
 10098  }
 10099  func rewriteValuegeneric_OpSlicePtr(v *Value, config *Config) bool {
 10100  	b := v.Block
 10101  	_ = b
 10102  	// match: (SlicePtr (SliceMake (SlicePtr x) _ _))
 10103  	// cond:
 10104  	// result: (SlicePtr x)
 10105  	for {
 10106  		v_0 := v.Args[0]
 10107  		if v_0.Op != OpSliceMake {
 10108  			break
 10109  		}
 10110  		v_0_0 := v_0.Args[0]
 10111  		if v_0_0.Op != OpSlicePtr {
 10112  			break
 10113  		}
 10114  		x := v_0_0.Args[0]
 10115  		v.reset(OpSlicePtr)
 10116  		v.AddArg(x)
 10117  		return true
 10118  	}
 10119  	return false
 10120  }
 10121  func rewriteValuegeneric_OpSlicemask(v *Value, config *Config) bool {
 10122  	b := v.Block
 10123  	_ = b
 10124  	// match: (Slicemask (Const32 [x]))
 10125  	// cond: x > 0
 10126  	// result: (Const32 [-1])
 10127  	for {
 10128  		v_0 := v.Args[0]
 10129  		if v_0.Op != OpConst32 {
 10130  			break
 10131  		}
 10132  		x := v_0.AuxInt
 10133  		if !(x > 0) {
 10134  			break
 10135  		}
 10136  		v.reset(OpConst32)
 10137  		v.AuxInt = -1
 10138  		return true
 10139  	}
 10140  	// match: (Slicemask (Const32 [0]))
 10141  	// cond:
 10142  	// result: (Const32 [0])
 10143  	for {
 10144  		v_0 := v.Args[0]
 10145  		if v_0.Op != OpConst32 {
 10146  			break
 10147  		}
 10148  		if v_0.AuxInt != 0 {
 10149  			break
 10150  		}
 10151  		v.reset(OpConst32)
 10152  		v.AuxInt = 0
 10153  		return true
 10154  	}
 10155  	// match: (Slicemask (Const64 [x]))
 10156  	// cond: x > 0
 10157  	// result: (Const64 [-1])
 10158  	for {
 10159  		v_0 := v.Args[0]
 10160  		if v_0.Op != OpConst64 {
 10161  			break
 10162  		}
 10163  		x := v_0.AuxInt
 10164  		if !(x > 0) {
 10165  			break
 10166  		}
 10167  		v.reset(OpConst64)
 10168  		v.AuxInt = -1
 10169  		return true
 10170  	}
 10171  	// match: (Slicemask (Const64 [0]))
 10172  	// cond:
 10173  	// result: (Const64 [0])
 10174  	for {
 10175  		v_0 := v.Args[0]
 10176  		if v_0.Op != OpConst64 {
 10177  			break
 10178  		}
 10179  		if v_0.AuxInt != 0 {
 10180  			break
 10181  		}
 10182  		v.reset(OpConst64)
 10183  		v.AuxInt = 0
 10184  		return true
 10185  	}
 10186  	return false
 10187  }
 10188  func rewriteValuegeneric_OpSqrt(v *Value, config *Config) bool {
 10189  	b := v.Block
 10190  	_ = b
 10191  	// match: (Sqrt (Const64F [c]))
 10192  	// cond:
 10193  	// result: (Const64F [f2i(math.Sqrt(i2f(c)))])
 10194  	for {
 10195  		v_0 := v.Args[0]
 10196  		if v_0.Op != OpConst64F {
 10197  			break
 10198  		}
 10199  		c := v_0.AuxInt
 10200  		v.reset(OpConst64F)
 10201  		v.AuxInt = f2i(math.Sqrt(i2f(c)))
 10202  		return true
 10203  	}
 10204  	return false
 10205  }
 10206  func rewriteValuegeneric_OpStore(v *Value, config *Config) bool {
 10207  	b := v.Block
 10208  	_ = b
 10209  	// match: (Store _ (StructMake0) mem)
 10210  	// cond:
 10211  	// result: mem
 10212  	for {
 10213  		v_1 := v.Args[1]
 10214  		if v_1.Op != OpStructMake0 {
 10215  			break
 10216  		}
 10217  		mem := v.Args[2]
 10218  		v.reset(OpCopy)
 10219  		v.Type = mem.Type
 10220  		v.AddArg(mem)
 10221  		return true
 10222  	}
 10223  	// match: (Store dst (StructMake1 <t> f0) mem)
 10224  	// cond:
 10225  	// result: (Store [t.FieldType(0).Size()] dst f0 mem)
 10226  	for {
 10227  		dst := v.Args[0]
 10228  		v_1 := v.Args[1]
 10229  		if v_1.Op != OpStructMake1 {
 10230  			break
 10231  		}
 10232  		t := v_1.Type
 10233  		f0 := v_1.Args[0]
 10234  		mem := v.Args[2]
 10235  		v.reset(OpStore)
 10236  		v.AuxInt = t.FieldType(0).Size()
 10237  		v.AddArg(dst)
 10238  		v.AddArg(f0)
 10239  		v.AddArg(mem)
 10240  		return true
 10241  	}
 10242  	// match: (Store dst (StructMake2 <t> f0 f1) mem)
 10243  	// cond:
 10244  	// result: (Store [t.FieldType(1).Size()]     (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst)     f1     (Store [t.FieldType(0).Size()] dst f0 mem))
 10245  	for {
 10246  		dst := v.Args[0]
 10247  		v_1 := v.Args[1]
 10248  		if v_1.Op != OpStructMake2 {
 10249  			break
 10250  		}
 10251  		t := v_1.Type
 10252  		f0 := v_1.Args[0]
 10253  		f1 := v_1.Args[1]
 10254  		mem := v.Args[2]
 10255  		v.reset(OpStore)
 10256  		v.AuxInt = t.FieldType(1).Size()
 10257  		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 10258  		v0.AuxInt = t.FieldOff(1)
 10259  		v0.AddArg(dst)
 10260  		v.AddArg(v0)
 10261  		v.AddArg(f1)
 10262  		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 10263  		v1.AuxInt = t.FieldType(0).Size()
 10264  		v1.AddArg(dst)
 10265  		v1.AddArg(f0)
 10266  		v1.AddArg(mem)
 10267  		v.AddArg(v1)
 10268  		return true
 10269  	}
 10270  	// match: (Store dst (StructMake3 <t> f0 f1 f2) mem)
 10271  	// cond:
 10272  	// result: (Store [t.FieldType(2).Size()]     (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst)     f2     (Store [t.FieldType(1).Size()]       (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst)       f1       (Store [t.FieldType(0).Size()] dst f0 mem)))
 10273  	for {
 10274  		dst := v.Args[0]
 10275  		v_1 := v.Args[1]
 10276  		if v_1.Op != OpStructMake3 {
 10277  			break
 10278  		}
 10279  		t := v_1.Type
 10280  		f0 := v_1.Args[0]
 10281  		f1 := v_1.Args[1]
 10282  		f2 := v_1.Args[2]
 10283  		mem := v.Args[2]
 10284  		v.reset(OpStore)
 10285  		v.AuxInt = t.FieldType(2).Size()
 10286  		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
 10287  		v0.AuxInt = t.FieldOff(2)
 10288  		v0.AddArg(dst)
 10289  		v.AddArg(v0)
 10290  		v.AddArg(f2)
 10291  		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 10292  		v1.AuxInt = t.FieldType(1).Size()
 10293  		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 10294  		v2.AuxInt = t.FieldOff(1)
 10295  		v2.AddArg(dst)
 10296  		v1.AddArg(v2)
 10297  		v1.AddArg(f1)
 10298  		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
 10299  		v3.AuxInt = t.FieldType(0).Size()
 10300  		v3.AddArg(dst)
 10301  		v3.AddArg(f0)
 10302  		v3.AddArg(mem)
 10303  		v1.AddArg(v3)
 10304  		v.AddArg(v1)
 10305  		return true
 10306  	}
 10307  	// match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem)
 10308  	// cond:
 10309  	// result: (Store [t.FieldType(3).Size()]     (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] dst)     f3     (Store [t.FieldType(2).Size()]       (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst)       f2       (Store [t.FieldType(1).Size()]         (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst)         f1         (Store [t.FieldType(0).Size()] dst f0 mem))))
 10310  	for {
 10311  		dst := v.Args[0]
 10312  		v_1 := v.Args[1]
 10313  		if v_1.Op != OpStructMake4 {
 10314  			break
 10315  		}
 10316  		t := v_1.Type
 10317  		f0 := v_1.Args[0]
 10318  		f1 := v_1.Args[1]
 10319  		f2 := v_1.Args[2]
 10320  		f3 := v_1.Args[3]
 10321  		mem := v.Args[2]
 10322  		v.reset(OpStore)
 10323  		v.AuxInt = t.FieldType(3).Size()
 10324  		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(3).PtrTo())
 10325  		v0.AuxInt = t.FieldOff(3)
 10326  		v0.AddArg(dst)
 10327  		v.AddArg(v0)
 10328  		v.AddArg(f3)
 10329  		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 10330  		v1.AuxInt = t.FieldType(2).Size()
 10331  		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
 10332  		v2.AuxInt = t.FieldOff(2)
 10333  		v2.AddArg(dst)
 10334  		v1.AddArg(v2)
 10335  		v1.AddArg(f2)
 10336  		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
 10337  		v3.AuxInt = t.FieldType(1).Size()
 10338  		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 10339  		v4.AuxInt = t.FieldOff(1)
 10340  		v4.AddArg(dst)
 10341  		v3.AddArg(v4)
 10342  		v3.AddArg(f1)
 10343  		v5 := b.NewValue0(v.Line, OpStore, TypeMem)
 10344  		v5.AuxInt = t.FieldType(0).Size()
 10345  		v5.AddArg(dst)
 10346  		v5.AddArg(f0)
 10347  		v5.AddArg(mem)
 10348  		v3.AddArg(v5)
 10349  		v1.AddArg(v3)
 10350  		v.AddArg(v1)
 10351  		return true
 10352  	}
 10353  	// match: (Store [size] dst (Load <t> src mem) mem)
 10354  	// cond: !config.fe.CanSSA(t)
 10355  	// result: (Move [MakeSizeAndAlign(size, t.Alignment()).Int64()] dst src mem)
 10356  	for {
 10357  		size := v.AuxInt
 10358  		dst := v.Args[0]
 10359  		v_1 := v.Args[1]
 10360  		if v_1.Op != OpLoad {
 10361  			break
 10362  		}
 10363  		t := v_1.Type
 10364  		src := v_1.Args[0]
 10365  		mem := v_1.Args[1]
 10366  		if mem != v.Args[2] {
 10367  			break
 10368  		}
 10369  		if !(!config.fe.CanSSA(t)) {
 10370  			break
 10371  		}
 10372  		v.reset(OpMove)
 10373  		v.AuxInt = MakeSizeAndAlign(size, t.Alignment()).Int64()
 10374  		v.AddArg(dst)
 10375  		v.AddArg(src)
 10376  		v.AddArg(mem)
 10377  		return true
 10378  	}
 10379  	// match: (Store [size] dst (Load <t> src mem) (VarDef {x} mem))
 10380  	// cond: !config.fe.CanSSA(t)
 10381  	// result: (Move [MakeSizeAndAlign(size, t.Alignment()).Int64()] dst src (VarDef {x} mem))
 10382  	for {
 10383  		size := v.AuxInt
 10384  		dst := v.Args[0]
 10385  		v_1 := v.Args[1]
 10386  		if v_1.Op != OpLoad {
 10387  			break
 10388  		}
 10389  		t := v_1.Type
 10390  		src := v_1.Args[0]
 10391  		mem := v_1.Args[1]
 10392  		v_2 := v.Args[2]
 10393  		if v_2.Op != OpVarDef {
 10394  			break
 10395  		}
 10396  		x := v_2.Aux
 10397  		if mem != v_2.Args[0] {
 10398  			break
 10399  		}
 10400  		if !(!config.fe.CanSSA(t)) {
 10401  			break
 10402  		}
 10403  		v.reset(OpMove)
 10404  		v.AuxInt = MakeSizeAndAlign(size, t.Alignment()).Int64()
 10405  		v.AddArg(dst)
 10406  		v.AddArg(src)
 10407  		v0 := b.NewValue0(v.Line, OpVarDef, TypeMem)
 10408  		v0.Aux = x
 10409  		v0.AddArg(mem)
 10410  		v.AddArg(v0)
 10411  		return true
 10412  	}
 10413  	// match: (Store _ (ArrayMake0) mem)
 10414  	// cond:
 10415  	// result: mem
 10416  	for {
 10417  		v_1 := v.Args[1]
 10418  		if v_1.Op != OpArrayMake0 {
 10419  			break
 10420  		}
 10421  		mem := v.Args[2]
 10422  		v.reset(OpCopy)
 10423  		v.Type = mem.Type
 10424  		v.AddArg(mem)
 10425  		return true
 10426  	}
 10427  	// match: (Store [size] dst (ArrayMake1 e) mem)
 10428  	// cond:
 10429  	// result: (Store [size] dst e mem)
 10430  	for {
 10431  		size := v.AuxInt
 10432  		dst := v.Args[0]
 10433  		v_1 := v.Args[1]
 10434  		if v_1.Op != OpArrayMake1 {
 10435  			break
 10436  		}
 10437  		e := v_1.Args[0]
 10438  		mem := v.Args[2]
 10439  		v.reset(OpStore)
 10440  		v.AuxInt = size
 10441  		v.AddArg(dst)
 10442  		v.AddArg(e)
 10443  		v.AddArg(mem)
 10444  		return true
 10445  	}
 10446  	return false
 10447  }
 10448  func rewriteValuegeneric_OpStringLen(v *Value, config *Config) bool {
 10449  	b := v.Block
 10450  	_ = b
 10451  	// match: (StringLen (StringMake _ (Const64 <t> [c])))
 10452  	// cond:
 10453  	// result: (Const64 <t> [c])
 10454  	for {
 10455  		v_0 := v.Args[0]
 10456  		if v_0.Op != OpStringMake {
 10457  			break
 10458  		}
 10459  		v_0_1 := v_0.Args[1]
 10460  		if v_0_1.Op != OpConst64 {
 10461  			break
 10462  		}
 10463  		t := v_0_1.Type
 10464  		c := v_0_1.AuxInt
 10465  		v.reset(OpConst64)
 10466  		v.Type = t
 10467  		v.AuxInt = c
 10468  		return true
 10469  	}
 10470  	return false
 10471  }
 10472  func rewriteValuegeneric_OpStringPtr(v *Value, config *Config) bool {
 10473  	b := v.Block
 10474  	_ = b
 10475  	// match: (StringPtr (StringMake (Const64 <t> [c]) _))
 10476  	// cond:
 10477  	// result: (Const64 <t> [c])
 10478  	for {
 10479  		v_0 := v.Args[0]
 10480  		if v_0.Op != OpStringMake {
 10481  			break
 10482  		}
 10483  		v_0_0 := v_0.Args[0]
 10484  		if v_0_0.Op != OpConst64 {
 10485  			break
 10486  		}
 10487  		t := v_0_0.Type
 10488  		c := v_0_0.AuxInt
 10489  		v.reset(OpConst64)
 10490  		v.Type = t
 10491  		v.AuxInt = c
 10492  		return true
 10493  	}
 10494  	return false
 10495  }
 10496  func rewriteValuegeneric_OpStructSelect(v *Value, config *Config) bool {
 10497  	b := v.Block
 10498  	_ = b
 10499  	// match: (StructSelect (StructMake1 x))
 10500  	// cond:
 10501  	// result: x
 10502  	for {
 10503  		v_0 := v.Args[0]
 10504  		if v_0.Op != OpStructMake1 {
 10505  			break
 10506  		}
 10507  		x := v_0.Args[0]
 10508  		v.reset(OpCopy)
 10509  		v.Type = x.Type
 10510  		v.AddArg(x)
 10511  		return true
 10512  	}
 10513  	// match: (StructSelect [0] (StructMake2 x _))
 10514  	// cond:
 10515  	// result: x
 10516  	for {
 10517  		if v.AuxInt != 0 {
 10518  			break
 10519  		}
 10520  		v_0 := v.Args[0]
 10521  		if v_0.Op != OpStructMake2 {
 10522  			break
 10523  		}
 10524  		x := v_0.Args[0]
 10525  		v.reset(OpCopy)
 10526  		v.Type = x.Type
 10527  		v.AddArg(x)
 10528  		return true
 10529  	}
 10530  	// match: (StructSelect [1] (StructMake2 _ x))
 10531  	// cond:
 10532  	// result: x
 10533  	for {
 10534  		if v.AuxInt != 1 {
 10535  			break
 10536  		}
 10537  		v_0 := v.Args[0]
 10538  		if v_0.Op != OpStructMake2 {
 10539  			break
 10540  		}
 10541  		x := v_0.Args[1]
 10542  		v.reset(OpCopy)
 10543  		v.Type = x.Type
 10544  		v.AddArg(x)
 10545  		return true
 10546  	}
 10547  	// match: (StructSelect [0] (StructMake3 x _ _))
 10548  	// cond:
 10549  	// result: x
 10550  	for {
 10551  		if v.AuxInt != 0 {
 10552  			break
 10553  		}
 10554  		v_0 := v.Args[0]
 10555  		if v_0.Op != OpStructMake3 {
 10556  			break
 10557  		}
 10558  		x := v_0.Args[0]
 10559  		v.reset(OpCopy)
 10560  		v.Type = x.Type
 10561  		v.AddArg(x)
 10562  		return true
 10563  	}
 10564  	// match: (StructSelect [1] (StructMake3 _ x _))
 10565  	// cond:
 10566  	// result: x
 10567  	for {
 10568  		if v.AuxInt != 1 {
 10569  			break
 10570  		}
 10571  		v_0 := v.Args[0]
 10572  		if v_0.Op != OpStructMake3 {
 10573  			break
 10574  		}
 10575  		x := v_0.Args[1]
 10576  		v.reset(OpCopy)
 10577  		v.Type = x.Type
 10578  		v.AddArg(x)
 10579  		return true
 10580  	}
 10581  	// match: (StructSelect [2] (StructMake3 _ _ x))
 10582  	// cond:
 10583  	// result: x
 10584  	for {
 10585  		if v.AuxInt != 2 {
 10586  			break
 10587  		}
 10588  		v_0 := v.Args[0]
 10589  		if v_0.Op != OpStructMake3 {
 10590  			break
 10591  		}
 10592  		x := v_0.Args[2]
 10593  		v.reset(OpCopy)
 10594  		v.Type = x.Type
 10595  		v.AddArg(x)
 10596  		return true
 10597  	}
 10598  	// match: (StructSelect [0] (StructMake4 x _ _ _))
 10599  	// cond:
 10600  	// result: x
 10601  	for {
 10602  		if v.AuxInt != 0 {
 10603  			break
 10604  		}
 10605  		v_0 := v.Args[0]
 10606  		if v_0.Op != OpStructMake4 {
 10607  			break
 10608  		}
 10609  		x := v_0.Args[0]
 10610  		v.reset(OpCopy)
 10611  		v.Type = x.Type
 10612  		v.AddArg(x)
 10613  		return true
 10614  	}
 10615  	// match: (StructSelect [1] (StructMake4 _ x _ _))
 10616  	// cond:
 10617  	// result: x
 10618  	for {
 10619  		if v.AuxInt != 1 {
 10620  			break
 10621  		}
 10622  		v_0 := v.Args[0]
 10623  		if v_0.Op != OpStructMake4 {
 10624  			break
 10625  		}
 10626  		x := v_0.Args[1]
 10627  		v.reset(OpCopy)
 10628  		v.Type = x.Type
 10629  		v.AddArg(x)
 10630  		return true
 10631  	}
 10632  	// match: (StructSelect [2] (StructMake4 _ _ x _))
 10633  	// cond:
 10634  	// result: x
 10635  	for {
 10636  		if v.AuxInt != 2 {
 10637  			break
 10638  		}
 10639  		v_0 := v.Args[0]
 10640  		if v_0.Op != OpStructMake4 {
 10641  			break
 10642  		}
 10643  		x := v_0.Args[2]
 10644  		v.reset(OpCopy)
 10645  		v.Type = x.Type
 10646  		v.AddArg(x)
 10647  		return true
 10648  	}
 10649  	// match: (StructSelect [3] (StructMake4 _ _ _ x))
 10650  	// cond:
 10651  	// result: x
 10652  	for {
 10653  		if v.AuxInt != 3 {
 10654  			break
 10655  		}
 10656  		v_0 := v.Args[0]
 10657  		if v_0.Op != OpStructMake4 {
 10658  			break
 10659  		}
 10660  		x := v_0.Args[3]
 10661  		v.reset(OpCopy)
 10662  		v.Type = x.Type
 10663  		v.AddArg(x)
 10664  		return true
 10665  	}
 10666  	// match: (StructSelect [i] x:(Load <t> ptr mem))
 10667  	// cond: !config.fe.CanSSA(t)
 10668  	// result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem)
 10669  	for {
 10670  		i := v.AuxInt
 10671  		x := v.Args[0]
 10672  		if x.Op != OpLoad {
 10673  			break
 10674  		}
 10675  		t := x.Type
 10676  		ptr := x.Args[0]
 10677  		mem := x.Args[1]
 10678  		if !(!config.fe.CanSSA(t)) {
 10679  			break
 10680  		}
 10681  		b = x.Block
 10682  		v0 := b.NewValue0(v.Line, OpLoad, v.Type)
 10683  		v.reset(OpCopy)
 10684  		v.AddArg(v0)
 10685  		v1 := b.NewValue0(v.Line, OpOffPtr, v.Type.PtrTo())
 10686  		v1.AuxInt = t.FieldOff(int(i))
 10687  		v1.AddArg(ptr)
 10688  		v0.AddArg(v1)
 10689  		v0.AddArg(mem)
 10690  		return true
 10691  	}
 10692  	// match: (StructSelect [0] x:(IData _))
 10693  	// cond:
 10694  	// result: x
 10695  	for {
 10696  		if v.AuxInt != 0 {
 10697  			break
 10698  		}
 10699  		x := v.Args[0]
 10700  		if x.Op != OpIData {
 10701  			break
 10702  		}
 10703  		v.reset(OpCopy)
 10704  		v.Type = x.Type
 10705  		v.AddArg(x)
 10706  		return true
 10707  	}
 10708  	return false
 10709  }
 10710  func rewriteValuegeneric_OpSub16(v *Value, config *Config) bool {
 10711  	b := v.Block
 10712  	_ = b
 10713  	// match: (Sub16  (Const16 [c]) (Const16 [d]))
 10714  	// cond:
 10715  	// result: (Const16 [int64(int16(c-d))])
 10716  	for {
 10717  		v_0 := v.Args[0]
 10718  		if v_0.Op != OpConst16 {
 10719  			break
 10720  		}
 10721  		c := v_0.AuxInt
 10722  		v_1 := v.Args[1]
 10723  		if v_1.Op != OpConst16 {
 10724  			break
 10725  		}
 10726  		d := v_1.AuxInt
 10727  		v.reset(OpConst16)
 10728  		v.AuxInt = int64(int16(c - d))
 10729  		return true
 10730  	}
 10731  	// match: (Sub16 x (Const16 <t> [c]))
 10732  	// cond: x.Op != OpConst16
 10733  	// result: (Add16 (Const16 <t> [int64(int16(-c))]) x)
 10734  	for {
 10735  		x := v.Args[0]
 10736  		v_1 := v.Args[1]
 10737  		if v_1.Op != OpConst16 {
 10738  			break
 10739  		}
 10740  		t := v_1.Type
 10741  		c := v_1.AuxInt
 10742  		if !(x.Op != OpConst16) {
 10743  			break
 10744  		}
 10745  		v.reset(OpAdd16)
 10746  		v0 := b.NewValue0(v.Line, OpConst16, t)
 10747  		v0.AuxInt = int64(int16(-c))
 10748  		v.AddArg(v0)
 10749  		v.AddArg(x)
 10750  		return true
 10751  	}
 10752  	// match: (Sub16 x x)
 10753  	// cond:
 10754  	// result: (Const16 [0])
 10755  	for {
 10756  		x := v.Args[0]
 10757  		if x != v.Args[1] {
 10758  			break
 10759  		}
 10760  		v.reset(OpConst16)
 10761  		v.AuxInt = 0
 10762  		return true
 10763  	}
 10764  	// match: (Sub16 (Add16 x y) x)
 10765  	// cond:
 10766  	// result: y
 10767  	for {
 10768  		v_0 := v.Args[0]
 10769  		if v_0.Op != OpAdd16 {
 10770  			break
 10771  		}
 10772  		x := v_0.Args[0]
 10773  		y := v_0.Args[1]
 10774  		if x != v.Args[1] {
 10775  			break
 10776  		}
 10777  		v.reset(OpCopy)
 10778  		v.Type = y.Type
 10779  		v.AddArg(y)
 10780  		return true
 10781  	}
 10782  	// match: (Sub16 (Add16 x y) y)
 10783  	// cond:
 10784  	// result: x
 10785  	for {
 10786  		v_0 := v.Args[0]
 10787  		if v_0.Op != OpAdd16 {
 10788  			break
 10789  		}
 10790  		x := v_0.Args[0]
 10791  		y := v_0.Args[1]
 10792  		if y != v.Args[1] {
 10793  			break
 10794  		}
 10795  		v.reset(OpCopy)
 10796  		v.Type = x.Type
 10797  		v.AddArg(x)
 10798  		return true
 10799  	}
 10800  	return false
 10801  }
 10802  func rewriteValuegeneric_OpSub32(v *Value, config *Config) bool {
 10803  	b := v.Block
 10804  	_ = b
 10805  	// match: (Sub32  (Const32 [c]) (Const32 [d]))
 10806  	// cond:
 10807  	// result: (Const32 [int64(int32(c-d))])
 10808  	for {
 10809  		v_0 := v.Args[0]
 10810  		if v_0.Op != OpConst32 {
 10811  			break
 10812  		}
 10813  		c := v_0.AuxInt
 10814  		v_1 := v.Args[1]
 10815  		if v_1.Op != OpConst32 {
 10816  			break
 10817  		}
 10818  		d := v_1.AuxInt
 10819  		v.reset(OpConst32)
 10820  		v.AuxInt = int64(int32(c - d))
 10821  		return true
 10822  	}
 10823  	// match: (Sub32 x (Const32 <t> [c]))
 10824  	// cond: x.Op != OpConst32
 10825  	// result: (Add32 (Const32 <t> [int64(int32(-c))]) x)
 10826  	for {
 10827  		x := v.Args[0]
 10828  		v_1 := v.Args[1]
 10829  		if v_1.Op != OpConst32 {
 10830  			break
 10831  		}
 10832  		t := v_1.Type
 10833  		c := v_1.AuxInt
 10834  		if !(x.Op != OpConst32) {
 10835  			break
 10836  		}
 10837  		v.reset(OpAdd32)
 10838  		v0 := b.NewValue0(v.Line, OpConst32, t)
 10839  		v0.AuxInt = int64(int32(-c))
 10840  		v.AddArg(v0)
 10841  		v.AddArg(x)
 10842  		return true
 10843  	}
 10844  	// match: (Sub32 x x)
 10845  	// cond:
 10846  	// result: (Const32 [0])
 10847  	for {
 10848  		x := v.Args[0]
 10849  		if x != v.Args[1] {
 10850  			break
 10851  		}
 10852  		v.reset(OpConst32)
 10853  		v.AuxInt = 0
 10854  		return true
 10855  	}
 10856  	// match: (Sub32 (Add32 x y) x)
 10857  	// cond:
 10858  	// result: y
 10859  	for {
 10860  		v_0 := v.Args[0]
 10861  		if v_0.Op != OpAdd32 {
 10862  			break
 10863  		}
 10864  		x := v_0.Args[0]
 10865  		y := v_0.Args[1]
 10866  		if x != v.Args[1] {
 10867  			break
 10868  		}
 10869  		v.reset(OpCopy)
 10870  		v.Type = y.Type
 10871  		v.AddArg(y)
 10872  		return true
 10873  	}
 10874  	// match: (Sub32 (Add32 x y) y)
 10875  	// cond:
 10876  	// result: x
 10877  	for {
 10878  		v_0 := v.Args[0]
 10879  		if v_0.Op != OpAdd32 {
 10880  			break
 10881  		}
 10882  		x := v_0.Args[0]
 10883  		y := v_0.Args[1]
 10884  		if y != v.Args[1] {
 10885  			break
 10886  		}
 10887  		v.reset(OpCopy)
 10888  		v.Type = x.Type
 10889  		v.AddArg(x)
 10890  		return true
 10891  	}
 10892  	return false
 10893  }
 10894  func rewriteValuegeneric_OpSub32F(v *Value, config *Config) bool {
 10895  	b := v.Block
 10896  	_ = b
 10897  	// match: (Sub32F (Const32F [c]) (Const32F [d]))
 10898  	// cond:
 10899  	// result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))])
 10900  	for {
 10901  		v_0 := v.Args[0]
 10902  		if v_0.Op != OpConst32F {
 10903  			break
 10904  		}
 10905  		c := v_0.AuxInt
 10906  		v_1 := v.Args[1]
 10907  		if v_1.Op != OpConst32F {
 10908  			break
 10909  		}
 10910  		d := v_1.AuxInt
 10911  		v.reset(OpConst32F)
 10912  		v.AuxInt = f2i(float64(i2f32(c) - i2f32(d)))
 10913  		return true
 10914  	}
 10915  	// match: (Sub32F x (Const32F [0]))
 10916  	// cond:
 10917  	// result: x
 10918  	for {
 10919  		x := v.Args[0]
 10920  		v_1 := v.Args[1]
 10921  		if v_1.Op != OpConst32F {
 10922  			break
 10923  		}
 10924  		if v_1.AuxInt != 0 {
 10925  			break
 10926  		}
 10927  		v.reset(OpCopy)
 10928  		v.Type = x.Type
 10929  		v.AddArg(x)
 10930  		return true
 10931  	}
 10932  	return false
 10933  }
 10934  func rewriteValuegeneric_OpSub64(v *Value, config *Config) bool {
 10935  	b := v.Block
 10936  	_ = b
 10937  	// match: (Sub64  (Const64 [c]) (Const64 [d]))
 10938  	// cond:
 10939  	// result: (Const64 [c-d])
 10940  	for {
 10941  		v_0 := v.Args[0]
 10942  		if v_0.Op != OpConst64 {
 10943  			break
 10944  		}
 10945  		c := v_0.AuxInt
 10946  		v_1 := v.Args[1]
 10947  		if v_1.Op != OpConst64 {
 10948  			break
 10949  		}
 10950  		d := v_1.AuxInt
 10951  		v.reset(OpConst64)
 10952  		v.AuxInt = c - d
 10953  		return true
 10954  	}
 10955  	// match: (Sub64 x (Const64 <t> [c]))
 10956  	// cond: x.Op != OpConst64
 10957  	// result: (Add64 (Const64 <t> [-c]) x)
 10958  	for {
 10959  		x := v.Args[0]
 10960  		v_1 := v.Args[1]
 10961  		if v_1.Op != OpConst64 {
 10962  			break
 10963  		}
 10964  		t := v_1.Type
 10965  		c := v_1.AuxInt
 10966  		if !(x.Op != OpConst64) {
 10967  			break
 10968  		}
 10969  		v.reset(OpAdd64)
 10970  		v0 := b.NewValue0(v.Line, OpConst64, t)
 10971  		v0.AuxInt = -c
 10972  		v.AddArg(v0)
 10973  		v.AddArg(x)
 10974  		return true
 10975  	}
 10976  	// match: (Sub64 x x)
 10977  	// cond:
 10978  	// result: (Const64 [0])
 10979  	for {
 10980  		x := v.Args[0]
 10981  		if x != v.Args[1] {
 10982  			break
 10983  		}
 10984  		v.reset(OpConst64)
 10985  		v.AuxInt = 0
 10986  		return true
 10987  	}
 10988  	// match: (Sub64 (Add64 x y) x)
 10989  	// cond:
 10990  	// result: y
 10991  	for {
 10992  		v_0 := v.Args[0]
 10993  		if v_0.Op != OpAdd64 {
 10994  			break
 10995  		}
 10996  		x := v_0.Args[0]
 10997  		y := v_0.Args[1]
 10998  		if x != v.Args[1] {
 10999  			break
 11000  		}
 11001  		v.reset(OpCopy)
 11002  		v.Type = y.Type
 11003  		v.AddArg(y)
 11004  		return true
 11005  	}
 11006  	// match: (Sub64 (Add64 x y) y)
 11007  	// cond:
 11008  	// result: x
 11009  	for {
 11010  		v_0 := v.Args[0]
 11011  		if v_0.Op != OpAdd64 {
 11012  			break
 11013  		}
 11014  		x := v_0.Args[0]
 11015  		y := v_0.Args[1]
 11016  		if y != v.Args[1] {
 11017  			break
 11018  		}
 11019  		v.reset(OpCopy)
 11020  		v.Type = x.Type
 11021  		v.AddArg(x)
 11022  		return true
 11023  	}
 11024  	return false
 11025  }
 11026  func rewriteValuegeneric_OpSub64F(v *Value, config *Config) bool {
 11027  	b := v.Block
 11028  	_ = b
 11029  	// match: (Sub64F (Const64F [c]) (Const64F [d]))
 11030  	// cond:
 11031  	// result: (Const64F [f2i(i2f(c) - i2f(d))])
 11032  	for {
 11033  		v_0 := v.Args[0]
 11034  		if v_0.Op != OpConst64F {
 11035  			break
 11036  		}
 11037  		c := v_0.AuxInt
 11038  		v_1 := v.Args[1]
 11039  		if v_1.Op != OpConst64F {
 11040  			break
 11041  		}
 11042  		d := v_1.AuxInt
 11043  		v.reset(OpConst64F)
 11044  		v.AuxInt = f2i(i2f(c) - i2f(d))
 11045  		return true
 11046  	}
 11047  	// match: (Sub64F x (Const64F [0]))
 11048  	// cond:
 11049  	// result: x
 11050  	for {
 11051  		x := v.Args[0]
 11052  		v_1 := v.Args[1]
 11053  		if v_1.Op != OpConst64F {
 11054  			break
 11055  		}
 11056  		if v_1.AuxInt != 0 {
 11057  			break
 11058  		}
 11059  		v.reset(OpCopy)
 11060  		v.Type = x.Type
 11061  		v.AddArg(x)
 11062  		return true
 11063  	}
 11064  	return false
 11065  }
 11066  func rewriteValuegeneric_OpSub8(v *Value, config *Config) bool {
 11067  	b := v.Block
 11068  	_ = b
 11069  	// match: (Sub8   (Const8 [c]) (Const8 [d]))
 11070  	// cond:
 11071  	// result: (Const8 [int64(int8(c-d))])
 11072  	for {
 11073  		v_0 := v.Args[0]
 11074  		if v_0.Op != OpConst8 {
 11075  			break
 11076  		}
 11077  		c := v_0.AuxInt
 11078  		v_1 := v.Args[1]
 11079  		if v_1.Op != OpConst8 {
 11080  			break
 11081  		}
 11082  		d := v_1.AuxInt
 11083  		v.reset(OpConst8)
 11084  		v.AuxInt = int64(int8(c - d))
 11085  		return true
 11086  	}
 11087  	// match: (Sub8  x (Const8  <t> [c]))
 11088  	// cond: x.Op != OpConst8
 11089  	// result: (Add8  (Const8  <t> [int64(int8(-c))]) x)
 11090  	for {
 11091  		x := v.Args[0]
 11092  		v_1 := v.Args[1]
 11093  		if v_1.Op != OpConst8 {
 11094  			break
 11095  		}
 11096  		t := v_1.Type
 11097  		c := v_1.AuxInt
 11098  		if !(x.Op != OpConst8) {
 11099  			break
 11100  		}
 11101  		v.reset(OpAdd8)
 11102  		v0 := b.NewValue0(v.Line, OpConst8, t)
 11103  		v0.AuxInt = int64(int8(-c))
 11104  		v.AddArg(v0)
 11105  		v.AddArg(x)
 11106  		return true
 11107  	}
 11108  	// match: (Sub8  x x)
 11109  	// cond:
 11110  	// result: (Const8  [0])
 11111  	for {
 11112  		x := v.Args[0]
 11113  		if x != v.Args[1] {
 11114  			break
 11115  		}
 11116  		v.reset(OpConst8)
 11117  		v.AuxInt = 0
 11118  		return true
 11119  	}
 11120  	// match: (Sub8  (Add8  x y) x)
 11121  	// cond:
 11122  	// result: y
 11123  	for {
 11124  		v_0 := v.Args[0]
 11125  		if v_0.Op != OpAdd8 {
 11126  			break
 11127  		}
 11128  		x := v_0.Args[0]
 11129  		y := v_0.Args[1]
 11130  		if x != v.Args[1] {
 11131  			break
 11132  		}
 11133  		v.reset(OpCopy)
 11134  		v.Type = y.Type
 11135  		v.AddArg(y)
 11136  		return true
 11137  	}
 11138  	// match: (Sub8  (Add8  x y) y)
 11139  	// cond:
 11140  	// result: x
 11141  	for {
 11142  		v_0 := v.Args[0]
 11143  		if v_0.Op != OpAdd8 {
 11144  			break
 11145  		}
 11146  		x := v_0.Args[0]
 11147  		y := v_0.Args[1]
 11148  		if y != v.Args[1] {
 11149  			break
 11150  		}
 11151  		v.reset(OpCopy)
 11152  		v.Type = x.Type
 11153  		v.AddArg(x)
 11154  		return true
 11155  	}
 11156  	return false
 11157  }
 11158  func rewriteValuegeneric_OpTrunc16to8(v *Value, config *Config) bool {
 11159  	b := v.Block
 11160  	_ = b
 11161  	// match: (Trunc16to8  (Const16 [c]))
 11162  	// cond:
 11163  	// result: (Const8   [int64(int8(c))])
 11164  	for {
 11165  		v_0 := v.Args[0]
 11166  		if v_0.Op != OpConst16 {
 11167  			break
 11168  		}
 11169  		c := v_0.AuxInt
 11170  		v.reset(OpConst8)
 11171  		v.AuxInt = int64(int8(c))
 11172  		return true
 11173  	}
 11174  	// match: (Trunc16to8  (ZeroExt8to16  x))
 11175  	// cond:
 11176  	// result: x
 11177  	for {
 11178  		v_0 := v.Args[0]
 11179  		if v_0.Op != OpZeroExt8to16 {
 11180  			break
 11181  		}
 11182  		x := v_0.Args[0]
 11183  		v.reset(OpCopy)
 11184  		v.Type = x.Type
 11185  		v.AddArg(x)
 11186  		return true
 11187  	}
 11188  	// match: (Trunc16to8  (SignExt8to16  x))
 11189  	// cond:
 11190  	// result: x
 11191  	for {
 11192  		v_0 := v.Args[0]
 11193  		if v_0.Op != OpSignExt8to16 {
 11194  			break
 11195  		}
 11196  		x := v_0.Args[0]
 11197  		v.reset(OpCopy)
 11198  		v.Type = x.Type
 11199  		v.AddArg(x)
 11200  		return true
 11201  	}
 11202  	// match: (Trunc16to8  (And16 (Const16 [y]) x))
 11203  	// cond: y&0xFF == 0xFF
 11204  	// result: (Trunc16to8 x)
 11205  	for {
 11206  		v_0 := v.Args[0]
 11207  		if v_0.Op != OpAnd16 {
 11208  			break
 11209  		}
 11210  		v_0_0 := v_0.Args[0]
 11211  		if v_0_0.Op != OpConst16 {
 11212  			break
 11213  		}
 11214  		y := v_0_0.AuxInt
 11215  		x := v_0.Args[1]
 11216  		if !(y&0xFF == 0xFF) {
 11217  			break
 11218  		}
 11219  		v.reset(OpTrunc16to8)
 11220  		v.AddArg(x)
 11221  		return true
 11222  	}
 11223  	return false
 11224  }
 11225  func rewriteValuegeneric_OpTrunc32to16(v *Value, config *Config) bool {
 11226  	b := v.Block
 11227  	_ = b
 11228  	// match: (Trunc32to16 (Const32 [c]))
 11229  	// cond:
 11230  	// result: (Const16  [int64(int16(c))])
 11231  	for {
 11232  		v_0 := v.Args[0]
 11233  		if v_0.Op != OpConst32 {
 11234  			break
 11235  		}
 11236  		c := v_0.AuxInt
 11237  		v.reset(OpConst16)
 11238  		v.AuxInt = int64(int16(c))
 11239  		return true
 11240  	}
 11241  	// match: (Trunc32to16 (ZeroExt8to32  x))
 11242  	// cond:
 11243  	// result: (ZeroExt8to16  x)
 11244  	for {
 11245  		v_0 := v.Args[0]
 11246  		if v_0.Op != OpZeroExt8to32 {
 11247  			break
 11248  		}
 11249  		x := v_0.Args[0]
 11250  		v.reset(OpZeroExt8to16)
 11251  		v.AddArg(x)
 11252  		return true
 11253  	}
 11254  	// match: (Trunc32to16 (ZeroExt16to32 x))
 11255  	// cond:
 11256  	// result: x
 11257  	for {
 11258  		v_0 := v.Args[0]
 11259  		if v_0.Op != OpZeroExt16to32 {
 11260  			break
 11261  		}
 11262  		x := v_0.Args[0]
 11263  		v.reset(OpCopy)
 11264  		v.Type = x.Type
 11265  		v.AddArg(x)
 11266  		return true
 11267  	}
 11268  	// match: (Trunc32to16 (SignExt8to32  x))
 11269  	// cond:
 11270  	// result: (SignExt8to16  x)
 11271  	for {
 11272  		v_0 := v.Args[0]
 11273  		if v_0.Op != OpSignExt8to32 {
 11274  			break
 11275  		}
 11276  		x := v_0.Args[0]
 11277  		v.reset(OpSignExt8to16)
 11278  		v.AddArg(x)
 11279  		return true
 11280  	}
 11281  	// match: (Trunc32to16 (SignExt16to32 x))
 11282  	// cond:
 11283  	// result: x
 11284  	for {
 11285  		v_0 := v.Args[0]
 11286  		if v_0.Op != OpSignExt16to32 {
 11287  			break
 11288  		}
 11289  		x := v_0.Args[0]
 11290  		v.reset(OpCopy)
 11291  		v.Type = x.Type
 11292  		v.AddArg(x)
 11293  		return true
 11294  	}
 11295  	// match: (Trunc32to16 (And32 (Const32 [y]) x))
 11296  	// cond: y&0xFFFF == 0xFFFF
 11297  	// result: (Trunc32to16 x)
 11298  	for {
 11299  		v_0 := v.Args[0]
 11300  		if v_0.Op != OpAnd32 {
 11301  			break
 11302  		}
 11303  		v_0_0 := v_0.Args[0]
 11304  		if v_0_0.Op != OpConst32 {
 11305  			break
 11306  		}
 11307  		y := v_0_0.AuxInt
 11308  		x := v_0.Args[1]
 11309  		if !(y&0xFFFF == 0xFFFF) {
 11310  			break
 11311  		}
 11312  		v.reset(OpTrunc32to16)
 11313  		v.AddArg(x)
 11314  		return true
 11315  	}
 11316  	return false
 11317  }
 11318  func rewriteValuegeneric_OpTrunc32to8(v *Value, config *Config) bool {
 11319  	b := v.Block
 11320  	_ = b
 11321  	// match: (Trunc32to8  (Const32 [c]))
 11322  	// cond:
 11323  	// result: (Const8   [int64(int8(c))])
 11324  	for {
 11325  		v_0 := v.Args[0]
 11326  		if v_0.Op != OpConst32 {
 11327  			break
 11328  		}
 11329  		c := v_0.AuxInt
 11330  		v.reset(OpConst8)
 11331  		v.AuxInt = int64(int8(c))
 11332  		return true
 11333  	}
 11334  	// match: (Trunc32to8  (ZeroExt8to32  x))
 11335  	// cond:
 11336  	// result: x
 11337  	for {
 11338  		v_0 := v.Args[0]
 11339  		if v_0.Op != OpZeroExt8to32 {
 11340  			break
 11341  		}
 11342  		x := v_0.Args[0]
 11343  		v.reset(OpCopy)
 11344  		v.Type = x.Type
 11345  		v.AddArg(x)
 11346  		return true
 11347  	}
 11348  	// match: (Trunc32to8  (SignExt8to32  x))
 11349  	// cond:
 11350  	// result: x
 11351  	for {
 11352  		v_0 := v.Args[0]
 11353  		if v_0.Op != OpSignExt8to32 {
 11354  			break
 11355  		}
 11356  		x := v_0.Args[0]
 11357  		v.reset(OpCopy)
 11358  		v.Type = x.Type
 11359  		v.AddArg(x)
 11360  		return true
 11361  	}
 11362  	// match: (Trunc32to8  (And32 (Const32 [y]) x))
 11363  	// cond: y&0xFF == 0xFF
 11364  	// result: (Trunc32to8 x)
 11365  	for {
 11366  		v_0 := v.Args[0]
 11367  		if v_0.Op != OpAnd32 {
 11368  			break
 11369  		}
 11370  		v_0_0 := v_0.Args[0]
 11371  		if v_0_0.Op != OpConst32 {
 11372  			break
 11373  		}
 11374  		y := v_0_0.AuxInt
 11375  		x := v_0.Args[1]
 11376  		if !(y&0xFF == 0xFF) {
 11377  			break
 11378  		}
 11379  		v.reset(OpTrunc32to8)
 11380  		v.AddArg(x)
 11381  		return true
 11382  	}
 11383  	return false
 11384  }
 11385  func rewriteValuegeneric_OpTrunc64to16(v *Value, config *Config) bool {
 11386  	b := v.Block
 11387  	_ = b
 11388  	// match: (Trunc64to16 (Const64 [c]))
 11389  	// cond:
 11390  	// result: (Const16  [int64(int16(c))])
 11391  	for {
 11392  		v_0 := v.Args[0]
 11393  		if v_0.Op != OpConst64 {
 11394  			break
 11395  		}
 11396  		c := v_0.AuxInt
 11397  		v.reset(OpConst16)
 11398  		v.AuxInt = int64(int16(c))
 11399  		return true
 11400  	}
 11401  	// match: (Trunc64to16 (ZeroExt8to64  x))
 11402  	// cond:
 11403  	// result: (ZeroExt8to16  x)
 11404  	for {
 11405  		v_0 := v.Args[0]
 11406  		if v_0.Op != OpZeroExt8to64 {
 11407  			break
 11408  		}
 11409  		x := v_0.Args[0]
 11410  		v.reset(OpZeroExt8to16)
 11411  		v.AddArg(x)
 11412  		return true
 11413  	}
 11414  	// match: (Trunc64to16 (ZeroExt16to64 x))
 11415  	// cond:
 11416  	// result: x
 11417  	for {
 11418  		v_0 := v.Args[0]
 11419  		if v_0.Op != OpZeroExt16to64 {
 11420  			break
 11421  		}
 11422  		x := v_0.Args[0]
 11423  		v.reset(OpCopy)
 11424  		v.Type = x.Type
 11425  		v.AddArg(x)
 11426  		return true
 11427  	}
 11428  	// match: (Trunc64to16 (SignExt8to64  x))
 11429  	// cond:
 11430  	// result: (SignExt8to16  x)
 11431  	for {
 11432  		v_0 := v.Args[0]
 11433  		if v_0.Op != OpSignExt8to64 {
 11434  			break
 11435  		}
 11436  		x := v_0.Args[0]
 11437  		v.reset(OpSignExt8to16)
 11438  		v.AddArg(x)
 11439  		return true
 11440  	}
 11441  	// match: (Trunc64to16 (SignExt16to64 x))
 11442  	// cond:
 11443  	// result: x
 11444  	for {
 11445  		v_0 := v.Args[0]
 11446  		if v_0.Op != OpSignExt16to64 {
 11447  			break
 11448  		}
 11449  		x := v_0.Args[0]
 11450  		v.reset(OpCopy)
 11451  		v.Type = x.Type
 11452  		v.AddArg(x)
 11453  		return true
 11454  	}
 11455  	// match: (Trunc64to16 (And64 (Const64 [y]) x))
 11456  	// cond: y&0xFFFF == 0xFFFF
 11457  	// result: (Trunc64to16 x)
 11458  	for {
 11459  		v_0 := v.Args[0]
 11460  		if v_0.Op != OpAnd64 {
 11461  			break
 11462  		}
 11463  		v_0_0 := v_0.Args[0]
 11464  		if v_0_0.Op != OpConst64 {
 11465  			break
 11466  		}
 11467  		y := v_0_0.AuxInt
 11468  		x := v_0.Args[1]
 11469  		if !(y&0xFFFF == 0xFFFF) {
 11470  			break
 11471  		}
 11472  		v.reset(OpTrunc64to16)
 11473  		v.AddArg(x)
 11474  		return true
 11475  	}
 11476  	return false
 11477  }
 11478  func rewriteValuegeneric_OpTrunc64to32(v *Value, config *Config) bool {
 11479  	b := v.Block
 11480  	_ = b
 11481  	// match: (Trunc64to32 (Const64 [c]))
 11482  	// cond:
 11483  	// result: (Const32  [int64(int32(c))])
 11484  	for {
 11485  		v_0 := v.Args[0]
 11486  		if v_0.Op != OpConst64 {
 11487  			break
 11488  		}
 11489  		c := v_0.AuxInt
 11490  		v.reset(OpConst32)
 11491  		v.AuxInt = int64(int32(c))
 11492  		return true
 11493  	}
 11494  	// match: (Trunc64to32 (ZeroExt8to64  x))
 11495  	// cond:
 11496  	// result: (ZeroExt8to32  x)
 11497  	for {
 11498  		v_0 := v.Args[0]
 11499  		if v_0.Op != OpZeroExt8to64 {
 11500  			break
 11501  		}
 11502  		x := v_0.Args[0]
 11503  		v.reset(OpZeroExt8to32)
 11504  		v.AddArg(x)
 11505  		return true
 11506  	}
 11507  	// match: (Trunc64to32 (ZeroExt16to64 x))
 11508  	// cond:
 11509  	// result: (ZeroExt16to32 x)
 11510  	for {
 11511  		v_0 := v.Args[0]
 11512  		if v_0.Op != OpZeroExt16to64 {
 11513  			break
 11514  		}
 11515  		x := v_0.Args[0]
 11516  		v.reset(OpZeroExt16to32)
 11517  		v.AddArg(x)
 11518  		return true
 11519  	}
 11520  	// match: (Trunc64to32 (ZeroExt32to64 x))
 11521  	// cond:
 11522  	// result: x
 11523  	for {
 11524  		v_0 := v.Args[0]
 11525  		if v_0.Op != OpZeroExt32to64 {
 11526  			break
 11527  		}
 11528  		x := v_0.Args[0]
 11529  		v.reset(OpCopy)
 11530  		v.Type = x.Type
 11531  		v.AddArg(x)
 11532  		return true
 11533  	}
 11534  	// match: (Trunc64to32 (SignExt8to64  x))
 11535  	// cond:
 11536  	// result: (SignExt8to32  x)
 11537  	for {
 11538  		v_0 := v.Args[0]
 11539  		if v_0.Op != OpSignExt8to64 {
 11540  			break
 11541  		}
 11542  		x := v_0.Args[0]
 11543  		v.reset(OpSignExt8to32)
 11544  		v.AddArg(x)
 11545  		return true
 11546  	}
 11547  	// match: (Trunc64to32 (SignExt16to64 x))
 11548  	// cond:
 11549  	// result: (SignExt16to32 x)
 11550  	for {
 11551  		v_0 := v.Args[0]
 11552  		if v_0.Op != OpSignExt16to64 {
 11553  			break
 11554  		}
 11555  		x := v_0.Args[0]
 11556  		v.reset(OpSignExt16to32)
 11557  		v.AddArg(x)
 11558  		return true
 11559  	}
 11560  	// match: (Trunc64to32 (SignExt32to64 x))
 11561  	// cond:
 11562  	// result: x
 11563  	for {
 11564  		v_0 := v.Args[0]
 11565  		if v_0.Op != OpSignExt32to64 {
 11566  			break
 11567  		}
 11568  		x := v_0.Args[0]
 11569  		v.reset(OpCopy)
 11570  		v.Type = x.Type
 11571  		v.AddArg(x)
 11572  		return true
 11573  	}
 11574  	// match: (Trunc64to32 (And64 (Const64 [y]) x))
 11575  	// cond: y&0xFFFFFFFF == 0xFFFFFFFF
 11576  	// result: (Trunc64to32 x)
 11577  	for {
 11578  		v_0 := v.Args[0]
 11579  		if v_0.Op != OpAnd64 {
 11580  			break
 11581  		}
 11582  		v_0_0 := v_0.Args[0]
 11583  		if v_0_0.Op != OpConst64 {
 11584  			break
 11585  		}
 11586  		y := v_0_0.AuxInt
 11587  		x := v_0.Args[1]
 11588  		if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
 11589  			break
 11590  		}
 11591  		v.reset(OpTrunc64to32)
 11592  		v.AddArg(x)
 11593  		return true
 11594  	}
 11595  	return false
 11596  }
 11597  func rewriteValuegeneric_OpTrunc64to8(v *Value, config *Config) bool {
 11598  	b := v.Block
 11599  	_ = b
 11600  	// match: (Trunc64to8  (Const64 [c]))
 11601  	// cond:
 11602  	// result: (Const8   [int64(int8(c))])
 11603  	for {
 11604  		v_0 := v.Args[0]
 11605  		if v_0.Op != OpConst64 {
 11606  			break
 11607  		}
 11608  		c := v_0.AuxInt
 11609  		v.reset(OpConst8)
 11610  		v.AuxInt = int64(int8(c))
 11611  		return true
 11612  	}
 11613  	// match: (Trunc64to8  (ZeroExt8to64  x))
 11614  	// cond:
 11615  	// result: x
 11616  	for {
 11617  		v_0 := v.Args[0]
 11618  		if v_0.Op != OpZeroExt8to64 {
 11619  			break
 11620  		}
 11621  		x := v_0.Args[0]
 11622  		v.reset(OpCopy)
 11623  		v.Type = x.Type
 11624  		v.AddArg(x)
 11625  		return true
 11626  	}
 11627  	// match: (Trunc64to8  (SignExt8to64  x))
 11628  	// cond:
 11629  	// result: x
 11630  	for {
 11631  		v_0 := v.Args[0]
 11632  		if v_0.Op != OpSignExt8to64 {
 11633  			break
 11634  		}
 11635  		x := v_0.Args[0]
 11636  		v.reset(OpCopy)
 11637  		v.Type = x.Type
 11638  		v.AddArg(x)
 11639  		return true
 11640  	}
 11641  	// match: (Trunc64to8  (And64 (Const64 [y]) x))
 11642  	// cond: y&0xFF == 0xFF
 11643  	// result: (Trunc64to8 x)
 11644  	for {
 11645  		v_0 := v.Args[0]
 11646  		if v_0.Op != OpAnd64 {
 11647  			break
 11648  		}
 11649  		v_0_0 := v_0.Args[0]
 11650  		if v_0_0.Op != OpConst64 {
 11651  			break
 11652  		}
 11653  		y := v_0_0.AuxInt
 11654  		x := v_0.Args[1]
 11655  		if !(y&0xFF == 0xFF) {
 11656  			break
 11657  		}
 11658  		v.reset(OpTrunc64to8)
 11659  		v.AddArg(x)
 11660  		return true
 11661  	}
 11662  	return false
 11663  }
 11664  func rewriteValuegeneric_OpXor16(v *Value, config *Config) bool {
 11665  	b := v.Block
 11666  	_ = b
 11667  	// match: (Xor16 x (Const16 <t> [c]))
 11668  	// cond: x.Op != OpConst16
 11669  	// result: (Xor16 (Const16 <t> [c]) x)
 11670  	for {
 11671  		x := v.Args[0]
 11672  		v_1 := v.Args[1]
 11673  		if v_1.Op != OpConst16 {
 11674  			break
 11675  		}
 11676  		t := v_1.Type
 11677  		c := v_1.AuxInt
 11678  		if !(x.Op != OpConst16) {
 11679  			break
 11680  		}
 11681  		v.reset(OpXor16)
 11682  		v0 := b.NewValue0(v.Line, OpConst16, t)
 11683  		v0.AuxInt = c
 11684  		v.AddArg(v0)
 11685  		v.AddArg(x)
 11686  		return true
 11687  	}
 11688  	// match: (Xor16 x x)
 11689  	// cond:
 11690  	// result: (Const16 [0])
 11691  	for {
 11692  		x := v.Args[0]
 11693  		if x != v.Args[1] {
 11694  			break
 11695  		}
 11696  		v.reset(OpConst16)
 11697  		v.AuxInt = 0
 11698  		return true
 11699  	}
 11700  	// match: (Xor16 (Const16 [0]) x)
 11701  	// cond:
 11702  	// result: x
 11703  	for {
 11704  		v_0 := v.Args[0]
 11705  		if v_0.Op != OpConst16 {
 11706  			break
 11707  		}
 11708  		if v_0.AuxInt != 0 {
 11709  			break
 11710  		}
 11711  		x := v.Args[1]
 11712  		v.reset(OpCopy)
 11713  		v.Type = x.Type
 11714  		v.AddArg(x)
 11715  		return true
 11716  	}
 11717  	// match: (Xor16 x (Xor16 x y))
 11718  	// cond:
 11719  	// result: y
 11720  	for {
 11721  		x := v.Args[0]
 11722  		v_1 := v.Args[1]
 11723  		if v_1.Op != OpXor16 {
 11724  			break
 11725  		}
 11726  		if x != v_1.Args[0] {
 11727  			break
 11728  		}
 11729  		y := v_1.Args[1]
 11730  		v.reset(OpCopy)
 11731  		v.Type = y.Type
 11732  		v.AddArg(y)
 11733  		return true
 11734  	}
 11735  	// match: (Xor16 x (Xor16 y x))
 11736  	// cond:
 11737  	// result: y
 11738  	for {
 11739  		x := v.Args[0]
 11740  		v_1 := v.Args[1]
 11741  		if v_1.Op != OpXor16 {
 11742  			break
 11743  		}
 11744  		y := v_1.Args[0]
 11745  		if x != v_1.Args[1] {
 11746  			break
 11747  		}
 11748  		v.reset(OpCopy)
 11749  		v.Type = y.Type
 11750  		v.AddArg(y)
 11751  		return true
 11752  	}
 11753  	// match: (Xor16 (Xor16 x y) x)
 11754  	// cond:
 11755  	// result: y
 11756  	for {
 11757  		v_0 := v.Args[0]
 11758  		if v_0.Op != OpXor16 {
 11759  			break
 11760  		}
 11761  		x := v_0.Args[0]
 11762  		y := v_0.Args[1]
 11763  		if x != v.Args[1] {
 11764  			break
 11765  		}
 11766  		v.reset(OpCopy)
 11767  		v.Type = y.Type
 11768  		v.AddArg(y)
 11769  		return true
 11770  	}
 11771  	// match: (Xor16 (Xor16 x y) y)
 11772  	// cond:
 11773  	// result: x
 11774  	for {
 11775  		v_0 := v.Args[0]
 11776  		if v_0.Op != OpXor16 {
 11777  			break
 11778  		}
 11779  		x := v_0.Args[0]
 11780  		y := v_0.Args[1]
 11781  		if y != v.Args[1] {
 11782  			break
 11783  		}
 11784  		v.reset(OpCopy)
 11785  		v.Type = x.Type
 11786  		v.AddArg(x)
 11787  		return true
 11788  	}
 11789  	return false
 11790  }
 11791  func rewriteValuegeneric_OpXor32(v *Value, config *Config) bool {
 11792  	b := v.Block
 11793  	_ = b
 11794  	// match: (Xor32 x (Const32 <t> [c]))
 11795  	// cond: x.Op != OpConst32
 11796  	// result: (Xor32 (Const32 <t> [c]) x)
 11797  	for {
 11798  		x := v.Args[0]
 11799  		v_1 := v.Args[1]
 11800  		if v_1.Op != OpConst32 {
 11801  			break
 11802  		}
 11803  		t := v_1.Type
 11804  		c := v_1.AuxInt
 11805  		if !(x.Op != OpConst32) {
 11806  			break
 11807  		}
 11808  		v.reset(OpXor32)
 11809  		v0 := b.NewValue0(v.Line, OpConst32, t)
 11810  		v0.AuxInt = c
 11811  		v.AddArg(v0)
 11812  		v.AddArg(x)
 11813  		return true
 11814  	}
 11815  	// match: (Xor32 x x)
 11816  	// cond:
 11817  	// result: (Const32 [0])
 11818  	for {
 11819  		x := v.Args[0]
 11820  		if x != v.Args[1] {
 11821  			break
 11822  		}
 11823  		v.reset(OpConst32)
 11824  		v.AuxInt = 0
 11825  		return true
 11826  	}
 11827  	// match: (Xor32 (Const32 [0]) x)
 11828  	// cond:
 11829  	// result: x
 11830  	for {
 11831  		v_0 := v.Args[0]
 11832  		if v_0.Op != OpConst32 {
 11833  			break
 11834  		}
 11835  		if v_0.AuxInt != 0 {
 11836  			break
 11837  		}
 11838  		x := v.Args[1]
 11839  		v.reset(OpCopy)
 11840  		v.Type = x.Type
 11841  		v.AddArg(x)
 11842  		return true
 11843  	}
 11844  	// match: (Xor32 x (Xor32 x y))
 11845  	// cond:
 11846  	// result: y
 11847  	for {
 11848  		x := v.Args[0]
 11849  		v_1 := v.Args[1]
 11850  		if v_1.Op != OpXor32 {
 11851  			break
 11852  		}
 11853  		if x != v_1.Args[0] {
 11854  			break
 11855  		}
 11856  		y := v_1.Args[1]
 11857  		v.reset(OpCopy)
 11858  		v.Type = y.Type
 11859  		v.AddArg(y)
 11860  		return true
 11861  	}
 11862  	// match: (Xor32 x (Xor32 y x))
 11863  	// cond:
 11864  	// result: y
 11865  	for {
 11866  		x := v.Args[0]
 11867  		v_1 := v.Args[1]
 11868  		if v_1.Op != OpXor32 {
 11869  			break
 11870  		}
 11871  		y := v_1.Args[0]
 11872  		if x != v_1.Args[1] {
 11873  			break
 11874  		}
 11875  		v.reset(OpCopy)
 11876  		v.Type = y.Type
 11877  		v.AddArg(y)
 11878  		return true
 11879  	}
 11880  	// match: (Xor32 (Xor32 x y) x)
 11881  	// cond:
 11882  	// result: y
 11883  	for {
 11884  		v_0 := v.Args[0]
 11885  		if v_0.Op != OpXor32 {
 11886  			break
 11887  		}
 11888  		x := v_0.Args[0]
 11889  		y := v_0.Args[1]
 11890  		if x != v.Args[1] {
 11891  			break
 11892  		}
 11893  		v.reset(OpCopy)
 11894  		v.Type = y.Type
 11895  		v.AddArg(y)
 11896  		return true
 11897  	}
 11898  	// match: (Xor32 (Xor32 x y) y)
 11899  	// cond:
 11900  	// result: x
 11901  	for {
 11902  		v_0 := v.Args[0]
 11903  		if v_0.Op != OpXor32 {
 11904  			break
 11905  		}
 11906  		x := v_0.Args[0]
 11907  		y := v_0.Args[1]
 11908  		if y != v.Args[1] {
 11909  			break
 11910  		}
 11911  		v.reset(OpCopy)
 11912  		v.Type = x.Type
 11913  		v.AddArg(x)
 11914  		return true
 11915  	}
 11916  	return false
 11917  }
 11918  func rewriteValuegeneric_OpXor64(v *Value, config *Config) bool {
 11919  	b := v.Block
 11920  	_ = b
 11921  	// match: (Xor64 x (Const64 <t> [c]))
 11922  	// cond: x.Op != OpConst64
 11923  	// result: (Xor64 (Const64 <t> [c]) x)
 11924  	for {
 11925  		x := v.Args[0]
 11926  		v_1 := v.Args[1]
 11927  		if v_1.Op != OpConst64 {
 11928  			break
 11929  		}
 11930  		t := v_1.Type
 11931  		c := v_1.AuxInt
 11932  		if !(x.Op != OpConst64) {
 11933  			break
 11934  		}
 11935  		v.reset(OpXor64)
 11936  		v0 := b.NewValue0(v.Line, OpConst64, t)
 11937  		v0.AuxInt = c
 11938  		v.AddArg(v0)
 11939  		v.AddArg(x)
 11940  		return true
 11941  	}
 11942  	// match: (Xor64 x x)
 11943  	// cond:
 11944  	// result: (Const64 [0])
 11945  	for {
 11946  		x := v.Args[0]
 11947  		if x != v.Args[1] {
 11948  			break
 11949  		}
 11950  		v.reset(OpConst64)
 11951  		v.AuxInt = 0
 11952  		return true
 11953  	}
 11954  	// match: (Xor64 (Const64 [0]) x)
 11955  	// cond:
 11956  	// result: x
 11957  	for {
 11958  		v_0 := v.Args[0]
 11959  		if v_0.Op != OpConst64 {
 11960  			break
 11961  		}
 11962  		if v_0.AuxInt != 0 {
 11963  			break
 11964  		}
 11965  		x := v.Args[1]
 11966  		v.reset(OpCopy)
 11967  		v.Type = x.Type
 11968  		v.AddArg(x)
 11969  		return true
 11970  	}
 11971  	// match: (Xor64 x (Xor64 x y))
 11972  	// cond:
 11973  	// result: y
 11974  	for {
 11975  		x := v.Args[0]
 11976  		v_1 := v.Args[1]
 11977  		if v_1.Op != OpXor64 {
 11978  			break
 11979  		}
 11980  		if x != v_1.Args[0] {
 11981  			break
 11982  		}
 11983  		y := v_1.Args[1]
 11984  		v.reset(OpCopy)
 11985  		v.Type = y.Type
 11986  		v.AddArg(y)
 11987  		return true
 11988  	}
 11989  	// match: (Xor64 x (Xor64 y x))
 11990  	// cond:
 11991  	// result: y
 11992  	for {
 11993  		x := v.Args[0]
 11994  		v_1 := v.Args[1]
 11995  		if v_1.Op != OpXor64 {
 11996  			break
 11997  		}
 11998  		y := v_1.Args[0]
 11999  		if x != v_1.Args[1] {
 12000  			break
 12001  		}
 12002  		v.reset(OpCopy)
 12003  		v.Type = y.Type
 12004  		v.AddArg(y)
 12005  		return true
 12006  	}
 12007  	// match: (Xor64 (Xor64 x y) x)
 12008  	// cond:
 12009  	// result: y
 12010  	for {
 12011  		v_0 := v.Args[0]
 12012  		if v_0.Op != OpXor64 {
 12013  			break
 12014  		}
 12015  		x := v_0.Args[0]
 12016  		y := v_0.Args[1]
 12017  		if x != v.Args[1] {
 12018  			break
 12019  		}
 12020  		v.reset(OpCopy)
 12021  		v.Type = y.Type
 12022  		v.AddArg(y)
 12023  		return true
 12024  	}
 12025  	// match: (Xor64 (Xor64 x y) y)
 12026  	// cond:
 12027  	// result: x
 12028  	for {
 12029  		v_0 := v.Args[0]
 12030  		if v_0.Op != OpXor64 {
 12031  			break
 12032  		}
 12033  		x := v_0.Args[0]
 12034  		y := v_0.Args[1]
 12035  		if y != v.Args[1] {
 12036  			break
 12037  		}
 12038  		v.reset(OpCopy)
 12039  		v.Type = x.Type
 12040  		v.AddArg(x)
 12041  		return true
 12042  	}
 12043  	return false
 12044  }
 12045  func rewriteValuegeneric_OpXor8(v *Value, config *Config) bool {
 12046  	b := v.Block
 12047  	_ = b
 12048  	// match: (Xor8  x (Const8  <t> [c]))
 12049  	// cond: x.Op != OpConst8
 12050  	// result: (Xor8  (Const8  <t> [c]) x)
 12051  	for {
 12052  		x := v.Args[0]
 12053  		v_1 := v.Args[1]
 12054  		if v_1.Op != OpConst8 {
 12055  			break
 12056  		}
 12057  		t := v_1.Type
 12058  		c := v_1.AuxInt
 12059  		if !(x.Op != OpConst8) {
 12060  			break
 12061  		}
 12062  		v.reset(OpXor8)
 12063  		v0 := b.NewValue0(v.Line, OpConst8, t)
 12064  		v0.AuxInt = c
 12065  		v.AddArg(v0)
 12066  		v.AddArg(x)
 12067  		return true
 12068  	}
 12069  	// match: (Xor8  x x)
 12070  	// cond:
 12071  	// result: (Const8  [0])
 12072  	for {
 12073  		x := v.Args[0]
 12074  		if x != v.Args[1] {
 12075  			break
 12076  		}
 12077  		v.reset(OpConst8)
 12078  		v.AuxInt = 0
 12079  		return true
 12080  	}
 12081  	// match: (Xor8  (Const8  [0]) x)
 12082  	// cond:
 12083  	// result: x
 12084  	for {
 12085  		v_0 := v.Args[0]
 12086  		if v_0.Op != OpConst8 {
 12087  			break
 12088  		}
 12089  		if v_0.AuxInt != 0 {
 12090  			break
 12091  		}
 12092  		x := v.Args[1]
 12093  		v.reset(OpCopy)
 12094  		v.Type = x.Type
 12095  		v.AddArg(x)
 12096  		return true
 12097  	}
 12098  	// match: (Xor8  x (Xor8  x y))
 12099  	// cond:
 12100  	// result: y
 12101  	for {
 12102  		x := v.Args[0]
 12103  		v_1 := v.Args[1]
 12104  		if v_1.Op != OpXor8 {
 12105  			break
 12106  		}
 12107  		if x != v_1.Args[0] {
 12108  			break
 12109  		}
 12110  		y := v_1.Args[1]
 12111  		v.reset(OpCopy)
 12112  		v.Type = y.Type
 12113  		v.AddArg(y)
 12114  		return true
 12115  	}
 12116  	// match: (Xor8  x (Xor8  y x))
 12117  	// cond:
 12118  	// result: y
 12119  	for {
 12120  		x := v.Args[0]
 12121  		v_1 := v.Args[1]
 12122  		if v_1.Op != OpXor8 {
 12123  			break
 12124  		}
 12125  		y := v_1.Args[0]
 12126  		if x != v_1.Args[1] {
 12127  			break
 12128  		}
 12129  		v.reset(OpCopy)
 12130  		v.Type = y.Type
 12131  		v.AddArg(y)
 12132  		return true
 12133  	}
 12134  	// match: (Xor8  (Xor8  x y) x)
 12135  	// cond:
 12136  	// result: y
 12137  	for {
 12138  		v_0 := v.Args[0]
 12139  		if v_0.Op != OpXor8 {
 12140  			break
 12141  		}
 12142  		x := v_0.Args[0]
 12143  		y := v_0.Args[1]
 12144  		if x != v.Args[1] {
 12145  			break
 12146  		}
 12147  		v.reset(OpCopy)
 12148  		v.Type = y.Type
 12149  		v.AddArg(y)
 12150  		return true
 12151  	}
 12152  	// match: (Xor8  (Xor8  x y) y)
 12153  	// cond:
 12154  	// result: x
 12155  	for {
 12156  		v_0 := v.Args[0]
 12157  		if v_0.Op != OpXor8 {
 12158  			break
 12159  		}
 12160  		x := v_0.Args[0]
 12161  		y := v_0.Args[1]
 12162  		if y != v.Args[1] {
 12163  			break
 12164  		}
 12165  		v.reset(OpCopy)
 12166  		v.Type = x.Type
 12167  		v.AddArg(x)
 12168  		return true
 12169  	}
 12170  	return false
 12171  }
 12172  func rewriteValuegeneric_OpZero(v *Value, config *Config) bool {
 12173  	b := v.Block
 12174  	_ = b
 12175  	// match: (Zero (Load (OffPtr [c] (SP)) mem) mem)
 12176  	// cond: mem.Op == OpStaticCall 	&& isSameSym(mem.Aux, "runtime.newobject") 	&& c == config.ctxt.FixedFrameSize() + config.PtrSize
 12177  	// result: mem
 12178  	for {
 12179  		v_0 := v.Args[0]
 12180  		if v_0.Op != OpLoad {
 12181  			break
 12182  		}
 12183  		v_0_0 := v_0.Args[0]
 12184  		if v_0_0.Op != OpOffPtr {
 12185  			break
 12186  		}
 12187  		c := v_0_0.AuxInt
 12188  		v_0_0_0 := v_0_0.Args[0]
 12189  		if v_0_0_0.Op != OpSP {
 12190  			break
 12191  		}
 12192  		mem := v_0.Args[1]
 12193  		if mem != v.Args[1] {
 12194  			break
 12195  		}
 12196  		if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.PtrSize) {
 12197  			break
 12198  		}
 12199  		v.reset(OpCopy)
 12200  		v.Type = mem.Type
 12201  		v.AddArg(mem)
 12202  		return true
 12203  	}
 12204  	return false
 12205  }
 12206  func rewriteValuegeneric_OpZeroExt16to32(v *Value, config *Config) bool {
 12207  	b := v.Block
 12208  	_ = b
 12209  	// match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s]))))
 12210  	// cond: s >= 16
 12211  	// result: x
 12212  	for {
 12213  		v_0 := v.Args[0]
 12214  		if v_0.Op != OpTrunc32to16 {
 12215  			break
 12216  		}
 12217  		x := v_0.Args[0]
 12218  		if x.Op != OpRsh32Ux64 {
 12219  			break
 12220  		}
 12221  		x_1 := x.Args[1]
 12222  		if x_1.Op != OpConst64 {
 12223  			break
 12224  		}
 12225  		s := x_1.AuxInt
 12226  		if !(s >= 16) {
 12227  			break
 12228  		}
 12229  		v.reset(OpCopy)
 12230  		v.Type = x.Type
 12231  		v.AddArg(x)
 12232  		return true
 12233  	}
 12234  	return false
 12235  }
 12236  func rewriteValuegeneric_OpZeroExt16to64(v *Value, config *Config) bool {
 12237  	b := v.Block
 12238  	_ = b
 12239  	// match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s]))))
 12240  	// cond: s >= 48
 12241  	// result: x
 12242  	for {
 12243  		v_0 := v.Args[0]
 12244  		if v_0.Op != OpTrunc64to16 {
 12245  			break
 12246  		}
 12247  		x := v_0.Args[0]
 12248  		if x.Op != OpRsh64Ux64 {
 12249  			break
 12250  		}
 12251  		x_1 := x.Args[1]
 12252  		if x_1.Op != OpConst64 {
 12253  			break
 12254  		}
 12255  		s := x_1.AuxInt
 12256  		if !(s >= 48) {
 12257  			break
 12258  		}
 12259  		v.reset(OpCopy)
 12260  		v.Type = x.Type
 12261  		v.AddArg(x)
 12262  		return true
 12263  	}
 12264  	return false
 12265  }
 12266  func rewriteValuegeneric_OpZeroExt32to64(v *Value, config *Config) bool {
 12267  	b := v.Block
 12268  	_ = b
 12269  	// match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s]))))
 12270  	// cond: s >= 32
 12271  	// result: x
 12272  	for {
 12273  		v_0 := v.Args[0]
 12274  		if v_0.Op != OpTrunc64to32 {
 12275  			break
 12276  		}
 12277  		x := v_0.Args[0]
 12278  		if x.Op != OpRsh64Ux64 {
 12279  			break
 12280  		}
 12281  		x_1 := x.Args[1]
 12282  		if x_1.Op != OpConst64 {
 12283  			break
 12284  		}
 12285  		s := x_1.AuxInt
 12286  		if !(s >= 32) {
 12287  			break
 12288  		}
 12289  		v.reset(OpCopy)
 12290  		v.Type = x.Type
 12291  		v.AddArg(x)
 12292  		return true
 12293  	}
 12294  	return false
 12295  }
 12296  func rewriteValuegeneric_OpZeroExt8to16(v *Value, config *Config) bool {
 12297  	b := v.Block
 12298  	_ = b
 12299  	// match: (ZeroExt8to16  (Trunc16to8  x:(Rsh16Ux64 _ (Const64 [s]))))
 12300  	// cond: s >= 8
 12301  	// result: x
 12302  	for {
 12303  		v_0 := v.Args[0]
 12304  		if v_0.Op != OpTrunc16to8 {
 12305  			break
 12306  		}
 12307  		x := v_0.Args[0]
 12308  		if x.Op != OpRsh16Ux64 {
 12309  			break
 12310  		}
 12311  		x_1 := x.Args[1]
 12312  		if x_1.Op != OpConst64 {
 12313  			break
 12314  		}
 12315  		s := x_1.AuxInt
 12316  		if !(s >= 8) {
 12317  			break
 12318  		}
 12319  		v.reset(OpCopy)
 12320  		v.Type = x.Type
 12321  		v.AddArg(x)
 12322  		return true
 12323  	}
 12324  	return false
 12325  }
 12326  func rewriteValuegeneric_OpZeroExt8to32(v *Value, config *Config) bool {
 12327  	b := v.Block
 12328  	_ = b
 12329  	// match: (ZeroExt8to32  (Trunc32to8  x:(Rsh32Ux64 _ (Const64 [s]))))
 12330  	// cond: s >= 24
 12331  	// result: x
 12332  	for {
 12333  		v_0 := v.Args[0]
 12334  		if v_0.Op != OpTrunc32to8 {
 12335  			break
 12336  		}
 12337  		x := v_0.Args[0]
 12338  		if x.Op != OpRsh32Ux64 {
 12339  			break
 12340  		}
 12341  		x_1 := x.Args[1]
 12342  		if x_1.Op != OpConst64 {
 12343  			break
 12344  		}
 12345  		s := x_1.AuxInt
 12346  		if !(s >= 24) {
 12347  			break
 12348  		}
 12349  		v.reset(OpCopy)
 12350  		v.Type = x.Type
 12351  		v.AddArg(x)
 12352  		return true
 12353  	}
 12354  	return false
 12355  }
 12356  func rewriteValuegeneric_OpZeroExt8to64(v *Value, config *Config) bool {
 12357  	b := v.Block
 12358  	_ = b
 12359  	// match: (ZeroExt8to64  (Trunc64to8  x:(Rsh64Ux64 _ (Const64 [s]))))
 12360  	// cond: s >= 56
 12361  	// result: x
 12362  	for {
 12363  		v_0 := v.Args[0]
 12364  		if v_0.Op != OpTrunc64to8 {
 12365  			break
 12366  		}
 12367  		x := v_0.Args[0]
 12368  		if x.Op != OpRsh64Ux64 {
 12369  			break
 12370  		}
 12371  		x_1 := x.Args[1]
 12372  		if x_1.Op != OpConst64 {
 12373  			break
 12374  		}
 12375  		s := x_1.AuxInt
 12376  		if !(s >= 56) {
 12377  			break
 12378  		}
 12379  		v.reset(OpCopy)
 12380  		v.Type = x.Type
 12381  		v.AddArg(x)
 12382  		return true
 12383  	}
 12384  	return false
 12385  }
 12386  func rewriteBlockgeneric(b *Block, config *Config) bool {
 12387  	switch b.Kind {
 12388  	case BlockIf:
 12389  		// match: (If (Not cond) yes no)
 12390  		// cond:
 12391  		// result: (If cond no yes)
 12392  		for {
 12393  			v := b.Control
 12394  			if v.Op != OpNot {
 12395  				break
 12396  			}
 12397  			cond := v.Args[0]
 12398  			yes := b.Succs[0]
 12399  			no := b.Succs[1]
 12400  			b.Kind = BlockIf
 12401  			b.SetControl(cond)
 12402  			b.swapSuccessors()
 12403  			_ = no
 12404  			_ = yes
 12405  			return true
 12406  		}
 12407  		// match: (If (ConstBool [c]) yes no)
 12408  		// cond: c == 1
 12409  		// result: (First nil yes no)
 12410  		for {
 12411  			v := b.Control
 12412  			if v.Op != OpConstBool {
 12413  				break
 12414  			}
 12415  			c := v.AuxInt
 12416  			yes := b.Succs[0]
 12417  			no := b.Succs[1]
 12418  			if !(c == 1) {
 12419  				break
 12420  			}
 12421  			b.Kind = BlockFirst
 12422  			b.SetControl(nil)
 12423  			_ = yes
 12424  			_ = no
 12425  			return true
 12426  		}
 12427  		// match: (If (ConstBool [c]) yes no)
 12428  		// cond: c == 0
 12429  		// result: (First nil no yes)
 12430  		for {
 12431  			v := b.Control
 12432  			if v.Op != OpConstBool {
 12433  				break
 12434  			}
 12435  			c := v.AuxInt
 12436  			yes := b.Succs[0]
 12437  			no := b.Succs[1]
 12438  			if !(c == 0) {
 12439  				break
 12440  			}
 12441  			b.Kind = BlockFirst
 12442  			b.SetControl(nil)
 12443  			b.swapSuccessors()
 12444  			_ = no
 12445  			_ = yes
 12446  			return true
 12447  		}
 12448  	}
 12449  	return false
 12450  }