[core/hle/kernel] Remove redundant TLS load/stores, reuse computed segment+address instead (#3932)
Some checks are pending
tx-src / sources (push) Waiting to run
Check Strings / check-strings (push) Waiting to run

While originally for MSVC, this also should help clang/gcc not die trying to make codegen for the load/store of fields for the tls_data

should help to reuse computed values instead of recomputing shit for no reason

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3932
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
This commit is contained in:
lizzie 2026-05-09 05:48:20 +02:00 committed by crueter
parent eec460ec2e
commit 672c21829b
No known key found for this signature in database
GPG key ID: 425ACD2D4830EBC6

View file

@ -372,17 +372,17 @@ struct KernelCore::Impl {
} }
// Gets the dummy KThread for the caller, allocating a new one if this is the first time // Gets the dummy KThread for the caller, allocating a new one if this is the first time
KThread* GetHostDummyThread(KThread* existing_thread) { KThread* GetHostDummyThread(ThreadLocalData& t, KThread* existing_thread) {
if (tls_data.thread == nullptr) { if (t.thread == nullptr) {
auto const initialize{[](KThread* thread) { auto const initialize{[](KThread* thread) {
ASSERT(KThread::InitializeDummyThread(thread, nullptr).IsSuccess()); ASSERT(KThread::InitializeDummyThread(thread, nullptr).IsSuccess());
return thread; return thread;
}}; }};
tls_data.raw_thread.emplace(system.Kernel()); t.raw_thread.emplace(system.Kernel());
tls_data.thread = existing_thread ? existing_thread : initialize(&*tls_data.raw_thread); t.thread = existing_thread ? existing_thread : initialize(&*t.raw_thread);
ASSERT(tls_data.thread != nullptr); ASSERT(t.thread != nullptr);
} }
return tls_data.thread; return t.thread;
} }
/// Registers a CPU core thread by allocating a host thread ID for it /// Registers a CPU core thread by allocating a host thread ID for it
@ -395,7 +395,7 @@ struct KernelCore::Impl {
/// Registers a new host thread by allocating a host thread ID for it /// Registers a new host thread by allocating a host thread ID for it
void RegisterHostThread(KThread* existing_thread) { void RegisterHostThread(KThread* existing_thread) {
(void)GetHostDummyThread(existing_thread); (void)GetHostDummyThread(tls_data, existing_thread);
} }
[[nodiscard]] u32 GetCurrentHostThreadID() { [[nodiscard]] u32 GetCurrentHostThreadID() {
@ -419,9 +419,8 @@ struct KernelCore::Impl {
} }
KThread* GetCurrentEmuThread() { KThread* GetCurrentEmuThread() {
if (!tls_data.current_thread) auto& t = tls_data;
tls_data.current_thread = GetHostDummyThread(nullptr); return t.current_thread ? t.current_thread : (t.current_thread = GetHostDummyThread(t, nullptr));
return tls_data.current_thread;
} }
void SetCurrentEmuThread(KThread* thread) { void SetCurrentEmuThread(KThread* thread) {