authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-09-19 20:26:22+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-23 12:36:56-07:00
log4f215a6d2894182f90328e2aa213f92d8e479ec7
treef40e41d96ad05f4ce3fbf804f6c77f9f90c6c70a
parent48ab11639ab54914043cc8011587fe3be47a0e1f

spirv: air unwrap_errunion_payload


1 files changed, 16 insertions(+), 0 deletions(-)

src/codegen/spirv.zig+16
...@@ -1732,6 +1732,7 @@ pub const DeclGen = struct {...@@ -1732,6 +1732,7 @@ pub const DeclGen = struct {
1732 .unreach, .trap => return self.airUnreach(),1732 .unreach, .trap => return self.airUnreach(),
17331733
1734 .unwrap_errunion_err => try self.airErrUnionErr(inst),1734 .unwrap_errunion_err => try self.airErrUnionErr(inst),
1735 .unwrap_errunion_payload => try self.airErrUnionPayload(inst),
1735 .wrap_errunion_err => try self.airWrapErrUnionErr(inst),1736 .wrap_errunion_err => try self.airWrapErrUnionErr(inst),
17361737
1737 .is_null => try self.airIsNull(inst, .is_null),1738 .is_null => try self.airIsNull(inst, .is_null),
...@@ -3185,6 +3186,21 @@ pub const DeclGen = struct {...@@ -3185,6 +3186,21 @@ pub const DeclGen = struct {
3185 return try self.extractField(Type.anyerror, operand_id, eu_layout.errorFieldIndex());3186 return try self.extractField(Type.anyerror, operand_id, eu_layout.errorFieldIndex());
3186 }3187 }
31873188
3189 fn airErrUnionPayload(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
3190 if (self.liveness.isUnused(inst)) return null;
3191
3192 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3193 const operand_id = try self.resolve(ty_op.operand);
3194 const payload_ty = self.typeOfIndex(inst);
3195 const eu_layout = self.errorUnionLayout(payload_ty);
3196
3197 if (!eu_layout.payload_has_bits) {
3198 return null; // No error possible.
3199 }
3200
3201 return try self.extractField(payload_ty, operand_id, eu_layout.payloadFieldIndex());
3202 }
3203
3188 fn airWrapErrUnionErr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {3204 fn airWrapErrUnionErr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
3189 if (self.liveness.isUnused(inst)) return null;3205 if (self.liveness.isUnused(inst)) return null;
31903206