diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-03-18 01:37:13 -0400 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-03-21 08:49:54 +0100 |
| commit | c865c8fb2a910e73e38192a8bd484935bae8f6fc (patch) | |
| tree | 329e4f399df13b887b762a783b58477dd961480e /src/arch/x86_64/CodeGen.zig | |
| parent | b6eebb709fdb8aff62105f60b275527c306b97b8 (diff) | |
| download | zig-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.zig | 27 |
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, => { |
