summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/egcs/gcc/regmove.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gnu/egcs/gcc/regmove.c b/gnu/egcs/gcc/regmove.c
index b580f8665bd..6f5e1c0894a 100644
--- a/gnu/egcs/gcc/regmove.c
+++ b/gnu/egcs/gcc/regmove.c
@@ -708,6 +708,14 @@ optimize_reg_copy_3 (insn, dest, src)
GET_MODE_BITSIZE (GET_MODE (src_reg))))
return;
+#ifdef BROKEN_OPTIMIZE_REG_COPY_3_P
+ /* If we are on a big-endian target, do not expand to more than one
+ register. */
+ if (BYTES_BIG_ENDIAN &&
+ GET_MODE_BITSIZE (GET_MODE (src)) > BITS_PER_WORD)
+ return;
+#endif
+
old_mode = GET_MODE (src_reg);
PUT_MODE (src_reg, GET_MODE (src));
XEXP (src, 0) = SET_SRC (set);
@@ -1127,14 +1135,12 @@ regmove_optimize (f, nregs, regmove_dump_file)
if (! set)
continue;
-#ifndef BROKEN_OPTIMIZE_REG_COPY_3_P
if (flag_expensive_optimizations && ! pass
&& (GET_CODE (SET_SRC (set)) == SIGN_EXTEND
|| GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
&& GET_CODE (XEXP (SET_SRC (set), 0)) == REG
&& GET_CODE (SET_DEST(set)) == REG)
optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
-#endif
if (flag_expensive_optimizations && ! pass
&& GET_CODE (SET_SRC (set)) == REG