github.com/bir3/gocompiler@v0.3.205/src/cmd/compile/internal/ssa/rewritedec64.go (about)

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