diff options
author | RSDuck <rsduck@users.noreply.github.com> | 2020-04-25 13:40:51 +0200 |
---|---|---|
committer | RSDuck <rsduck@users.noreply.github.com> | 2020-04-26 13:05:17 +0200 |
commit | 3787bab1f69ae22d3e8106d70598ce923e5efe70 (patch) | |
tree | 33f1f2133832cc75e4d82b0c75c4268441c6c0cf /src/ARMJIT_Internal.h | |
parent | 5d0f244f3c86c2b1c65566bffa3972ae1dbac27b (diff) |
implement block linking + some refactoring
currently only supported for x64
Diffstat (limited to 'src/ARMJIT_Internal.h')
-rw-r--r-- | src/ARMJIT_Internal.h | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/src/ARMJIT_Internal.h b/src/ARMJIT_Internal.h index 0d6add9..66d1808 100644 --- a/src/ARMJIT_Internal.h +++ b/src/ARMJIT_Internal.h @@ -15,7 +15,8 @@ enum { branch_IdleBranch = 1 << 0, branch_FollowCondTaken = 1 << 1, - branch_FollowCondNotTaken = 1 << 2 + branch_FollowCondNotTaken = 1 << 2, + branch_StaticTarget = 1 << 3, }; struct FetchedInstr @@ -76,7 +77,7 @@ struct __attribute__((packed)) TinyVector assert(capacity > Capacity); T* newMem = new T[capacity]; if (Data != NULL) - memcpy(newMem, Data, sizeof(Data) * Length); + memcpy(newMem, Data, sizeof(T) * Length); T* oldData = Data; Data = newMem; @@ -163,7 +164,6 @@ public: u32 NumInstrs; u32 NumAddresses; - u32 NumLinks; JitBlockEntry EntryPoint; @@ -171,6 +171,21 @@ public: { return &Data[0]; } u32* AddressRanges() { return &Data[NumInstrs]; } + u32* Links() + { return &Data[NumInstrs + NumAddresses]; } + + u32 NumLinks() + { return Data.Length - NumInstrs - NumAddresses; } + + void AddLink(u32 link) + { + Data.Add(link); + } + + void ResetLinks() + { + Data.SetLength(NumInstrs + NumAddresses); + } private: /* @@ -200,6 +215,9 @@ extern u8 MemRegion7[0x80000]; void* GetFuncForAddr(ARM* cpu, u32 addr, bool store, int size); +template <u32 Num> +void LinkBlock(ARM* cpu, u32 codeOffset); + } #endif
\ No newline at end of file |