[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-libc-dev] [bug #15266] Function ldexp incorrectly processes ove
From: |
Dmitry K. |
Subject: |
Re: [avr-libc-dev] [bug #15266] Function ldexp incorrectly processes overflow and underflow cases. |
Date: |
Thu, 22 Dec 2005 17:56:47 +1000 |
User-agent: |
KMail/1.5 |
On Thursday 22 December 2005 09:06, Anatoly Sokolov wrote:
> URL:
> <http://savannah.nongnu.org/bugs/?func=detailitem&item_id=15266>
>
> Summary: Function ldexp incorrectly processes overflow and
> underflow cases.
[...]
Yes, it is.
I have prepare a patch and will send to Savannah after testing.
Subnormals will work also.
Preview of a patch:
~~~~~~~~~~~~~~~~~~
GLOBAL(ldexp)
BST rA3,7
RCALL _U(__fp_split1) ; clears rAE
TST rA3 ;
BREQ .L_zero ; 2^x*0 = 0
; rAE.rA3 := sum of exponent and arg
add rA3, rPL
adc rAE, rPH
brlt 3f ; V is 0 in branch case
brvs .L_ovfl
breq .L_merge ; to skip next possible normalization
; normalize A, if needed
1: tst rA2
brpl 2f
lsl rA0
rol rA1
rol rA2
subi rA3, lo8(1)
sbci rAE, hi8(1)
brne 1b
; check upper margin of exponent
2: tst rAE
breq .L_merge
; overflow
.L_ovfl:
rjmp _U(__fp_nanERANGE)
; result exponent is negative
3: subi rA3, lo8(-23)
sbci rAE, hi8(-23)
brlt .L_zero
; denormalize A
4: lsr rA2
ror rA1
ror rA0
subi rA3, 1
brne 4b
.L_merge:
rjmp _U(__fp_merge)
.L_zero:
rjmp _U(__fp_zero)
ENDFUNC
Dmitry.