From: Jacek Caban Subject: msvcrt: Added lldiv implementation. Message-Id: <99a9cff6-2f65-b59c-e284-f32957f885c5@codeweavers.com> Date: Mon, 20 Feb 2017 17:43:32 +0100 Signed-off-by: Jacek Caban --- .../api-ms-win-crt-utility-l1-1-0.spec | 2 +- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcrt/math.c | 13 +++++++++++++ dlls/msvcrt/msvcrt.h | 5 +++++ dlls/ucrtbase/tests/misc.c | 17 +++++++++++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 9 files changed, 41 insertions(+), 6 deletions(-) diff --git a/dlls/api-ms-win-crt-utility-l1-1-0/api-ms-win-crt-utility-l1-1-0.spec b/dlls/api-ms-win-crt-utility-l1-1-0/api-ms-win-crt-utility-l1-1-0.spec index 12586d8..fe3d04d 100644 --- a/dlls/api-ms-win-crt-utility-l1-1-0/api-ms-win-crt-utility-l1-1-0.spec +++ b/dlls/api-ms-win-crt-utility-l1-1-0/api-ms-win-crt-utility-l1-1-0.spec @@ -22,7 +22,7 @@ @ cdecl labs(long) ucrtbase.labs @ cdecl ldiv(long long) ucrtbase.ldiv @ cdecl -ret64 llabs(int64) ucrtbase.llabs -@ stub lldiv +@ cdecl lldiv(int64 int64) ucrtbase.lldiv @ cdecl qsort(ptr long long ptr) ucrtbase.qsort @ cdecl qsort_s(ptr long long ptr ptr) ucrtbase.qsort_s @ cdecl rand() ucrtbase.rand diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 258463d..8604767 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1733,7 +1733,7 @@ @ cdecl ldexp(double long) MSVCRT_ldexp @ cdecl ldiv(long long) MSVCRT_ldiv @ cdecl -ret64 llabs(int64) MSVCRT_llabs -@ stub lldiv +@ cdecl lldiv(int64 int64) MSVCRT_lldiv @ cdecl localeconv() MSVCRT_localeconv @ cdecl log(double) MSVCRT_log @ cdecl -arch=arm,x86_64 logf(float) MSVCRT_logf diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index a95b39c..143eccc 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -2091,7 +2091,7 @@ @ cdecl ldexp(double long) MSVCRT_ldexp @ cdecl ldiv(long long) MSVCRT_ldiv @ cdecl -ret64 llabs(int64) MSVCRT_llabs -@ stub lldiv +@ cdecl lldiv(int64 int64) MSVCRT_lldiv @ cdecl localeconv() MSVCRT_localeconv @ cdecl log(double) MSVCRT_log @ cdecl -arch=arm,x86_64 logf(float) MSVCRT_logf diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index db2ae9c..cc38421 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2247,7 +2247,7 @@ @ cdecl lgammaf(float) MSVCR120_lgammaf @ cdecl lgammal(double) MSVCR120_lgammal @ cdecl -ret64 llabs(int64) MSVCRT_llabs -@ stub lldiv +@ cdecl lldiv(int64 int64) MSVCRT_lldiv @ cdecl -ret64 llrint(double) MSVCR120_llrint @ cdecl -ret64 llrintf(float) MSVCR120_llrintf @ cdecl -ret64 llrintl(double) MSVCR120_llrintl diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 849e135..90fdd97 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1910,7 +1910,7 @@ @ cdecl lgammaf(float) msvcr120.lgammaf @ cdecl lgammal(double) msvcr120.lgammal @ cdecl -ret64 llabs(int64) msvcr120.llabs -@ stub lldiv +@ cdecl lldiv(int64 int64) msvcr120.lldiv @ cdecl -ret64 llrint(double) msvcr120.llrint @ cdecl -ret64 llrintf(float) msvcr120.llrintf @ cdecl -ret64 llrintl(double) msvcr120.llrintl diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 857561b..af3aa2a 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -1844,6 +1844,19 @@ 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__ /********************************************************************* diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 71d80c9..1a2c750 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -448,6 +448,11 @@ typedef struct MSVCRT__ldiv_t { MSVCRT_long rem; /* remainder */ } MSVCRT_ldiv_t; +typedef struct MSVCRT__lldiv_t { + MSVCRT_longlong quot; /* quotient */ + MSVCRT_longlong rem; /* remainder */ +} MSVCRT_lldiv_t; + struct MSVCRT__heapinfo { int* _pentry; MSVCRT_size_t _size; diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c index d8075cc..5f1d2a1 100644 --- a/dlls/ucrtbase/tests/misc.c +++ b/dlls/ucrtbase/tests/misc.c @@ -67,6 +67,11 @@ typedef struct MSVCRT__onexit_table_t MSVCRT__onexit_t *_end; } MSVCRT__onexit_table_t; +typedef struct MSVCRT__lldiv_t { + LONGLONG quot; /* quotient */ + LONGLONG rem; /* remainder */ +} MSVCRT_lldiv_t; + static int (CDECL *p_initialize_onexit_table)(MSVCRT__onexit_table_t *table); static int (CDECL *p_register_onexit_function)(MSVCRT__onexit_table_t *table, MSVCRT__onexit_t func); static int (CDECL *p_execute_onexit_table)(MSVCRT__onexit_table_t *table); @@ -80,6 +85,7 @@ static int (CDECL *p__ltoa_s)(LONG, char*, size_t, int); static char* (CDECL *p__get_narrow_winmain_command_line)(void); static int (CDECL *p_sopen_dispatch)(const char *, int, int, int, int *, int); static int (CDECL *p_sopen_s)(int *, const char *, int, int, int); +static MSVCRT_lldiv_t (CDECL *p_lldiv)(LONGLONG,LONGLONG); static void test__initialize_onexit_table(void) { @@ -373,6 +379,7 @@ static BOOL init(void) p__get_narrow_winmain_command_line = (void*)GetProcAddress(GetModuleHandleA("ucrtbase.dll"), "_get_narrow_winmain_command_line"); p_sopen_dispatch = (void*)GetProcAddress(module, "_sopen_dispatch"); p_sopen_s = (void*)GetProcAddress(module, "_sopen_s"); + p_lldiv = (void*)GetProcAddress(module, "lldiv"); return TRUE; } @@ -444,6 +451,15 @@ static void test__sopen_s(void) free(tempf); } +static void test_lldiv(void) +{ + MSVCRT_lldiv_t r; + + r = p_lldiv((LONGLONG)0x111 << 32 | 0x222, (LONGLONG)1 << 32); + ok(r.quot == 0x111, "quot = %x%08x\n", (INT32)(r.quot >> 32), (UINT32)r.quot); + ok(r.rem == 0x222, "rem = %x%08x\n", (INT32)(r.rem >> 32), (UINT32)r.rem); +} + START_TEST(misc) { int arg_c; @@ -466,4 +482,5 @@ START_TEST(misc) test__get_narrow_winmain_command_line(arg_v[0]); test__sopen_dispatch(); test__sopen_s(); + test_lldiv(); } diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 5c97d8b..2f733c3 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -2381,7 +2381,7 @@ @ cdecl lgammaf(float) MSVCR120_lgammaf @ cdecl lgammal(double) MSVCR120_lgammal @ cdecl -ret64 llabs(int64) MSVCRT_llabs -@ stub lldiv +@ cdecl lldiv(int64 int64) MSVCRT_lldiv @ cdecl -ret64 llrint(double) MSVCR120_llrint @ cdecl -ret64 llrintf(float) MSVCR120_llrintf @ cdecl -ret64 llrintl(double) MSVCR120_llrintl