aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT_x64
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMJIT_x64')
-rw-r--r--src/ARMJIT_x64/ARMJIT_Branch.cpp16
-rw-r--r--src/ARMJIT_x64/ARMJIT_Compiler.cpp24
-rw-r--r--src/ARMJIT_x64/ARMJIT_Compiler.h4
-rw-r--r--src/ARMJIT_x64/ARMJIT_Linkage.S (renamed from src/ARMJIT_x64/ARMJIT_Linkage.s)10
-rw-r--r--src/ARMJIT_x64/ARMJIT_LoadStore.cpp23
5 files changed, 50 insertions, 27 deletions
diff --git a/src/ARMJIT_x64/ARMJIT_Branch.cpp b/src/ARMJIT_x64/ARMJIT_Branch.cpp
index 819fe3c..70ec781 100644
--- a/src/ARMJIT_x64/ARMJIT_Branch.cpp
+++ b/src/ARMJIT_x64/ARMJIT_Branch.cpp
@@ -130,6 +130,16 @@ void Compiler::Comp_JumpTo(u32 addr, bool forceNonConstantCycles)
ADD(32, MDisp(RCPU, offsetof(ARM, Cycles)), Imm8(cycles));
}
+void ARMv4JumpToTrampoline(ARMv4* arm, u32 addr, bool restorecpsr)
+{
+ arm->JumpTo(addr, restorecpsr);
+}
+
+void ARMv5JumpToTrampoline(ARMv5* arm, u32 addr, bool restorecpsr)
+{
+ arm->JumpTo(addr, restorecpsr);
+}
+
void Compiler::Comp_JumpTo(Gen::X64Reg addr, bool restoreCPSR)
{
IrregularCycles = true;
@@ -146,9 +156,9 @@ void Compiler::Comp_JumpTo(Gen::X64Reg addr, bool restoreCPSR)
else
MOV(32, R(ABI_PARAM3), Imm32(true)); // what a waste
if (Num == 0)
- CALL((void*)&ARMv5::JumpTo);
+ CALL((void*)&ARMv5JumpToTrampoline);
else
- CALL((void*)&ARMv4::JumpTo);
+ CALL((void*)&ARMv4JumpToTrampoline);
PopRegs(restoreCPSR);
@@ -269,4 +279,4 @@ void Compiler::T_Comp_BL_Merged()
Comp_JumpTo(target);
}
-} \ No newline at end of file
+}
diff --git a/src/ARMJIT_x64/ARMJIT_Compiler.cpp b/src/ARMJIT_x64/ARMJIT_Compiler.cpp
index c6419c9..cc4ad80 100644
--- a/src/ARMJIT_x64/ARMJIT_Compiler.cpp
+++ b/src/ARMJIT_x64/ARMJIT_Compiler.cpp
@@ -101,6 +101,11 @@ void Compiler::A_Comp_MRS()
MOV(32, rd, R(RCPSR));
}
+void UpdateModeTrampoline(ARM* arm, u32 oldmode, u32 newmode)
+{
+ arm->UpdateMode(oldmode, newmode);
+}
+
void Compiler::A_Comp_MSR()
{
Comp_AddCycles_C();
@@ -185,7 +190,7 @@ void Compiler::A_Comp_MSR()
MOV(32, R(ABI_PARAM3), R(RCPSR));
MOV(32, R(ABI_PARAM2), R(RSCRATCH3));
MOV(64, R(ABI_PARAM1), R(RCPU));
- CALL((void*)&ARM::UpdateMode);
+ CALL((void*)&UpdateModeTrampoline);
PopRegs(true);
}
@@ -216,6 +221,8 @@ Compiler::Compiler()
#ifdef _WIN32
DWORD dummy;
VirtualProtect(pageAligned, alignedSize, PAGE_EXECUTE_READWRITE, &dummy);
+ #elif defined(__APPLE__)
+ pageAligned = (u8*)mmap(NULL, 1024*1024*32, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS ,-1, 0);
#else
mprotect(pageAligned, alignedSize, PROT_EXEC | PROT_READ | PROT_WRITE);
#endif
@@ -340,7 +347,7 @@ Compiler::Compiler()
ABI_PushRegistersAndAdjustStack(CallerSavedPushRegs, 8);
if (consoleType == 0)
{
- switch ((8 << size) | num)
+ switch ((8 << size) | num)
{
case 32: ABI_CallFunction(SlowWrite9<u32, 0>); break;
case 33: ABI_CallFunction(SlowWrite7<u32, 0>); break;
@@ -352,7 +359,7 @@ Compiler::Compiler()
}
else
{
- switch ((8 << size) | num)
+ switch ((8 << size) | num)
{
case 32: ABI_CallFunction(SlowWrite9<u32, 1>); break;
case 33: ABI_CallFunction(SlowWrite7<u32, 1>); break;
@@ -375,7 +382,7 @@ Compiler::Compiler()
ABI_PushRegistersAndAdjustStack(CallerSavedPushRegs, 8);
if (consoleType == 0)
{
- switch ((8 << size) | num)
+ switch ((8 << size) | num)
{
case 32: ABI_CallFunction(SlowRead9<u32, 0>); break;
case 33: ABI_CallFunction(SlowRead7<u32, 0>); break;
@@ -387,7 +394,7 @@ Compiler::Compiler()
}
else
{
- switch ((8 << size) | num)
+ switch ((8 << size) | num)
{
case 32: ABI_CallFunction(SlowRead9<u32, 1>); break;
case 33: ABI_CallFunction(SlowRead7<u32, 1>); break;
@@ -612,9 +619,9 @@ void Compiler::Reset()
LoadStorePatches.clear();
}
-bool Compiler::IsJITFault(u64 addr)
+bool Compiler::IsJITFault(u8* addr)
{
- return addr >= (u64)CodeMemory && addr < (u64)CodeMemory + sizeof(CodeMemory);
+ return (u64)addr >= (u64)ResetStart && (u64)addr < (u64)ResetStart + CodeMemSize;
}
void Compiler::Comp_SpecialBranchBehaviour(bool taken)
@@ -896,5 +903,4 @@ void Compiler::Comp_AddCycles_CD()
else
ConstantCycles += cycles;
}
-
-} \ No newline at end of file
+}
diff --git a/src/ARMJIT_x64/ARMJIT_Compiler.h b/src/ARMJIT_x64/ARMJIT_Compiler.h
index 3e900c3..57aab7b 100644
--- a/src/ARMJIT_x64/ARMJIT_Compiler.h
+++ b/src/ARMJIT_x64/ARMJIT_Compiler.h
@@ -208,9 +208,9 @@ public:
SetCodePtr(FarCode);
}
- bool IsJITFault(u64 addr);
+ bool IsJITFault(u8* addr);
- s32 RewriteMemAccess(u64 pc);
+ u8* RewriteMemAccess(u8* pc);
u8* FarCode;
u8* NearCode;
diff --git a/src/ARMJIT_x64/ARMJIT_Linkage.s b/src/ARMJIT_x64/ARMJIT_Linkage.S
index 0a84df0..8cc0b5f 100644
--- a/src/ARMJIT_x64/ARMJIT_Linkage.s
+++ b/src/ARMJIT_x64/ARMJIT_Linkage.S
@@ -29,8 +29,13 @@
.p2align 4,,15
+#ifdef __APPLE__
+.global _ARM_Dispatch
+_ARM_Dispatch:
+#else
.global ARM_Dispatch
ARM_Dispatch:
+#endif
#ifdef WIN64
push rdi
push rsi
@@ -54,8 +59,13 @@ ARM_Dispatch:
.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
diff --git a/src/ARMJIT_x64/ARMJIT_LoadStore.cpp b/src/ARMJIT_x64/ARMJIT_LoadStore.cpp
index 8b4e8fe..d80b25b 100644
--- a/src/ARMJIT_x64/ARMJIT_LoadStore.cpp
+++ b/src/ARMJIT_x64/ARMJIT_LoadStore.cpp
@@ -15,28 +15,24 @@ int squeezePointer(T* ptr)
return truncated;
}
-s32 Compiler::RewriteMemAccess(u64 pc)
+u8* Compiler::RewriteMemAccess(u8* pc)
{
- auto it = LoadStorePatches.find((u8*)pc);
+ auto it = LoadStorePatches.find(pc);
if (it != LoadStorePatches.end())
{
LoadStorePatch patch = it->second;
LoadStorePatches.erase(it);
- u8* curCodePtr = GetWritableCodePtr();
- u8* rewritePtr = (u8*)pc + (ptrdiff_t)patch.Offset;
- SetCodePtr(rewritePtr);
+ //printf("rewriting memory access %p %d %d\n", (u8*)pc-ResetStart, patch.Offset, patch.Size);
- CALL(patch.PatchFunc);
- u32 remainingSize = patch.Size - (GetWritableCodePtr() - rewritePtr);
+ XEmitter emitter(pc + (ptrdiff_t)patch.Offset);
+ emitter.CALL(patch.PatchFunc);
+ ptrdiff_t remainingSize = (ptrdiff_t)patch.Size - 5;
+ assert(remainingSize >= 0);
if (remainingSize > 0)
- NOP(remainingSize);
+ emitter.NOP(remainingSize);
- //printf("rewriting memory access %p %d %d\n", patch.PatchFunc, patch.Offset, patch.Size);
-
- SetCodePtr(curCodePtr);
-
- return patch.Offset;
+ return pc + (ptrdiff_t)patch.Offset;
}
printf("this is a JIT bug %llx\n", pc);
@@ -192,6 +188,7 @@ void Compiler::Comp_MemAccess(int rd, int rn, const Op2& op2, int size, int flag
u8* memopStart = GetWritableCodePtr();
LoadStorePatch patch;
+ assert(rdMapped.GetSimpleReg() >= 0 && rdMapped.GetSimpleReg() < 16);
patch.PatchFunc = flags & memop_Store
? PatchedStoreFuncs[NDS::ConsoleType][Num][__builtin_ctz(size) - 3][rdMapped.GetSimpleReg()]
: PatchedLoadFuncs[NDS::ConsoleType][Num][__builtin_ctz(size) - 3][!!(flags & memop_SignExtend)][rdMapped.GetSimpleReg()];