+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
sig == 0 && exp == -SREAL_MAX_EXP
*/
+#include <math.h>
#include "config.h"
#include "system.h"
#include "coretypes.h"
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
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;
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);