github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/cmd/compile/internal/ssa/rewritedec64.go (about)

     1  // autogenerated from gen/dec64.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 rewriteValuedec64(v *Value, config *Config) bool {
    10  	switch v.Op {
    11  	case OpAdd64:
    12  		return rewriteValuedec64_OpAdd64(v, config)
    13  	case OpAnd64:
    14  		return rewriteValuedec64_OpAnd64(v, config)
    15  	case OpArg:
    16  		return rewriteValuedec64_OpArg(v, config)
    17  	case OpBswap64:
    18  		return rewriteValuedec64_OpBswap64(v, config)
    19  	case OpCom64:
    20  		return rewriteValuedec64_OpCom64(v, config)
    21  	case OpConst64:
    22  		return rewriteValuedec64_OpConst64(v, config)
    23  	case OpCtz64:
    24  		return rewriteValuedec64_OpCtz64(v, config)
    25  	case OpEq64:
    26  		return rewriteValuedec64_OpEq64(v, config)
    27  	case OpGeq64:
    28  		return rewriteValuedec64_OpGeq64(v, config)
    29  	case OpGeq64U:
    30  		return rewriteValuedec64_OpGeq64U(v, config)
    31  	case OpGreater64:
    32  		return rewriteValuedec64_OpGreater64(v, config)
    33  	case OpGreater64U:
    34  		return rewriteValuedec64_OpGreater64U(v, config)
    35  	case OpInt64Hi:
    36  		return rewriteValuedec64_OpInt64Hi(v, config)
    37  	case OpInt64Lo:
    38  		return rewriteValuedec64_OpInt64Lo(v, config)
    39  	case OpLeq64:
    40  		return rewriteValuedec64_OpLeq64(v, config)
    41  	case OpLeq64U:
    42  		return rewriteValuedec64_OpLeq64U(v, config)
    43  	case OpLess64:
    44  		return rewriteValuedec64_OpLess64(v, config)
    45  	case OpLess64U:
    46  		return rewriteValuedec64_OpLess64U(v, config)
    47  	case OpLoad:
    48  		return rewriteValuedec64_OpLoad(v, config)
    49  	case OpLrot64:
    50  		return rewriteValuedec64_OpLrot64(v, config)
    51  	case OpLsh16x64:
    52  		return rewriteValuedec64_OpLsh16x64(v, config)
    53  	case OpLsh32x64:
    54  		return rewriteValuedec64_OpLsh32x64(v, config)
    55  	case OpLsh64x16:
    56  		return rewriteValuedec64_OpLsh64x16(v, config)
    57  	case OpLsh64x32:
    58  		return rewriteValuedec64_OpLsh64x32(v, config)
    59  	case OpLsh64x64:
    60  		return rewriteValuedec64_OpLsh64x64(v, config)
    61  	case OpLsh64x8:
    62  		return rewriteValuedec64_OpLsh64x8(v, config)
    63  	case OpLsh8x64:
    64  		return rewriteValuedec64_OpLsh8x64(v, config)
    65  	case OpMul64:
    66  		return rewriteValuedec64_OpMul64(v, config)
    67  	case OpNeg64:
    68  		return rewriteValuedec64_OpNeg64(v, config)
    69  	case OpNeq64:
    70  		return rewriteValuedec64_OpNeq64(v, config)
    71  	case OpOr64:
    72  		return rewriteValuedec64_OpOr64(v, config)
    73  	case OpRsh16Ux64:
    74  		return rewriteValuedec64_OpRsh16Ux64(v, config)
    75  	case OpRsh16x64:
    76  		return rewriteValuedec64_OpRsh16x64(v, config)
    77  	case OpRsh32Ux64:
    78  		return rewriteValuedec64_OpRsh32Ux64(v, config)
    79  	case OpRsh32x64:
    80  		return rewriteValuedec64_OpRsh32x64(v, config)
    81  	case OpRsh64Ux16:
    82  		return rewriteValuedec64_OpRsh64Ux16(v, config)
    83  	case OpRsh64Ux32:
    84  		return rewriteValuedec64_OpRsh64Ux32(v, config)
    85  	case OpRsh64Ux64:
    86  		return rewriteValuedec64_OpRsh64Ux64(v, config)
    87  	case OpRsh64Ux8:
    88  		return rewriteValuedec64_OpRsh64Ux8(v, config)
    89  	case OpRsh64x16:
    90  		return rewriteValuedec64_OpRsh64x16(v, config)
    91  	case OpRsh64x32:
    92  		return rewriteValuedec64_OpRsh64x32(v, config)
    93  	case OpRsh64x64:
    94  		return rewriteValuedec64_OpRsh64x64(v, config)
    95  	case OpRsh64x8:
    96  		return rewriteValuedec64_OpRsh64x8(v, config)
    97  	case OpRsh8Ux64:
    98  		return rewriteValuedec64_OpRsh8Ux64(v, config)
    99  	case OpRsh8x64:
   100  		return rewriteValuedec64_OpRsh8x64(v, config)
   101  	case OpSignExt16to64:
   102  		return rewriteValuedec64_OpSignExt16to64(v, config)
   103  	case OpSignExt32to64:
   104  		return rewriteValuedec64_OpSignExt32to64(v, config)
   105  	case OpSignExt8to64:
   106  		return rewriteValuedec64_OpSignExt8to64(v, config)
   107  	case OpStore:
   108  		return rewriteValuedec64_OpStore(v, config)
   109  	case OpSub64:
   110  		return rewriteValuedec64_OpSub64(v, config)
   111  	case OpTrunc64to16:
   112  		return rewriteValuedec64_OpTrunc64to16(v, config)
   113  	case OpTrunc64to32:
   114  		return rewriteValuedec64_OpTrunc64to32(v, config)
   115  	case OpTrunc64to8:
   116  		return rewriteValuedec64_OpTrunc64to8(v, config)
   117  	case OpXor64:
   118  		return rewriteValuedec64_OpXor64(v, config)
   119  	case OpZeroExt16to64:
   120  		return rewriteValuedec64_OpZeroExt16to64(v, config)
   121  	case OpZeroExt32to64:
   122  		return rewriteValuedec64_OpZeroExt32to64(v, config)
   123  	case OpZeroExt8to64:
   124  		return rewriteValuedec64_OpZeroExt8to64(v, config)
   125  	}
   126  	return false
   127  }
   128  func rewriteValuedec64_OpAdd64(v *Value, config *Config) bool {
   129  	b := v.Block
   130  	_ = b
   131  	// match: (Add64 x y)
   132  	// cond:
   133  	// result: (Int64Make 		(Add32withcarry <config.fe.TypeInt32()> 			(Int64Hi x) 			(Int64Hi y) 			(Select1 <TypeFlags> (Add32carry (Int64Lo x) (Int64Lo y)))) 		(Select0 <config.fe.TypeUInt32()> (Add32carry (Int64Lo x) (Int64Lo y))))
   134  	for {
   135  		x := v.Args[0]
   136  		y := v.Args[1]
   137  		v.reset(OpInt64Make)
   138  		v0 := b.NewValue0(v.Line, OpAdd32withcarry, config.fe.TypeInt32())
   139  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   140  		v1.AddArg(x)
   141  		v0.AddArg(v1)
   142  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   143  		v2.AddArg(y)
   144  		v0.AddArg(v2)
   145  		v3 := b.NewValue0(v.Line, OpSelect1, TypeFlags)
   146  		v4 := b.NewValue0(v.Line, OpAdd32carry, MakeTuple(config.fe.TypeUInt32(), TypeFlags))
   147  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   148  		v5.AddArg(x)
   149  		v4.AddArg(v5)
   150  		v6 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   151  		v6.AddArg(y)
   152  		v4.AddArg(v6)
   153  		v3.AddArg(v4)
   154  		v0.AddArg(v3)
   155  		v.AddArg(v0)
   156  		v7 := b.NewValue0(v.Line, OpSelect0, config.fe.TypeUInt32())
   157  		v8 := b.NewValue0(v.Line, OpAdd32carry, MakeTuple(config.fe.TypeUInt32(), TypeFlags))
   158  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   159  		v9.AddArg(x)
   160  		v8.AddArg(v9)
   161  		v10 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   162  		v10.AddArg(y)
   163  		v8.AddArg(v10)
   164  		v7.AddArg(v8)
   165  		v.AddArg(v7)
   166  		return true
   167  	}
   168  }
   169  func rewriteValuedec64_OpAnd64(v *Value, config *Config) bool {
   170  	b := v.Block
   171  	_ = b
   172  	// match: (And64 x y)
   173  	// cond:
   174  	// result: (Int64Make 		(And32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Hi y)) 		(And32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Lo y)))
   175  	for {
   176  		x := v.Args[0]
   177  		y := v.Args[1]
   178  		v.reset(OpInt64Make)
   179  		v0 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
   180  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   181  		v1.AddArg(x)
   182  		v0.AddArg(v1)
   183  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   184  		v2.AddArg(y)
   185  		v0.AddArg(v2)
   186  		v.AddArg(v0)
   187  		v3 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
   188  		v4 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   189  		v4.AddArg(x)
   190  		v3.AddArg(v4)
   191  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   192  		v5.AddArg(y)
   193  		v3.AddArg(v5)
   194  		v.AddArg(v3)
   195  		return true
   196  	}
   197  }
   198  func rewriteValuedec64_OpArg(v *Value, config *Config) bool {
   199  	b := v.Block
   200  	_ = b
   201  	// match: (Arg {n} [off])
   202  	// cond: is64BitInt(v.Type) && v.Type.IsSigned()
   203  	// result: (Int64Make     (Arg <config.fe.TypeInt32()> {n} [off+4])     (Arg <config.fe.TypeUInt32()> {n} [off]))
   204  	for {
   205  		off := v.AuxInt
   206  		n := v.Aux
   207  		if !(is64BitInt(v.Type) && v.Type.IsSigned()) {
   208  			break
   209  		}
   210  		v.reset(OpInt64Make)
   211  		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt32())
   212  		v0.AuxInt = off + 4
   213  		v0.Aux = n
   214  		v.AddArg(v0)
   215  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeUInt32())
   216  		v1.AuxInt = off
   217  		v1.Aux = n
   218  		v.AddArg(v1)
   219  		return true
   220  	}
   221  	// match: (Arg {n} [off])
   222  	// cond: is64BitInt(v.Type) && !v.Type.IsSigned()
   223  	// result: (Int64Make     (Arg <config.fe.TypeUInt32()> {n} [off+4])     (Arg <config.fe.TypeUInt32()> {n} [off]))
   224  	for {
   225  		off := v.AuxInt
   226  		n := v.Aux
   227  		if !(is64BitInt(v.Type) && !v.Type.IsSigned()) {
   228  			break
   229  		}
   230  		v.reset(OpInt64Make)
   231  		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeUInt32())
   232  		v0.AuxInt = off + 4
   233  		v0.Aux = n
   234  		v.AddArg(v0)
   235  		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeUInt32())
   236  		v1.AuxInt = off
   237  		v1.Aux = n
   238  		v.AddArg(v1)
   239  		return true
   240  	}
   241  	return false
   242  }
   243  func rewriteValuedec64_OpBswap64(v *Value, config *Config) bool {
   244  	b := v.Block
   245  	_ = b
   246  	// match: (Bswap64 x)
   247  	// cond:
   248  	// result: (Int64Make 		(Bswap32 <config.fe.TypeUInt32()> (Int64Lo x)) 		(Bswap32 <config.fe.TypeUInt32()> (Int64Hi x)))
   249  	for {
   250  		x := v.Args[0]
   251  		v.reset(OpInt64Make)
   252  		v0 := b.NewValue0(v.Line, OpBswap32, config.fe.TypeUInt32())
   253  		v1 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   254  		v1.AddArg(x)
   255  		v0.AddArg(v1)
   256  		v.AddArg(v0)
   257  		v2 := b.NewValue0(v.Line, OpBswap32, config.fe.TypeUInt32())
   258  		v3 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   259  		v3.AddArg(x)
   260  		v2.AddArg(v3)
   261  		v.AddArg(v2)
   262  		return true
   263  	}
   264  }
   265  func rewriteValuedec64_OpCom64(v *Value, config *Config) bool {
   266  	b := v.Block
   267  	_ = b
   268  	// match: (Com64 x)
   269  	// cond:
   270  	// result: (Int64Make 		(Com32 <config.fe.TypeUInt32()> (Int64Hi x)) 		(Com32 <config.fe.TypeUInt32()> (Int64Lo x)))
   271  	for {
   272  		x := v.Args[0]
   273  		v.reset(OpInt64Make)
   274  		v0 := b.NewValue0(v.Line, OpCom32, config.fe.TypeUInt32())
   275  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   276  		v1.AddArg(x)
   277  		v0.AddArg(v1)
   278  		v.AddArg(v0)
   279  		v2 := b.NewValue0(v.Line, OpCom32, config.fe.TypeUInt32())
   280  		v3 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   281  		v3.AddArg(x)
   282  		v2.AddArg(v3)
   283  		v.AddArg(v2)
   284  		return true
   285  	}
   286  }
   287  func rewriteValuedec64_OpConst64(v *Value, config *Config) bool {
   288  	b := v.Block
   289  	_ = b
   290  	// match: (Const64 <t> [c])
   291  	// cond: t.IsSigned()
   292  	// result: (Int64Make (Const32 <config.fe.TypeInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [int64(int32(c))]))
   293  	for {
   294  		t := v.Type
   295  		c := v.AuxInt
   296  		if !(t.IsSigned()) {
   297  			break
   298  		}
   299  		v.reset(OpInt64Make)
   300  		v0 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt32())
   301  		v0.AuxInt = c >> 32
   302  		v.AddArg(v0)
   303  		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   304  		v1.AuxInt = int64(int32(c))
   305  		v.AddArg(v1)
   306  		return true
   307  	}
   308  	// match: (Const64 <t> [c])
   309  	// cond: !t.IsSigned()
   310  	// result: (Int64Make (Const32 <config.fe.TypeUInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [int64(int32(c))]))
   311  	for {
   312  		t := v.Type
   313  		c := v.AuxInt
   314  		if !(!t.IsSigned()) {
   315  			break
   316  		}
   317  		v.reset(OpInt64Make)
   318  		v0 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   319  		v0.AuxInt = c >> 32
   320  		v.AddArg(v0)
   321  		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   322  		v1.AuxInt = int64(int32(c))
   323  		v.AddArg(v1)
   324  		return true
   325  	}
   326  	return false
   327  }
   328  func rewriteValuedec64_OpCtz64(v *Value, config *Config) bool {
   329  	b := v.Block
   330  	_ = b
   331  	// match: (Ctz64 x)
   332  	// cond:
   333  	// result: (Int64Make 		(Const32 <config.fe.TypeUInt32()> [0]) 		(Add32 <config.fe.TypeUInt32()> 			(Ctz32 <config.fe.TypeUInt32()> (Int64Lo x)) 			(And32 <config.fe.TypeUInt32()> 				(Com32 <config.fe.TypeUInt32()> (Zeromask (Int64Lo x))) 				(Ctz32 <config.fe.TypeUInt32()> (Int64Hi x)))))
   334  	for {
   335  		x := v.Args[0]
   336  		v.reset(OpInt64Make)
   337  		v0 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   338  		v0.AuxInt = 0
   339  		v.AddArg(v0)
   340  		v1 := b.NewValue0(v.Line, OpAdd32, config.fe.TypeUInt32())
   341  		v2 := b.NewValue0(v.Line, OpCtz32, config.fe.TypeUInt32())
   342  		v3 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   343  		v3.AddArg(x)
   344  		v2.AddArg(v3)
   345  		v1.AddArg(v2)
   346  		v4 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
   347  		v5 := b.NewValue0(v.Line, OpCom32, config.fe.TypeUInt32())
   348  		v6 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
   349  		v7 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   350  		v7.AddArg(x)
   351  		v6.AddArg(v7)
   352  		v5.AddArg(v6)
   353  		v4.AddArg(v5)
   354  		v8 := b.NewValue0(v.Line, OpCtz32, config.fe.TypeUInt32())
   355  		v9 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   356  		v9.AddArg(x)
   357  		v8.AddArg(v9)
   358  		v4.AddArg(v8)
   359  		v1.AddArg(v4)
   360  		v.AddArg(v1)
   361  		return true
   362  	}
   363  }
   364  func rewriteValuedec64_OpEq64(v *Value, config *Config) bool {
   365  	b := v.Block
   366  	_ = b
   367  	// match: (Eq64 x y)
   368  	// cond:
   369  	// result: (AndB 		(Eq32 (Int64Hi x) (Int64Hi y)) 		(Eq32 (Int64Lo x) (Int64Lo y)))
   370  	for {
   371  		x := v.Args[0]
   372  		y := v.Args[1]
   373  		v.reset(OpAndB)
   374  		v0 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   375  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   376  		v1.AddArg(x)
   377  		v0.AddArg(v1)
   378  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   379  		v2.AddArg(y)
   380  		v0.AddArg(v2)
   381  		v.AddArg(v0)
   382  		v3 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   383  		v4 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   384  		v4.AddArg(x)
   385  		v3.AddArg(v4)
   386  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   387  		v5.AddArg(y)
   388  		v3.AddArg(v5)
   389  		v.AddArg(v3)
   390  		return true
   391  	}
   392  }
   393  func rewriteValuedec64_OpGeq64(v *Value, config *Config) bool {
   394  	b := v.Block
   395  	_ = b
   396  	// match: (Geq64 x y)
   397  	// cond:
   398  	// result: (OrB 		(Greater32 (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Geq32U (Int64Lo x) (Int64Lo y))))
   399  	for {
   400  		x := v.Args[0]
   401  		y := v.Args[1]
   402  		v.reset(OpOrB)
   403  		v0 := b.NewValue0(v.Line, OpGreater32, config.fe.TypeBool())
   404  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   405  		v1.AddArg(x)
   406  		v0.AddArg(v1)
   407  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   408  		v2.AddArg(y)
   409  		v0.AddArg(v2)
   410  		v.AddArg(v0)
   411  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   412  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   413  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   414  		v5.AddArg(x)
   415  		v4.AddArg(v5)
   416  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   417  		v6.AddArg(y)
   418  		v4.AddArg(v6)
   419  		v3.AddArg(v4)
   420  		v7 := b.NewValue0(v.Line, OpGeq32U, config.fe.TypeBool())
   421  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   422  		v8.AddArg(x)
   423  		v7.AddArg(v8)
   424  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   425  		v9.AddArg(y)
   426  		v7.AddArg(v9)
   427  		v3.AddArg(v7)
   428  		v.AddArg(v3)
   429  		return true
   430  	}
   431  }
   432  func rewriteValuedec64_OpGeq64U(v *Value, config *Config) bool {
   433  	b := v.Block
   434  	_ = b
   435  	// match: (Geq64U x y)
   436  	// cond:
   437  	// result: (OrB 		(Greater32U (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Geq32U (Int64Lo x) (Int64Lo y))))
   438  	for {
   439  		x := v.Args[0]
   440  		y := v.Args[1]
   441  		v.reset(OpOrB)
   442  		v0 := b.NewValue0(v.Line, OpGreater32U, config.fe.TypeBool())
   443  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   444  		v1.AddArg(x)
   445  		v0.AddArg(v1)
   446  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   447  		v2.AddArg(y)
   448  		v0.AddArg(v2)
   449  		v.AddArg(v0)
   450  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   451  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   452  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   453  		v5.AddArg(x)
   454  		v4.AddArg(v5)
   455  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   456  		v6.AddArg(y)
   457  		v4.AddArg(v6)
   458  		v3.AddArg(v4)
   459  		v7 := b.NewValue0(v.Line, OpGeq32U, config.fe.TypeBool())
   460  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   461  		v8.AddArg(x)
   462  		v7.AddArg(v8)
   463  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   464  		v9.AddArg(y)
   465  		v7.AddArg(v9)
   466  		v3.AddArg(v7)
   467  		v.AddArg(v3)
   468  		return true
   469  	}
   470  }
   471  func rewriteValuedec64_OpGreater64(v *Value, config *Config) bool {
   472  	b := v.Block
   473  	_ = b
   474  	// match: (Greater64 x y)
   475  	// cond:
   476  	// result: (OrB 		(Greater32 (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Greater32U (Int64Lo x) (Int64Lo y))))
   477  	for {
   478  		x := v.Args[0]
   479  		y := v.Args[1]
   480  		v.reset(OpOrB)
   481  		v0 := b.NewValue0(v.Line, OpGreater32, config.fe.TypeBool())
   482  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   483  		v1.AddArg(x)
   484  		v0.AddArg(v1)
   485  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   486  		v2.AddArg(y)
   487  		v0.AddArg(v2)
   488  		v.AddArg(v0)
   489  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   490  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   491  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   492  		v5.AddArg(x)
   493  		v4.AddArg(v5)
   494  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   495  		v6.AddArg(y)
   496  		v4.AddArg(v6)
   497  		v3.AddArg(v4)
   498  		v7 := b.NewValue0(v.Line, OpGreater32U, config.fe.TypeBool())
   499  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   500  		v8.AddArg(x)
   501  		v7.AddArg(v8)
   502  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   503  		v9.AddArg(y)
   504  		v7.AddArg(v9)
   505  		v3.AddArg(v7)
   506  		v.AddArg(v3)
   507  		return true
   508  	}
   509  }
   510  func rewriteValuedec64_OpGreater64U(v *Value, config *Config) bool {
   511  	b := v.Block
   512  	_ = b
   513  	// match: (Greater64U x y)
   514  	// cond:
   515  	// result: (OrB 		(Greater32U (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Greater32U (Int64Lo x) (Int64Lo y))))
   516  	for {
   517  		x := v.Args[0]
   518  		y := v.Args[1]
   519  		v.reset(OpOrB)
   520  		v0 := b.NewValue0(v.Line, OpGreater32U, config.fe.TypeBool())
   521  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   522  		v1.AddArg(x)
   523  		v0.AddArg(v1)
   524  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   525  		v2.AddArg(y)
   526  		v0.AddArg(v2)
   527  		v.AddArg(v0)
   528  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   529  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   530  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   531  		v5.AddArg(x)
   532  		v4.AddArg(v5)
   533  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   534  		v6.AddArg(y)
   535  		v4.AddArg(v6)
   536  		v3.AddArg(v4)
   537  		v7 := b.NewValue0(v.Line, OpGreater32U, config.fe.TypeBool())
   538  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   539  		v8.AddArg(x)
   540  		v7.AddArg(v8)
   541  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   542  		v9.AddArg(y)
   543  		v7.AddArg(v9)
   544  		v3.AddArg(v7)
   545  		v.AddArg(v3)
   546  		return true
   547  	}
   548  }
   549  func rewriteValuedec64_OpInt64Hi(v *Value, config *Config) bool {
   550  	b := v.Block
   551  	_ = b
   552  	// match: (Int64Hi (Int64Make hi _))
   553  	// cond:
   554  	// result: hi
   555  	for {
   556  		v_0 := v.Args[0]
   557  		if v_0.Op != OpInt64Make {
   558  			break
   559  		}
   560  		hi := v_0.Args[0]
   561  		v.reset(OpCopy)
   562  		v.Type = hi.Type
   563  		v.AddArg(hi)
   564  		return true
   565  	}
   566  	return false
   567  }
   568  func rewriteValuedec64_OpInt64Lo(v *Value, config *Config) bool {
   569  	b := v.Block
   570  	_ = b
   571  	// match: (Int64Lo (Int64Make _ lo))
   572  	// cond:
   573  	// result: lo
   574  	for {
   575  		v_0 := v.Args[0]
   576  		if v_0.Op != OpInt64Make {
   577  			break
   578  		}
   579  		lo := v_0.Args[1]
   580  		v.reset(OpCopy)
   581  		v.Type = lo.Type
   582  		v.AddArg(lo)
   583  		return true
   584  	}
   585  	return false
   586  }
   587  func rewriteValuedec64_OpLeq64(v *Value, config *Config) bool {
   588  	b := v.Block
   589  	_ = b
   590  	// match: (Leq64 x y)
   591  	// cond:
   592  	// result: (OrB 		(Less32 (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Leq32U (Int64Lo x) (Int64Lo y))))
   593  	for {
   594  		x := v.Args[0]
   595  		y := v.Args[1]
   596  		v.reset(OpOrB)
   597  		v0 := b.NewValue0(v.Line, OpLess32, config.fe.TypeBool())
   598  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   599  		v1.AddArg(x)
   600  		v0.AddArg(v1)
   601  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   602  		v2.AddArg(y)
   603  		v0.AddArg(v2)
   604  		v.AddArg(v0)
   605  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   606  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   607  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   608  		v5.AddArg(x)
   609  		v4.AddArg(v5)
   610  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   611  		v6.AddArg(y)
   612  		v4.AddArg(v6)
   613  		v3.AddArg(v4)
   614  		v7 := b.NewValue0(v.Line, OpLeq32U, config.fe.TypeBool())
   615  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   616  		v8.AddArg(x)
   617  		v7.AddArg(v8)
   618  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   619  		v9.AddArg(y)
   620  		v7.AddArg(v9)
   621  		v3.AddArg(v7)
   622  		v.AddArg(v3)
   623  		return true
   624  	}
   625  }
   626  func rewriteValuedec64_OpLeq64U(v *Value, config *Config) bool {
   627  	b := v.Block
   628  	_ = b
   629  	// match: (Leq64U x y)
   630  	// cond:
   631  	// result: (OrB 		(Less32U (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Leq32U (Int64Lo x) (Int64Lo y))))
   632  	for {
   633  		x := v.Args[0]
   634  		y := v.Args[1]
   635  		v.reset(OpOrB)
   636  		v0 := b.NewValue0(v.Line, OpLess32U, config.fe.TypeBool())
   637  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   638  		v1.AddArg(x)
   639  		v0.AddArg(v1)
   640  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   641  		v2.AddArg(y)
   642  		v0.AddArg(v2)
   643  		v.AddArg(v0)
   644  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   645  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   646  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   647  		v5.AddArg(x)
   648  		v4.AddArg(v5)
   649  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   650  		v6.AddArg(y)
   651  		v4.AddArg(v6)
   652  		v3.AddArg(v4)
   653  		v7 := b.NewValue0(v.Line, OpLeq32U, config.fe.TypeBool())
   654  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   655  		v8.AddArg(x)
   656  		v7.AddArg(v8)
   657  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   658  		v9.AddArg(y)
   659  		v7.AddArg(v9)
   660  		v3.AddArg(v7)
   661  		v.AddArg(v3)
   662  		return true
   663  	}
   664  }
   665  func rewriteValuedec64_OpLess64(v *Value, config *Config) bool {
   666  	b := v.Block
   667  	_ = b
   668  	// match: (Less64 x y)
   669  	// cond:
   670  	// result: (OrB 		(Less32 (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Less32U (Int64Lo x) (Int64Lo y))))
   671  	for {
   672  		x := v.Args[0]
   673  		y := v.Args[1]
   674  		v.reset(OpOrB)
   675  		v0 := b.NewValue0(v.Line, OpLess32, config.fe.TypeBool())
   676  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   677  		v1.AddArg(x)
   678  		v0.AddArg(v1)
   679  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   680  		v2.AddArg(y)
   681  		v0.AddArg(v2)
   682  		v.AddArg(v0)
   683  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   684  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   685  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   686  		v5.AddArg(x)
   687  		v4.AddArg(v5)
   688  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   689  		v6.AddArg(y)
   690  		v4.AddArg(v6)
   691  		v3.AddArg(v4)
   692  		v7 := b.NewValue0(v.Line, OpLess32U, config.fe.TypeBool())
   693  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   694  		v8.AddArg(x)
   695  		v7.AddArg(v8)
   696  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   697  		v9.AddArg(y)
   698  		v7.AddArg(v9)
   699  		v3.AddArg(v7)
   700  		v.AddArg(v3)
   701  		return true
   702  	}
   703  }
   704  func rewriteValuedec64_OpLess64U(v *Value, config *Config) bool {
   705  	b := v.Block
   706  	_ = b
   707  	// match: (Less64U x y)
   708  	// cond:
   709  	// result: (OrB 		(Less32U (Int64Hi x) (Int64Hi y)) 		(AndB 			(Eq32 (Int64Hi x) (Int64Hi y)) 			(Less32U (Int64Lo x) (Int64Lo y))))
   710  	for {
   711  		x := v.Args[0]
   712  		y := v.Args[1]
   713  		v.reset(OpOrB)
   714  		v0 := b.NewValue0(v.Line, OpLess32U, config.fe.TypeBool())
   715  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   716  		v1.AddArg(x)
   717  		v0.AddArg(v1)
   718  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   719  		v2.AddArg(y)
   720  		v0.AddArg(v2)
   721  		v.AddArg(v0)
   722  		v3 := b.NewValue0(v.Line, OpAndB, config.fe.TypeBool())
   723  		v4 := b.NewValue0(v.Line, OpEq32, config.fe.TypeBool())
   724  		v5 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   725  		v5.AddArg(x)
   726  		v4.AddArg(v5)
   727  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
   728  		v6.AddArg(y)
   729  		v4.AddArg(v6)
   730  		v3.AddArg(v4)
   731  		v7 := b.NewValue0(v.Line, OpLess32U, config.fe.TypeBool())
   732  		v8 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   733  		v8.AddArg(x)
   734  		v7.AddArg(v8)
   735  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
   736  		v9.AddArg(y)
   737  		v7.AddArg(v9)
   738  		v3.AddArg(v7)
   739  		v.AddArg(v3)
   740  		return true
   741  	}
   742  }
   743  func rewriteValuedec64_OpLoad(v *Value, config *Config) bool {
   744  	b := v.Block
   745  	_ = b
   746  	// match: (Load <t> ptr mem)
   747  	// cond: is64BitInt(t) && t.IsSigned()
   748  	// result: (Int64Make 		(Load <config.fe.TypeInt32()> (OffPtr <config.fe.TypeInt32().PtrTo()> [4] ptr) mem) 		(Load <config.fe.TypeUInt32()> ptr mem))
   749  	for {
   750  		t := v.Type
   751  		ptr := v.Args[0]
   752  		mem := v.Args[1]
   753  		if !(is64BitInt(t) && t.IsSigned()) {
   754  			break
   755  		}
   756  		v.reset(OpInt64Make)
   757  		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt32())
   758  		v1 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt32().PtrTo())
   759  		v1.AuxInt = 4
   760  		v1.AddArg(ptr)
   761  		v0.AddArg(v1)
   762  		v0.AddArg(mem)
   763  		v.AddArg(v0)
   764  		v2 := b.NewValue0(v.Line, OpLoad, config.fe.TypeUInt32())
   765  		v2.AddArg(ptr)
   766  		v2.AddArg(mem)
   767  		v.AddArg(v2)
   768  		return true
   769  	}
   770  	// match: (Load <t> ptr mem)
   771  	// cond: is64BitInt(t) && !t.IsSigned()
   772  	// result: (Int64Make 		(Load <config.fe.TypeUInt32()> (OffPtr <config.fe.TypeUInt32().PtrTo()> [4] ptr) mem) 		(Load <config.fe.TypeUInt32()> ptr mem))
   773  	for {
   774  		t := v.Type
   775  		ptr := v.Args[0]
   776  		mem := v.Args[1]
   777  		if !(is64BitInt(t) && !t.IsSigned()) {
   778  			break
   779  		}
   780  		v.reset(OpInt64Make)
   781  		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeUInt32())
   782  		v1 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeUInt32().PtrTo())
   783  		v1.AuxInt = 4
   784  		v1.AddArg(ptr)
   785  		v0.AddArg(v1)
   786  		v0.AddArg(mem)
   787  		v.AddArg(v0)
   788  		v2 := b.NewValue0(v.Line, OpLoad, config.fe.TypeUInt32())
   789  		v2.AddArg(ptr)
   790  		v2.AddArg(mem)
   791  		v.AddArg(v2)
   792  		return true
   793  	}
   794  	return false
   795  }
   796  func rewriteValuedec64_OpLrot64(v *Value, config *Config) bool {
   797  	b := v.Block
   798  	_ = b
   799  	// match: (Lrot64 (Int64Make hi lo) [c])
   800  	// cond: c <= 32
   801  	// result: (Int64Make 		(Or32 <config.fe.TypeUInt32()> 			(Lsh32x32 <config.fe.TypeUInt32()> hi (Const32 <config.fe.TypeUInt32()> [c])) 			(Rsh32Ux32 <config.fe.TypeUInt32()> lo (Const32 <config.fe.TypeUInt32()> [32-c]))) 		(Or32 <config.fe.TypeUInt32()> 			(Lsh32x32 <config.fe.TypeUInt32()> lo (Const32 <config.fe.TypeUInt32()> [c])) 			(Rsh32Ux32 <config.fe.TypeUInt32()> hi (Const32 <config.fe.TypeUInt32()> [32-c]))))
   802  	for {
   803  		c := v.AuxInt
   804  		v_0 := v.Args[0]
   805  		if v_0.Op != OpInt64Make {
   806  			break
   807  		}
   808  		hi := v_0.Args[0]
   809  		lo := v_0.Args[1]
   810  		if !(c <= 32) {
   811  			break
   812  		}
   813  		v.reset(OpInt64Make)
   814  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
   815  		v1 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
   816  		v1.AddArg(hi)
   817  		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   818  		v2.AuxInt = c
   819  		v1.AddArg(v2)
   820  		v0.AddArg(v1)
   821  		v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
   822  		v3.AddArg(lo)
   823  		v4 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   824  		v4.AuxInt = 32 - c
   825  		v3.AddArg(v4)
   826  		v0.AddArg(v3)
   827  		v.AddArg(v0)
   828  		v5 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
   829  		v6 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
   830  		v6.AddArg(lo)
   831  		v7 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   832  		v7.AuxInt = c
   833  		v6.AddArg(v7)
   834  		v5.AddArg(v6)
   835  		v8 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
   836  		v8.AddArg(hi)
   837  		v9 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
   838  		v9.AuxInt = 32 - c
   839  		v8.AddArg(v9)
   840  		v5.AddArg(v8)
   841  		v.AddArg(v5)
   842  		return true
   843  	}
   844  	// match: (Lrot64 (Int64Make hi lo) [c])
   845  	// cond: c > 32
   846  	// result: (Lrot64 (Int64Make lo hi) [c-32])
   847  	for {
   848  		c := v.AuxInt
   849  		v_0 := v.Args[0]
   850  		if v_0.Op != OpInt64Make {
   851  			break
   852  		}
   853  		hi := v_0.Args[0]
   854  		lo := v_0.Args[1]
   855  		if !(c > 32) {
   856  			break
   857  		}
   858  		v.reset(OpLrot64)
   859  		v.AuxInt = c - 32
   860  		v0 := b.NewValue0(v.Line, OpInt64Make, config.fe.TypeUInt64())
   861  		v0.AddArg(lo)
   862  		v0.AddArg(hi)
   863  		v.AddArg(v0)
   864  		return true
   865  	}
   866  	return false
   867  }
   868  func rewriteValuedec64_OpLsh16x64(v *Value, config *Config) bool {
   869  	b := v.Block
   870  	_ = b
   871  	// match: (Lsh16x64 _ (Int64Make (Const32 [c]) _))
   872  	// cond: c != 0
   873  	// result: (Const32 [0])
   874  	for {
   875  		v_1 := v.Args[1]
   876  		if v_1.Op != OpInt64Make {
   877  			break
   878  		}
   879  		v_1_0 := v_1.Args[0]
   880  		if v_1_0.Op != OpConst32 {
   881  			break
   882  		}
   883  		c := v_1_0.AuxInt
   884  		if !(c != 0) {
   885  			break
   886  		}
   887  		v.reset(OpConst32)
   888  		v.AuxInt = 0
   889  		return true
   890  	}
   891  	// match: (Lsh16x64 x (Int64Make (Const32 [0]) lo))
   892  	// cond:
   893  	// result: (Lsh16x32 x lo)
   894  	for {
   895  		x := v.Args[0]
   896  		v_1 := v.Args[1]
   897  		if v_1.Op != OpInt64Make {
   898  			break
   899  		}
   900  		v_1_0 := v_1.Args[0]
   901  		if v_1_0.Op != OpConst32 {
   902  			break
   903  		}
   904  		if v_1_0.AuxInt != 0 {
   905  			break
   906  		}
   907  		lo := v_1.Args[1]
   908  		v.reset(OpLsh16x32)
   909  		v.AddArg(x)
   910  		v.AddArg(lo)
   911  		return true
   912  	}
   913  	// match: (Lsh16x64 x (Int64Make hi lo))
   914  	// cond: hi.Op != OpConst32
   915  	// result: (Lsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   916  	for {
   917  		x := v.Args[0]
   918  		v_1 := v.Args[1]
   919  		if v_1.Op != OpInt64Make {
   920  			break
   921  		}
   922  		hi := v_1.Args[0]
   923  		lo := v_1.Args[1]
   924  		if !(hi.Op != OpConst32) {
   925  			break
   926  		}
   927  		v.reset(OpLsh16x32)
   928  		v.AddArg(x)
   929  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
   930  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
   931  		v1.AddArg(hi)
   932  		v0.AddArg(v1)
   933  		v0.AddArg(lo)
   934  		v.AddArg(v0)
   935  		return true
   936  	}
   937  	return false
   938  }
   939  func rewriteValuedec64_OpLsh32x64(v *Value, config *Config) bool {
   940  	b := v.Block
   941  	_ = b
   942  	// match: (Lsh32x64 _ (Int64Make (Const32 [c]) _))
   943  	// cond: c != 0
   944  	// result: (Const32 [0])
   945  	for {
   946  		v_1 := v.Args[1]
   947  		if v_1.Op != OpInt64Make {
   948  			break
   949  		}
   950  		v_1_0 := v_1.Args[0]
   951  		if v_1_0.Op != OpConst32 {
   952  			break
   953  		}
   954  		c := v_1_0.AuxInt
   955  		if !(c != 0) {
   956  			break
   957  		}
   958  		v.reset(OpConst32)
   959  		v.AuxInt = 0
   960  		return true
   961  	}
   962  	// match: (Lsh32x64 x (Int64Make (Const32 [0]) lo))
   963  	// cond:
   964  	// result: (Lsh32x32 x lo)
   965  	for {
   966  		x := v.Args[0]
   967  		v_1 := v.Args[1]
   968  		if v_1.Op != OpInt64Make {
   969  			break
   970  		}
   971  		v_1_0 := v_1.Args[0]
   972  		if v_1_0.Op != OpConst32 {
   973  			break
   974  		}
   975  		if v_1_0.AuxInt != 0 {
   976  			break
   977  		}
   978  		lo := v_1.Args[1]
   979  		v.reset(OpLsh32x32)
   980  		v.AddArg(x)
   981  		v.AddArg(lo)
   982  		return true
   983  	}
   984  	// match: (Lsh32x64 x (Int64Make hi lo))
   985  	// cond: hi.Op != OpConst32
   986  	// result: (Lsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   987  	for {
   988  		x := v.Args[0]
   989  		v_1 := v.Args[1]
   990  		if v_1.Op != OpInt64Make {
   991  			break
   992  		}
   993  		hi := v_1.Args[0]
   994  		lo := v_1.Args[1]
   995  		if !(hi.Op != OpConst32) {
   996  			break
   997  		}
   998  		v.reset(OpLsh32x32)
   999  		v.AddArg(x)
  1000  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1001  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1002  		v1.AddArg(hi)
  1003  		v0.AddArg(v1)
  1004  		v0.AddArg(lo)
  1005  		v.AddArg(v0)
  1006  		return true
  1007  	}
  1008  	return false
  1009  }
  1010  func rewriteValuedec64_OpLsh64x16(v *Value, config *Config) bool {
  1011  	b := v.Block
  1012  	_ = b
  1013  	// match: (Lsh64x16 (Int64Make hi lo) s)
  1014  	// cond:
  1015  	// result: (Int64Make 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Lsh32x16 <config.fe.TypeUInt32()> hi s) 				(Rsh32Ux16 <config.fe.TypeUInt32()> 					lo 					(Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s))) 			(Lsh32x16 <config.fe.TypeUInt32()> 				lo 				(Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32])))) 		(Lsh32x16 <config.fe.TypeUInt32()> lo s))
  1016  	for {
  1017  		v_0 := v.Args[0]
  1018  		if v_0.Op != OpInt64Make {
  1019  			break
  1020  		}
  1021  		hi := v_0.Args[0]
  1022  		lo := v_0.Args[1]
  1023  		s := v.Args[1]
  1024  		v.reset(OpInt64Make)
  1025  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1026  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1027  		v2 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
  1028  		v2.AddArg(hi)
  1029  		v2.AddArg(s)
  1030  		v1.AddArg(v2)
  1031  		v3 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
  1032  		v3.AddArg(lo)
  1033  		v4 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
  1034  		v5 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
  1035  		v5.AuxInt = 32
  1036  		v4.AddArg(v5)
  1037  		v4.AddArg(s)
  1038  		v3.AddArg(v4)
  1039  		v1.AddArg(v3)
  1040  		v0.AddArg(v1)
  1041  		v6 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
  1042  		v6.AddArg(lo)
  1043  		v7 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
  1044  		v7.AddArg(s)
  1045  		v8 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
  1046  		v8.AuxInt = 32
  1047  		v7.AddArg(v8)
  1048  		v6.AddArg(v7)
  1049  		v0.AddArg(v6)
  1050  		v.AddArg(v0)
  1051  		v9 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
  1052  		v9.AddArg(lo)
  1053  		v9.AddArg(s)
  1054  		v.AddArg(v9)
  1055  		return true
  1056  	}
  1057  	return false
  1058  }
  1059  func rewriteValuedec64_OpLsh64x32(v *Value, config *Config) bool {
  1060  	b := v.Block
  1061  	_ = b
  1062  	// match: (Lsh64x32 (Int64Make hi lo) s)
  1063  	// cond:
  1064  	// result: (Int64Make 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Lsh32x32 <config.fe.TypeUInt32()> hi s) 				(Rsh32Ux32 <config.fe.TypeUInt32()> 					lo 					(Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s))) 			(Lsh32x32 <config.fe.TypeUInt32()> 				lo 				(Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))) 		(Lsh32x32 <config.fe.TypeUInt32()> lo s))
  1065  	for {
  1066  		v_0 := v.Args[0]
  1067  		if v_0.Op != OpInt64Make {
  1068  			break
  1069  		}
  1070  		hi := v_0.Args[0]
  1071  		lo := v_0.Args[1]
  1072  		s := v.Args[1]
  1073  		v.reset(OpInt64Make)
  1074  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1075  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1076  		v2 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
  1077  		v2.AddArg(hi)
  1078  		v2.AddArg(s)
  1079  		v1.AddArg(v2)
  1080  		v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
  1081  		v3.AddArg(lo)
  1082  		v4 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
  1083  		v5 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  1084  		v5.AuxInt = 32
  1085  		v4.AddArg(v5)
  1086  		v4.AddArg(s)
  1087  		v3.AddArg(v4)
  1088  		v1.AddArg(v3)
  1089  		v0.AddArg(v1)
  1090  		v6 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
  1091  		v6.AddArg(lo)
  1092  		v7 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
  1093  		v7.AddArg(s)
  1094  		v8 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  1095  		v8.AuxInt = 32
  1096  		v7.AddArg(v8)
  1097  		v6.AddArg(v7)
  1098  		v0.AddArg(v6)
  1099  		v.AddArg(v0)
  1100  		v9 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
  1101  		v9.AddArg(lo)
  1102  		v9.AddArg(s)
  1103  		v.AddArg(v9)
  1104  		return true
  1105  	}
  1106  	return false
  1107  }
  1108  func rewriteValuedec64_OpLsh64x64(v *Value, config *Config) bool {
  1109  	b := v.Block
  1110  	_ = b
  1111  	// match: (Lsh64x64 _ (Int64Make (Const32 [c]) _))
  1112  	// cond: c != 0
  1113  	// result: (Const64 [0])
  1114  	for {
  1115  		v_1 := v.Args[1]
  1116  		if v_1.Op != OpInt64Make {
  1117  			break
  1118  		}
  1119  		v_1_0 := v_1.Args[0]
  1120  		if v_1_0.Op != OpConst32 {
  1121  			break
  1122  		}
  1123  		c := v_1_0.AuxInt
  1124  		if !(c != 0) {
  1125  			break
  1126  		}
  1127  		v.reset(OpConst64)
  1128  		v.AuxInt = 0
  1129  		return true
  1130  	}
  1131  	// match: (Lsh64x64 x (Int64Make (Const32 [0]) lo))
  1132  	// cond:
  1133  	// result: (Lsh64x32 x lo)
  1134  	for {
  1135  		x := v.Args[0]
  1136  		v_1 := v.Args[1]
  1137  		if v_1.Op != OpInt64Make {
  1138  			break
  1139  		}
  1140  		v_1_0 := v_1.Args[0]
  1141  		if v_1_0.Op != OpConst32 {
  1142  			break
  1143  		}
  1144  		if v_1_0.AuxInt != 0 {
  1145  			break
  1146  		}
  1147  		lo := v_1.Args[1]
  1148  		v.reset(OpLsh64x32)
  1149  		v.AddArg(x)
  1150  		v.AddArg(lo)
  1151  		return true
  1152  	}
  1153  	// match: (Lsh64x64 x (Int64Make hi lo))
  1154  	// cond: hi.Op != OpConst32
  1155  	// result: (Lsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1156  	for {
  1157  		x := v.Args[0]
  1158  		v_1 := v.Args[1]
  1159  		if v_1.Op != OpInt64Make {
  1160  			break
  1161  		}
  1162  		hi := v_1.Args[0]
  1163  		lo := v_1.Args[1]
  1164  		if !(hi.Op != OpConst32) {
  1165  			break
  1166  		}
  1167  		v.reset(OpLsh64x32)
  1168  		v.AddArg(x)
  1169  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1170  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1171  		v1.AddArg(hi)
  1172  		v0.AddArg(v1)
  1173  		v0.AddArg(lo)
  1174  		v.AddArg(v0)
  1175  		return true
  1176  	}
  1177  	return false
  1178  }
  1179  func rewriteValuedec64_OpLsh64x8(v *Value, config *Config) bool {
  1180  	b := v.Block
  1181  	_ = b
  1182  	// match: (Lsh64x8 (Int64Make hi lo) s)
  1183  	// cond:
  1184  	// result: (Int64Make 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Lsh32x8 <config.fe.TypeUInt32()> hi s) 				(Rsh32Ux8 <config.fe.TypeUInt32()> 					lo 					(Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s))) 			(Lsh32x8 <config.fe.TypeUInt32()> 				lo 				(Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32])))) 		(Lsh32x8 <config.fe.TypeUInt32()> lo s))
  1185  	for {
  1186  		v_0 := v.Args[0]
  1187  		if v_0.Op != OpInt64Make {
  1188  			break
  1189  		}
  1190  		hi := v_0.Args[0]
  1191  		lo := v_0.Args[1]
  1192  		s := v.Args[1]
  1193  		v.reset(OpInt64Make)
  1194  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1195  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1196  		v2 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
  1197  		v2.AddArg(hi)
  1198  		v2.AddArg(s)
  1199  		v1.AddArg(v2)
  1200  		v3 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
  1201  		v3.AddArg(lo)
  1202  		v4 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
  1203  		v5 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
  1204  		v5.AuxInt = 32
  1205  		v4.AddArg(v5)
  1206  		v4.AddArg(s)
  1207  		v3.AddArg(v4)
  1208  		v1.AddArg(v3)
  1209  		v0.AddArg(v1)
  1210  		v6 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
  1211  		v6.AddArg(lo)
  1212  		v7 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
  1213  		v7.AddArg(s)
  1214  		v8 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
  1215  		v8.AuxInt = 32
  1216  		v7.AddArg(v8)
  1217  		v6.AddArg(v7)
  1218  		v0.AddArg(v6)
  1219  		v.AddArg(v0)
  1220  		v9 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
  1221  		v9.AddArg(lo)
  1222  		v9.AddArg(s)
  1223  		v.AddArg(v9)
  1224  		return true
  1225  	}
  1226  	return false
  1227  }
  1228  func rewriteValuedec64_OpLsh8x64(v *Value, config *Config) bool {
  1229  	b := v.Block
  1230  	_ = b
  1231  	// match: (Lsh8x64 _ (Int64Make (Const32 [c]) _))
  1232  	// cond: c != 0
  1233  	// result: (Const32 [0])
  1234  	for {
  1235  		v_1 := v.Args[1]
  1236  		if v_1.Op != OpInt64Make {
  1237  			break
  1238  		}
  1239  		v_1_0 := v_1.Args[0]
  1240  		if v_1_0.Op != OpConst32 {
  1241  			break
  1242  		}
  1243  		c := v_1_0.AuxInt
  1244  		if !(c != 0) {
  1245  			break
  1246  		}
  1247  		v.reset(OpConst32)
  1248  		v.AuxInt = 0
  1249  		return true
  1250  	}
  1251  	// match: (Lsh8x64 x (Int64Make (Const32 [0]) lo))
  1252  	// cond:
  1253  	// result: (Lsh8x32 x lo)
  1254  	for {
  1255  		x := v.Args[0]
  1256  		v_1 := v.Args[1]
  1257  		if v_1.Op != OpInt64Make {
  1258  			break
  1259  		}
  1260  		v_1_0 := v_1.Args[0]
  1261  		if v_1_0.Op != OpConst32 {
  1262  			break
  1263  		}
  1264  		if v_1_0.AuxInt != 0 {
  1265  			break
  1266  		}
  1267  		lo := v_1.Args[1]
  1268  		v.reset(OpLsh8x32)
  1269  		v.AddArg(x)
  1270  		v.AddArg(lo)
  1271  		return true
  1272  	}
  1273  	// match: (Lsh8x64 x (Int64Make hi lo))
  1274  	// cond: hi.Op != OpConst32
  1275  	// result: (Lsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1276  	for {
  1277  		x := v.Args[0]
  1278  		v_1 := v.Args[1]
  1279  		if v_1.Op != OpInt64Make {
  1280  			break
  1281  		}
  1282  		hi := v_1.Args[0]
  1283  		lo := v_1.Args[1]
  1284  		if !(hi.Op != OpConst32) {
  1285  			break
  1286  		}
  1287  		v.reset(OpLsh8x32)
  1288  		v.AddArg(x)
  1289  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1290  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1291  		v1.AddArg(hi)
  1292  		v0.AddArg(v1)
  1293  		v0.AddArg(lo)
  1294  		v.AddArg(v0)
  1295  		return true
  1296  	}
  1297  	return false
  1298  }
  1299  func rewriteValuedec64_OpMul64(v *Value, config *Config) bool {
  1300  	b := v.Block
  1301  	_ = b
  1302  	// match: (Mul64 x y)
  1303  	// cond:
  1304  	// result: (Int64Make 		(Add32 <config.fe.TypeUInt32()> 			(Mul32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Hi y)) 			(Add32 <config.fe.TypeUInt32()> 				(Mul32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Lo y)) 				(Select0 <config.fe.TypeUInt32()> (Mul32uhilo (Int64Lo x) (Int64Lo y))))) 		(Select1 <config.fe.TypeUInt32()> (Mul32uhilo (Int64Lo x) (Int64Lo y))))
  1305  	for {
  1306  		x := v.Args[0]
  1307  		y := v.Args[1]
  1308  		v.reset(OpInt64Make)
  1309  		v0 := b.NewValue0(v.Line, OpAdd32, config.fe.TypeUInt32())
  1310  		v1 := b.NewValue0(v.Line, OpMul32, config.fe.TypeUInt32())
  1311  		v2 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1312  		v2.AddArg(x)
  1313  		v1.AddArg(v2)
  1314  		v3 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  1315  		v3.AddArg(y)
  1316  		v1.AddArg(v3)
  1317  		v0.AddArg(v1)
  1318  		v4 := b.NewValue0(v.Line, OpAdd32, config.fe.TypeUInt32())
  1319  		v5 := b.NewValue0(v.Line, OpMul32, config.fe.TypeUInt32())
  1320  		v6 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  1321  		v6.AddArg(x)
  1322  		v5.AddArg(v6)
  1323  		v7 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1324  		v7.AddArg(y)
  1325  		v5.AddArg(v7)
  1326  		v4.AddArg(v5)
  1327  		v8 := b.NewValue0(v.Line, OpSelect0, config.fe.TypeUInt32())
  1328  		v9 := b.NewValue0(v.Line, OpMul32uhilo, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32()))
  1329  		v10 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1330  		v10.AddArg(x)
  1331  		v9.AddArg(v10)
  1332  		v11 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1333  		v11.AddArg(y)
  1334  		v9.AddArg(v11)
  1335  		v8.AddArg(v9)
  1336  		v4.AddArg(v8)
  1337  		v0.AddArg(v4)
  1338  		v.AddArg(v0)
  1339  		v12 := b.NewValue0(v.Line, OpSelect1, config.fe.TypeUInt32())
  1340  		v13 := b.NewValue0(v.Line, OpMul32uhilo, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32()))
  1341  		v14 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1342  		v14.AddArg(x)
  1343  		v13.AddArg(v14)
  1344  		v15 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1345  		v15.AddArg(y)
  1346  		v13.AddArg(v15)
  1347  		v12.AddArg(v13)
  1348  		v.AddArg(v12)
  1349  		return true
  1350  	}
  1351  }
  1352  func rewriteValuedec64_OpNeg64(v *Value, config *Config) bool {
  1353  	b := v.Block
  1354  	_ = b
  1355  	// match: (Neg64 <t> x)
  1356  	// cond:
  1357  	// result: (Sub64 (Const64 <t> [0]) x)
  1358  	for {
  1359  		t := v.Type
  1360  		x := v.Args[0]
  1361  		v.reset(OpSub64)
  1362  		v0 := b.NewValue0(v.Line, OpConst64, t)
  1363  		v0.AuxInt = 0
  1364  		v.AddArg(v0)
  1365  		v.AddArg(x)
  1366  		return true
  1367  	}
  1368  }
  1369  func rewriteValuedec64_OpNeq64(v *Value, config *Config) bool {
  1370  	b := v.Block
  1371  	_ = b
  1372  	// match: (Neq64 x y)
  1373  	// cond:
  1374  	// result: (OrB 		(Neq32 (Int64Hi x) (Int64Hi y)) 		(Neq32 (Int64Lo x) (Int64Lo y)))
  1375  	for {
  1376  		x := v.Args[0]
  1377  		y := v.Args[1]
  1378  		v.reset(OpOrB)
  1379  		v0 := b.NewValue0(v.Line, OpNeq32, config.fe.TypeBool())
  1380  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  1381  		v1.AddArg(x)
  1382  		v0.AddArg(v1)
  1383  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  1384  		v2.AddArg(y)
  1385  		v0.AddArg(v2)
  1386  		v.AddArg(v0)
  1387  		v3 := b.NewValue0(v.Line, OpNeq32, config.fe.TypeBool())
  1388  		v4 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1389  		v4.AddArg(x)
  1390  		v3.AddArg(v4)
  1391  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1392  		v5.AddArg(y)
  1393  		v3.AddArg(v5)
  1394  		v.AddArg(v3)
  1395  		return true
  1396  	}
  1397  }
  1398  func rewriteValuedec64_OpOr64(v *Value, config *Config) bool {
  1399  	b := v.Block
  1400  	_ = b
  1401  	// match: (Or64 x y)
  1402  	// cond:
  1403  	// result: (Int64Make 		(Or32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Hi y)) 		(Or32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Lo y)))
  1404  	for {
  1405  		x := v.Args[0]
  1406  		y := v.Args[1]
  1407  		v.reset(OpInt64Make)
  1408  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1409  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  1410  		v1.AddArg(x)
  1411  		v0.AddArg(v1)
  1412  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  1413  		v2.AddArg(y)
  1414  		v0.AddArg(v2)
  1415  		v.AddArg(v0)
  1416  		v3 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1417  		v4 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1418  		v4.AddArg(x)
  1419  		v3.AddArg(v4)
  1420  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  1421  		v5.AddArg(y)
  1422  		v3.AddArg(v5)
  1423  		v.AddArg(v3)
  1424  		return true
  1425  	}
  1426  }
  1427  func rewriteValuedec64_OpRsh16Ux64(v *Value, config *Config) bool {
  1428  	b := v.Block
  1429  	_ = b
  1430  	// match: (Rsh16Ux64 _ (Int64Make (Const32 [c]) _))
  1431  	// cond: c != 0
  1432  	// result: (Const32 [0])
  1433  	for {
  1434  		v_1 := v.Args[1]
  1435  		if v_1.Op != OpInt64Make {
  1436  			break
  1437  		}
  1438  		v_1_0 := v_1.Args[0]
  1439  		if v_1_0.Op != OpConst32 {
  1440  			break
  1441  		}
  1442  		c := v_1_0.AuxInt
  1443  		if !(c != 0) {
  1444  			break
  1445  		}
  1446  		v.reset(OpConst32)
  1447  		v.AuxInt = 0
  1448  		return true
  1449  	}
  1450  	// match: (Rsh16Ux64 x (Int64Make (Const32 [0]) lo))
  1451  	// cond:
  1452  	// result: (Rsh16Ux32 x lo)
  1453  	for {
  1454  		x := v.Args[0]
  1455  		v_1 := v.Args[1]
  1456  		if v_1.Op != OpInt64Make {
  1457  			break
  1458  		}
  1459  		v_1_0 := v_1.Args[0]
  1460  		if v_1_0.Op != OpConst32 {
  1461  			break
  1462  		}
  1463  		if v_1_0.AuxInt != 0 {
  1464  			break
  1465  		}
  1466  		lo := v_1.Args[1]
  1467  		v.reset(OpRsh16Ux32)
  1468  		v.AddArg(x)
  1469  		v.AddArg(lo)
  1470  		return true
  1471  	}
  1472  	// match: (Rsh16Ux64 x (Int64Make hi lo))
  1473  	// cond: hi.Op != OpConst32
  1474  	// result: (Rsh16Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1475  	for {
  1476  		x := v.Args[0]
  1477  		v_1 := v.Args[1]
  1478  		if v_1.Op != OpInt64Make {
  1479  			break
  1480  		}
  1481  		hi := v_1.Args[0]
  1482  		lo := v_1.Args[1]
  1483  		if !(hi.Op != OpConst32) {
  1484  			break
  1485  		}
  1486  		v.reset(OpRsh16Ux32)
  1487  		v.AddArg(x)
  1488  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1489  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1490  		v1.AddArg(hi)
  1491  		v0.AddArg(v1)
  1492  		v0.AddArg(lo)
  1493  		v.AddArg(v0)
  1494  		return true
  1495  	}
  1496  	return false
  1497  }
  1498  func rewriteValuedec64_OpRsh16x64(v *Value, config *Config) bool {
  1499  	b := v.Block
  1500  	_ = b
  1501  	// match: (Rsh16x64 x (Int64Make (Const32 [c]) _))
  1502  	// cond: c != 0
  1503  	// result: (Signmask (SignExt16to32 x))
  1504  	for {
  1505  		x := v.Args[0]
  1506  		v_1 := v.Args[1]
  1507  		if v_1.Op != OpInt64Make {
  1508  			break
  1509  		}
  1510  		v_1_0 := v_1.Args[0]
  1511  		if v_1_0.Op != OpConst32 {
  1512  			break
  1513  		}
  1514  		c := v_1_0.AuxInt
  1515  		if !(c != 0) {
  1516  			break
  1517  		}
  1518  		v.reset(OpSignmask)
  1519  		v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32())
  1520  		v0.AddArg(x)
  1521  		v.AddArg(v0)
  1522  		return true
  1523  	}
  1524  	// match: (Rsh16x64 x (Int64Make (Const32 [0]) lo))
  1525  	// cond:
  1526  	// result: (Rsh16x32 x lo)
  1527  	for {
  1528  		x := v.Args[0]
  1529  		v_1 := v.Args[1]
  1530  		if v_1.Op != OpInt64Make {
  1531  			break
  1532  		}
  1533  		v_1_0 := v_1.Args[0]
  1534  		if v_1_0.Op != OpConst32 {
  1535  			break
  1536  		}
  1537  		if v_1_0.AuxInt != 0 {
  1538  			break
  1539  		}
  1540  		lo := v_1.Args[1]
  1541  		v.reset(OpRsh16x32)
  1542  		v.AddArg(x)
  1543  		v.AddArg(lo)
  1544  		return true
  1545  	}
  1546  	// match: (Rsh16x64 x (Int64Make hi lo))
  1547  	// cond: hi.Op != OpConst32
  1548  	// result: (Rsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1549  	for {
  1550  		x := v.Args[0]
  1551  		v_1 := v.Args[1]
  1552  		if v_1.Op != OpInt64Make {
  1553  			break
  1554  		}
  1555  		hi := v_1.Args[0]
  1556  		lo := v_1.Args[1]
  1557  		if !(hi.Op != OpConst32) {
  1558  			break
  1559  		}
  1560  		v.reset(OpRsh16x32)
  1561  		v.AddArg(x)
  1562  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1563  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1564  		v1.AddArg(hi)
  1565  		v0.AddArg(v1)
  1566  		v0.AddArg(lo)
  1567  		v.AddArg(v0)
  1568  		return true
  1569  	}
  1570  	return false
  1571  }
  1572  func rewriteValuedec64_OpRsh32Ux64(v *Value, config *Config) bool {
  1573  	b := v.Block
  1574  	_ = b
  1575  	// match: (Rsh32Ux64 _ (Int64Make (Const32 [c]) _))
  1576  	// cond: c != 0
  1577  	// result: (Const32 [0])
  1578  	for {
  1579  		v_1 := v.Args[1]
  1580  		if v_1.Op != OpInt64Make {
  1581  			break
  1582  		}
  1583  		v_1_0 := v_1.Args[0]
  1584  		if v_1_0.Op != OpConst32 {
  1585  			break
  1586  		}
  1587  		c := v_1_0.AuxInt
  1588  		if !(c != 0) {
  1589  			break
  1590  		}
  1591  		v.reset(OpConst32)
  1592  		v.AuxInt = 0
  1593  		return true
  1594  	}
  1595  	// match: (Rsh32Ux64 x (Int64Make (Const32 [0]) lo))
  1596  	// cond:
  1597  	// result: (Rsh32Ux32 x lo)
  1598  	for {
  1599  		x := v.Args[0]
  1600  		v_1 := v.Args[1]
  1601  		if v_1.Op != OpInt64Make {
  1602  			break
  1603  		}
  1604  		v_1_0 := v_1.Args[0]
  1605  		if v_1_0.Op != OpConst32 {
  1606  			break
  1607  		}
  1608  		if v_1_0.AuxInt != 0 {
  1609  			break
  1610  		}
  1611  		lo := v_1.Args[1]
  1612  		v.reset(OpRsh32Ux32)
  1613  		v.AddArg(x)
  1614  		v.AddArg(lo)
  1615  		return true
  1616  	}
  1617  	// match: (Rsh32Ux64 x (Int64Make hi lo))
  1618  	// cond: hi.Op != OpConst32
  1619  	// result: (Rsh32Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1620  	for {
  1621  		x := v.Args[0]
  1622  		v_1 := v.Args[1]
  1623  		if v_1.Op != OpInt64Make {
  1624  			break
  1625  		}
  1626  		hi := v_1.Args[0]
  1627  		lo := v_1.Args[1]
  1628  		if !(hi.Op != OpConst32) {
  1629  			break
  1630  		}
  1631  		v.reset(OpRsh32Ux32)
  1632  		v.AddArg(x)
  1633  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1634  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1635  		v1.AddArg(hi)
  1636  		v0.AddArg(v1)
  1637  		v0.AddArg(lo)
  1638  		v.AddArg(v0)
  1639  		return true
  1640  	}
  1641  	return false
  1642  }
  1643  func rewriteValuedec64_OpRsh32x64(v *Value, config *Config) bool {
  1644  	b := v.Block
  1645  	_ = b
  1646  	// match: (Rsh32x64 x (Int64Make (Const32 [c]) _))
  1647  	// cond: c != 0
  1648  	// result: (Signmask x)
  1649  	for {
  1650  		x := v.Args[0]
  1651  		v_1 := v.Args[1]
  1652  		if v_1.Op != OpInt64Make {
  1653  			break
  1654  		}
  1655  		v_1_0 := v_1.Args[0]
  1656  		if v_1_0.Op != OpConst32 {
  1657  			break
  1658  		}
  1659  		c := v_1_0.AuxInt
  1660  		if !(c != 0) {
  1661  			break
  1662  		}
  1663  		v.reset(OpSignmask)
  1664  		v.AddArg(x)
  1665  		return true
  1666  	}
  1667  	// match: (Rsh32x64 x (Int64Make (Const32 [0]) lo))
  1668  	// cond:
  1669  	// result: (Rsh32x32 x lo)
  1670  	for {
  1671  		x := v.Args[0]
  1672  		v_1 := v.Args[1]
  1673  		if v_1.Op != OpInt64Make {
  1674  			break
  1675  		}
  1676  		v_1_0 := v_1.Args[0]
  1677  		if v_1_0.Op != OpConst32 {
  1678  			break
  1679  		}
  1680  		if v_1_0.AuxInt != 0 {
  1681  			break
  1682  		}
  1683  		lo := v_1.Args[1]
  1684  		v.reset(OpRsh32x32)
  1685  		v.AddArg(x)
  1686  		v.AddArg(lo)
  1687  		return true
  1688  	}
  1689  	// match: (Rsh32x64 x (Int64Make hi lo))
  1690  	// cond: hi.Op != OpConst32
  1691  	// result: (Rsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1692  	for {
  1693  		x := v.Args[0]
  1694  		v_1 := v.Args[1]
  1695  		if v_1.Op != OpInt64Make {
  1696  			break
  1697  		}
  1698  		hi := v_1.Args[0]
  1699  		lo := v_1.Args[1]
  1700  		if !(hi.Op != OpConst32) {
  1701  			break
  1702  		}
  1703  		v.reset(OpRsh32x32)
  1704  		v.AddArg(x)
  1705  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1706  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1707  		v1.AddArg(hi)
  1708  		v0.AddArg(v1)
  1709  		v0.AddArg(lo)
  1710  		v.AddArg(v0)
  1711  		return true
  1712  	}
  1713  	return false
  1714  }
  1715  func rewriteValuedec64_OpRsh64Ux16(v *Value, config *Config) bool {
  1716  	b := v.Block
  1717  	_ = b
  1718  	// match: (Rsh64Ux16 (Int64Make hi lo) s)
  1719  	// cond:
  1720  	// result: (Int64Make 		(Rsh32Ux16 <config.fe.TypeUInt32()> hi s) 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Rsh32Ux16 <config.fe.TypeUInt32()> lo s) 				(Lsh32x16 <config.fe.TypeUInt32()> 					hi 					(Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s))) 			(Rsh32Ux16 <config.fe.TypeUInt32()> 				hi 				(Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32])))))
  1721  	for {
  1722  		v_0 := v.Args[0]
  1723  		if v_0.Op != OpInt64Make {
  1724  			break
  1725  		}
  1726  		hi := v_0.Args[0]
  1727  		lo := v_0.Args[1]
  1728  		s := v.Args[1]
  1729  		v.reset(OpInt64Make)
  1730  		v0 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
  1731  		v0.AddArg(hi)
  1732  		v0.AddArg(s)
  1733  		v.AddArg(v0)
  1734  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1735  		v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1736  		v3 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
  1737  		v3.AddArg(lo)
  1738  		v3.AddArg(s)
  1739  		v2.AddArg(v3)
  1740  		v4 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
  1741  		v4.AddArg(hi)
  1742  		v5 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
  1743  		v6 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
  1744  		v6.AuxInt = 32
  1745  		v5.AddArg(v6)
  1746  		v5.AddArg(s)
  1747  		v4.AddArg(v5)
  1748  		v2.AddArg(v4)
  1749  		v1.AddArg(v2)
  1750  		v7 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
  1751  		v7.AddArg(hi)
  1752  		v8 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
  1753  		v8.AddArg(s)
  1754  		v9 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
  1755  		v9.AuxInt = 32
  1756  		v8.AddArg(v9)
  1757  		v7.AddArg(v8)
  1758  		v1.AddArg(v7)
  1759  		v.AddArg(v1)
  1760  		return true
  1761  	}
  1762  	return false
  1763  }
  1764  func rewriteValuedec64_OpRsh64Ux32(v *Value, config *Config) bool {
  1765  	b := v.Block
  1766  	_ = b
  1767  	// match: (Rsh64Ux32 (Int64Make hi lo) s)
  1768  	// cond:
  1769  	// result: (Int64Make 		(Rsh32Ux32 <config.fe.TypeUInt32()> hi s) 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Rsh32Ux32 <config.fe.TypeUInt32()> lo s) 				(Lsh32x32 <config.fe.TypeUInt32()> 					hi 					(Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s))) 			(Rsh32Ux32 <config.fe.TypeUInt32()> 				hi 				(Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))))
  1770  	for {
  1771  		v_0 := v.Args[0]
  1772  		if v_0.Op != OpInt64Make {
  1773  			break
  1774  		}
  1775  		hi := v_0.Args[0]
  1776  		lo := v_0.Args[1]
  1777  		s := v.Args[1]
  1778  		v.reset(OpInt64Make)
  1779  		v0 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
  1780  		v0.AddArg(hi)
  1781  		v0.AddArg(s)
  1782  		v.AddArg(v0)
  1783  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1784  		v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1785  		v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
  1786  		v3.AddArg(lo)
  1787  		v3.AddArg(s)
  1788  		v2.AddArg(v3)
  1789  		v4 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
  1790  		v4.AddArg(hi)
  1791  		v5 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
  1792  		v6 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  1793  		v6.AuxInt = 32
  1794  		v5.AddArg(v6)
  1795  		v5.AddArg(s)
  1796  		v4.AddArg(v5)
  1797  		v2.AddArg(v4)
  1798  		v1.AddArg(v2)
  1799  		v7 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
  1800  		v7.AddArg(hi)
  1801  		v8 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
  1802  		v8.AddArg(s)
  1803  		v9 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  1804  		v9.AuxInt = 32
  1805  		v8.AddArg(v9)
  1806  		v7.AddArg(v8)
  1807  		v1.AddArg(v7)
  1808  		v.AddArg(v1)
  1809  		return true
  1810  	}
  1811  	return false
  1812  }
  1813  func rewriteValuedec64_OpRsh64Ux64(v *Value, config *Config) bool {
  1814  	b := v.Block
  1815  	_ = b
  1816  	// match: (Rsh64Ux64 _ (Int64Make (Const32 [c]) _))
  1817  	// cond: c != 0
  1818  	// result: (Const64 [0])
  1819  	for {
  1820  		v_1 := v.Args[1]
  1821  		if v_1.Op != OpInt64Make {
  1822  			break
  1823  		}
  1824  		v_1_0 := v_1.Args[0]
  1825  		if v_1_0.Op != OpConst32 {
  1826  			break
  1827  		}
  1828  		c := v_1_0.AuxInt
  1829  		if !(c != 0) {
  1830  			break
  1831  		}
  1832  		v.reset(OpConst64)
  1833  		v.AuxInt = 0
  1834  		return true
  1835  	}
  1836  	// match: (Rsh64Ux64 x (Int64Make (Const32 [0]) lo))
  1837  	// cond:
  1838  	// result: (Rsh64Ux32 x lo)
  1839  	for {
  1840  		x := v.Args[0]
  1841  		v_1 := v.Args[1]
  1842  		if v_1.Op != OpInt64Make {
  1843  			break
  1844  		}
  1845  		v_1_0 := v_1.Args[0]
  1846  		if v_1_0.Op != OpConst32 {
  1847  			break
  1848  		}
  1849  		if v_1_0.AuxInt != 0 {
  1850  			break
  1851  		}
  1852  		lo := v_1.Args[1]
  1853  		v.reset(OpRsh64Ux32)
  1854  		v.AddArg(x)
  1855  		v.AddArg(lo)
  1856  		return true
  1857  	}
  1858  	// match: (Rsh64Ux64 x (Int64Make hi lo))
  1859  	// cond: hi.Op != OpConst32
  1860  	// result: (Rsh64Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  1861  	for {
  1862  		x := v.Args[0]
  1863  		v_1 := v.Args[1]
  1864  		if v_1.Op != OpInt64Make {
  1865  			break
  1866  		}
  1867  		hi := v_1.Args[0]
  1868  		lo := v_1.Args[1]
  1869  		if !(hi.Op != OpConst32) {
  1870  			break
  1871  		}
  1872  		v.reset(OpRsh64Ux32)
  1873  		v.AddArg(x)
  1874  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1875  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1876  		v1.AddArg(hi)
  1877  		v0.AddArg(v1)
  1878  		v0.AddArg(lo)
  1879  		v.AddArg(v0)
  1880  		return true
  1881  	}
  1882  	return false
  1883  }
  1884  func rewriteValuedec64_OpRsh64Ux8(v *Value, config *Config) bool {
  1885  	b := v.Block
  1886  	_ = b
  1887  	// match: (Rsh64Ux8 (Int64Make hi lo) s)
  1888  	// cond:
  1889  	// result: (Int64Make 		(Rsh32Ux8 <config.fe.TypeUInt32()> hi s) 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Rsh32Ux8 <config.fe.TypeUInt32()> lo s) 				(Lsh32x8 <config.fe.TypeUInt32()> 					hi 					(Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s))) 			(Rsh32Ux8 <config.fe.TypeUInt32()> 				hi 				(Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32])))))
  1890  	for {
  1891  		v_0 := v.Args[0]
  1892  		if v_0.Op != OpInt64Make {
  1893  			break
  1894  		}
  1895  		hi := v_0.Args[0]
  1896  		lo := v_0.Args[1]
  1897  		s := v.Args[1]
  1898  		v.reset(OpInt64Make)
  1899  		v0 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
  1900  		v0.AddArg(hi)
  1901  		v0.AddArg(s)
  1902  		v.AddArg(v0)
  1903  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1904  		v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1905  		v3 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
  1906  		v3.AddArg(lo)
  1907  		v3.AddArg(s)
  1908  		v2.AddArg(v3)
  1909  		v4 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
  1910  		v4.AddArg(hi)
  1911  		v5 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
  1912  		v6 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
  1913  		v6.AuxInt = 32
  1914  		v5.AddArg(v6)
  1915  		v5.AddArg(s)
  1916  		v4.AddArg(v5)
  1917  		v2.AddArg(v4)
  1918  		v1.AddArg(v2)
  1919  		v7 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
  1920  		v7.AddArg(hi)
  1921  		v8 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
  1922  		v8.AddArg(s)
  1923  		v9 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
  1924  		v9.AuxInt = 32
  1925  		v8.AddArg(v9)
  1926  		v7.AddArg(v8)
  1927  		v1.AddArg(v7)
  1928  		v.AddArg(v1)
  1929  		return true
  1930  	}
  1931  	return false
  1932  }
  1933  func rewriteValuedec64_OpRsh64x16(v *Value, config *Config) bool {
  1934  	b := v.Block
  1935  	_ = b
  1936  	// match: (Rsh64x16 (Int64Make hi lo) s)
  1937  	// cond:
  1938  	// result: (Int64Make 		(Rsh32x16 <config.fe.TypeUInt32()> hi s) 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Rsh32Ux16 <config.fe.TypeUInt32()> lo s) 				(Lsh32x16 <config.fe.TypeUInt32()> 					hi 					(Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s))) 			(And32 <config.fe.TypeUInt32()> 				(Rsh32x16 <config.fe.TypeUInt32()> 					hi 					(Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32]))) 				(Zeromask 					(ZeroExt16to32 						(Rsh16Ux32 <config.fe.TypeUInt16()> s (Const32 <config.fe.TypeUInt32()> [5])))))))
  1939  	for {
  1940  		v_0 := v.Args[0]
  1941  		if v_0.Op != OpInt64Make {
  1942  			break
  1943  		}
  1944  		hi := v_0.Args[0]
  1945  		lo := v_0.Args[1]
  1946  		s := v.Args[1]
  1947  		v.reset(OpInt64Make)
  1948  		v0 := b.NewValue0(v.Line, OpRsh32x16, config.fe.TypeUInt32())
  1949  		v0.AddArg(hi)
  1950  		v0.AddArg(s)
  1951  		v.AddArg(v0)
  1952  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1953  		v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  1954  		v3 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
  1955  		v3.AddArg(lo)
  1956  		v3.AddArg(s)
  1957  		v2.AddArg(v3)
  1958  		v4 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
  1959  		v4.AddArg(hi)
  1960  		v5 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
  1961  		v6 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
  1962  		v6.AuxInt = 32
  1963  		v5.AddArg(v6)
  1964  		v5.AddArg(s)
  1965  		v4.AddArg(v5)
  1966  		v2.AddArg(v4)
  1967  		v1.AddArg(v2)
  1968  		v7 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
  1969  		v8 := b.NewValue0(v.Line, OpRsh32x16, config.fe.TypeUInt32())
  1970  		v8.AddArg(hi)
  1971  		v9 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
  1972  		v9.AddArg(s)
  1973  		v10 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
  1974  		v10.AuxInt = 32
  1975  		v9.AddArg(v10)
  1976  		v8.AddArg(v9)
  1977  		v7.AddArg(v8)
  1978  		v11 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  1979  		v12 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
  1980  		v13 := b.NewValue0(v.Line, OpRsh16Ux32, config.fe.TypeUInt16())
  1981  		v13.AddArg(s)
  1982  		v14 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  1983  		v14.AuxInt = 5
  1984  		v13.AddArg(v14)
  1985  		v12.AddArg(v13)
  1986  		v11.AddArg(v12)
  1987  		v7.AddArg(v11)
  1988  		v1.AddArg(v7)
  1989  		v.AddArg(v1)
  1990  		return true
  1991  	}
  1992  	return false
  1993  }
  1994  func rewriteValuedec64_OpRsh64x32(v *Value, config *Config) bool {
  1995  	b := v.Block
  1996  	_ = b
  1997  	// match: (Rsh64x32 (Int64Make hi lo) s)
  1998  	// cond:
  1999  	// result: (Int64Make 		(Rsh32x32 <config.fe.TypeUInt32()> hi s) 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Rsh32Ux32 <config.fe.TypeUInt32()> lo s) 				(Lsh32x32 <config.fe.TypeUInt32()> 					hi 					(Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s))) 			(And32 <config.fe.TypeUInt32()> 				(Rsh32x32 <config.fe.TypeUInt32()> 					hi 					(Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32]))) 				(Zeromask 					(Rsh32Ux32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [5]))))))
  2000  	for {
  2001  		v_0 := v.Args[0]
  2002  		if v_0.Op != OpInt64Make {
  2003  			break
  2004  		}
  2005  		hi := v_0.Args[0]
  2006  		lo := v_0.Args[1]
  2007  		s := v.Args[1]
  2008  		v.reset(OpInt64Make)
  2009  		v0 := b.NewValue0(v.Line, OpRsh32x32, config.fe.TypeUInt32())
  2010  		v0.AddArg(hi)
  2011  		v0.AddArg(s)
  2012  		v.AddArg(v0)
  2013  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2014  		v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2015  		v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
  2016  		v3.AddArg(lo)
  2017  		v3.AddArg(s)
  2018  		v2.AddArg(v3)
  2019  		v4 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
  2020  		v4.AddArg(hi)
  2021  		v5 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
  2022  		v6 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  2023  		v6.AuxInt = 32
  2024  		v5.AddArg(v6)
  2025  		v5.AddArg(s)
  2026  		v4.AddArg(v5)
  2027  		v2.AddArg(v4)
  2028  		v1.AddArg(v2)
  2029  		v7 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
  2030  		v8 := b.NewValue0(v.Line, OpRsh32x32, config.fe.TypeUInt32())
  2031  		v8.AddArg(hi)
  2032  		v9 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
  2033  		v9.AddArg(s)
  2034  		v10 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  2035  		v10.AuxInt = 32
  2036  		v9.AddArg(v10)
  2037  		v8.AddArg(v9)
  2038  		v7.AddArg(v8)
  2039  		v11 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  2040  		v12 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
  2041  		v12.AddArg(s)
  2042  		v13 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  2043  		v13.AuxInt = 5
  2044  		v12.AddArg(v13)
  2045  		v11.AddArg(v12)
  2046  		v7.AddArg(v11)
  2047  		v1.AddArg(v7)
  2048  		v.AddArg(v1)
  2049  		return true
  2050  	}
  2051  	return false
  2052  }
  2053  func rewriteValuedec64_OpRsh64x64(v *Value, config *Config) bool {
  2054  	b := v.Block
  2055  	_ = b
  2056  	// match: (Rsh64x64 x (Int64Make (Const32 [c]) _))
  2057  	// cond: c != 0
  2058  	// result: (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
  2059  	for {
  2060  		x := v.Args[0]
  2061  		v_1 := v.Args[1]
  2062  		if v_1.Op != OpInt64Make {
  2063  			break
  2064  		}
  2065  		v_1_0 := v_1.Args[0]
  2066  		if v_1_0.Op != OpConst32 {
  2067  			break
  2068  		}
  2069  		c := v_1_0.AuxInt
  2070  		if !(c != 0) {
  2071  			break
  2072  		}
  2073  		v.reset(OpInt64Make)
  2074  		v0 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
  2075  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  2076  		v1.AddArg(x)
  2077  		v0.AddArg(v1)
  2078  		v.AddArg(v0)
  2079  		v2 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
  2080  		v3 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  2081  		v3.AddArg(x)
  2082  		v2.AddArg(v3)
  2083  		v.AddArg(v2)
  2084  		return true
  2085  	}
  2086  	// match: (Rsh64x64 x (Int64Make (Const32 [0]) lo))
  2087  	// cond:
  2088  	// result: (Rsh64x32 x lo)
  2089  	for {
  2090  		x := v.Args[0]
  2091  		v_1 := v.Args[1]
  2092  		if v_1.Op != OpInt64Make {
  2093  			break
  2094  		}
  2095  		v_1_0 := v_1.Args[0]
  2096  		if v_1_0.Op != OpConst32 {
  2097  			break
  2098  		}
  2099  		if v_1_0.AuxInt != 0 {
  2100  			break
  2101  		}
  2102  		lo := v_1.Args[1]
  2103  		v.reset(OpRsh64x32)
  2104  		v.AddArg(x)
  2105  		v.AddArg(lo)
  2106  		return true
  2107  	}
  2108  	// match: (Rsh64x64 x (Int64Make hi lo))
  2109  	// cond: hi.Op != OpConst32
  2110  	// result: (Rsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  2111  	for {
  2112  		x := v.Args[0]
  2113  		v_1 := v.Args[1]
  2114  		if v_1.Op != OpInt64Make {
  2115  			break
  2116  		}
  2117  		hi := v_1.Args[0]
  2118  		lo := v_1.Args[1]
  2119  		if !(hi.Op != OpConst32) {
  2120  			break
  2121  		}
  2122  		v.reset(OpRsh64x32)
  2123  		v.AddArg(x)
  2124  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2125  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  2126  		v1.AddArg(hi)
  2127  		v0.AddArg(v1)
  2128  		v0.AddArg(lo)
  2129  		v.AddArg(v0)
  2130  		return true
  2131  	}
  2132  	return false
  2133  }
  2134  func rewriteValuedec64_OpRsh64x8(v *Value, config *Config) bool {
  2135  	b := v.Block
  2136  	_ = b
  2137  	// match: (Rsh64x8 (Int64Make hi lo) s)
  2138  	// cond:
  2139  	// result: (Int64Make 		(Rsh32x8 <config.fe.TypeUInt32()> hi s) 		(Or32 <config.fe.TypeUInt32()> 			(Or32 <config.fe.TypeUInt32()> 				(Rsh32Ux8 <config.fe.TypeUInt32()> lo s) 				(Lsh32x8 <config.fe.TypeUInt32()> 					hi 					(Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s))) 			(And32 <config.fe.TypeUInt32()> 				(Rsh32x8 <config.fe.TypeUInt32()> 					hi 					(Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32]))) 				(Zeromask 					(ZeroExt8to32 						(Rsh8Ux32 <config.fe.TypeUInt8()> s (Const32 <config.fe.TypeUInt32()> [5])))))))
  2140  	for {
  2141  		v_0 := v.Args[0]
  2142  		if v_0.Op != OpInt64Make {
  2143  			break
  2144  		}
  2145  		hi := v_0.Args[0]
  2146  		lo := v_0.Args[1]
  2147  		s := v.Args[1]
  2148  		v.reset(OpInt64Make)
  2149  		v0 := b.NewValue0(v.Line, OpRsh32x8, config.fe.TypeUInt32())
  2150  		v0.AddArg(hi)
  2151  		v0.AddArg(s)
  2152  		v.AddArg(v0)
  2153  		v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2154  		v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2155  		v3 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
  2156  		v3.AddArg(lo)
  2157  		v3.AddArg(s)
  2158  		v2.AddArg(v3)
  2159  		v4 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
  2160  		v4.AddArg(hi)
  2161  		v5 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
  2162  		v6 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
  2163  		v6.AuxInt = 32
  2164  		v5.AddArg(v6)
  2165  		v5.AddArg(s)
  2166  		v4.AddArg(v5)
  2167  		v2.AddArg(v4)
  2168  		v1.AddArg(v2)
  2169  		v7 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
  2170  		v8 := b.NewValue0(v.Line, OpRsh32x8, config.fe.TypeUInt32())
  2171  		v8.AddArg(hi)
  2172  		v9 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
  2173  		v9.AddArg(s)
  2174  		v10 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
  2175  		v10.AuxInt = 32
  2176  		v9.AddArg(v10)
  2177  		v8.AddArg(v9)
  2178  		v7.AddArg(v8)
  2179  		v11 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  2180  		v12 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
  2181  		v13 := b.NewValue0(v.Line, OpRsh8Ux32, config.fe.TypeUInt8())
  2182  		v13.AddArg(s)
  2183  		v14 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  2184  		v14.AuxInt = 5
  2185  		v13.AddArg(v14)
  2186  		v12.AddArg(v13)
  2187  		v11.AddArg(v12)
  2188  		v7.AddArg(v11)
  2189  		v1.AddArg(v7)
  2190  		v.AddArg(v1)
  2191  		return true
  2192  	}
  2193  	return false
  2194  }
  2195  func rewriteValuedec64_OpRsh8Ux64(v *Value, config *Config) bool {
  2196  	b := v.Block
  2197  	_ = b
  2198  	// match: (Rsh8Ux64 _ (Int64Make (Const32 [c]) _))
  2199  	// cond: c != 0
  2200  	// result: (Const32 [0])
  2201  	for {
  2202  		v_1 := v.Args[1]
  2203  		if v_1.Op != OpInt64Make {
  2204  			break
  2205  		}
  2206  		v_1_0 := v_1.Args[0]
  2207  		if v_1_0.Op != OpConst32 {
  2208  			break
  2209  		}
  2210  		c := v_1_0.AuxInt
  2211  		if !(c != 0) {
  2212  			break
  2213  		}
  2214  		v.reset(OpConst32)
  2215  		v.AuxInt = 0
  2216  		return true
  2217  	}
  2218  	// match: (Rsh8Ux64 x (Int64Make (Const32 [0]) lo))
  2219  	// cond:
  2220  	// result: (Rsh8Ux32 x lo)
  2221  	for {
  2222  		x := v.Args[0]
  2223  		v_1 := v.Args[1]
  2224  		if v_1.Op != OpInt64Make {
  2225  			break
  2226  		}
  2227  		v_1_0 := v_1.Args[0]
  2228  		if v_1_0.Op != OpConst32 {
  2229  			break
  2230  		}
  2231  		if v_1_0.AuxInt != 0 {
  2232  			break
  2233  		}
  2234  		lo := v_1.Args[1]
  2235  		v.reset(OpRsh8Ux32)
  2236  		v.AddArg(x)
  2237  		v.AddArg(lo)
  2238  		return true
  2239  	}
  2240  	// match: (Rsh8Ux64 x (Int64Make hi lo))
  2241  	// cond: hi.Op != OpConst32
  2242  	// result: (Rsh8Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  2243  	for {
  2244  		x := v.Args[0]
  2245  		v_1 := v.Args[1]
  2246  		if v_1.Op != OpInt64Make {
  2247  			break
  2248  		}
  2249  		hi := v_1.Args[0]
  2250  		lo := v_1.Args[1]
  2251  		if !(hi.Op != OpConst32) {
  2252  			break
  2253  		}
  2254  		v.reset(OpRsh8Ux32)
  2255  		v.AddArg(x)
  2256  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2257  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  2258  		v1.AddArg(hi)
  2259  		v0.AddArg(v1)
  2260  		v0.AddArg(lo)
  2261  		v.AddArg(v0)
  2262  		return true
  2263  	}
  2264  	return false
  2265  }
  2266  func rewriteValuedec64_OpRsh8x64(v *Value, config *Config) bool {
  2267  	b := v.Block
  2268  	_ = b
  2269  	// match: (Rsh8x64 x (Int64Make (Const32 [c]) _))
  2270  	// cond: c != 0
  2271  	// result: (Signmask (SignExt8to32 x))
  2272  	for {
  2273  		x := v.Args[0]
  2274  		v_1 := v.Args[1]
  2275  		if v_1.Op != OpInt64Make {
  2276  			break
  2277  		}
  2278  		v_1_0 := v_1.Args[0]
  2279  		if v_1_0.Op != OpConst32 {
  2280  			break
  2281  		}
  2282  		c := v_1_0.AuxInt
  2283  		if !(c != 0) {
  2284  			break
  2285  		}
  2286  		v.reset(OpSignmask)
  2287  		v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32())
  2288  		v0.AddArg(x)
  2289  		v.AddArg(v0)
  2290  		return true
  2291  	}
  2292  	// match: (Rsh8x64 x (Int64Make (Const32 [0]) lo))
  2293  	// cond:
  2294  	// result: (Rsh8x32 x lo)
  2295  	for {
  2296  		x := v.Args[0]
  2297  		v_1 := v.Args[1]
  2298  		if v_1.Op != OpInt64Make {
  2299  			break
  2300  		}
  2301  		v_1_0 := v_1.Args[0]
  2302  		if v_1_0.Op != OpConst32 {
  2303  			break
  2304  		}
  2305  		if v_1_0.AuxInt != 0 {
  2306  			break
  2307  		}
  2308  		lo := v_1.Args[1]
  2309  		v.reset(OpRsh8x32)
  2310  		v.AddArg(x)
  2311  		v.AddArg(lo)
  2312  		return true
  2313  	}
  2314  	// match: (Rsh8x64 x (Int64Make hi lo))
  2315  	// cond: hi.Op != OpConst32
  2316  	// result: (Rsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
  2317  	for {
  2318  		x := v.Args[0]
  2319  		v_1 := v.Args[1]
  2320  		if v_1.Op != OpInt64Make {
  2321  			break
  2322  		}
  2323  		hi := v_1.Args[0]
  2324  		lo := v_1.Args[1]
  2325  		if !(hi.Op != OpConst32) {
  2326  			break
  2327  		}
  2328  		v.reset(OpRsh8x32)
  2329  		v.AddArg(x)
  2330  		v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
  2331  		v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
  2332  		v1.AddArg(hi)
  2333  		v0.AddArg(v1)
  2334  		v0.AddArg(lo)
  2335  		v.AddArg(v0)
  2336  		return true
  2337  	}
  2338  	return false
  2339  }
  2340  func rewriteValuedec64_OpSignExt16to64(v *Value, config *Config) bool {
  2341  	b := v.Block
  2342  	_ = b
  2343  	// match: (SignExt16to64 x)
  2344  	// cond:
  2345  	// result: (SignExt32to64 (SignExt16to32 x))
  2346  	for {
  2347  		x := v.Args[0]
  2348  		v.reset(OpSignExt32to64)
  2349  		v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32())
  2350  		v0.AddArg(x)
  2351  		v.AddArg(v0)
  2352  		return true
  2353  	}
  2354  }
  2355  func rewriteValuedec64_OpSignExt32to64(v *Value, config *Config) bool {
  2356  	b := v.Block
  2357  	_ = b
  2358  	// match: (SignExt32to64 x)
  2359  	// cond:
  2360  	// result: (Int64Make (Signmask x) x)
  2361  	for {
  2362  		x := v.Args[0]
  2363  		v.reset(OpInt64Make)
  2364  		v0 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
  2365  		v0.AddArg(x)
  2366  		v.AddArg(v0)
  2367  		v.AddArg(x)
  2368  		return true
  2369  	}
  2370  }
  2371  func rewriteValuedec64_OpSignExt8to64(v *Value, config *Config) bool {
  2372  	b := v.Block
  2373  	_ = b
  2374  	// match: (SignExt8to64 x)
  2375  	// cond:
  2376  	// result: (SignExt32to64 (SignExt8to32 x))
  2377  	for {
  2378  		x := v.Args[0]
  2379  		v.reset(OpSignExt32to64)
  2380  		v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32())
  2381  		v0.AddArg(x)
  2382  		v.AddArg(v0)
  2383  		return true
  2384  	}
  2385  }
  2386  func rewriteValuedec64_OpStore(v *Value, config *Config) bool {
  2387  	b := v.Block
  2388  	_ = b
  2389  	// match: (Store [8] dst (Int64Make hi lo) mem)
  2390  	// cond:
  2391  	// result: (Store [4] 		(OffPtr <hi.Type.PtrTo()> [4] dst) 		hi 		(Store [4] dst lo mem))
  2392  	for {
  2393  		if v.AuxInt != 8 {
  2394  			break
  2395  		}
  2396  		dst := v.Args[0]
  2397  		v_1 := v.Args[1]
  2398  		if v_1.Op != OpInt64Make {
  2399  			break
  2400  		}
  2401  		hi := v_1.Args[0]
  2402  		lo := v_1.Args[1]
  2403  		mem := v.Args[2]
  2404  		v.reset(OpStore)
  2405  		v.AuxInt = 4
  2406  		v0 := b.NewValue0(v.Line, OpOffPtr, hi.Type.PtrTo())
  2407  		v0.AuxInt = 4
  2408  		v0.AddArg(dst)
  2409  		v.AddArg(v0)
  2410  		v.AddArg(hi)
  2411  		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
  2412  		v1.AuxInt = 4
  2413  		v1.AddArg(dst)
  2414  		v1.AddArg(lo)
  2415  		v1.AddArg(mem)
  2416  		v.AddArg(v1)
  2417  		return true
  2418  	}
  2419  	return false
  2420  }
  2421  func rewriteValuedec64_OpSub64(v *Value, config *Config) bool {
  2422  	b := v.Block
  2423  	_ = b
  2424  	// match: (Sub64 x y)
  2425  	// cond:
  2426  	// result: (Int64Make 		(Sub32withcarry <config.fe.TypeInt32()> 			(Int64Hi x) 			(Int64Hi y) 			(Select1 <TypeFlags> (Sub32carry (Int64Lo x) (Int64Lo y)))) 		(Select0 <config.fe.TypeUInt32()> (Sub32carry (Int64Lo x) (Int64Lo y))))
  2427  	for {
  2428  		x := v.Args[0]
  2429  		y := v.Args[1]
  2430  		v.reset(OpInt64Make)
  2431  		v0 := b.NewValue0(v.Line, OpSub32withcarry, config.fe.TypeInt32())
  2432  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  2433  		v1.AddArg(x)
  2434  		v0.AddArg(v1)
  2435  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  2436  		v2.AddArg(y)
  2437  		v0.AddArg(v2)
  2438  		v3 := b.NewValue0(v.Line, OpSelect1, TypeFlags)
  2439  		v4 := b.NewValue0(v.Line, OpSub32carry, MakeTuple(config.fe.TypeUInt32(), TypeFlags))
  2440  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  2441  		v5.AddArg(x)
  2442  		v4.AddArg(v5)
  2443  		v6 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  2444  		v6.AddArg(y)
  2445  		v4.AddArg(v6)
  2446  		v3.AddArg(v4)
  2447  		v0.AddArg(v3)
  2448  		v.AddArg(v0)
  2449  		v7 := b.NewValue0(v.Line, OpSelect0, config.fe.TypeUInt32())
  2450  		v8 := b.NewValue0(v.Line, OpSub32carry, MakeTuple(config.fe.TypeUInt32(), TypeFlags))
  2451  		v9 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  2452  		v9.AddArg(x)
  2453  		v8.AddArg(v9)
  2454  		v10 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  2455  		v10.AddArg(y)
  2456  		v8.AddArg(v10)
  2457  		v7.AddArg(v8)
  2458  		v.AddArg(v7)
  2459  		return true
  2460  	}
  2461  }
  2462  func rewriteValuedec64_OpTrunc64to16(v *Value, config *Config) bool {
  2463  	b := v.Block
  2464  	_ = b
  2465  	// match: (Trunc64to16 (Int64Make _ lo))
  2466  	// cond:
  2467  	// result: (Trunc32to16 lo)
  2468  	for {
  2469  		v_0 := v.Args[0]
  2470  		if v_0.Op != OpInt64Make {
  2471  			break
  2472  		}
  2473  		lo := v_0.Args[1]
  2474  		v.reset(OpTrunc32to16)
  2475  		v.AddArg(lo)
  2476  		return true
  2477  	}
  2478  	return false
  2479  }
  2480  func rewriteValuedec64_OpTrunc64to32(v *Value, config *Config) bool {
  2481  	b := v.Block
  2482  	_ = b
  2483  	// match: (Trunc64to32 (Int64Make _ lo))
  2484  	// cond:
  2485  	// result: lo
  2486  	for {
  2487  		v_0 := v.Args[0]
  2488  		if v_0.Op != OpInt64Make {
  2489  			break
  2490  		}
  2491  		lo := v_0.Args[1]
  2492  		v.reset(OpCopy)
  2493  		v.Type = lo.Type
  2494  		v.AddArg(lo)
  2495  		return true
  2496  	}
  2497  	return false
  2498  }
  2499  func rewriteValuedec64_OpTrunc64to8(v *Value, config *Config) bool {
  2500  	b := v.Block
  2501  	_ = b
  2502  	// match: (Trunc64to8 (Int64Make _ lo))
  2503  	// cond:
  2504  	// result: (Trunc32to8 lo)
  2505  	for {
  2506  		v_0 := v.Args[0]
  2507  		if v_0.Op != OpInt64Make {
  2508  			break
  2509  		}
  2510  		lo := v_0.Args[1]
  2511  		v.reset(OpTrunc32to8)
  2512  		v.AddArg(lo)
  2513  		return true
  2514  	}
  2515  	return false
  2516  }
  2517  func rewriteValuedec64_OpXor64(v *Value, config *Config) bool {
  2518  	b := v.Block
  2519  	_ = b
  2520  	// match: (Xor64 x y)
  2521  	// cond:
  2522  	// result: (Int64Make 		(Xor32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Hi y)) 		(Xor32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Lo y)))
  2523  	for {
  2524  		x := v.Args[0]
  2525  		y := v.Args[1]
  2526  		v.reset(OpInt64Make)
  2527  		v0 := b.NewValue0(v.Line, OpXor32, config.fe.TypeUInt32())
  2528  		v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  2529  		v1.AddArg(x)
  2530  		v0.AddArg(v1)
  2531  		v2 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
  2532  		v2.AddArg(y)
  2533  		v0.AddArg(v2)
  2534  		v.AddArg(v0)
  2535  		v3 := b.NewValue0(v.Line, OpXor32, config.fe.TypeUInt32())
  2536  		v4 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  2537  		v4.AddArg(x)
  2538  		v3.AddArg(v4)
  2539  		v5 := b.NewValue0(v.Line, OpInt64Lo, config.fe.TypeUInt32())
  2540  		v5.AddArg(y)
  2541  		v3.AddArg(v5)
  2542  		v.AddArg(v3)
  2543  		return true
  2544  	}
  2545  }
  2546  func rewriteValuedec64_OpZeroExt16to64(v *Value, config *Config) bool {
  2547  	b := v.Block
  2548  	_ = b
  2549  	// match: (ZeroExt16to64 x)
  2550  	// cond:
  2551  	// result: (ZeroExt32to64 (ZeroExt16to32 x))
  2552  	for {
  2553  		x := v.Args[0]
  2554  		v.reset(OpZeroExt32to64)
  2555  		v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
  2556  		v0.AddArg(x)
  2557  		v.AddArg(v0)
  2558  		return true
  2559  	}
  2560  }
  2561  func rewriteValuedec64_OpZeroExt32to64(v *Value, config *Config) bool {
  2562  	b := v.Block
  2563  	_ = b
  2564  	// match: (ZeroExt32to64 x)
  2565  	// cond:
  2566  	// result: (Int64Make (Const32 <config.fe.TypeUInt32()> [0]) x)
  2567  	for {
  2568  		x := v.Args[0]
  2569  		v.reset(OpInt64Make)
  2570  		v0 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
  2571  		v0.AuxInt = 0
  2572  		v.AddArg(v0)
  2573  		v.AddArg(x)
  2574  		return true
  2575  	}
  2576  }
  2577  func rewriteValuedec64_OpZeroExt8to64(v *Value, config *Config) bool {
  2578  	b := v.Block
  2579  	_ = b
  2580  	// match: (ZeroExt8to64 x)
  2581  	// cond:
  2582  	// result: (ZeroExt32to64 (ZeroExt8to32 x))
  2583  	for {
  2584  		x := v.Args[0]
  2585  		v.reset(OpZeroExt32to64)
  2586  		v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
  2587  		v0.AddArg(x)
  2588  		v.AddArg(v0)
  2589  		return true
  2590  	}
  2591  }
  2592  func rewriteBlockdec64(b *Block, config *Config) bool {
  2593  	switch b.Kind {
  2594  	}
  2595  	return false
  2596  }