~ubuntu-branches/ubuntu/breezy/avr-libc/breezy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*  -*- Mode: Asm -*-  */
/*
    frexp.S is part of     FPlib V 0.3.0       ported to avr-as
    for copyright and details see readme.fplib

 *----------------------------------------------------------------------------------------
 *
 *	A = mantissa(A)  *integ = exponent(A)
 * e.g.
 * int integ
 * double fract = frexp( 3.45, &integ ) = frexp ( 2^2 * 0.8625 )
 * -> fract = 0.8625; *integ = 2
 *
 * fract(0) -> 0/0
 */

#include "gasava.inc"
#include "fplib.inc"

          TEXT_SEG(fplib, frexp)
          FUNCTION(frexp)

GLOBAL(frexp)
        MOV     ZH,rPH
        MOV     ZL,rPL
        BST     rA3,7

        RCALL   _U(__fp_split1)	;
        TST     rA3
        BREQ    _frexp_200
        SUBI    rA3,0x7E	; 0.5 -> 0.5 * 2^0
				; 1.0 -> 0.5 * 2^1
        SBC     rB0,rB0		; sign expand rA3
        ST      Z,rA3
        STD     Z+1,rB0

        ANDI    rA2,0x7F	; mantissa is normalized
        LDI     rA3,0x3F	; exponent for 0.5
        BLD     rA3,7
        RET

 _frexp_200:
        ST      Z,rA3
        STD     Z+1,rT1c
        RJMP    _U(__fp_zero)	; frexp(0) returns 0 not A = 0x00800000 of fp_split1

          ENDFUNC