(perl #133510) use quadmath versions of log10, ldexp and signbit
authorTony Cook <tony@develop-help.com>
Wed, 12 Sep 2018 01:09:52 +0000 (11:09 +1000)
committerTony Cook <tony@develop-help.com>
Wed, 12 Sep 2018 01:09:52 +0000 (11:09 +1000)
With -Dquadmath C++ builds, the calls to log10() and ldexp() would
cause ambiguous overloaded function errors, since all of log10(float),
log10(double) and log10(long double) were canidates for a
log10(__float128) call.  Similarly for ldexp().

signbit() had a different problem, two of the tests in ext/POSIX/t/math.t
failed with the default signbit() macro, presumably because the
__float128 was being converted to a long double, since the macro in
math.h didn't special case for __float128.

ext/POSIX/POSIX.xs
ext/POSIX/lib/POSIX.pm
perl.h

index 7497305..72dcef8 100644 (file)
@@ -2416,7 +2416,7 @@ acos(x)
 #endif
            break;
        case 17:
-           RETVAL = log10(x); /* C89 math */
+           RETVAL = Perl_log10(x); /* C89 math */
            break;
        case 18:
 #ifdef c99_log1p
@@ -2828,6 +2828,10 @@ NV
 ldexp(x,exp)
        NV              x
        int             exp
+    CODE:
+        RETVAL = Perl_ldexp(x, exp);
+    OUTPUT:
+        RETVAL
 
 void
 modf(x)
index ae33cad..05eedf7 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 
 our ($AUTOLOAD, %SIGRT);
 
-our $VERSION = '1.84';
+our $VERSION = '1.85';
 
 require XSLoader;
 
diff --git a/perl.h b/perl.h
index 66ebf20..9ba4ea2 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1943,6 +1943,7 @@ extern long double Perl_my_frexpl(long double x, int *e);
 #   define Perl_fmod fmodq
 #   define Perl_log logq
 #   define Perl_log10 log10q
+#   define Perl_signbit signbitq
 #   define Perl_pow powq
 #   define Perl_sin sinq
 #   define Perl_sinh sinhq
@@ -3838,7 +3839,9 @@ my_swap16(const U16 x) {
 #define U_L(what) U_32(what)
 
 #ifdef HAS_SIGNBIT
-#  define Perl_signbit signbit
+#  ifndef Perl_signbit
+#    define Perl_signbit signbit
+#  endif
 #endif
 
 /* These do not care about the fractional part, only about the range. */