aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-22 11:04:58 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-02-22 21:56:34 +0100
commitb9b4e4671f4377024efb076edd9cc2da9e889a5a (patch)
tree4e0a3239e2fc675614b9d8a29807dbb62f4d5730
parent261711722175447d402632fd7f55b371bfc72df2 (diff)
downloadzig-b9b4e4671f4377024efb076edd9cc2da9e889a5a.tar.gz
zig-b9b4e4671f4377024efb076edd9cc2da9e889a5a.zip
x64: add naive impl of else in switch
-rw-r--r--src/arch/x86_64/CodeGen.zig21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index d38fd3abfb..92b062bdde 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -3953,18 +3953,21 @@ fn airSwitch(self: *Self, inst: Air.Inst.Index) !void {
}
if (switch_br.data.else_body_len > 0) {
- return self.fail("TODO handle else branch in switch", .{});
- }
+ const else_body = self.air.extra[extra_index..][0..switch_br.data.else_body_len];
+ try self.branch_stack.append(.{});
+ defer self.branch_stack.pop().deinit(self.gpa);
- // const else_body = self.air.extra[extra_index..][0..switch_br.data.else_body_len];
- // const else_branch = self.branch_stack.addOneAssumeCapacity();
- // else_branch.* = .{};
+ const else_deaths = liveness.deaths.len - 1;
+ try self.ensureProcessDeathCapacity(liveness.deaths[else_deaths].len);
+ for (liveness.deaths[else_deaths]) |operand| {
+ self.processDeath(operand);
+ }
- // if (else_body.len != 0) {
- // try self.genBody(else_body);
- // } else {
+ try self.genBody(else_body);
- // }
+ // TODO consolidate returned MCValues between prongs and else branch like we do
+ // in airCondBr.
+ }
return self.finishAir(inst, .unreach, .{ pl_op.operand, .none, .none });
}