]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix long double float miscompilations on sparc 64-bit.
authorDavid S. Miller <davem@davemloft.net>
Thu, 3 May 2012 22:19:35 +0000 (22:19 +0000)
committerDavid S. Miller <davem@gcc.gnu.org>
Thu, 3 May 2012 22:19:35 +0000 (15:19 -0700)
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

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

index 8907303684d60e74dfb6f524d4206c82613fcfed..a310e38c7dd083f96a07e422d31588fc572ce189 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-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/53199
index 11bd1fe90ff1b9580f56b3dd692af2f99d04eb85..0db171854b4bc04431a18bf4600504d06a19e302 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,
@@ -2724,7 +2724,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)
            {
@@ -7413,7 +7418,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);
@@ -7421,7 +7431,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);