mirror of
https://github.com/PCSX2/pcsx2.git
synced 2025-04-02 10:52:54 -04:00
git-svn-id: http://pcsx2.googlecode.com/svn/branches/pcsx2_0.9.4@186 96395faa-99c1-11dd-bbfe-3dabce05a288
155 lines
No EOL
3 KiB
ArmAsm
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 |