1/* Header file for fp-bit.c.  */
2/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23<http://www.gnu.org/licenses/>.  */
24
25#ifndef GCC_FP_BIT_H
26#define GCC_FP_BIT_H
27
28/* Defining FINE_GRAINED_LIBRARIES allows one to select which routines
29   from this file are compiled via additional -D options.
30
31   This avoids the need to pull in the entire fp emulation library
32   when only a small number of functions are needed.
33
34   If FINE_GRAINED_LIBRARIES is not defined, then compile every
35   suitable routine.  */
36#ifndef FINE_GRAINED_LIBRARIES
37#define L_pack_df
38#define L_unpack_df
39#define L_pack_sf
40#define L_unpack_sf
41#define L_addsub_sf
42#define L_addsub_df
43#define L_mul_sf
44#define L_mul_df
45#define L_div_sf
46#define L_div_df
47#define L_fpcmp_parts_sf
48#define L_fpcmp_parts_df
49#define L_compare_sf
50#define L_compare_df
51#define L_eq_sf
52#define L_eq_df
53#define L_ne_sf
54#define L_ne_df
55#define L_gt_sf
56#define L_gt_df
57#define L_ge_sf
58#define L_ge_df
59#define L_lt_sf
60#define L_lt_df
61#define L_le_sf
62#define L_le_df
63#define L_unord_sf
64#define L_unord_df
65#define L_usi_to_sf
66#define L_usi_to_df
67#define L_si_to_sf
68#define L_si_to_df
69#define L_sf_to_si
70#define L_df_to_si
71#define L_f_to_usi
72#define L_df_to_usi
73#define L_negate_sf
74#define L_negate_df
75#define L_make_sf
76#define L_make_df
77#define L_sf_to_df
78#define L_df_to_sf
79#ifdef FLOAT
80#define L_thenan_sf
81#else
82#define L_thenan_df
83#endif
84#endif /* ! FINE_GRAINED_LIBRARIES */
85
86#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
87# if defined(TFLOAT) || defined(L_sf_to_tf) || defined(L_df_to_tf)
88#  define TMODES
89# endif
90#endif
91
92typedef float SFtype __attribute__ ((mode (SF)));
93typedef float DFtype __attribute__ ((mode (DF)));
94#ifdef TMODES
95typedef float TFtype __attribute__ ((mode (TF)));
96#endif
97
98typedef int HItype __attribute__ ((mode (HI)));
99typedef int SItype __attribute__ ((mode (SI)));
100typedef int DItype __attribute__ ((mode (DI)));
101#ifdef TMODES
102typedef int TItype __attribute__ ((mode (TI)));
103#endif
104
105/* The type of the result of a floating point comparison.  This must
106   match `__libgcc_cmp_return__' in GCC for the target.  */
107#ifndef CMPtype
108typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
109#endif
110
111typedef unsigned int UHItype __attribute__ ((mode (HI)));
112typedef unsigned int USItype __attribute__ ((mode (SI)));
113typedef unsigned int UDItype __attribute__ ((mode (DI)));
114#ifdef TMODES
115typedef unsigned int UTItype __attribute__ ((mode (TI)));
116#endif
117
118#define MAX_USI_INT  (~(USItype)0)
119#define MAX_SI_INT   ((SItype) (MAX_USI_INT >> 1))
120#define BITS_PER_SI  (4 * __CHAR_BIT__)
121#ifdef TMODES
122#define MAX_UDI_INT  (~(UDItype)0)
123#define MAX_DI_INT   ((DItype) (MAX_UDI_INT >> 1))
124#define BITS_PER_DI  (8 * __CHAR_BIT__)
125#endif
126
127#ifdef FLOAT_ONLY
128#define NO_DI_MODE
129#endif
130
131#if __BYTE_ORDER__ != __FLOAT_WORD_ORDER__
132#define FLOAT_WORD_ORDER_MISMATCH
133#endif
134
135#ifdef TFLOAT
136# ifndef TMODES
137#  error "TFLOAT requires long double to have 113 bits of mantissa"
138# endif
139
140#	define PREFIXFPDP tp
141#	define PREFIXSFDF tf
142#	define NGARDS 10L /* Is this right? */
143#	define GARDROUND 0x1ff
144#	define GARDMASK  0x3ff
145#	define GARDMSB   0x200
146#	define FRAC_NBITS 128
147
148# if __LDBL_MANT_DIG__ == 113 /* IEEE quad */
149#	define EXPBITS 15
150#	define EXPBIAS 16383
151#	define EXPMAX (0x7fff)
152#	define QUIET_NAN ((TItype)0x8 << 108)
153#	define FRACHIGH  ((TItype)0x8 << 124)
154#	define FRACHIGH2 ((TItype)0xc << 124)
155#	define FRACBITS 112
156# endif
157
158# if __LDBL_MANT_DIG__ == 106 /* IBM extended (double+double) */
159#	define EXPBITS 11
160#	define EXPBIAS 1023
161#	define EXPMAX (0x7ff)
162#	define QUIET_NAN ((TItype)0x8 << (48 + 64))
163#	define FRACHIGH  ((TItype)0x8 << 124)
164#	define FRACHIGH2 ((TItype)0xc << 124)
165#	define FRACBITS 105
166#	define HALFFRACBITS 52
167#	define HALFSHIFT 64
168# endif
169
170#	define pack_d __pack_t
171#	define unpack_d __unpack_t
172#	define __fpcmp_parts __fpcmp_parts_t
173	typedef UTItype fractype;
174	typedef UDItype halffractype;
175	typedef USItype qrtrfractype;
176#define qrtrfractype qrtrfractype
177	typedef TFtype FLO_type;
178	typedef TItype intfrac;
179#elif defined FLOAT
180#	define NGARDS    7L
181#	define GARDROUND 0x3f
182#	define GARDMASK  0x7f
183#	define GARDMSB   0x40
184#	define EXPBITS 8
185#	define EXPBIAS 127
186#	define FRACBITS 23
187#	define EXPMAX (0xff)
188#	define QUIET_NAN 0x400000L
189#	define FRAC_NBITS 32
190#	define FRACHIGH  0x80000000L
191#	define FRACHIGH2 0xc0000000L
192#	define pack_d __pack_f
193#	define unpack_d __unpack_f
194#	define __fpcmp_parts __fpcmp_parts_f
195	typedef USItype fractype;
196	typedef UHItype halffractype;
197	typedef SFtype FLO_type;
198	typedef SItype intfrac;
199
200#else
201#	define PREFIXFPDP dp
202#	define PREFIXSFDF df
203#	define NGARDS 8L
204#	define GARDROUND 0x7f
205#	define GARDMASK  0xff
206#	define GARDMSB   0x80
207#	define EXPBITS 11
208#	define EXPBIAS 1023
209#	define FRACBITS 52
210#	define EXPMAX (0x7ff)
211#	define QUIET_NAN 0x8000000000000LL
212#	define FRAC_NBITS 64
213#	define FRACHIGH  0x8000000000000000LL
214#	define FRACHIGH2 0xc000000000000000LL
215#	define pack_d __pack_d
216#	define unpack_d __unpack_d
217#	define __fpcmp_parts __fpcmp_parts_d
218	typedef UDItype fractype;
219	typedef USItype halffractype;
220	typedef DFtype FLO_type;
221	typedef DItype intfrac;
222#endif /* FLOAT */
223
224#ifdef TFLOAT
225#	define add 		__addtf3
226#	define sub 		__subtf3
227#	define multiply 	__multf3
228#	define divide 		__divtf3
229#	define compare 		__cmptf2
230#	define _eq_f2 		__eqtf2
231#	define _ne_f2 		__netf2
232#	define _gt_f2 		__gttf2
233#	define _ge_f2 		__getf2
234#	define _lt_f2 		__lttf2
235#	define _le_f2 		__letf2
236#	define _unord_f2	__unordtf2
237#	define usi_to_float 	__floatunsitf
238#	define si_to_float 	__floatsitf
239#	define float_to_si 	__fixtfsi
240#	define float_to_usi 	__fixunstfsi
241#	define negate 		__negtf2
242#	define tf_to_sf		__trunctfsf2
243#	define tf_to_df		__trunctfdf2
244#elif defined FLOAT
245#	define add 		__addsf3
246#	define sub 		__subsf3
247#	define multiply 	__mulsf3
248#	define divide 		__divsf3
249#	define compare 		__cmpsf2
250#	define _eq_f2 		__eqsf2
251#	define _ne_f2 		__nesf2
252#	define _gt_f2 		__gtsf2
253#	define _ge_f2 		__gesf2
254#	define _lt_f2 		__ltsf2
255#	define _le_f2 		__lesf2
256#	define _unord_f2	__unordsf2
257#	define usi_to_float 	__floatunsisf
258#	define si_to_float 	__floatsisf
259#	define float_to_si 	__fixsfsi
260#	define float_to_usi 	__fixunssfsi
261#	define negate 		__negsf2
262#	define sf_to_df		__extendsfdf2
263#	define sf_to_tf		__extendsftf2
264#else
265#	define add 		__adddf3
266#	define sub 		__subdf3
267#	define multiply 	__muldf3
268#	define divide 		__divdf3
269#	define compare 		__cmpdf2
270#	define _eq_f2 		__eqdf2
271#	define _ne_f2 		__nedf2
272#	define _gt_f2 		__gtdf2
273#	define _ge_f2 		__gedf2
274#	define _lt_f2 		__ltdf2
275#	define _le_f2 		__ledf2
276#	define _unord_f2	__unorddf2
277#	define usi_to_float 	__floatunsidf
278#	define si_to_float 	__floatsidf
279#	define float_to_si 	__fixdfsi
280#	define float_to_usi 	__fixunsdfsi
281#	define negate 		__negdf2
282#	define df_to_sf		__truncdfsf2
283#	define df_to_tf		__extenddftf2
284#endif /* FLOAT */
285
286#ifndef INLINE
287#define INLINE __inline__
288#endif
289
290/* Preserve the sticky-bit when shifting fractions to the right.  */
291#define LSHIFT(a, s) { a = (a >> s) | !!(a & (((fractype) 1 << s) - 1)); }
292
293/* numeric parameters */
294/* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
295   of a float and of a double. Assumes there are only two float types.
296   (double::FRAC_BITS+double::NGARDS-(float::FRAC_BITS+float::NGARDS))
297 */
298#define F_D_BITOFF (52+8-(23+7))
299
300#ifdef TMODES
301# define F_T_BITOFF (__LDBL_MANT_DIG__-1+10-(23+7))
302# define D_T_BITOFF (__LDBL_MANT_DIG__-1+10-(52+8))
303#endif
304
305
306#define NORMAL_EXPMIN (-(EXPBIAS)+1)
307#define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS))
308#define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS))
309
310/* common types */
311
312typedef enum
313{
314  CLASS_SNAN,
315  CLASS_QNAN,
316  CLASS_ZERO,
317  CLASS_NUMBER,
318  CLASS_INFINITY
319} fp_class_type;
320
321typedef struct
322{
323#ifdef SMALL_MACHINE
324  char class;
325  unsigned char sign;
326  short normal_exp;
327#else
328  fp_class_type class;
329  unsigned int sign;
330  int normal_exp;
331#endif
332
333  union
334    {
335      fractype ll;
336      halffractype l[2];
337    } fraction;
338} fp_number_type;
339
340typedef union
341{
342  FLO_type value;
343  fractype value_raw;
344
345#ifndef FLOAT
346# ifdef qrtrfractype
347  qrtrfractype qwords[4];
348# else
349  halffractype words[2];
350# endif
351#endif
352
353#ifdef _DEBUG_BITFLOAT
354  struct
355    {
356      unsigned int sign:1 __attribute__ ((packed));
357      unsigned int exp:EXPBITS __attribute__ ((packed));
358      fractype fraction:FRACBITS __attribute__ ((packed));
359    }
360  bits_big_endian;
361
362  struct
363    {
364      fractype fraction:FRACBITS __attribute__ ((packed));
365      unsigned int exp:EXPBITS __attribute__ ((packed));
366      unsigned int sign:1 __attribute__ ((packed));
367    }
368  bits_little_endian;
369#endif
370}
371FLO_union_type;
372
373/* Prototypes.  */
374
375#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
376extern FLO_type pack_d (const fp_number_type *);
377#endif
378
379extern void unpack_d (FLO_union_type *, fp_number_type *);
380
381#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
382extern FLO_type add (FLO_type, FLO_type);
383extern FLO_type sub (FLO_type, FLO_type);
384#endif
385
386#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
387extern FLO_type multiply (FLO_type, FLO_type);
388#endif
389
390#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
391extern FLO_type divide (FLO_type, FLO_type);
392#endif
393
394extern int __fpcmp_parts (fp_number_type *, fp_number_type *);
395
396#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf)
397extern CMPtype compare (FLO_type, FLO_type);
398#endif
399
400#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
401extern CMPtype _eq_f2 (FLO_type, FLO_type);
402#endif
403
404#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
405extern CMPtype _ne_f2 (FLO_type, FLO_type);
406#endif
407
408#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
409extern CMPtype _gt_f2 (FLO_type, FLO_type);
410#endif
411
412#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
413extern CMPtype _ge_f2 (FLO_type, FLO_type);
414#endif
415
416#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
417extern CMPtype _lt_f2 (FLO_type, FLO_type);
418#endif
419
420#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
421extern CMPtype _le_f2 (FLO_type, FLO_type);
422#endif
423
424#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
425extern CMPtype _unord_f2 (FLO_type, FLO_type);
426#endif
427
428#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
429extern FLO_type si_to_float (SItype);
430#endif
431
432#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
433extern SItype float_to_si (FLO_type);
434#endif
435
436#if defined(L_tf_to_usi)
437extern USItype float_to_usi (FLO_type);
438#endif
439
440#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
441extern FLO_type usi_to_float (USItype);
442#endif
443
444#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
445extern FLO_type negate (FLO_type);
446#endif
447
448#ifdef FLOAT
449#if defined(L_make_sf)
450extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
451#endif
452#ifndef FLOAT_ONLY
453extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
454#if defined(L_sf_to_df)
455extern DFtype sf_to_df (SFtype);
456#endif
457#if defined(L_sf_to_tf) && defined(TMODES)
458extern TFtype sf_to_tf (SFtype);
459#endif
460#endif /* ! FLOAT_ONLY */
461#endif /* FLOAT */
462
463#ifndef FLOAT
464extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
465#if defined(L_make_df)
466extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
467#endif
468#if defined(L_df_to_sf)
469extern SFtype df_to_sf (DFtype);
470#endif
471#if defined(L_df_to_tf) && defined(TMODES)
472extern TFtype df_to_tf (DFtype);
473#endif
474#endif /* ! FLOAT */
475
476#ifdef TMODES
477extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
478extern TFtype __make_tp (fp_class_type, unsigned int, int, UTItype);
479#ifdef TFLOAT
480#if defined(L_tf_to_sf)
481extern SFtype tf_to_sf (TFtype);
482#endif
483#if defined(L_tf_to_df)
484extern DFtype tf_to_df (TFtype);
485#endif
486#if defined(L_di_to_tf)
487extern TFtype di_to_df (DItype);
488#endif
489#endif /* TFLOAT */
490#endif /* TMODES */
491
492#endif /* ! GCC_FP_BIT_H */
493