aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT_A64/ARMJIT_Compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMJIT_A64/ARMJIT_Compiler.h')
-rw-r--r--src/ARMJIT_A64/ARMJIT_Compiler.h71
1 files changed, 52 insertions, 19 deletions
diff --git a/src/ARMJIT_A64/ARMJIT_Compiler.h b/src/ARMJIT_A64/ARMJIT_Compiler.h
index 5c9ef41..e4ffc63 100644
--- a/src/ARMJIT_A64/ARMJIT_Compiler.h
+++ b/src/ARMJIT_A64/ARMJIT_Compiler.h
@@ -9,6 +9,8 @@
#include "../ARMJIT_Internal.h"
#include "../ARMJIT_RegisterCache.h"
+#include <unordered_map>
+
namespace ARMJIT
{
@@ -64,7 +66,14 @@ struct Op2
};
};
-class Compiler : Arm64Gen::ARM64XEmitter
+struct LoadStorePatch
+{
+ void* PatchFunc;
+ s32 PatchOffset;
+ u32 PatchSize;
+};
+
+class Compiler : public Arm64Gen::ARM64XEmitter
{
public:
typedef void (Compiler::*CompileFunc)();
@@ -72,6 +81,9 @@ public:
Compiler();
~Compiler();
+ void PushRegs(bool saveHiRegs);
+ void PopRegs(bool saveHiRegs);
+
Arm64Gen::ARM64Reg MapReg(int reg)
{
assert(RegCache.Mapping[reg] != Arm64Gen::INVALID_REG);
@@ -89,7 +101,7 @@ public:
void Reset();
- void Comp_AddCycles_C(bool forceNonConst = false);
+ void Comp_AddCycles_C(bool forceNonConstant = false);
void Comp_AddCycles_CI(u32 numI);
void Comp_AddCycles_CI(u32 c, Arm64Gen::ARM64Reg numI, Arm64Gen::ArithOption shift);
void Comp_AddCycles_CD();
@@ -103,6 +115,9 @@ public:
void LoadCPSR();
void SaveCPSR(bool markClean = true);
+ void LoadCycles();
+ void SaveCycles();
+
void Nop() {}
void A_Comp_ALUTriOp();
@@ -111,6 +126,7 @@ public:
void A_Comp_Mul();
void A_Comp_Mul_Long();
+ void A_Comp_Mul_Short();
void A_Comp_Clz();
@@ -122,6 +138,8 @@ public:
void A_Comp_BranchImm();
void A_Comp_BranchXchangeReg();
+ void A_Comp_MRS();
+ void A_Comp_MSR();
void T_Comp_ShiftImm();
void T_Comp_AddSub_();
@@ -168,7 +186,7 @@ public:
void Comp_RegShiftImm(int op, int amount, bool S, Op2& op2, Arm64Gen::ARM64Reg tmp = Arm64Gen::W0);
void Comp_RegShiftReg(int op, bool S, Op2& op2, Arm64Gen::ARM64Reg rs);
- void Comp_MemLoadLiteral(int size, bool signExtend, int rd, u32 addr);
+ bool Comp_MemLoadLiteral(int size, bool signExtend, int rd, u32 addr);
enum
{
memop_Writeback = 1 << 0,
@@ -179,16 +197,33 @@ public:
};
void Comp_MemAccess(int rd, int rn, Op2 offset, int size, int flags);
- void* Gen_MemoryRoutine9(int size, bool store);
-
- void* Gen_MemoryRoutine9Seq(bool store, bool preinc);
- void* Gen_MemoryRoutine7Seq(bool store, bool preinc);
-
// 0 = switch mode, 1 = stay arm, 2 = stay thumb
void* Gen_JumpTo9(int kind);
void* Gen_JumpTo7(int kind);
- void Comp_BranchSpecialBehaviour();
+ void Comp_BranchSpecialBehaviour(bool taken);
+
+ JitBlockEntry AddEntryOffset(u32 offset)
+ {
+ return (JitBlockEntry)(GetRXBase() + offset);
+ }
+
+ u32 SubEntryOffset(JitBlockEntry entry)
+ {
+ return (u8*)entry - GetRXBase();
+ }
+
+ bool IsJITFault(u64 pc);
+ s64 RewriteMemAccess(u64 pc);
+
+ void SwapCodeRegion()
+ {
+ ptrdiff_t offset = GetCodeOffset();
+ SetCodePtrUnsafe(OtherCodeRegion);
+ OtherCodeRegion = offset;
+ }
+
+ ptrdiff_t OtherCodeRegion;
bool Exit;
@@ -202,22 +237,20 @@ public:
BitSet32 SavedRegs;
- u32 JitMemUseableSize;
+ u32 JitMemSecondarySize;
+ u32 JitMemMainSize;
void* ReadBanked, *WriteBanked;
- // [size][store]
- void* MemFunc9[3][2];
- void* MemFunc7[3][2];
-
- // [store][pre increment]
- void* MemFuncsSeq9[2][2];
- // "[code in main ram]
- void* MemFuncsSeq7[2][2];
-
void* JumpToFuncs9[3];
void* JumpToFuncs7[3];
+ std::unordered_map<ptrdiff_t, LoadStorePatch> LoadStorePatches;
+
+ // [Num][Size][Sign Extend][Output register]
+ void* PatchedLoadFuncs[2][3][2][8];
+ void* PatchedStoreFuncs[2][3][8];
+
RegisterCache<Compiler, Arm64Gen::ARM64Reg> RegCache;
bool CPSRDirty = false;