Improvements to float support in printf_fast
[fw/sdcc] / device / lib / _fsreturnval.c
1 #define SDCC_FLOAT_LIB
2 #include <float.h>
3
4 static void dummy(void) _naked
5 {
6         _asm
7
8         .globl  fs_round_and_return
9 fs_round_and_return:
10 #ifdef FLOAT_FULL_ACCURACY
11         // discard the extra 8 bits of precision we kept around in r1
12         cjne    r1, #128, 00001$
13         mov     a, r2
14         rrc     a
15         cpl     c
16 00001$:
17         jc      fs_zerocheck_return
18         mov     a, r2
19         add     a, #1
20         mov     r2, a
21         clr     a
22         addc    a, r3
23         mov     r3, a
24         clr     a
25         addc    a, r4
26         mov     r4, a
27         jnc     fs_zerocheck_return
28         mov     r4, #0x80
29         inc     exp_a
30 #endif
31
32         .globl  fs_zerocheck_return
33 fs_zerocheck_return:
34         // zero output is a special case
35         cjne    r4, #0, fs_direct_return
36         cjne    r3, #0, fs_direct_return
37         cjne    r2, #0, fs_direct_return
38
39         .globl  fs_return_zero
40 fs_return_zero:
41         clr     a
42         mov     b, a
43         mov     dph, a
44         mov     dpl, a
45         ret
46
47         .globl  fs_direct_return
48 fs_direct_return:
49         // collect all pieces and return
50         mov     c, sign_a
51         mov     a, exp_a
52         rrc     a
53         mov     b, r4
54         mov     b.7, c
55         mov     dph, r3
56         mov     dpl, r2
57         ret
58
59         .globl  fs_return_inf
60 fs_return_inf:
61         clr     a
62         mov     dph, a
63         mov     dpl, a
64         mov     b, #0x80
65         cpl     a
66         mov     c, sign_a
67         rrc     a
68         ret
69
70         .globl  fs_return_nan
71 fs_return_nan:
72         clr     a
73         mov     dph, a
74         mov     dpl, a
75         mov     b, #0xC0
76         mov     a, #0x7F
77         ret
78
79         _endasm;
80 }
81