aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-06-13 00:25:33 +0000
committerRichard Stallman <rms@gnu.org>1993-06-13 00:25:33 +0000
commitb6a524cb2a2974dcde70069d1fb1841bbb0b9f79 (patch)
tree07b045f4534b77cb7e39ec22cfe721b715164ec6
parent543758c6c44ec668ca58a34016ef8905854fec72 (diff)
downloadgcc-b6a524cb2a2974dcde70069d1fb1841bbb0b9f79.zip
gcc-b6a524cb2a2974dcde70069d1fb1841bbb0b9f79.tar.gz
gcc-b6a524cb2a2974dcde70069d1fb1841bbb0b9f79.tar.bz2
(gen_lowpart_common): Use those macros if REAL_ARITHMETIC.
From-SVN: r4672
-rw-r--r--gcc/emit-rtl.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 2daddca..b63f0c8 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -594,13 +594,23 @@ gen_lowpart_common (mode, x)
&& GET_MODE_SIZE (mode) == UNITS_PER_WORD
&& GET_CODE (x) == CONST_INT
&& sizeof (float) * HOST_BITS_PER_CHAR == HOST_BITS_PER_WIDE_INT)
+#ifdef REAL_ARITHMETIC
+ {
+ REAL_VALUE_TYPE r;
+ HOST_WIDE_INT i;
+
+ i = INTVAL (x);
+ r = REAL_VALUE_FROM_TARGET_SINGLE (i);
+ return immed_real_const_1 (r, mode);
+ }
+#else
{
union {HOST_WIDE_INT i; float d; } u;
u.i = INTVAL (x);
return immed_real_const_1 (u.d, mode);
}
-
+#endif
else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
&& HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
|| flag_pretend_float)
@@ -610,6 +620,28 @@ gen_lowpart_common (mode, x)
&& GET_MODE (x) == VOIDmode
&& (sizeof (double) * HOST_BITS_PER_CHAR
== 2 * HOST_BITS_PER_WIDE_INT))
+#ifdef REAL_ARITHMETIC
+ {
+ REAL_VALUE_TYPE r;
+ HOST_WIDE_INT i[2];
+ HOST_WIDE_INT low, high;
+
+ if (GET_CODE (x) == CONST_INT)
+ low = INTVAL (x), high = low >> (HOST_BITS_PER_WIDE_INT -1);
+ else
+ low = CONST_DOUBLE_LOW (x), high = CONST_DOUBLE_HIGH (x);
+
+/* TARGET_DOUBLE takes the addressing order of the target machine. */
+#ifdef WORDS_BIG_ENDIAN
+ i[0] = high, i[1] = low;
+#else
+ i[0] = low, i[1] = high;
+#endif
+
+ r = REAL_VALUE_FROM_TARGET_DOUBLE (i);
+ return immed_real_const_1 (r, mode);
+ }
+#else
{
union {HOST_WIDE_INT i[2]; double d; } u;
HOST_WIDE_INT low, high;
@@ -627,7 +659,7 @@ gen_lowpart_common (mode, x)
return immed_real_const_1 (u.d, mode);
}
-
+#endif
/* Similarly, if this is converting a floating-point value into a
single-word integer. Only do this is the host and target parameters are
compatible. */