// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. // Tier-2 SUPERBLOCK V4 150FPS cluster: entity #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" #include "vcs_fast_paths.hpp" #include "vcs_tier2_direct_memory.hpp" #include namespace vcs { using namespace psprecomp; void tier2_superblock_entity(psprecomp::Runtime &rt, psprecomp::AllegrexContext &ctx, psprecomp::GuestMemory::AotFastView &aot_mem, std::uint32_t entry_pc) { tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Entity); auto &tier2_stats = tier2_scope.stats(); Tier2DirectMemoryView tier2_mem(rt.memory().direct_fastmem_base_address()); constexpr std::uint32_t kTier2ReturnCapacity = 32u; std::uint32_t tier2_pending_transfers = 0u; std::uint32_t tier2_return_depth = 0u; std::uint32_t tier2_return_pc[kTier2ReturnCapacity]; std::uint32_t tier2_return_unit[kTier2ReturnCapacity]; std::uint32_t tier2_return_pending_base[kTier2ReturnCapacity]; std::uint32_t tier2_resume_pc = 0u; std::uint32_t tier2_resume_unit = 0u; std::uint32_t jump_target = 0u; std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; std::uint32_t tier2_gpr_4 = ctx.gpr[4]; std::uint32_t tier2_gpr_6 = ctx.gpr[6]; std::uint32_t tier2_gpr_19 = ctx.gpr[19]; std::uint32_t tier2_gpr_17 = ctx.gpr[17]; std::uint32_t tier2_gpr_5 = ctx.gpr[5]; std::uint32_t tier2_gpr_29 = ctx.gpr[29]; bool tier2_gpr_shadow_valid = true; #define TIER2_GPR_SYNC_OUT() do { if (tier2_gpr_shadow_valid) { ctx.gpr[4] = tier2_gpr_4; ctx.gpr[6] = tier2_gpr_6; ctx.gpr[19] = tier2_gpr_19; ctx.gpr[17] = tier2_gpr_17; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[29] = tier2_gpr_29; } } while (false) #define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_6 = ctx.gpr[6]; tier2_gpr_19 = ctx.gpr[19]; tier2_gpr_17 = ctx.gpr[17]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_29 = ctx.gpr[29]; } } while (false) #define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false) auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { TIER2_GPR_SYNC_OUT(); const bool same = rt.tier2_complete_fused_transfers(ctx, count); if (!same) tier2_gpr_shadow_valid = false; return same; }; #define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; TIER2_FUSED_RETURN_DISPATCH: switch (tier2_resume_pc) { case 0x08A65EA0u: goto SB_L_08A65EA0; case 0x08A65EB4u: goto SB_L_08A65EB4; case 0x08A68CBCu: goto SB_L_08A68CBC; case 0x08A68CC4u: goto SB_L_08A68CC4; case 0x08A68CCCu: goto SB_L_08A68CCC; case 0x08A68CD4u: goto SB_L_08A68CD4; case 0x08A68CDCu: goto SB_L_08A68CDC; case 0x08A6E894u: goto SB_L_08A6E894; case 0x08A6E8A4u: goto SB_L_08A6E8A4; case 0x08A6E8E8u: goto SB_L_08A6E8E8; case 0x08A6E8F4u: goto SB_L_08A6E8F4; case 0x08A6E8FCu: goto SB_L_08A6E8FC; case 0x08A6E918u: goto SB_L_08A6E918; case 0x08A6E928u: goto SB_L_08A6E928; case 0x08A6E930u: goto SB_L_08A6E930; case 0x08A6E990u: goto SB_L_08A6E990; case 0x08A6E998u: goto SB_L_08A6E998; case 0x08A6E9A4u: goto SB_L_08A6E9A4; case 0x08A6E9D8u: goto SB_L_08A6E9D8; case 0x08A6E9E0u: goto SB_L_08A6E9E0; case 0x08A6E9FCu: goto SB_L_08A6E9FC; case 0x08A6EA14u: goto SB_L_08A6EA14; case 0x08A6EA30u: goto SB_L_08A6EA30; case 0x08A6EA4Cu: goto SB_L_08A6EA4C; case 0x08A6EA50u: goto SB_L_08A6EA50; case 0x08A6EA60u: goto SB_L_08A6EA60; case 0x08A6EA78u: goto SB_L_08A6EA78; case 0x08A6EA94u: goto SB_L_08A6EA94; case 0x08A6EAACu: goto SB_L_08A6EAAC; case 0x08A6EAC8u: goto SB_L_08A6EAC8; case 0x08A6EAE4u: goto SB_L_08A6EAE4; case 0x08A6EAE8u: goto SB_L_08A6EAE8; case 0x08A6EAF8u: goto SB_L_08A6EAF8; case 0x08A6EB10u: goto SB_L_08A6EB10; case 0x08A6EB2Cu: goto SB_L_08A6EB2C; case 0x08A6EB3Cu: goto SB_L_08A6EB3C; case 0x08A6EB58u: goto SB_L_08A6EB58; case 0x08A6EB64u: goto SB_L_08A6EB64; case 0x08A6EB78u: goto SB_L_08A6EB78; case 0x08A6EB94u: goto SB_L_08A6EB94; case 0x08A6EBB0u: goto SB_L_08A6EBB0; case 0x08A6EBC0u: goto SB_L_08A6EBC0; case 0x08A6EBC8u: goto SB_L_08A6EBC8; case 0x08A6EBD4u: goto SB_L_08A6EBD4; case 0x08A6EBECu: goto SB_L_08A6EBEC; case 0x08A6EBFCu: goto SB_L_08A6EBFC; case 0x08A6EC0Cu: goto SB_L_08A6EC0C; case 0x08A6EC14u: goto SB_L_08A6EC14; case 0x08A6EC1Cu: goto SB_L_08A6EC1C; case 0x08A6EC28u: goto SB_L_08A6EC28; case 0x08A6EC30u: goto SB_L_08A6EC30; case 0x08A6EC40u: goto SB_L_08A6EC40; case 0x08A6EC64u: goto SB_L_08A6EC64; case 0x08A6EC74u: goto SB_L_08A6EC74; case 0x08A6EC90u: goto SB_L_08A6EC90; case 0x08A6ECA0u: goto SB_L_08A6ECA0; case 0x08A6ED04u: goto SB_L_08A6ED04; case 0x08A6ED10u: goto SB_L_08A6ED10; case 0x08A6ED20u: goto SB_L_08A6ED20; case 0x08A6ED2Cu: goto SB_L_08A6ED2C; case 0x08A6ED64u: goto SB_L_08A6ED64; case 0x08A6ED6Cu: goto SB_L_08A6ED6C; case 0x08A6ED7Cu: goto SB_L_08A6ED7C; case 0x08A6ED88u: goto SB_L_08A6ED88; case 0x08A6ED90u: goto SB_L_08A6ED90; case 0x08A71100u: goto SB_L_08A71100; case 0x08A71108u: goto SB_L_08A71108; case 0x08A71110u: goto SB_L_08A71110; case 0x08A71118u: goto SB_L_08A71118; case 0x08A71120u: goto SB_L_08A71120; case 0x08A71128u: goto SB_L_08A71128; case 0x08A71134u: goto SB_L_08A71134; case 0x08A7113Cu: goto SB_L_08A7113C; case 0x08A71144u: goto SB_L_08A71144; case 0x08A7114Cu: goto SB_L_08A7114C; case 0x08A71154u: goto SB_L_08A71154; case 0x08A7115Cu: goto SB_L_08A7115C; case 0x08A71164u: goto SB_L_08A71164; case 0x08A7116Cu: goto SB_L_08A7116C; case 0x08A71178u: goto SB_L_08A71178; case 0x08A71180u: goto SB_L_08A71180; case 0x08A71188u: goto SB_L_08A71188; case 0x08A71190u: goto SB_L_08A71190; case 0x08A71198u: goto SB_L_08A71198; case 0x08A711A0u: goto SB_L_08A711A0; case 0x08A711ACu: goto SB_L_08A711AC; case 0x08A711B4u: goto SB_L_08A711B4; case 0x08A711BCu: goto SB_L_08A711BC; case 0x08A711C4u: goto SB_L_08A711C4; case 0x08A711CCu: goto SB_L_08A711CC; case 0x08A711D4u: goto SB_L_08A711D4; case 0x08A711E0u: goto SB_L_08A711E0; case 0x08A711ECu: goto SB_L_08A711EC; case 0x08A71210u: goto SB_L_08A71210; default: break; } switch (tier2_resume_unit) { default: break; } ctx.pc = tier2_resume_pc; TIER2_SB_RETURN(); TIER2_LOCAL_DISPATCH_U0152: if (tier2_return_depth != 0u && local_pc == tier2_return_pc[tier2_return_depth - 1u]) { tier2_resume_pc = local_pc; tier2_resume_unit = tier2_return_unit[tier2_return_depth - 1u]; // Match invoke_chained_direct(): when the callee has returned, ctx.pc // already contains the caller continuation before any starvation // boundary/accounting can run. A scheduler switch here must never see // the stale callee PC. ctx.pc = local_pc; const std::uint32_t tier2_pending_base = tier2_return_pending_base[tier2_return_depth - 1u]; bool tier2_same_context = true; if (tier2_pending_transfers < tier2_pending_base) { ++tier2_stats.fallbacks; ctx.pc = local_pc; TIER2_SB_RETURN(); } const std::uint32_t tier2_nested_tail = tier2_pending_transfers - tier2_pending_base; if (tier2_nested_tail != 0u) { tier2_pending_transfers = tier2_pending_base; if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; } switch (local_pc) { case 0x08A65EA0u: goto SB_L_08A65EA0; case 0x08A65EB4u: goto SB_L_08A65EB4; default: ctx.pc = local_pc; TIER2_SB_RETURN(); } TIER2_LOCAL_DISPATCH_U0153: if (tier2_return_depth != 0u && local_pc == tier2_return_pc[tier2_return_depth - 1u]) { tier2_resume_pc = local_pc; tier2_resume_unit = tier2_return_unit[tier2_return_depth - 1u]; // Match invoke_chained_direct(): when the callee has returned, ctx.pc // already contains the caller continuation before any starvation // boundary/accounting can run. A scheduler switch here must never see // the stale callee PC. ctx.pc = local_pc; const std::uint32_t tier2_pending_base = tier2_return_pending_base[tier2_return_depth - 1u]; bool tier2_same_context = true; if (tier2_pending_transfers < tier2_pending_base) { ++tier2_stats.fallbacks; ctx.pc = local_pc; TIER2_SB_RETURN(); } const std::uint32_t tier2_nested_tail = tier2_pending_transfers - tier2_pending_base; if (tier2_nested_tail != 0u) { tier2_pending_transfers = tier2_pending_base; if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; } switch (local_pc) { case 0x08A68CBCu: goto SB_L_08A68CBC; case 0x08A68CC4u: goto SB_L_08A68CC4; case 0x08A68CCCu: goto SB_L_08A68CCC; case 0x08A68CD4u: goto SB_L_08A68CD4; case 0x08A68CDCu: goto SB_L_08A68CDC; default: ctx.pc = local_pc; TIER2_SB_RETURN(); } TIER2_LOCAL_DISPATCH_U0154: if (tier2_return_depth != 0u && local_pc == tier2_return_pc[tier2_return_depth - 1u]) { tier2_resume_pc = local_pc; tier2_resume_unit = tier2_return_unit[tier2_return_depth - 1u]; // Match invoke_chained_direct(): when the callee has returned, ctx.pc // already contains the caller continuation before any starvation // boundary/accounting can run. A scheduler switch here must never see // the stale callee PC. ctx.pc = local_pc; const std::uint32_t tier2_pending_base = tier2_return_pending_base[tier2_return_depth - 1u]; bool tier2_same_context = true; if (tier2_pending_transfers < tier2_pending_base) { ++tier2_stats.fallbacks; ctx.pc = local_pc; TIER2_SB_RETURN(); } const std::uint32_t tier2_nested_tail = tier2_pending_transfers - tier2_pending_base; if (tier2_nested_tail != 0u) { tier2_pending_transfers = tier2_pending_base; if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; } switch (local_pc) { case 0x08A6E894u: goto SB_L_08A6E894; case 0x08A6E8A4u: goto SB_L_08A6E8A4; case 0x08A6E8E8u: goto SB_L_08A6E8E8; case 0x08A6E8F4u: goto SB_L_08A6E8F4; case 0x08A6E8FCu: goto SB_L_08A6E8FC; case 0x08A6E918u: goto SB_L_08A6E918; case 0x08A6E928u: goto SB_L_08A6E928; case 0x08A6E930u: goto SB_L_08A6E930; case 0x08A6E990u: goto SB_L_08A6E990; case 0x08A6E998u: goto SB_L_08A6E998; case 0x08A6E9A4u: goto SB_L_08A6E9A4; case 0x08A6E9D8u: goto SB_L_08A6E9D8; case 0x08A6E9E0u: goto SB_L_08A6E9E0; case 0x08A6E9FCu: goto SB_L_08A6E9FC; case 0x08A6EA14u: goto SB_L_08A6EA14; case 0x08A6EA30u: goto SB_L_08A6EA30; case 0x08A6EA4Cu: goto SB_L_08A6EA4C; case 0x08A6EA50u: goto SB_L_08A6EA50; case 0x08A6EA60u: goto SB_L_08A6EA60; case 0x08A6EA78u: goto SB_L_08A6EA78; case 0x08A6EA94u: goto SB_L_08A6EA94; case 0x08A6EAACu: goto SB_L_08A6EAAC; case 0x08A6EAC8u: goto SB_L_08A6EAC8; case 0x08A6EAE4u: goto SB_L_08A6EAE4; case 0x08A6EAE8u: goto SB_L_08A6EAE8; case 0x08A6EAF8u: goto SB_L_08A6EAF8; case 0x08A6EB10u: goto SB_L_08A6EB10; case 0x08A6EB2Cu: goto SB_L_08A6EB2C; case 0x08A6EB3Cu: goto SB_L_08A6EB3C; case 0x08A6EB58u: goto SB_L_08A6EB58; case 0x08A6EB64u: goto SB_L_08A6EB64; case 0x08A6EB78u: goto SB_L_08A6EB78; case 0x08A6EB94u: goto SB_L_08A6EB94; case 0x08A6EBB0u: goto SB_L_08A6EBB0; case 0x08A6EBC0u: goto SB_L_08A6EBC0; case 0x08A6EBC8u: goto SB_L_08A6EBC8; case 0x08A6EBD4u: goto SB_L_08A6EBD4; case 0x08A6EBECu: goto SB_L_08A6EBEC; case 0x08A6EBFCu: goto SB_L_08A6EBFC; case 0x08A6EC0Cu: goto SB_L_08A6EC0C; case 0x08A6EC14u: goto SB_L_08A6EC14; case 0x08A6EC1Cu: goto SB_L_08A6EC1C; case 0x08A6EC28u: goto SB_L_08A6EC28; case 0x08A6EC30u: goto SB_L_08A6EC30; case 0x08A6EC40u: goto SB_L_08A6EC40; case 0x08A6EC64u: goto SB_L_08A6EC64; case 0x08A6EC74u: goto SB_L_08A6EC74; case 0x08A6EC90u: goto SB_L_08A6EC90; case 0x08A6ECA0u: goto SB_L_08A6ECA0; case 0x08A6ED04u: goto SB_L_08A6ED04; case 0x08A6ED10u: goto SB_L_08A6ED10; case 0x08A6ED20u: goto SB_L_08A6ED20; case 0x08A6ED2Cu: goto SB_L_08A6ED2C; case 0x08A6ED64u: goto SB_L_08A6ED64; case 0x08A6ED6Cu: goto SB_L_08A6ED6C; case 0x08A6ED7Cu: goto SB_L_08A6ED7C; case 0x08A6ED88u: goto SB_L_08A6ED88; case 0x08A6ED90u: goto SB_L_08A6ED90; default: ctx.pc = local_pc; TIER2_SB_RETURN(); } TIER2_LOCAL_DISPATCH_U0155: if (tier2_return_depth != 0u && local_pc == tier2_return_pc[tier2_return_depth - 1u]) { tier2_resume_pc = local_pc; tier2_resume_unit = tier2_return_unit[tier2_return_depth - 1u]; // Match invoke_chained_direct(): when the callee has returned, ctx.pc // already contains the caller continuation before any starvation // boundary/accounting can run. A scheduler switch here must never see // the stale callee PC. ctx.pc = local_pc; const std::uint32_t tier2_pending_base = tier2_return_pending_base[tier2_return_depth - 1u]; bool tier2_same_context = true; if (tier2_pending_transfers < tier2_pending_base) { ++tier2_stats.fallbacks; ctx.pc = local_pc; TIER2_SB_RETURN(); } const std::uint32_t tier2_nested_tail = tier2_pending_transfers - tier2_pending_base; if (tier2_nested_tail != 0u) { tier2_pending_transfers = tier2_pending_base; if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; } switch (local_pc) { case 0x08A71100u: goto SB_L_08A71100; case 0x08A71108u: goto SB_L_08A71108; case 0x08A71110u: goto SB_L_08A71110; case 0x08A71118u: goto SB_L_08A71118; case 0x08A71120u: goto SB_L_08A71120; case 0x08A71128u: goto SB_L_08A71128; case 0x08A71134u: goto SB_L_08A71134; case 0x08A7113Cu: goto SB_L_08A7113C; case 0x08A71144u: goto SB_L_08A71144; case 0x08A7114Cu: goto SB_L_08A7114C; case 0x08A71154u: goto SB_L_08A71154; case 0x08A7115Cu: goto SB_L_08A7115C; case 0x08A71164u: goto SB_L_08A71164; case 0x08A7116Cu: goto SB_L_08A7116C; case 0x08A71178u: goto SB_L_08A71178; case 0x08A71180u: goto SB_L_08A71180; case 0x08A71188u: goto SB_L_08A71188; case 0x08A71190u: goto SB_L_08A71190; case 0x08A71198u: goto SB_L_08A71198; case 0x08A711A0u: goto SB_L_08A711A0; case 0x08A711ACu: goto SB_L_08A711AC; case 0x08A711B4u: goto SB_L_08A711B4; case 0x08A711BCu: goto SB_L_08A711BC; case 0x08A711C4u: goto SB_L_08A711C4; case 0x08A711CCu: goto SB_L_08A711CC; case 0x08A711D4u: goto SB_L_08A711D4; case 0x08A711E0u: goto SB_L_08A711E0; case 0x08A711ECu: goto SB_L_08A711EC; case 0x08A71210u: goto SB_L_08A71210; default: ctx.pc = local_pc; TIER2_SB_RETURN(); } TIER2_ENTRY_DISPATCH: switch (entry_pc) { case 0x08A6E894u: goto SB_L_08A6E894; case 0x08A6E8A4u: goto SB_L_08A6E8A4; case 0x08A71100u: goto SB_L_08A71100; case 0x08A711E0u: goto SB_L_08A711E0; case 0x08A711ECu: goto SB_L_08A711EC; default: ctx.pc = entry_pc; ++tier2_stats.fallbacks; TIER2_SB_RETURN(); } // TIER2_GPR_BODY_BEGIN SB_L_08A65EA0: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); ctx.gpr[2] = (tier2_gpr_4 ^ 6u); jump_target = ctx.gpr[31]; ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0152; SB_L_08A65EB4: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); ctx.gpr[2] = (tier2_gpr_4 ^ 8u); jump_target = ctx.gpr[31]; ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0152; SB_L_08A68CBC: jump_target = ctx.gpr[31]; ctx.gpr[2] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(444))); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CC4: jump_target = ctx.gpr[31]; tier2_mem.aot_store32(tier2_gpr_4 + static_cast(444), tier2_gpr_5); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CCC: jump_target = ctx.gpr[31]; ctx.gpr[2] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(448))); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CD4: jump_target = ctx.gpr[31]; ctx.gpr[2] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(2116))); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CDC: jump_target = ctx.gpr[31]; tier2_mem.aot_store32(tier2_gpr_4 + static_cast(2116), tier2_gpr_5); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A6E894: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1600))); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); { const bool branch_taken = tier2_gpr_4 == 0u; tier2_mem.aot_store32(tier2_gpr_29 + static_cast(1576), tier2_gpr_4); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A711ECu>(ctx)) { ctx.pc = 0x08A711ECu; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A711EC; } goto SB_L_08A6E8A4; } SB_L_08A6E8A4: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1576))); tier2_gpr_17 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(8))); tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(1576), tier2_gpr_4); tier2_gpr_5 = (0u | 3u); tier2_gpr_4 = (48972u << 16u); tier2_gpr_4 = (tier2_gpr_4 | 52429u); ctx.fpr[20] = std::bit_cast(tier2_gpr_4); ctx.gpr[8] = (0u | 58u); ctx.gpr[21] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1588))); ctx.gpr[9] = (0u + static_cast(-2)); ctx.gpr[10] = (0u | 311u); tier2_gpr_4 = (16168u << 16u); tier2_gpr_4 = (tier2_gpr_4 | 62915u); { const bool branch_taken = tier2_gpr_19 == tier2_gpr_6; ctx.fpr[12] = std::bit_cast(tier2_gpr_4); if (branch_taken) { goto SB_L_08A6E8F4; } goto SB_L_08A6E8E8; } SB_L_08A6E8E8: tier2_gpr_4 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); { const bool branch_taken = tier2_gpr_17 != tier2_gpr_4; ctx.gpr[23] = (0u | 1u); if (branch_taken) { goto SB_L_08A6E8FC; } goto SB_L_08A6E8F4; } SB_L_08A6E8F4: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A711E0u>(ctx)) { ctx.pc = 0x08A711E0u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A711E0; } goto SB_L_08A6E8FC; } SB_L_08A6E8FC: tier2_gpr_4 = (ctx.gpr[23] | 0u); tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_6 = (tier2_gpr_6 & 512u); tier2_gpr_6 = (0u < tier2_gpr_6 ? 1u : 0u); tier2_gpr_6 = (tier2_gpr_6 & 255u); { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { ctx.pc = 0x08A71100u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A71100; } goto SB_L_08A6E918; } SB_L_08A6E918: tier2_gpr_6 = (tier2_mem.aot_load16(tier2_gpr_17 + static_cast(84))); ctx.gpr[7] = (tier2_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); { const bool branch_taken = tier2_gpr_6 == ctx.gpr[7]; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { ctx.pc = 0x08A71100u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A71100; } goto SB_L_08A6E928; } SB_L_08A6E928: { const bool branch_taken = tier2_gpr_17 == tier2_gpr_19; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { ctx.pc = 0x08A71100u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A71100; } goto SB_L_08A6E930; } SB_L_08A6E930: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_17 + static_cast(86)))))); tier2_gpr_4 = (tier2_gpr_4 << 2u); tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(24))); tier2_gpr_4 = (tier2_gpr_6 + tier2_gpr_4); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(20))); { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(32); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(48); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.write_vfpu_vector_with_destination_prefix_ct<35u, 3u>(vfpu_value); } { float vfpu_value[4]{1.0f, 1.0f, 1.0f, 1.0f}; ctx.write_vfpu_vector_with_destination_prefix_ct<99u, 1u>(vfpu_value); } tier2_gpr_4 = (tier2_gpr_29 + static_cast(32)); { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); } ctx.execute_vfpu_vtfm_ct<5u, 32u, 4u, 4u, 3u>(); ctx.execute_vfpu_vec3_ct<100u, 100u, 104u, 1u, 0u>(); ctx.execute_vfpu_vec3_ct<100u, 100u, 100u, 1u, 2u>(); ctx.execute_vfpu_vec3_ct<5u, 8u, 5u, 3u, 1u>(); ctx.execute_vfpu_vdot_ct<4u, 5u, 5u, 3u>(); ctx.execute_vfpu_vcmp_ct<4u, 100u, 1u, 7u>(); tier2_gpr_4 = (0u | 0u); { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; // vflush: architectural no-op that retains VFPU prefixes if (branch_taken) { goto SB_L_08A6E998; } goto SB_L_08A6E990; } SB_L_08A6E990: tier2_gpr_4 = (0u + static_cast(1)); tier2_gpr_4 = (tier2_gpr_4 & 255u); goto SB_L_08A6E998; SB_L_08A6E998: tier2_gpr_6 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { ctx.pc = 0x08A71100u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A71100; } goto SB_L_08A6E9A4; } SB_L_08A6E9A4: tier2_gpr_4 = (0u + static_cast(-4097)); tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(236))); tier2_gpr_4 = (tier2_gpr_6 & tier2_gpr_4); tier2_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_gpr_4); ctx.gpr[18] = (0u | 0u); ctx.gpr[20] = (0u | 0u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 2u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6E9E0; } goto SB_L_08A6E9D8; } SB_L_08A6E9D8: { const bool branch_taken = 0u == 0u; ctx.gpr[18] = (0u | 0u); if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6E9E0; } SB_L_08A6E9E0: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 8u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EA78; } goto SB_L_08A6E9FC; } SB_L_08A6E9FC: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load8(tier2_gpr_19 + static_cast(483)))))); tier2_gpr_4 = (tier2_gpr_4 & 2u); tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EA78; } goto SB_L_08A6EA14; } SB_L_08A6EA14: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 4u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); if (tier2_gpr_4 != 0u) { ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_19 + static_cast(40))); goto SB_L_08A6EA50; } goto SB_L_08A6EA30; SB_L_08A6EA30: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 6u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EA78; } goto SB_L_08A6EA4C; } SB_L_08A6EA4C: ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_19 + static_cast(40))); goto SB_L_08A6EA50; SB_L_08A6EA50: ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[12])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_08A6EA78; } goto SB_L_08A6EA60; } SB_L_08A6EA60: ctx.gpr[18] = (ctx.gpr[23] | 0u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(236))); tier2_gpr_4 = (tier2_gpr_4 | 4096u); tier2_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_gpr_4); { const bool branch_taken = 0u == 0u; tier2_mem.aot_store32(tier2_gpr_19 + static_cast(444), tier2_gpr_17); if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EA78; } SB_L_08A6EA78: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 8u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB10; } goto SB_L_08A6EA94; } SB_L_08A6EA94: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load8(tier2_gpr_17 + static_cast(483)))))); tier2_gpr_4 = (tier2_gpr_4 & 2u); tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB10; } goto SB_L_08A6EAAC; } SB_L_08A6EAAC: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 4u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); if (tier2_gpr_4 != 0u) { ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_17 + static_cast(40))); goto SB_L_08A6EAE8; } goto SB_L_08A6EAC8; SB_L_08A6EAC8: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 6u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB10; } goto SB_L_08A6EAE4; } SB_L_08A6EAE4: ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_17 + static_cast(40))); goto SB_L_08A6EAE8; SB_L_08A6EAE8: ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[12])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_08A6EB10; } goto SB_L_08A6EAF8; } SB_L_08A6EAF8: ctx.gpr[18] = (ctx.gpr[23] | 0u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(236))); tier2_gpr_4 = (tier2_gpr_4 | 4096u); tier2_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_gpr_4); { const bool branch_taken = 0u == 0u; tier2_mem.aot_store32(tier2_gpr_17 + static_cast(444), tier2_gpr_19); if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EB10; } SB_L_08A6EB10: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 8u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB78; } goto SB_L_08A6EB2C; } SB_L_08A6EB2C: tier2_gpr_6 = (tier2_mem.aot_load8(tier2_gpr_19 + static_cast(474))); tier2_gpr_4 = (0u | 4u); { const bool branch_taken = tier2_gpr_6 != tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A6EB78; } goto SB_L_08A6EB3C; } SB_L_08A6EB3C: tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_6 = (tier2_gpr_6 & 14u); tier2_gpr_6 = (tier2_gpr_6 ^ 8u); tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); tier2_gpr_6 = (tier2_gpr_6 & 255u); { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB78; } goto SB_L_08A6EB58; } SB_L_08A6EB58: tier2_gpr_6 = (tier2_mem.aot_load8(tier2_gpr_17 + static_cast(474))); { const bool branch_taken = tier2_gpr_6 != tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A6EB78; } goto SB_L_08A6EB64; } SB_L_08A6EB64: ctx.gpr[18] = (ctx.gpr[23] | 0u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(236))); tier2_gpr_4 = (tier2_gpr_4 | 4096u); { const bool branch_taken = 0u == 0u; tier2_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_gpr_4); if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EB78; } SB_L_08A6EB78: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 8u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EB94; } SB_L_08A6EB94: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 4u); tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EBB0; } SB_L_08A6EBB0: ctx.gpr[16] = (tier2_gpr_19 | 0u); tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); { const bool branch_taken = tier2_gpr_4 != ctx.gpr[10]; // nop if (branch_taken) { goto SB_L_08A6EBC8; } goto SB_L_08A6EBC0; } SB_L_08A6EBC0: { const bool branch_taken = 0u == 0u; ctx.gpr[18] = (ctx.gpr[23] | 0u); if (branch_taken) { goto SB_L_08A6ED90; } goto SB_L_08A6EBC8; } SB_L_08A6EBC8: tier2_gpr_4 = (tier2_mem.aot_load8(ctx.gpr[16] + static_cast(476))); { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A6EC1C; } goto SB_L_08A6EBD4; } SB_L_08A6EBD4: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load8(ctx.gpr[16] + static_cast(482)))))); tier2_gpr_4 = (tier2_gpr_4 & 64u); tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); { const bool branch_taken = tier2_gpr_4 == ctx.gpr[23]; // nop if (branch_taken) { goto SB_L_08A6EC1C; } goto SB_L_08A6EBEC; } SB_L_08A6EBEC: tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[16] + static_cast(72))); tier2_gpr_5 = (tier2_gpr_5 & 2048u); { const bool branch_taken = tier2_gpr_5 != 0u; tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_08A6EC0C; } goto SB_L_08A6EBFC; } SB_L_08A6EBFC: tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[16] + static_cast(76))); tier2_gpr_5 = (tier2_gpr_5 & 2048u); { const bool branch_taken = tier2_gpr_5 == 0u; tier2_gpr_4 = (tier2_gpr_4 & 255u); if (branch_taken) { goto SB_L_08A6EC14; } goto SB_L_08A6EC0C; } SB_L_08A6EC0C: tier2_gpr_4 = (ctx.gpr[23] | 0u); tier2_gpr_4 = (tier2_gpr_4 & 255u); goto SB_L_08A6EC14; SB_L_08A6EC14: { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; } goto SB_L_08A6EC1C; } SB_L_08A6EC1C: tier2_gpr_4 = (tier2_mem.aot_load32(ctx.gpr[16] + static_cast(444))); { const bool branch_taken = tier2_gpr_4 != tier2_gpr_17; // nop if (branch_taken) { goto SB_L_08A6EC30; } goto SB_L_08A6EC28; } SB_L_08A6EC28: { const bool branch_taken = 0u == 0u; ctx.gpr[18] = (ctx.gpr[23] | 0u); if (branch_taken) { goto SB_L_08A6ED90; } goto SB_L_08A6EC30; } SB_L_08A6EC30: tier2_gpr_4 = (tier2_mem.aot_load8(ctx.gpr[16] + static_cast(473))); tier2_gpr_4 = (static_cast(tier2_gpr_4) < 3 ? 1u : 0u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; } goto SB_L_08A6EC40; } SB_L_08A6EC40: tier2_mem.aot_store32(tier2_gpr_29 + static_cast(128), 0u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(136))); tier2_gpr_4 = (tier2_gpr_4 & ctx.gpr[9]); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(136), tier2_gpr_4); tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_19 + static_cast(86)))))); tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); tier2_gpr_6 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_6) ? 1u : 0u); { const bool branch_taken = tier2_gpr_6 == 0u; tier2_gpr_5 = (0u | 0u); if (branch_taken) { goto SB_L_08A6EC74; } goto SB_L_08A6EC64; } SB_L_08A6EC64: tier2_gpr_4 = (tier2_gpr_4 << 2u); tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(24))); tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); goto SB_L_08A6EC74; SB_L_08A6EC74: ctx.gpr[8] = (tier2_mem.aot_load32(tier2_gpr_5 + static_cast(20))); ctx.gpr[8] = (ctx.gpr[8] + static_cast(32)); tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_19 + static_cast(86)))))); tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); tier2_gpr_6 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_6) ? 1u : 0u); { const bool branch_taken = tier2_gpr_6 == 0u; tier2_gpr_5 = (0u | 0u); if (branch_taken) { goto SB_L_08A6ECA0; } goto SB_L_08A6EC90; } SB_L_08A6EC90: tier2_gpr_4 = (tier2_gpr_4 << 2u); tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(24))); tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); goto SB_L_08A6ECA0; SB_L_08A6ECA0: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_5 + static_cast(20))); tier2_gpr_4 = (tier2_gpr_4 + static_cast(16)); { const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } ctx.execute_vfpu_vec3_ct<0u, 0u, 1u, 3u, 1u>(); ctx.gpr[21] = (tier2_gpr_29 + static_cast(144)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } { const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(32); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(48); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } ctx.execute_vfpu_vtfm_ct<0u, 36u, 1u, 3u, 3u>(); ctx.execute_vfpu_vec3_ct<0u, 0u, 7u, 3u, 0u>(); tier2_gpr_4 = (tier2_gpr_29 + static_cast(48)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(152))); tier2_gpr_4 = (tier2_gpr_17 + static_cast(48)); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_4 + static_cast(8))); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[13])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_08A6ED10; } goto SB_L_08A6ED04; } SB_L_08A6ED04: ctx.gpr[18] = (ctx.gpr[23] | 0u); { const bool branch_taken = 0u == 0u; tier2_mem.aot_store32(ctx.gpr[16] + static_cast(444), tier2_gpr_17); if (branch_taken) { goto SB_L_08A6ED6C; } goto SB_L_08A6ED10; } SB_L_08A6ED10: ctx.gpr[30] = (tier2_gpr_29 + static_cast(64)); tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[31] = (0x08A6ED20u); tier2_gpr_5 = (ctx.gpr[30] | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_trusted_direct<&recomp_unit_0022_entry, 22u, 934u, 0x0885FE8Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A6ED20u) goto SB_L_08A6ED20; TIER2_SB_RETURN(); SB_L_08A6ED20: tier2_gpr_4 = (ctx.gpr[30] | 0u); ctx.gpr[31] = (0x08A6ED2Cu); tier2_gpr_5 = (ctx.gpr[2] | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_trusted_direct<&recomp_unit_0023_entry, 23u, 7u, 0x08860358u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A6ED2Cu) goto SB_L_08A6ED2C; TIER2_SB_RETURN(); SB_L_08A6ED2C: { const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(32); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(48); std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), std::bit_cast(tier2_vfpu_words[1]), std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } ctx.execute_vfpu_vtfm_ct<0u, 36u, 1u, 3u, 3u>(); ctx.execute_vfpu_vec3_ct<0u, 0u, 7u, 3u, 0u>(); tier2_gpr_4 = (tier2_gpr_29 + static_cast(160)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(168))); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[26])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_08A6ED6C; } goto SB_L_08A6ED64; } SB_L_08A6ED64: ctx.gpr[18] = (ctx.gpr[23] | 0u); tier2_mem.aot_store32(ctx.gpr[16] + static_cast(444), tier2_gpr_17); goto SB_L_08A6ED6C; SB_L_08A6ED6C: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(136))); tier2_gpr_4 = (tier2_gpr_4 & 1u); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; } goto SB_L_08A6ED7C; } SB_L_08A6ED7C: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(128))); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; } goto SB_L_08A6ED88; } SB_L_08A6ED88: ctx.gpr[31] = (0x08A6ED90u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(128))); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_trusted_direct<&recomp_unit_0117_entry, 117u, 129u, 0x089D89E0u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A6ED90u) goto SB_L_08A6ED90; TIER2_SB_RETURN(); SB_L_08A6ED90: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); } SB_L_08A71100: { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A711E0; } goto SB_L_08A71108; } SB_L_08A71108: ctx.gpr[31] = (0x08A71110u); tier2_gpr_4 = (tier2_gpr_19 | 0u); tier2_gpr_4 = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(72)); tier2_gpr_4 = (tier2_gpr_4 & 14u); ctx.gpr[2] = (tier2_gpr_4 ^ 8u); ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71110u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71110; SB_L_08A71110: { const bool branch_taken = ctx.gpr[2] == 0u; // nop if (branch_taken) { goto SB_L_08A7113C; } goto SB_L_08A71118; } SB_L_08A71118: ctx.gpr[31] = (0x08A71120u); tier2_gpr_4 = (tier2_gpr_19 | 0u); ctx.gpr[2] = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(444)); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71120u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71120; SB_L_08A71120: { const bool branch_taken = ctx.gpr[2] != tier2_gpr_17; // nop if (branch_taken) { goto SB_L_08A7113C; } goto SB_L_08A71128; } SB_L_08A71128: tier2_gpr_4 = (tier2_gpr_19 | 0u); ctx.gpr[31] = (0x08A71134u); tier2_gpr_5 = (0u | 0u); tier2_mem.aot_store32(tier2_gpr_4 + static_cast(444), tier2_gpr_5); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71134u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71134; SB_L_08A71134: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { goto SB_L_08A711E0; } goto SB_L_08A7113C; } SB_L_08A7113C: ctx.gpr[31] = (0x08A71144u); tier2_gpr_4 = (tier2_gpr_17 | 0u); tier2_gpr_4 = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(72)); tier2_gpr_4 = (tier2_gpr_4 & 14u); ctx.gpr[2] = (tier2_gpr_4 ^ 8u); ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71144u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71144; SB_L_08A71144: { const bool branch_taken = ctx.gpr[2] == 0u; // nop if (branch_taken) { goto SB_L_08A71180; } goto SB_L_08A7114C; } SB_L_08A7114C: ctx.gpr[31] = (0x08A71154u); tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[2] = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(444)); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71154u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71154; SB_L_08A71154: { const bool branch_taken = ctx.gpr[2] != tier2_gpr_19; // nop if (branch_taken) { goto SB_L_08A71180; } goto SB_L_08A7115C; } SB_L_08A7115C: ctx.gpr[31] = (0x08A71164u); tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[2] = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(448)); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71164u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71164; SB_L_08A71164: { const bool branch_taken = ctx.gpr[2] == tier2_gpr_19; // nop if (branch_taken) { goto SB_L_08A71180; } goto SB_L_08A7116C; } SB_L_08A7116C: tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[31] = (0x08A71178u); tier2_gpr_5 = (0u | 0u); tier2_mem.aot_store32(tier2_gpr_4 + static_cast(444), tier2_gpr_5); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71178u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71178; SB_L_08A71178: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { goto SB_L_08A711E0; } goto SB_L_08A71180; } SB_L_08A71180: ctx.gpr[31] = (0x08A71188u); tier2_gpr_4 = (tier2_gpr_19 | 0u); tier2_gpr_4 = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(72)); tier2_gpr_4 = (tier2_gpr_4 & 14u); ctx.gpr[2] = (tier2_gpr_4 ^ 6u); ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71188u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71188; SB_L_08A71188: { const bool branch_taken = ctx.gpr[2] == 0u; // nop if (branch_taken) { goto SB_L_08A711B4; } goto SB_L_08A71190; } SB_L_08A71190: ctx.gpr[31] = (0x08A71198u); tier2_gpr_4 = (tier2_gpr_19 | 0u); ctx.gpr[2] = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(2116)); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A71198u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A71198; SB_L_08A71198: { const bool branch_taken = ctx.gpr[2] != tier2_gpr_17; // nop if (branch_taken) { goto SB_L_08A711B4; } goto SB_L_08A711A0; } SB_L_08A711A0: tier2_gpr_4 = (tier2_gpr_19 | 0u); ctx.gpr[31] = (0x08A711ACu); tier2_gpr_5 = (0u | 0u); tier2_mem.aot_store32(tier2_gpr_4 + static_cast(2116), tier2_gpr_5); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A711ACu; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A711AC; SB_L_08A711AC: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { goto SB_L_08A711E0; } goto SB_L_08A711B4; } SB_L_08A711B4: ctx.gpr[31] = (0x08A711BCu); tier2_gpr_4 = (tier2_gpr_17 | 0u); tier2_gpr_4 = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(72)); tier2_gpr_4 = (tier2_gpr_4 & 14u); ctx.gpr[2] = (tier2_gpr_4 ^ 6u); ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A711BCu; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A711BC; SB_L_08A711BC: { const bool branch_taken = ctx.gpr[2] == 0u; // nop if (branch_taken) { goto SB_L_08A711E0; } goto SB_L_08A711C4; } SB_L_08A711C4: ctx.gpr[31] = (0x08A711CCu); tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[2] = tier2_mem.aot_load32(tier2_gpr_4 + static_cast(2116)); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A711CCu; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A711CC; SB_L_08A711CC: { const bool branch_taken = ctx.gpr[2] != tier2_gpr_19; // nop if (branch_taken) { goto SB_L_08A711E0; } goto SB_L_08A711D4; } SB_L_08A711D4: tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[31] = (0x08A711E0u); tier2_gpr_5 = (0u | 0u); tier2_mem.aot_store32(tier2_gpr_4 + static_cast(2116), tier2_gpr_5); // Publish the exact JAL return PC before scheduler accounting. // A starvation boundary may switch PSP ownership here; the // resumed context must never observe the stale superblock PC. ctx.pc = 0x08A711E0u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_generated_leaf(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } goto SB_L_08A711E0; SB_L_08A711E0: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1576))); { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<154u, 0x08A6E8A4u>(ctx)) { ctx.pc = 0x08A6E8A4u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A6E8A4; } goto SB_L_08A711EC; } SB_L_08A711EC: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1600))); tier2_gpr_4 = (tier2_gpr_4 + static_cast(4)); tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1596))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(1600), tier2_gpr_4); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(1604))); tier2_gpr_4 = (tier2_gpr_4 + static_cast(-1)); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(1596), tier2_gpr_4); { const bool branch_taken = tier2_gpr_5 != 0u; tier2_mem.aot_store32(tier2_gpr_29 + static_cast(1604), tier2_gpr_4); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<154u, 0x08A6E894u>(ctx)) { ctx.pc = 0x08A6E894u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_08A6E894; } goto SB_L_08A71210; } SB_L_08A71210: ctx.gpr[2] = (ctx.gpr[22] | 0u); ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0155_entry(rt, ctx, 269u, aot_mem); TIER2_SB_RETURN(); // TIER2_GPR_BODY_END #undef TIER2_SB_RETURN #undef TIER2_GPR_BEFORE_COLD #undef TIER2_GPR_SYNC_IN #undef TIER2_GPR_SYNC_OUT } } // namespace vcs