--- druntime/src/core/stdc/math.d	2018-03-04 08:20:53.000000000 +0100
+++ -	2018-08-03 22:10:15.242825116 +0200
@@ -232,8 +232,148 @@
     int isunordered(double x, double y);
     int isunordered(real x, real y);
 }
+version( CRuntime_Glibc )
+{
+    enum
+    {   
+        ///
+        FP_NAN,
+        ///
+        FP_INFINITE,
+        ///
+        FP_ZERO,
+        ///
+        FP_SUBNORMAL,
+        ///
+        FP_NORMAL,
+    }
+
+    enum
+    {   
+        ///
+        FP_FAST_FMA  = 0,
+        ///
+        FP_FAST_FMAF = 0,
+        ///
+        FP_FAST_FMAL = 0,
+    }
+
+    int __fpclassifyf(float x);
+    int __fpclassify(double x);
+    int __fpclassifyl(real x);
+
+    //int __finitef(float x);
+    //int __finite(double x);
+    //int __finitel(real x);
 
-version( CRuntime_DigitalMars )
+    //int __isinff(float x);
+    //int __isinf(double x);
+    //int __isinfl(real x);
+
+    //int __isnanf(float x);
+    //int __isnan(double x);
+    //int __isnanl(real x);
+
+    int __signbitf(float x);
+    int __signbit(double x);
+    int __signbitl(real x);
+
+  extern (D)
+  {
+    //int fpclassify(real-floating x);
+      ///
+    int fpclassify(float x)     { return __fpclassifyf(x); }
+    ///
+    int fpclassify(double x)    { return __fpclassify(x);  }
+    ///
+    int fpclassify(real x)
+{
+        return (real.sizeof == double.sizeof)
+            ? __fpclassify(x)
+            : __fpclassifyl(x);
+    }
+    private uint __FLOAT_BITS(float __f)
+    {
+        union __u_t {
+            float __f;
+            uint __i;
+        }
+        __u_t __u;
+        __u.__f = __f;
+        return __u.__i;
+    }
+    private ulong __DOUBLE_BITS(double __f)
+    {
+        union __u_t {
+            double __f;
+            ulong __i;
+        }
+        __u_t __u;
+        __u.__f = __f;
+        return __u.__i;
+    }
+    //int isfinite(real-floating x);
+    ///
+    int isfinite(float x)       { return (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000;  }
+    ///
+    int isfinite(double x)      {  return (__DOUBLE_BITS(x) & -1UL>>1) < 0x7ffUL<<52;  }
+    ///
+    int isfinite(real x)
+    {
+        return (real.sizeof == double.sizeof)
+            ? isfinite(cast(double)x)
+            : __fpclassifyl(x) > FP_INFINITE;
+    }
+
+    //int isinf(real-floating x);
+    ///
+    int isinf(float x)          { return (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000;  }
+    ///
+    int isinf(double x)         { return (__DOUBLE_BITS(x) & -1UL>>1) == 0x7ffUL<<52;   }
+    ///
+    int isinf(real x)
+    {
+        return (real.sizeof == double.sizeof)
+                ? isinf(cast(double)x)
+                : __fpclassifyl(x) == FP_INFINITE;
+    }
+
+        //int isnan(real-floating x);
+    ///
+    int isnan(float x)          { return (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000;  }
+    ///
+    int isnan(double x)         { return (__DOUBLE_BITS(x) & -1UL>>1) > 0x7ffUL<<52;   }
+    ///
+    int isnan(real x)
+    {
+        return (real.sizeof == double.sizeof)
+            ? isnan(cast(double)x)
+            : __fpclassifyl(x) == FP_NAN;
+    }
+
+    //int isnormal(real-floating x);
+    ///
+    int isnormal(float x)       { return fpclassify(x) == FP_NORMAL; }
+    ///
+    int isnormal(double x)      { return fpclassify(x) == FP_NORMAL; }
+    ///
+    int isnormal(real x)        { return fpclassify(x) == FP_NORMAL; }
+
+    //int signbit(real-floating x);
+    ///
+    int signbit(float x)     { return __signbitf(x); }
+    ///
+    int signbit(double x)    { return __signbit(x);  }
+    ///
+    int signbit(real x)
+    {
+        return (real.sizeof == double.sizeof)
+            ? __signbit(x)
+            : __signbitl(x);
+    }
+  }
+}
+else version( CRuntime_DigitalMars )
 {
     enum
     {
