[PATCH] msvcrt: Don't include MSVC 10.0+ math functions in SOs for older DLLs

Alex Henrie alexhenrie24 at gmail.com
Thu Dec 21 00:24:25 CST 2017


Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
This decreases the compile time and the size of the compiled binaries,
though admittedly not as much as I had hoped. It will make more of a
difference when we implement more of the new functions.

 dlls/msvcrt/math.c | 408 ++++++++++++++++++++++++++++-------------------------
 1 file changed, 212 insertions(+), 196 deletions(-)

diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 7fb4666bef..12600e6712 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -130,17 +130,6 @@ int CDECL MSVCRT__set_SSE2_enable(int flag)
     return sse2_enabled;
 }
 
-#ifdef _WIN64
-/*********************************************************************
- *      _set_FMA3_enable (MSVCR120.@)
- */
-int CDECL MSVCRT__set_FMA3_enable(int flag)
-{
-    FIXME("(%x) stub\n", flag);
-    return 0;
-}
-#endif
-
 #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) || _MSVCR_VER>=120
 
 /*********************************************************************
@@ -813,14 +802,6 @@ MSVCRT_long CDECL MSVCRT_labs( MSVCRT_long n )
     return n >= 0 ? n : -n;
 }
 
-/*********************************************************************
- *		llabs (MSVCRT.@)
- */
-MSVCRT_longlong CDECL MSVCRT_llabs( MSVCRT_longlong n )
-{
-    return n >= 0 ? n : -n;
-}
-
 /*********************************************************************
  *		_abs64 (MSVCRT.@)
  */
@@ -1227,58 +1208,6 @@ int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask
     return 0;
 }
 
-/*********************************************************************
- *		fegetenv (MSVCR120.@)
- */
-int CDECL MSVCRT_fegetenv(MSVCRT_fenv_t *env)
-{
-    env->control = _controlfp(0, 0) & (MSVCRT__EM_INEXACT | MSVCRT__EM_UNDERFLOW |
-            MSVCRT__EM_OVERFLOW | MSVCRT__EM_ZERODIVIDE | MSVCRT__EM_INVALID);
-    env->status = _statusfp();
-    return 0;
-}
-
-/*********************************************************************
- *		__fpe_flt_rounds (UCRTBASE.@)
- */
-int CDECL __fpe_flt_rounds(void)
-{
-    unsigned int fpc = _controlfp(0, 0) & MSVCRT__RC_CHOP;
-
-    TRACE("()\n");
-
-    switch(fpc) {
-        case MSVCRT__RC_CHOP: return 0;
-        case MSVCRT__RC_NEAR: return 1;
-#ifdef _WIN64
-        case MSVCRT__RC_UP: return 3;
-        default: return 2;
-#else
-        case MSVCRT__RC_UP: return 2;
-        default: return 3;
-#endif
-    }
-}
-
-/*********************************************************************
- *		fegetround (MSVCR120.@)
- */
-int CDECL MSVCRT_fegetround(void)
-{
-    return _controlfp(0, 0) & MSVCRT__RC_CHOP;
-}
-
-/*********************************************************************
- *		fesetround (MSVCR120.@)
- */
-int CDECL MSVCRT_fesetround(int round_mode)
-{
-    if (round_mode & (~MSVCRT__RC_CHOP))
-        return 1;
-    _controlfp(round_mode, MSVCRT__RC_CHOP);
-    return 0;
-}
-
 /*********************************************************************
  *		_copysign (MSVCRT.@)
  */
@@ -1315,74 +1244,6 @@ void CDECL _fpreset(void)
 #endif
 }
 
-/*********************************************************************
- *              fesetenv (MSVCR120.@)
- */
-int CDECL MSVCRT_fesetenv(const MSVCRT_fenv_t *env)
-{
-#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-    struct {
-        WORD control_word;
-        WORD unused1;
-        WORD status_word;
-        WORD unused2;
-        WORD tag_word;
-        WORD unused3;
-        DWORD instruction_pointer;
-        WORD code_segment;
-        WORD unused4;
-        DWORD operand_addr;
-        WORD data_segment;
-        WORD unused5;
-    } fenv;
-
-    TRACE( "(%p)\n", env );
-
-    if (!env->control && !env->status) {
-        _fpreset();
-        return 0;
-    }
-
-    __asm__ __volatile__( "fnstenv %0" : "=m" (fenv) );
-
-    fenv.control_word &= ~0x3d;
-    if (env->control & MSVCRT__EM_INVALID) fenv.control_word |= 0x1;
-    if (env->control & MSVCRT__EM_ZERODIVIDE) fenv.control_word |= 0x4;
-    if (env->control & MSVCRT__EM_OVERFLOW) fenv.control_word |= 0x8;
-    if (env->control & MSVCRT__EM_UNDERFLOW) fenv.control_word |= 0x10;
-    if (env->control & MSVCRT__EM_INEXACT) fenv.control_word |= 0x20;
-
-    fenv.status_word &= ~0x3d;
-    if (env->status & MSVCRT__SW_INVALID) fenv.status_word |= 0x1;
-    if (env->status & MSVCRT__SW_ZERODIVIDE) fenv.status_word |= 0x4;
-    if (env->status & MSVCRT__SW_OVERFLOW) fenv.status_word |= 0x8;
-    if (env->status & MSVCRT__SW_UNDERFLOW) fenv.status_word |= 0x10;
-    if (env->status & MSVCRT__SW_INEXACT) fenv.status_word |= 0x20;
-
-    __asm__ __volatile__( "fldenv %0" : : "m" (fenv) : "st", "st(1)",
-            "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)" );
-
-    if (sse2_supported)
-    {
-        DWORD fpword;
-
-        __asm__ __volatile__( "stmxcsr %0" : "=m" (fpword) );
-        fpword &= ~0x1e80;
-        if (env->control & MSVCRT__EM_INVALID) fpword |= 0x80;
-        if (env->control & MSVCRT__EM_ZERODIVIDE) fpword |= 0x200;
-        if (env->control & MSVCRT__EM_OVERFLOW) fpword |= 0x400;
-        if (env->control & MSVCRT__EM_UNDERFLOW) fpword |= 0x800;
-        if (env->control & MSVCRT__EM_INEXACT) fpword |= 0x1000;
-        __asm__ __volatile__( "ldmxcsr %0" : : "m" (fpword) );
-    }
-
-    return 0;
-#else
-    FIXME( "not implemented\n" );
-#endif
-    return 1;
-}
-
 /*********************************************************************
  *		_isnan (MSVCRT.@)
  */
@@ -1469,30 +1330,6 @@ double CDECL MSVCRT__yn(int order, double num)
   return retval;
 }
 
-/*********************************************************************
- *		_nearbyint (MSVCRT.@)
- */
-double CDECL MSVCRT_nearbyint(double num)
-{
-#ifdef HAVE_NEARBYINT
-    return nearbyint(num);
-#else
-    return num >= 0 ? floor(num + 0.5) : ceil(num - 0.5);
-#endif
-}
-
-/*********************************************************************
- *		_nearbyintf (MSVCRT.@)
- */
-float CDECL MSVCRT_nearbyintf(float num)
-{
-#ifdef HAVE_NEARBYINTF
-    return nearbyintf(num);
-#else
-    return MSVCRT_nearbyint(num);
-#endif
-}
-
 /*********************************************************************
  *		_nextafter (MSVCRT.@)
  */
@@ -1888,19 +1725,6 @@ MSVCRT_ldiv_t CDECL MSVCRT_ldiv(MSVCRT_long num, MSVCRT_long denom)
 }
 #endif /* ifdef __i386__ */
 
-/*********************************************************************
- *		lldiv (MSVCRT.@)
- */
-MSVCRT_lldiv_t CDECL MSVCRT_lldiv(MSVCRT_longlong num, MSVCRT_longlong denom)
-{
-  MSVCRT_lldiv_t ret;
-
-  ret.quot = num / denom;
-  ret.rem = num % denom;
-
-  return ret;
-}
-
 #ifdef __i386__
 
 /*********************************************************************
@@ -2376,6 +2200,179 @@ void __cdecl MSVCRT___libm_sse2_sqrt_precise(void)
 
 #endif  /* __i386__ */
 
+/*********************************************************************
+ *      _scalb  (MSVCRT.@)
+ *      scalbn  (MSVCR120.@)
+ *      scalbln (MSVCR120.@)
+ */
+double CDECL MSVCRT__scalb(double num, MSVCRT_long power)
+{
+    return MSVCRT_ldexp(num, power);
+}
+
+/*********************************************************************
+ *      _scalbf  (MSVCRT.@)
+ *      scalbnf  (MSVCR120.@)
+ *      scalblnf (MSVCR120.@)
+ */
+float CDECL MSVCRT__scalbf(float num, MSVCRT_long power)
+{
+    return MSVCRT_ldexp(num, power);
+}
+
+#if _MSVCR_VER>=100
+
+/*********************************************************************
+ *      llabs (MSVCR100.@)
+ *      llabs (MSVCR110.@)
+ *      llabs (MSVCR120.@)
+ */
+MSVCRT_longlong CDECL MSVCRT_llabs( MSVCRT_longlong n )
+{
+    return n >= 0 ? n : -n;
+}
+
+/*********************************************************************
+ *      lldiv (MSVCR100.@)
+ *      lldiv (MSVCR110.@)
+ *      lldiv (MSVCR120.@)
+ */
+MSVCRT_lldiv_t CDECL MSVCRT_lldiv(MSVCRT_longlong num, MSVCRT_longlong denom)
+{
+    MSVCRT_lldiv_t ret;
+
+    ret.quot = num / denom;
+    ret.rem = num % denom;
+
+    return ret;
+}
+
+#endif /* _MSVCR_VER>=100 */
+
+#if _MSVCR_VER>=120
+
+/*********************************************************************
+ *      fegetenv (MSVCR120.@)
+ */
+int CDECL MSVCRT_fegetenv(MSVCRT_fenv_t *env)
+{
+    env->control = _controlfp(0, 0) & (MSVCRT__EM_INEXACT | MSVCRT__EM_UNDERFLOW |
+            MSVCRT__EM_OVERFLOW | MSVCRT__EM_ZERODIVIDE | MSVCRT__EM_INVALID);
+    env->status = _statusfp();
+    return 0;
+}
+
+/*********************************************************************
+ *      fegetround (MSVCR120.@)
+ */
+int CDECL MSVCRT_fegetround(void)
+{
+    return _controlfp(0, 0) & MSVCRT__RC_CHOP;
+}
+
+/*********************************************************************
+ *      fesetround (MSVCR120.@)
+ */
+int CDECL MSVCRT_fesetround(int round_mode)
+{
+    if (round_mode & (~MSVCRT__RC_CHOP))
+        return 1;
+    _controlfp(round_mode, MSVCRT__RC_CHOP);
+    return 0;
+}
+
+/*********************************************************************
+ *      fesetenv (MSVCR120.@)
+ */
+int CDECL MSVCRT_fesetenv(const MSVCRT_fenv_t *env)
+{
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+    struct {
+        WORD control_word;
+        WORD unused1;
+        WORD status_word;
+        WORD unused2;
+        WORD tag_word;
+        WORD unused3;
+        DWORD instruction_pointer;
+        WORD code_segment;
+        WORD unused4;
+        DWORD operand_addr;
+        WORD data_segment;
+        WORD unused5;
+    } fenv;
+
+    TRACE( "(%p)\n", env );
+
+    if (!env->control && !env->status) {
+        _fpreset();
+        return 0;
+    }
+
+    __asm__ __volatile__( "fnstenv %0" : "=m" (fenv) );
+
+    fenv.control_word &= ~0x3d;
+    if (env->control & MSVCRT__EM_INVALID) fenv.control_word |= 0x1;
+    if (env->control & MSVCRT__EM_ZERODIVIDE) fenv.control_word |= 0x4;
+    if (env->control & MSVCRT__EM_OVERFLOW) fenv.control_word |= 0x8;
+    if (env->control & MSVCRT__EM_UNDERFLOW) fenv.control_word |= 0x10;
+    if (env->control & MSVCRT__EM_INEXACT) fenv.control_word |= 0x20;
+
+    fenv.status_word &= ~0x3d;
+    if (env->status & MSVCRT__SW_INVALID) fenv.status_word |= 0x1;
+    if (env->status & MSVCRT__SW_ZERODIVIDE) fenv.status_word |= 0x4;
+    if (env->status & MSVCRT__SW_OVERFLOW) fenv.status_word |= 0x8;
+    if (env->status & MSVCRT__SW_UNDERFLOW) fenv.status_word |= 0x10;
+    if (env->status & MSVCRT__SW_INEXACT) fenv.status_word |= 0x20;
+
+    __asm__ __volatile__( "fldenv %0" : : "m" (fenv) : "st", "st(1)",
+            "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)" );
+
+    if (sse2_supported)
+    {
+        DWORD fpword;
+
+        __asm__ __volatile__( "stmxcsr %0" : "=m" (fpword) );
+        fpword &= ~0x1e80;
+        if (env->control & MSVCRT__EM_INVALID) fpword |= 0x80;
+        if (env->control & MSVCRT__EM_ZERODIVIDE) fpword |= 0x200;
+        if (env->control & MSVCRT__EM_OVERFLOW) fpword |= 0x400;
+        if (env->control & MSVCRT__EM_UNDERFLOW) fpword |= 0x800;
+        if (env->control & MSVCRT__EM_INEXACT) fpword |= 0x1000;
+        __asm__ __volatile__( "ldmxcsr %0" : : "m" (fpword) );
+    }
+
+    return 0;
+#else
+    FIXME( "not implemented\n" );
+#endif
+    return 1;
+}
+
+/*********************************************************************
+ *      _nearbyint (MSVCR120.@)
+ */
+double CDECL MSVCRT_nearbyint(double num)
+{
+#ifdef HAVE_NEARBYINT
+    return nearbyint(num);
+#else
+    return num >= 0 ? floor(num + 0.5) : ceil(num - 0.5);
+#endif
+}
+
+/*********************************************************************
+ *      _nearbyintf (MSVCR120.@)
+ */
+float CDECL MSVCRT_nearbyintf(float num)
+{
+#ifdef HAVE_NEARBYINTF
+    return nearbyintf(num);
+#else
+    return MSVCRT_nearbyint(num);
+#endif
+}
+
 /*********************************************************************
  *      cbrt (MSVCR120.@)
  */
@@ -3126,26 +3123,6 @@ LDOUBLE CDECL MSVCR120_atanhl(LDOUBLE x)
     return MSVCR120_atanh(x);
 }
 
-/*********************************************************************
- *      _scalb  (MSVCRT.@)
- *      scalbn  (MSVCR120.@)
- *      scalbln (MSVCR120.@)
- */
-double CDECL MSVCRT__scalb(double num, MSVCRT_long power)
-{
-  return MSVCRT_ldexp(num, power);
-}
-
-/*********************************************************************
- *      _scalbf  (MSVCRT.@)
- *      scalbnf  (MSVCR120.@)
- *      scalblnf (MSVCR120.@)
- */
-float CDECL MSVCRT__scalbf(float num, MSVCRT_long power)
-{
-  return MSVCRT_ldexp(num, power);
-}
-
 /*********************************************************************
  *      scalbnl  (MSVCR120.@)
  *      scalblnl (MSVCR120.@)
@@ -3337,3 +3314,42 @@ double CDECL _except1(DWORD fpe, _FP_OPERATION_CODE op, double arg, double res,
 
     return res;
 }
+
+#ifdef _WIN64
+/*********************************************************************
+ *      _set_FMA3_enable (MSVCR120.@)
+ */
+int CDECL MSVCRT__set_FMA3_enable(int flag)
+{
+    FIXME("(%x) stub\n", flag);
+    return 0;
+}
+#endif
+
+#endif /* _MSVCR_VER>=120 */
+
+#if _MSVCR_VER>=140
+
+/*********************************************************************
+ *      __fpe_flt_rounds (UCRTBASE.@)
+ */
+int CDECL __fpe_flt_rounds(void)
+{
+    unsigned int fpc = _controlfp(0, 0) & MSVCRT__RC_CHOP;
+
+    TRACE("()\n");
+
+    switch(fpc) {
+        case MSVCRT__RC_CHOP: return 0;
+        case MSVCRT__RC_NEAR: return 1;
+#ifdef _WIN64
+        case MSVCRT__RC_UP: return 3;
+        default: return 2;
+#else
+        case MSVCRT__RC_UP: return 2;
+        default: return 3;
+#endif
+    }
+}
+
+#endif /* _MSVCR_VER>=140 */
-- 
2.15.1




More information about the wine-devel mailing list