aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT_x64/ARMJIT_Linkage.S
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2020-12-04 18:28:15 +0100
committerArisotura <thetotalworm@gmail.com>2020-12-04 18:28:15 +0100
commit129018a6626cbec915ef73484c51c9d07af8e8b9 (patch)
tree8e5712bd241319731f7b6ade3363cefe845e3a5e /src/ARMJIT_x64/ARMJIT_Linkage.S
parent6aad429383015a0ac135b081931ae9c5876a7ad0 (diff)
parent42e083960e52cce31589714dcc7fab8e173efb81 (diff)
Merge remote-tracking branch 'remotes/origin/master' into dsi_camera
Diffstat (limited to 'src/ARMJIT_x64/ARMJIT_Linkage.S')
-rw-r--r--src/ARMJIT_x64/ARMJIT_Linkage.S88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/ARMJIT_x64/ARMJIT_Linkage.S b/src/ARMJIT_x64/ARMJIT_Linkage.S
new file mode 100644
index 0000000..8cc0b5f
--- /dev/null
+++ b/src/ARMJIT_x64/ARMJIT_Linkage.S
@@ -0,0 +1,88 @@
+.intel_syntax noprefix
+
+#include "ARMJIT_Offsets.h"
+
+.text
+
+#define RCPU rbp
+#define RCPSR r15d
+
+#ifdef WIN64
+#define ARG1_REG ecx
+#define ARG2_REG edx
+#define ARG3_REG r8d
+#define ARG4_REG r9d
+#define ARG1_REG64 rcx
+#define ARG2_REG64 rdx
+#define ARG3_REG64 r8
+#define ARG4_REG64 r9
+#else
+#define ARG1_REG edi
+#define ARG2_REG esi
+#define ARG3_REG edx
+#define ARG4_REG ecx
+#define ARG1_REG64 rdi
+#define ARG2_REG64 rsi
+#define ARG3_REG64 rdx
+#define ARG4_REG64 rcx
+#endif
+
+.p2align 4,,15
+
+#ifdef __APPLE__
+.global _ARM_Dispatch
+_ARM_Dispatch:
+#else
+.global ARM_Dispatch
+ARM_Dispatch:
+#endif
+#ifdef WIN64
+ push rdi
+ push rsi
+#endif
+ push rbx
+ push r12
+ push r13
+ push r14
+ push r15
+ push rbp
+
+#ifdef WIN64
+ sub rsp, 0x28
+#else
+ sub rsp, 0x8
+#endif
+ mov RCPU, ARG1_REG64
+ mov RCPSR, [RCPU + ARM_CPSR_offset]
+
+ jmp ARG2_REG64
+
+.p2align 4,,15
+
+#ifdef __APPLE__
+.global _ARM_Ret
+_ARM_Ret:
+#else
+.global ARM_Ret
+ARM_Ret:
+#endif
+ mov [RCPU + ARM_CPSR_offset], RCPSR
+
+#ifdef WIN64
+ add rsp, 0x28
+#else
+ add rsp, 0x8
+#endif
+
+ pop rbp
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop rbx
+#ifdef WIN64
+ pop rsi
+ pop rdi
+#endif
+
+ ret