authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2023-10-08 16:22:37+03:30
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-10-15 14:00:04+02:00
logd8b591766ac37090ae77f7b67d0ce6b54c64254e
treeded231dffce311a893731c8be9f34ad163302bde
parentd2692af8e2c6e4397f9be94b2b6625ba0e6e725f
signaturebadge-check Signed by SSH key SHA256:CQ99aPxq+RueiL9u7z0FEki5Fm7V6T8q4PrEGmINrA4

spirv: `fpext` and `fptrunc` instructions


3 files changed, 19 insertions(+), 2 deletions(-)

src/codegen/spirv.zig+18
...@@ -1957,6 +1957,7 @@ const DeclGen = struct {...@@ -1957,6 +1957,7 @@ const DeclGen = struct {
1957 .int_from_ptr => try self.airIntFromPtr(inst),1957 .int_from_ptr => try self.airIntFromPtr(inst),
1958 .float_from_int => try self.airFloatFromInt(inst),1958 .float_from_int => try self.airFloatFromInt(inst),
1959 .int_from_float => try self.airIntFromFloat(inst),1959 .int_from_float => try self.airIntFromFloat(inst),
1960 .fpext, .fptrunc => try self.airFloatCast(inst),
1960 .not => try self.airNot(inst),1961 .not => try self.airNot(inst),
19611962
1962 .array_to_slice => try self.airArrayToSlice(inst),1963 .array_to_slice => try self.airArrayToSlice(inst),
...@@ -2685,6 +2686,23 @@ const DeclGen = struct {...@@ -2685,6 +2686,23 @@ const DeclGen = struct {
2685 return result_id;2686 return result_id;
2686 }2687 }
26872688
2689 fn airFloatCast(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
2690 if (self.liveness.isUnused(inst)) return null;
2691
2692 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2693 const operand_id = try self.resolve(ty_op.operand);
2694 const dest_ty = self.typeOfIndex(inst);
2695 const dest_ty_id = try self.resolveTypeId(dest_ty);
2696
2697 const result_id = self.spv.allocId();
2698 try self.func.body.emit(self.spv.gpa, .OpFConvert, .{
2699 .id_result_type = dest_ty_id,
2700 .id_result = result_id,
2701 .float_value = operand_id,
2702 });
2703 return result_id;
2704 }
2705
2688 fn airNot(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {2706 fn airNot(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
2689 if (self.liveness.isUnused(inst)) return null;2707 if (self.liveness.isUnused(inst)) return null;
2690 const ty_op = self.air.instructions.items(.data)[inst].ty_op;2708 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
src/link/SpirV.zig+1-1
...@@ -230,7 +230,7 @@ fn writeMemoryModel(spv: *SpvModule, target: std.Target) !void {...@@ -230,7 +230,7 @@ fn writeMemoryModel(spv: *SpvModule, target: std.Target) !void {
230 };230 };
231231
232 // TODO: Put this in a proper section.232 // TODO: Put this in a proper section.
233 try spv.sections.capabilities.emit(spv.gpa, .OpMemoryModel, .{233 try spv.sections.extensions.emit(spv.gpa, .OpMemoryModel, .{
234 .addressing_model = addressing_model,234 .addressing_model = addressing_model,
235 .memory_model = memory_model,235 .memory_model = memory_model,
236 });236 });
test/behavior/cast.zig-1
...@@ -648,7 +648,6 @@ test "@floatCast cast down" {...@@ -648,7 +648,6 @@ test "@floatCast cast down" {
648 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO648 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
649 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO649 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
650 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO650 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
651 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
652651
653 {652 {
654 var double: f64 = 0.001534;653 var double: f64 = 0.001534;