authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-08 02:13:33-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-08 04:41:55-04:00
log3bf9a8feb50c3ff20da80593a735ec3244cb5d89
treeee53ac71cb9fbed67b0daa5487030d430b8dd842
parent9fc9235ac815f8b0ad88445216407a0a9f747d5f

x86_64: fix `@divTrunc` and `@divFloor` of `f16`


2 files changed, 18 insertions(+), 1 deletions(-)

src/arch/x86_64/CodeGen.zig+17
......@@ -7177,6 +7177,23 @@ fn genBinOp(
71777177 dst_reg,
71787178 tmp_reg,
71797179 );
7180 switch (air_tag) {
7181 .div_trunc, .div_floor => try self.asmRegisterRegisterRegisterImmediate(
7182 .{ .v_ss, .round },
7183 dst_reg,
7184 dst_reg,
7185 dst_reg,
7186 Immediate.u(@as(u5, @bitCast(RoundMode{
7187 .mode = switch (air_tag) {
7188 .div_trunc => .zero,
7189 .div_floor => .down,
7190 else => unreachable,
7191 },
7192 .precision = .inexact,
7193 }))),
7194 ),
7195 else => {},
7196 }
71807197 try self.asmRegisterRegisterImmediate(
71817198 .{ .v_, .cvtps2ph },
71827199 dst_reg,
test/behavior/math.zig+1-1
......@@ -495,11 +495,11 @@ fn testDivision() !void {
495495}
496496
497497test "division half-precision floats" {
498 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
499498 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
500499 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
501500 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
502501 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
502 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
503503
504504 try testDivisionFP16();
505505 try comptime testDivisionFP16();