(BNEZ (SEQZ x) yes no) => (BEQZ x yes no)
(BNEZ (SNEZ x) yes no) => (BNEZ x yes no)
-// Absorb NEG into branch when possible.
-(BEQZ x:(NEG y) yes no) && x.Uses == 1 => (BEQZ y yes no)
-(BNEZ x:(NEG y) yes no) && x.Uses == 1 => (BNEZ y yes no)
+// Absorb NEG into branch.
+(BEQZ (NEG x) yes no) => (BEQZ x yes no)
+(BNEZ (NEG x) yes no) => (BNEZ x yes no)
// Convert BEQZ/BNEZ into more optimal branch conditions.
(BEQZ (SUB x y) yes no) => (BEQ x y yes no)
(BGE (MOVDconst [0]) cond yes no) => (BLEZ cond yes no)
(BGE cond (MOVDconst [0]) yes no) => (BGEZ cond yes no)
+// Remove NEG when used with SEQZ/SNEZ.
+(SEQZ (NEG x)) => (SEQZ x)
+(SNEZ (NEG x)) => (SNEZ x)
+
// Store zero
(MOVBstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVBstorezero [off] {sym} ptr mem)
(MOVHstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVHstorezero [off] {sym} ptr mem)
return rewriteValueRISCV64_OpRISCV64OR(v)
case OpRISCV64ORI:
return rewriteValueRISCV64_OpRISCV64ORI(v)
+ case OpRISCV64SEQZ:
+ return rewriteValueRISCV64_OpRISCV64SEQZ(v)
case OpRISCV64SLL:
return rewriteValueRISCV64_OpRISCV64SLL(v)
case OpRISCV64SLLI:
return rewriteValueRISCV64_OpRISCV64SLTIU(v)
case OpRISCV64SLTU:
return rewriteValueRISCV64_OpRISCV64SLTU(v)
+ case OpRISCV64SNEZ:
+ return rewriteValueRISCV64_OpRISCV64SNEZ(v)
case OpRISCV64SRA:
return rewriteValueRISCV64_OpRISCV64SRA(v)
case OpRISCV64SRAI:
}
return false
}
+func rewriteValueRISCV64_OpRISCV64SEQZ(v *Value) bool {
+ v_0 := v.Args[0]
+ // match: (SEQZ (NEG x))
+ // result: (SEQZ x)
+ for {
+ if v_0.Op != OpRISCV64NEG {
+ break
+ }
+ x := v_0.Args[0]
+ v.reset(OpRISCV64SEQZ)
+ v.AddArg(x)
+ return true
+ }
+ return false
+}
func rewriteValueRISCV64_OpRISCV64SLL(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]
}
return false
}
+func rewriteValueRISCV64_OpRISCV64SNEZ(v *Value) bool {
+ v_0 := v.Args[0]
+ // match: (SNEZ (NEG x))
+ // result: (SNEZ x)
+ for {
+ if v_0.Op != OpRISCV64NEG {
+ break
+ }
+ x := v_0.Args[0]
+ v.reset(OpRISCV64SNEZ)
+ v.AddArg(x)
+ return true
+ }
+ return false
+}
func rewriteValueRISCV64_OpRISCV64SRA(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]
b.resetWithControl(BlockRISCV64BEQZ, x)
return true
}
- // match: (BEQZ x:(NEG y) yes no)
- // cond: x.Uses == 1
- // result: (BEQZ y yes no)
+ // match: (BEQZ (NEG x) yes no)
+ // result: (BEQZ x yes no)
for b.Controls[0].Op == OpRISCV64NEG {
- x := b.Controls[0]
- y := x.Args[0]
- if !(x.Uses == 1) {
- break
- }
- b.resetWithControl(BlockRISCV64BEQZ, y)
+ v_0 := b.Controls[0]
+ x := v_0.Args[0]
+ b.resetWithControl(BlockRISCV64BEQZ, x)
return true
}
// match: (BEQZ (SUB x y) yes no)
b.resetWithControl(BlockRISCV64BNEZ, x)
return true
}
- // match: (BNEZ x:(NEG y) yes no)
- // cond: x.Uses == 1
- // result: (BNEZ y yes no)
+ // match: (BNEZ (NEG x) yes no)
+ // result: (BNEZ x yes no)
for b.Controls[0].Op == OpRISCV64NEG {
- x := b.Controls[0]
- y := x.Args[0]
- if !(x.Uses == 1) {
- break
- }
- b.resetWithControl(BlockRISCV64BNEZ, y)
+ v_0 := b.Controls[0]
+ x := v_0.Args[0]
+ b.resetWithControl(BlockRISCV64BNEZ, x)
return true
}
// match: (BNEZ (SUB x y) yes no)