[PATCH v2 1/3] vcomp: Implement _vcomp_for_dynamic_init_i8()

David Koller dk at cs.stanford.edu
Wed Feb 16 19:54:06 CST 2022


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52012
Signed-off-by: David Koller <dk at cs.stanford.edu>
---
 dlls/vcomp/main.c           | 103 +++++++++++++++++++++++++++++++++---
 dlls/vcomp/vcomp.spec       |   2 +-
 dlls/vcomp100/vcomp100.spec |   2 +-
 dlls/vcomp110/vcomp110.spec |   2 +-
 dlls/vcomp120/vcomp120.spec |   2 +-
 dlls/vcomp140/vcomp140.spec |   2 +-
 dlls/vcomp90/vcomp90.spec   |   2 +-
 7 files changed, 102 insertions(+), 13 deletions(-)

diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index c4f2572c86a..91c16714ea6 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -81,8 +81,14 @@ struct vcomp_thread_data
     /* dynamic */
     unsigned int            dynamic;
     unsigned int            dynamic_type;
-    unsigned int            dynamic_begin;
-    unsigned int            dynamic_end;
+    union {
+        unsigned int        dynamic_begin;
+        ULONG64             dynamic_begin_i8;
+    };
+    union {
+        unsigned int        dynamic_end;
+        ULONG64             dynamic_end_i8;
+    };
 };
 
 struct vcomp_team_data
@@ -113,11 +119,22 @@ struct vcomp_task_data
 
     /* dynamic */
     unsigned int            dynamic;
-    unsigned int            dynamic_first;
-    unsigned int            dynamic_last;
-    unsigned int            dynamic_iterations;
-    int                     dynamic_step;
-    unsigned int            dynamic_chunksize;
+    union {
+        struct {
+            unsigned int    dynamic_first;
+            unsigned int    dynamic_last;
+            unsigned int    dynamic_iterations;
+            int             dynamic_step;
+            unsigned int    dynamic_chunksize;
+        };
+        struct {
+            ULONG64         dynamic_first_i8;
+            ULONG64         dynamic_last_i8;
+            ULONG64         dynamic_iterations_i8;
+            LONG64          dynamic_step_i8;
+            ULONG64         dynamic_chunksize_i8;
+        };
+    };
 };
 
 static void **ptr_from_va_list(va_list valist)
@@ -1483,6 +1500,78 @@ void CDECL _vcomp_for_dynamic_init(unsigned int flags, unsigned int first, unsig
     }
 }
 
+void CDECL _vcomp_for_dynamic_init_i8(unsigned int flags, ULONG64 first, ULONG64 last,
+                                      LONG64 step, ULONG64 chunksize)
+{
+    ULONG64 iterations, per_thread, remaining;
+    struct vcomp_thread_data *thread_data = vcomp_init_thread_data();
+    struct vcomp_team_data *team_data = thread_data->team;
+    struct vcomp_task_data *task_data = thread_data->task;
+    int num_threads = team_data ? team_data->num_threads : 1;
+    int thread_num = thread_data->thread_num;
+    unsigned int type = flags & ~VCOMP_DYNAMIC_FLAGS_INCREMENT;
+
+    TRACE("(%u, %s, %s, %s, %s)\n", flags, wine_dbgstr_longlong(first), wine_dbgstr_longlong(last),
+            wine_dbgstr_longlong(step), wine_dbgstr_longlong(chunksize));
+
+    if (step <= 0)
+    {
+        thread_data->dynamic_type = 0;
+        return;
+    }
+
+    if (flags & VCOMP_DYNAMIC_FLAGS_INCREMENT)
+        iterations = 1 + (last - first) / step;
+    else
+    {
+        iterations = 1 + (first - last) / step;
+        step *= -1;
+    }
+
+    if (type == VCOMP_DYNAMIC_FLAGS_STATIC)
+    {
+        per_thread = iterations / num_threads;
+        remaining  = iterations - per_thread * num_threads;
+
+        if (thread_num < remaining)
+            per_thread++;
+        else if (per_thread)
+            first += remaining * step;
+        else
+        {
+            thread_data->dynamic_type = 0;
+            return;
+        }
+
+        thread_data->dynamic_type      = VCOMP_DYNAMIC_FLAGS_STATIC;
+        thread_data->dynamic_begin_i8  = first + per_thread * thread_num * step;
+        thread_data->dynamic_end_i8    = thread_data->dynamic_begin_i8 + (per_thread - 1) * step;
+    }
+    else
+    {
+        if (type != VCOMP_DYNAMIC_FLAGS_CHUNKED &&
+            type != VCOMP_DYNAMIC_FLAGS_GUIDED)
+        {
+            FIXME("unsupported flags %u\n", flags);
+            type = VCOMP_DYNAMIC_FLAGS_GUIDED;
+        }
+
+        EnterCriticalSection(&vcomp_section);
+        thread_data->dynamic++;
+        thread_data->dynamic_type = type;
+        if ((int)(thread_data->dynamic - task_data->dynamic) > 0)
+        {
+            task_data->dynamic                = thread_data->dynamic;
+            task_data->dynamic_first_i8       = first;
+            task_data->dynamic_last_i8        = last;
+            task_data->dynamic_iterations_i8  = iterations;
+            task_data->dynamic_step_i8        = step;
+            task_data->dynamic_chunksize_i8   = chunksize;
+        }
+        LeaveCriticalSection(&vcomp_section);
+    }
+}
+
 int CDECL _vcomp_for_dynamic_next(unsigned int *begin, unsigned int *end)
 {
     struct vcomp_thread_data *thread_data = vcomp_init_thread_data();
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
index fb67146e058..3b87ee11127 100644
--- a/dlls/vcomp/vcomp.spec
+++ b/dlls/vcomp/vcomp.spec
@@ -56,7 +56,7 @@
 @ cdecl _vcomp_enter_critsect(ptr)
 @ cdecl _vcomp_flush()
 @ cdecl _vcomp_for_dynamic_init(long long long long long)
-@ stub _vcomp_for_dynamic_init_i8
+@ cdecl _vcomp_for_dynamic_init_i8(long int64 int64 int64 int64)
 @ cdecl _vcomp_for_dynamic_next(ptr ptr)
 @ stub _vcomp_for_dynamic_next_i8
 @ cdecl _vcomp_for_static_end()
diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec
index fb67146e058..3b87ee11127 100644
--- a/dlls/vcomp100/vcomp100.spec
+++ b/dlls/vcomp100/vcomp100.spec
@@ -56,7 +56,7 @@
 @ cdecl _vcomp_enter_critsect(ptr)
 @ cdecl _vcomp_flush()
 @ cdecl _vcomp_for_dynamic_init(long long long long long)
-@ stub _vcomp_for_dynamic_init_i8
+@ cdecl _vcomp_for_dynamic_init_i8(long int64 int64 int64 int64)
 @ cdecl _vcomp_for_dynamic_next(ptr ptr)
 @ stub _vcomp_for_dynamic_next_i8
 @ cdecl _vcomp_for_static_end()
diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec
index e1cb8ab9931..9f0d22e273a 100644
--- a/dlls/vcomp110/vcomp110.spec
+++ b/dlls/vcomp110/vcomp110.spec
@@ -57,7 +57,7 @@
 @ cdecl _vcomp_enter_critsect(ptr)
 @ cdecl _vcomp_flush()
 @ cdecl _vcomp_for_dynamic_init(long long long long long)
-@ stub _vcomp_for_dynamic_init_i8
+@ cdecl _vcomp_for_dynamic_init_i8(long int64 int64 int64 int64)
 @ cdecl _vcomp_for_dynamic_next(ptr ptr)
 @ stub _vcomp_for_dynamic_next_i8
 @ cdecl _vcomp_for_static_end()
diff --git a/dlls/vcomp120/vcomp120.spec b/dlls/vcomp120/vcomp120.spec
index e1cb8ab9931..9f0d22e273a 100644
--- a/dlls/vcomp120/vcomp120.spec
+++ b/dlls/vcomp120/vcomp120.spec
@@ -57,7 +57,7 @@
 @ cdecl _vcomp_enter_critsect(ptr)
 @ cdecl _vcomp_flush()
 @ cdecl _vcomp_for_dynamic_init(long long long long long)
-@ stub _vcomp_for_dynamic_init_i8
+@ cdecl _vcomp_for_dynamic_init_i8(long int64 int64 int64 int64)
 @ cdecl _vcomp_for_dynamic_next(ptr ptr)
 @ stub _vcomp_for_dynamic_next_i8
 @ cdecl _vcomp_for_static_end()
diff --git a/dlls/vcomp140/vcomp140.spec b/dlls/vcomp140/vcomp140.spec
index e1cb8ab9931..9f0d22e273a 100644
--- a/dlls/vcomp140/vcomp140.spec
+++ b/dlls/vcomp140/vcomp140.spec
@@ -57,7 +57,7 @@
 @ cdecl _vcomp_enter_critsect(ptr)
 @ cdecl _vcomp_flush()
 @ cdecl _vcomp_for_dynamic_init(long long long long long)
-@ stub _vcomp_for_dynamic_init_i8
+@ cdecl _vcomp_for_dynamic_init_i8(long int64 int64 int64 int64)
 @ cdecl _vcomp_for_dynamic_next(ptr ptr)
 @ stub _vcomp_for_dynamic_next_i8
 @ cdecl _vcomp_for_static_end()
diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec
index 9fac400ea0e..b618896c1f4 100644
--- a/dlls/vcomp90/vcomp90.spec
+++ b/dlls/vcomp90/vcomp90.spec
@@ -56,7 +56,7 @@
 @ cdecl _vcomp_enter_critsect(ptr) vcomp._vcomp_enter_critsect
 @ cdecl _vcomp_flush() vcomp._vcomp_flush
 @ cdecl _vcomp_for_dynamic_init(long long long long long) vcomp._vcomp_for_dynamic_init
-@ stub _vcomp_for_dynamic_init_i8
+@ cdecl _vcomp_for_dynamic_init_i8(long int64 int64 int64 int64) vcomp._vcomp_for_dynamic_init_i8
 @ cdecl _vcomp_for_dynamic_next(ptr ptr) vcomp._vcomp_for_dynamic_next
 @ stub _vcomp_for_dynamic_next_i8
 @ cdecl _vcomp_for_static_end() vcomp._vcomp_for_static_end
-- 
2.25.1




More information about the wine-devel mailing list