vcomp: better stub for _vcomp_fork

Alexandre Julliard julliard at winehq.org
Thu Sep 13 14:37:15 CDT 2012


Dan Kegel <dank at kegel.com> writes:

> @@ -41,6 +42,80 @@ double CDECL omp_get_wtime(void)
>      return GetTickCount() / 1000.0;
>  }
>  
> +/* Call helper with the ncount args after ncount */
> +extern void WINAPIV _vcomp_fork(DWORD parallel, int ncount, void *helper, ...);
> +#ifdef __i386__
> +__ASM_GLOBAL_FUNC( _vcomp_fork,
> +                   "push %ebp\n\t"
> +                   "movl %esp,%ebp\n\t"
> +
> +                   /* Push varargs */
> +                   "movl 12(%ebp),%ecx\n\t" /* if (nargs > 0) */
> +                   "test %ecx,%ecx\n\t"
> +                   "jz copyend\n\t"
> +                   "leal 20(%ebp),%edx\n\t"      /* dx -> first vararg */
> +                   "leal (%edx,%ecx,4),%edx\n\t" /* dx += nargs * sizeof arg */
> +                   "copyloop:\n\t"               /* while (nargs-- > 0) */
> +                   "sub $4,%edx\n\t"
> +                   "pushl (%edx)\n\t"                /* push next vararg */
> +                   "dec %ecx\n\t"
> +                   "jnz copyloop\n\t"
> +                   "copyend:\n\t"
> +
> +                   /* Call helper and return */
> +                   "call *16(%ebp)\n\t"
> +                   "movl %ebp,%esp\n\t"
> +                   "pop %ebp\n\t"
> +                   "ret\n\t"
> +                 )
> +#endif

There are several places that already implement that sort of thing the
right way, you should copy one of them instead of reinventing the wheel.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list