From: Jakub Jelinek Date: Mon, 21 Jun 1999 17:52:47 +0000 (+0200) Subject: Jakub Jelinek X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8fc4af0f11b77630079ff1e33a527d933aca1ee0;p=gcc.git Jakub Jelinek Jakub Jelinek * real.c (ereal_from_double): Fix for 64-bit big endian hosts. * emit-rtl.c (gen_lowpart_common): Add case for hosts where double fits in HOST_WIDE_INT and one uses union to access a long constant as double. From-SVN: r27675 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e6393b34fb7..2d76c2c73cb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +1999-06-21 Jakub Jelinek + + * real.c (ereal_from_double): Fix for 64-bit big endian hosts. + * emit-rtl.c (gen_lowpart_common): Add case for hosts where double + fits in HOST_WIDE_INT and one uses union to access a long constant + as double. + Mon Jun 21 17:18:25 1999 Richard Henderson * sparc.c (sparc_override_options): Don't allow profiling for diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index f1caea7d60d..0b310f2fa67 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -896,6 +896,22 @@ gen_lowpart_common (mode, x) r = REAL_VALUE_FROM_TARGET_SINGLE (i); return CONST_DOUBLE_FROM_REAL_VALUE (r, mode); } + else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT + && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) + || flag_pretend_float) + && GET_MODE_CLASS (mode) == MODE_FLOAT + && GET_MODE_SIZE (mode) == UNITS_PER_WORD + && GET_CODE (x) == CONST_INT + && (sizeof (double) * HOST_BITS_PER_CHAR + == HOST_BITS_PER_WIDE_INT)) + { + REAL_VALUE_TYPE r; + HOST_WIDE_INT i; + + i = INTVAL (x); + r = REAL_VALUE_FROM_TARGET_DOUBLE (&i); + return CONST_DOUBLE_FROM_REAL_VALUE (r, mode); + } #endif /* Similarly, if this is converting a floating-point value into a diff --git a/gcc/real.c b/gcc/real.c index e6a15fed515..2d615757af1 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -6400,17 +6400,19 @@ ereal_from_double (d) /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */ if (REAL_WORDS_BIG_ENDIAN) { +#if HOST_BITS_PER_WIDE_INT == 32 s[0] = (unsigned EMUSHORT) (d[0] >> 16); s[1] = (unsigned EMUSHORT) d[0]; -#if HOST_BITS_PER_WIDE_INT == 32 s[2] = (unsigned EMUSHORT) (d[1] >> 16); s[3] = (unsigned EMUSHORT) d[1]; #else /* In this case the entire target double is contained in the first array element. The second element of the input is ignored. */ - s[2] = (unsigned EMUSHORT) (d[0] >> 48); - s[3] = (unsigned EMUSHORT) (d[0] >> 32); + s[0] = (unsigned EMUSHORT) (d[0] >> 48); + s[1] = (unsigned EMUSHORT) (d[0] >> 32); + s[2] = (unsigned EMUSHORT) (d[0] >> 16); + s[3] = (unsigned EMUSHORT) d[0]; #endif } else