avr-libc-dev
[Top][All Lists]
Advanced

[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.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]