1 /* $NetBSD: softfloat-for-gcc.h,v 1.12 2013/08/01 23:21:19 matt Exp $ */
2 /*-
3  * Copyright (c) 2008 The NetBSD Foundation, Inc.
4  * All rights reserved.
5  *
6  * This code is derived from software contributed to The NetBSD Foundation
7  * by
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /*
32  * Move private identifiers with external linkage into implementation
33  * namespace.  -- Klaus Klein <kleink@NetBSD.org>, May 5, 1999
34  */
35 #define float_exception_flags   _softfloat_float_exception_flags
36 #define float_exception_mask    _softfloat_float_exception_mask
37 #define float_rounding_mode     _softfloat_float_rounding_mode
38 #define float_raise             _softfloat_float_raise
39 
40 /* The following batch are called by GCC through wrappers */
41 #define float32_eq      _softfloat_float32_eq
42 #define float32_le      _softfloat_float32_le
43 #define float32_lt      _softfloat_float32_lt
44 #define float64_eq      _softfloat_float64_eq
45 #define float64_le      _softfloat_float64_le
46 #define float64_lt      _softfloat_float64_lt
47 #define float128_eq     _softfloat_float128_eq
48 #define float128_le     _softfloat_float128_le
49 #define float128_lt     _softfloat_float128_lt
50 
51 /*
52  * Macros to define functions with the GCC expected names
53  */
54 
55 #define float32_add         __addsf3
56 #define float64_add         __adddf3
57 #define floatx80_add        __addxf3
58 #define float128_add        __addtf3
59 
60 #define float32_sub         __subsf3
61 #define float64_sub         __subdf3
62 #define floatx80_sub        __subxf3
63 #define float128_sub        __subtf3
64 
65 #define float32_mul         __mulsf3
66 #define float64_mul         __muldf3
67 #define floatx80_mul        __mulxf3
68 #define float128_mul        __multf3
69 
70 #define float32_div         __divsf3
71 #define float64_div         __divdf3
72 #define floatx80_div        __divxf3
73 #define float128_div        __divtf3
74 
75 #if 0
76 #define float32_neg         __negsf2
77 #define float64_neg         __negdf2
78 #define floatx80_neg        __negxf2
79 #define float128_neg        __negtf2
80 #endif
81 
82 #define int32_to_float32        __floatsisf
83 #define int32_to_float64        __floatsidf
84 #define int32_to_floatx80       __floatsixf
85 #define int32_to_float128       __floatsitf
86 
87 #define int64_to_float32        __floatdisf
88 #define int64_to_float64        __floatdidf
89 #define int64_to_floatx80       __floatdixf
90 #define int64_to_float128       __floatditf
91 
92 #define int128_to_float32       __floattisf
93 #define int128_to_float64       __floattidf
94 #define int128_to_floatx80      __floattixf
95 #define int128_to_float128      __floattitf
96 
97 #define uint32_to_float32       __floatunsisf
98 #define uint32_to_float64       __floatunsidf
99 #define uint32_to_floatx80      __floatunsixf
100 #define uint32_to_float128      __floatunsitf
101 
102 #define uint64_to_float32       __floatundisf
103 #define uint64_to_float64       __floatundidf
104 #define uint64_to_floatx80      __floatundixf
105 #define uint64_to_float128      __floatunditf
106 
107 #define uint128_to_float32      __floatuntisf
108 #define uint128_to_float64      __floatuntidf
109 #define uint128_to_floatx80     __floatuntixf
110 #define uint128_to_float128     __floatuntitf
111 
112 #define float32_to_int32_round_to_zero   __fixsfsi
113 #define float64_to_int32_round_to_zero   __fixdfsi
114 #define floatx80_to_int32_round_to_zero  __fixxfsi
115 #define float128_to_int32_round_to_zero  __fixtfsi
116 
117 #define float32_to_int64_round_to_zero   __fixsfdi
118 #define float64_to_int64_round_to_zero   __fixdfdi
119 #define floatx80_to_int64_round_to_zero  __fixxfdi
120 #define float128_to_int64_round_to_zero  __fixtfdi
121 
122 #define float32_to_int128_round_to_zero  __fixsfti
123 #define float64_to_int128_round_to_zero  __fixdfti
124 #define floatx80_to_int128_round_to_zero __fixxfti
125 #define float128_to_int128_round_to_zero __fixtfti
126 
127 #define float32_to_uint32_round_to_zero     __fixunssfsi
128 #define float64_to_uint32_round_to_zero     __fixunsdfsi
129 #define floatx80_to_uint32_round_to_zero    __fixunsxfsi
130 #define float128_to_uint32_round_to_zero    __fixunstfsi
131 
132 #define float32_to_uint64_round_to_zero     __fixunssfdi
133 #define float64_to_uint64_round_to_zero     __fixunsdfdi
134 #define floatx80_to_uint64_round_to_zero    __fixunsxfdi
135 #define float128_to_uint64_round_to_zero    __fixunstfdi
136 
137 #define float32_to_uint128_round_to_zero    __fixunssfti
138 #define float64_to_uint128_round_to_zero    __fixunsdfti
139 #define floatx80_to_uint128_round_to_zero   __fixunsxfti
140 #define float128_to_uint128_round_to_zero   __fixunstfti
141 
142 #define float32_to_float64      __extendsfdf2
143 #define float32_to_floatx80     __extendsfxf2
144 #define float32_to_float128     __extendsftf2
145 #define float64_to_floatx80     __extenddfxf2
146 #define float64_to_float128     __extenddftf2
147 
148 #define float128_to_float64     __trunctfdf2
149 #define floatx80_to_float64     __truncxfdf2
150 #define float128_to_float32     __trunctfsf2
151 #define floatx80_to_float32     __truncxfsf2
152 #define float64_to_float32      __truncdfsf2
153 
154 #if 0
155 #define float32_cmp         __cmpsf2
156 #define float32_unord       __unordsf2
157 #define float32_eq          __eqsf2
158 #define float32_ne          __nesf2
159 #define float32_ge          __gesf2
160 #define float32_lt          __ltsf2
161 #define float32_le          __lesf2
162 #define float32_gt          __gtsf2
163 #endif
164 
165 #if 0
166 #define float64_cmp         __cmpdf2
167 #define float64_unord       __unorddf2
168 #define float64_eq          __eqdf2
169 #define float64_ne          __nedf2
170 #define float64_ge          __gedf2
171 #define float64_lt          __ltdf2
172 #define float64_le          __ledf2
173 #define float64_gt          __gtdf2
174 #endif
175 
176 /* XXX not in libgcc */
177 #if 1
178 #define floatx80_cmp        __cmpxf2
179 #define floatx80_unord      __unordxf2
180 #define floatx80_eq         __eqxf2
181 #define floatx80_ne         __nexf2
182 #define floatx80_ge         __gexf2
183 #define floatx80_lt         __ltxf2
184 #define floatx80_le         __lexf2
185 #define floatx80_gt         __gtxf2
186 #endif
187 
188 #if 0
189 #define float128_cmp        __cmptf2
190 #define float128_unord      __unordtf2
191 #define float128_eq         __eqtf2
192 #define float128_ne         __netf2
193 #define float128_ge         __getf2
194 #define float128_lt         __lttf2
195 #define float128_le         __letf2
196 #define float128_gt         __gttf2
197 #endif
198 
199 #ifdef __ARM_EABI__
200 #ifdef __ARM_PCS_VFP
201 #include <arm/aeabi.h>
202 #endif
203 #define __addsf3            __aeabi_fadd
204 #define __adddf3            __aeabi_dadd
205 
206 #define __subsf3            __aeabi_fsub
207 #define __subdf3            __aeabi_dsub
208 
209 #define __mulsf3            __aeabi_fmul
210 #define __muldf3            __aeabi_dmul
211 
212 #define __divsf3            __aeabi_fdiv
213 #define __divdf3            __aeabi_ddiv
214 
215 #define __floatsisf         __aeabi_i2f
216 #define __floatsidf         __aeabi_i2d
217 
218 #define __floatdisf         __aeabi_l2f
219 #define __floatdidf         __aeabi_l2d
220 
221 #define __floatunsisf       __aeabi_ui2f
222 #define __floatunsidf       __aeabi_ui2d
223 
224 #define __floatundisf       __aeabi_ul2f
225 #define __floatundidf       __aeabi_ul2d
226 
227 #define __fixsfsi           __aeabi_f2iz
228 #define __fixdfsi           __aeabi_d2iz
229 
230 #define __fixsfdi           __aeabi_f2lz
231 #define __fixdfdi           __aeabi_d2lz
232 
233 #define __fixunssfsi        __aeabi_f2uiz
234 #define __fixunsdfsi        __aeabi_d2uiz
235 
236 #define __fixunssfdi        __aeabi_f2ulz
237 #define __fixunsdfdi        __aeabi_d2ulz
238 
239 #define __extendsfdf2       __aeabi_f2d
240 #define __truncdfsf2        __aeabi_d2f
241 
242 #endif /* __ARM_EABI__ */
243