From 37eb14dd2b92c51404fa54f56b6dfcd487ab5cbb Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sun, 18 Mar 2012 22:05:20 -0400 Subject: asm for lrint family on i386 --- src/math/i386/llrint.s | 8 ++++++++ src/math/i386/llrintf.s | 9 +++++++++ src/math/i386/llrintl.s | 8 ++++++++ src/math/i386/lrint.s | 7 +++++++ src/math/i386/lrintf.s | 7 +++++++ src/math/i386/lrintl.s | 7 +++++++ 6 files changed, 46 insertions(+) create mode 100644 src/math/i386/llrint.s create mode 100644 src/math/i386/llrintf.s create mode 100644 src/math/i386/llrintl.s create mode 100644 src/math/i386/lrint.s create mode 100644 src/math/i386/lrintf.s create mode 100644 src/math/i386/lrintl.s (limited to 'src') diff --git a/src/math/i386/llrint.s b/src/math/i386/llrint.s new file mode 100644 index 00000000..e961b35d --- /dev/null +++ b/src/math/i386/llrint.s @@ -0,0 +1,8 @@ +.global llrint +.type llrint,@function +llrint: + fldl 4(%esp) + fistpl 4(%esp) + mov 4(%esp),%eax + mov 8(%esp),%edx + ret diff --git a/src/math/i386/llrintf.s b/src/math/i386/llrintf.s new file mode 100644 index 00000000..1905cdcd --- /dev/null +++ b/src/math/i386/llrintf.s @@ -0,0 +1,9 @@ +.global llrintf +.type llrintf,@function +llrintf: + sub $8,%esp + flds 12(%esp) + fistpq (%esp) + pop %eax + pop %edx + ret diff --git a/src/math/i386/llrintl.s b/src/math/i386/llrintl.s new file mode 100644 index 00000000..84e63867 --- /dev/null +++ b/src/math/i386/llrintl.s @@ -0,0 +1,8 @@ +.global llrintl +.type llrintl,@function +llrintl: + fldt 4(%esp) + fistpl 4(%esp) + mov 4(%esp),%eax + mov 8(%esp),%edx + ret diff --git a/src/math/i386/lrint.s b/src/math/i386/lrint.s new file mode 100644 index 00000000..02b83d9f --- /dev/null +++ b/src/math/i386/lrint.s @@ -0,0 +1,7 @@ +.global lrint +.type lrint,@function +lrint: + fldl 4(%esp) + fistpl 4(%esp) + mov 4(%esp),%eax + ret diff --git a/src/math/i386/lrintf.s b/src/math/i386/lrintf.s new file mode 100644 index 00000000..907aac29 --- /dev/null +++ b/src/math/i386/lrintf.s @@ -0,0 +1,7 @@ +.global lrintf +.type lrintf,@function +lrintf: + flds 4(%esp) + fistpl 4(%esp) + mov 4(%esp),%eax + ret diff --git a/src/math/i386/lrintl.s b/src/math/i386/lrintl.s new file mode 100644 index 00000000..3ae05aac --- /dev/null +++ b/src/math/i386/lrintl.s @@ -0,0 +1,7 @@ +.global lrintl +.type lrintl,@function +lrintl: + fldt 4(%esp) + fistpl 4(%esp) + mov 4(%esp),%eax + ret -- cgit v1.2.1 From aa1b4dff45788f8205e32ea01da243fe09568aa8 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sun, 18 Mar 2012 23:17:28 -0400 Subject: fix broken exponential asm infinities were getting converted into nans. the new code simply tests for infinity and replaces it with a large magnitude value of the same sign. also, the fcomi instruction is apparently not part of the i387 instruction set, so avoid using it. --- src/math/i386/exp.s | 9 +++++++++ src/math/i386/expm1.s | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/math/i386/exp.s b/src/math/i386/exp.s index 18f6cd67..f4769d59 100644 --- a/src/math/i386/exp.s +++ b/src/math/i386/exp.s @@ -34,6 +34,15 @@ exp: .type exp2,@function exp2: fldl 4(%esp) +1: fxam + fnstsw %ax + sahf + jnp 1f + jnc 1f + fstps 4(%esp) + mov $0xfe,%al + and %al,7(%esp) + flds 4(%esp) 1: fld %st(0) frndint fxch %st(1) diff --git a/src/math/i386/expm1.s b/src/math/i386/expm1.s index d6d511ef..bbb5d12e 100644 --- a/src/math/i386/expm1.s +++ b/src/math/i386/expm1.s @@ -14,12 +14,23 @@ expm1l: .type expm1,@function expm1: fldl 4(%esp) +1: fxam + fnstsw %ax + sahf + jnp 1f + jnc 1f + fstps 4(%esp) + mov $0xfe,%al + and %al,7(%esp) + flds 4(%esp) 1: fldl2e fmulp fld %st(0) frndint fldz - fcompi + fcomp + fnstsw %ax + sahf jnz 1f fstp %st(0) f2xm1 -- cgit v1.2.1 From 495a52ae7bb581aac2942d7cb095cca2ff53ca3c Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sun, 18 Mar 2012 23:50:54 -0400 Subject: asm for log functions --- src/math/i386/log.s | 7 +++++++ src/math/i386/log10.s | 7 +++++++ src/math/i386/log10f.s | 7 +++++++ src/math/i386/log10l.s | 7 +++++++ src/math/i386/logf.s | 7 +++++++ src/math/i386/logl.s | 7 +++++++ 6 files changed, 42 insertions(+) create mode 100644 src/math/i386/log.s create mode 100644 src/math/i386/log10.s create mode 100644 src/math/i386/log10f.s create mode 100644 src/math/i386/log10l.s create mode 100644 src/math/i386/logf.s create mode 100644 src/math/i386/logl.s (limited to 'src') diff --git a/src/math/i386/log.s b/src/math/i386/log.s new file mode 100644 index 00000000..fcccf030 --- /dev/null +++ b/src/math/i386/log.s @@ -0,0 +1,7 @@ +.global log +.type log,@function +log: + fldln2 + fldl 4(%esp) + fyl2x + ret diff --git a/src/math/i386/log10.s b/src/math/i386/log10.s new file mode 100644 index 00000000..28eb5b2f --- /dev/null +++ b/src/math/i386/log10.s @@ -0,0 +1,7 @@ +.global log10 +.type log10,@function +log10: + fldlg2 + fldl 4(%esp) + fyl2x + ret diff --git a/src/math/i386/log10f.s b/src/math/i386/log10f.s new file mode 100644 index 00000000..c0c0c67e --- /dev/null +++ b/src/math/i386/log10f.s @@ -0,0 +1,7 @@ +.global log10f +.type log10f,@function +log10f: + fldlg2 + flds 4(%esp) + fyl2x + ret diff --git a/src/math/i386/log10l.s b/src/math/i386/log10l.s new file mode 100644 index 00000000..aaa44f2f --- /dev/null +++ b/src/math/i386/log10l.s @@ -0,0 +1,7 @@ +.global log10l +.type log10l,@function +log10l: + fldlg2 + fldt 4(%esp) + fyl2x + ret diff --git a/src/math/i386/logf.s b/src/math/i386/logf.s new file mode 100644 index 00000000..da7ff3ae --- /dev/null +++ b/src/math/i386/logf.s @@ -0,0 +1,7 @@ +.global logf +.type logf,@function +logf: + fldln2 + flds 4(%esp) + fyl2x + ret diff --git a/src/math/i386/logl.s b/src/math/i386/logl.s new file mode 100644 index 00000000..d4e3339b --- /dev/null +++ b/src/math/i386/logl.s @@ -0,0 +1,7 @@ +.global logl +.type logl,@function +logl: + fldln2 + fldt 4(%esp) + fyl2x + ret -- cgit v1.2.1