stage2: implement @boolToInt
This is the first commit in which some behavior tests are passing for both stage1 and stage2.
This commit is contained in:
@@ -925,6 +925,7 @@ fn genBody(o: *Object, body: []const Air.Inst.Index) error{ AnalysisFail, OutOfM
|
||||
.call => try airCall(o, inst),
|
||||
.dbg_stmt => try airDbgStmt(o, inst),
|
||||
.intcast => try airIntCast(o, inst),
|
||||
.bool_to_int => try airBoolToInt(o, inst),
|
||||
.load => try airLoad(o, inst),
|
||||
.ret => try airRet(o, inst),
|
||||
.store => try airStore(o, inst),
|
||||
@@ -1083,6 +1084,20 @@ fn airIntCast(o: *Object, inst: Air.Inst.Index) !CValue {
|
||||
return local;
|
||||
}
|
||||
|
||||
fn airBoolToInt(o: *Object, inst: Air.Inst.Index) !CValue {
|
||||
if (o.liveness.isUnused(inst))
|
||||
return CValue.none;
|
||||
const un_op = o.air.instructions.items(.data)[inst].un_op;
|
||||
const writer = o.writer();
|
||||
const inst_ty = o.air.typeOfIndex(inst);
|
||||
const operand = try o.resolveInst(un_op);
|
||||
const local = try o.allocLocal(inst_ty, .Const);
|
||||
try writer.writeAll(" = ");
|
||||
try o.writeCValue(writer, operand);
|
||||
try writer.writeAll(";\n");
|
||||
return local;
|
||||
}
|
||||
|
||||
fn airStore(o: *Object, inst: Air.Inst.Index) !CValue {
|
||||
// *a = b;
|
||||
const bin_op = o.air.instructions.items(.data)[inst].bin_op;
|
||||
|
||||
@@ -961,6 +961,7 @@ pub const FuncGen = struct {
|
||||
.alloc => try self.airAlloc(inst),
|
||||
.arg => try self.airArg(inst),
|
||||
.bitcast => try self.airBitCast(inst),
|
||||
.bool_to_int=> try self.airBoolToInt(inst),
|
||||
.block => try self.airBlock(inst),
|
||||
.br => try self.airBr(inst),
|
||||
.switch_br => try self.airSwitchBr(inst),
|
||||
@@ -1656,6 +1657,15 @@ pub const FuncGen = struct {
|
||||
return self.builder.buildBitCast(operand, dest_type, "");
|
||||
}
|
||||
|
||||
fn airBoolToInt(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
|
||||
if (self.liveness.isUnused(inst))
|
||||
return null;
|
||||
|
||||
const un_op = self.air.instructions.items(.data)[inst].un_op;
|
||||
const operand = try self.resolveInst(un_op);
|
||||
return operand;
|
||||
}
|
||||
|
||||
fn airArg(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
|
||||
const arg_val = self.args[self.arg_index];
|
||||
self.arg_index += 1;
|
||||
|
||||
Reference in New Issue
Block a user