Piotr Caban : msvcp90: Add std:_XLgamma implementation.

Alexandre Julliard julliard at winehq.org
Fri Mar 27 16:14:39 CDT 2020


Module: wine
Branch: master
Commit: 70c3e08d32407c0d8ee751b124c438fc5910fc8d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=70c3e08d32407c0d8ee751b124c438fc5910fc8d

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Mar 27 16:33:44 2020 +0100

msvcp90: Add std:_XLgamma implementation.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48806
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp100/msvcp100.spec         |  6 +++---
 dlls/msvcp110/msvcp110.spec         |  6 +++---
 dlls/msvcp120/msvcp120.spec         |  6 +++---
 dlls/msvcp120_app/msvcp120_app.spec |  6 +++---
 dlls/msvcp140/msvcp140.spec         |  6 +++---
 dlls/msvcp90/math.c                 | 33 +++++++++++++++++++++++++++++++++
 dlls/msvcp90/msvcp90.spec           |  6 +++---
 7 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec
index 4ca8d5b277..897b46fe90 100644
--- a/dlls/msvcp100/msvcp100.spec
+++ b/dlls/msvcp100/msvcp100.spec
@@ -1260,9 +1260,9 @@
 @ cdecl -arch=win64 ?_Unlock@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@UEAAXXZ(ptr) basic_streambuf_wchar__Unlock
 @ thiscall -arch=win32 ?_Unlock at _Mutex@std@@QAEXXZ(ptr) mutex_unlock
 @ cdecl -arch=win64 ?_Unlock at _Mutex@std@@QEAAXXZ(ptr) mutex_unlock
-@ stub ?_XLgamma at tr1@std@@YAMM at Z
-@ stub ?_XLgamma at tr1@std@@YANN at Z
-@ stub ?_XLgamma at tr1@std@@YAOO at Z
+@ cdecl ?_XLgamma at tr1@std@@YAMM at Z(float) std__XLgamma_float
+@ cdecl ?_XLgamma at tr1@std@@YANN at Z(double) std__XLgamma_double
+@ cdecl ?_XLgamma at tr1@std@@YAOO at Z(double) std__XLgamma_double
 @ stub ?_Xbad at tr1@std@@YAXW4error_type at regex_constants@12@@Z
 @ stub ?_Xfunc at tr1@std@@YAXXZ
 @ cdecl -arch=win32 ?_Xinvalid_argument at std@@YAXPBD at Z(str) _Xinvalid_argument
diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index eebc430b1e..8d79f8c9a8 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -1829,9 +1829,9 @@
 @ stub -arch=win64 ?_W_Gettnames at _Locinfo@std@@QEBA?AV_Timevec at 2@XZ
 @ stub -arch=win32 ?_Winerror_map at std@@YAPBDH at Z
 @ stub -arch=win64 ?_Winerror_map at std@@YAPEBDH at Z
-@ stub ?_XLgamma at std@@YAMM at Z
-@ stub ?_XLgamma at std@@YANN at Z
-@ stub ?_XLgamma at std@@YAOO at Z
+@ cdecl ?_XLgamma at std@@YAMM at Z(float) std__XLgamma_float
+@ cdecl ?_XLgamma at std@@YANN at Z(double) std__XLgamma_double
+@ cdecl ?_XLgamma at std@@YAOO at Z(double) std__XLgamma_double
 @ cdecl ?_Xbad_alloc at std@@YAXXZ() _Xmem
 @ stub ?_Xbad_function_call at std@@YAXXZ
 @ cdecl -arch=win32 ?_Xinvalid_argument at std@@YAXPBD at Z(str) _Xinvalid_argument
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index e131d41ecc..6308c57b29 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -1790,9 +1790,9 @@
 @ stub -arch=win64 ?_W_Gettnames at _Locinfo@std@@QEBA?AV_Timevec at 2@XZ
 @ stub -arch=win32 ?_Winerror_map at std@@YAPBDH at Z
 @ stub -arch=win64 ?_Winerror_map at std@@YAPEBDH at Z
-@ stub ?_XLgamma at std@@YAMM at Z
-@ stub ?_XLgamma at std@@YANN at Z
-@ stub ?_XLgamma at std@@YAOO at Z
+@ cdecl ?_XLgamma at std@@YAMM at Z(float) std__XLgamma_float
+@ cdecl ?_XLgamma at std@@YANN at Z(double) std__XLgamma_double
+@ cdecl ?_XLgamma at std@@YAOO at Z(double) std__XLgamma_double
 @ cdecl ?_Xbad_alloc at std@@YAXXZ() _Xmem
 @ stub ?_Xbad_function_call at std@@YAXXZ
 @ cdecl -arch=win32 ?_Xinvalid_argument at std@@YAXPBD at Z(str) _Xinvalid_argument
diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec
index a76149071c..a44c89fdc8 100644
--- a/dlls/msvcp120_app/msvcp120_app.spec
+++ b/dlls/msvcp120_app/msvcp120_app.spec
@@ -1790,9 +1790,9 @@
 @ stub -arch=win64 ?_W_Gettnames at _Locinfo@std@@QEBA?AV_Timevec at 2@XZ
 @ stub -arch=win32 ?_Winerror_map at std@@YAPBDH at Z
 @ stub -arch=win64 ?_Winerror_map at std@@YAPEBDH at Z
-@ stub ?_XLgamma at std@@YAMM at Z
-@ stub ?_XLgamma at std@@YANN at Z
-@ stub ?_XLgamma at std@@YAOO at Z
+@ cdecl ?_XLgamma at std@@YAMM at Z(float) msvcp120.?_XLgamma at std@@YAMM at Z
+@ cdecl ?_XLgamma at std@@YANN at Z(double) msvcp120.?_XLgamma at std@@YANN at Z
+@ cdecl ?_XLgamma at std@@YAOO at Z(double) msvcp120.?_XLgamma at std@@YAOO at Z
 @ cdecl ?_Xbad_alloc at std@@YAXXZ() msvcp120.?_Xbad_alloc at std@@YAXXZ
 @ stub ?_Xbad_function_call at std@@YAXXZ
 @ cdecl -arch=win32 ?_Xinvalid_argument at std@@YAXPBD at Z(str) msvcp120.?_Xinvalid_argument at std@@YAXPBD at Z
diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index 70caad8dba..2563c7bfa7 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -1673,9 +1673,9 @@
 @ cdecl -arch=win32 ?_Winerror_message at std@@YAKKPADK at Z(long ptr long) _Winerror_message
 @ cdecl -arch=win64 ?_Winerror_message at std@@YAKKPEADK at Z(long ptr long) _Winerror_message
 @ stub ?_XGetLastError at std@@YAXXZ
-@ stub ?_XLgamma at std@@YAMM at Z
-@ stub ?_XLgamma at std@@YANN at Z
-@ stub ?_XLgamma at std@@YAOO at Z
+@ cdecl ?_XLgamma at std@@YAMM at Z(float) std__XLgamma_float
+@ cdecl ?_XLgamma at std@@YANN at Z(double) std__XLgamma_double
+@ cdecl ?_XLgamma at std@@YAOO at Z(double) std__XLgamma_double
 @ cdecl ?_Xbad_alloc at std@@YAXXZ() _Xmem
 @ stub ?_Xbad_function_call at std@@YAXXZ
 @ cdecl -arch=win32 ?_Xinvalid_argument at std@@YAXPBD at Z(str) _Xinvalid_argument
diff --git a/dlls/msvcp90/math.c b/dlls/msvcp90/math.c
index 9bc7c0867d..4ebf8baaee 100644
--- a/dlls/msvcp90/math.c
+++ b/dlls/msvcp90/math.c
@@ -2362,3 +2362,36 @@ short __cdecl _FExp(float *x, float y, short scale)
 
     return dclass(*x);
 }
+
+/* ?_XLgamma at std@@YANN at Z */
+double __cdecl std__XLgamma_double(double z)
+{
+    /* Lanczos coefficients g=5, n=6 */
+    static const double lc[] = {
+        1.000000000190015,
+        76.18009172947146,
+        -86.50532032941677,
+        24.01409824083091,
+        -1.231739572450155,
+        0.1208650973866179e-2,
+        -0.5395239384953e-5
+    };
+    static const double log_sqrt_2pi = 0.91893853320467274178;
+
+    double base = z + 4.5, sum = 0;
+    int i;
+
+    if (z < 0.5) return log(M_PI / sin(M_PI * z)) - std__XLgamma_double(1 - z);
+
+    z--;
+    for(i = ARRAY_SIZE(lc) - 1; i >= 1; i--)
+        sum += lc[i] / (z + i);
+    sum += lc[0];
+    return log_sqrt_2pi + log(sum) - base + log(base) * (z + 0.5);
+}
+
+/* ?_XLgamma at tr1@std@@YAMM at Z */
+float __cdecl std__XLgamma_float(float z)
+{
+    return std__XLgamma_double(z);
+}
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index 6a5a9a20a4..c38dd041af 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -3185,9 +3185,9 @@
 @ cdecl -arch=win64 ?_Widen_s@?$ctype at G@std@@QEBAPEBDPEBD0PEAG_K at Z(ptr ptr ptr ptr long) ctype_wchar__Widen_s
 @ thiscall -arch=win32 ?_Widen_s@?$ctype at _W@std@@QBEPBDPBD0PA_WI at Z(ptr ptr ptr ptr long) ctype_wchar__Widen_s
 @ cdecl -arch=win64 ?_Widen_s@?$ctype at _W@std@@QEBAPEBDPEBD0PEA_W_K at Z(ptr ptr ptr ptr long) ctype_wchar__Widen_s
-@ stub ?_XLgamma at tr1@std@@YAMM at Z
-@ stub ?_XLgamma at tr1@std@@YANN at Z
-@ stub ?_XLgamma at tr1@std@@YAOO at Z
+@ cdecl ?_XLgamma at tr1@std@@YAMM at Z(float) std__XLgamma_float
+@ cdecl ?_XLgamma at tr1@std@@YANN at Z(double) std__XLgamma_double
+@ cdecl ?_XLgamma at tr1@std@@YAOO at Z(double) std__XLgamma_double
 @ stub ?_Xbad at tr1@std@@YAXW4error_type at regex_constants@12@@Z
 @ stub -arch=win32 ?_Xfsopen at std@@YAPAU_iobuf@@PB_W0H at Z
 @ stub -arch=win64 ?_Xfsopen at std@@YAPEAU_iobuf@@PEB_W0H at Z




More information about the wine-cvs mailing list