// 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]