1169689Skan/* Software floating-point emulation.
2169689Skan   Definitions for IEEE Single Precision.
3169689Skan   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
4169689Skan   This file is part of the GNU C Library.
5169689Skan   Contributed by Richard Henderson (rth@cygnus.com),
6169689Skan		  Jakub Jelinek (jj@ultra.linux.cz),
7169689Skan		  David S. Miller (davem@redhat.com) and
8169689Skan		  Peter Maydell (pmaydell@chiark.greenend.org.uk).
9169689Skan
10169689Skan   The GNU C Library is free software; you can redistribute it and/or
11169689Skan   modify it under the terms of the GNU Lesser General Public
12169689Skan   License as published by the Free Software Foundation; either
13169689Skan   version 2.1 of the License, or (at your option) any later version.
14169689Skan
15169689Skan   In addition to the permissions in the GNU Lesser General Public
16169689Skan   License, the Free Software Foundation gives you unlimited
17169689Skan   permission to link the compiled version of this file into
18169689Skan   combinations with other programs, and to distribute those
19169689Skan   combinations without any restriction coming from the use of this
20169689Skan   file.  (The Lesser General Public License restrictions do apply in
21169689Skan   other respects; for example, they cover modification of the file,
22169689Skan   and distribution when not linked into a combine executable.)
23169689Skan
24169689Skan   The GNU C Library is distributed in the hope that it will be useful,
25169689Skan   but WITHOUT ANY WARRANTY; without even the implied warranty of
26169689Skan   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27169689Skan   Lesser General Public License for more details.
28169689Skan
29169689Skan   You should have received a copy of the GNU Lesser General Public
30169689Skan   License along with the GNU C Library; if not, write to the Free
31169689Skan   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
32169689Skan   MA 02110-1301, USA.  */
33169689Skan
34169689Skan#if _FP_W_TYPE_SIZE < 32
35169689Skan#error "Here's a nickel kid.  Go buy yourself a real computer."
36169689Skan#endif
37169689Skan
38169689Skan#define _FP_FRACTBITS_S		_FP_W_TYPE_SIZE
39169689Skan
40169689Skan#define _FP_FRACBITS_S		24
41169689Skan#define _FP_FRACXBITS_S		(_FP_FRACTBITS_S - _FP_FRACBITS_S)
42169689Skan#define _FP_WFRACBITS_S		(_FP_WORKBITS + _FP_FRACBITS_S)
43169689Skan#define _FP_WFRACXBITS_S	(_FP_FRACTBITS_S - _FP_WFRACBITS_S)
44169689Skan#define _FP_EXPBITS_S		8
45169689Skan#define _FP_EXPBIAS_S		127
46169689Skan#define _FP_EXPMAX_S		255
47169689Skan#define _FP_QNANBIT_S		((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2))
48169689Skan#define _FP_QNANBIT_SH_S	((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
49169689Skan#define _FP_IMPLBIT_S		((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1))
50169689Skan#define _FP_IMPLBIT_SH_S	((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
51169689Skan#define _FP_OVERFLOW_S		((_FP_W_TYPE)1 << (_FP_WFRACBITS_S))
52169689Skan
53169689Skan/* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
54169689Skan   chosen by the target machine.  */
55169689Skan
56169689Skantypedef float SFtype __attribute__((mode(SF)));
57169689Skan
58169689Skanunion _FP_UNION_S
59169689Skan{
60169689Skan  SFtype flt;
61169689Skan  struct {
62169689Skan#if __BYTE_ORDER == __BIG_ENDIAN
63169689Skan    unsigned sign : 1;
64169689Skan    unsigned exp  : _FP_EXPBITS_S;
65169689Skan    unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
66169689Skan#else
67169689Skan    unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
68169689Skan    unsigned exp  : _FP_EXPBITS_S;
69169689Skan    unsigned sign : 1;
70169689Skan#endif
71169689Skan  } bits __attribute__((packed));
72169689Skan};
73169689Skan
74169689Skan#define FP_DECL_S(X)		_FP_DECL(1,X)
75169689Skan#define FP_UNPACK_RAW_S(X,val)	_FP_UNPACK_RAW_1(S,X,val)
76169689Skan#define FP_UNPACK_RAW_SP(X,val)	_FP_UNPACK_RAW_1_P(S,X,val)
77169689Skan#define FP_PACK_RAW_S(val,X)	_FP_PACK_RAW_1(S,val,X)
78169689Skan#define FP_PACK_RAW_SP(val,X)		\
79169689Skan  do {					\
80169689Skan    if (!FP_INHIBIT_RESULTS)		\
81169689Skan      _FP_PACK_RAW_1_P(S,val,X);	\
82169689Skan  } while (0)
83169689Skan
84169689Skan#define FP_UNPACK_S(X,val)		\
85169689Skan  do {					\
86169689Skan    _FP_UNPACK_RAW_1(S,X,val);		\
87169689Skan    _FP_UNPACK_CANONICAL(S,1,X);	\
88169689Skan  } while (0)
89169689Skan
90169689Skan#define FP_UNPACK_SP(X,val)		\
91169689Skan  do {					\
92169689Skan    _FP_UNPACK_RAW_1_P(S,X,val);	\
93169689Skan    _FP_UNPACK_CANONICAL(S,1,X);	\
94169689Skan  } while (0)
95169689Skan
96169689Skan#define FP_UNPACK_SEMIRAW_S(X,val)	\
97169689Skan  do {					\
98169689Skan    _FP_UNPACK_RAW_1(S,X,val);		\
99169689Skan    _FP_UNPACK_SEMIRAW(S,1,X);		\
100169689Skan  } while (0)
101169689Skan
102169689Skan#define FP_UNPACK_SEMIRAW_SP(X,val)	\
103169689Skan  do {					\
104169689Skan    _FP_UNPACK_RAW_1_P(S,X,val);	\
105169689Skan    _FP_UNPACK_SEMIRAW(S,1,X);		\
106169689Skan  } while (0)
107169689Skan
108169689Skan#define FP_PACK_S(val,X)		\
109169689Skan  do {					\
110169689Skan    _FP_PACK_CANONICAL(S,1,X);		\
111169689Skan    _FP_PACK_RAW_1(S,val,X);		\
112169689Skan  } while (0)
113169689Skan
114169689Skan#define FP_PACK_SP(val,X)		\
115169689Skan  do {					\
116169689Skan    _FP_PACK_CANONICAL(S,1,X);		\
117169689Skan    if (!FP_INHIBIT_RESULTS)		\
118169689Skan      _FP_PACK_RAW_1_P(S,val,X);	\
119169689Skan  } while (0)
120169689Skan
121169689Skan#define FP_PACK_SEMIRAW_S(val,X)	\
122169689Skan  do {					\
123169689Skan    _FP_PACK_SEMIRAW(S,1,X);		\
124169689Skan    _FP_PACK_RAW_1(S,val,X);		\
125169689Skan  } while (0)
126169689Skan
127169689Skan#define FP_PACK_SEMIRAW_SP(val,X)	\
128169689Skan  do {					\
129169689Skan    _FP_PACK_SEMIRAW(S,1,X);		\
130169689Skan    if (!FP_INHIBIT_RESULTS)		\
131169689Skan      _FP_PACK_RAW_1_P(S,val,X);	\
132169689Skan  } while (0)
133169689Skan
134169689Skan#define FP_ISSIGNAN_S(X)		_FP_ISSIGNAN(S,1,X)
135169689Skan#define FP_NEG_S(R,X)			_FP_NEG(S,1,R,X)
136169689Skan#define FP_ADD_S(R,X,Y)			_FP_ADD(S,1,R,X,Y)
137169689Skan#define FP_SUB_S(R,X,Y)			_FP_SUB(S,1,R,X,Y)
138169689Skan#define FP_MUL_S(R,X,Y)			_FP_MUL(S,1,R,X,Y)
139169689Skan#define FP_DIV_S(R,X,Y)			_FP_DIV(S,1,R,X,Y)
140169689Skan#define FP_SQRT_S(R,X)			_FP_SQRT(S,1,R,X)
141169689Skan#define _FP_SQRT_MEAT_S(R,S,T,X,Q)	_FP_SQRT_MEAT_1(R,S,T,X,Q)
142169689Skan
143169689Skan#define FP_CMP_S(r,X,Y,un)	_FP_CMP(S,1,r,X,Y,un)
144169689Skan#define FP_CMP_EQ_S(r,X,Y)	_FP_CMP_EQ(S,1,r,X,Y)
145169689Skan#define FP_CMP_UNORD_S(r,X,Y)	_FP_CMP_UNORD(S,1,r,X,Y)
146169689Skan
147169689Skan#define FP_TO_INT_S(r,X,rsz,rsg)	_FP_TO_INT(S,1,r,X,rsz,rsg)
148169689Skan#define FP_FROM_INT_S(X,r,rs,rt)	_FP_FROM_INT(S,1,X,r,rs,rt)
149169689Skan
150169689Skan#define _FP_FRAC_HIGH_S(X)	_FP_FRAC_HIGH_1(X)
151169689Skan#define _FP_FRAC_HIGH_RAW_S(X)	_FP_FRAC_HIGH_1(X)
152