Dan Kegel dank@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.