EE: We are finally executing instructions from the cache

This commit is contained in:
Gabriel Correia 2024-06-18 22:45:07 -03:00
parent 3399503ed4
commit 63a2be8634
3 changed files with 20 additions and 10 deletions

View File

@ -167,7 +167,7 @@ namespace cosmic::creeper {
}
runFasterBlock(PCs[0], PCs[1]);
executionPipe[0] = cpu->runCycles;
} while (executionPipe[0] != 0);
} while (!executionPipe[0]);
return PCs[0] - PCs[1];
}

View File

@ -78,7 +78,12 @@ namespace cosmic::ee {
lastPc = address;
struct CachedAddress{
u32 base;
bool isBaseValid{};
std::array<u32, 4> nested;
u32 calcBase(u32 addr) const {
return addr & 0xffff'fff0;
}
};
static CachedAddress cached;
@ -90,12 +95,16 @@ namespace cosmic::ee {
runCycles -= 8 / 2;
return mipsRead<u32>(address);
}
if (cached.base == address >> 4) {
if (cached.isBaseValid)
cached.isBaseValid = cached.base == cached.calcBase(address);
if (!cached.isBaseValid) {
cached.nested[0] = cop0.readCache(address).to32(0);
cached.nested[1] = cop0.readCache(address).to32(1);
cached.nested[2] = cop0.readCache(address).to32(2);
cached.nested[3] = cop0.readCache(address).to32(3);
cached.base = address & 0xffff'fff0;
cached.base = cached.calcBase(address);
cached.isBaseValid = true;
}
return cached.nested[(address & 0xf) / 0x4];
}

View File

@ -23,15 +23,16 @@ namespace cosmic::os {
return native;
}
inline u32 to32(u8 lane) {
auto order64{to64(lane >= 2 ? 0 : 1)};
if (lane == 2) lane = 0;
if (lane == 3) lane = 1;
return lane == 0 ?
order64 >> 32 : static_cast<u32>(order64);
switch (lane) {
case 0: return vgetq_lane_u32(native, 0);
case 1: return vgetq_lane_u32(native, 1);
case 2: return vgetq_lane_u32(native, 2);
case 3: return vgetq_lane_u32(native, 3);
}
return {};
}
inline u64 to64(u8 lane) {
auto order{lane == 0 ? vget_high_u64(native) : vget_low_u64(native)};
return vget_lane_u64(order, 0);
return lane == 0 ? vgetq_lane_u64(native, 0) : vgetq_lane_u64(native, 1);
}
template <typename T, u64 lane = 0>
T as() {