mirror of
https://github.com/shadergz/cosmic-station.git
synced 2025-02-17 03:57:28 +00:00
EE
: We are finally executing instructions from the cache
This commit is contained in:
parent
3399503ed4
commit
63a2be8634
@ -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];
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user