aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT_Internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMJIT_Internal.h')
-rw-r--r--src/ARMJIT_Internal.h150
1 files changed, 6 insertions, 144 deletions
diff --git a/src/ARMJIT_Internal.h b/src/ARMJIT_Internal.h
index fb80307..7a8eb6b 100644
--- a/src/ARMJIT_Internal.h
+++ b/src/ARMJIT_Internal.h
@@ -24,8 +24,12 @@
#include <string.h>
#include <assert.h>
-#include "ARMJIT.h"
-#include "ARMJIT_Memory.h"
+#include "ARM_InstrInfo.h"
+#include "JitBlock.h"
+#include "TinyVector.h"
+
+class ARM;
+class ARMv5;
// here lands everything which doesn't fit into ARMJIT.h
// where it would be included by pretty much everything
@@ -69,139 +73,6 @@ struct FetchedInstr
ARMInstrInfo::Info Info;
};
-/*
- TinyVector
- - because reinventing the wheel is the best!
-
- - meant to be used very often, with not so many elements
- max 1 << 16 elements
- - doesn't allocate while no elements are inserted
- - not stl confirmant of course
- - probably only works with POD types
- - remove operations don't preserve order, but O(1)!
-*/
-template <typename T>
-struct __attribute__((packed)) TinyVector
-{
- T* Data = NULL;
- u16 Capacity = 0;
- u16 Length = 0;
-
- ~TinyVector()
- {
- delete[] Data;
- }
-
- void MakeCapacity(u32 capacity)
- {
- assert(capacity <= UINT16_MAX);
- assert(capacity > Capacity);
- T* newMem = new T[capacity];
- if (Data != NULL)
- memcpy(newMem, Data, sizeof(T) * Length);
-
- T* oldData = Data;
- Data = newMem;
- if (oldData != NULL)
- delete[] oldData;
-
- Capacity = capacity;
- }
-
- void SetLength(u16 length)
- {
- if (Capacity < length)
- MakeCapacity(length);
-
- Length = length;
- }
-
- void Clear()
- {
- Length = 0;
- }
-
- void Add(T element)
- {
- assert(Length + 1 <= UINT16_MAX);
- if (Length + 1 > Capacity)
- MakeCapacity(((Capacity + 4) * 3) / 2);
-
- Data[Length++] = element;
- }
-
- void Remove(int index)
- {
- assert(Length > 0);
- assert(index >= 0 && index < Length);
-
- Length--;
- Data[index] = Data[Length];
- /*for (int i = index; i < Length; i++)
- Data[i] = Data[i + 1];*/
- }
-
- int Find(T needle)
- {
- for (int i = 0; i < Length; i++)
- {
- if (Data[i] == needle)
- return i;
- }
- return -1;
- }
-
- bool RemoveByValue(T needle)
- {
- for (int i = 0; i < Length; i++)
- {
- if (Data[i] == needle)
- {
- Remove(i);
- return true;
- }
- }
- return false;
- }
-
- T& operator[](int index)
- {
- assert(index >= 0 && index < Length);
- return Data[index];
- }
-};
-
-class JitBlock
-{
-public:
- JitBlock(u32 num, u32 literalHash, u32 numAddresses, u32 numLiterals)
- {
- Num = num;
- NumAddresses = numAddresses;
- NumLiterals = numLiterals;
- Data.SetLength(numAddresses * 2 + numLiterals);
- }
-
- u32 StartAddr;
- u32 StartAddrLocal;
- u32 InstrHash, LiteralHash;
- u8 Num;
- u16 NumAddresses;
- u16 NumLiterals;
-
- JitBlockEntry EntryPoint;
-
- u32* AddressRanges()
- { return &Data[0]; }
- u32* AddressMasks()
- { return &Data[NumAddresses]; }
- u32* Literals()
- { return &Data[NumAddresses * 2]; }
-
-private:
- TinyVector<u32> Data;
-};
-
// size should be 16 bytes because I'm to lazy to use mul and whatnot
struct __attribute__((packed)) AddressRange
{
@@ -214,10 +85,6 @@ typedef void (*InterpreterFunc)(ARM* cpu);
extern InterpreterFunc InterpretARM[];
extern InterpreterFunc InterpretTHUMB[];
-extern TinyVector<u32> InvalidLiterals;
-
-extern AddressRange* const CodeMemRegions[ARMJIT_Memory::memregions_Count];
-
inline bool PageContainsCode(AddressRange* range)
{
for (int i = 0; i < 8; i++)
@@ -228,11 +95,6 @@ inline bool PageContainsCode(AddressRange* range)
return false;
}
-u32 LocaliseCodeAddress(u32 num, u32 addr);
-
-template <u32 Num>
-void LinkBlock(ARM* cpu, u32 codeOffset);
-
template <typename T, int ConsoleType> T SlowRead9(u32 addr, ARMv5* cpu);
template <typename T, int ConsoleType> void SlowWrite9(u32 addr, ARMv5* cpu, u32 val);
template <typename T, int ConsoleType> T SlowRead7(u32 addr);