// Boolean ops; 0=false, 1=true
(AndB ...) => (AND ...)
(OrB ...) => (OR ...)
-(EqB x y) => (SEQZ (XOR <typ.Bool> x y))
-(NeqB ...) => (XOR ...)
+(EqB x y) => (SEQZ (SUB <typ.Bool> x y))
+(NeqB x y) => (SNEZ (SUB <typ.Bool> x y))
(Not ...) => (SEQZ ...)
// Lowering pointer arithmetic
case OpNeq8:
return rewriteValueRISCV64_OpNeq8(v)
case OpNeqB:
- v.Op = OpRISCV64XOR
- return true
+ return rewriteValueRISCV64_OpNeqB(v)
case OpNeqPtr:
return rewriteValueRISCV64_OpNeqPtr(v)
case OpNilCheck:
b := v.Block
typ := &b.Func.Config.Types
// match: (EqB x y)
- // result: (SEQZ (XOR <typ.Bool> x y))
+ // result: (SEQZ (SUB <typ.Bool> x y))
for {
x := v_0
y := v_1
v.reset(OpRISCV64SEQZ)
- v0 := b.NewValue0(v.Pos, OpRISCV64XOR, typ.Bool)
+ v0 := b.NewValue0(v.Pos, OpRISCV64SUB, typ.Bool)
v0.AddArg2(x, y)
v.AddArg(v0)
return true
return true
}
}
+func rewriteValueRISCV64_OpNeqB(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+ b := v.Block
+ typ := &b.Func.Config.Types
+ // match: (NeqB x y)
+ // result: (SNEZ (SUB <typ.Bool> x y))
+ for {
+ x := v_0
+ y := v_1
+ v.reset(OpRISCV64SNEZ)
+ v0 := b.NewValue0(v.Pos, OpRISCV64SUB, typ.Bool)
+ v0.AddArg2(x, y)
+ v.AddArg(v0)
+ return true
+ }
+}
func rewriteValueRISCV64_OpNeqPtr(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]