// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. // Tier-2 SUPERBLOCK V4 150FPS cluster: collisionloop #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_collisionloop(psprecomp::Runtime &rt, psprecomp::AllegrexContext &ctx, psprecomp::GuestMemory::AotFastView &aot_mem, std::uint32_t entry_pc) { tier2_detail::SampleScope tier2_scope(Tier2ClusterId::CollisionLoop); 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_29 = ctx.gpr[29]; std::uint32_t tier2_gpr_5 = ctx.gpr[5]; std::uint32_t tier2_gpr_18 = ctx.gpr[18]; std::uint32_t tier2_gpr_16 = ctx.gpr[16]; std::uint32_t tier2_gpr_6 = ctx.gpr[6]; 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[29] = tier2_gpr_29; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[18] = tier2_gpr_18; ctx.gpr[16] = tier2_gpr_16; ctx.gpr[6] = tier2_gpr_6; } } while (false) #define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_29 = ctx.gpr[29]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_18 = ctx.gpr[18]; tier2_gpr_16 = ctx.gpr[16]; tier2_gpr_6 = ctx.gpr[6]; } } 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 0x0889BFC0u: goto SB_L_0889BFC0; case 0x0889BFD8u: goto SB_L_0889BFD8; case 0x0889BFE4u: goto SB_L_0889BFE4; case 0x0889C000u: goto SB_L_0889C000; case 0x0889C008u: goto SB_L_0889C008; case 0x0889C014u: goto SB_L_0889C014; case 0x0889C01Cu: goto SB_L_0889C01C; case 0x0889C024u: goto SB_L_0889C024; case 0x0889C054u: goto SB_L_0889C054; case 0x0889C06Cu: goto SB_L_0889C06C; case 0x0889C074u: goto SB_L_0889C074; case 0x0889C084u: goto SB_L_0889C084; case 0x0889C08Cu: goto SB_L_0889C08C; case 0x0889C094u: goto SB_L_0889C094; case 0x0889C09Cu: goto SB_L_0889C09C; case 0x0889C0A8u: goto SB_L_0889C0A8; case 0x0889C0B0u: goto SB_L_0889C0B0; case 0x0889C0B8u: goto SB_L_0889C0B8; case 0x0889C0C0u: goto SB_L_0889C0C0; case 0x0889C0D4u: goto SB_L_0889C0D4; case 0x0889C0E4u: goto SB_L_0889C0E4; case 0x0889C0F0u: goto SB_L_0889C0F0; case 0x0889C0F8u: goto SB_L_0889C0F8; case 0x0889C114u: goto SB_L_0889C114; case 0x0889C120u: goto SB_L_0889C120; case 0x0889C13Cu: goto SB_L_0889C13C; case 0x0889C14Cu: goto SB_L_0889C14C; case 0x0889C158u: goto SB_L_0889C158; case 0x0889C160u: goto SB_L_0889C160; case 0x0889C168u: goto SB_L_0889C168; case 0x0889C180u: goto SB_L_0889C180; case 0x0889C188u: goto SB_L_0889C188; case 0x0889C194u: goto SB_L_0889C194; case 0x0889C1A4u: goto SB_L_0889C1A4; case 0x0889C1B4u: goto SB_L_0889C1B4; case 0x0889C1C4u: goto SB_L_0889C1C4; case 0x0889C1CCu: goto SB_L_0889C1CC; case 0x0889C1E0u: goto SB_L_0889C1E0; case 0x0889C1F0u: goto SB_L_0889C1F0; case 0x0889C1FCu: goto SB_L_0889C1FC; case 0x0889C204u: goto SB_L_0889C204; case 0x0889C21Cu: goto SB_L_0889C21C; case 0x0889C234u: goto SB_L_0889C234; case 0x0889C23Cu: goto SB_L_0889C23C; case 0x0889C254u: goto SB_L_0889C254; case 0x0889C26Cu: goto SB_L_0889C26C; case 0x0889C274u: goto SB_L_0889C274; case 0x0889C298u: goto SB_L_0889C298; case 0x0889C2A0u: goto SB_L_0889C2A0; case 0x0889C2A8u: goto SB_L_0889C2A8; case 0x0889C2C0u: goto SB_L_0889C2C0; case 0x0889C2C8u: goto SB_L_0889C2C8; case 0x0889C2D0u: goto SB_L_0889C2D0; case 0x0889C2F8u: goto SB_L_0889C2F8; case 0x0889C378u: goto SB_L_0889C378; case 0x0889C380u: goto SB_L_0889C380; case 0x0889C388u: goto SB_L_0889C388; case 0x0889C394u: goto SB_L_0889C394; case 0x0889C3B0u: goto SB_L_0889C3B0; case 0x0889C3B8u: goto SB_L_0889C3B8; case 0x0889C3DCu: goto SB_L_0889C3DC; case 0x0889C3E4u: goto SB_L_0889C3E4; case 0x0889C3ECu: goto SB_L_0889C3EC; case 0x0889C404u: goto SB_L_0889C404; case 0x0889C40Cu: goto SB_L_0889C40C; case 0x0889C414u: goto SB_L_0889C414; case 0x0889C43Cu: goto SB_L_0889C43C; case 0x0889C4B8u: goto SB_L_0889C4B8; case 0x0889C4C0u: goto SB_L_0889C4C0; case 0x0889C4D8u: goto SB_L_0889C4D8; case 0x0889C4E8u: goto SB_L_0889C4E8; case 0x0889C4F4u: goto SB_L_0889C4F4; case 0x0889C570u: goto SB_L_0889C570; case 0x0889C580u: goto SB_L_0889C580; case 0x0889C590u: goto SB_L_0889C590; case 0x0889C5A0u: goto SB_L_0889C5A0; case 0x0889C5B0u: goto SB_L_0889C5B0; case 0x0889C5B8u: goto SB_L_0889C5B8; default: break; } switch (tier2_resume_unit) { default: break; } ctx.pc = tier2_resume_pc; TIER2_SB_RETURN(); TIER2_LOCAL_DISPATCH_U0037: 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 0x0889BFC0u: goto SB_L_0889BFC0; case 0x0889BFD8u: goto SB_L_0889BFD8; case 0x0889BFE4u: goto SB_L_0889BFE4; default: ctx.pc = local_pc; TIER2_SB_RETURN(); } TIER2_LOCAL_DISPATCH_U0038: 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 0x0889C000u: goto SB_L_0889C000; case 0x0889C008u: goto SB_L_0889C008; case 0x0889C014u: goto SB_L_0889C014; case 0x0889C01Cu: goto SB_L_0889C01C; case 0x0889C024u: goto SB_L_0889C024; case 0x0889C054u: goto SB_L_0889C054; case 0x0889C06Cu: goto SB_L_0889C06C; case 0x0889C074u: goto SB_L_0889C074; case 0x0889C084u: goto SB_L_0889C084; case 0x0889C08Cu: goto SB_L_0889C08C; case 0x0889C094u: goto SB_L_0889C094; case 0x0889C09Cu: goto SB_L_0889C09C; case 0x0889C0A8u: goto SB_L_0889C0A8; case 0x0889C0B0u: goto SB_L_0889C0B0; case 0x0889C0B8u: goto SB_L_0889C0B8; case 0x0889C0C0u: goto SB_L_0889C0C0; case 0x0889C0D4u: goto SB_L_0889C0D4; case 0x0889C0E4u: goto SB_L_0889C0E4; case 0x0889C0F0u: goto SB_L_0889C0F0; case 0x0889C0F8u: goto SB_L_0889C0F8; case 0x0889C114u: goto SB_L_0889C114; case 0x0889C120u: goto SB_L_0889C120; case 0x0889C13Cu: goto SB_L_0889C13C; case 0x0889C14Cu: goto SB_L_0889C14C; case 0x0889C158u: goto SB_L_0889C158; case 0x0889C160u: goto SB_L_0889C160; case 0x0889C168u: goto SB_L_0889C168; case 0x0889C180u: goto SB_L_0889C180; case 0x0889C188u: goto SB_L_0889C188; case 0x0889C194u: goto SB_L_0889C194; case 0x0889C1A4u: goto SB_L_0889C1A4; case 0x0889C1B4u: goto SB_L_0889C1B4; case 0x0889C1C4u: goto SB_L_0889C1C4; case 0x0889C1CCu: goto SB_L_0889C1CC; case 0x0889C1E0u: goto SB_L_0889C1E0; case 0x0889C1F0u: goto SB_L_0889C1F0; case 0x0889C1FCu: goto SB_L_0889C1FC; case 0x0889C204u: goto SB_L_0889C204; case 0x0889C21Cu: goto SB_L_0889C21C; case 0x0889C234u: goto SB_L_0889C234; case 0x0889C23Cu: goto SB_L_0889C23C; case 0x0889C254u: goto SB_L_0889C254; case 0x0889C26Cu: goto SB_L_0889C26C; case 0x0889C274u: goto SB_L_0889C274; case 0x0889C298u: goto SB_L_0889C298; case 0x0889C2A0u: goto SB_L_0889C2A0; case 0x0889C2A8u: goto SB_L_0889C2A8; case 0x0889C2C0u: goto SB_L_0889C2C0; case 0x0889C2C8u: goto SB_L_0889C2C8; case 0x0889C2D0u: goto SB_L_0889C2D0; case 0x0889C2F8u: goto SB_L_0889C2F8; case 0x0889C378u: goto SB_L_0889C378; case 0x0889C380u: goto SB_L_0889C380; case 0x0889C388u: goto SB_L_0889C388; case 0x0889C394u: goto SB_L_0889C394; case 0x0889C3B0u: goto SB_L_0889C3B0; case 0x0889C3B8u: goto SB_L_0889C3B8; case 0x0889C3DCu: goto SB_L_0889C3DC; case 0x0889C3E4u: goto SB_L_0889C3E4; case 0x0889C3ECu: goto SB_L_0889C3EC; case 0x0889C404u: goto SB_L_0889C404; case 0x0889C40Cu: goto SB_L_0889C40C; case 0x0889C414u: goto SB_L_0889C414; case 0x0889C43Cu: goto SB_L_0889C43C; case 0x0889C4B8u: goto SB_L_0889C4B8; case 0x0889C4C0u: goto SB_L_0889C4C0; case 0x0889C4D8u: goto SB_L_0889C4D8; case 0x0889C4E8u: goto SB_L_0889C4E8; case 0x0889C4F4u: goto SB_L_0889C4F4; case 0x0889C570u: goto SB_L_0889C570; case 0x0889C580u: goto SB_L_0889C580; case 0x0889C590u: goto SB_L_0889C590; case 0x0889C5A0u: goto SB_L_0889C5A0; case 0x0889C5B0u: goto SB_L_0889C5B0; case 0x0889C5B8u: goto SB_L_0889C5B8; default: ctx.pc = local_pc; TIER2_SB_RETURN(); } TIER2_ENTRY_DISPATCH: switch (entry_pc) { case 0x0889BFC0u: goto SB_L_0889BFC0; case 0x0889C000u: goto SB_L_0889C000; case 0x0889C5B8u: goto SB_L_0889C5B8; default: ctx.pc = entry_pc; ++tier2_stats.fallbacks; TIER2_SB_RETURN(); } // TIER2_GPR_BODY_BEGIN SB_L_0889BFC0: tier2_gpr_18 = (tier2_mem.aot_load32(ctx.gpr[30] + static_cast(0))); ctx.gpr[30] = (tier2_mem.aot_load32(ctx.gpr[30] + static_cast(8))); tier2_gpr_4 = (tier2_mem.aot_load16(tier2_gpr_18 + static_cast(84))); tier2_gpr_5 = (tier2_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; ctx.gpr[17] = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast(596))); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<38u, 0x0889C5B8u>(ctx)) { ctx.pc = 0x0889C5B8u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_0889C5B8; } goto SB_L_0889BFD8; } SB_L_0889BFD8: tier2_gpr_4 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast(8068))); { const bool branch_taken = tier2_gpr_18 == tier2_gpr_4; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<38u, 0x0889C5B8u>(ctx)) { ctx.pc = 0x0889C5B8u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_0889C5B8; } goto SB_L_0889BFE4; } SB_L_0889BFE4: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 512u); tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); tier2_gpr_16 = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast(608))); tier2_gpr_4 = (tier2_gpr_4 & 255u); tier2_gpr_4 = (tier2_gpr_4 | ctx.gpr[17]); tier2_gpr_4 = (tier2_gpr_4 | tier2_gpr_16); // Generated corpus boundary: unwind any logical tail-call frames first, // then account the outer dispatch that this local edge removes. if (tier2_pending_transfers != 0u) { const std::uint32_t tier2_static_pending_ = tier2_pending_transfers; tier2_pending_transfers = 0u; if (!tier2_complete_shadow(tier2_static_pending_)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } } ctx.pc = 0x0889C000u; TIER2_GPR_SYNC_OUT(); if (!rt.account_inlined_dispatch_boundary(ctx)) { tier2_gpr_shadow_valid = false; TIER2_SB_RETURN(); } TIER2_GPR_SYNC_IN(); goto SB_L_0889C000; SB_L_0889C000: { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C008; } SB_L_0889C008: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(628))); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0889C024; } goto SB_L_0889C014; } SB_L_0889C014: ctx.gpr[31] = (0x0889C01Cu); tier2_gpr_4 = (tier2_gpr_18 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0036_entry, 36u, 434u, 0x088961FCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C01Cu) goto SB_L_0889C01C; TIER2_SB_RETURN(); SB_L_0889C01C: { const bool branch_taken = ctx.gpr[2] != 0u; // nop if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C024; } SB_L_0889C024: tier2_gpr_4 = (tier2_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); tier2_mem.aot_store16(tier2_gpr_18 + static_cast(84), static_cast(tier2_gpr_4)); ctx.gpr[19] = (0u | 0u); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(16))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(336), std::bit_cast(ctx.fpr[12])); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + 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_0889C0F8; } goto SB_L_0889C054; } SB_L_0889C054: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 512u); 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_0889C0C0; } goto SB_L_0889C06C; } SB_L_0889C06C: { const bool branch_taken = ctx.gpr[17] == 0u; // nop if (branch_taken) { goto SB_L_0889C084; } goto SB_L_0889C074; } SB_L_0889C074: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(2228))); tier2_gpr_5 = (0u | 58u); { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_0889C0C0; } goto SB_L_0889C084; } SB_L_0889C084: { const bool branch_taken = tier2_gpr_16 == 0u; // nop if (branch_taken) { goto SB_L_0889C0B8; } goto SB_L_0889C08C; } SB_L_0889C08C: ctx.gpr[31] = (0x0889C094u); tier2_gpr_4 = (tier2_gpr_18 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0067_entry, 67u, 195u, 0x08910B38u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C094u) goto SB_L_0889C094; TIER2_SB_RETURN(); SB_L_0889C094: { const bool branch_taken = ctx.gpr[2] == 0u; // nop if (branch_taken) { goto SB_L_0889C0B8; } goto SB_L_0889C09C; } SB_L_0889C09C: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(1152))); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0889C0B8; } goto SB_L_0889C0A8; } SB_L_0889C0A8: ctx.gpr[31] = (0x0889C0B0u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(1152))); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0191_entry, 191u, 409u, 0x08B017A8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C0B0u) goto SB_L_0889C0B0; TIER2_SB_RETURN(); SB_L_0889C0B0: { const bool branch_taken = ctx.gpr[2] != 0u; // nop if (branch_taken) { goto SB_L_0889C0C0; } goto SB_L_0889C0B8; } SB_L_0889C0B8: { const bool branch_taken = 0u == 0u; ctx.gpr[19] = (0u | 0u); if (branch_taken) { goto SB_L_0889C26C; } goto SB_L_0889C0C0; } SB_L_0889C0C0: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_18 + 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_0889C0E4; } goto SB_L_0889C0D4; } SB_L_0889C0D4: 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_0889C0E4; SB_L_0889C0E4: tier2_gpr_4 = (tier2_gpr_5 | 0u); ctx.gpr[31] = (0x0889C0F0u); tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(80))); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0063_entry, 63u, 664u, 0x089039E4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C0F0u) goto SB_L_0889C0F0; TIER2_SB_RETURN(); SB_L_0889C0F0: { const bool branch_taken = 0u == 0u; ctx.gpr[19] = (ctx.gpr[2] | 0u); if (branch_taken) { goto SB_L_0889C26C; } goto SB_L_0889C0F8; } SB_L_0889C0F8: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 14u); tier2_gpr_4 = (tier2_gpr_4 ^ 14u); 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_0889C23C; } goto SB_L_0889C114; } SB_L_0889C114: tier2_gpr_16 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(352))); { const bool branch_taken = tier2_gpr_16 == 0u; // nop if (branch_taken) { goto SB_L_0889C158; } goto SB_L_0889C120; } SB_L_0889C120: tier2_mem.aot_store32(tier2_gpr_29 + static_cast(640), ctx.gpr[21]); tier2_mem.aot_store8(tier2_gpr_29 + static_cast(596), static_cast(ctx.gpr[17])); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast(108))); ctx.gpr[17] = (tier2_gpr_4 + static_cast(16)); tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); ctx.gpr[31] = (0x0889C13Cu); ctx.gpr[21] = (tier2_gpr_16 + tier2_gpr_4); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0115_entry, 115u, 419u, 0x089D273Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C13Cu) goto SB_L_0889C13C; TIER2_SB_RETURN(); SB_L_0889C13C: tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[17] + static_cast(4))); tier2_gpr_4 = (ctx.gpr[21] | 0u); jump_target = tier2_gpr_6; ctx.gpr[31] = (0x0889C14Cu); tier2_gpr_5 = (ctx.gpr[2] | 0u); ctx.pc = jump_target; if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C14Cu) goto SB_L_0889C14C; TIER2_SB_RETURN(); SB_L_0889C14C: ctx.gpr[17] = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast(596))); { const bool branch_taken = ctx.gpr[2] != 0u; ctx.gpr[21] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(640))); if (branch_taken) { goto SB_L_0889C160; } goto SB_L_0889C158; } SB_L_0889C158: { const bool branch_taken = 0u == 0u; tier2_gpr_16 = (0u | 0u); if (branch_taken) { goto SB_L_0889C160; } goto SB_L_0889C160; } SB_L_0889C160: { const bool branch_taken = tier2_gpr_16 == 0u; // nop if (branch_taken) { goto SB_L_0889C204; } goto SB_L_0889C168; } SB_L_0889C168: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 512u); 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_0889C1CC; } goto SB_L_0889C180; } SB_L_0889C180: { const bool branch_taken = ctx.gpr[17] == 0u; // nop if (branch_taken) { goto SB_L_0889C1C4; } goto SB_L_0889C188; } SB_L_0889C188: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast(96))); if (tier2_gpr_4 != 0u) { tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast(96))); goto SB_L_0889C1B4; } goto SB_L_0889C194; SB_L_0889C194: tier2_gpr_5 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_16 + static_cast(10)))))); tier2_gpr_6 = (tier2_gpr_29 + static_cast(384)); ctx.gpr[31] = (0x0889C1A4u); tier2_gpr_4 = (tier2_gpr_16 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0166_entry, 166u, 47u, 0x08A9C6FCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C1A4u) goto SB_L_0889C1A4; TIER2_SB_RETURN(); SB_L_0889C1A4: tier2_mem.aot_store32(tier2_gpr_16 + static_cast(96), ctx.gpr[2]); tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast(384))); tier2_mem.aot_store8(tier2_gpr_16 + static_cast(4), static_cast(tier2_gpr_4)); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast(96))); goto SB_L_0889C1B4; SB_L_0889C1B4: tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_4 + static_cast(180))); tier2_gpr_5 = (0u | 58u); { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_0889C1CC; } goto SB_L_0889C1C4; } SB_L_0889C1C4: { const bool branch_taken = 0u == 0u; ctx.gpr[19] = (0u | 0u); if (branch_taken) { goto SB_L_0889C234; } goto SB_L_0889C1CC; } SB_L_0889C1CC: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_18 + 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_0889C1F0; } goto SB_L_0889C1E0; } SB_L_0889C1E0: 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_0889C1F0; SB_L_0889C1F0: tier2_gpr_4 = (tier2_gpr_5 | 0u); ctx.gpr[31] = (0x0889C1FCu); tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(80))); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0063_entry, 63u, 664u, 0x089039E4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C1FCu) goto SB_L_0889C1FC; TIER2_SB_RETURN(); SB_L_0889C1FC: { const bool branch_taken = 0u == 0u; ctx.gpr[19] = (ctx.gpr[2] | 0u); if (branch_taken) { goto SB_L_0889C234; } goto SB_L_0889C204; } SB_L_0889C204: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 512u); 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_0889C234; } goto SB_L_0889C21C; } SB_L_0889C21C: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_18 + static_cast(86)))))); 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_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); ctx.gpr[19] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(20))); goto SB_L_0889C234; SB_L_0889C234: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { goto SB_L_0889C26C; } goto SB_L_0889C23C; } SB_L_0889C23C: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(72))); tier2_gpr_4 = (tier2_gpr_4 & 512u); 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_0889C26C; } goto SB_L_0889C254; } SB_L_0889C254: tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_18 + static_cast(86)))))); 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_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(0))); ctx.gpr[19] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast(20))); goto SB_L_0889C26C; SB_L_0889C26C: { const bool branch_taken = ctx.gpr[19] == 0u; // nop if (branch_taken) { goto SB_L_0889C388; } goto SB_L_0889C274; } SB_L_0889C274: ctx.gpr[17] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(632))); tier2_gpr_16 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(612))); ctx.gpr[17] = (ctx.gpr[17] & 255u); tier2_gpr_16 = (tier2_gpr_16 & 255u); tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(600))); tier2_gpr_6 = (ctx.gpr[19] + static_cast(16)); ctx.gpr[7] = (tier2_gpr_29 + static_cast(464)); ctx.gpr[31] = (0x0889C298u); tier2_gpr_5 = (tier2_gpr_18 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 207u, 0x088B1820u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C298u) goto SB_L_0889C298; TIER2_SB_RETURN(); SB_L_0889C298: { const bool branch_taken = ctx.gpr[2] != 0u; tier2_gpr_4 = (tier2_gpr_29 + static_cast(464)); if (branch_taken) { goto SB_L_0889C2A8; } goto SB_L_0889C2A0; } SB_L_0889C2A0: { const bool branch_taken = 0u == 0u; tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_0889C378; } goto SB_L_0889C2A8; } SB_L_0889C2A8: ctx.gpr[7] = (tier2_gpr_29 + static_cast(16)); tier2_gpr_5 = (ctx.gpr[19] | 0u); tier2_gpr_6 = (ctx.gpr[20] | 0u); ctx.gpr[8] = (ctx.gpr[17] | 0u); ctx.gpr[31] = (0x0889C2C0u); ctx.gpr[9] = (tier2_gpr_16 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 484u, 0x088B3CECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C2C0u) goto SB_L_0889C2C0; TIER2_SB_RETURN(); SB_L_0889C2C0: if (ctx.gpr[2] != 0u) { ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(0))); goto SB_L_0889C2D0; } goto SB_L_0889C2C8; SB_L_0889C2C8: { const bool branch_taken = 0u == 0u; tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_0889C378; } goto SB_L_0889C2D0; } SB_L_0889C2D0: tier2_mem.aot_store32(tier2_gpr_29 + static_cast(448), std::bit_cast(ctx.fpr[12])); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(4))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(452), std::bit_cast(ctx.fpr[12])); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(8))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(456), std::bit_cast(ctx.fpr[12])); tier2_gpr_16 = (tier2_gpr_29 + static_cast(448)); tier2_gpr_4 = (ctx.gpr[23] | 0u); tier2_gpr_5 = (tier2_gpr_18 | 0u); ctx.gpr[31] = (0x0889C2F8u); tier2_gpr_6 = (tier2_gpr_16 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0035_entry, 35u, 194u, 0x08891710u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C2F8u) goto SB_L_0889C2F8; TIER2_SB_RETURN(); SB_L_0889C2F8: ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[23] + static_cast(0))); tier2_gpr_4 = (std::bit_cast(ctx.fpr[12])); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[23] + static_cast(4))); tier2_gpr_5 = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[23] + static_cast(8))); tier2_gpr_6 = (std::bit_cast(ctx.fpr[14])); { const std::uint32_t tier2_words[3]{tier2_gpr_4, tier2_gpr_5, tier2_gpr_6}; tier2_mem.aot_store32_block(ctx.gpr[20] + static_cast(0), tier2_words); } ctx.fpr[15] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(16))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(448), std::bit_cast(ctx.fpr[15])); ctx.fpr[15] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(20))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(452), std::bit_cast(ctx.fpr[15])); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(24))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(456), std::bit_cast(ctx.fpr[12])); { const std::uint32_t vfpu_address = tier2_gpr_18 + 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_18 + 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_18 + 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_16 + 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<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); ctx.read_vfpu_vector_ct<7u, 3u>(vfpu_target_raw); constexpr std::uint32_t vfpu_side = 3u; constexpr std::uint32_t vfpu_input_length = 3u; for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; if constexpr (vfpu_side == 4u) { psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); } else { for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { float sum = 0.0f; for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; vfpu_result[row] = sum; } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; const std::uint32_t vfpu_last_lane = vfpu_side - 1u; ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[23] + 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); } tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(620))); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[23] + static_cast(0))); tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[23] + static_cast(4))); tier2_gpr_6 = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[23] + static_cast(8))); ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); { const std::uint32_t tier2_words[3]{tier2_gpr_5, tier2_gpr_6, ctx.gpr[7]}; tier2_mem.aot_store32_block(tier2_gpr_4 + static_cast(0), tier2_words); } tier2_gpr_4 = (0u | 1u); goto SB_L_0889C378; SB_L_0889C378: { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0889C388; } goto SB_L_0889C380; } SB_L_0889C380: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(604))); tier2_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_18); goto SB_L_0889C388; SB_L_0889C388: tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast(624))); { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C394; } SB_L_0889C394: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast(92))); tier2_gpr_5 = (tier2_gpr_4 + static_cast(336)); tier2_gpr_4 = (static_cast(static_cast(static_cast(tier2_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); tier2_gpr_4 = (tier2_gpr_18 + tier2_gpr_4); tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_5 + static_cast(4))); jump_target = tier2_gpr_6; ctx.gpr[31] = (0x0889C3B0u); tier2_gpr_5 = (tier2_gpr_29 + static_cast(64)); ctx.pc = jump_target; if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C3B0u) goto SB_L_0889C3B0; TIER2_SB_RETURN(); SB_L_0889C3B0: { const bool branch_taken = ctx.gpr[2] == 0u; // nop if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C3B8; } SB_L_0889C3B8: tier2_gpr_16 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(612))); tier2_gpr_16 = (tier2_gpr_16 & 255u); ctx.gpr[17] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(600))); tier2_gpr_4 = (ctx.gpr[17] | 0u); tier2_gpr_6 = (tier2_gpr_29 + static_cast(80)); ctx.gpr[19] = (tier2_gpr_29 + static_cast(544)); tier2_gpr_5 = (tier2_gpr_18 | 0u); ctx.gpr[31] = (0x0889C3DCu); ctx.gpr[7] = (ctx.gpr[19] | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 207u, 0x088B1820u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C3DCu) goto SB_L_0889C3DC; TIER2_SB_RETURN(); SB_L_0889C3DC: { const bool branch_taken = ctx.gpr[2] != 0u; ctx.gpr[8] = (0u | 0u); if (branch_taken) { goto SB_L_0889C3EC; } goto SB_L_0889C3E4; } SB_L_0889C3E4: { const bool branch_taken = 0u == 0u; tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_0889C4B8; } goto SB_L_0889C3EC; } SB_L_0889C3EC: tier2_gpr_5 = (tier2_gpr_29 + static_cast(64)); tier2_gpr_6 = (tier2_gpr_29 + static_cast(32)); tier2_gpr_4 = (ctx.gpr[19] | 0u); ctx.gpr[7] = (tier2_gpr_29 + static_cast(336)); ctx.gpr[31] = (0x0889C404u); ctx.gpr[9] = (tier2_gpr_16 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 484u, 0x088B3CECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C404u) goto SB_L_0889C404; TIER2_SB_RETURN(); SB_L_0889C404: if (ctx.gpr[2] != 0u) { ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(32))); goto SB_L_0889C414; } goto SB_L_0889C40C; SB_L_0889C40C: { const bool branch_taken = 0u == 0u; tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_0889C4B8; } goto SB_L_0889C414; } SB_L_0889C414: tier2_mem.aot_store32(tier2_gpr_29 + static_cast(528), std::bit_cast(ctx.fpr[12])); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(36))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(532), std::bit_cast(ctx.fpr[12])); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(40))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(536), std::bit_cast(ctx.fpr[12])); tier2_gpr_16 = (tier2_gpr_29 + static_cast(528)); tier2_gpr_4 = (ctx.gpr[22] | 0u); tier2_gpr_5 = (tier2_gpr_18 | 0u); ctx.gpr[31] = (0x0889C43Cu); tier2_gpr_6 = (tier2_gpr_16 | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0035_entry, 35u, 194u, 0x08891710u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C43Cu) goto SB_L_0889C43C; TIER2_SB_RETURN(); SB_L_0889C43C: ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[22] + static_cast(0))); tier2_gpr_4 = (std::bit_cast(ctx.fpr[12])); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[22] + static_cast(4))); tier2_gpr_5 = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[22] + static_cast(8))); tier2_gpr_6 = (std::bit_cast(ctx.fpr[14])); { const std::uint32_t tier2_words[3]{tier2_gpr_4, tier2_gpr_5, tier2_gpr_6}; tier2_mem.aot_store32_block(tier2_gpr_29 + static_cast(32), tier2_words); } ctx.fpr[15] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(48))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(528), std::bit_cast(ctx.fpr[15])); ctx.fpr[15] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(52))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(532), std::bit_cast(ctx.fpr[15])); ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(56))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(536), std::bit_cast(ctx.fpr[12])); { const std::uint32_t vfpu_address = tier2_gpr_18 + 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_18 + 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_18 + 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_16 + 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<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); ctx.read_vfpu_vector_ct<7u, 3u>(vfpu_target_raw); constexpr std::uint32_t vfpu_side = 3u; constexpr std::uint32_t vfpu_input_length = 3u; for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; if constexpr (vfpu_side == 4u) { psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); } else { for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { float sum = 0.0f; for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; vfpu_result[row] = sum; } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; const std::uint32_t vfpu_last_lane = vfpu_side - 1u; ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[22] + 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(ctx.gpr[22] + static_cast(0))); tier2_gpr_4 = (std::bit_cast(ctx.fpr[12])); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[22] + static_cast(4))); tier2_gpr_5 = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[22] + static_cast(8))); tier2_gpr_6 = (std::bit_cast(ctx.fpr[14])); { const std::uint32_t tier2_words[3]{tier2_gpr_4, tier2_gpr_5, tier2_gpr_6}; tier2_mem.aot_store32_block(tier2_gpr_29 + static_cast(48), tier2_words); } tier2_gpr_4 = (0u | 1u); goto SB_L_0889C4B8; SB_L_0889C4B8: { const bool branch_taken = tier2_gpr_4 == 0u; tier2_gpr_5 = (tier2_gpr_29 + static_cast(32)); if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C4C0; } SB_L_0889C4C0: ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(16))); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(336))); 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_0889C4F4; } goto SB_L_0889C4D8; } SB_L_0889C4D8: ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(336))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(16), std::bit_cast(ctx.fpr[12])); ctx.gpr[31] = (0x0889C4E8u); tier2_gpr_4 = (ctx.gpr[20] | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0000_entry, 0u, 157u, 0x08805288u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C4E8u) goto SB_L_0889C4E8; TIER2_SB_RETURN(); SB_L_0889C4E8: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(604))); { const bool branch_taken = 0u == 0u; tier2_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_18); if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C4F4; } SB_L_0889C4F4: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(616))); { 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); } { const std::uint32_t vfpu_address = ctx.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<1u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } { 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<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_18 + 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_vdot_ct<28u, 0u, 1u, 3u>(); tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>()); ctx.fpr[12] = std::bit_cast(tier2_gpr_4); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(0))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(368), std::bit_cast(ctx.fpr[13])); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(4))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(372), std::bit_cast(ctx.fpr[13])); ctx.fpr[13] = std::bit_cast(tier2_mem.aot_load32(ctx.gpr[20] + static_cast(8))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(376), std::bit_cast(ctx.fpr[13])); tier2_gpr_4 = (tier2_gpr_29 + static_cast(368)); { 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); } tier2_gpr_4 = (tier2_gpr_18 + static_cast(48)); { 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); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } { 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<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = tier2_gpr_18 + 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_vdot_ct<28u, 0u, 1u, 3u>(); tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>()); ctx.fpr[13] = std::bit_cast(tier2_gpr_4); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[20])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_0889C580; } goto SB_L_0889C570; } SB_L_0889C570: ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] <= ctx.fpr[22])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_0889C5A0; } goto SB_L_0889C580; } SB_L_0889C580: ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] <= ctx.fpr[24])) ? 0x00800000u : 0u); // nop { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C590; } SB_L_0889C590: ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[22])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); // nop if (branch_taken) { goto SB_L_0889C5B8; } goto SB_L_0889C5A0; } SB_L_0889C5A0: ctx.fpr[12] = std::bit_cast(tier2_mem.aot_load32(tier2_gpr_29 + static_cast(336))); tier2_mem.aot_store32(tier2_gpr_29 + static_cast(16), std::bit_cast(ctx.fpr[12])); ctx.gpr[31] = (0x0889C5B0u); tier2_gpr_4 = (ctx.gpr[20] | 0u); if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0000_entry, 0u, 157u, 0x08805288u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C5B0u) goto SB_L_0889C5B0; TIER2_SB_RETURN(); SB_L_0889C5B0: tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast(604))); tier2_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_18); goto SB_L_0889C5B8; SB_L_0889C5B8: { const bool branch_taken = ctx.gpr[30] != 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<37u, 0x0889BFC0u>(ctx)) { ctx.pc = 0x0889BFC0u; TIER2_SB_RETURN(); } ++tier2_pending_transfers; ++tier2_stats.fused_tail_edges; goto SB_L_0889BFC0; } ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0038_entry(rt, ctx, 76u, 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