Commit d333c3eb by David S. Miller Committed by David S. Miller

Fix long double float miscompilations on sparc 64-bit.

	PR target/52684
	* config/sparc/sparc.c (emit_soft_tfmode_libcall): If we pass a
	MEM directly into a libcall, mark it's MEM_EXPR as addressable.
	(sparc_emit_float_lib_cmp): Likewise.

From-SVN: r187120
parent 65d512d1
2012-05-03 David S. Miller <davem@davemloft.net>
PR target/52684
* config/sparc/sparc.c (emit_soft_tfmode_libcall): If we pass a
MEM directly into a libcall, mark it's MEM_EXPR as addressable.
(sparc_emit_float_lib_cmp): Likewise.
2012-05-03 Michael Meissner <meissner@linux.vnet.ibm.com> 2012-05-03 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/53199 PR target/53199
......
/* Subroutines for insn-output.c for SPARC. /* Subroutines for insn-output.c for SPARC.
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com) Contributed by Michael Tiemann (tiemann@cygnus.com)
64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans, 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
...@@ -2724,7 +2724,12 @@ emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands) ...@@ -2724,7 +2724,12 @@ emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
if (GET_CODE (this_arg) == MEM if (GET_CODE (this_arg) == MEM
&& ! force_stack_temp) && ! force_stack_temp)
this_arg = XEXP (this_arg, 0); {
tree expr = MEM_EXPR (this_arg);
if (expr)
mark_addressable (expr);
this_arg = XEXP (this_arg, 0);
}
else if (CONSTANT_P (this_arg) else if (CONSTANT_P (this_arg)
&& ! force_stack_temp) && ! force_stack_temp)
{ {
...@@ -7413,7 +7418,12 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison) ...@@ -7413,7 +7418,12 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
if (TARGET_ARCH64) if (TARGET_ARCH64)
{ {
if (MEM_P (x)) if (MEM_P (x))
slot0 = x; {
tree expr = MEM_EXPR (x);
if (expr)
mark_addressable (expr);
slot0 = x;
}
else else
{ {
slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0); slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
...@@ -7421,7 +7431,12 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison) ...@@ -7421,7 +7431,12 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
} }
if (MEM_P (y)) if (MEM_P (y))
slot1 = y; {
tree expr = MEM_EXPR (y);
if (expr)
mark_addressable (expr);
slot1 = y;
}
else else
{ {
slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0); slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment