diff options
author | Ben Elliston <bje@au.ibm.com> | 2006-01-17 23:43:27 +0000 |
---|---|---|
committer | Ben Elliston <bje@gcc.gnu.org> | 2006-01-18 10:43:27 +1100 |
commit | ef7befe0d055b477863ac067e332d2e0333d3913 (patch) | |
tree | cddc3a305014cd329dadb015ef160bba34772209 /gcc/expr.c | |
parent | 96c6b0e22a1fbb1a3a8983b5765df57311cea3b6 (diff) | |
download | gcc-ef7befe0d055b477863ac067e332d2e0333d3913.zip gcc-ef7befe0d055b477863ac067e332d2e0333d3913.tar.gz gcc-ef7befe0d055b477863ac067e332d2e0333d3913.tar.bz2 |
expr.c (emit_move_change_mode): Always adjust addresses, not just during reload.
* expr.c (emit_move_change_mode): Always adjust addresses, not
just during reload. Copy replacements only during reload.
(emit_move_insn_1): Move MODE_DECIMAL_FLOAT modes by invoking
emit_move_via_integer.
From-SVN: r109845
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 36 |
1 files changed, 25 insertions, 11 deletions
@@ -1,6 +1,7 @@ /* Convert tree expression to rtl instructions, for GNU compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, + Inc. This file is part of GCC. @@ -2783,17 +2784,19 @@ emit_move_change_mode (enum machine_mode new_mode, { rtx ret; - if (reload_in_progress && MEM_P (x)) + if (MEM_P (x)) { - /* We can't use gen_lowpart here because it may call change_address - which is not appropriate if we were called when a reload was in - progress. We don't have to worry about changing the address since - the size in bytes is supposed to be the same. Copy the MEM to - change the mode and move any substitutions from the old MEM to - the new one. */ - - ret = adjust_address_nv (x, new_mode, 0); - copy_replacements (x, ret); + /* We don't have to worry about changing the address since the + size in bytes is supposed to be the same. */ + if (reload_in_progress) + { + /* Copy the MEM to change the mode and move any + substitutions from the old MEM to the new one. */ + ret = adjust_address_nv (x, new_mode, 0); + copy_replacements (x, ret); + } + else + ret = adjust_address (x, new_mode, 0); } else { @@ -3128,6 +3131,17 @@ emit_move_insn_1 (rtx x, rtx y) if (COMPLEX_MODE_P (mode)) return emit_move_complex (mode, x, y); + if (GET_MODE_CLASS (mode) == MODE_DECIMAL_FLOAT) + { + rtx result = emit_move_via_integer (mode, x, y, true); + + /* If we can't find an integer mode, use multi words. */ + if (result) + return result; + else + return emit_move_multi_word (mode, x, y); + } + if (GET_MODE_CLASS (mode) == MODE_CC) return emit_move_ccmode (mode, x, y); |