2013-10-01 Joern Rennecke <joern.rennecke@embecosm.com>
[official-gcc.git] / libgcc / config / arc / ieee-754 / arc600 / divsf3.S
blob7fcbadbe086220daa5c10985980f6faa55ea853d
1 /* Copyright (C) 2008-2013 Free Software Foundation, Inc.  
2    Contributor: Joern Rennecke <joern.rennecke@embecosm.com>
3                 on behalf of Synopsys Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24 <http://www.gnu.org/licenses/>.  */
26 #include "../arc-ieee-754.h"
28 #if 0 /* DEBUG */
29         .global __divsf3
30         FUNC(__divsf3)
31         .balign 4
32 __divsf3:
33         push_s blink
34         push_s r1
35         bl.d __divsf3_c
36         push_s r0
37         ld_s r1,[sp,4]
38         st_s r0,[sp,4]
39         bl.d __divsf3_asm
40         pop_s r0
41         pop_s r1
42         pop_s blink
43         cmp r0,r1
44         jeq_s [blink]
45         and r12,r0,r1
46         bic.f 0,0x7f800000,r12 ; both NaN -> OK
47         jeq_s [blink]
48         bl abort
49         ENDFUNC(__divsf3)
50 #define __divsf3 __divsf3_asm
51 #endif /* DEBUG */
53         .balign 4
54 __divdf3_support: /* This label makes debugger output saner.  */
55         FUNC(__divsf3)
56 .Ldenorm_fp0:
57         norm.f r12,r2 ; flag for 0/x -> 0 check
58         bic.ne.f 0,0x60000000,r1 ; denorm/large number -> 0
59         beq_s .Lret0_NaN
60         tst r1,r9
61         add_s r2,r2,r2
62         sub_s r12,r12,8
63         asl_s r2,r2,r12
64         asl_l r12,r12,23
65         bne.d .Lpast_denorm_fp0
66         add r5,r5,r12
67 /* r0 is subnormal, r1 is subnormal or 0.  */
69         .balign 4
70 .Ldenorm_fp1:
71         norm.f r12,r3 ; flag for  x/0 -> Inf check
72         bic.ne.f 0,0x60000000,r0 ; large number/denorm -> Inf
73         beq_s .Linf
74         add_s r3,r3,r3
75         sub_s r12,r12,8
76         asl_s r3,r3,r12
77         asl_s r12,r12,23
78         b.d .Lpast_denorm_fp1
79         add r4,r4,r12
81 .Lret0_NaN:
82         bclr.f 0,r1,31 ; 0/0 -> NaN
83         bic r0,r10,r9
84         j_s.d [blink]
85         sub.eq r0,r0,1
87         .balign 4
88 .Linf_nan_fp0:
89         bic.f 0,r9,r1 ; fp1 Inf -> result NaN
90         bic r1,r5,r9  ; fp1 sign
91         sub.eq r1,r1,1
92         j_s.d [blink]
93         xor_s r0,r0,r1
94 .Linf_nan_fp1:
95         bic r0,r4,r9 ; fp0 sign
96         bmsk.f 0,r1,22 ; x/inf -> 0, x/nan -> nan
97         xor.eq r1,r1,r9
98         j_s.d [blink]
99         xor_s r0,r0,r1
101         .global __divsf3
102         .balign 4
103         .long 0x7f800000 ; exponent mask
104 __divsf3:
105         ld r9,[pcl,-4]
106         bmsk r2,r0,22
107         xor r4,r0,r2
108         bmsk r3,r1,22
109         xor r5,r1,r3
110         and r11,r0,r9
111         breq.d r11,0,.Ldenorm_fp0
112         xor r10,r4,r5
113         breq r11,r9,.Linf_nan_fp0
114         bset_s r2,r2,23
115         and r11,r1,r9
116         breq r11,0,.Ldenorm_fp1
117         breq r11,r9,.Linf_nan_fp1
118 .Lpast_denorm_fp0:
119         bset_s r3,r3,23
120 .Lpast_denorm_fp1:
121         cmp r2,r3
122         asl_s r2,r2,6+1
123         asl_s r3,r3,7
124         add.lo r2,r2,r2
125         bclr r8,r9,30 ; exponent bias
126         bclr.lo r8,r8,23 ; reduce exp by one if fraction is shifted
127         sub r4,r4,r5
128         add r4,r4,r8
129         xor.f 0,r10,r4
130         bmi .Linf_denorm
131         and.f r12,r4,r9
132         beq .Ldenorm
133         sub_s r2,r2,r3 ; discard implicit 1
134         rsub r3,r3,1 ; prime r3 for two-insn divide-step use
135 .Ldiv_23bit:
136         .rep 6
137         add1.f r2,r3,r2
138         sub.cc r2,r2,r3
139         .endr
140         breq r12,r9,.Linf
141         bmsk r0,r2,6
142         xor_s r2,r2,r0
143 .Ldiv_17bit:
144         .rep 7
145         add1.f r2,r3,r2
146         sub.cc r2,r2,r3
147         .endr
148         asl_s r0,r0,7
149         bmsk r1,r2,6
150         xor_s r2,r2,r1
151         or_s r0,r0,r1
152 .Ldiv_10bit:
153         .rep 7
154         add1.f r2,r3,r2
155         sub.cc r2,r2,r3
156         .endr
157         asl_s r0,r0,7
158         bmsk r1,r2,6
159         xor_s r2,r2,r1
160         or_s r0,r0,r1
161 .Ldiv_3bit:
162         .rep 3
163         add1.f r2,r3,r2
164         sub.cc r2,r2,r3
165         .endr
166         asl_s r0,r0,3
167 .Ldiv_0bit:
168         add1.f r1,r3,r2
169         sub.cc r1,r1,r3
170         bmsk_s r2,r2,2
171         tst r1,-0x7e ; 0xffffff82, test for rest or odd
172         bmsk_s r1,r1,0
173         add_s r0,r0,r2 ; assemble fraction
174         add_s r0,r0,r4 ; add in sign & exponent
175         j_s.d [blink]
176         add.ne r0,r0,r1 ; round to nearest / even
178         .balign 4
179 .Linf:
180         j_s.d [blink]
181         or r0,r10,r9
183 .Lret_r4:
184         j_s.d [blink]
185         mov_s r0,r4
186         .balign 4
187 .Linf_denorm:
188         add.f r12,r4,r4
189         asr_l r12,r12,24
190         bpl .Linf
191         max r12,r12,-24
192 .Ldenorm:
193         rsub r3,r3,1
194         add r1,pcl,68; .Ldenorm_tab-.
195         ldw.as r12,[r1,r12]
196         mov_s r0,0
197         lsr_s r2,r2
198         sub_s r1,r1,r12
199         j_s.d [r1]
200         bic r4,r10,r9
201         .short .Ldenorm_tab-.Lret_r4
202         .short .Ldenorm_tab-.Ldiv_0bit
203         .short .Ldenorm_tab-.Ldiv_3bit-2*8
204         .short .Ldenorm_tab-.Ldiv_3bit-1*8
205         .short .Ldenorm_tab-.Ldiv_3bit
206         .short .Ldenorm_tab-.Ldiv_10bit-6*8
207         .short .Ldenorm_tab-.Ldiv_10bit-5*8
208         .short .Ldenorm_tab-.Ldiv_10bit-3*8
209         .short .Ldenorm_tab-.Ldiv_10bit-3*8
210         .short .Ldenorm_tab-.Ldiv_10bit-2*8
211         .short .Ldenorm_tab-.Ldiv_10bit-1*8
212         .short .Ldenorm_tab-.Ldiv_10bit
213         .short .Ldenorm_tab-.Ldiv_17bit-6*8
214         .short .Ldenorm_tab-.Ldiv_17bit-5*8
215         .short .Ldenorm_tab-.Ldiv_17bit-4*8
216         .short .Ldenorm_tab-.Ldiv_17bit-3*8
217         .short .Ldenorm_tab-.Ldiv_17bit-2*8
218         .short .Ldenorm_tab-.Ldiv_17bit-1*8
219         .short .Ldenorm_tab-.Ldiv_17bit
220         .short .Ldenorm_tab-.Ldiv_23bit-5*8
221         .short .Ldenorm_tab-.Ldiv_23bit-4*8
222         .short .Ldenorm_tab-.Ldiv_23bit-3*8
223         .short .Ldenorm_tab-.Ldiv_23bit-2*8
224         .short .Ldenorm_tab-.Ldiv_23bit-1*8
225 .Ldenorm_tab:
226         .short .Ldenorm_tab-.Ldiv_23bit
227         ENDFUNC(__divsf3)