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
This commit is contained in:
Ben Elliston 2006-01-17 23:43:27 +00:00 committed by Ben Elliston
parent 96c6b0e22a
commit ef7befe0d0
2 changed files with 32 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2006-01-18 Ben Elliston <bje@au.ibm.com>
* 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.
2006-01-17 Shantonu Sen <ssen@opendarwin.org>
* Makefile.in (check-%, check-consistency): Use $${srcdir}

View File

@ -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);