1*fdd524d4Smatt /* $NetBSD: gcc-softfloat.c,v 1.1 2016/07/14 01:59:18 matt Exp $ */
2*fdd524d4Smatt /*-
3*fdd524d4Smatt * Copyright (c) 2016 The NetBSD Foundation, Inc.
4*fdd524d4Smatt * All rights reserved.
5*fdd524d4Smatt *
6*fdd524d4Smatt * This code is derived from software contributed to The NetBSD Foundation
7*fdd524d4Smatt * by Matt Thomas of 3am Software Foundry.
8*fdd524d4Smatt *
9*fdd524d4Smatt * Redistribution and use in source and binary forms, with or without
10*fdd524d4Smatt * modification, are permitted provided that the following conditions
11*fdd524d4Smatt * are met:
12*fdd524d4Smatt * 1. Redistributions of source code must retain the above copyright
13*fdd524d4Smatt * notice, this list of conditions and the following disclaimer.
14*fdd524d4Smatt * 2. Redistributions in binary form must reproduce the above copyright
15*fdd524d4Smatt * notice, this list of conditions and the following disclaimer in the
16*fdd524d4Smatt * documentation and/or other materials provided with the distribution.
17*fdd524d4Smatt *
18*fdd524d4Smatt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19*fdd524d4Smatt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20*fdd524d4Smatt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21*fdd524d4Smatt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22*fdd524d4Smatt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*fdd524d4Smatt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*fdd524d4Smatt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*fdd524d4Smatt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*fdd524d4Smatt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*fdd524d4Smatt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*fdd524d4Smatt * POSSIBILITY OF SUCH DAMAGE.
29*fdd524d4Smatt */
30*fdd524d4Smatt
31*fdd524d4Smatt /*
32*fdd524d4Smatt * This contain the softfloat primitives used by GCC.
33*fdd524d4Smatt * It can be used to verify the functions invoked by tGCC to do softfloat.
34*fdd524d4Smatt * It can also be used to what FP instructions GCC generates to implement the
35*fdd524d4Smatt * various primitives. Your arch-dependent code should provide all of these
36*fdd524d4Smatt * that are easy to implement.
37*fdd524d4Smatt */
38*fdd524d4Smatt
39*fdd524d4Smatt long long
xfixdfdi(double a)40*fdd524d4Smatt xfixdfdi(double a)
41*fdd524d4Smatt {
42*fdd524d4Smatt return (long long)a;
43*fdd524d4Smatt }
44*fdd524d4Smatt
45*fdd524d4Smatt int
xfixdfsi(double a)46*fdd524d4Smatt xfixdfsi(double a)
47*fdd524d4Smatt {
48*fdd524d4Smatt return (int)a;
49*fdd524d4Smatt }
50*fdd524d4Smatt
51*fdd524d4Smatt unsigned long long
xfixunsdfdi(double a)52*fdd524d4Smatt xfixunsdfdi(double a)
53*fdd524d4Smatt {
54*fdd524d4Smatt return (unsigned long long)a;
55*fdd524d4Smatt }
56*fdd524d4Smatt
57*fdd524d4Smatt unsigned int
xfixunsdfsi(double a)58*fdd524d4Smatt xfixunsdfsi(double a)
59*fdd524d4Smatt {
60*fdd524d4Smatt return (unsigned int)a;
61*fdd524d4Smatt }
62*fdd524d4Smatt
63*fdd524d4Smatt double
xfloatundidf(unsigned long long a)64*fdd524d4Smatt xfloatundidf(unsigned long long a)
65*fdd524d4Smatt {
66*fdd524d4Smatt return (double) a;
67*fdd524d4Smatt }
68*fdd524d4Smatt
69*fdd524d4Smatt double
xfloatunsidf(unsigned int a)70*fdd524d4Smatt xfloatunsidf(unsigned int a)
71*fdd524d4Smatt {
72*fdd524d4Smatt return (double) a;
73*fdd524d4Smatt }
74*fdd524d4Smatt
75*fdd524d4Smatt double
xfloatdidf(long long a)76*fdd524d4Smatt xfloatdidf(long long a)
77*fdd524d4Smatt {
78*fdd524d4Smatt return (double) a;
79*fdd524d4Smatt }
80*fdd524d4Smatt
81*fdd524d4Smatt double
xfloatsidf(int a)82*fdd524d4Smatt xfloatsidf(int a)
83*fdd524d4Smatt {
84*fdd524d4Smatt return (double) a;
85*fdd524d4Smatt }
86*fdd524d4Smatt
87*fdd524d4Smatt double
xextendsfdf2(float a)88*fdd524d4Smatt xextendsfdf2(float a)
89*fdd524d4Smatt {
90*fdd524d4Smatt return (double) a;
91*fdd524d4Smatt }
92*fdd524d4Smatt
93*fdd524d4Smatt int
xeqdf2(double a,double b)94*fdd524d4Smatt xeqdf2(double a, double b)
95*fdd524d4Smatt {
96*fdd524d4Smatt return a == b;
97*fdd524d4Smatt }
98*fdd524d4Smatt
99*fdd524d4Smatt int
xnedf2(double a,double b)100*fdd524d4Smatt xnedf2(double a, double b)
101*fdd524d4Smatt {
102*fdd524d4Smatt return a != b;
103*fdd524d4Smatt }
104*fdd524d4Smatt
105*fdd524d4Smatt int
xledf2(double a,double b)106*fdd524d4Smatt xledf2(double a, double b)
107*fdd524d4Smatt {
108*fdd524d4Smatt return a <= b;
109*fdd524d4Smatt }
110*fdd524d4Smatt
111*fdd524d4Smatt int
xgtdf2(double a,double b)112*fdd524d4Smatt xgtdf2(double a, double b)
113*fdd524d4Smatt {
114*fdd524d4Smatt return a > b;
115*fdd524d4Smatt }
116*fdd524d4Smatt
117*fdd524d4Smatt int
xltdf2(double a,double b)118*fdd524d4Smatt xltdf2(double a, double b)
119*fdd524d4Smatt {
120*fdd524d4Smatt return a < b;
121*fdd524d4Smatt }
122*fdd524d4Smatt
123*fdd524d4Smatt int
xgedf2(double a,double b)124*fdd524d4Smatt xgedf2(double a, double b)
125*fdd524d4Smatt {
126*fdd524d4Smatt return a >= b;
127*fdd524d4Smatt }
128*fdd524d4Smatt
129*fdd524d4Smatt long long
xfixsfdi(float a)130*fdd524d4Smatt xfixsfdi(float a)
131*fdd524d4Smatt {
132*fdd524d4Smatt return (long long)a;
133*fdd524d4Smatt }
134*fdd524d4Smatt
135*fdd524d4Smatt int
xfixsfsi(float a)136*fdd524d4Smatt xfixsfsi(float a)
137*fdd524d4Smatt {
138*fdd524d4Smatt return (int)a;
139*fdd524d4Smatt }
140*fdd524d4Smatt
141*fdd524d4Smatt unsigned long long
xfixunssfdi(float a)142*fdd524d4Smatt xfixunssfdi(float a)
143*fdd524d4Smatt {
144*fdd524d4Smatt return (unsigned long long)a;
145*fdd524d4Smatt }
146*fdd524d4Smatt
147*fdd524d4Smatt unsigned int
xfixunssfsi(float a)148*fdd524d4Smatt xfixunssfsi(float a)
149*fdd524d4Smatt {
150*fdd524d4Smatt return (unsigned int)a;
151*fdd524d4Smatt }
152*fdd524d4Smatt
153*fdd524d4Smatt float
xfloatundisf(unsigned long long a)154*fdd524d4Smatt xfloatundisf(unsigned long long a)
155*fdd524d4Smatt {
156*fdd524d4Smatt return (float) a;
157*fdd524d4Smatt }
158*fdd524d4Smatt
159*fdd524d4Smatt float
xfloatunsisf(unsigned int a)160*fdd524d4Smatt xfloatunsisf(unsigned int a)
161*fdd524d4Smatt {
162*fdd524d4Smatt return (float) a;
163*fdd524d4Smatt }
164*fdd524d4Smatt
165*fdd524d4Smatt float
xfloatdisf(long long a)166*fdd524d4Smatt xfloatdisf(long long a)
167*fdd524d4Smatt {
168*fdd524d4Smatt return (float) a;
169*fdd524d4Smatt }
170*fdd524d4Smatt
171*fdd524d4Smatt float
xfloatsisf(int a)172*fdd524d4Smatt xfloatsisf(int a)
173*fdd524d4Smatt {
174*fdd524d4Smatt return (float) a;
175*fdd524d4Smatt }
176*fdd524d4Smatt
177*fdd524d4Smatt float
xtruncdfsf2(double a)178*fdd524d4Smatt xtruncdfsf2(double a)
179*fdd524d4Smatt {
180*fdd524d4Smatt return (float) a;
181*fdd524d4Smatt }
182*fdd524d4Smatt
183*fdd524d4Smatt int
xeqsf2(float a,float b)184*fdd524d4Smatt xeqsf2(float a, float b)
185*fdd524d4Smatt {
186*fdd524d4Smatt return a == b;
187*fdd524d4Smatt }
188*fdd524d4Smatt
189*fdd524d4Smatt int
xnesf2(float a,float b)190*fdd524d4Smatt xnesf2(float a, float b)
191*fdd524d4Smatt {
192*fdd524d4Smatt return a != b;
193*fdd524d4Smatt }
194*fdd524d4Smatt
195*fdd524d4Smatt int
xlesf2(float a,float b)196*fdd524d4Smatt xlesf2(float a, float b)
197*fdd524d4Smatt {
198*fdd524d4Smatt return a <= b;
199*fdd524d4Smatt }
200*fdd524d4Smatt
201*fdd524d4Smatt int
xgtsf2(float a,float b)202*fdd524d4Smatt xgtsf2(float a, float b)
203*fdd524d4Smatt {
204*fdd524d4Smatt return a > b;
205*fdd524d4Smatt }
206*fdd524d4Smatt
207*fdd524d4Smatt int
xltsf2(float a,float b)208*fdd524d4Smatt xltsf2(float a, float b)
209*fdd524d4Smatt {
210*fdd524d4Smatt return a < b;
211*fdd524d4Smatt }
212*fdd524d4Smatt
213*fdd524d4Smatt int
xgesf2(float a,float b)214*fdd524d4Smatt xgesf2(float a, float b)
215*fdd524d4Smatt {
216*fdd524d4Smatt return a >= b;
217*fdd524d4Smatt }
218