Module: wine Branch: master Commit: 70c3e08d32407c0d8ee751b124c438fc5910fc8d URL: https://source.winehq.org/git/wine.git/?a=commit;h=70c3e08d32407c0d8ee751b12... Author: Piotr Caban <piotr(a)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(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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(a)_WU?$char_traits(a)_W@std@@@std@@UEAAXXZ(ptr) basic_streambuf_wchar__Unlock @ thiscall -arch=win32 ?_Unlock(a)_Mutex@std@@QAEXXZ(ptr) mutex_unlock @ cdecl -arch=win64 ?_Unlock(a)_Mutex@std@@QEAAXXZ(ptr) mutex_unlock -@ stub ?_XLgamma(a)tr1@std@@YAMM(a)Z -@ stub ?_XLgamma(a)tr1@std@@YANN(a)Z -@ stub ?_XLgamma(a)tr1@std@@YAOO(a)Z +@ cdecl ?_XLgamma(a)tr1@std@@YAMM(a)Z(float) std__XLgamma_float +@ cdecl ?_XLgamma(a)tr1@std@@YANN(a)Z(double) std__XLgamma_double +@ cdecl ?_XLgamma(a)tr1@std@@YAOO(a)Z(double) std__XLgamma_double @ stub ?_Xbad(a)tr1@std@@YAXW4error_type(a)regex_constants@12@@Z @ stub ?_Xfunc(a)tr1@std@@YAXXZ @ cdecl -arch=win32 ?_Xinvalid_argument(a)std@@YAXPBD(a)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(a)_Locinfo@std@@QEBA?AV_Timevec(a)2@XZ @ stub -arch=win32 ?_Winerror_map(a)std@@YAPBDH(a)Z @ stub -arch=win64 ?_Winerror_map(a)std@@YAPEBDH(a)Z -@ stub ?_XLgamma(a)std@@YAMM(a)Z -@ stub ?_XLgamma(a)std@@YANN(a)Z -@ stub ?_XLgamma(a)std@@YAOO(a)Z +@ cdecl ?_XLgamma(a)std@@YAMM(a)Z(float) std__XLgamma_float +@ cdecl ?_XLgamma(a)std@@YANN(a)Z(double) std__XLgamma_double +@ cdecl ?_XLgamma(a)std@@YAOO(a)Z(double) std__XLgamma_double @ cdecl ?_Xbad_alloc(a)std@@YAXXZ() _Xmem @ stub ?_Xbad_function_call(a)std@@YAXXZ @ cdecl -arch=win32 ?_Xinvalid_argument(a)std@@YAXPBD(a)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(a)_Locinfo@std@@QEBA?AV_Timevec(a)2@XZ @ stub -arch=win32 ?_Winerror_map(a)std@@YAPBDH(a)Z @ stub -arch=win64 ?_Winerror_map(a)std@@YAPEBDH(a)Z -@ stub ?_XLgamma(a)std@@YAMM(a)Z -@ stub ?_XLgamma(a)std@@YANN(a)Z -@ stub ?_XLgamma(a)std@@YAOO(a)Z +@ cdecl ?_XLgamma(a)std@@YAMM(a)Z(float) std__XLgamma_float +@ cdecl ?_XLgamma(a)std@@YANN(a)Z(double) std__XLgamma_double +@ cdecl ?_XLgamma(a)std@@YAOO(a)Z(double) std__XLgamma_double @ cdecl ?_Xbad_alloc(a)std@@YAXXZ() _Xmem @ stub ?_Xbad_function_call(a)std@@YAXXZ @ cdecl -arch=win32 ?_Xinvalid_argument(a)std@@YAXPBD(a)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(a)_Locinfo@std@@QEBA?AV_Timevec(a)2@XZ @ stub -arch=win32 ?_Winerror_map(a)std@@YAPBDH(a)Z @ stub -arch=win64 ?_Winerror_map(a)std@@YAPEBDH(a)Z -@ stub ?_XLgamma(a)std@@YAMM(a)Z -@ stub ?_XLgamma(a)std@@YANN(a)Z -@ stub ?_XLgamma(a)std@@YAOO(a)Z +@ cdecl ?_XLgamma(a)std@@YAMM(a)Z(float) msvcp120.?_XLgamma(a)std@@YAMM(a)Z +@ cdecl ?_XLgamma(a)std@@YANN(a)Z(double) msvcp120.?_XLgamma(a)std@@YANN(a)Z +@ cdecl ?_XLgamma(a)std@@YAOO(a)Z(double) msvcp120.?_XLgamma(a)std@@YAOO(a)Z @ cdecl ?_Xbad_alloc(a)std@@YAXXZ() msvcp120.?_Xbad_alloc(a)std@@YAXXZ @ stub ?_Xbad_function_call(a)std@@YAXXZ @ cdecl -arch=win32 ?_Xinvalid_argument(a)std@@YAXPBD(a)Z(str) msvcp120.?_Xinvalid_argument(a)std@@YAXPBD(a)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(a)std@@YAKKPADK(a)Z(long ptr long) _Winerror_message @ cdecl -arch=win64 ?_Winerror_message(a)std@@YAKKPEADK(a)Z(long ptr long) _Winerror_message @ stub ?_XGetLastError(a)std@@YAXXZ -@ stub ?_XLgamma(a)std@@YAMM(a)Z -@ stub ?_XLgamma(a)std@@YANN(a)Z -@ stub ?_XLgamma(a)std@@YAOO(a)Z +@ cdecl ?_XLgamma(a)std@@YAMM(a)Z(float) std__XLgamma_float +@ cdecl ?_XLgamma(a)std@@YANN(a)Z(double) std__XLgamma_double +@ cdecl ?_XLgamma(a)std@@YAOO(a)Z(double) std__XLgamma_double @ cdecl ?_Xbad_alloc(a)std@@YAXXZ() _Xmem @ stub ?_Xbad_function_call(a)std@@YAXXZ @ cdecl -arch=win32 ?_Xinvalid_argument(a)std@@YAXPBD(a)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(a)std@@YANN(a)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(a)tr1@std@@YAMM(a)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(a)G@std@@QEBAPEBDPEBD0PEAG_K(a)Z(ptr ptr ptr ptr long) ctype_wchar__Widen_s @ thiscall -arch=win32 ?_Widen_s@?$ctype(a)_W@std@@QBEPBDPBD0PA_WI(a)Z(ptr ptr ptr ptr long) ctype_wchar__Widen_s @ cdecl -arch=win64 ?_Widen_s@?$ctype(a)_W@std@@QEBAPEBDPEBD0PEA_W_K(a)Z(ptr ptr ptr ptr long) ctype_wchar__Widen_s -@ stub ?_XLgamma(a)tr1@std@@YAMM(a)Z -@ stub ?_XLgamma(a)tr1@std@@YANN(a)Z -@ stub ?_XLgamma(a)tr1@std@@YAOO(a)Z +@ cdecl ?_XLgamma(a)tr1@std@@YAMM(a)Z(float) std__XLgamma_float +@ cdecl ?_XLgamma(a)tr1@std@@YANN(a)Z(double) std__XLgamma_double +@ cdecl ?_XLgamma(a)tr1@std@@YAOO(a)Z(double) std__XLgamma_double @ stub ?_Xbad(a)tr1@std@@YAXW4error_type(a)regex_constants@12@@Z @ stub -arch=win32 ?_Xfsopen(a)std@@YAPAU_iobuf@@PB_W0H(a)Z @ stub -arch=win64 ?_Xfsopen(a)std@@YAPEAU_iobuf@@PEB_W0H(a)Z