Jacek Caban : msvcrt: Added lldiv implementation.
Alexandre Julliard
julliard at winehq.org
Thu Jul 20 12:11:29 CDT 2017
Module: wine
Branch: stable
Commit: 03c8736d32f6ad2a820c097933f662d7e10b0bd3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=03c8736d32f6ad2a820c097933f662d7e10b0bd3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Feb 20 17:43:32 2017 +0100
msvcrt: Added lldiv implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 60c98caa94465799d0868b69149bce29cf767de4)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
.../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 7f0ad2d..a4c944b 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 229bb7a..a73f18d 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 30c7479..f98c25b 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 91a4785..0a7d3e4 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 437aa15..323ed2c 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -1863,6 +1863,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 058f999..3caa43c 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 cc82022..dcc11a4 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;
}
@@ -448,6 +455,15 @@ todo_wine {
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;
@@ -470,4 +486,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 2239f03..5da253b 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
More information about the wine-cvs
mailing list