(ORI [-1] x) => (MOVDconst [-1])
(ORI [x] (MOVDconst [y])) => (MOVDconst [x | y])
+// Combine operations with immediate.
+(ADDI [x] (ADDI [y] z)) && is32Bit(x + y) => (ADDI [x + y] z)
+(ANDI [x] (ANDI [y] z)) => (ANDI [x & y] z)
+(ORI [x] (ORI [y] z)) => (ORI [x | y] z)
+
// Negation of a constant.
(NEG (MOVDconst [x])) => (MOVDconst [-x])
(NEGW (MOVDconst [x])) => (MOVDconst [int64(int32(-x))])
v.AuxInt = int64ToAuxInt(x + y)
return true
}
+ // match: (ADDI [x] (ADDI [y] z))
+ // cond: is32Bit(x + y)
+ // result: (ADDI [x + y] z)
+ for {
+ x := auxIntToInt64(v.AuxInt)
+ if v_0.Op != OpRISCV64ADDI {
+ break
+ }
+ y := auxIntToInt64(v_0.AuxInt)
+ z := v_0.Args[0]
+ if !(is32Bit(x + y)) {
+ break
+ }
+ v.reset(OpRISCV64ADDI)
+ v.AuxInt = int64ToAuxInt(x + y)
+ v.AddArg(z)
+ return true
+ }
return false
}
func rewriteValueRISCV64_OpRISCV64AND(v *Value) bool {
v.AuxInt = int64ToAuxInt(x & y)
return true
}
+ // match: (ANDI [x] (ANDI [y] z))
+ // result: (ANDI [x & y] z)
+ for {
+ x := auxIntToInt64(v.AuxInt)
+ if v_0.Op != OpRISCV64ANDI {
+ break
+ }
+ y := auxIntToInt64(v_0.AuxInt)
+ z := v_0.Args[0]
+ v.reset(OpRISCV64ANDI)
+ v.AuxInt = int64ToAuxInt(x & y)
+ v.AddArg(z)
+ return true
+ }
return false
}
func rewriteValueRISCV64_OpRISCV64FMADDD(v *Value) bool {
v.AuxInt = int64ToAuxInt(x | y)
return true
}
+ // match: (ORI [x] (ORI [y] z))
+ // result: (ORI [x | y] z)
+ for {
+ x := auxIntToInt64(v.AuxInt)
+ if v_0.Op != OpRISCV64ORI {
+ break
+ }
+ y := auxIntToInt64(v_0.AuxInt)
+ z := v_0.Args[0]
+ v.reset(OpRISCV64ORI)
+ v.AuxInt = int64ToAuxInt(x | y)
+ v.AddArg(z)
+ return true
+ }
return false
}
func rewriteValueRISCV64_OpRISCV64SEQZ(v *Value) bool {