Merge branch 'vendor/GCC50' - gcc 5.0 snapshot 1 FEB 2015
[dragonfly.git] / contrib / gcc-5.0 / libgcc / config / arc / ieee-754 / arc600-mul64 / mulsf3.S
1 /* Copyright (C) 2008-2015 Free Software Foundation, Inc.
2    Contributor: Joern Rennecke <joern.rennecke@embecosm.com>
3                 on behalf of Synopsys Inc.
4
5 This file is part of GCC.
6
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.
11
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.
16
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.
20
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/>.  */
25
26 #include "../arc-ieee-754.h"
27
28 #if 0 /* DEBUG */
29         .global __mulsf3
30         FUNC(__mulsf3)
31         .balign 4
32 __mulsf3:
33         push_s blink
34         push_s r1
35         bl.d __mulsf3_c
36         push_s r0
37         ld_s r1,[sp,4]
38         st_s r0,[sp,4]
39         bl.d __mulsf3_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
47         bne 0f
48         bmsk.f 0,r0,22
49         bmsk.ne.f r1,r1,22
50         jne_s [blink] ; both NaN -> OK
51 0:      bl abort
52         ENDFUNC(__mulsf3)
53 #define __mulsf3 __mulsf3_asm
54 #endif /* DEBUG */
55
56         .balign 4
57         .global __mulsf3
58         FUNC(__mulsf3)
59 __mulsf3:
60         ld.as   r9,[pcl,80]; [pcl,((.L7f800000-.+2)/4)]
61         bmsk    r4,r1,22
62         bset    r2,r0,23
63         asl_s   r2,r2,8
64         bset    r3,r4,23
65         mulu64  r2,r3
66         and     r11,r0,r9
67         breq.d  r11,0,.Ldenorm_dbl0
68         and     r12,r1,r9
69         breq.d  r12,0,.Ldenorm_dbl1
70         xor_s   r0,r0,r1
71         breq.d  r11,r9,.Linf_nan_dbl0
72         ld.as   r4,[pcl,70]; [pcl,((.L7fffffff-.+2)/4)]
73         breq.d  r12,r9,.Linf_nan_dbl1
74 .Lpast_denorm:
75         asl.f   0,mhi,8
76         mov     r6,mhi
77         mov     r7,mlo
78         add.pl  r6,r6,r6
79         bclr.pl r6,r6,23
80         add.pl.f r7,r7,r7
81         add.cs  r6,r6,1
82         lsr.f   0,r6,1
83         add_s   r12,r12,r11
84         adc.f   0,r7,r4
85         add_s   r12,r12, \
86                 -0x3f800000
87         adc.f   r8,r6,r12
88         tst.pl  r8,r9
89         bic     r0,r0,r4
90         min     r3,r8,r9
91         jpnz.d  [blink]
92         add.pnz r0,r0,r3
93 ; infinity or denormal number
94         add.ne.f r3,r3,r3
95         asr_s   r3,r3,23+1
96         bset    r6,r6,23
97         bpnz.d  .Linfinity
98         sub_s   r3,r3,1
99         neg_s   r2,r3
100         brhi.d  r2,24,.Lret_r0 ; right shift shift > 24 -> return +-0
101         lsr     r2,r6,r2
102         asl     r9,r6,r3
103         lsr.f   0,r2,1
104         tst     r7,r7
105         add_s   r0,r0,r2
106         bset.ne r9,r9,0
107         adc.f   0,r9,r4
108         j_s.d   [blink]
109         add.cs  r0,r0,1
110 .Linfinity:
111         j_s.d   [blink]
112         add_s   r0,r0,r9
113
114 .Lret_r0: j_s [blink]
115
116         .balign 4
117 .Ldenorm_dbl0:
118         bclr_s  r2,r2,31
119         norm.f  r4,r2
120         add_s   r2,r2,r2
121         asl     r2,r2,r4
122         mulu64  r2,r3
123         breq.d  r12,r9,.Ldenorm_dbl0_inf_nan_dbl1
124         asl     r4,r4,23
125         sub.ne.f r12,r12,r4
126         ld.as   r4,[pcl,29]; [pcl,((.L7fffffff-.+2)/4)]
127         bhi.d   .Lpast_denorm
128         xor_s   r0,r0,r1
129         bmsk    r1,r0,30
130         j_s.d   [blink]
131         bic_s   r0,r0,r1
132
133         .balign 4
134 .Ldenorm_dbl0_inf_nan_dbl1:
135         bmsk.f  0,r0,30
136         beq_s   .Lretnan
137         xor_s   r0,r0,r1
138 .Linf_nan_dbl1:
139         xor_s   r1,r1,r0
140 .Linf_nan_dbl0:
141         bclr_s  r1,r1,31
142         cmp_s   r1,r9
143         jls.d   [blink]
144         xor_s   r0,r0,r1
145 ; r1 NaN -> result NaN
146 .Lretnan:
147         j_s.d [blink]
148         mov r0,-1
149
150         .balign 4
151 .Ldenorm_dbl1:
152         breq.d  r11,r9,.Linf_nan_dbl0_2
153         norm.f  r3,r4
154         sub_s   r3,r3,7
155         asl     r4,r4,r3
156         mulu64  r2,r4
157         sub_s   r3,r3,1
158         asl_s   r3,r3,23
159         sub.ne.f r11,r11,r3
160         ld.as   r4,[pcl,11]; [pcl,((.L7fffffff-.+2)/4)]
161         bhi.d   .Lpast_denorm
162         bmsk    r8,r0,30
163         j_s.d   [blink]
164         bic     r0,r0,r8
165
166         .balign 4
167 .Linf_nan_dbl0_2:
168         bclr_s  r1,r1,31
169         xor_s   r0,r0,r1
170         sub.eq  r1,r1,1 ; inf/nan * 0 -> nan
171         bic.f   0,r9,r1
172         j_s.d   [blink]
173         or.eq   r0,r0,r1 ; r1 nan -> result nan
174
175         .balign 4
176 .L7f800000:
177         .long   0x7f800000
178 .L7fffffff:
179         .long   0x7fffffff
180         ENDFUNC(__mulsf3)