diff options
Diffstat (limited to 'src/qcommon')
-rw-r--r-- | src/qcommon/vm_x86.c | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/src/qcommon/vm_x86.c b/src/qcommon/vm_x86.c index 47c8b6c1..e1ba73a0 100644 --- a/src/qcommon/vm_x86.c +++ b/src/qcommon/vm_x86.c @@ -1492,6 +1492,7 @@ This function is called directly by the generated code */ int VM_CallCompiled( vm_t *vm, int *args ) { int stack[1024]; + void *entryPoint; int programCounter; int programStack; int stackOnEntry; @@ -1528,36 +1529,28 @@ int VM_CallCompiled( vm_t *vm, int *args ) { *(int *)&image[ programStack ] = -1; // will terminate the loop on return // off we go into generated code... + entryPoint = vm->codeBase + vm->entryOfs; opStack = &stack; - { #ifdef _MSC_VER - void *entryPoint = vm->codeBase + vm->entryOfs; - - __asm { - pushad - mov esi, programStack - mov edi, opStack - call entryPoint - mov programStack, esi - mov opStack, edi - popad - } + __asm + { + pushad + mov esi, programStack + mov edi, opStack + call entryPoint + mov programStack, esi + mov opStack, edi + popad + } #else - __asm__ volatile( - "pushal\r\n" - "movl %0, %%esi\r\n" - "movl %1, %%edi\r\n" - "call *%2\r\n" - "movl %%edi, %1\r\n" - "movl %%esi, %0\r\n" - "popal\r\n" - : "+g" (programStack), "+g" (opStack) - : "g" (vm->codeBase + vm->entryOfs) - : "cc", "memory" - ); + __asm__ volatile( + "call *%2\r\n" + : "+S" (programStack), "+D" (opStack) + : "r" (vm->codeBase + vm->entryOfs) + : "cc", "memory", "%eax", "%ebx", "%ecx", "%edx" + ); #endif - } if ( opStack != &stack[1] ) { Com_Error( ERR_DROP, "opStack corrupted in compiled code" ); |