Skip to content

Commit f9254e2

Browse files
committed
CPU/CodeCache: Pack state in struct
1 parent df64109 commit f9254e2

7 files changed

Lines changed: 252 additions & 228 deletions

src/core/cpu_code_cache.cpp

Lines changed: 183 additions & 169 deletions
Large diffs are not rendered by default.

src/core/cpu_code_cache_private.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,18 @@ u32 GetHostInstructionCount(const void* start, u32 size);
254254

255255
extern CodeLUTArray g_code_lut;
256256

257-
extern NORETURN_FUNCTION_POINTER void (*g_enter_recompiler)();
258-
extern const void* g_compile_or_revalidate_block;
259-
extern const void* g_run_events_and_dispatch;
260-
extern const void* g_dispatcher;
261-
extern const void* g_block_dispatcher;
262-
extern const void* g_interpret_block;
263-
extern const void* g_discard_and_recompile_block;
257+
struct RecompilerFunctions
258+
{
259+
NORETURN_FUNCTION_POINTER void (*enter_recompiler)();
260+
const void* compile_or_revalidate_block;
261+
const void* run_events_and_dispatch;
262+
const void* dispatcher;
263+
const void* block_dispatcher;
264+
const void* interpret_block;
265+
const void* discard_and_recompile_block;
266+
};
267+
268+
extern RecompilerFunctions g_recompiler_functions;
264269

265270
#ifdef ENABLE_RECOMPILER_PROFILING
266271

src/core/cpu_recompiler_arm32.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
261261
Label dispatch;
262262
Label run_events_and_dispatch;
263263

264-
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>();
264+
g_recompiler_functions.enter_recompiler =
265+
armAsm->GetCursorAddress<decltype(g_recompiler_functions.enter_recompiler)>();
265266
{
266267
// Need the CPU state for basically everything :-)
267268
armMoveAddressToReg(armAsm, RSTATE, &g_state);
@@ -275,15 +276,15 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
275276
armAsm->cmp(RARG1, RARG2);
276277
armAsm->b(lt, &skip_event_check);
277278

278-
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
279+
g_recompiler_functions.run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
279280
armAsm->bind(&run_events_and_dispatch);
280281
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
281282

282283
armAsm->bind(&skip_event_check);
283284
}
284285

285286
// TODO: align?
286-
g_dispatcher = armAsm->GetCursorAddress<const void*>();
287+
g_recompiler_functions.dispatcher = armAsm->GetCursorAddress<const void*>();
287288
{
288289
armAsm->bind(&dispatch);
289290

@@ -299,21 +300,21 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
299300
armAsm->bx(RARG1);
300301
}
301302

302-
g_compile_or_revalidate_block = armAsm->GetCursorAddress<const void*>();
303+
g_recompiler_functions.compile_or_revalidate_block = armAsm->GetCursorAddress<const void*>();
303304
{
304305
armAsm->ldr(RARG1, PTR(&g_state.pc));
305306
armEmitCall(armAsm, reinterpret_cast<const void*>(&CompileOrRevalidateBlock), true);
306307
armAsm->b(&dispatch);
307308
}
308309

309-
g_discard_and_recompile_block = armAsm->GetCursorAddress<const void*>();
310+
g_recompiler_functions.discard_and_recompile_block = armAsm->GetCursorAddress<const void*>();
310311
{
311312
armAsm->ldr(RARG1, PTR(&g_state.pc));
312313
armEmitCall(armAsm, reinterpret_cast<const void*>(&DiscardAndRecompileBlock), true);
313314
armAsm->b(&dispatch);
314315
}
315316

316-
g_interpret_block = armAsm->GetCursorAddress<const void*>();
317+
g_recompiler_functions.interpret_block = armAsm->GetCursorAddress<const void*>();
317318
{
318319
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true);
319320
armAsm->ldr(RARG1, PTR(&g_state.pending_ticks));
@@ -593,7 +594,7 @@ bool foo(const void* a, const void* b)
593594
Label block_unchanged;
594595
armAsm->b(&block_unchanged);
595596
armAsm->bind(&block_changed);
596-
armEmitJmp(armAsm, CodeCache::g_discard_and_recompile_block, false);
597+
armEmitJmp(armAsm, CodeCache::g_recompiler_functions.discard_and_recompile_block, false);
597598
armAsm->bind(&block_unchanged);
598599
}
599600

@@ -749,16 +750,16 @@ void CPU::ARM32Recompiler::EndAndLinkBlock(const std::optional<u32>& newpc, bool
749750
if (cycles > 0)
750751
armAsm->str(RARG1, PTR(&g_state.pending_ticks));
751752
if (do_event_test)
752-
armEmitCondBranch(armAsm, ge, CodeCache::g_run_events_and_dispatch);
753+
armEmitCondBranch(armAsm, ge, CodeCache::g_recompiler_functions.run_events_and_dispatch);
753754

754755
// jump to dispatcher or next block
755756
if (force_run_events)
756757
{
757-
armEmitJmp(armAsm, CodeCache::g_run_events_and_dispatch, false);
758+
armEmitJmp(armAsm, CodeCache::g_recompiler_functions.run_events_and_dispatch, false);
758759
}
759760
else if (!newpc.has_value())
760761
{
761-
armEmitJmp(armAsm, CodeCache::g_dispatcher, false);
762+
armEmitJmp(armAsm, CodeCache::g_recompiler_functions.dispatcher, false);
762763
}
763764
else
764765
{

src/core/cpu_recompiler_arm64.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
455455
Label dispatch;
456456
Label run_events_and_dispatch;
457457

458-
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>();
458+
g_recompiler_functions.enter_recompiler =
459+
armAsm->GetCursorAddress<decltype(g_recompiler_functions.enter_recompiler)>();
459460
{
460461
#ifdef _WIN32
461462
// Frame pointer setup is needed on Windows
@@ -481,13 +482,13 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
481482
armAsm->cmp(RWARG1, RWARG2);
482483
armAsm->b(&dispatch, lt);
483484

484-
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
485+
g_recompiler_functions.run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
485486
armAsm->bind(&run_events_and_dispatch);
486487
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
487488
}
488489

489490
armAlignCode(armAsm, Recompiler::FUNCTION_ALIGNMENT);
490-
g_dispatcher = armAsm->GetCursorAddress<const void*>();
491+
g_recompiler_functions.dispatcher = armAsm->GetCursorAddress<const void*>();
491492
{
492493
armAsm->bind(&dispatch);
493494

@@ -504,23 +505,23 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
504505
}
505506

506507
armAlignCode(armAsm, Recompiler::FUNCTION_ALIGNMENT);
507-
g_compile_or_revalidate_block = armAsm->GetCursorAddress<const void*>();
508+
g_recompiler_functions.compile_or_revalidate_block = armAsm->GetCursorAddress<const void*>();
508509
{
509510
armAsm->ldr(RWARG1, PTR(&g_state.pc));
510511
armEmitCall(armAsm, reinterpret_cast<const void*>(&CompileOrRevalidateBlock), true);
511512
armAsm->b(&dispatch);
512513
}
513514

514515
armAlignCode(armAsm, Recompiler::FUNCTION_ALIGNMENT);
515-
g_discard_and_recompile_block = armAsm->GetCursorAddress<const void*>();
516+
g_recompiler_functions.discard_and_recompile_block = armAsm->GetCursorAddress<const void*>();
516517
{
517518
armAsm->ldr(RWARG1, PTR(&g_state.pc));
518519
armEmitCall(armAsm, reinterpret_cast<const void*>(&DiscardAndRecompileBlock), true);
519520
armAsm->b(&dispatch);
520521
}
521522

522523
armAlignCode(armAsm, Recompiler::FUNCTION_ALIGNMENT);
523-
g_interpret_block = armAsm->GetCursorAddress<const void*>();
524+
g_recompiler_functions.interpret_block = armAsm->GetCursorAddress<const void*>();
524525
{
525526
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true);
526527
armAsm->ldr(RWARG1, PTR(&g_state.pending_ticks));
@@ -780,7 +781,7 @@ void CPU::ARM64Recompiler::GenerateBlockProtectCheck(const u8* ram_ptr, const u8
780781
Label block_unchanged;
781782
armAsm->b(&block_unchanged);
782783
armAsm->bind(&block_changed);
783-
armEmitJmp(armAsm, CodeCache::g_discard_and_recompile_block, false);
784+
armEmitJmp(armAsm, CodeCache::g_recompiler_functions.discard_and_recompile_block, false);
784785
armAsm->bind(&block_unchanged);
785786
}
786787

@@ -925,16 +926,16 @@ void CPU::ARM64Recompiler::EndAndLinkBlock(const std::optional<u32>& newpc, bool
925926
if (cycles > 0)
926927
armAsm->str(RWARG1, PTR(&g_state.pending_ticks));
927928
if (do_event_test)
928-
armEmitCondBranch(armAsm, ge, CodeCache::g_run_events_and_dispatch);
929+
armEmitCondBranch(armAsm, ge, CodeCache::g_recompiler_functions.run_events_and_dispatch);
929930

930931
// jump to dispatcher or next block
931932
if (force_run_events)
932933
{
933-
armEmitJmp(armAsm, CodeCache::g_run_events_and_dispatch, false);
934+
armEmitJmp(armAsm, CodeCache::g_recompiler_functions.run_events_and_dispatch, false);
934935
}
935936
else if (!newpc.has_value())
936937
{
937-
armEmitJmp(armAsm, CodeCache::g_dispatcher, false);
938+
armEmitJmp(armAsm, CodeCache::g_recompiler_functions.dispatcher, false);
938939
}
939940
else
940941
{

src/core/cpu_recompiler_loongarch64.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
212212
lagoon_label_t dispatch = {};
213213
lagoon_label_t run_events_and_dispatch = {};
214214

215-
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(laAsm->cursor);
215+
g_recompiler_functions.enter_recompiler =
216+
reinterpret_cast<decltype(g_recompiler_functions.enter_recompiler)>(laAsm->cursor);
216217
{
217218
// TODO: reserve some space for saving caller-saved registers
218219

@@ -233,15 +234,15 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
233234
la_bltu(laAsm, RARG1, RARG2, la_label(laAsm, &skip_event_check));
234235

235236
la_bind(laAsm, &run_events_and_dispatch);
236-
g_run_events_and_dispatch = laAsm->cursor;
237+
g_recompiler_functions.run_events_and_dispatch = laAsm->cursor;
237238
laEmitCall(laAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents));
238239

239240
la_bind(laAsm, &skip_event_check);
240241
la_label_free(laAsm, &skip_event_check);
241242
}
242243

243244
// TODO: align?
244-
g_dispatcher = laAsm->cursor;
245+
g_recompiler_functions.dispatcher = laAsm->cursor;
245246
{
246247
la_bind(laAsm, &dispatch);
247248

@@ -262,21 +263,21 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
262263
la_jirl(laAsm, LA_ZERO, RARG1, 0);
263264
}
264265

265-
g_compile_or_revalidate_block = laAsm->cursor;
266+
g_recompiler_functions.compile_or_revalidate_block = laAsm->cursor;
266267
{
267268
la_ld_w(laAsm, RARG1, RSTATE, OFFS(&g_state.pc));
268269
laEmitCall(laAsm, reinterpret_cast<const void*>(&CompileOrRevalidateBlock));
269270
la_b(laAsm, la_label(laAsm, &dispatch));
270271
}
271272

272-
g_discard_and_recompile_block = laAsm->cursor;
273+
g_recompiler_functions.discard_and_recompile_block = laAsm->cursor;
273274
{
274275
la_ld_w(laAsm, RARG1, RSTATE, OFFS(&g_state.pc));
275276
laEmitCall(laAsm, reinterpret_cast<const void*>(&DiscardAndRecompileBlock));
276277
la_b(laAsm, la_label(laAsm, &dispatch));
277278
}
278279

279-
g_interpret_block = laAsm->cursor;
280+
g_recompiler_functions.interpret_block = laAsm->cursor;
280281
{
281282
laEmitCall(laAsm, CodeCache::GetInterpretUncachedBlockFunction());
282283
la_ld_w(laAsm, RARG1, RSTATE, OFFS(&g_state.pending_ticks));
@@ -547,7 +548,7 @@ void CPU::LoongArch64Recompiler::GenerateBlockProtectCheck(const u8* ram_ptr, co
547548
lagoon_label_t block_unchanged = {};
548549
la_b(laAsm, la_label(laAsm, &block_unchanged));
549550
la_bind(laAsm, &block_changed);
550-
laEmitJmp(laAsm, CodeCache::g_discard_and_recompile_block);
551+
laEmitJmp(laAsm, CodeCache::g_recompiler_functions.discard_and_recompile_block);
551552
la_bind(laAsm, &block_unchanged);
552553
la_label_free(laAsm, &block_changed);
553554
la_label_free(laAsm, &block_unchanged);
@@ -714,19 +715,19 @@ void CPU::LoongArch64Recompiler::EndAndLinkBlock(const std::optional<u32>& newpc
714715
// TODO: see if we can do a far jump somehow with this..
715716
lagoon_label_t cont = {};
716717
la_blt(laAsm, RARG1, RARG2, la_label(laAsm, &cont));
717-
laEmitJmp(laAsm, CodeCache::g_run_events_and_dispatch);
718+
laEmitJmp(laAsm, CodeCache::g_recompiler_functions.run_events_and_dispatch);
718719
la_bind(laAsm, &cont);
719720
la_label_free(laAsm, &cont);
720721
}
721722

722723
// jump to dispatcher or next block
723724
if (force_run_events)
724725
{
725-
laEmitJmp(laAsm, CodeCache::g_run_events_and_dispatch);
726+
laEmitJmp(laAsm, CodeCache::g_recompiler_functions.run_events_and_dispatch);
726727
}
727728
else if (!newpc.has_value())
728729
{
729-
laEmitJmp(laAsm, CodeCache::g_dispatcher);
730+
laEmitJmp(laAsm, CodeCache::g_recompiler_functions.dispatcher);
730731
}
731732
else
732733
{

src/core/cpu_recompiler_riscv64.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
243243
Label dispatch;
244244
Label run_events_and_dispatch;
245245

246-
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(rvAsm->GetCursorPointer());
246+
g_recompiler_functions.enter_recompiler =
247+
reinterpret_cast<decltype(g_recompiler_functions.enter_recompiler)>(rvAsm->GetCursorPointer());
247248
{
248249
// TODO: reserve some space for saving caller-saved registers
249250

@@ -265,14 +266,14 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
265266
rvAsm->BLTU(RARG1, RARG2, &skip_event_check);
266267

267268
rvAsm->Bind(&run_events_and_dispatch);
268-
g_run_events_and_dispatch = rvAsm->GetCursorPointer();
269+
g_recompiler_functions.run_events_and_dispatch = rvAsm->GetCursorPointer();
269270
rvEmitCall(rvAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents));
270271

271272
rvAsm->Bind(&skip_event_check);
272273
}
273274

274275
// TODO: align?
275-
g_dispatcher = rvAsm->GetCursorPointer();
276+
g_recompiler_functions.dispatcher = rvAsm->GetCursorPointer();
276277
{
277278
rvAsm->Bind(&dispatch);
278279

@@ -293,21 +294,21 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
293294
rvAsm->JR(RARG1);
294295
}
295296

296-
g_compile_or_revalidate_block = rvAsm->GetCursorPointer();
297+
g_recompiler_functions.compile_or_revalidate_block = rvAsm->GetCursorPointer();
297298
{
298299
rvAsm->LW(RARG1, PTR(&g_state.pc));
299300
rvEmitCall(rvAsm, reinterpret_cast<const void*>(&CompileOrRevalidateBlock));
300301
rvAsm->J(&dispatch);
301302
}
302303

303-
g_discard_and_recompile_block = rvAsm->GetCursorPointer();
304+
g_recompiler_functions.discard_and_recompile_block = rvAsm->GetCursorPointer();
304305
{
305306
rvAsm->LW(RARG1, PTR(&g_state.pc));
306307
rvEmitCall(rvAsm, reinterpret_cast<const void*>(&DiscardAndRecompileBlock));
307308
rvAsm->J(&dispatch);
308309
}
309310

310-
g_interpret_block = rvAsm->GetCursorPointer();
311+
g_recompiler_functions.interpret_block = rvAsm->GetCursorPointer();
311312
{
312313
rvEmitCall(rvAsm, CodeCache::GetInterpretUncachedBlockFunction());
313314
rvAsm->LW(RARG1, PTR(&g_state.pending_ticks));
@@ -553,7 +554,7 @@ void CPU::RISCV64Recompiler::GenerateBlockProtectCheck(const u8* ram_ptr, const
553554
Label block_unchanged;
554555
rvAsm->J(&block_unchanged);
555556
rvAsm->Bind(&block_changed);
556-
rvEmitJmp(rvAsm, CodeCache::g_discard_and_recompile_block);
557+
rvEmitJmp(rvAsm, CodeCache::g_recompiler_functions.discard_and_recompile_block);
557558
rvAsm->Bind(&block_unchanged);
558559
}
559560

@@ -716,18 +717,18 @@ void CPU::RISCV64Recompiler::EndAndLinkBlock(const std::optional<u32>& newpc, bo
716717
// TODO: see if we can do a far jump somehow with this..
717718
Label cont;
718719
rvAsm->BLT(RARG1, RARG2, &cont);
719-
rvEmitJmp(rvAsm, CodeCache::g_run_events_and_dispatch);
720+
rvEmitJmp(rvAsm, CodeCache::g_recompiler_functions.run_events_and_dispatch);
720721
rvAsm->Bind(&cont);
721722
}
722723

723724
// jump to dispatcher or next block
724725
if (force_run_events)
725726
{
726-
rvEmitJmp(rvAsm, CodeCache::g_run_events_and_dispatch);
727+
rvEmitJmp(rvAsm, CodeCache::g_recompiler_functions.run_events_and_dispatch);
727728
}
728729
else if (!newpc.has_value())
729730
{
730-
rvEmitJmp(rvAsm, CodeCache::g_dispatcher);
731+
rvEmitJmp(rvAsm, CodeCache::g_recompiler_functions.dispatcher);
731732
}
732733
else
733734
{

0 commit comments

Comments
 (0)