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