]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/fp-bit.h
tree-optimization/95495 - use SLP_TREE_REPRESENTATIVE in assertion
[thirdparty/gcc.git] / libgcc / fp-bit.h
CommitLineData
cb4b535d 1/* Header file for fp-bit.c. */
8d9254fc 2/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
cb4b535d 3
7ec022b2 4This file is part of GCC.
cb4b535d 5
9c3b204a
BE
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
748086b7 8Software Foundation; either version 3, or (at your option) any later
9c3b204a
BE
9version.
10
9c3b204a
BE
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.
cb4b535d 15
748086b7
JJ
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/>. */
cb4b535d 24
88657302
RH
25#ifndef GCC_FP_BIT_H
26#define GCC_FP_BIT_H
cb4b535d
KG
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
c894819c 34 If FINE_GRAINED_LIBRARIES is not defined, then compile every
cb4b535d
KG
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
dfaf3cdb
SC
65#define L_usi_to_sf
66#define L_usi_to_df
cb4b535d
KG
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
b44cf3d9 86#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
602ea4d3
JJ
87# if defined(TFLOAT) || defined(L_sf_to_tf) || defined(L_df_to_tf)
88# define TMODES
89# endif
ea976606
AO
90#endif
91
cb4b535d
KG
92typedef float SFtype __attribute__ ((mode (SF)));
93typedef float DFtype __attribute__ ((mode (DF)));
ea976606
AO
94#ifdef TMODES
95typedef float TFtype __attribute__ ((mode (TF)));
96#endif
cb4b535d
KG
97
98typedef int HItype __attribute__ ((mode (HI)));
99typedef int SItype __attribute__ ((mode (SI)));
100typedef int DItype __attribute__ ((mode (DI)));
ea976606
AO
101#ifdef TMODES
102typedef int TItype __attribute__ ((mode (TI)));
103#endif
cb4b535d 104
c18f0c26 105/* The type of the result of a floating point comparison. This must
7fecf2c7 106 match `__libgcc_cmp_return__' in GCC for the target. */
cb4b535d 107#ifndef CMPtype
7fecf2c7 108typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
cb4b535d
KG
109#endif
110
111typedef unsigned int UHItype __attribute__ ((mode (HI)));
112typedef unsigned int USItype __attribute__ ((mode (SI)));
113typedef unsigned int UDItype __attribute__ ((mode (DI)));
ea976606
AO
114#ifdef TMODES
115typedef unsigned int UTItype __attribute__ ((mode (TI)));
116#endif
cb4b535d 117
483b9fd0
AO
118#define MAX_USI_INT (~(USItype)0)
119#define MAX_SI_INT ((SItype) (MAX_USI_INT >> 1))
a153644f 120#define BITS_PER_SI (4 * __CHAR_BIT__)
ea976606
AO
121#ifdef TMODES
122#define MAX_UDI_INT (~(UDItype)0)
123#define MAX_DI_INT ((DItype) (MAX_UDI_INT >> 1))
a153644f 124#define BITS_PER_DI (8 * __CHAR_BIT__)
ea976606 125#endif
cb4b535d
KG
126
127#ifdef FLOAT_ONLY
128#define NO_DI_MODE
129#endif
130
569dc494
RO
131#if __BYTE_ORDER__ != __FLOAT_WORD_ORDER__
132#define FLOAT_WORD_ORDER_MISMATCH
133#endif
134
ea976606
AO
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
b44cf3d9
AO
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
ea976606
AO
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
cb4b535d
KG
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)
701e2f0a 188# define QUIET_NAN 0x400000L
cb4b535d
KG
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
bd9c1f8f
JM
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
cb4b535d 264#else
bd9c1f8f
JM
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 */
cb4b535d
KG
285
286#ifndef INLINE
287#define INLINE __inline__
288#endif
289
290/* Preserve the sticky-bit when shifting fractions to the right. */
e13dd54f 291#define LSHIFT(a, s) { a = (a >> s) | !!(a & (((fractype) 1 << s) - 1)); }
cb4b535d
KG
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.
e5123d08 296 (double::FRAC_BITS+double::NGARDS-(float::FRAC_BITS+float::NGARDS))
cb4b535d
KG
297 */
298#define F_D_BITOFF (52+8-(23+7))
299
ea976606
AO
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
cb4b535d
KG
305
306#define NORMAL_EXPMIN (-(EXPBIAS)+1)
ea976606
AO
307#define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS))
308#define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS))
cb4b535d
KG
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
ea976606
AO
346# ifdef qrtrfractype
347 qrtrfractype qwords[4];
348# else
cb4b535d 349 halffractype words[2];
ea976606 350# endif
cb4b535d
KG
351#endif
352
cb4b535d
KG
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
7a7d8fab 373/* Prototypes. */
cb4b535d 374
ea976606 375#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
7a7d8fab 376extern FLO_type pack_d (const fp_number_type *);
cb4b535d
KG
377#endif
378
379extern void unpack_d (FLO_union_type *, fp_number_type *);
380
ea976606 381#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
cb4b535d
KG
382extern FLO_type add (FLO_type, FLO_type);
383extern FLO_type sub (FLO_type, FLO_type);
384#endif
385
ea976606 386#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
cb4b535d
KG
387extern FLO_type multiply (FLO_type, FLO_type);
388#endif
389
ea976606 390#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
cb4b535d
KG
391extern FLO_type divide (FLO_type, FLO_type);
392#endif
393
394extern int __fpcmp_parts (fp_number_type *, fp_number_type *);
395
ea976606 396#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf)
cb4b535d
KG
397extern CMPtype compare (FLO_type, FLO_type);
398#endif
399
ea976606 400#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
cb4b535d
KG
401extern CMPtype _eq_f2 (FLO_type, FLO_type);
402#endif
403
ea976606 404#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
cb4b535d
KG
405extern CMPtype _ne_f2 (FLO_type, FLO_type);
406#endif
407
ea976606 408#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
cb4b535d
KG
409extern CMPtype _gt_f2 (FLO_type, FLO_type);
410#endif
411
ea976606 412#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
cb4b535d
KG
413extern CMPtype _ge_f2 (FLO_type, FLO_type);
414#endif
415
ea976606 416#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
cb4b535d
KG
417extern CMPtype _lt_f2 (FLO_type, FLO_type);
418#endif
419
ea976606 420#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
cb4b535d
KG
421extern CMPtype _le_f2 (FLO_type, FLO_type);
422#endif
423
ea976606 424#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
cb4b535d
KG
425extern CMPtype _unord_f2 (FLO_type, FLO_type);
426#endif
427
ea976606 428#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
cb4b535d
KG
429extern FLO_type si_to_float (SItype);
430#endif
431
ea976606 432#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
cb4b535d
KG
433extern SItype float_to_si (FLO_type);
434#endif
435
bd9c1f8f 436#if defined(L_tf_to_usi)
cb4b535d
KG
437extern USItype float_to_usi (FLO_type);
438#endif
cb4b535d 439
ea976606 440#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
fc608b03
KG
441extern FLO_type usi_to_float (USItype);
442#endif
443
ea976606 444#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
cb4b535d
KG
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
ea976606
AO
457#if defined(L_sf_to_tf) && defined(TMODES)
458extern TFtype sf_to_tf (SFtype);
459#endif
cb4b535d
KG
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
ea976606
AO
471#if defined(L_df_to_tf) && defined(TMODES)
472extern TFtype df_to_tf (DFtype);
473#endif
cb4b535d
KG
474#endif /* ! FLOAT */
475
ea976606 476#ifdef TMODES
266a9ef1 477extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
ea976606
AO
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
88657302 492#endif /* ! GCC_FP_BIT_H */