OSDN Git Service

PR middle-end/47903
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 27 Feb 2011 19:37:35 +0000 (19:37 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 27 Feb 2011 19:37:35 +0000 (19:37 +0000)
* real.c (real_arithmetic) <case PLUS_EXPR, MINUS_EXPR,
MULT_EXPR, RDIV_EXPR>: Clear padding bits in *r first if
r isn't op0 nor op1.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170547 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/real.c

index b59539f..ca9f366 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/47903
+       * real.c (real_arithmetic) <case PLUS_EXPR, MINUS_EXPR,
+       MULT_EXPR, RDIV_EXPR>: Clear padding bits in *r first if
+       r isn't op0 nor op1.
+
 2011-02-23  Georg-Johann Lay  <avr@gjlay.de>
 
        * config/avr/avr.md: Remove magic comment for emacs.
index 4318586..6d3b435 100644 (file)
@@ -1,6 +1,7 @@
 /* real.c - software floating point emulation.
    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
-   2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
    Contributed by Stephen L. Moshier (moshier@world.std.com).
    Re-written by Richard Henderson <rth@redhat.com>
 
@@ -1009,15 +1010,25 @@ real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
   switch (code)
     {
     case PLUS_EXPR:
+      /* Clear any padding areas in *r if it isn't equal to one of the
+        operands so that we can later do bitwise comparisons later on.  */
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_add (r, op0, op1, 0);
 
     case MINUS_EXPR:
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_add (r, op0, op1, 1);
 
     case MULT_EXPR:
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_multiply (r, op0, op1);
 
     case RDIV_EXPR:
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_divide (r, op0, op1);
 
     case MIN_EXPR: