fp-bit.h: Define macros for TFmode floating-point constants in IEEE quad TFmode type.
* config/fp-bit.h: Define macros for TFmode floating-point constants in IEEE quad TFmode type. Declare functions according to L_ macros. (TMODES): Define if __LDBL_MANT_DIG__ is 113. (TFtype, TItype, UTItype): Define if TMODES is defined. (MAX_UDI_INT, MAX_DI_INT, BITS_PER_DI): Likewise. (F_T_BITOFF, D_T_BITOFF): Define. (IMPLICIT_1, IMPLICIT_2): Cast constants to types that are guaranteed to be wide enough. * config/fp-bit.c: Check for L_ macros for tf functions. (__thenan_tf): New. (nan): Adjust. (pack_d, unpack_d): Support IEEE 854 quad type. (_fpmul_parts): Support TFmode. Compute exponent adjustment from FRAC_NBITS, FRAC_BITS and NGARDS. (usi_to_float): Cast constants to be shifted to fractype instead of assuming long long is wide enough. (sf_to_tf, df_to_tf, __make_tp, tf_to_df, tf_to_sf): New. From-SVN: r61835
This commit is contained in:
parent
fd7fd61e8e
commit
ea976606be
@ -1,3 +1,24 @@
|
||||
2003-01-26 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* config/fp-bit.h: Define macros for TFmode floating-point
|
||||
constants in IEEE quad TFmode type. Declare functions according
|
||||
to L_ macros.
|
||||
(TMODES): Define if __LDBL_MANT_DIG__ is 113.
|
||||
(TFtype, TItype, UTItype): Define if TMODES is defined.
|
||||
(MAX_UDI_INT, MAX_DI_INT, BITS_PER_DI): Likewise.
|
||||
(F_T_BITOFF, D_T_BITOFF): Define.
|
||||
(IMPLICIT_1, IMPLICIT_2): Cast constants to types that are
|
||||
guaranteed to be wide enough.
|
||||
* config/fp-bit.c: Check for L_ macros for tf functions.
|
||||
(__thenan_tf): New.
|
||||
(nan): Adjust.
|
||||
(pack_d, unpack_d): Support IEEE 854 quad type.
|
||||
(_fpmul_parts): Support TFmode. Compute exponent adjustment
|
||||
from FRAC_NBITS, FRAC_BITS and NGARDS.
|
||||
(usi_to_float): Cast constants to be shifted to fractype
|
||||
instead of assuming long long is wide enough.
|
||||
(sf_to_tf, df_to_tf, __make_tp, tf_to_df, tf_to_sf): New.
|
||||
|
||||
2003-01-26 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* df.c: Remove prototype of unused function df_regno_rtl_debug.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* This is a software floating point library which can be used
|
||||
for targets without hardware floating point.
|
||||
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002
|
||||
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify it
|
||||
@ -132,6 +132,10 @@ void __lttf2 (void) { abort(); }
|
||||
const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
|
||||
#elif defined L_thenan_df
|
||||
const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
|
||||
#elif defined L_thenan_tf
|
||||
const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
|
||||
#elif defined TFLOAT
|
||||
extern const fp_number_type __thenan_tf;
|
||||
#elif defined FLOAT
|
||||
extern const fp_number_type __thenan_sf;
|
||||
#else
|
||||
@ -143,7 +147,9 @@ static fp_number_type *
|
||||
nan (void)
|
||||
{
|
||||
/* Discard the const qualifier... */
|
||||
#ifdef FLOAT
|
||||
#ifdef TFLOAT
|
||||
return (fp_number_type *) (& __thenan_tf);
|
||||
#elif defined FLOAT
|
||||
return (fp_number_type *) (& __thenan_sf);
|
||||
#else
|
||||
return (fp_number_type *) (& __thenan_df);
|
||||
@ -182,7 +188,7 @@ flip_sign ( fp_number_type * x)
|
||||
|
||||
extern FLO_type pack_d ( fp_number_type * );
|
||||
|
||||
#if defined(L_pack_df) || defined(L_pack_sf)
|
||||
#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
|
||||
FLO_type
|
||||
pack_d ( fp_number_type * src)
|
||||
{
|
||||
@ -324,18 +330,29 @@ pack_d ( fp_number_type * src)
|
||||
#endif
|
||||
|
||||
#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
|
||||
#ifdef TFLOAT
|
||||
{
|
||||
qrtrfractype tmp1 = dst.words[0];
|
||||
qrtrfractype tmp2 = dst.words[1];
|
||||
dst.words[0] = dst.words[3];
|
||||
dst.words[1] = dst.words[2];
|
||||
dst.words[2] = tmp2;
|
||||
dst.words[3] = tmp1;
|
||||
}
|
||||
#else
|
||||
{
|
||||
halffractype tmp = dst.words[0];
|
||||
dst.words[0] = dst.words[1];
|
||||
dst.words[1] = tmp;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return dst.value;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_unpack_df) || defined(L_unpack_sf)
|
||||
#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
|
||||
void
|
||||
unpack_d (FLO_union_type * src, fp_number_type * dst)
|
||||
{
|
||||
@ -349,8 +366,15 @@ unpack_d (FLO_union_type * src, fp_number_type * dst)
|
||||
#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
|
||||
FLO_union_type swapped;
|
||||
|
||||
#ifdef TFLOAT
|
||||
swapped.words[0] = src->words[3];
|
||||
swapped.words[1] = src->words[2];
|
||||
swapped.words[2] = src->words[1];
|
||||
swapped.words[3] = src->words[0];
|
||||
#else
|
||||
swapped.words[0] = src->words[1];
|
||||
swapped.words[1] = src->words[0];
|
||||
#endif
|
||||
src = &swapped;
|
||||
#endif
|
||||
|
||||
@ -359,7 +383,7 @@ unpack_d (FLO_union_type * src, fp_number_type * dst)
|
||||
exp = src->bits.exp;
|
||||
sign = src->bits.sign;
|
||||
#else
|
||||
fraction = src->value_raw & ((((fractype)1) << FRACBITS) - (fractype)1);
|
||||
fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
|
||||
exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
|
||||
sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
|
||||
#endif
|
||||
@ -429,7 +453,7 @@ unpack_d (FLO_union_type * src, fp_number_type * dst)
|
||||
}
|
||||
#endif /* L_unpack_df || L_unpack_sf */
|
||||
|
||||
#if defined(L_addsub_sf) || defined(L_addsub_df)
|
||||
#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
|
||||
static fp_number_type *
|
||||
_fpadd_parts (fp_number_type * a,
|
||||
fp_number_type * b,
|
||||
@ -613,7 +637,7 @@ sub (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_addsub_sf || L_addsub_df */
|
||||
|
||||
#if defined(L_mul_sf) || defined(L_mul_df)
|
||||
#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
|
||||
static inline __attribute__ ((__always_inline__)) fp_number_type *
|
||||
_fpmul_parts ( fp_number_type * a,
|
||||
fp_number_type * b,
|
||||
@ -662,7 +686,7 @@ _fpmul_parts ( fp_number_type * a,
|
||||
/* Calculate the mantissa by multiplying both numbers to get a
|
||||
twice-as-wide number. */
|
||||
{
|
||||
#if defined(NO_DI_MODE)
|
||||
#if defined(NO_DI_MODE) || defined(TFLOAT)
|
||||
{
|
||||
fractype x = a->fraction.ll;
|
||||
fractype ylow = b->fraction.ll;
|
||||
@ -725,13 +749,9 @@ _fpmul_parts ( fp_number_type * a,
|
||||
#endif
|
||||
}
|
||||
|
||||
tmp->normal_exp = a->normal_exp + b->normal_exp;
|
||||
tmp->normal_exp = a->normal_exp + b->normal_exp
|
||||
+ FRAC_NBITS - (FRACBITS + NGARDS);
|
||||
tmp->sign = a->sign != b->sign;
|
||||
#ifdef FLOAT
|
||||
tmp->normal_exp += 2; /* ??????????????? */
|
||||
#else
|
||||
tmp->normal_exp += 4; /* ??????????????? */
|
||||
#endif
|
||||
while (high >= IMPLICIT_2)
|
||||
{
|
||||
tmp->normal_exp++;
|
||||
@ -805,7 +825,7 @@ multiply (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_mul_sf || L_mul_df */
|
||||
|
||||
#if defined(L_div_sf) || defined(L_div_df)
|
||||
#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
|
||||
static inline __attribute__ ((__always_inline__)) fp_number_type *
|
||||
_fpdiv_parts (fp_number_type * a,
|
||||
fp_number_type * b)
|
||||
@ -915,7 +935,8 @@ divide (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_div_sf || L_div_df */
|
||||
|
||||
#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df)
|
||||
#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
|
||||
|| defined(L_fpcmp_parts_tf)
|
||||
/* according to the demo, fpcmp returns a comparison with 0... thus
|
||||
a<b -> -1
|
||||
a==b -> 0
|
||||
@ -1000,7 +1021,7 @@ __fpcmp_parts (fp_number_type * a, fp_number_type * b)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_compare_sf) || defined(L_compare_df)
|
||||
#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
|
||||
CMPtype
|
||||
compare (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1022,7 +1043,7 @@ compare (FLO_type arg_a, FLO_type arg_b)
|
||||
|
||||
/* These should be optimized for their specific tasks someday. */
|
||||
|
||||
#if defined(L_eq_sf) || defined(L_eq_df)
|
||||
#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
|
||||
CMPtype
|
||||
_eq_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1043,7 +1064,7 @@ _eq_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_eq_sf || L_eq_df */
|
||||
|
||||
#if defined(L_ne_sf) || defined(L_ne_df)
|
||||
#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
|
||||
CMPtype
|
||||
_ne_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1064,7 +1085,7 @@ _ne_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_ne_sf || L_ne_df */
|
||||
|
||||
#if defined(L_gt_sf) || defined(L_gt_df)
|
||||
#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
|
||||
CMPtype
|
||||
_gt_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1085,7 +1106,7 @@ _gt_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_gt_sf || L_gt_df */
|
||||
|
||||
#if defined(L_ge_sf) || defined(L_ge_df)
|
||||
#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
|
||||
CMPtype
|
||||
_ge_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1105,7 +1126,7 @@ _ge_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_ge_sf || L_ge_df */
|
||||
|
||||
#if defined(L_lt_sf) || defined(L_lt_df)
|
||||
#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
|
||||
CMPtype
|
||||
_lt_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1126,7 +1147,7 @@ _lt_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_lt_sf || L_lt_df */
|
||||
|
||||
#if defined(L_le_sf) || defined(L_le_df)
|
||||
#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
|
||||
CMPtype
|
||||
_le_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1149,7 +1170,7 @@ _le_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
|
||||
#endif /* ! US_SOFTWARE_GOFAST */
|
||||
|
||||
#if defined(L_unord_sf) || defined(L_unord_df)
|
||||
#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
|
||||
CMPtype
|
||||
_unord_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
{
|
||||
@ -1167,7 +1188,7 @@ _unord_f2 (FLO_type arg_a, FLO_type arg_b)
|
||||
}
|
||||
#endif /* L_unord_sf || L_unord_df */
|
||||
|
||||
#if defined(L_si_to_sf) || defined(L_si_to_df)
|
||||
#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
|
||||
FLO_type
|
||||
si_to_float (SItype arg_a)
|
||||
{
|
||||
@ -1195,7 +1216,7 @@ si_to_float (SItype arg_a)
|
||||
else
|
||||
in.fraction.ll = arg_a;
|
||||
|
||||
while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
|
||||
while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
|
||||
{
|
||||
in.fraction.ll <<= 1;
|
||||
in.normal_exp -= 1;
|
||||
@ -1205,7 +1226,7 @@ si_to_float (SItype arg_a)
|
||||
}
|
||||
#endif /* L_si_to_sf || L_si_to_df */
|
||||
|
||||
#if defined(L_usi_to_sf) || defined(L_usi_to_df)
|
||||
#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
|
||||
FLO_type
|
||||
usi_to_float (USItype arg_a)
|
||||
{
|
||||
@ -1222,12 +1243,12 @@ usi_to_float (USItype arg_a)
|
||||
in.normal_exp = FRACBITS + NGARDS;
|
||||
in.fraction.ll = arg_a;
|
||||
|
||||
while (in.fraction.ll > (1LL << (FRACBITS + NGARDS)))
|
||||
while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
|
||||
{
|
||||
in.fraction.ll >>= 1;
|
||||
in.normal_exp += 1;
|
||||
}
|
||||
while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
|
||||
while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
|
||||
{
|
||||
in.fraction.ll <<= 1;
|
||||
in.normal_exp -= 1;
|
||||
@ -1237,7 +1258,7 @@ usi_to_float (USItype arg_a)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_sf_to_si) || defined(L_df_to_si)
|
||||
#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
|
||||
SItype
|
||||
float_to_si (FLO_type arg_a)
|
||||
{
|
||||
@ -1265,8 +1286,8 @@ float_to_si (FLO_type arg_a)
|
||||
}
|
||||
#endif /* L_sf_to_si || L_df_to_si */
|
||||
|
||||
#if defined(L_sf_to_usi) || defined(L_df_to_usi)
|
||||
#ifdef US_SOFTWARE_GOFAST
|
||||
#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
|
||||
#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
|
||||
/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
|
||||
we also define them for GOFAST because the ones in libgcc2.c have the
|
||||
wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
|
||||
@ -1305,7 +1326,7 @@ float_to_usi (FLO_type arg_a)
|
||||
#endif /* US_SOFTWARE_GOFAST */
|
||||
#endif /* L_sf_to_usi || L_df_to_usi */
|
||||
|
||||
#if defined(L_negate_sf) || defined(L_negate_df)
|
||||
#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
|
||||
FLO_type
|
||||
negate (FLO_type arg_a)
|
||||
{
|
||||
@ -1361,6 +1382,21 @@ sf_to_df (SFtype arg_a)
|
||||
}
|
||||
#endif /* L_sf_to_df */
|
||||
|
||||
#if defined(L_sf_to_tf) && defined(TMODES)
|
||||
TFtype
|
||||
sf_to_tf (SFtype arg_a)
|
||||
{
|
||||
fp_number_type in;
|
||||
FLO_union_type au;
|
||||
|
||||
au.value = arg_a;
|
||||
unpack_d (&au, &in);
|
||||
|
||||
return __make_tp (in.class, in.sign, in.normal_exp,
|
||||
((UTItype) in.fraction.ll) << F_T_BITOFF);
|
||||
}
|
||||
#endif /* L_sf_to_df */
|
||||
|
||||
#endif /* ! FLOAT_ONLY */
|
||||
#endif /* FLOAT */
|
||||
|
||||
@ -1404,5 +1440,84 @@ df_to_sf (DFtype arg_a)
|
||||
}
|
||||
#endif /* L_df_to_sf */
|
||||
|
||||
#if defined(L_df_to_tf) && defined(TMODES) \
|
||||
&& !defined(FLOAT) && !defined(TFLOAT)
|
||||
TFtype
|
||||
df_to_tf (DFtype arg_a)
|
||||
{
|
||||
fp_number_type in;
|
||||
FLO_union_type au;
|
||||
|
||||
au.value = arg_a;
|
||||
unpack_d (&au, &in);
|
||||
|
||||
return __make_tp (in.class, in.sign, in.normal_exp,
|
||||
((UTItype) in.fraction.ll) << D_T_BITOFF);
|
||||
}
|
||||
#endif /* L_sf_to_df */
|
||||
|
||||
#ifdef TFLOAT
|
||||
#if defined(L_make_tf)
|
||||
TFtype
|
||||
__make_tp(fp_class_type class,
|
||||
unsigned int sign,
|
||||
int exp,
|
||||
UTItype frac)
|
||||
{
|
||||
fp_number_type in;
|
||||
|
||||
in.class = class;
|
||||
in.sign = sign;
|
||||
in.normal_exp = exp;
|
||||
in.fraction.ll = frac;
|
||||
return pack_d (&in);
|
||||
}
|
||||
#endif /* L_make_tf */
|
||||
|
||||
#if defined(L_tf_to_df)
|
||||
DFtype
|
||||
tf_to_df (TFtype arg_a)
|
||||
{
|
||||
fp_number_type in;
|
||||
UDItype sffrac;
|
||||
FLO_union_type au;
|
||||
|
||||
au.value = arg_a;
|
||||
unpack_d (&au, &in);
|
||||
|
||||
sffrac = in.fraction.ll >> D_T_BITOFF;
|
||||
|
||||
/* We set the lowest guard bit in SFFRAC if we discarded any non
|
||||
zero bits. */
|
||||
if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
|
||||
sffrac |= 1;
|
||||
|
||||
return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
|
||||
}
|
||||
#endif /* L_tf_to_df */
|
||||
|
||||
#if defined(L_tf_to_sf)
|
||||
SFtype
|
||||
tf_to_sf (TFtype arg_a)
|
||||
{
|
||||
fp_number_type in;
|
||||
USItype sffrac;
|
||||
FLO_union_type au;
|
||||
|
||||
au.value = arg_a;
|
||||
unpack_d (&au, &in);
|
||||
|
||||
sffrac = in.fraction.ll >> F_T_BITOFF;
|
||||
|
||||
/* We set the lowest guard bit in SFFRAC if we discarded any non
|
||||
zero bits. */
|
||||
if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
|
||||
sffrac |= 1;
|
||||
|
||||
return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
|
||||
}
|
||||
#endif /* L_tf_to_sf */
|
||||
#endif /* TFLOAT */
|
||||
|
||||
#endif /* ! FLOAT */
|
||||
#endif /* !EXTENDED_FLOAT_STUBS */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Header file for fp-bit.c. */
|
||||
/* Copyright (C) 2000
|
||||
/* Copyright (C) 2000, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
@ -87,12 +87,22 @@ Boston, MA 02111-1307, USA. */
|
||||
#endif
|
||||
#endif /* ! FINE_GRAINED_LIBRARIES */
|
||||
|
||||
#if __LDBL_MANT_DIG__ == 113
|
||||
# define TMODES
|
||||
#endif
|
||||
|
||||
typedef float SFtype __attribute__ ((mode (SF)));
|
||||
typedef float DFtype __attribute__ ((mode (DF)));
|
||||
#ifdef TMODES
|
||||
typedef float TFtype __attribute__ ((mode (TF)));
|
||||
#endif
|
||||
|
||||
typedef int HItype __attribute__ ((mode (HI)));
|
||||
typedef int SItype __attribute__ ((mode (SI)));
|
||||
typedef int DItype __attribute__ ((mode (DI)));
|
||||
#ifdef TMODES
|
||||
typedef int TItype __attribute__ ((mode (TI)));
|
||||
#endif
|
||||
|
||||
/* The type of the result of a fp compare */
|
||||
#ifndef CMPtype
|
||||
@ -102,16 +112,56 @@ typedef int DItype __attribute__ ((mode (DI)));
|
||||
typedef unsigned int UHItype __attribute__ ((mode (HI)));
|
||||
typedef unsigned int USItype __attribute__ ((mode (SI)));
|
||||
typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
#ifdef TMODES
|
||||
typedef unsigned int UTItype __attribute__ ((mode (TI)));
|
||||
#endif
|
||||
|
||||
#define MAX_USI_INT (~(USItype)0)
|
||||
#define MAX_SI_INT ((SItype) (MAX_USI_INT >> 1))
|
||||
#define BITS_PER_SI (4 * BITS_PER_UNIT)
|
||||
#ifdef TMODES
|
||||
#define MAX_UDI_INT (~(UDItype)0)
|
||||
#define MAX_DI_INT ((DItype) (MAX_UDI_INT >> 1))
|
||||
#define BITS_PER_DI (8 * BITS_PER_UNIT)
|
||||
#endif
|
||||
|
||||
#ifdef FLOAT_ONLY
|
||||
#define NO_DI_MODE
|
||||
#endif
|
||||
|
||||
#ifdef FLOAT
|
||||
#ifdef TFLOAT
|
||||
# ifndef TMODES
|
||||
# error "TFLOAT requires long double to have 113 bits of mantissa"
|
||||
# endif
|
||||
|
||||
# define PREFIXFPDP tp
|
||||
# define PREFIXSFDF tf
|
||||
# define NGARDS 10L /* Is this right? */
|
||||
# define GARDROUND 0x1ff
|
||||
# define GARDMASK 0x3ff
|
||||
# define GARDMSB 0x200
|
||||
# define FRAC_NBITS 128
|
||||
|
||||
# if __LDBL_MANT_DIG__ == 113 /* IEEE quad */
|
||||
# define EXPBITS 15
|
||||
# define EXPBIAS 16383
|
||||
# define EXPMAX (0x7fff)
|
||||
# define QUIET_NAN ((TItype)0x8 << 108)
|
||||
# define FRACHIGH ((TItype)0x8 << 124)
|
||||
# define FRACHIGH2 ((TItype)0xc << 124)
|
||||
# define FRACBITS 112
|
||||
# endif
|
||||
|
||||
# define pack_d __pack_t
|
||||
# define unpack_d __unpack_t
|
||||
# define __fpcmp_parts __fpcmp_parts_t
|
||||
typedef UTItype fractype;
|
||||
typedef UDItype halffractype;
|
||||
typedef USItype qrtrfractype;
|
||||
#define qrtrfractype qrtrfractype
|
||||
typedef TFtype FLO_type;
|
||||
typedef TItype intfrac;
|
||||
#elif defined FLOAT
|
||||
# define NGARDS 7L
|
||||
# define GARDROUND 0x3f
|
||||
# define GARDMASK 0x7f
|
||||
@ -157,7 +207,9 @@ typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
#endif /* FLOAT */
|
||||
|
||||
#ifdef US_SOFTWARE_GOFAST
|
||||
# ifdef FLOAT
|
||||
# ifdef TFLOAT
|
||||
# error "GOFAST TFmode not supported"
|
||||
# elif defined FLOAT
|
||||
# define add fpadd
|
||||
# define sub fpsub
|
||||
# define multiply fpmul
|
||||
@ -170,8 +222,8 @@ typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
# define float_to_usi fptoui
|
||||
# define negate __negsf2
|
||||
# define sf_to_df fptodp
|
||||
# define dptofp dptofp
|
||||
#else
|
||||
# define sf_to_tf __extendsftf2
|
||||
# else
|
||||
# define add dpadd
|
||||
# define sub dpsub
|
||||
# define multiply dpmul
|
||||
@ -184,9 +236,30 @@ typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
# define float_to_usi dptoul
|
||||
# define negate __negdf2
|
||||
# define df_to_sf dptofp
|
||||
# define df_to_tf __extenddftf2
|
||||
# endif /* FLOAT */
|
||||
#else
|
||||
# ifdef FLOAT
|
||||
# ifdef TFLOAT
|
||||
# define add __addtf3
|
||||
# define sub __subtf3
|
||||
# define multiply __multf3
|
||||
# define divide __divtf3
|
||||
# define compare __cmptf2
|
||||
# define _eq_f2 __eqtf2
|
||||
# define _ne_f2 __netf2
|
||||
# define _gt_f2 __gttf2
|
||||
# define _ge_f2 __getf2
|
||||
# define _lt_f2 __lttf2
|
||||
# define _le_f2 __letf2
|
||||
# define _unord_f2 __unordtf2
|
||||
# define usi_to_float __floatunsitf
|
||||
# define si_to_float __floatsitf
|
||||
# define float_to_si __fixtfsi
|
||||
# define float_to_usi __fixunstfsi
|
||||
# define negate __negtf2
|
||||
# define tf_to_sf __trunctfsf2
|
||||
# define tf_to_df __trunctfdf2
|
||||
# elif defined FLOAT
|
||||
# define add __addsf3
|
||||
# define sub __subsf3
|
||||
# define multiply __mulsf3
|
||||
@ -205,7 +278,8 @@ typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
# define float_to_usi __fixunssfsi
|
||||
# define negate __negsf2
|
||||
# define sf_to_df __extendsfdf2
|
||||
#else
|
||||
# define sf_to_tf __extendsftf2
|
||||
# else
|
||||
# define add __adddf3
|
||||
# define sub __subdf3
|
||||
# define multiply __muldf3
|
||||
@ -224,6 +298,7 @@ typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
# define float_to_usi __fixunsdfsi
|
||||
# define negate __negdf2
|
||||
# define df_to_sf __truncdfsf2
|
||||
# define df_to_tf __extenddftf2
|
||||
# endif /* FLOAT */
|
||||
#endif /* US_SOFTWARE_GOFAST */
|
||||
|
||||
@ -241,10 +316,15 @@ typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
*/
|
||||
#define F_D_BITOFF (52+8-(23+7))
|
||||
|
||||
#ifdef TMODES
|
||||
# define F_T_BITOFF (__LDBL_MANT_DIG__-1+10-(23+7))
|
||||
# define D_T_BITOFF (__LDBL_MANT_DIG__-1+10-(52+8))
|
||||
#endif
|
||||
|
||||
|
||||
#define NORMAL_EXPMIN (-(EXPBIAS)+1)
|
||||
#define IMPLICIT_1 (1LL<<(FRACBITS+NGARDS))
|
||||
#define IMPLICIT_2 (1LL<<(FRACBITS+1+NGARDS))
|
||||
#define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS))
|
||||
#define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS))
|
||||
|
||||
/* common types */
|
||||
|
||||
@ -282,7 +362,11 @@ typedef union
|
||||
fractype value_raw;
|
||||
|
||||
#ifndef FLOAT
|
||||
# ifdef qrtrfractype
|
||||
qrtrfractype qwords[4];
|
||||
# else
|
||||
halffractype words[2];
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef FLOAT_BIT_ORDER_MISMATCH
|
||||
@ -317,82 +401,82 @@ FLO_union_type;
|
||||
|
||||
/* Prototypes */
|
||||
|
||||
#if defined(L_pack_df) || defined(L_pack_sf)
|
||||
#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
|
||||
extern FLO_type pack_d (fp_number_type *);
|
||||
#endif
|
||||
|
||||
extern void unpack_d (FLO_union_type *, fp_number_type *);
|
||||
|
||||
#if defined(L_addsub_sf) || defined(L_addsub_df)
|
||||
#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
|
||||
extern FLO_type add (FLO_type, FLO_type);
|
||||
extern FLO_type sub (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_mul_sf) || defined(L_mul_df)
|
||||
#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
|
||||
extern FLO_type multiply (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_div_sf) || defined(L_div_df)
|
||||
#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
|
||||
extern FLO_type divide (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
extern int __fpcmp_parts (fp_number_type *, fp_number_type *);
|
||||
|
||||
#if defined(L_compare_sf) || defined(L_compare_df)
|
||||
#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf)
|
||||
extern CMPtype compare (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#ifndef US_SOFTWARE_GOFAST
|
||||
|
||||
#if defined(L_eq_sf) || defined(L_eq_df)
|
||||
#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
|
||||
extern CMPtype _eq_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_ne_sf) || defined(L_ne_df)
|
||||
#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
|
||||
extern CMPtype _ne_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_gt_sf) || defined(L_gt_df)
|
||||
#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
|
||||
extern CMPtype _gt_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_ge_sf) || defined(L_ge_df)
|
||||
#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
|
||||
extern CMPtype _ge_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_lt_sf) || defined(L_lt_df)
|
||||
#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
|
||||
extern CMPtype _lt_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_le_sf) || defined(L_le_df)
|
||||
#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
|
||||
extern CMPtype _le_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_unord_sf) || defined(L_unord_df)
|
||||
#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
|
||||
extern CMPtype _unord_f2 (FLO_type, FLO_type);
|
||||
#endif
|
||||
|
||||
#endif /* ! US_SOFTWARE_GOFAST */
|
||||
|
||||
#if defined(L_si_to_sf) || defined(L_si_to_df)
|
||||
#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
|
||||
extern FLO_type si_to_float (SItype);
|
||||
#endif
|
||||
|
||||
#if defined(L_sf_to_si) || defined(L_df_to_si)
|
||||
#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
|
||||
extern SItype float_to_si (FLO_type);
|
||||
#endif
|
||||
|
||||
#if defined(L_sf_to_usi) || defined(L_df_to_usi)
|
||||
#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
|
||||
#ifdef US_SOFTWARE_GOFAST
|
||||
extern USItype float_to_usi (FLO_type);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(L_usi_to_sf) || defined(L_usi_to_df)
|
||||
#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
|
||||
extern FLO_type usi_to_float (USItype);
|
||||
#endif
|
||||
|
||||
#if defined(L_negate_sf) || defined(L_negate_df)
|
||||
#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
|
||||
extern FLO_type negate (FLO_type);
|
||||
#endif
|
||||
|
||||
@ -405,6 +489,9 @@ extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
|
||||
#if defined(L_sf_to_df)
|
||||
extern DFtype sf_to_df (SFtype);
|
||||
#endif
|
||||
#if defined(L_sf_to_tf) && defined(TMODES)
|
||||
extern TFtype sf_to_tf (SFtype);
|
||||
#endif
|
||||
#endif /* ! FLOAT_ONLY */
|
||||
#endif /* FLOAT */
|
||||
|
||||
@ -416,6 +503,24 @@ extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
|
||||
#if defined(L_df_to_sf)
|
||||
extern SFtype df_to_sf (DFtype);
|
||||
#endif
|
||||
#if defined(L_df_to_tf) && defined(TMODES)
|
||||
extern TFtype df_to_tf (DFtype);
|
||||
#endif
|
||||
#endif /* ! FLOAT */
|
||||
|
||||
#ifdef TMODES
|
||||
extern TFtype __make_tp (fp_class_type, unsigned int, int, UTItype);
|
||||
#ifdef TFLOAT
|
||||
#if defined(L_tf_to_sf)
|
||||
extern SFtype tf_to_sf (TFtype);
|
||||
#endif
|
||||
#if defined(L_tf_to_df)
|
||||
extern DFtype tf_to_df (TFtype);
|
||||
#endif
|
||||
#if defined(L_di_to_tf)
|
||||
extern TFtype di_to_df (DItype);
|
||||
#endif
|
||||
#endif /* TFLOAT */
|
||||
#endif /* TMODES */
|
||||
|
||||
#endif /* ! GCC_FP_BIT_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user