diff options
| author | Robin Voetter <robin@voetter.nl> | 2023-09-19 20:26:22 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-09-23 12:36:56 -0700 |
| commit | 4f215a6d2894182f90328e2aa213f92d8e479ec7 (patch) | |
| tree | f40e41d96ad05f4ce3fbf804f6c77f9f90c6c70a /src/codegen | |
| parent | 48ab11639ab54914043cc8011587fe3be47a0e1f (diff) | |
| download | zig-4f215a6d2894182f90328e2aa213f92d8e479ec7.tar.gz zig-4f215a6d2894182f90328e2aa213f92d8e479ec7.zip | |
spirv: air unwrap_errunion_payload
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/spirv.zig | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index da8fbb8556..c46be03548 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -1732,6 +1732,7 @@ pub const DeclGen = struct { .unreach, .trap => return self.airUnreach(), .unwrap_errunion_err => try self.airErrUnionErr(inst), + .unwrap_errunion_payload => try self.airErrUnionPayload(inst), .wrap_errunion_err => try self.airWrapErrUnionErr(inst), .is_null => try self.airIsNull(inst, .is_null), @@ -3185,6 +3186,21 @@ pub const DeclGen = struct { return try self.extractField(Type.anyerror, operand_id, eu_layout.errorFieldIndex()); } + fn airErrUnionPayload(self: *DeclGen, inst: Air.Inst.Index) !?IdRef { + if (self.liveness.isUnused(inst)) return null; + + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const operand_id = try self.resolve(ty_op.operand); + const payload_ty = self.typeOfIndex(inst); + const eu_layout = self.errorUnionLayout(payload_ty); + + if (!eu_layout.payload_has_bits) { + return null; // No error possible. + } + + return try self.extractField(payload_ty, operand_id, eu_layout.payloadFieldIndex()); + } + fn airWrapErrUnionErr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef { if (self.liveness.isUnused(inst)) return null; |
