math: fix exp2l asm on x86 (raise underflow correctly)
authorSzabolcs Nagy <nsz@port70.net>
Thu, 5 Sep 2013 10:58:48 +0000 (10:58 +0000)
committerSzabolcs Nagy <nsz@port70.net>
Thu, 5 Sep 2013 11:30:09 +0000 (11:30 +0000)
commit07039ed8563b850624146c938ae201a1099d2f75
tree2a751e8684596943be0bca4391289759b718f2b4
parent8dba5486288e719ed290cccefcd932ed32756d7c
math: fix exp2l asm on x86 (raise underflow correctly)

there were two problems:
* omitted underflow on subnormal results: exp2l(-16383.5) was calculated
as sqrt(2)*2^-16384, the last bits of sqrt(2) are zero so the down scaling
does not underflow eventhough the result is in subnormal range
* spurious underflow for subnormal inputs: exp2l(0x1p-16400) was evaluated
as f2xm1(x)+1 and f2xm1 raised underflow (because inexact subnormal result)

the first issue is fixed by raising underflow manually if x is in
(-32768,-16382] and not integer (x-0x1p63+0x1p63 != x)

the second issue is fixed by treating x in (-0x1p64,0x1p64) specially

for these fixes the special case handling was completely rewritten
src/math/i386/exp.s
src/math/x86_64/exp2l.s