From 3bf9a8feb50c3ff20da80593a735ec3244cb5d89 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sun, 8 Oct 2023 02:13:33 -0400 Subject: [PATCH] x86_64: fix `@divTrunc` and `@divFloor` of `f16` --- src/arch/x86_64/CodeGen.zig | 17 +++++++++++++++++ test/behavior/math.zig | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index bdad8312d5..46682345b9 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -7177,6 +7177,23 @@ fn genBinOp( dst_reg, tmp_reg, ); + switch (air_tag) { + .div_trunc, .div_floor => try self.asmRegisterRegisterRegisterImmediate( + .{ .v_ss, .round }, + dst_reg, + dst_reg, + dst_reg, + Immediate.u(@as(u5, @bitCast(RoundMode{ + .mode = switch (air_tag) { + .div_trunc => .zero, + .div_floor => .down, + else => unreachable, + }, + .precision = .inexact, + }))), + ), + else => {}, + } try self.asmRegisterRegisterImmediate( .{ .v_, .cvtps2ph }, dst_reg, diff --git a/test/behavior/math.zig b/test/behavior/math.zig index c29ef4ad8c..e017a62aa6 100644 --- a/test/behavior/math.zig +++ b/test/behavior/math.zig @@ -495,11 +495,11 @@ fn testDivision() !void { } test "division half-precision floats" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; try testDivisionFP16(); try comptime testDivisionFP16();