Hello David, thanks for the patch! I have a few comments and questions inlined. On 2/16/22 19:54, David Koller wrote:
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)
Does it even make sense to make these unions? Can we just make the relevant members 64-bit? Alternatively, should these be stored separately from the 32-bit versions? Tests showing what happens if you mix and match 32-bit and 64-bit calls might be helpful.
@@ -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); + } +} +
Could we share any (or all) of this code with the 32-bit version?