summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Src/ABI.cpp
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2008-07-31 20:22:35 +0000
committerhrydgard <hrydgard@gmail.com>2008-07-31 20:22:35 +0000
commitd8fa3113ea34508dca2fc0acb0ae37d870235c3d (patch)
treeb101bbb69886fe1dccc835d5a44769664ba5de1f /Source/Core/Common/Src/ABI.cpp
parent60ac064e0cac7dc814d07eed4c7f03911c9aeb3c (diff)
Cleanup, preparations for Linux/Mac JIT (not yet working)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@114 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/Common/Src/ABI.cpp')
-rw-r--r--Source/Core/Common/Src/ABI.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/Source/Core/Common/Src/ABI.cpp b/Source/Core/Common/Src/ABI.cpp
new file mode 100644
index 0000000000..c182f5e0cb
--- /dev/null
+++ b/Source/Core/Common/Src/ABI.cpp
@@ -0,0 +1,111 @@
+#include "Common.h"
+#include "x64Emitter.h"
+#include "ABI.h"
+
+using namespace Gen;
+
+#ifdef _M_IX86 // All32
+
+// Shared code between Win32 and Unix32
+// ====================================
+
+void ABI_CallFunctionC(void *func, u32 param1) {
+ PUSH(32, Imm32(param1));
+ CALL(func);
+ ADD(32, R(ESP), Imm8(4));
+}
+
+void ABI_CallFunctionCC(void *func, u32 param1, u32 param2) {
+ PUSH(32, Imm32(param2));
+ PUSH(32, Imm32(param1));
+ CALL(func);
+ ADD(32, R(ESP), Imm8(8));
+}
+
+// Pass a register as a paremeter.
+void ABI_CallFunctionR(void *func, X64Reg reg1) {
+ PUSH(32, R(reg1));
+ CALL(func);
+ ADD(32, R(ESP), Imm8(4));
+}
+
+void ABI_PushAllCalleeSavedRegsAndAdjustStack() {
+ PUSH(EBP);
+ PUSH(EBX);
+ PUSH(ESI);
+ PUSH(EDI);
+}
+
+void ABI_PopAllCalleeSavedRegsAndAdjustStack() {
+ POP(EDI);
+ POP(ESI);
+ POP(EBX);
+ POP(EBP);
+}
+
+#else
+
+// Shared code between Win64 and Unix64
+// ====================================
+
+void ABI_CallFunctionC(void *func, u32 param1) {
+ MOV(32, R(ABI_PARAM1), Imm32(param1));
+ CALL(func);
+}
+
+void ABI_CallFunctionCC(void *func, u32 param1, u32 param2) {
+ MOV(32, R(ABI_PARAM1), Imm32(param1));
+ MOV(32, R(ABI_PARAM2), Imm32(param2));
+ CALL(func);
+}
+
+// Pass a register as a paremeter.
+void ABI_CallFunctionR(void *func, X64Reg reg1) {
+ if (reg1 != ABI_PARAM1)
+ MOV(32, R(ABI_PARAM1), R(reg1));
+ CALL(func);
+}
+
+#ifdef _WIN32
+// Win64 Specific Code
+// ====================================
+void ABI_PushAllCalleeSavedRegsAndAdjustStack() {
+ //we only want to do this once
+ PUSH(RBX);
+ PUSH(RSI);
+ PUSH(RDI);
+ PUSH(RBP);
+ PUSH(R12);
+ PUSH(R13);
+ PUSH(R14);
+ PUSH(R15);
+ //TODO: Also preserve XMM0-3?
+ SUB(64, R(RSP), Imm8(0x20));
+}
+
+void ABI_PopAllCalleeSavedRegsAndAdjustStack() {
+ ADD(64, R(RSP), Imm8(0x20));
+ POP(R15);
+ POP(R14);
+ POP(R13);
+ POP(R12);
+ POP(RBP);
+ POP(RDI);
+ POP(RSI);
+ POP(RBX);
+}
+
+#else
+// Unix64 Specific Code
+// ====================================
+void ABI_PushAllCalleeSavedRegsAndAdjustStack() {
+
+}
+
+void ABI_PopAllCalleeSavedRegsAndAdjustStack() {
+
+}
+
+#endif
+
+#endif \ No newline at end of file