This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fallbacks for Perl_fp_class_denorm().
authorJarkko Hietaniemi <jhi@iki.fi>
Mon, 29 May 2017 06:28:30 +0000 (09:28 +0300)
committerJarkko Hietaniemi <jhi@iki.fi>
Tue, 30 May 2017 06:43:40 +0000 (09:43 +0300)
These may be needed if the compiler doesn't expose the C99 math
without some special switches.

perl.h

diff --git a/perl.h b/perl.h
index 70e12bd..8c4d776 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -6867,6 +6867,26 @@ extern void moncontrol(int);
 #  endif
 #endif
 
+/* We have somehow managed not to define the denormal/subnormal
+ * detection.
+ *
+ * This may happen if the compiler doesn't expose the C99 math like
+ * the fpclassify() without some special switches.  Perl tries to
+ * stay C89, so for example -std=c99 is not an option.
+ *
+ * The Perl_isinf() and Perl_isnan() should have been defined even if
+ * the C99 isinf() and isnan() are unavailable, and the NV_MIN becomes
+ * from the C89 DBL_MIN or moral equivalent. */
+#if !defined(Perl_fp_class_denorm) && defined(Perl_isinf) && defined(Perl_isnan) && defined(NV_MIN)
+#  define Perl_fp_class_denorm(x) ((x) != 0.0 && !Perl_isinf(x) && !Perl_isnan(x) && PERL_ABS(x) < NV_MIN)
+#endif
+
+/* This is not a great fallback: subnormals tests will fail,
+ * but at least Perl will link and 99.999% of tests will work. */
+#if !defined(Perl_fp_class_denorm)
+#  define Perl_fp_class_denorm(x) FALSE
+#endif
+
 #ifdef DOUBLE_IS_IEEE_FORMAT
 #  define DOUBLE_HAS_INF
 #  define DOUBLE_HAS_NAN