From: Alexandre Oliva Date: Fri, 2 Feb 2001 11:02:05 +0000 (+0000) Subject: fp-bit.h (MAX_USI_INT, MAX_SI_INT): Don't assume unsigned is wide enough. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=483b9fd0fe4e0da56b15a09be666c2012169274d;p=gcc.git fp-bit.h (MAX_USI_INT, MAX_SI_INT): Don't assume unsigned is wide enough. * config/fp-bit.h (MAX_USI_INT, MAX_SI_INT): Don't assume unsigned is wide enough. (BITS_PER_SI): New. * config/fp-bit.c (_fpmul_parts): Don't assume 32-bits SI. (si_to_float): Likewise. (float_to_si, float_to_usi): Use BITS_PER_SI. From-SVN: r39407 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index acf5120e560..415c9ea023a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2001-02-02 Alexandre Oliva + + * config/fp-bit.h (MAX_USI_INT, MAX_SI_INT): Don't assume + unsigned is wide enough. + (BITS_PER_SI): New. + * config/fp-bit.c (_fpmul_parts): Don't assume 32-bits SI. + (si_to_float): Likewise. + (float_to_si, float_to_usi): Use BITS_PER_SI. + 2001-02-01 Jeffrey Oldham * dwarf2out.c: Added explanation of abbreviations. diff --git a/gcc/config/fp-bit.c b/gcc/config/fp-bit.c index eb4fc69022b..f94259eebcb 100644 --- a/gcc/config/fp-bit.c +++ b/gcc/config/fp-bit.c @@ -624,8 +624,8 @@ _fpmul_parts ( fp_number_type * a, return b; } - /* Calculate the mantissa by multiplying both 64bit numbers to get a - 128 bit number */ + /* Calculate the mantissa by multiplying both numbers to get a + twice-as-wide number. */ { #if defined(NO_DI_MODE) { @@ -654,22 +654,22 @@ _fpmul_parts ( fp_number_type * a, } } #elif defined(FLOAT) + /* Multiplying two USIs to get a UDI, we're safe. */ { - /* Multiplying two 32 bit numbers to get a 64 bit number on - a machine with DI, so we're safe */ - - DItype answer = (DItype)(a->fraction.ll) * (DItype)(b->fraction.ll); + UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll; - high = answer >> 32; + high = answer >> BITS_PER_SI; low = answer; } #else - /* Doing a 64*64 to 128 */ + /* fractype is DImode, but we need the result to be twice as wide. + Assuming a widening multiply from DImode to TImode is not + available, build one by hand. */ { - USItype nl = a->fraction.ll & 0xffffffff; - USItype nh = a->fraction.ll >> 32; - USItype ml = b->fraction.ll & 0xffffffff; - USItype mh = b->fraction.ll >>32; + USItype nl = a->fraction.ll; + USItype nh = a->fraction.ll >> BITS_PER_SI; + USItype ml = b->fraction.ll; + USItype mh = b->fraction.ll >> BITS_PER_SI; UDItype pp_ll = (UDItype) ml * nl; UDItype pp_hl = (UDItype) mh * nl; UDItype pp_lh = (UDItype) ml * nh; @@ -678,12 +678,12 @@ _fpmul_parts ( fp_number_type * a, UDItype res0 = 0; UDItype ps_hh__ = pp_hl + pp_lh; if (ps_hh__ < pp_hl) - res2 += 0x100000000LL; - pp_hl = (ps_hh__ << 32) & 0xffffffff00000000LL; + res2 += (UDItype)1 << BITS_PER_SI; + pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI; res0 = pp_ll + pp_hl; if (res0 < pp_ll) res2++; - res2 += ((ps_hh__ >> 32) & 0xffffffffL) + pp_hh; + res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh; high = res2; low = res0; } @@ -1151,9 +1151,9 @@ si_to_float (SItype arg_a) { /* Special case for minint, since there is no +ve integer representation for it */ - if (arg_a == (SItype) 0x80000000) + if (arg_a == (- MAX_SI_INT - 1)) { - return -2147483648.0; + return (FLO_type)(- MAX_SI_INT - 1); } in.fraction.ll = (-arg_a); } @@ -1223,7 +1223,7 @@ float_to_si (FLO_type arg_a) /* it is a number, but a small one */ if (a.normal_exp < 0) return 0; - if (a.normal_exp > 4 * BITS_PER_UNIT - 2) + if (a.normal_exp > BITS_PER_SI - 2) return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT; tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp); return a.sign ? (-tmp) : (tmp); @@ -1260,7 +1260,7 @@ float_to_usi (FLO_type arg_a) /* it is a number, but a small one */ if (a.normal_exp < 0) return 0; - if (a.normal_exp > 4 * BITS_PER_UNIT - 1) + if (a.normal_exp > BITS_PER_SI - 1) return MAX_USI_INT; else if (a.normal_exp > (FRACBITS + NGARDS)) return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS)); diff --git a/gcc/config/fp-bit.h b/gcc/config/fp-bit.h index 88d72db269d..f4471f9067a 100644 --- a/gcc/config/fp-bit.h +++ b/gcc/config/fp-bit.h @@ -103,9 +103,9 @@ typedef unsigned int UHItype __attribute__ ((mode (HI))); typedef unsigned int USItype __attribute__ ((mode (SI))); typedef unsigned int UDItype __attribute__ ((mode (DI))); -#define MAX_SI_INT ((SItype) ((unsigned) (~0)>>1)) -#define MAX_USI_INT ((USItype) ~0) - +#define MAX_USI_INT (~(USItype)0) +#define MAX_SI_INT ((SItype) (MAX_USI_INT >> 1)) +#define BITS_PER_SI (4 * BITS_PER_UNIT) #ifdef FLOAT_ONLY #define NO_DI_MODE