math: fix x86_64 and x32 asm not to use sahf instruction
authorSzabolcs Nagy <nsz@port70.net>
Wed, 5 Nov 2014 20:40:29 +0000 (21:40 +0100)
committerSzabolcs Nagy <nsz@port70.net>
Wed, 5 Nov 2014 20:40:29 +0000 (21:40 +0100)
Some early x86_64 cpus (released before 2006) did not support sahf/lahf
instructions so they should be avoided (intel manual says they are only
supported if CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1).

The workaround simplifies exp2l and expm1l because fucomip can be
used instead of the fucomp;fnstsw;sahf sequence copied from i386.

In fmodl and remainderl sahf is replaced by a simple bit test.

src/math/x32/exp2l.s
src/math/x32/fmodl.s
src/math/x32/remainderl.s
src/math/x86_64/exp2l.s
src/math/x86_64/fmodl.s
src/math/x86_64/remainderl.s

index d9f4d6edd8a1f8f83f637dcd761aa7c20c8ac712..dfb2bc7cca376ad62660ce23a5713b5d4b318e1d 100644 (file)
@@ -6,9 +6,7 @@ expm1l:
        fmulp
        movl $0xc2820000,-4(%esp)
        flds -4(%esp)
-       fucomp %st(1)
-       fnstsw %ax
-       sahf
+       fucomip %st(1)
        fld1
        jb 1f
                # x*log2e <= -65, return -1 without underflow
@@ -17,11 +15,8 @@ expm1l:
        ret
 1:     fld %st(1)
        fabs
-       fucom %st(1)
-       fnstsw %ax
+       fucomip %st(1)
        fstp %st(0)
-       fstp %st(0)
-       sahf
        ja 1f
        f2xm1
        ret
@@ -53,9 +48,7 @@ exp2l:
        fld %st(1)
        fsub %st(1)
        faddp
-       fucomp %st(1)
-       fnstsw
-       sahf
+       fucomip %st(1)
        je 2f             # x - 0x1p63 + 0x1p63 == x
        movl $1,(%esp)
        flds (%esp)       # 0x1p-149
index 9e4378ab934cc460b885fbc6f92f86313c5ea1e2..b95132042d8590f86431102a58a2448e44044546 100644 (file)
@@ -5,7 +5,7 @@ fmodl:
        fldt 8(%esp)
 1:     fprem
        fstsw %ax
-       sahf
-       jp 1b
+       testb $4,%ah
+       jnz 1b
        fstp %st(1)
        ret
index c97f68ad627146fd49e1cb1f0add747221cb2ce6..79bf4feb52c0f9fb059bf09db033eaae7da547e0 100644 (file)
@@ -5,7 +5,7 @@ remainderl:
        fldt 8(%esp)
 1:     fprem1
        fstsw %ax
-       sahf
-       jp 1b
+       testb $4,%ah
+       jnz 1b
        fstp %st(1)
        ret
index 0d6cd563baca544f6f49401a77939965ef2cee87..0e9bdf9f39517f564225199d66d286ad855d4ba7 100644 (file)
@@ -6,9 +6,7 @@ expm1l:
        fmulp
        movl $0xc2820000,-4(%rsp)
        flds -4(%rsp)
-       fucomp %st(1)
-       fnstsw %ax
-       sahf
+       fucomip %st(1)
        fld1
        jb 1f
                # x*log2e <= -65, return -1 without underflow
@@ -17,11 +15,8 @@ expm1l:
        ret
 1:     fld %st(1)
        fabs
-       fucom %st(1)
-       fnstsw %ax
+       fucomip %st(1)
        fstp %st(0)
-       fstp %st(0)
-       sahf
        ja 1f
        f2xm1
        ret
@@ -53,9 +48,7 @@ exp2l:
        fld %st(1)
        fsub %st(1)
        faddp
-       fucomp %st(1)
-       fnstsw
-       sahf
+       fucomip %st(1)
        je 2f             # x - 0x1p63 + 0x1p63 == x
        movl $1,(%rsp)
        flds (%rsp)       # 0x1p-149
index ca81e60c6254ee5167844a463dba1a8163d922bb..cd8d2b7c1509edd6e1a97888a005a825d8b58567 100644 (file)
@@ -5,7 +5,7 @@ fmodl:
        fldt 8(%rsp)
 1:     fprem
        fstsw %ax
-       sahf
-       jp 1b
+       testb $4,%ah
+       jnz 1b
        fstp %st(1)
        ret
index 75c123744621fd00d3acec785d44b4ebdfcbebd8..2c337cf57839c7f3f04709faf8c3eb3fb0b0b902 100644 (file)
@@ -5,7 +5,7 @@ remainderl:
        fldt 8(%rsp)
 1:     fprem1
        fstsw %ax
-       sahf
-       jp 1b
+       testb $4,%ah
+       jnz 1b
        fstp %st(1)
        ret