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