OSDN Git Service

Fix long double float miscompilations on sparc 64-bit.
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 May 2012 22:34:34 +0000 (22:34 +0000)
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 May 2012 22:34:34 +0000 (22:34 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@187124 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sparc/sparc.c

index 8efd672..3a37c84 100644 (file)
@@ -1,3 +1,10 @@
+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-04  Martin Jambor  <mjambor@suse.cz>
 
        Backport from mainline
index b987648..e1133cd 100644 (file)
@@ -1,7 +1,7 @@
 /* Subroutines for insn-output.c for SPARC.
    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-   2011
+   2011, 2012
    Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com)
    64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
@@ -2698,7 +2698,12 @@ emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
 
          if (GET_CODE (this_arg) == MEM
              && ! 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)
                   && ! force_stack_temp)
            {
@@ -7387,7 +7392,12 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
   if (TARGET_ARCH64)
     {
       if (MEM_P (x))
-       slot0 = x;
+       {
+         tree expr = MEM_EXPR (x);
+         if (expr)
+           mark_addressable (expr);
+         slot0 = x;
+       }
       else
        {
          slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
@@ -7395,7 +7405,12 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
        }
 
       if (MEM_P (y))
-       slot1 = y;
+       {
+         tree expr = MEM_EXPR (y);
+         if (expr)
+           mark_addressable (expr);
+         slot1 = y;
+       }
       else
        {
          slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);