// MOVVnop doesn't emit instruction, only for ensuring the type.
(MOVVreg x) && x.Uses == 1 => (MOVVnop x)
+// TODO: we should be able to get rid of MOVVnop all together.
+// But for now, this is enough to get rid of lots of them.
+(MOVVnop (MOVVconst [c])) => (MOVVconst [c])
+
// fold constant into arithmetic ops
(ADDV x (MOVVconst <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDVconst [c] x)
(SUBV x (MOVVconst [c])) && is32Bit(c) => (SUBVconst [c] x)
return rewriteValueLOONG64_OpLOONG64MOVVload(v)
case OpLOONG64MOVVloadidx:
return rewriteValueLOONG64_OpLOONG64MOVVloadidx(v)
+ case OpLOONG64MOVVnop:
+ return rewriteValueLOONG64_OpLOONG64MOVVnop(v)
case OpLOONG64MOVVreg:
return rewriteValueLOONG64_OpLOONG64MOVVreg(v)
case OpLOONG64MOVVstore:
}
return false
}
+func rewriteValueLOONG64_OpLOONG64MOVVnop(v *Value) bool {
+ v_0 := v.Args[0]
+ // match: (MOVVnop (MOVVconst [c]))
+ // result: (MOVVconst [c])
+ for {
+ if v_0.Op != OpLOONG64MOVVconst {
+ break
+ }
+ c := auxIntToInt64(v_0.AuxInt)
+ v.reset(OpLOONG64MOVVconst)
+ v.AuxInt = int64ToAuxInt(c)
+ return true
+ }
+ return false
+}
func rewriteValueLOONG64_OpLOONG64MOVVreg(v *Value) bool {
v_0 := v.Args[0]
// match: (MOVVreg x)