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