summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-12-09 20:50:57 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-12-09 20:50:57 +0000
commit24da999bab16252c9c746d19d6ad1c1ab0cff65b (patch)
treedd81cd5b59f59f42f5c72ff002650851673fde71 /pp.c
parent8c05f1d002eca4e5bb7b9dae59e96d62657ba994 (diff)
downloadperl-24da999bab16252c9c746d19d6ad1c1ab0cff65b.tar.gz
Apply NetBSD patch-ad: a gcc sparc64 code generation bug.
p4raw-id: //depot/perl@13565
Diffstat (limited to 'pp.c')
-rw-r--r--pp.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/pp.c b/pp.c
index ff85c372e8..2fd40daa1a 100644
--- a/pp.c
+++ b/pp.c
@@ -2648,6 +2648,28 @@ PP(pp_sqrt)
}
}
+/*
+ * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
+ * These need to be revisited when a newer toolchain becomes available.
+ */
+#if defined(__sparc64__) && defined(__GNUC__)
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
+# undef SPARC64_MODF_WORKAROUND
+# define SPARC64_MODF_WORKAROUND 1
+# endif
+#endif
+
+#if defined(SPARC64_MODF_WORKAROUND)
+static NV
+sparc64_workaround_modf(NV theVal, NV *theIntRes)
+{
+ NV res, ret;
+ ret = Perl_modf(theVal, &res);
+ *theIntRes = res;
+ return ret;
+}
+#endif
+
PP(pp_int)
{
dSP; dTARGET; tryAMAGICun(int);
@@ -2671,21 +2693,25 @@ PP(pp_int)
if (value < (NV)UV_MAX + 0.5) {
SETu(U_V(value));
} else {
-#if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
-# ifdef HAS_MODFL_POW32_BUG
+#if defined(SPARC64_MODF_WORKAROUND)
+ (void)sparc64_workaround_modf(value, &value);
+#else
+# if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
+# ifdef HAS_MODFL_POW32_BUG
/* some versions of glibc split (i + d) into (i-1, d+1) for 2^32 <= i < 2^64 */
{
NV offset = Perl_modf(value, &value);
(void)Perl_modf(offset, &offset);
value += offset;
}
-# else
+# else
(void)Perl_modf(value, &value);
-# endif
-#else
+# endif
+# else
double tmp = (double)value;
(void)Perl_modf(tmp, &tmp);
value = (NV)tmp;
+# endif
#endif
SETn(value);
}