mirror of
https://github.com/jessicanataliagta/PSPRecomp
synced 2026-09-26 16:49:34 -04:00
6e85449aad
otimizações round 16
1708 lines
67 KiB
C++
1708 lines
67 KiB
C++
// 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 <cstdint>
|
|
|
|
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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(1600)));
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(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<std::uint32_t>(1576)));
|
|
tier2_gpr_17 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(8)));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(8428)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(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<float>(tier2_gpr_4);
|
|
ctx.gpr[8] = (0u | 58u);
|
|
ctx.gpr[21] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(1588)));
|
|
ctx.gpr[9] = (0u + static_cast<std::uint32_t>(-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<float>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(84)));
|
|
ctx.gpr[7] = (tier2_mem.aot_load16(ctx.gpr[28] + static_cast<std::uint32_t>(-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<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_17 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_4 = (tier2_gpr_4 << 2u);
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_6 + tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(20)));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(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<std::uint32_t>(32));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(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<std::uint32_t>(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<std::uint32_t>(-4097));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(236)));
|
|
tier2_gpr_4 = (tier2_gpr_6 & tier2_gpr_4);
|
|
tier2_mem.aot_store32(tier2_gpr_19 + static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 2u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int8_t>(tier2_mem.aot_load8(tier2_gpr_19 + static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 4u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
if (tier2_gpr_4 != 0u) {
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(40)));
|
|
goto SB_L_08A6EA50;
|
|
}
|
|
goto SB_L_08A6EA30;
|
|
|
|
SB_L_08A6EA30:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_17 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 6u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<float>(tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(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<std::uint32_t>(236)));
|
|
tier2_gpr_4 = (tier2_gpr_4 | 4096u);
|
|
tier2_mem.aot_store32(tier2_gpr_19 + static_cast<std::uint32_t>(236), tier2_gpr_4);
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_19 + static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int8_t>(tier2_mem.aot_load8(tier2_gpr_17 + static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 4u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
if (tier2_gpr_4 != 0u) {
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_17 + static_cast<std::uint32_t>(40)));
|
|
goto SB_L_08A6EAE8;
|
|
}
|
|
goto SB_L_08A6EAC8;
|
|
|
|
SB_L_08A6EAC8:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 6u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<float>(tier2_mem.aot_load32(tier2_gpr_17 + static_cast<std::uint32_t>(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<std::uint32_t>(236)));
|
|
tier2_gpr_4 = (tier2_gpr_4 | 4096u);
|
|
tier2_mem.aot_store32(tier2_gpr_19 + static_cast<std::uint32_t>(236), tier2_gpr_4);
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_17 + static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_6 = (tier2_gpr_6 & 14u);
|
|
tier2_gpr_6 = (tier2_gpr_6 ^ 8u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(236)));
|
|
tier2_gpr_4 = (tier2_gpr_4 | 4096u);
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_19 + static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 4u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(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<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(ctx.gpr[16] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int8_t>(tier2_mem.aot_load8(ctx.gpr[16] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(473)));
|
|
tier2_gpr_4 = (static_cast<std::int32_t>(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<std::uint32_t>(128), 0u);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(136)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & ctx.gpr[9]);
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(136), tier2_gpr_4);
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_19 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(7656)));
|
|
tier2_gpr_6 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(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<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
goto SB_L_08A6EC74;
|
|
|
|
SB_L_08A6EC74:
|
|
ctx.gpr[8] = (tier2_mem.aot_load32(tier2_gpr_5 + static_cast<std::uint32_t>(20)));
|
|
ctx.gpr[8] = (ctx.gpr[8] + static_cast<std::uint32_t>(32));
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_19 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(7656)));
|
|
tier2_gpr_6 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(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<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
goto SB_L_08A6ECA0;
|
|
|
|
SB_L_08A6ECA0:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_5 + static_cast<std::uint32_t>(20)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + static_cast<std::uint32_t>(16));
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(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<std::uint32_t>(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<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(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<std::uint32_t>(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<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(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<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(152)));
|
|
tier2_gpr_4 = (tier2_gpr_17 + static_cast<std::uint32_t>(48));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(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<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(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<std::uint32_t>(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<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(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<std::uint32_t>(444), tier2_gpr_17);
|
|
goto SB_L_08A6ED6C;
|
|
|
|
SB_L_08A6ED6C:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(72));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
ctx.gpr[2] = (tier2_gpr_4 ^ 8u);
|
|
ctx.gpr[2] = (ctx.gpr[2] < static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(72));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
ctx.gpr[2] = (tier2_gpr_4 ^ 8u);
|
|
ctx.gpr[2] = (ctx.gpr[2] < static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(72));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
ctx.gpr[2] = (tier2_gpr_4 ^ 6u);
|
|
ctx.gpr[2] = (ctx.gpr[2] < static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(72));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
ctx.gpr[2] = (tier2_gpr_4 ^ 6u);
|
|
ctx.gpr[2] = (ctx.gpr[2] < static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(1600)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + static_cast<std::uint32_t>(4));
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(1596)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(1600), tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(1604)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + static_cast<std::uint32_t>(-1));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(1596), tier2_gpr_4);
|
|
{ const bool branch_taken = tier2_gpr_5 != 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(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
|