commit 3bf9a8feb50c3ff20da80593a735ec3244cb5d89 (tree)
parent 9fc9235ac815f8b0ad88445216407a0a9f747d5f
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Sun, 8 Oct 2023 02:13:33 -0400
x86_64: fix `@divTrunc` and `@divFloor` of `f16`
Diffstat:
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git 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
@@ -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();