aboutsummaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>1994-11-16 21:10:09 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>1994-11-16 21:10:09 +0000
commitf76b9db2874507ed287d1fe39ca2b1e89ae95207 (patch)
tree036743ae971e4dddc0469a67fd6d6272b0801af8 /gcc/final.c
parent1942e820686abbdd62515895e219476c26429945 (diff)
downloadgcc-f76b9db2874507ed287d1fe39ca2b1e89ae95207.zip
gcc-f76b9db2874507ed287d1fe39ca2b1e89ae95207.tar.gz
gcc-f76b9db2874507ed287d1fe39ca2b1e89ae95207.tar.bz2
Check target endianness at run time, not compile time
From-SVN: r8470
Diffstat (limited to 'gcc/final.c')
-rw-r--r--gcc/final.c79
1 files changed, 48 insertions, 31 deletions
diff --git a/gcc/final.c b/gcc/final.c
index 61a90a9..b046d78 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -2077,10 +2077,9 @@ alter_subreg (x)
else if (GET_CODE (y) == MEM)
{
register int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
-#if BYTES_BIG_ENDIAN
- offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))
- - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (y))));
-#endif
+ if (BYTES_BIG_ENDIAN)
+ offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))
+ - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (y))));
PUT_CODE (x, MEM);
MEM_VOLATILE_P (x) = MEM_VOLATILE_P (y);
XEXP (x, 0) = plus_constant (XEXP (y, 0), offset);
@@ -2839,23 +2838,29 @@ split_double (value, first, second)
is that we regard the value as signed.
So sign-extend it. */
rtx high = (INTVAL (value) < 0 ? constm1_rtx : const0_rtx);
-#if WORDS_BIG_ENDIAN
- *first = high;
- *second = value;
-#else
- *first = value;
- *second = high;
-#endif
+ if (WORDS_BIG_ENDIAN)
+ {
+ *first = high;
+ *second = value;
+ }
+ else
+ {
+ *first = value;
+ *second = high;
+ }
}
else if (GET_CODE (value) != CONST_DOUBLE)
{
-#if WORDS_BIG_ENDIAN
- *first = const0_rtx;
- *second = value;
-#else
- *first = value;
- *second = const0_rtx;
-#endif
+ if (WORDS_BIG_ENDIAN)
+ {
+ *first = const0_rtx;
+ *second = value;
+ }
+ else
+ {
+ *first = value;
+ *second = const0_rtx;
+ }
}
else if (GET_MODE (value) == VOIDmode
/* This is the old way we did CONST_DOUBLE integers. */
@@ -2863,13 +2868,16 @@ split_double (value, first, second)
{
/* In an integer, the words are defined as most and least significant.
So order them by the target's convention. */
-#if WORDS_BIG_ENDIAN
- *first = GEN_INT (CONST_DOUBLE_HIGH (value));
- *second = GEN_INT (CONST_DOUBLE_LOW (value));
-#else
- *first = GEN_INT (CONST_DOUBLE_LOW (value));
- *second = GEN_INT (CONST_DOUBLE_HIGH (value));
-#endif
+ if (WORDS_BIG_ENDIAN)
+ {
+ *first = GEN_INT (CONST_DOUBLE_HIGH (value));
+ *second = GEN_INT (CONST_DOUBLE_LOW (value));
+ }
+ else
+ {
+ *first = GEN_INT (CONST_DOUBLE_LOW (value));
+ *second = GEN_INT (CONST_DOUBLE_HIGH (value));
+ }
}
else
{
@@ -2891,14 +2899,23 @@ split_double (value, first, second)
&& ! flag_pretend_float)
abort ();
-#if defined (HOST_WORDS_BIG_ENDIAN) == WORDS_BIG_ENDIAN
- /* Host and target agree => no need to swap. */
- *first = GEN_INT (CONST_DOUBLE_LOW (value));
- *second = GEN_INT (CONST_DOUBLE_HIGH (value));
+ if (
+#ifdef HOST_WORDS_BIG_ENDIAN
+ WORDS_BIG_ENDIAN
#else
- *second = GEN_INT (CONST_DOUBLE_LOW (value));
- *first = GEN_INT (CONST_DOUBLE_HIGH (value));
+ ! WORDS_BIG_ENDIAN
#endif
+ )
+ {
+ /* Host and target agree => no need to swap. */
+ *first = GEN_INT (CONST_DOUBLE_LOW (value));
+ *second = GEN_INT (CONST_DOUBLE_HIGH (value));
+ }
+ else
+ {
+ *second = GEN_INT (CONST_DOUBLE_LOW (value));
+ *first = GEN_INT (CONST_DOUBLE_HIGH (value));
+ }
#endif /* no REAL_ARITHMETIC */
}
}