(Rsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8x32 x lo)
(Rsh8Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8Ux32 x lo)
+(Lsh64x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
+(Rsh64x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
+(Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
+
+(Lsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh64x32 x lo)
+(Rsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64x32 x lo)
+(Rsh64Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64Ux32 x lo)
+
+// turn x64 non-constant shifts to x32 shifts
+// if high 32-bit of the shift is nonzero, make a huge shift
+(Lsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Lsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh64Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh64Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Lsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Lsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh32Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh32Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Lsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Lsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh16Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh16Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Lsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Lsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+(Rsh8Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
+ (Rsh8Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+
+// 64x left shift
+// result.hi = hi<<s | lo>>(32-s) | lo<<(s-32) // >> is unsigned, large shifts result 0
+// result.lo = lo<<s
+(Lsh64x32 (Int64Make hi lo) s) ->
+ (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))
+(Lsh64x16 (Int64Make hi lo) s) ->
+ (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))
+(Lsh64x8 (Int64Make hi lo) s) ->
+ (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))
+
+// 64x unsigned right shift
+// result.hi = hi>>s
+// result.lo = lo>>s | hi<<(32-s) | hi>>(s-32) // >> is unsigned, large shifts result 0
+(Rsh64Ux32 (Int64Make hi lo) s) ->
+ (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])))))
+(Rsh64Ux16 (Int64Make hi lo) s) ->
+ (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])))))
+(Rsh64Ux8 (Int64Make hi lo) s) ->
+ (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])))))
+
+// 64x signed right shift
+// result.hi = hi>>s
+// result.lo = lo>>s | hi<<(32-s) | (hi>>(s-32))&^signmask(s-32) // hi>>(s-32) is signed, large shifts result 0/-1
+(Rsh64x32 (Int64Make hi lo) s) ->
+ (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])))
+ (Com32 <config.fe.TypeUInt32()>
+ (Signmask
+ (Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))))))
+(Rsh64x16 (Int64Make hi lo) s) ->
+ (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])))
+ (Com32 <config.fe.TypeUInt32()>
+ (Signmask
+ (SignExt16to32
+ (Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32]))))))))
+(Rsh64x8 (Int64Make hi lo) s) ->
+ (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])))
+ (Com32 <config.fe.TypeUInt32()>
+ (Signmask
+ (SignExt8to32
+ (Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32]))))))))
+
+// 64xConst32 shifts
+// we probably do not need them -- lateopt may take care of them just fine
+//(Lsh64x32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
+//(Rsh64x32 x (Const32 [c])) && uint32(c) >= 64 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
+//(Rsh64Ux32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
+//
+//(Lsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
+// (Int64Make
+// (Lsh32x32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c-32]))
+// (Const32 <config.fe.TypeUInt32()> [0]))
+//(Rsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
+// (Int64Make
+// (Signmask (Int64Hi x))
+// (Rsh32x32 <config.fe.TypeInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c-32])))
+//(Rsh64Ux32 x (Const32 [c])) && c < 64 && c > 32 ->
+// (Int64Make
+// (Const32 <config.fe.TypeUInt32()> [0])
+// (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c-32])))
+//
+//(Lsh64x32 x (Const32 [32])) -> (Int64Make (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [0]))
+//(Rsh64x32 x (Const32 [32])) -> (Int64Make (Signmask (Int64Hi x)) (Int64Hi x))
+//(Rsh64Ux32 x (Const32 [32])) -> (Int64Make (Const32 <config.fe.TypeUInt32()> [0]) (Int64Hi x))
+//
+//(Lsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
+// (Int64Make
+// (Or32 <config.fe.TypeUInt32()>
+// (Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c]))
+// (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [32-c])))
+// (Lsh32x32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c])))
+//(Rsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
+// (Int64Make
+// (Rsh32x32 <config.fe.TypeInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c]))
+// (Or32 <config.fe.TypeUInt32()>
+// (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c]))
+// (Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [32-c]))))
+//(Rsh64Ux32 x (Const32 [c])) && c < 32 && c > 0 ->
+// (Int64Make
+// (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c]))
+// (Or32 <config.fe.TypeUInt32()>
+// (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c]))
+// (Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [32-c]))))
+//
+//(Lsh64x32 x (Const32 [0])) -> x
+//(Rsh64x32 x (Const32 [0])) -> x
+//(Rsh64Ux32 x (Const32 [0])) -> x
+
+(Lrot64 (Int64Make hi lo) [c]) && c <= 32 ->
+ (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]))))
+(Lrot64 (Int64Make hi lo) [c]) && c > 32 -> (Lrot64 (Int64Make lo hi) [c-32])
+
(Const64 <t> [c]) && t.IsSigned() ->
(Int64Make (Const32 <config.fe.TypeInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [c&0xffffffff]))
(Const64 <t> [c]) && !t.IsSigned() ->
return rewriteValueARM_OpLess8U(v, config)
case OpLoad:
return rewriteValueARM_OpLoad(v, config)
+ case OpLrot16:
+ return rewriteValueARM_OpLrot16(v, config)
+ case OpLrot32:
+ return rewriteValueARM_OpLrot32(v, config)
+ case OpLrot8:
+ return rewriteValueARM_OpLrot8(v, config)
case OpLsh16x16:
return rewriteValueARM_OpLsh16x16(v, config)
case OpLsh16x32:
return rewriteValueARM_OpZeroExt8to16(v, config)
case OpZeroExt8to32:
return rewriteValueARM_OpZeroExt8to32(v, config)
+ case OpZeromask:
+ return rewriteValueARM_OpZeromask(v, config)
}
return false
}
}
return false
}
+func rewriteValueARM_OpLrot16(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lrot16 <t> x [c])
+ // cond:
+ // result: (OR (SLLconst <t> x [c&15]) (SRLconst <t> x [16-c&15]))
+ for {
+ t := v.Type
+ x := v.Args[0]
+ c := v.AuxInt
+ v.reset(OpARMOR)
+ v0 := b.NewValue0(v.Line, OpARMSLLconst, t)
+ v0.AddArg(x)
+ v0.AuxInt = c & 15
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpARMSRLconst, t)
+ v1.AddArg(x)
+ v1.AuxInt = 16 - c&15
+ v.AddArg(v1)
+ return true
+ }
+}
+func rewriteValueARM_OpLrot32(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lrot32 x [c])
+ // cond:
+ // result: (SRRconst x [32-c&31])
+ for {
+ x := v.Args[0]
+ c := v.AuxInt
+ v.reset(OpARMSRRconst)
+ v.AddArg(x)
+ v.AuxInt = 32 - c&31
+ return true
+ }
+}
+func rewriteValueARM_OpLrot8(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lrot8 <t> x [c])
+ // cond:
+ // result: (OR (SLLconst <t> x [c&7]) (SRLconst <t> x [8-c&7]))
+ for {
+ t := v.Type
+ x := v.Args[0]
+ c := v.AuxInt
+ v.reset(OpARMOR)
+ v0 := b.NewValue0(v.Line, OpARMSLLconst, t)
+ v0.AddArg(x)
+ v0.AuxInt = c & 7
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpARMSRLconst, t)
+ v1.AddArg(x)
+ v1.AuxInt = 8 - c&7
+ v.AddArg(v1)
+ return true
+ }
+}
func rewriteValueARM_OpLsh16x16(v *Value, config *Config) bool {
b := v.Block
_ = b
// match: (Lsh16x16 x y)
// cond:
- // result: (SLL x y)
+ // result: (SLL x (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSLL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Lsh16x8 x y)
// cond:
- // result: (SLL x y)
+ // result: (SLL x (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSLL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Lsh32x16 x y)
// cond:
- // result: (SLL x y)
+ // result: (SLL x (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSLL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Lsh32x8 x y)
// cond:
- // result: (SLL x y)
+ // result: (SLL x (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSLL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Lsh8x16 x y)
// cond:
- // result: (SLL x y)
+ // result: (SLL x (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSLL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Lsh8x8 x y)
// cond:
- // result: (SLL x y)
+ // result: (SLL x (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSLL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Rsh16Ux16 x y)
// cond:
- // result: (SRL (ZeroExt16to32 x) y)
+ // result: (SRL (ZeroExt16to32 x) (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh16Ux8 x y)
// cond:
- // result: (SRL (ZeroExt16to32 x) y)
+ // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh16x16 x y)
// cond:
- // result: (SRA (SignExt16to32 x) y)
+ // result: (SRA (SignExt16to32 x) (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh16x8 x y)
// cond:
- // result: (SRA (SignExt16to32 x) y)
+ // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh32Ux16 x y)
// cond:
- // result: (SRL x y)
+ // result: (SRL x (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSRL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Rsh32Ux8 x y)
// cond:
- // result: (SRL x y)
+ // result: (SRL x (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSRL)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Rsh32x16 x y)
// cond:
- // result: (SRA x y)
+ // result: (SRA x (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSRA)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Rsh32x8 x y)
// cond:
- // result: (SRA x y)
+ // result: (SRA x (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v.reset(OpARMSRA)
v.AddArg(x)
- v.AddArg(y)
+ v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v0.AddArg(y)
+ v.AddArg(v0)
return true
}
}
_ = b
// match: (Rsh8Ux16 x y)
// cond:
- // result: (SRL (ZeroExt8to32 x) y)
+ // result: (SRL (ZeroExt8to32 x) (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh8Ux8 x y)
// cond:
- // result: (SRL (ZeroExt8to32 x) y)
+ // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh8x16 x y)
// cond:
- // result: (SRA (SignExt8to32 x) y)
+ // result: (SRA (SignExt8to32 x) (ZeroExt16to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
_ = b
// match: (Rsh8x8 x y)
// cond:
- // result: (SRA (SignExt8to32 x) y)
+ // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y))
for {
x := v.Args[0]
y := v.Args[1]
v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32())
v0.AddArg(x)
v.AddArg(v0)
- v.AddArg(y)
+ v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32())
+ v1.AddArg(y)
+ v.AddArg(v1)
return true
}
}
return true
}
}
+func rewriteValueARM_OpZeromask(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Zeromask x)
+ // cond:
+ // result: (LoweredZeromask x)
+ for {
+ x := v.Args[0]
+ v.reset(OpARMLoweredZeromask)
+ v.AddArg(x)
+ return true
+ }
+}
func rewriteBlockARM(b *Block) bool {
switch b.Kind {
case BlockIf:
return rewriteValuedec64_OpLess64U(v, config)
case OpLoad:
return rewriteValuedec64_OpLoad(v, config)
+ case OpLrot64:
+ return rewriteValuedec64_OpLrot64(v, config)
case OpLsh16x64:
return rewriteValuedec64_OpLsh16x64(v, config)
case OpLsh32x64:
return rewriteValuedec64_OpLsh32x64(v, config)
+ case OpLsh64x16:
+ return rewriteValuedec64_OpLsh64x16(v, config)
+ case OpLsh64x32:
+ return rewriteValuedec64_OpLsh64x32(v, config)
+ case OpLsh64x64:
+ return rewriteValuedec64_OpLsh64x64(v, config)
+ case OpLsh64x8:
+ return rewriteValuedec64_OpLsh64x8(v, config)
case OpLsh8x64:
return rewriteValuedec64_OpLsh8x64(v, config)
case OpMul64:
return rewriteValuedec64_OpRsh32Ux64(v, config)
case OpRsh32x64:
return rewriteValuedec64_OpRsh32x64(v, config)
+ case OpRsh64Ux16:
+ return rewriteValuedec64_OpRsh64Ux16(v, config)
+ case OpRsh64Ux32:
+ return rewriteValuedec64_OpRsh64Ux32(v, config)
+ case OpRsh64Ux64:
+ return rewriteValuedec64_OpRsh64Ux64(v, config)
+ case OpRsh64Ux8:
+ return rewriteValuedec64_OpRsh64Ux8(v, config)
+ case OpRsh64x16:
+ return rewriteValuedec64_OpRsh64x16(v, config)
+ case OpRsh64x32:
+ return rewriteValuedec64_OpRsh64x32(v, config)
+ case OpRsh64x64:
+ return rewriteValuedec64_OpRsh64x64(v, config)
+ case OpRsh64x8:
+ return rewriteValuedec64_OpRsh64x8(v, config)
case OpRsh8Ux64:
return rewriteValuedec64_OpRsh8Ux64(v, config)
case OpRsh8x64:
}
return false
}
+func rewriteValuedec64_OpLrot64(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lrot64 (Int64Make hi lo) [c])
+ // cond: c <= 32
+ // 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]))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ c := v.AuxInt
+ if !(c <= 32) {
+ break
+ }
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v2.AuxInt = c
+ v1.AddArg(v2)
+ v0.AddArg(v1)
+ v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v4 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v4.AuxInt = 32 - c
+ v3.AddArg(v4)
+ v0.AddArg(v3)
+ v.AddArg(v0)
+ v5 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v6 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v6.AddArg(lo)
+ v7 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v7.AuxInt = c
+ v6.AddArg(v7)
+ v5.AddArg(v6)
+ v8 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v8.AddArg(hi)
+ v9 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v9.AuxInt = 32 - c
+ v8.AddArg(v9)
+ v5.AddArg(v8)
+ v.AddArg(v5)
+ return true
+ }
+ // match: (Lrot64 (Int64Make hi lo) [c])
+ // cond: c > 32
+ // result: (Lrot64 (Int64Make lo hi) [c-32])
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ c := v.AuxInt
+ if !(c > 32) {
+ break
+ }
+ v.reset(OpLrot64)
+ v0 := b.NewValue0(v.Line, OpInt64Make, config.fe.TypeUInt64())
+ v0.AddArg(lo)
+ v0.AddArg(hi)
+ v.AddArg(v0)
+ v.AuxInt = c - 32
+ return true
+ }
+ return false
+}
func rewriteValuedec64_OpLsh16x64(v *Value, config *Config) bool {
b := v.Block
_ = b
v.AddArg(lo)
return true
}
+ // match: (Lsh16x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Lsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpLsh16x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
return false
}
func rewriteValuedec64_OpLsh32x64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
+ // match: (Lsh32x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Lsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpLsh32x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpLsh64x16(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lsh64x16 (Int64Make hi lo) s)
+ // cond:
+ // 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))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
+ v2.AddArg(hi)
+ v2.AddArg(s)
+ v1.AddArg(v2)
+ v3 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v4 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v5 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v5.AuxInt = 32
+ v4.AddArg(v5)
+ v4.AddArg(s)
+ v3.AddArg(v4)
+ v1.AddArg(v3)
+ v0.AddArg(v1)
+ v6 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
+ v6.AddArg(lo)
+ v7 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v7.AddArg(s)
+ v8 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v8.AuxInt = 32
+ v7.AddArg(v8)
+ v6.AddArg(v7)
+ v0.AddArg(v6)
+ v.AddArg(v0)
+ v9 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
+ v9.AddArg(lo)
+ v9.AddArg(s)
+ v.AddArg(v9)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpLsh64x32(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lsh64x32 (Int64Make hi lo) s)
+ // cond:
+ // 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))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v2.AddArg(hi)
+ v2.AddArg(s)
+ v1.AddArg(v2)
+ v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v4 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v5 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v5.AuxInt = 32
+ v4.AddArg(v5)
+ v4.AddArg(s)
+ v3.AddArg(v4)
+ v1.AddArg(v3)
+ v0.AddArg(v1)
+ v6 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v6.AddArg(lo)
+ v7 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v7.AddArg(s)
+ v8 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v8.AuxInt = 32
+ v7.AddArg(v8)
+ v6.AddArg(v7)
+ v0.AddArg(v6)
+ v.AddArg(v0)
+ v9 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v9.AddArg(lo)
+ v9.AddArg(s)
+ v.AddArg(v9)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpLsh64x64(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lsh64x64 _ (Int64Make (Const32 [c]) _))
+ // cond: c != 0
+ // result: (Const64 [0])
+ for {
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ v_1_0 := v_1.Args[0]
+ if v_1_0.Op != OpConst32 {
+ break
+ }
+ c := v_1_0.AuxInt
+ if !(c != 0) {
+ break
+ }
+ v.reset(OpConst64)
+ v.AuxInt = 0
+ return true
+ }
+ // match: (Lsh64x64 x (Int64Make (Const32 [0]) lo))
+ // cond:
+ // result: (Lsh64x32 x lo)
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ v_1_0 := v_1.Args[0]
+ if v_1_0.Op != OpConst32 {
+ break
+ }
+ if v_1_0.AuxInt != 0 {
+ break
+ }
+ lo := v_1.Args[1]
+ v.reset(OpLsh64x32)
+ v.AddArg(x)
+ v.AddArg(lo)
+ return true
+ }
+ // match: (Lsh64x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Lsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpLsh64x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpLsh64x8(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Lsh64x8 (Int64Make hi lo) s)
+ // cond:
+ // 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))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
+ v2.AddArg(hi)
+ v2.AddArg(s)
+ v1.AddArg(v2)
+ v3 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v4 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v5 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v5.AuxInt = 32
+ v4.AddArg(v5)
+ v4.AddArg(s)
+ v3.AddArg(v4)
+ v1.AddArg(v3)
+ v0.AddArg(v1)
+ v6 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
+ v6.AddArg(lo)
+ v7 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v7.AddArg(s)
+ v8 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v8.AuxInt = 32
+ v7.AddArg(v8)
+ v6.AddArg(v7)
+ v0.AddArg(v6)
+ v.AddArg(v0)
+ v9 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
+ v9.AddArg(lo)
+ v9.AddArg(s)
+ v.AddArg(v9)
+ return true
+ }
return false
}
func rewriteValuedec64_OpLsh8x64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
+ // match: (Lsh8x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Lsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpLsh8x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
return false
}
func rewriteValuedec64_OpMul64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
+ // match: (Rsh16Ux64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh16Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh16Ux32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
return false
}
func rewriteValuedec64_OpRsh16x64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
+ // match: (Rsh16x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh16x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
return false
}
func rewriteValuedec64_OpRsh32Ux64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
- return false
-}
-func rewriteValuedec64_OpRsh32x64(v *Value, config *Config) bool {
- b := v.Block
- _ = b
- // match: (Rsh32x64 x (Int64Make (Const32 [c]) _))
- // cond: c != 0
- // result: (Signmask x)
+ // match: (Rsh32Ux64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh32Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh32Ux32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh32x64(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh32x64 x (Int64Make (Const32 [c]) _))
+ // cond: c != 0
+ // result: (Signmask x)
for {
x := v.Args[0]
v_1 := v.Args[1]
v.AddArg(lo)
return true
}
+ // match: (Rsh32x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh32x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64Ux16(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64Ux16 (Int64Make hi lo) s)
+ // cond:
+ // 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])))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
+ v0.AddArg(hi)
+ v0.AddArg(s)
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v3 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v3.AddArg(s)
+ v2.AddArg(v3)
+ v4 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
+ v4.AddArg(hi)
+ v5 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v6 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v6.AuxInt = 32
+ v5.AddArg(v6)
+ v5.AddArg(s)
+ v4.AddArg(v5)
+ v2.AddArg(v4)
+ v1.AddArg(v2)
+ v7 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
+ v7.AddArg(hi)
+ v8 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v8.AddArg(s)
+ v9 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v9.AuxInt = 32
+ v8.AddArg(v9)
+ v7.AddArg(v8)
+ v1.AddArg(v7)
+ v.AddArg(v1)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64Ux32(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64Ux32 (Int64Make hi lo) s)
+ // cond:
+ // 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])))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v0.AddArg(hi)
+ v0.AddArg(s)
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v3.AddArg(s)
+ v2.AddArg(v3)
+ v4 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v4.AddArg(hi)
+ v5 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v6 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v6.AuxInt = 32
+ v5.AddArg(v6)
+ v5.AddArg(s)
+ v4.AddArg(v5)
+ v2.AddArg(v4)
+ v1.AddArg(v2)
+ v7 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v7.AddArg(hi)
+ v8 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v8.AddArg(s)
+ v9 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v9.AuxInt = 32
+ v8.AddArg(v9)
+ v7.AddArg(v8)
+ v1.AddArg(v7)
+ v.AddArg(v1)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64Ux64(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64Ux64 _ (Int64Make (Const32 [c]) _))
+ // cond: c != 0
+ // result: (Const64 [0])
+ for {
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ v_1_0 := v_1.Args[0]
+ if v_1_0.Op != OpConst32 {
+ break
+ }
+ c := v_1_0.AuxInt
+ if !(c != 0) {
+ break
+ }
+ v.reset(OpConst64)
+ v.AuxInt = 0
+ return true
+ }
+ // match: (Rsh64Ux64 x (Int64Make (Const32 [0]) lo))
+ // cond:
+ // result: (Rsh64Ux32 x lo)
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ v_1_0 := v_1.Args[0]
+ if v_1_0.Op != OpConst32 {
+ break
+ }
+ if v_1_0.AuxInt != 0 {
+ break
+ }
+ lo := v_1.Args[1]
+ v.reset(OpRsh64Ux32)
+ v.AddArg(x)
+ v.AddArg(lo)
+ return true
+ }
+ // match: (Rsh64Ux64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh64Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh64Ux32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64Ux8(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64Ux8 (Int64Make hi lo) s)
+ // cond:
+ // 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])))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
+ v0.AddArg(hi)
+ v0.AddArg(s)
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v3 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v3.AddArg(s)
+ v2.AddArg(v3)
+ v4 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
+ v4.AddArg(hi)
+ v5 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v6 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v6.AuxInt = 32
+ v5.AddArg(v6)
+ v5.AddArg(s)
+ v4.AddArg(v5)
+ v2.AddArg(v4)
+ v1.AddArg(v2)
+ v7 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
+ v7.AddArg(hi)
+ v8 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v8.AddArg(s)
+ v9 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v9.AuxInt = 32
+ v8.AddArg(v9)
+ v7.AddArg(v8)
+ v1.AddArg(v7)
+ v.AddArg(v1)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64x16(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64x16 (Int64Make hi lo) s)
+ // cond:
+ // 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]))) (Com32 <config.fe.TypeUInt32()> (Signmask (SignExt16to32 (Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32]))))))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpRsh32x16, config.fe.TypeUInt32())
+ v0.AddArg(hi)
+ v0.AddArg(s)
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v3 := b.NewValue0(v.Line, OpRsh32Ux16, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v3.AddArg(s)
+ v2.AddArg(v3)
+ v4 := b.NewValue0(v.Line, OpLsh32x16, config.fe.TypeUInt32())
+ v4.AddArg(hi)
+ v5 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v6 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v6.AuxInt = 32
+ v5.AddArg(v6)
+ v5.AddArg(s)
+ v4.AddArg(v5)
+ v2.AddArg(v4)
+ v1.AddArg(v2)
+ v7 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
+ v8 := b.NewValue0(v.Line, OpRsh32x16, config.fe.TypeUInt32())
+ v8.AddArg(hi)
+ v9 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v9.AddArg(s)
+ v10 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v10.AuxInt = 32
+ v9.AddArg(v10)
+ v8.AddArg(v9)
+ v7.AddArg(v8)
+ v11 := b.NewValue0(v.Line, OpCom32, config.fe.TypeUInt32())
+ v12 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
+ v13 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32())
+ v14 := b.NewValue0(v.Line, OpSub16, config.fe.TypeUInt16())
+ v14.AddArg(s)
+ v15 := b.NewValue0(v.Line, OpConst16, config.fe.TypeUInt16())
+ v15.AuxInt = 32
+ v14.AddArg(v15)
+ v13.AddArg(v14)
+ v12.AddArg(v13)
+ v11.AddArg(v12)
+ v7.AddArg(v11)
+ v1.AddArg(v7)
+ v.AddArg(v1)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64x32(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64x32 (Int64Make hi lo) s)
+ // cond:
+ // 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]))) (Com32 <config.fe.TypeUInt32()> (Signmask (Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpRsh32x32, config.fe.TypeUInt32())
+ v0.AddArg(hi)
+ v0.AddArg(s)
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v3 := b.NewValue0(v.Line, OpRsh32Ux32, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v3.AddArg(s)
+ v2.AddArg(v3)
+ v4 := b.NewValue0(v.Line, OpLsh32x32, config.fe.TypeUInt32())
+ v4.AddArg(hi)
+ v5 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v6 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v6.AuxInt = 32
+ v5.AddArg(v6)
+ v5.AddArg(s)
+ v4.AddArg(v5)
+ v2.AddArg(v4)
+ v1.AddArg(v2)
+ v7 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
+ v8 := b.NewValue0(v.Line, OpRsh32x32, config.fe.TypeUInt32())
+ v8.AddArg(hi)
+ v9 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v9.AddArg(s)
+ v10 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v10.AuxInt = 32
+ v9.AddArg(v10)
+ v8.AddArg(v9)
+ v7.AddArg(v8)
+ v11 := b.NewValue0(v.Line, OpCom32, config.fe.TypeUInt32())
+ v12 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
+ v13 := b.NewValue0(v.Line, OpSub32, config.fe.TypeUInt32())
+ v13.AddArg(s)
+ v14 := b.NewValue0(v.Line, OpConst32, config.fe.TypeUInt32())
+ v14.AuxInt = 32
+ v13.AddArg(v14)
+ v12.AddArg(v13)
+ v11.AddArg(v12)
+ v7.AddArg(v11)
+ v1.AddArg(v7)
+ v.AddArg(v1)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64x64(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64x64 x (Int64Make (Const32 [c]) _))
+ // cond: c != 0
+ // result: (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ v_1_0 := v_1.Args[0]
+ if v_1_0.Op != OpConst32 {
+ break
+ }
+ c := v_1_0.AuxInt
+ if !(c != 0) {
+ break
+ }
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
+ v1 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
+ v1.AddArg(x)
+ v0.AddArg(v1)
+ v.AddArg(v0)
+ v2 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
+ v3 := b.NewValue0(v.Line, OpInt64Hi, config.fe.TypeUInt32())
+ v3.AddArg(x)
+ v2.AddArg(v3)
+ v.AddArg(v2)
+ return true
+ }
+ // match: (Rsh64x64 x (Int64Make (Const32 [0]) lo))
+ // cond:
+ // result: (Rsh64x32 x lo)
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ v_1_0 := v_1.Args[0]
+ if v_1_0.Op != OpConst32 {
+ break
+ }
+ if v_1_0.AuxInt != 0 {
+ break
+ }
+ lo := v_1.Args[1]
+ v.reset(OpRsh64x32)
+ v.AddArg(x)
+ v.AddArg(lo)
+ return true
+ }
+ // match: (Rsh64x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh64x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValuedec64_OpRsh64x8(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (Rsh64x8 (Int64Make hi lo) s)
+ // cond:
+ // 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]))) (Com32 <config.fe.TypeUInt32()> (Signmask (SignExt8to32 (Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32]))))))))
+ for {
+ v_0 := v.Args[0]
+ if v_0.Op != OpInt64Make {
+ break
+ }
+ hi := v_0.Args[0]
+ lo := v_0.Args[1]
+ s := v.Args[1]
+ v.reset(OpInt64Make)
+ v0 := b.NewValue0(v.Line, OpRsh32x8, config.fe.TypeUInt32())
+ v0.AddArg(hi)
+ v0.AddArg(s)
+ v.AddArg(v0)
+ v1 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v2 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v3 := b.NewValue0(v.Line, OpRsh32Ux8, config.fe.TypeUInt32())
+ v3.AddArg(lo)
+ v3.AddArg(s)
+ v2.AddArg(v3)
+ v4 := b.NewValue0(v.Line, OpLsh32x8, config.fe.TypeUInt32())
+ v4.AddArg(hi)
+ v5 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v6 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v6.AuxInt = 32
+ v5.AddArg(v6)
+ v5.AddArg(s)
+ v4.AddArg(v5)
+ v2.AddArg(v4)
+ v1.AddArg(v2)
+ v7 := b.NewValue0(v.Line, OpAnd32, config.fe.TypeUInt32())
+ v8 := b.NewValue0(v.Line, OpRsh32x8, config.fe.TypeUInt32())
+ v8.AddArg(hi)
+ v9 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v9.AddArg(s)
+ v10 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v10.AuxInt = 32
+ v9.AddArg(v10)
+ v8.AddArg(v9)
+ v7.AddArg(v8)
+ v11 := b.NewValue0(v.Line, OpCom32, config.fe.TypeUInt32())
+ v12 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32())
+ v13 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32())
+ v14 := b.NewValue0(v.Line, OpSub8, config.fe.TypeUInt8())
+ v14.AddArg(s)
+ v15 := b.NewValue0(v.Line, OpConst8, config.fe.TypeUInt8())
+ v15.AuxInt = 32
+ v14.AddArg(v15)
+ v13.AddArg(v14)
+ v12.AddArg(v13)
+ v11.AddArg(v12)
+ v7.AddArg(v11)
+ v1.AddArg(v7)
+ v.AddArg(v1)
+ return true
+ }
return false
}
func rewriteValuedec64_OpRsh8Ux64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
+ // match: (Rsh8Ux64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh8Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh8Ux32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
return false
}
func rewriteValuedec64_OpRsh8x64(v *Value, config *Config) bool {
v.AddArg(lo)
return true
}
+ // match: (Rsh8x64 x (Int64Make hi lo))
+ // cond: hi.Op != OpConst32
+ // result: (Rsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
+ for {
+ x := v.Args[0]
+ v_1 := v.Args[1]
+ if v_1.Op != OpInt64Make {
+ break
+ }
+ hi := v_1.Args[0]
+ lo := v_1.Args[1]
+ if !(hi.Op != OpConst32) {
+ break
+ }
+ v.reset(OpRsh8x32)
+ v.AddArg(x)
+ v0 := b.NewValue0(v.Line, OpOr32, config.fe.TypeUInt32())
+ v1 := b.NewValue0(v.Line, OpZeromask, config.fe.TypeUInt32())
+ v1.AddArg(hi)
+ v0.AddArg(v1)
+ v0.AddArg(lo)
+ v.AddArg(v0)
+ return true
+ }
return false
}
func rewriteValuedec64_OpSignExt16to64(v *Value, config *Config) bool {