From: Jarkko Hietaniemi <jhi@iki.fi>
Date: Wed, 15 Aug 2001 13:12:50 +0000 (+0000)
Subject: Also UNICOS is in the general case unable to silently
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=87032ba1356fb03b9506881b2d4a3fca8143cce9;p=p5sagit%2Fp5-mst-13.2.git

Also UNICOS is in the general case unable to silently
handle fp overflows.

p4raw-id: //depot/perl@11681
---

diff --git a/numeric.c b/numeric.c
index c601943..f12e9ba 100644
--- a/numeric.c
+++ b/numeric.c
@@ -572,6 +572,7 @@ S_mulexp10(NV value, I32 exponent)
 	negative = 1;
 	exponent = -exponent;
     }
+
     /* Avoid %SYSTEM-F-FLTOVF_F sans VAXC$ESTABLISH.
      * In VAX VMS we by default use the D_FLOAT double format,
      * and that format does not have *easy* capabilities [1] for
@@ -591,6 +592,20 @@ S_mulexp10(NV value, I32 exponent)
         return NV_MAX;
 #  endif
 #endif
+
+    /* In UNICOS and in certain Cray models (such as T90) there is no
+     * IEEE fp, and no way at all from C to catch fp overflows gracefully.
+     * There is something you can do if you are willing to use some
+     * inline assembler: the instruction is called DFI-- but that will
+     * disable *all* floating point interrupts, a little bit too large
+     * a hammer.  Therefore we need to catch potential overflows before
+     * it's too late. */
+#if defined(_UNICOS) && defined(NV_MAX_10_EXP)
+    if (!negative &&
+	(log10(value) + exponent) >= NV_MAX_10_EXP)
+        return NV_MAX;
+#endif
+
     for (bit = 1; exponent; bit <<= 1) {
 	if (exponent & bit) {
 	    exponent ^= bit;