sparc.c (emit_soft_tfmode_libcall): Do not allow result to overlap input operands in memory.

2002-05-06  David S. Miller  <davem@redhat.com>

	* config/sparc/sparc.c (emit_soft_tfmode_libcall): Do not
	allow result to overlap input operands in memory.

From-SVN: r53204
This commit is contained in:
David S. Miller 2002-05-06 00:09:21 -07:00 committed by David S. Miller
parent 95ff5d3fad
commit 0ac941a072
2 changed files with 25 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2002-05-06 David S. Miller <davem@redhat.com>
* config/sparc/sparc.c (emit_soft_tfmode_libcall): Do not
allow result to overlap input operands in memory.
2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk>
doc:

View File

@ -2476,7 +2476,7 @@ emit_soft_tfmode_libcall (func_name, nargs, operands)
rtx *operands;
{
rtx ret_slot = NULL, arg[3], func_sym;
int i;
int i, j;
/* We only expect to be called for conversions, unary, and binary ops. */
if (nargs < 2 || nargs > 3)
@ -2491,7 +2491,25 @@ emit_soft_tfmode_libcall (func_name, nargs, operands)
if (GET_MODE (this_arg) == TFmode)
{
if (GET_CODE (this_arg) == MEM)
this_arg = XEXP (this_arg, 0);
{
this_arg = XEXP (this_arg, 0);
/* Make sure the output is not in the same place
as one of our inputs. */
if (i == 0)
{
for (j = 1; j < nargs; j++)
if (rtx_equal_p (operands[0], operands[j]))
break;
if (j != nargs)
{
ret_slot = assign_stack_temp (TFmode,
GET_MODE_SIZE (TFmode), 0);
this_arg = XEXP (ret_slot, 0);
}
}
}
else if (CONSTANT_P (this_arg))
{
this_slot = force_const_mem (TFmode, this_arg);