From 0570334c0707d5ac88a64e10c65f1c1beac3d38f Mon Sep 17 00:00:00 2001
From: manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 23 Nov 2006 18:49:22 +0000
Subject: [PATCH] 2006-11-23  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	* real.h (real_isinteger): Declare.
	* real.c (real_isinteger): Define.
	* builtins.c (integer_valued_real_p): Use it.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119130 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog  |  6 ++++++
 gcc/builtins.c | 10 +---------
 gcc/real.c     | 11 +++++++++++
 gcc/real.h     |  3 +++
 4 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f649c7b77493..0244e455aa35 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-11-23  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+	* real.h (real_isinteger): Declare.
+	* real.c (real_isinteger): Define.
+	* builtins.c (integer_valued_real_p): Use it.
+
 2006-11-23  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
 	PR c/9072 
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 4e4ea969cd78..75b47fb23919 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -6677,15 +6677,7 @@ integer_valued_real_p (tree t)
 	     && integer_valued_real_p (TREE_OPERAND (t, 2));
 
     case REAL_CST:
-      if (! TREE_CONSTANT_OVERFLOW (t))
-      {
-	REAL_VALUE_TYPE c, cint;
-
-	c = TREE_REAL_CST (t);
-	real_trunc (&cint, TYPE_MODE (TREE_TYPE (t)), &c);
-	return real_identical (&c, &cint);
-      }
-      break;
+      return real_isinteger (TREE_REAL_CST_PTR (t), TYPE_MODE (TREE_TYPE (t)));
 
     case NOP_EXPR:
       {
diff --git a/gcc/real.c b/gcc/real.c
index bfb8462baead..0d239b3379d0 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -4968,3 +4968,14 @@ real_from_mpfr (REAL_VALUE_TYPE *r, mpfr_srcptr m)
   
   real_from_string (r, buf);
 }
+
+/* Check whether the real constant value given is an integer.  */
+
+bool
+real_isinteger (const REAL_VALUE_TYPE *c, enum machine_mode mode)
+{
+  REAL_VALUE_TYPE cint;
+
+  real_trunc (&cint, mode, c);
+  return real_identical (c, &cint);
+}
diff --git a/gcc/real.h b/gcc/real.h
index 5a45892d3016..4198b02aee6e 100644
--- a/gcc/real.h
+++ b/gcc/real.h
@@ -433,4 +433,7 @@ extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
 extern void real_from_mpfr (REAL_VALUE_TYPE *, mpfr_srcptr);
 extern void mpfr_from_real (mpfr_ptr, const REAL_VALUE_TYPE *);
 
+/* Check whether the real constant value given is an integer.  */
+extern bool real_isinteger (const REAL_VALUE_TYPE *c, enum machine_mode mode);
+
 #endif /* ! GCC_REAL_H */
-- 
GitLab