aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/sreal.c13
-rw-r--r--gcc/sreal.h9
3 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 07aa48c..e050f03 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-12-15 Jan Hubicka <hubicka@ucw.cz>
+
+ * sreal.h (to_double): New method.
+ (shift): Do not ICE on 0.
+ * sreal.c: Include math.h
+ (sreal::to_double): New.
+
2014-12-15 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/64316
diff --git a/gcc/sreal.c b/gcc/sreal.c
index bc3af23..10de80b 100644
--- a/gcc/sreal.c
+++ b/gcc/sreal.c
@@ -47,6 +47,7 @@ along with GCC; see the file COPYING3. If not see
sig == 0 && exp == -SREAL_MAX_EXP
*/
+#include <math.h>
#include "config.h"
#include "system.h"
#include "coretypes.h"
@@ -171,6 +172,18 @@ sreal::to_int () const
return m_sig;
}
+/* Return value of *this as double.
+ This should be used for debug output only. */
+
+double
+sreal::to_double () const
+{
+ double val = m_sig;
+ if (m_exp)
+ val *= exp2 (m_exp);
+ return val;
+}
+
/* Return *this + other. */
sreal
diff --git a/gcc/sreal.h b/gcc/sreal.h
index 730f49c..6314cea 100644
--- a/gcc/sreal.h
+++ b/gcc/sreal.h
@@ -46,6 +46,7 @@ public:
void dump (FILE *) const;
int64_t to_int () const;
+ double to_double () const;
sreal operator+ (const sreal &other) const;
sreal operator- (const sreal &other) const;
sreal operator* (const sreal &other) const;
@@ -83,12 +84,14 @@ public:
sreal shift (int s) const
{
+ /* Zero needs no shifting. */
+ if (!m_sig)
+ return *this;
gcc_checking_assert (s <= SREAL_BITS);
gcc_checking_assert (s >= -SREAL_BITS);
- /* Exponent should never be so large because shift_right is used only by
- sreal_add and sreal_sub ant thus the number cannot be shifted out from
- exponent range. */
+ /* Overflows/drop to 0 could be handled gracefully, but hopefully we do not
+ need to do so. */
gcc_checking_assert (m_exp + s <= SREAL_MAX_EXP);
gcc_checking_assert (m_exp + s >= -SREAL_MAX_EXP);