mirror of
git://git.musl-libc.org/musl
synced 2024-11-27 12:04:14 +08:00
math: fix x86_64 and x32 asm not to use sahf instruction
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.
This commit is contained in:
parent
de2b9c21d9
commit
a732e80d33
@ -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
|
||||
|
@ -5,7 +5,7 @@ fmodl:
|
||||
fldt 8(%esp)
|
||||
1: fprem
|
||||
fstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
testb $4,%ah
|
||||
jnz 1b
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
@ -5,7 +5,7 @@ remainderl:
|
||||
fldt 8(%esp)
|
||||
1: fprem1
|
||||
fstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
testb $4,%ah
|
||||
jnz 1b
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
@ -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
|
||||
|
@ -5,7 +5,7 @@ fmodl:
|
||||
fldt 8(%rsp)
|
||||
1: fprem
|
||||
fstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
testb $4,%ah
|
||||
jnz 1b
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
@ -5,7 +5,7 @@ remainderl:
|
||||
fldt 8(%rsp)
|
||||
1: fprem1
|
||||
fstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
testb $4,%ah
|
||||
jnz 1b
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
Loading…
Reference in New Issue
Block a user