summaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>1994-11-16 21:10:09 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>1994-11-16 21:10:09 +0000
commit51356f864933f664f7dfbf6e25ddcd97b587441a (patch)
tree036743ae971e4dddc0469a67fd6d6272b0801af8 /gcc/final.c
parentd70e58b6facc61184689890af429c7f0def003e8 (diff)
downloadgcc-51356f864933f664f7dfbf6e25ddcd97b587441a.tar.gz
Check target endianness at run time, not compile time
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@8470 138bc75d-0d04-0410-961f-82ee72b054a4
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 61a90a95eff..b046d7853d3 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 */
}
}