fp-bit.h: Define macros for TFmode floating-point constants in IBM-extended TFmode types.
* fp-bit.h: Define macros for TFmode floating-point constants in IBM-extended TFmode types. (TMODES): Define if __LDBL_MANT_DIG__ has the newly-supported widths. * config/fp-bit.c (pack_d, unpack_d): Support IBM-extended TFmode type. From-SVN: r61837
This commit is contained in:
parent
ea976606be
commit
b44cf3d94b
3 changed files with 110 additions and 1 deletions
|
@ -1,5 +1,12 @@
|
|||
2003-01-26 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* fp-bit.h: Define macros for TFmode floating-point constants
|
||||
in IBM-extended TFmode types.
|
||||
(TMODES): Define if __LDBL_MANT_DIG__ has the newly-supported
|
||||
widths.
|
||||
* config/fp-bit.c (pack_d, unpack_d): Support IBM-extended
|
||||
TFmode type.
|
||||
|
||||
* config/fp-bit.h: Define macros for TFmode floating-point
|
||||
constants in IEEE quad TFmode type. Declare functions according
|
||||
to L_ macros.
|
||||
|
|
|
@ -324,9 +324,66 @@ pack_d ( fp_number_type * src)
|
|||
dst.bits.exp = exp;
|
||||
dst.bits.sign = sign;
|
||||
#else
|
||||
# if defined TFLOAT && defined HALFFRACBITS
|
||||
{
|
||||
halffractype high, low;
|
||||
|
||||
high = (fraction >> (FRACBITS - HALFFRACBITS));
|
||||
high &= (((fractype)1) << HALFFRACBITS) - 1;
|
||||
high |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << HALFFRACBITS;
|
||||
high |= ((fractype) (sign & 1)) << (HALFFRACBITS | EXPBITS);
|
||||
|
||||
low = (halffractype)fraction &
|
||||
((((halffractype)1) << (FRACBITS - HALFFRACBITS)) - 1);
|
||||
|
||||
if (exp == EXPMAX || exp == 0 || low == 0)
|
||||
low = 0;
|
||||
else
|
||||
{
|
||||
exp -= HALFFRACBITS + 1;
|
||||
|
||||
while (exp > 0
|
||||
&& low < ((halffractype)1 << HALFFRACBITS))
|
||||
{
|
||||
low <<= 1;
|
||||
exp--;
|
||||
}
|
||||
|
||||
if (exp <= 0)
|
||||
{
|
||||
halffractype roundmsb, round;
|
||||
|
||||
exp = -exp + 1;
|
||||
|
||||
roundmsb = (1 << (exp - 1));
|
||||
round = low & ((roundmsb << 1) - 1);
|
||||
|
||||
low >>= exp;
|
||||
exp = 0;
|
||||
|
||||
if (round > roundmsb || (round == roundmsb && (low & 1)))
|
||||
{
|
||||
low++;
|
||||
if (low >= ((halffractype)1 << HALFFRACBITS))
|
||||
/* We don't shift left, since it has just become the
|
||||
smallest normal number, whose implicit 1 bit is
|
||||
now indicated by the non-zero exponent. */
|
||||
exp++;
|
||||
}
|
||||
}
|
||||
|
||||
low &= ((halffractype)1 << HALFFRACBITS) - 1;
|
||||
low |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << HALFFRACBITS;
|
||||
low |= ((fractype) (sign & 1)) << (HALFFRACBITS | EXPBITS);
|
||||
}
|
||||
|
||||
dst.value_raw = (((fractype) high) << HALFSHIFT) | low;
|
||||
}
|
||||
# else
|
||||
dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
|
||||
dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
|
||||
dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
|
||||
|
@ -383,9 +440,42 @@ unpack_d (FLO_union_type * src, fp_number_type * dst)
|
|||
exp = src->bits.exp;
|
||||
sign = src->bits.sign;
|
||||
#else
|
||||
# if defined TFLOAT && defined HALFFRACBITS
|
||||
{
|
||||
halffractype high, low;
|
||||
|
||||
high = src->value_raw >> HALFSHIFT;
|
||||
low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
|
||||
|
||||
fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
|
||||
fraction <<= FRACBITS - HALFFRACBITS;
|
||||
exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
|
||||
sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
|
||||
|
||||
if (exp != EXPMAX && exp != 0 && low != 0)
|
||||
{
|
||||
int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
|
||||
int shift;
|
||||
fractype xlow;
|
||||
|
||||
xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
|
||||
if (lowexp)
|
||||
xlow |= (((halffractype)1) << HALFFRACBITS);
|
||||
else
|
||||
lowexp = 1;
|
||||
shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
|
||||
if (shift > 0)
|
||||
xlow <<= shift;
|
||||
else if (shift < 0)
|
||||
xlow >>= -shift;
|
||||
fraction += xlow;
|
||||
}
|
||||
}
|
||||
# else
|
||||
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
|
||||
#endif
|
||||
|
||||
dst->sign = sign;
|
||||
|
|
|
@ -87,7 +87,7 @@ Boston, MA 02111-1307, USA. */
|
|||
#endif
|
||||
#endif /* ! FINE_GRAINED_LIBRARIES */
|
||||
|
||||
#if __LDBL_MANT_DIG__ == 113
|
||||
#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
|
||||
# define TMODES
|
||||
#endif
|
||||
|
||||
|
@ -152,6 +152,18 @@ typedef unsigned int UTItype __attribute__ ((mode (TI)));
|
|||
# define FRACBITS 112
|
||||
# endif
|
||||
|
||||
# if __LDBL_MANT_DIG__ == 106 /* IBM extended (double+double) */
|
||||
# define EXPBITS 11
|
||||
# define EXPBIAS 1023
|
||||
# define EXPMAX (0x7ff)
|
||||
# define QUIET_NAN ((TItype)0x8 << (48 + 64))
|
||||
# define FRACHIGH ((TItype)0x8 << 124)
|
||||
# define FRACHIGH2 ((TItype)0xc << 124)
|
||||
# define FRACBITS 105
|
||||
# define HALFFRACBITS 52
|
||||
# define HALFSHIFT 64
|
||||
# endif
|
||||
|
||||
# define pack_d __pack_t
|
||||
# define unpack_d __unpack_t
|
||||
# define __fpcmp_parts __fpcmp_parts_t
|
||||
|
|
Loading…
Add table
Reference in a new issue