Improvements to float support in printf_fast
[fw/sdcc] / device / lib / _fsget2args.c
1 #define SDCC_FLOAT_LIB
2 #include <float.h>
3
4
5
6
7 static void dummy(void) _naked
8 {
9         // arg1: passed in a,b,dph,dpl
10         // arg2: passed on stack
11         _asm
12         .globl  fsgetargs
13 fsgetargs:
14         // extract the two inputs, placing them into:
15         //      sign     exponent   mantiassa
16         //      ----     --------   ---------
17         //  a:  sign_a   exp_a     r4/r3/r2
18         //  b:  sign_b   exp_b     r7/r6/r5
19         //
20         mov     r2, dpl
21         mov     r3, dph
22         mov     c, b.7
23         rlc     a
24         mov     sign_a, c
25         jz      00001$
26         setb    b.7
27 00001$:
28         mov     exp_a, a
29         mov     r4, b
30         // now extract the 2nd parameter from the stack
31         mov     a, sp
32         add     a, #249
33         mov     r0, a
34         mov     a, @r0
35         mov     r5, a
36         inc     r0
37         mov     a, @r0
38         mov     r6, a
39         inc     r0
40         mov     b, @r0
41         inc     r0
42         mov     a, @r0
43         mov     c, b.7
44         rlc     a
45         mov     sign_b, c
46         jz      00002$
47         setb    b.7
48 00002$:
49         mov     exp_b, a
50         mov     r7, b
51         ret
52         _endasm;
53 }
54
55
56
57
58
59 #if 0
60 // This old version was designed before the change to make all this
61 // code fully reentrant.  What a mess the 2nd parameter turns out to
62 // be.
63
64 void __fsgetargs (float a, float b)
65 {
66         a;      // passed in a,b,dph,dpl
67         b;      // ___fsadd_PARM_2
68
69         _asm
70         // extract the two inputs, placing them into:
71         //      sign     exponent   mantiassa
72         //      ----     --------   ---------
73         //  a:  sign_a   exp_a     r4/r3/r2
74         //  b:  sign_b   exp_b     r7/r6/r5
75         //
76         mov     r2, dpl
77         mov     r3, dph
78         mov     c, b.7
79         rlc     a
80         mov     sign_a, c
81         jz      00001$
82         setb    b.7
83 00001$:
84         mov     exp_a, a
85         mov     r4, b
86 #ifdef SDCC_MODEL_SMALL
87         mov     r5, (___fsadd_PARM_2 + 0)
88         mov     r6, (___fsadd_PARM_2 + 1)
89         mov     b, (___fsadd_PARM_2 + 2)
90         mov     a, (___fsadd_PARM_2 + 3)
91         mov     c, b.7
92         rlc     a
93         mov     sign_b, c
94         jz      00002$
95         setb    b.7
96 00002$:
97         mov     exp_b, a
98         mov     r7, b
99 #endif
100         _endasm;
101 }
102
103
104 #ifdef SDCC_MODEL_LARGE
105 void __fsgetarglarge2 (void)
106 {
107         _asm
108         movx    a, @dptr
109         mov     r5, a
110         inc     dptr
111         movx    a, @dptr
112         mov     r6, a
113         inc     dptr
114         movx    a, @dptr
115         mov     b, a
116         inc     dptr
117         movx    a, @dptr
118         mov     c, b.7
119         rlc     a
120         mov     sign_b, c
121         jz      00002$
122         setb    b.7
123 00002$:
124         mov     exp_b, a
125         mov     r7, b
126         _endasm;
127 }
128 #endif
129
130 #endif
131