(standard_80387_constant_p): When testing for floating-point equality,
authorRichard Kenner <kenner@gcc.gnu.org>
Wed, 31 Mar 1993 20:56:14 +0000 (15:56 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 31 Mar 1993 20:56:14 +0000 (15:56 -0500)
make sure we do so inside a region protected from traps.

From-SVN: r3962

gcc/config/i386/i386.c

index 960bfd4..fe85584 100644 (file)
@@ -18,6 +18,7 @@ along with GNU CC; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <stdio.h>
+#include <setjmp.h>
 #include "config.h"
 #include "rtl.h"
 #include "regs.h"
@@ -437,21 +438,30 @@ int
 standard_80387_constant_p (x)
      rtx x;
 {
-  union real_extract u;
-  register double d;
+#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
+  REAL_VALUE_TYPE d;
+  jmp_buf handler;
+  int is0, is1;
 
-  bcopy (&CONST_DOUBLE_LOW (x), &u, sizeof u);
-  d = u.d;
+  if (setjmp (handler))
+    return 0;
+
+  set_float_handler (handler);
+  REAL_VALUE_FROM_CONST_DOUBLE (d, x);
+  is0 = REAL_VALUES_EQUAL (d, dconst0);
+  is1 = REAL_VALUES_EQUAL (d, dconst1);
+  set_float_handler (NULL_PTR);
 
-  if (d == 0)
+  if (is0)
     return 1;
 
-  if (d == 1)
+  if (is1)
     return 2;
 
   /* Note that on the 80387, other constants, such as pi,
      are much slower to load as standard constants
      than to load from doubles in memory!  */
+#endif
 
   return 0;
 }