diff options
| author | Koakuma <koachan@protonmail.com> | 2022-07-08 19:56:34 +0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-09-14 16:57:31 -0700 |
| commit | f01867f78e1c483dc2b5a836df361bf5092ab4ce (patch) | |
| tree | 47dbed141fd9101b35711e0b127632b06f02eea1 | |
| parent | b6307144c011fab2114ccd33a7db91171eb501dd (diff) | |
| download | zig-f01867f78e1c483dc2b5a836df361bf5092ab4ce.tar.gz zig-f01867f78e1c483dc2b5a836df361bf5092ab4ce.zip | |
stage2: sparc64: Implement airWrapOptional
| -rw-r--r-- | src/arch/sparc64/CodeGen.zig | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/arch/sparc64/CodeGen.zig b/src/arch/sparc64/CodeGen.zig index c258d88419..06508cb6b4 100644 --- a/src/arch/sparc64/CodeGen.zig +++ b/src/arch/sparc64/CodeGen.zig @@ -677,7 +677,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { .err_return_trace => @panic("TODO try self.airErrReturnTrace(inst)"), .set_err_return_trace => @panic("TODO try self.airSetErrReturnTrace(inst)"), - .wrap_optional => @panic("TODO try self.airWrapOptional(inst)"), + .wrap_optional => try self.airWrapOptional(inst), .wrap_errunion_payload => @panic("TODO try self.airWrapErrUnionPayload(inst)"), .wrap_errunion_err => try self.airWrapErrUnionErr(inst), @@ -2175,6 +2175,20 @@ fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void { return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); } +fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void { + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: { + const optional_ty = self.air.typeOfIndex(inst); + + // Optional with a zero-bit payload type is just a boolean true + if (optional_ty.abiSize(self.target.*) == 1) + break :result MCValue{ .immediate = 1 }; + + return self.fail("TODO implement wrap optional for {}", .{self.target.cpu.arch}); + }; + return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); +} + // Common helper functions /// Adds a Type to the .debug_info at the current position. The bytes will be populated later, |
