CBE: fix bitwise not

Closes #13911
This commit is contained in:
Jacob Young
2022-12-20 21:31:44 -05:00
committed by Andrew Kelley
parent 471f3c470f
commit a52dcdd3c5
2 changed files with 18 additions and 2 deletions

View File

@@ -3591,6 +3591,10 @@ fn airOverflow(f: *Function, inst: Air.Inst.Index, operation: []const u8, info:
}
fn airNot(f: *Function, inst: Air.Inst.Index) !CValue {
const inst_ty = f.air.typeOfIndex(inst);
if (inst_ty.tag() != .bool)
return try airUnBuiltinCall(f, inst, "not", .Bits);
const ty_op = f.air.instructions.items(.data)[inst].ty_op;
if (f.liveness.isUnused(inst)) {
@@ -3602,11 +3606,10 @@ fn airNot(f: *Function, inst: Air.Inst.Index) !CValue {
try reap(f, inst, &.{ty_op.operand});
const writer = f.object.writer();
const inst_ty = f.air.typeOfIndex(inst);
const local = try f.allocLocal(inst, inst_ty);
try f.writeCValue(writer, local, .Other);
try writer.writeAll(" = ");
try writer.writeByte(if (inst_ty.tag() == .bool) '!' else '~');
try writer.writeByte('!');
try f.writeCValue(writer, op, .Other);
try writer.writeAll(";\n");