Browse Source

[core/hle/kernel] Remove redundant TLS load/stores, reuse computed segment+address instead (#3932)

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>
pull/3941/head
lizzie 2 weeks ago
committed by crueter
parent
commit
672c21829b
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 19
      src/core/hle/kernel/kernel.cpp

19
src/core/hle/kernel/kernel.cpp

@ -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) {
if (tls_data.thread == nullptr) {
KThread* GetHostDummyThread(ThreadLocalData& t, KThread* existing_thread) {
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());
tls_data.thread = existing_thread ? existing_thread : initialize(&*tls_data.raw_thread);
ASSERT(tls_data.thread != nullptr);
t.raw_thread.emplace(system.Kernel());
t.thread = existing_thread ? existing_thread : initialize(&*t.raw_thread);
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)
tls_data.current_thread = GetHostDummyThread(nullptr);
return tls_data.current_thread;
auto& t = tls_data;
return t.current_thread ? t.current_thread : (t.current_thread = GetHostDummyThread(t, nullptr));
} }
void SetCurrentEmuThread(KThread* thread) { void SetCurrentEmuThread(KThread* thread) {

Loading…
Cancel
Save