diff options
Diffstat (limited to 'Source/Core/Common')
| -rw-r--r-- | Source/Core/Common/Src/ABI.cpp | 18 | ||||
| -rw-r--r-- | Source/Core/Common/Src/x64Emitter.h | 3 |
2 files changed, 20 insertions, 1 deletions
diff --git a/Source/Core/Common/Src/ABI.cpp b/Source/Core/Common/Src/ABI.cpp index 522a8a572a..ba471a336f 100644 --- a/Source/Core/Common/Src/ABI.cpp +++ b/Source/Core/Common/Src/ABI.cpp @@ -66,6 +66,13 @@ void XEmitter::ABI_CallFunction(void *func) { ABI_RestoreStack(0); } +void XEmitter::ABI_CallFunctionC16(void *func, u16 param1) { + ABI_AlignStack(1 * 2); + PUSH(16, Imm16(param1)); + CALL(func); + ABI_RestoreStack(1 * 2); +} + void XEmitter::ABI_CallFunctionC(void *func, u32 param1) { ABI_AlignStack(1 * 4); PUSH(32, Imm32(param1)); @@ -182,7 +189,16 @@ void XEmitter::ABI_RestoreStack(unsigned int frameSize) { // Common functions void XEmitter::ABI_CallFunction(void *func) { - CALL(func); + // Far call + MOV(64, R(RAX), Imm64((u64)func));CALLptr(R(RAX)); + //CALL(func); +} + +void XEmitter::ABI_CallFunctionC16(void *func, u16 param1) { + MOV(16, R(ABI_PARAM1), Imm16(param1)); + // Far call + MOV(64, R(RAX), Imm64((u64)func));CALLptr(R(RAX)); + //CALL(func); } void XEmitter::ABI_CallFunctionC(void *func, u32 param1) { diff --git a/Source/Core/Common/Src/x64Emitter.h b/Source/Core/Common/Src/x64Emitter.h index dd11468580..e4d7013f87 100644 --- a/Source/Core/Common/Src/x64Emitter.h +++ b/Source/Core/Common/Src/x64Emitter.h @@ -590,6 +590,9 @@ public: // The difference between this and CALL is that this aligns the stack // where appropriate. void ABI_CallFunction(void *func); + + void ABI_CallFunctionC16(void *func, u16 param1); + // These only support u32 parameters, but that's enough for a lot of uses. // These will destroy the 1 or 2 first "parameter regs". void ABI_CallFunctionC(void *func, u32 param1); |
