Module: wine Branch: master Commit: 4083af404b2ef9e0b0928a6f685f2efa8567c80b URL: http://source.winehq.org/git/wine.git/?a=commit;h=4083af404b2ef9e0b0928a6f68...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Jan 18 12:57:39 2016 +0100
msvcr120: Add _dpcomp implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcr120/msvcr120.spec | 6 +++--- dlls/msvcr120/tests/msvcr120.c | 37 +++++++++++++++++++++++++++++++++++++ dlls/msvcr120_app/msvcr120_app.spec | 6 +++--- dlls/msvcrt/math.c | 21 +++++++++++++++++++++ 4 files changed, 64 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index b738155..361e3d2 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1110,7 +1110,7 @@ @ cdecl _difftime32(long long) MSVCRT__difftime32 @ cdecl _difftime64(long long) MSVCRT__difftime64 @ stub _dosmaperr -@ stub _dpcomp +@ cdecl _dpcomp(double double) MSVCR120__dpcomp @ cdecl _dsign(double) MSVCR120__dsign @ extern _dstbias MSVCRT__dstbias @ cdecl _dtest(ptr) MSVCR120__dtest @@ -1144,7 +1144,7 @@ @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s @ cdecl _fdclass(float) MSVCR120__fdclass @ cdecl _fdopen(long str) MSVCRT__fdopen -@ stub _fdpcomp +@ cdecl _fdpcomp(float float) MSVCR120__fdpcomp @ cdecl _fdsign(float) MSVCR120__fdsign @ cdecl _fdtest(ptr) MSVCR120__fdtest @ cdecl _fflush_nolock(ptr) MSVCRT__fflush_nolock @@ -1392,7 +1392,7 @@ @ cdecl _jn(long double) MSVCRT__jn @ cdecl _kbhit() @ cdecl _ldclass(double) MSVCR120__ldclass -@ stub _ldpcomp +@ cdecl _ldpcomp(double double) MSVCR120__dpcomp @ cdecl _ldsign(double) MSVCR120__dsign @ cdecl _ldtest(ptr) MSVCR120__ldtest @ cdecl _lfind(ptr ptr ptr long ptr) diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 330c6b1..708fada 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -28,6 +28,20 @@
#include <locale.h>
+static inline float __port_infinity(void) +{ + static const unsigned __inf_bytes = 0x7f800000; + return *(const float *)&__inf_bytes; +} +#define INFINITY __port_infinity() + +static inline float __port_nan(void) +{ + static const unsigned __nan_bytes = 0x7fc00000; + return *(const float *)&__nan_bytes; +} +#define NAN __port_nan() + struct MSVCRT_lconv { char* decimal_point; @@ -63,6 +77,7 @@ static struct MSVCRT_lconv* (CDECL *p_localeconv)(void); static size_t (CDECL *p_wcstombs_s)(size_t *ret, char* dest, size_t sz, const wchar_t* src, size_t max); static int (CDECL *p__dsign)(double); static int (CDECL *p__fdsign)(float); +static int (__cdecl *p__dpcomp)(double x, double y); static wchar_t** (CDECL *p____lc_locale_name_func)(void); static unsigned int (CDECL *p__GetConcurrency)(void);
@@ -82,6 +97,7 @@ static BOOL init(void) p_wcstombs_s = (void*)GetProcAddress(module, "wcstombs_s"); p__dsign = (void*)GetProcAddress(module, "_dsign"); p__fdsign = (void*)GetProcAddress(module, "_fdsign"); + p__dpcomp = (void*)GetProcAddress(module, "_dpcomp"); p____lc_locale_name_func = (void*)GetProcAddress(module, "___lc_locale_name_func"); p__GetConcurrency = (void*)GetProcAddress(module,"?_GetConcurrency@details@Concurrency@@YAIXZ"); return TRUE; @@ -175,6 +191,26 @@ static void test__dsign(void) ok(ret == 0x8000, "p_fdsign(-1) = %x\n", ret); }
+static void test__dpcomp(void) +{ + struct { + double x, y; + int ret; + } tests[] = { + {0, 0, 2}, {1, 1, 2}, {-1, -1, 2}, + {-2, -1, 1}, {-1, 1, 1}, {1, 2, 1}, + {1, -1, 4}, {2, 1, 4}, {-1, -2, 4}, + {NAN, NAN, 0}, {NAN, 1, 0}, {1, NAN, 0}, + {INFINITY, INFINITY, 2}, {-1, INFINITY, 1}, {1, INFINITY, 1}, + }; + int i, ret; + + for(i=0; i<sizeof(tests)/sizeof(*tests); i++) { + ret = p__dpcomp(tests[i].x, tests[i].y); + ok(ret == tests[i].ret, "%d) dpcomp(%f, %f) = %x\n", i, tests[i].x, tests[i].y, ret); + } +} + static void test____lc_locale_name_func(void) { struct { @@ -238,6 +274,7 @@ START_TEST(msvcr120) if (!init()) return; test_lconv(); test__dsign(); + test__dpcomp(); test____lc_locale_name_func(); test__GetConcurrency(); } diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index ec18f21..1e4554f 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1049,7 +1049,7 @@ @ cdecl _difftime32(long long) msvcr120._difftime32 @ cdecl _difftime64(long long) msvcr120._difftime64 @ stub _dosmaperr -@ stub _dpcomp +@ cdecl _dpcomp(double double) msvcr120._dpcomp @ cdecl _dsign(double) msvcr120._dsign @ extern _dstbias msvcr120._dstbias @ cdecl _dtest(ptr) msvcr120._dtest @@ -1072,7 +1072,7 @@ @ cdecl _fcvt_s(ptr long double long ptr ptr) msvcr120._fcvt_s @ cdecl _fdclass(float) msvcr120._fdclass @ cdecl _fdopen(long str) msvcr120._fdopen -@ stub _fdpcomp +@ cdecl _fdpcomp(float float) msvcr120._fdpcomp @ cdecl _fdsign(float) msvcr120._fdsign @ cdecl _fdtest(ptr) msvcr120._fdtest @ cdecl _fflush_nolock(ptr) msvcr120._fflush_nolock @@ -1256,7 +1256,7 @@ @ cdecl _j1(double) msvcr120._j1 @ cdecl _jn(long double) msvcr120._jn @ cdecl _ldclass(double) msvcr120._ldclass -@ stub _ldpcomp +@ cdecl _ldpcomp(double double) msvcr120._ldpcomp @ cdecl _ldsign(double) msvcr120._ldsign @ cdecl _ldtest(ptr) msvcr120._ldtest @ cdecl _lfind(ptr ptr ptr long ptr) msvcr120._lfind diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 661a1b4..fc88f03 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -2684,6 +2684,27 @@ int CDECL MSVCR120__dsign(double x) return signbit(x) ? 0x8000 : 0; }
+ +/********************************************************************* + * _dpcomp (MSVCR120.@) + */ +int CDECL MSVCR120__dpcomp(double x, double y) +{ + if(isnan(x) || isnan(y)) + return 0; + + if(x == y) return 2; + return x < y ? 1 : 4; +} + +/********************************************************************* + * _fdpcomp (MSVCR120.@) + */ +int CDECL MSVCR120__fdpcomp(float x, float y) +{ + return MSVCR120__dpcomp(x, y); +} + /********************************************************************* * fminf (MSVCR120.@) */