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