authorgravatar for marc@tiehu.isMarc Tiehuis <marc@tiehu.is> 2018-01-10 19:53:36+13:00
committergravatar for marc@tiehu.isMarc Tiehuis <marc@tiehu.is> 2018-01-10 19:53:36+13:00
log24cd99160c2eeea34088ef3e3d631233d8913dc1
tree0f646f8f6ec7b83b0d36b4e94f311419c724f415
parent3c094116aae459b651934663a31981cf09cdb3e4

Add hw sqrt for x86_64


3 files changed, 30 insertions(+), 4 deletions(-)

CMakeLists.txt+1
......@@ -425,6 +425,7 @@ set(ZIG_STD_FILES
425425 "math/tan.zig"
426426 "math/tanh.zig"
427427 "math/trunc.zig"
428 "math/x86_64/sqrt.zig"
428429 "mem.zig"
429430 "net.zig"
430431 "os/child_process.zig"
std/math/sqrt.zig+14-4
......@@ -18,11 +18,21 @@ pub fn sqrt(x: var) -> (if (@typeId(@typeOf(x)) == TypeId.Int) @IntType(false, @
1818 return T(sqrt64(x));
1919 },
2020 TypeId.Float => {
21 return switch (T) {
22 f32 => sqrt32(x),
23 f64 => sqrt64(x),
21 switch (T) {
22 f32 => {
23 switch (builtin.arch) {
24 builtin.Arch.x86_64 => return @import("x86_64/sqrt.zig").sqrt32(x),
25 else => return sqrt32(x),
26 }
27 },
28 f64 => {
29 switch (builtin.arch) {
30 builtin.Arch.x86_64 => return @import("x86_64/sqrt.zig").sqrt64(x),
31 else => return sqrt64(x),
32 }
33 },
2434 else => @compileError("sqrt not implemented for " ++ @typeName(T)),
25 };
35 }
2636 },
2737 TypeId.IntLiteral => comptime {
2838 if (x > @maxValue(u128)) {
std/math/x86_64/sqrt.zig created+15
......@@ -0,0 +1,15 @@
1pub fn sqrt32(x: f32) -> f32 {
2 return asm (
3 \\sqrtss %%xmm0, %%xmm0
4 : [ret] "={xmm0}" (-> f32)
5 : [x] "{xmm0}" (x)
6 );
7}
8
9pub fn sqrt64(x: f64) -> f64 {
10 return asm (
11 \\sqrtsd %%xmm0, %%xmm0
12 : [ret] "={xmm0}" (-> f64)
13 : [x] "{xmm0}" (x)
14 );
15}