diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 1994-11-16 21:10:09 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 1994-11-16 21:10:09 +0000 |
commit | 51356f864933f664f7dfbf6e25ddcd97b587441a (patch) | |
tree | 036743ae971e4dddc0469a67fd6d6272b0801af8 /gcc/final.c | |
parent | d70e58b6facc61184689890af429c7f0def003e8 (diff) | |
download | gcc-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.c | 79 |
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 */ } } |