xref: /minix3/lib/libc/arch/aarch64/softfloat/qp.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /* $NetBSD: qp.c,v 1.1 2014/08/10 05:47:37 matt Exp $ */
2*0a6a1f1dSLionel Sambuc 
3*0a6a1f1dSLionel Sambuc /*-
4*0a6a1f1dSLionel Sambuc  * Copyright (c) 2014 The NetBSD Foundation, Inc.
5*0a6a1f1dSLionel Sambuc  * All rights reserved.
6*0a6a1f1dSLionel Sambuc  *
7*0a6a1f1dSLionel Sambuc  * This code is derived from software contributed to The NetBSD Foundation
8*0a6a1f1dSLionel Sambuc  * by Matt Thomas of 3am Software Foundry.
9*0a6a1f1dSLionel Sambuc  *
10*0a6a1f1dSLionel Sambuc  * Redistribution and use in source and binary forms, with or without
11*0a6a1f1dSLionel Sambuc  * modification, are permitted provided that the following conditions
12*0a6a1f1dSLionel Sambuc  * are met:
13*0a6a1f1dSLionel Sambuc  * 1. Redistributions of source code must retain the above copyright
14*0a6a1f1dSLionel Sambuc  *    notice, this list of conditions and the following disclaimer.
15*0a6a1f1dSLionel Sambuc  * 2. Redistributions in binary form must reproduce the above copyright
16*0a6a1f1dSLionel Sambuc  *    notice, this list of conditions and the following disclaimer in the
17*0a6a1f1dSLionel Sambuc  *    documentation and/or other materials provided with the distribution.
18*0a6a1f1dSLionel Sambuc  *
19*0a6a1f1dSLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*0a6a1f1dSLionel Sambuc  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*0a6a1f1dSLionel Sambuc  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*0a6a1f1dSLionel Sambuc  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*0a6a1f1dSLionel Sambuc  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*0a6a1f1dSLionel Sambuc  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*0a6a1f1dSLionel Sambuc  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*0a6a1f1dSLionel Sambuc  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*0a6a1f1dSLionel Sambuc  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*0a6a1f1dSLionel Sambuc  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*0a6a1f1dSLionel Sambuc  * POSSIBILITY OF SUCH DAMAGE.
30*0a6a1f1dSLionel Sambuc  */
31*0a6a1f1dSLionel Sambuc #include <sys/cdefs.h>
32*0a6a1f1dSLionel Sambuc 
33*0a6a1f1dSLionel Sambuc #include "milieu.h"
34*0a6a1f1dSLionel Sambuc #include "softfloat.h"
35*0a6a1f1dSLionel Sambuc 
36*0a6a1f1dSLionel Sambuc /*
37*0a6a1f1dSLionel Sambuc  * This file provides wrappers for the softfloat functions.  We can't use
38*0a6a1f1dSLionel Sambuc  * invoke them directly since long double arguments are passed in FP/SIMD
39*0a6a1f1dSLionel Sambuc  * as well as being returned in them while float128 arguments are passed
40*0a6a1f1dSLionel Sambuc  * in normal registers.
41*0a6a1f1dSLionel Sambuc  */
42*0a6a1f1dSLionel Sambuc 
43*0a6a1f1dSLionel Sambuc long double __addtf3(long double, long double);
44*0a6a1f1dSLionel Sambuc long double __divtf3(long double, long double);
45*0a6a1f1dSLionel Sambuc long double __modtf3(long double, long double);
46*0a6a1f1dSLionel Sambuc long double __multf3(long double, long double);
47*0a6a1f1dSLionel Sambuc long double __negtf2(long double);
48*0a6a1f1dSLionel Sambuc long double __subtf3(long double, long double);
49*0a6a1f1dSLionel Sambuc 
50*0a6a1f1dSLionel Sambuc int __getf2(long double, long double);
51*0a6a1f1dSLionel Sambuc int __lttf2(long double, long double);
52*0a6a1f1dSLionel Sambuc int __gttf2(long double, long double);
53*0a6a1f1dSLionel Sambuc int __letf2(long double, long double);
54*0a6a1f1dSLionel Sambuc int __eqtf2(long double, long double);
55*0a6a1f1dSLionel Sambuc int __netf2(long double, long double);
56*0a6a1f1dSLionel Sambuc int __unordtf2(long double, long double);
57*0a6a1f1dSLionel Sambuc 
58*0a6a1f1dSLionel Sambuc double __trunctfdf2(long double);
59*0a6a1f1dSLionel Sambuc float __trunctfsf2(long double);
60*0a6a1f1dSLionel Sambuc 
61*0a6a1f1dSLionel Sambuc long double __extendsftf2(float);
62*0a6a1f1dSLionel Sambuc long double __extenddftf2(double);
63*0a6a1f1dSLionel Sambuc 
64*0a6a1f1dSLionel Sambuc long double __floatsitf(int32_t);
65*0a6a1f1dSLionel Sambuc long double __floatditf(int64_t);
66*0a6a1f1dSLionel Sambuc 
67*0a6a1f1dSLionel Sambuc long double __floatunsitf(uint32_t);
68*0a6a1f1dSLionel Sambuc long double __floatunditf(uint64_t);
69*0a6a1f1dSLionel Sambuc 
70*0a6a1f1dSLionel Sambuc int32_t __fixtfsi(long double);
71*0a6a1f1dSLionel Sambuc int64_t __fixtfdi(long double);
72*0a6a1f1dSLionel Sambuc 
73*0a6a1f1dSLionel Sambuc uint32_t __fixuntfsi(long double);
74*0a6a1f1dSLionel Sambuc uint64_t __fixuntfdi(long double);
75*0a6a1f1dSLionel Sambuc 
76*0a6a1f1dSLionel Sambuc #if 0
77*0a6a1f1dSLionel Sambuc long double __floattitf(int128_t);
78*0a6a1f1dSLionel Sambuc long double __floatuntitf(uint128_t);
79*0a6a1f1dSLionel Sambuc int128_t __fixtfti(long double);
80*0a6a1f1dSLionel Sambuc uint128_t __fixuntfti(long double);
81*0a6a1f1dSLionel Sambuc #endif
82*0a6a1f1dSLionel Sambuc 
83*0a6a1f1dSLionel Sambuc union sf_ieee_flt_u {
84*0a6a1f1dSLionel Sambuc 	float fltu_f;
85*0a6a1f1dSLionel Sambuc 	float32 fltu_f32;
86*0a6a1f1dSLionel Sambuc };
87*0a6a1f1dSLionel Sambuc 
88*0a6a1f1dSLionel Sambuc union sf_ieee_dbl_u {
89*0a6a1f1dSLionel Sambuc 	double dblu_d;
90*0a6a1f1dSLionel Sambuc 	float64 dblu_f64;
91*0a6a1f1dSLionel Sambuc };
92*0a6a1f1dSLionel Sambuc 
93*0a6a1f1dSLionel Sambuc union sf_ieee_ldbl_u {
94*0a6a1f1dSLionel Sambuc 	long double ldblu_ld;
95*0a6a1f1dSLionel Sambuc 	float128 ldblu_f128;
96*0a6a1f1dSLionel Sambuc };
97*0a6a1f1dSLionel Sambuc 
98*0a6a1f1dSLionel Sambuc long double
__addtf3(long double ld_a,long double ld_b)99*0a6a1f1dSLionel Sambuc __addtf3(long double ld_a, long double ld_b)
100*0a6a1f1dSLionel Sambuc {
101*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
102*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
103*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
104*0a6a1f1dSLionel Sambuc 	    .ldblu_f128 = float128_add(a.ldblu_f128, b.ldblu_f128)
105*0a6a1f1dSLionel Sambuc 	};
106*0a6a1f1dSLionel Sambuc 
107*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
108*0a6a1f1dSLionel Sambuc }
109*0a6a1f1dSLionel Sambuc 
110*0a6a1f1dSLionel Sambuc long double
__divtf3(long double ld_a,long double ld_b)111*0a6a1f1dSLionel Sambuc __divtf3(long double ld_a, long double ld_b)
112*0a6a1f1dSLionel Sambuc {
113*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
114*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
115*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
116*0a6a1f1dSLionel Sambuc 	    .ldblu_f128 = float128_div(a.ldblu_f128, b.ldblu_f128)
117*0a6a1f1dSLionel Sambuc 	};
118*0a6a1f1dSLionel Sambuc 
119*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
120*0a6a1f1dSLionel Sambuc }
121*0a6a1f1dSLionel Sambuc 
122*0a6a1f1dSLionel Sambuc long double
__multf3(long double ld_a,long double ld_b)123*0a6a1f1dSLionel Sambuc __multf3(long double ld_a, long double ld_b)
124*0a6a1f1dSLionel Sambuc {
125*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
126*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
127*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
128*0a6a1f1dSLionel Sambuc 	    .ldblu_f128 = float128_mul(a.ldblu_f128, b.ldblu_f128)
129*0a6a1f1dSLionel Sambuc 	};
130*0a6a1f1dSLionel Sambuc 
131*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
132*0a6a1f1dSLionel Sambuc }
133*0a6a1f1dSLionel Sambuc 
134*0a6a1f1dSLionel Sambuc long double
__negtf2(long double ld_a)135*0a6a1f1dSLionel Sambuc __negtf2(long double ld_a)
136*0a6a1f1dSLionel Sambuc {
137*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u zero = { .ldblu_ld = 0.0 };
138*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
139*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = {
140*0a6a1f1dSLionel Sambuc 	    .ldblu_f128 = float128_div(zero.ldblu_f128, a.ldblu_f128)
141*0a6a1f1dSLionel Sambuc 	};
142*0a6a1f1dSLionel Sambuc 
143*0a6a1f1dSLionel Sambuc 	return b.ldblu_ld;
144*0a6a1f1dSLionel Sambuc }
145*0a6a1f1dSLionel Sambuc 
146*0a6a1f1dSLionel Sambuc long double
__subtf3(long double ld_a,long double ld_b)147*0a6a1f1dSLionel Sambuc __subtf3(long double ld_a, long double ld_b)
148*0a6a1f1dSLionel Sambuc {
149*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
150*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
151*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
152*0a6a1f1dSLionel Sambuc 	    .ldblu_f128 = float128_sub(a.ldblu_f128, b.ldblu_f128)
153*0a6a1f1dSLionel Sambuc 	};
154*0a6a1f1dSLionel Sambuc 
155*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
156*0a6a1f1dSLionel Sambuc }
157*0a6a1f1dSLionel Sambuc 
158*0a6a1f1dSLionel Sambuc #if 0
159*0a6a1f1dSLionel Sambuc int
160*0a6a1f1dSLionel Sambuc __cmptf3(float128 *a, float128 *b)
161*0a6a1f1dSLionel Sambuc {
162*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
163*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
164*0a6a1f1dSLionel Sambuc 
165*0a6a1f1dSLionel Sambuc 	if (float128_eq(*a, *b))
166*0a6a1f1dSLionel Sambuc 		return 0;
167*0a6a1f1dSLionel Sambuc 
168*0a6a1f1dSLionel Sambuc 	if (float128_le(*a, *b))
169*0a6a1f1dSLionel Sambuc 		return 1;
170*0a6a1f1dSLionel Sambuc 
171*0a6a1f1dSLionel Sambuc 	return 2;
172*0a6a1f1dSLionel Sambuc }
173*0a6a1f1dSLionel Sambuc 
174*0a6a1f1dSLionel Sambuc 
175*0a6a1f1dSLionel Sambuc /*
176*0a6a1f1dSLionel Sambuc  * XXX
177*0a6a1f1dSLionel Sambuc  */
178*0a6a1f1dSLionel Sambuc int
179*0a6a1f1dSLionel Sambuc _Qp_cmpe(float128 *a, float128 *b)
180*0a6a1f1dSLionel Sambuc {
181*0a6a1f1dSLionel Sambuc 	return _Qp_cmp(a, b);
182*0a6a1f1dSLionel Sambuc }
183*0a6a1f1dSLionel Sambuc #endif
184*0a6a1f1dSLionel Sambuc 
185*0a6a1f1dSLionel Sambuc int
__eqtf2(long double ld_a,long double ld_b)186*0a6a1f1dSLionel Sambuc __eqtf2(long double ld_a, long double ld_b)
187*0a6a1f1dSLionel Sambuc {
188*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
189*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
190*0a6a1f1dSLionel Sambuc 
191*0a6a1f1dSLionel Sambuc 	return float128_eq(a.ldblu_f128, b.ldblu_f128);
192*0a6a1f1dSLionel Sambuc }
193*0a6a1f1dSLionel Sambuc 
194*0a6a1f1dSLionel Sambuc int
__getf2(long double ld_a,long double ld_b)195*0a6a1f1dSLionel Sambuc __getf2(long double ld_a, long double ld_b)
196*0a6a1f1dSLionel Sambuc {
197*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
198*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
199*0a6a1f1dSLionel Sambuc 
200*0a6a1f1dSLionel Sambuc 	return float128_le(b.ldblu_f128, a.ldblu_f128);
201*0a6a1f1dSLionel Sambuc }
202*0a6a1f1dSLionel Sambuc 
203*0a6a1f1dSLionel Sambuc int
__gttf2(long double ld_a,long double ld_b)204*0a6a1f1dSLionel Sambuc __gttf2(long double ld_a, long double ld_b)
205*0a6a1f1dSLionel Sambuc {
206*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
207*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
208*0a6a1f1dSLionel Sambuc 
209*0a6a1f1dSLionel Sambuc 	return float128_lt(b.ldblu_f128, a.ldblu_f128);
210*0a6a1f1dSLionel Sambuc }
211*0a6a1f1dSLionel Sambuc 
212*0a6a1f1dSLionel Sambuc int
__letf2(long double ld_a,long double ld_b)213*0a6a1f1dSLionel Sambuc __letf2(long double ld_a, long double ld_b)
214*0a6a1f1dSLionel Sambuc {
215*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
216*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
217*0a6a1f1dSLionel Sambuc 
218*0a6a1f1dSLionel Sambuc 	return float128_le(a.ldblu_f128, b.ldblu_f128);
219*0a6a1f1dSLionel Sambuc }
220*0a6a1f1dSLionel Sambuc 
221*0a6a1f1dSLionel Sambuc int
__lttf2(long double ld_a,long double ld_b)222*0a6a1f1dSLionel Sambuc __lttf2(long double ld_a, long double ld_b)
223*0a6a1f1dSLionel Sambuc {
224*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
225*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
226*0a6a1f1dSLionel Sambuc 
227*0a6a1f1dSLionel Sambuc 	return float128_lt(a.ldblu_f128, b.ldblu_f128);
228*0a6a1f1dSLionel Sambuc }
229*0a6a1f1dSLionel Sambuc 
230*0a6a1f1dSLionel Sambuc int
__netf2(long double ld_a,long double ld_b)231*0a6a1f1dSLionel Sambuc __netf2(long double ld_a, long double ld_b)
232*0a6a1f1dSLionel Sambuc {
233*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
234*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
235*0a6a1f1dSLionel Sambuc 
236*0a6a1f1dSLionel Sambuc 	return !float128_eq(a.ldblu_f128, b.ldblu_f128);
237*0a6a1f1dSLionel Sambuc }
238*0a6a1f1dSLionel Sambuc 
239*0a6a1f1dSLionel Sambuc float
__trunctfsf2(long double ld_a)240*0a6a1f1dSLionel Sambuc __trunctfsf2(long double ld_a)
241*0a6a1f1dSLionel Sambuc {
242*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
243*0a6a1f1dSLionel Sambuc 	const union sf_ieee_flt_u c = {
244*0a6a1f1dSLionel Sambuc 		.fltu_f32 = float128_to_float32(a.ldblu_f128),
245*0a6a1f1dSLionel Sambuc 	};
246*0a6a1f1dSLionel Sambuc 
247*0a6a1f1dSLionel Sambuc 	return c.fltu_f;
248*0a6a1f1dSLionel Sambuc }
249*0a6a1f1dSLionel Sambuc 
250*0a6a1f1dSLionel Sambuc double
__trunctfdf2(long double ld_a)251*0a6a1f1dSLionel Sambuc __trunctfdf2(long double ld_a)
252*0a6a1f1dSLionel Sambuc {
253*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
254*0a6a1f1dSLionel Sambuc 	const union sf_ieee_dbl_u c = {
255*0a6a1f1dSLionel Sambuc 		.dblu_f64 = float128_to_float64(a.ldblu_f128),
256*0a6a1f1dSLionel Sambuc 	};
257*0a6a1f1dSLionel Sambuc 
258*0a6a1f1dSLionel Sambuc 	return c.dblu_d;
259*0a6a1f1dSLionel Sambuc }
260*0a6a1f1dSLionel Sambuc 
261*0a6a1f1dSLionel Sambuc int32_t
__fixtfsi(long double ld_a)262*0a6a1f1dSLionel Sambuc __fixtfsi(long double ld_a)
263*0a6a1f1dSLionel Sambuc {
264*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
265*0a6a1f1dSLionel Sambuc 	return float128_to_int32_round_to_zero(a.ldblu_f128);
266*0a6a1f1dSLionel Sambuc }
267*0a6a1f1dSLionel Sambuc 
268*0a6a1f1dSLionel Sambuc int64_t
__fixtfdi(long double ld_a)269*0a6a1f1dSLionel Sambuc __fixtfdi(long double ld_a)
270*0a6a1f1dSLionel Sambuc {
271*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
272*0a6a1f1dSLionel Sambuc 
273*0a6a1f1dSLionel Sambuc 	return float128_to_int64_round_to_zero(a.ldblu_f128);
274*0a6a1f1dSLionel Sambuc }
275*0a6a1f1dSLionel Sambuc 
276*0a6a1f1dSLionel Sambuc #if 0
277*0a6a1f1dSLionel Sambuc uint32_t
278*0a6a1f1dSLionel Sambuc __fixuntfsi(long double ld_a)
279*0a6a1f1dSLionel Sambuc {
280*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
281*0a6a1f1dSLionel Sambuc 
282*0a6a1f1dSLionel Sambuc 	return float128_to_uint32_round_to_zero(a.ldblu_f128);
283*0a6a1f1dSLionel Sambuc }
284*0a6a1f1dSLionel Sambuc 
285*0a6a1f1dSLionel Sambuc uint64_t
286*0a6a1f1dSLionel Sambuc __fixuntfdi(long double ld_a)
287*0a6a1f1dSLionel Sambuc {
288*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
289*0a6a1f1dSLionel Sambuc 
290*0a6a1f1dSLionel Sambuc 	return float128_to_uint64_round_to_zero(a.ldblu_f128);
291*0a6a1f1dSLionel Sambuc }
292*0a6a1f1dSLionel Sambuc #endif
293*0a6a1f1dSLionel Sambuc 
294*0a6a1f1dSLionel Sambuc long double
__extendsftf2(float f_a)295*0a6a1f1dSLionel Sambuc __extendsftf2(float f_a)
296*0a6a1f1dSLionel Sambuc {
297*0a6a1f1dSLionel Sambuc 	const union sf_ieee_flt_u a = { .fltu_f = f_a };
298*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
299*0a6a1f1dSLionel Sambuc 		.ldblu_f128 = float32_to_float128(a.fltu_f32)
300*0a6a1f1dSLionel Sambuc 	};
301*0a6a1f1dSLionel Sambuc 
302*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
303*0a6a1f1dSLionel Sambuc }
304*0a6a1f1dSLionel Sambuc 
305*0a6a1f1dSLionel Sambuc long double
__extenddftf2(double d_a)306*0a6a1f1dSLionel Sambuc __extenddftf2(double d_a)
307*0a6a1f1dSLionel Sambuc {
308*0a6a1f1dSLionel Sambuc 	const union sf_ieee_dbl_u a = { .dblu_d = d_a };
309*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
310*0a6a1f1dSLionel Sambuc 		.ldblu_f128 = float64_to_float128(a.dblu_f64)
311*0a6a1f1dSLionel Sambuc 	};
312*0a6a1f1dSLionel Sambuc 
313*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
314*0a6a1f1dSLionel Sambuc }
315*0a6a1f1dSLionel Sambuc 
316*0a6a1f1dSLionel Sambuc long double
__floatunsitf(uint32_t a)317*0a6a1f1dSLionel Sambuc __floatunsitf(uint32_t a)
318*0a6a1f1dSLionel Sambuc {
319*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
320*0a6a1f1dSLionel Sambuc 		.ldblu_f128 = int64_to_float128(a)
321*0a6a1f1dSLionel Sambuc 	};
322*0a6a1f1dSLionel Sambuc 
323*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
324*0a6a1f1dSLionel Sambuc }
325*0a6a1f1dSLionel Sambuc 
326*0a6a1f1dSLionel Sambuc long double
__floatunditf(uint64_t a)327*0a6a1f1dSLionel Sambuc __floatunditf(uint64_t a)
328*0a6a1f1dSLionel Sambuc {
329*0a6a1f1dSLionel Sambuc 	union sf_ieee_ldbl_u c;
330*0a6a1f1dSLionel Sambuc 	const uint64_t msb64 = 1LL << 63;
331*0a6a1f1dSLionel Sambuc 
332*0a6a1f1dSLionel Sambuc 	if (a & msb64) {
333*0a6a1f1dSLionel Sambuc 		static const union sf_ieee_ldbl_u two63 = {
334*0a6a1f1dSLionel Sambuc 			.ldblu_ld = 0x1.0p63
335*0a6a1f1dSLionel Sambuc 		};
336*0a6a1f1dSLionel Sambuc 
337*0a6a1f1dSLionel Sambuc 		c.ldblu_f128 = int64_to_float128(a ^ msb64);
338*0a6a1f1dSLionel Sambuc 		c.ldblu_f128 = float128_add(c.ldblu_f128, two63.ldblu_f128);
339*0a6a1f1dSLionel Sambuc 	} else {
340*0a6a1f1dSLionel Sambuc 		c.ldblu_f128 = int64_to_float128(a);
341*0a6a1f1dSLionel Sambuc 	}
342*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
343*0a6a1f1dSLionel Sambuc }
344*0a6a1f1dSLionel Sambuc 
345*0a6a1f1dSLionel Sambuc long double
__floatsitf(int32_t a)346*0a6a1f1dSLionel Sambuc __floatsitf(int32_t a)
347*0a6a1f1dSLionel Sambuc {
348*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
349*0a6a1f1dSLionel Sambuc 		.ldblu_f128 = int64_to_float128(a)
350*0a6a1f1dSLionel Sambuc 	};
351*0a6a1f1dSLionel Sambuc 
352*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
353*0a6a1f1dSLionel Sambuc }
354*0a6a1f1dSLionel Sambuc 
355*0a6a1f1dSLionel Sambuc long double
__floatditf(int64_t a)356*0a6a1f1dSLionel Sambuc __floatditf(int64_t a)
357*0a6a1f1dSLionel Sambuc {
358*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u c = {
359*0a6a1f1dSLionel Sambuc 		.ldblu_f128 = int64_to_float128(a)
360*0a6a1f1dSLionel Sambuc 	};
361*0a6a1f1dSLionel Sambuc 
362*0a6a1f1dSLionel Sambuc 	return c.ldblu_ld;
363*0a6a1f1dSLionel Sambuc }
364*0a6a1f1dSLionel Sambuc 
365*0a6a1f1dSLionel Sambuc int
__unordtf2(long double ld_a,long double ld_b)366*0a6a1f1dSLionel Sambuc __unordtf2(long double ld_a, long double ld_b)
367*0a6a1f1dSLionel Sambuc {
368*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
369*0a6a1f1dSLionel Sambuc 	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
370*0a6a1f1dSLionel Sambuc 
371*0a6a1f1dSLionel Sambuc 	/*
372*0a6a1f1dSLionel Sambuc 	 * The comparison is unordered if either input is a NaN.
373*0a6a1f1dSLionel Sambuc 	 * Test for this by comparing each operand with itself.
374*0a6a1f1dSLionel Sambuc 	 * We must perform both comparisons to correctly check for
375*0a6a1f1dSLionel Sambuc 	 * signalling NaNs.
376*0a6a1f1dSLionel Sambuc 	 */
377*0a6a1f1dSLionel Sambuc 	return 1 ^ (float128_eq(a.ldblu_f128, a.ldblu_f128) & float128_eq(b.ldblu_f128, b.ldblu_f128));
378*0a6a1f1dSLionel Sambuc }
379