]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/config/arc/ieee-754/arc600/divsf3.S
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / arc / ieee-754 / arc600 / divsf3.S
CommitLineData
99dee823 1/* Copyright (C) 2008-2021 Free Software Foundation, Inc.
d38a64b4
JR
2 Contributor: Joern Rennecke <joern.rennecke@embecosm.com>
3 on behalf of Synopsys Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
25
26#include "../arc-ieee-754.h"
27
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 */
52
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. */
68
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
80
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
86
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
100
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
177
178 .balign 4
179.Linf:
180 j_s.d [blink]
181 or r0,r10,r9
182
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)