(ADDV x0 x1:(SLLVconst [c] y)) && x1.Uses == 1 && c > 0 && c <= 4 => (ADDshiftLLV x0 y [c])
+// fold constant in ADDshift op
+(ADDshiftLLV x (MOVVconst [c]) [d]) && is12Bit(c<<d) => (ADDVconst x [c<<d])
+
// div by constant
(DIVVU x (MOVVconst [1])) => x
(DIVVU x (MOVVconst [c])) && isPowerOfTwo(c) => (SRLVconst [log64(c)] x)
return rewriteValueLOONG64_OpLOONG64ADDV(v)
case OpLOONG64ADDVconst:
return rewriteValueLOONG64_OpLOONG64ADDVconst(v)
+ case OpLOONG64ADDshiftLLV:
+ return rewriteValueLOONG64_OpLOONG64ADDshiftLLV(v)
case OpLOONG64AND:
return rewriteValueLOONG64_OpLOONG64AND(v)
case OpLOONG64ANDconst:
}
return false
}
+func rewriteValueLOONG64_OpLOONG64ADDshiftLLV(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+ // match: (ADDshiftLLV x (MOVVconst [c]) [d])
+ // cond: is12Bit(c<<d)
+ // result: (ADDVconst x [c<<d])
+ for {
+ d := auxIntToInt64(v.AuxInt)
+ x := v_0
+ if v_1.Op != OpLOONG64MOVVconst {
+ break
+ }
+ c := auxIntToInt64(v_1.AuxInt)
+ if !(is12Bit(c << d)) {
+ break
+ }
+ v.reset(OpLOONG64ADDVconst)
+ v.AuxInt = int64ToAuxInt(c << d)
+ v.AddArg(x)
+ return true
+ }
+ return false
+}
func rewriteValueLOONG64_OpLOONG64AND(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]