xref: /netbsd-src/lib/libc_fp/gcc-softfloat.c (revision fdd524d4ccd2bb0c6f67401e938dabf773eb0372)
1 /* $NetBSD: gcc-softfloat.c,v 1.1 2016/07/14 01:59:18 matt Exp $ */
2 /*-
3  * Copyright (c) 2016 The NetBSD Foundation, Inc.
4  * All rights reserved.
5  *
6  * This code is derived from software contributed to The NetBSD Foundation
7  * by Matt Thomas of 3am Software Foundry.
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  * This contain the softfloat primitives used by GCC.
33  * It can be used to verify the functions invoked by tGCC to do softfloat.
34  * It can also be used to what FP instructions GCC generates to implement the
35  * various primitives.  Your arch-dependent code should provide all of these
36  * that are easy to implement.
37  */
38 
39 long long
xfixdfdi(double a)40 xfixdfdi(double a)
41 {
42 	return (long long)a;
43 }
44 
45 int
xfixdfsi(double a)46 xfixdfsi(double a)
47 {
48 	return (int)a;
49 }
50 
51 unsigned long long
xfixunsdfdi(double a)52 xfixunsdfdi(double a)
53 {
54 	return (unsigned long long)a;
55 }
56 
57 unsigned int
xfixunsdfsi(double a)58 xfixunsdfsi(double a)
59 {
60 	return (unsigned int)a;
61 }
62 
63 double
xfloatundidf(unsigned long long a)64 xfloatundidf(unsigned long long a)
65 {
66 	return (double) a;
67 }
68 
69 double
xfloatunsidf(unsigned int a)70 xfloatunsidf(unsigned int a)
71 {
72 	return (double) a;
73 }
74 
75 double
xfloatdidf(long long a)76 xfloatdidf(long long a)
77 {
78 	return (double) a;
79 }
80 
81 double
xfloatsidf(int a)82 xfloatsidf(int a)
83 {
84 	return (double) a;
85 }
86 
87 double
xextendsfdf2(float a)88 xextendsfdf2(float a)
89 {
90 	return (double) a;
91 }
92 
93 int
xeqdf2(double a,double b)94 xeqdf2(double a, double b)
95 {
96 	return a == b;
97 }
98 
99 int
xnedf2(double a,double b)100 xnedf2(double a, double b)
101 {
102 	return a != b;
103 }
104 
105 int
xledf2(double a,double b)106 xledf2(double a, double b)
107 {
108 	return a <= b;
109 }
110 
111 int
xgtdf2(double a,double b)112 xgtdf2(double a, double b)
113 {
114 	return a > b;
115 }
116 
117 int
xltdf2(double a,double b)118 xltdf2(double a, double b)
119 {
120 	return a < b;
121 }
122 
123 int
xgedf2(double a,double b)124 xgedf2(double a, double b)
125 {
126 	return a >= b;
127 }
128 
129 long long
xfixsfdi(float a)130 xfixsfdi(float a)
131 {
132 	return (long long)a;
133 }
134 
135 int
xfixsfsi(float a)136 xfixsfsi(float a)
137 {
138 	return (int)a;
139 }
140 
141 unsigned long long
xfixunssfdi(float a)142 xfixunssfdi(float a)
143 {
144 	return (unsigned long long)a;
145 }
146 
147 unsigned int
xfixunssfsi(float a)148 xfixunssfsi(float a)
149 {
150 	return (unsigned int)a;
151 }
152 
153 float
xfloatundisf(unsigned long long a)154 xfloatundisf(unsigned long long a)
155 {
156 	return (float) a;
157 }
158 
159 float
xfloatunsisf(unsigned int a)160 xfloatunsisf(unsigned int a)
161 {
162 	return (float) a;
163 }
164 
165 float
xfloatdisf(long long a)166 xfloatdisf(long long a)
167 {
168 	return (float) a;
169 }
170 
171 float
xfloatsisf(int a)172 xfloatsisf(int a)
173 {
174 	return (float) a;
175 }
176 
177 float
xtruncdfsf2(double a)178 xtruncdfsf2(double a)
179 {
180 	return (float) a;
181 }
182 
183 int
xeqsf2(float a,float b)184 xeqsf2(float a, float b)
185 {
186 	return a == b;
187 }
188 
189 int
xnesf2(float a,float b)190 xnesf2(float a, float b)
191 {
192 	return a != b;
193 }
194 
195 int
xlesf2(float a,float b)196 xlesf2(float a, float b)
197 {
198 	return a <= b;
199 }
200 
201 int
xgtsf2(float a,float b)202 xgtsf2(float a, float b)
203 {
204 	return a > b;
205 }
206 
207 int
xltsf2(float a,float b)208 xltsf2(float a, float b)
209 {
210 	return a < b;
211 }
212 
213 int
xgesf2(float a,float b)214 xgesf2(float a, float b)
215 {
216 	return a >= b;
217 }
218