msvcr120: Add _dpcomp implementation.
Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
625801ed7e
commit
4083af404b
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.@)
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue