pcsx2/x86/aVUzerorec.S
zerofrog df521ae24f 0.9.4 release
git-svn-id: http://pcsx2.googlecode.com/svn/branches/pcsx2_0.9.4@186 96395faa-99c1-11dd-bbfe-3dabce05a288
2007-11-11 02:55:00 +00:00

155 lines
No EOL
3 KiB
ArmAsm

// iR3000A.c assembly routines
// zerofrog(@gmail.com)
.intel_syntax
.extern svudispfntemp
.extern s_TotalVUCycles
.extern s_callstack
.extern s_vu1esp
.extern s_writeQ
.extern s_writeP
.extern g_curdebugvu
.extern SuperVUGetProgram
.extern SuperVUCleanupProgram
.extern g_sseVUMXCSR
.extern g_sseMXCSR
// SuperVUExecuteProgram(u32 startpc, int vuindex)
.globl SuperVUExecuteProgram
SuperVUExecuteProgram:
#ifdef __x86_64__
mov %rax, [%rsp]
mov dword ptr [s_TotalVUCycles], 0
add %rsp, 8
mov [s_callstack], %rax
call SuperVUGetProgram
push %rbp
push %rbx
push %r12
push %r13
push %r14
push %r15
// function arguments
push %rdi
push %rsi
#ifdef _DEBUG
mov s_vu1esp, %rsp
#endif
ldmxcsr g_sseVUMXCSR
mov dword ptr [s_writeQ], 0xffffffff
mov dword ptr [s_writeP], 0xffffffff
jmp %rax
#else
mov %eax, [%esp]
mov dword ptr s_TotalVUCycles, 0
add %esp, 4
mov dword ptr [s_callstack], %eax
call SuperVUGetProgram
mov s_vu1ebp, %ebp
mov s_vu1esi, %esi
mov s_vuedi, %edi
mov s_vuebx, %ebx
#ifdef _DEBUG
mov s_vu1esp, %esp
#endif
ldmxcsr g_sseVUMXCSR
mov dword ptr s_writeQ, 0xffffffff
mov dword ptr s_writeP, 0xffffffff
jmp %eax
#endif // __x86_64__
.globl SuperVUEndProgram
SuperVUEndProgram:
// restore cpu state
ldmxcsr g_sseMXCSR
#ifdef __x86_64__
#ifdef _DEBUG
sub s_vu1esp, %rsp
#endif
// function arguments for SuperVUCleanupProgram
pop %rsi
pop %rdi
pop %r15
pop %r14
pop %r13
pop %r12
pop %rbx
pop %rbp
#else
mov %ebp, s_vu1ebp
mov %esi, s_vu1esi
mov %edi, s_vuedi
mov %ebx, s_vuebx
#ifdef _DEBUG
sub s_vu1esp, %esp
#endif
#endif
call SuperVUCleanupProgram
jmp [s_callstack] // so returns correctly
.globl svudispfn
svudispfn:
#ifdef __x86_64__
mov [g_curdebugvu], %rax
push %rax
push %rcx
push %rdx
push %rbp
push %rsi
push %rdi
push %rbx
push %r8
push %r9
push %r10
push %r11
push %r12
push %r13
push %r14
push %r15
call svudispfntemp
pop %r15
pop %r14
pop %r13
pop %r12
pop %r11
pop %r10
pop %r9
pop %r8
pop %rbx
pop %rdi
pop %rsi
pop %rbp
pop %rdx
pop %rcx
pop %rax
#else
mov [g_curdebugvu], %eax
mov s_saveecx, %ecx
mov s_saveedx, %edx
mov s_saveebx, %ebx
mov s_saveesi, %esi
mov s_saveedi, %edi
mov s_saveebp, %ebp
call svudispfntemp
mov %ecx, s_saveecx
mov %edx, s_saveedx
mov %ebx, s_saveebx
mov %esi, s_saveesi
mov %edi, s_saveedi
mov %ebp, s_saveebp
#endif
ret