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