aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86_64/CodeGen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-03-18 01:37:13 -0400
committerJakub Konka <kubkon@jakubkonka.com>2023-03-21 08:49:54 +0100
commitc865c8fb2a910e73e38192a8bd484935bae8f6fc (patch)
tree329e4f399df13b887b762a783b58477dd961480e /src/arch/x86_64/CodeGen.zig
parentb6eebb709fdb8aff62105f60b275527c306b97b8 (diff)
downloadzig-c865c8fb2a910e73e38192a8bd484935bae8f6fc.tar.gz
zig-c865c8fb2a910e73e38192a8bd484935bae8f6fc.zip
x86_64: implement float division intrinsics
Diffstat (limited to 'src/arch/x86_64/CodeGen.zig')
-rw-r--r--src/arch/x86_64/CodeGen.zig27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index de9031f48c..04e8a7ebe3 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -3538,12 +3538,37 @@ fn genBinOp(
else => return self.fail("TODO implement genBinOp for {s} {}", .{ @tagName(tag), lhs_ty.fmt(self.bin_file.options.module.?) }),
}, lhs_ty, dst_mcv, src_mcv),
- .div_float => try self.genBinOpMir(switch (lhs_ty.tag()) {
+ .div_float,
+ .div_exact,
+ => try self.genBinOpMir(switch (lhs_ty.tag()) {
.f32 => .divss,
.f64 => .divsd,
else => return self.fail("TODO implement genBinOp for {s} {}", .{ @tagName(tag), lhs_ty.fmt(self.bin_file.options.module.?) }),
}, lhs_ty, dst_mcv, src_mcv),
+ .div_trunc,
+ .div_floor,
+ => {
+ try self.genBinOpMir(switch (lhs_ty.tag()) {
+ .f32 => .divss,
+ .f64 => .divsd,
+ else => return self.fail("TODO implement genBinOp for {s} {}", .{ @tagName(tag), lhs_ty.fmt(self.bin_file.options.module.?) }),
+ }, lhs_ty, dst_mcv, src_mcv);
+ if (Target.x86.featureSetHas(self.target.cpu.features, .sse4_1)) {
+ const abi_size = @intCast(u32, lhs_ty.abiSize(self.target.*));
+ const dst_alias = registerAlias(dst_mcv.register, abi_size);
+ try self.asmRegisterRegisterImmediate(switch (lhs_ty.tag()) {
+ .f32 => .roundss,
+ .f64 => .roundsd,
+ else => unreachable,
+ }, dst_alias, dst_alias, Immediate.u(switch (tag) {
+ .div_trunc => 0b1_0_11,
+ .div_floor => 0b1_0_01,
+ else => unreachable,
+ }));
+ } else return self.fail("TODO implement round without sse4_1", .{});
+ },
+
.ptr_add,
.ptr_sub,
=> {