mirror of
https://github.com/jessicanataliagta/PSPRecomp
synced 2026-10-06 11:16:48 -04:00
6e85449aad
otimizações round 16
843 lines
37 KiB
C++
843 lines
37 KiB
C++
// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py.
|
|
// Tier-2 SUPERBLOCK V4 150FPS cluster: edge43
|
|
#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_edge43(psprecomp::Runtime &rt,
|
|
psprecomp::AllegrexContext &ctx,
|
|
psprecomp::GuestMemory::AotFastView &aot_mem,
|
|
std::uint32_t entry_pc) {
|
|
tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Edge43);
|
|
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_5 = ctx.gpr[5];
|
|
std::uint32_t tier2_gpr_29 = ctx.gpr[29];
|
|
std::uint32_t tier2_gpr_17 = ctx.gpr[17];
|
|
std::uint32_t tier2_gpr_19 = ctx.gpr[19];
|
|
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[5] = tier2_gpr_5; ctx.gpr[29] = tier2_gpr_29; ctx.gpr[17] = tier2_gpr_17; ctx.gpr[19] = tier2_gpr_19; } } 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_5 = ctx.gpr[5]; tier2_gpr_29 = ctx.gpr[29]; tier2_gpr_17 = ctx.gpr[17]; tier2_gpr_19 = ctx.gpr[19]; } } 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 0x088B1780u: goto SB_L_088B1780;
|
|
case 0x088B17B4u: goto SB_L_088B17B4;
|
|
case 0x088B180Cu: goto SB_L_088B180C;
|
|
case 0x088B18ECu: goto SB_L_088B18EC;
|
|
case 0x088B1940u: goto SB_L_088B1940;
|
|
case 0x088B1B74u: goto SB_L_088B1B74;
|
|
case 0x088B1BB8u: goto SB_L_088B1BB8;
|
|
case 0x088B1BC0u: goto SB_L_088B1BC0;
|
|
case 0x088B1BC8u: goto SB_L_088B1BC8;
|
|
case 0x088B1BD0u: goto SB_L_088B1BD0;
|
|
case 0x088B1C2Cu: goto SB_L_088B1C2C;
|
|
case 0x088B1C40u: goto SB_L_088B1C40;
|
|
case 0x088B3FCCu: goto SB_L_088B3FCC;
|
|
case 0x088B4004u: goto SB_L_088B4004;
|
|
case 0x088B4018u: goto SB_L_088B4018;
|
|
case 0x088B4020u: goto SB_L_088B4020;
|
|
case 0x088B4074u: goto SB_L_088B4074;
|
|
case 0x088B407Cu: goto SB_L_088B407C;
|
|
case 0x088B40C4u: goto SB_L_088B40C4;
|
|
case 0x088B40E0u: goto SB_L_088B40E0;
|
|
case 0x088B40F4u: goto SB_L_088B40F4;
|
|
case 0x088B40F8u: goto SB_L_088B40F8;
|
|
case 0x088B4110u: goto SB_L_088B4110;
|
|
case 0x088B4118u: goto SB_L_088B4118;
|
|
case 0x088B412Cu: goto SB_L_088B412C;
|
|
case 0x088B4134u: goto SB_L_088B4134;
|
|
case 0x088B4188u: goto SB_L_088B4188;
|
|
case 0x088B4190u: goto SB_L_088B4190;
|
|
case 0x088B41D8u: goto SB_L_088B41D8;
|
|
case 0x088B41F4u: goto SB_L_088B41F4;
|
|
case 0x088B4208u: goto SB_L_088B4208;
|
|
case 0x088B420Cu: goto SB_L_088B420C;
|
|
case 0x088B4224u: goto SB_L_088B4224;
|
|
case 0x088B4234u: goto SB_L_088B4234;
|
|
case 0x088B4238u: goto SB_L_088B4238;
|
|
default: break;
|
|
}
|
|
switch (tier2_resume_unit) {
|
|
|
|
default: break;
|
|
}
|
|
ctx.pc = tier2_resume_pc;
|
|
TIER2_SB_RETURN();
|
|
|
|
TIER2_LOCAL_DISPATCH_U0043:
|
|
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 0x088B1780u: goto SB_L_088B1780;
|
|
case 0x088B17B4u: goto SB_L_088B17B4;
|
|
case 0x088B180Cu: goto SB_L_088B180C;
|
|
case 0x088B18ECu: goto SB_L_088B18EC;
|
|
case 0x088B1940u: goto SB_L_088B1940;
|
|
case 0x088B1B74u: goto SB_L_088B1B74;
|
|
case 0x088B1BB8u: goto SB_L_088B1BB8;
|
|
case 0x088B1BC0u: goto SB_L_088B1BC0;
|
|
case 0x088B1BC8u: goto SB_L_088B1BC8;
|
|
case 0x088B1BD0u: goto SB_L_088B1BD0;
|
|
case 0x088B1C2Cu: goto SB_L_088B1C2C;
|
|
case 0x088B1C40u: goto SB_L_088B1C40;
|
|
case 0x088B3FCCu: goto SB_L_088B3FCC;
|
|
default:
|
|
ctx.pc = local_pc;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
|
|
TIER2_LOCAL_DISPATCH_U0044:
|
|
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 0x088B4004u: goto SB_L_088B4004;
|
|
case 0x088B4018u: goto SB_L_088B4018;
|
|
case 0x088B4020u: goto SB_L_088B4020;
|
|
case 0x088B4074u: goto SB_L_088B4074;
|
|
case 0x088B407Cu: goto SB_L_088B407C;
|
|
case 0x088B40C4u: goto SB_L_088B40C4;
|
|
case 0x088B40E0u: goto SB_L_088B40E0;
|
|
case 0x088B40F4u: goto SB_L_088B40F4;
|
|
case 0x088B40F8u: goto SB_L_088B40F8;
|
|
case 0x088B4110u: goto SB_L_088B4110;
|
|
case 0x088B4118u: goto SB_L_088B4118;
|
|
case 0x088B412Cu: goto SB_L_088B412C;
|
|
case 0x088B4134u: goto SB_L_088B4134;
|
|
case 0x088B4188u: goto SB_L_088B4188;
|
|
case 0x088B4190u: goto SB_L_088B4190;
|
|
case 0x088B41D8u: goto SB_L_088B41D8;
|
|
case 0x088B41F4u: goto SB_L_088B41F4;
|
|
case 0x088B4208u: goto SB_L_088B4208;
|
|
case 0x088B420Cu: goto SB_L_088B420C;
|
|
case 0x088B4224u: goto SB_L_088B4224;
|
|
case 0x088B4234u: goto SB_L_088B4234;
|
|
case 0x088B4238u: goto SB_L_088B4238;
|
|
default:
|
|
ctx.pc = local_pc;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
|
|
|
|
TIER2_ENTRY_DISPATCH:
|
|
switch (entry_pc) {
|
|
case 0x088B3FCCu: goto SB_L_088B3FCC;
|
|
case 0x088B4004u: goto SB_L_088B4004;
|
|
case 0x088B40F8u: goto SB_L_088B40F8;
|
|
default:
|
|
ctx.pc = entry_pc;
|
|
++tier2_stats.fallbacks;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
|
|
// TIER2_GPR_BODY_BEGIN
|
|
SB_L_088B1780:
|
|
{ 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); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + 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_5 + 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_5 + 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); }
|
|
ctx.execute_vfpu_vminmax_ct<2u, 0u, 1u, 3u, false>();
|
|
ctx.execute_vfpu_vminmax_ct<3u, 0u, 1u, 3u, true>();
|
|
ctx.execute_vfpu_compare3_ct<12u, 5u, 2u, 3u, 7u>();
|
|
ctx.execute_vfpu_compare3_ct<13u, 3u, 4u, 3u, 7u>();
|
|
{ float vfpu_value[4]{};
|
|
ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 3u>(vfpu_value); }
|
|
ctx.execute_vfpu_vec3_ct<12u, 12u, 13u, 3u, 0u>();
|
|
ctx.execute_vfpu_vcmp_ct<12u, 28u, 3u, 7u>();
|
|
{ const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 4u) & 1u) != 0u;
|
|
ctx.execute_vfpu_vec3_ct<15u, 5u, 4u, 3u, 0u>();
|
|
if (branch_taken) {
|
|
goto SB_L_088B180C;
|
|
}
|
|
goto SB_L_088B17B4;
|
|
}
|
|
|
|
SB_L_088B17B4:
|
|
ctx.execute_vfpu_vec3_ct<14u, 0u, 1u, 3u, 0u>();
|
|
ctx.execute_vfpu_vec3_ct<8u, 5u, 4u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<12u, 1u, 0u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<9u, 15u, 14u, 3u, 1u>();
|
|
ctx.vfpu_ctrl[0u] = 0x000040C9u;
|
|
ctx.vfpu_ctrl[1u] = 0x000043C6u;
|
|
ctx.execute_vfpu_vdot_ct<16u, 8u, 12u, 3u>();
|
|
ctx.vfpu_ctrl[0u] = 0x000040C2u;
|
|
ctx.vfpu_ctrl[1u] = 0x000043C8u;
|
|
ctx.execute_vfpu_vdot_ct<48u, 8u, 12u, 3u>();
|
|
ctx.vfpu_ctrl[1u] = 0x000003E1u;
|
|
ctx.execute_vfpu_vdot_ct<80u, 8u, 12u, 2u>();
|
|
ctx.vfpu_ctrl[0u] = 0x000040C9u;
|
|
ctx.vfpu_ctrl[1u] = 0x000240C6u;
|
|
ctx.execute_vfpu_vdot_ct<17u, 9u, 12u, 3u>();
|
|
ctx.vfpu_ctrl[0u] = 0x000040C2u;
|
|
ctx.vfpu_ctrl[1u] = 0x000240C8u;
|
|
ctx.execute_vfpu_vdot_ct<49u, 9u, 12u, 3u>();
|
|
ctx.vfpu_ctrl[1u] = 0x000200E1u;
|
|
ctx.execute_vfpu_vdot_ct<81u, 9u, 12u, 2u>();
|
|
ctx.vfpu_ctrl[0u] = 0x000007E4u;
|
|
ctx.execute_vfpu_vcmp_ct<17u, 16u, 3u, 7u>();
|
|
goto SB_L_088B180C;
|
|
|
|
SB_L_088B180C:
|
|
// vflush: architectural no-op that retains VFPU prefixes
|
|
tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<131u>());
|
|
ctx.gpr[2] = (tier2_gpr_4 & 16u);
|
|
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_U0043;
|
|
|
|
SB_L_088B18EC:
|
|
tier2_gpr_29 = (tier2_gpr_29 + static_cast<std::uint32_t>(-128));
|
|
{ const std::uint32_t tier2_words[9]{ctx.gpr[16], tier2_gpr_17, ctx.gpr[18], tier2_gpr_19, ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[31]};
|
|
tier2_mem.aot_store32_block(tier2_gpr_29 + static_cast<std::uint32_t>(84), tier2_words); }
|
|
ctx.gpr[16] = (ctx.gpr[8] | 0u);
|
|
tier2_gpr_17 = (ctx.gpr[7] | 0u);
|
|
ctx.gpr[18] = (tier2_gpr_6 | 0u);
|
|
ctx.gpr[21] = (tier2_gpr_4 | 0u);
|
|
ctx.gpr[22] = (tier2_gpr_29 + static_cast<std::uint32_t>(16));
|
|
ctx.gpr[23] = (tier2_gpr_29 + static_cast<std::uint32_t>(32));
|
|
tier2_gpr_4 = (ctx.gpr[18] | 0u);
|
|
tier2_gpr_6 = (tier2_gpr_29 | 0u);
|
|
ctx.gpr[7] = (ctx.gpr[22] | 0u);
|
|
ctx.gpr[31] = (0x088B1940u);
|
|
ctx.gpr[8] = (ctx.gpr[23] | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_trusted_direct<&recomp_unit_0163_entry, 163u, 44u, 0x08A9061Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x088B1940u) goto SB_L_088B1940;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_088B1940:
|
|
ctx.gpr[20] = (tier2_gpr_29 + static_cast<std::uint32_t>(48));
|
|
tier2_gpr_19 = (tier2_gpr_29 + static_cast<std::uint32_t>(64));
|
|
ctx.gpr[10] = (tier2_gpr_29 + static_cast<std::uint32_t>(80));
|
|
tier2_gpr_4 = (ctx.gpr[21] | 0u);
|
|
tier2_gpr_5 = (tier2_gpr_29 | 0u);
|
|
tier2_gpr_6 = (ctx.gpr[22] | 0u);
|
|
ctx.gpr[7] = (ctx.gpr[23] | 0u);
|
|
ctx.gpr[8] = (ctx.gpr[20] | 0u);
|
|
ctx.gpr[31] = (0x088B1968u);
|
|
ctx.gpr[9] = (tier2_gpr_19 | 0u);
|
|
goto SB_L_088B1B74;
|
|
|
|
SB_L_088B1B74:
|
|
{ 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); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + 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<2u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_5 + 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_6 + 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<5u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[7] + 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<6u, 4u>(vfpu_value); }
|
|
ctx.execute_vfpu_vec3_ct<9u, 5u, 4u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<10u, 6u, 4u, 3u, 1u>();
|
|
ctx.execute_vfpu_cross_quat_ct<17u, 10u, 9u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<110u, 17u, 17u, 3u>();
|
|
ctx.execute_vfpu_unary_ct<110u, 110u, 1u, 17u>();
|
|
ctx.execute_vfpu_vscl_ct<7u, 17u, 110u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<103u, 7u, 4u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<24u, 1u, 7u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<56u, 2u, 7u, 3u>();
|
|
ctx.execute_vfpu_vcmp_ct<24u, 103u, 1u, 7u>();
|
|
{ const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u;
|
|
ctx.execute_vfpu_vcmp_ct<56u, 103u, 1u, 7u>();
|
|
if (branch_taken) {
|
|
goto SB_L_088B1BC8;
|
|
}
|
|
goto SB_L_088B1BB8;
|
|
}
|
|
|
|
SB_L_088B1BB8:
|
|
{ const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B1C40;
|
|
}
|
|
goto SB_L_088B1BC0;
|
|
}
|
|
|
|
SB_L_088B1BC0:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B1BD0;
|
|
}
|
|
goto SB_L_088B1BC8;
|
|
}
|
|
|
|
SB_L_088B1BC8:
|
|
{ const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B1C40;
|
|
}
|
|
goto SB_L_088B1BD0;
|
|
}
|
|
|
|
SB_L_088B1BD0:
|
|
ctx.execute_vfpu_vec3_ct<3u, 2u, 1u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<24u, 103u, 24u, 1u, 1u>();
|
|
ctx.execute_vfpu_vdot_ct<56u, 3u, 7u, 3u>();
|
|
ctx.execute_vfpu_unary_ct<56u, 56u, 1u, 16u>();
|
|
ctx.execute_vfpu_vec3_ct<24u, 24u, 56u, 1u, 2u>();
|
|
ctx.execute_vfpu_vscl_ct<8u, 3u, 24u, 3u>();
|
|
ctx.execute_vfpu_vec3_ct<1u, 8u, 1u, 3u, 0u>();
|
|
{ float vfpu_value[4]{};
|
|
ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_value); }
|
|
ctx.execute_vfpu_vec3_ct<8u, 4u, 5u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<11u, 6u, 5u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<12u, 1u, 4u, 3u, 1u>();
|
|
ctx.execute_vfpu_vec3_ct<13u, 1u, 5u, 3u, 1u>();
|
|
ctx.execute_vfpu_cross_quat_ct<19u, 9u, 10u, 3u>();
|
|
ctx.execute_vfpu_cross_quat_ct<15u, 11u, 8u, 3u>();
|
|
ctx.execute_vfpu_cross_quat_ct<18u, 9u, 12u, 3u>();
|
|
ctx.execute_vfpu_cross_quat_ct<16u, 10u, 12u, 3u>();
|
|
ctx.execute_vfpu_cross_quat_ct<14u, 11u, 13u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<102u, 18u, 19u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<101u, 16u, 17u, 3u>();
|
|
ctx.execute_vfpu_vdot_ct<100u, 14u, 15u, 3u>();
|
|
ctx.execute_vfpu_vcmp_ct<39u, 0u, 3u, 6u>();
|
|
{ const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B1C40;
|
|
}
|
|
goto SB_L_088B1C2C;
|
|
}
|
|
|
|
SB_L_088B1C2C:
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<1u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = ctx.gpr[8] + 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); }
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<7u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = ctx.gpr[9] + 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); }
|
|
tier2_mem.aot_store32(ctx.gpr[10] + static_cast<std::uint32_t>(0), ctx.vfpu_scalar_bits_ct<24u>());
|
|
jump_target = ctx.gpr[31];
|
|
ctx.gpr[2] = (0u + static_cast<std::uint32_t>(1));
|
|
local_pc = jump_target;
|
|
goto TIER2_LOCAL_DISPATCH_U0043;
|
|
|
|
SB_L_088B1C40:
|
|
jump_target = ctx.gpr[31];
|
|
ctx.gpr[2] = (0u | 0u);
|
|
local_pc = jump_target;
|
|
goto TIER2_LOCAL_DISPATCH_U0043;
|
|
|
|
SB_L_088B3FCC:
|
|
ctx.gpr[18] = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(68)));
|
|
ctx.gpr[18] = (ctx.gpr[18] + ctx.gpr[30]);
|
|
tier2_gpr_5 = (tier2_gpr_29 + static_cast<std::uint32_t>(16));
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[18] + 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<2u, 4u>(vfpu_value); }
|
|
ctx.execute_vfpu_vx2i_ct<0u, 2u, 2u, 3u>();
|
|
ctx.execute_vfpu_vx2i_ct<1u, 66u, 2u, 3u>();
|
|
ctx.execute_vfpu_vi2f_ct<0u, 0u, 3u, 23u>();
|
|
ctx.execute_vfpu_vi2f_ct<1u, 1u, 3u, 23u>();
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = tier2_gpr_5 + 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); }
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<1u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = tier2_gpr_5 + static_cast<std::uint32_t>(16);
|
|
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.gpr[31] = (0x088B3FFCu);
|
|
tier2_gpr_4 = (ctx.gpr[20] | 0u);
|
|
goto SB_L_088B1780;
|
|
|
|
SB_L_088B4004:
|
|
tier2_gpr_17 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(ctx.gpr[18] + static_cast<std::uint32_t>(6))))));
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(ctx.gpr[18] + static_cast<std::uint32_t>(14))))));
|
|
tier2_gpr_4 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(tier2_gpr_17) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
ctx.gpr[16] = (tier2_gpr_17 << 3u);
|
|
if (branch_taken) {
|
|
goto SB_L_088B40F4;
|
|
}
|
|
goto SB_L_088B4018;
|
|
}
|
|
|
|
SB_L_088B4018:
|
|
{ const bool branch_taken = ctx.gpr[22] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B4074;
|
|
}
|
|
goto SB_L_088B4020;
|
|
}
|
|
|
|
SB_L_088B4020:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(76)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[16]);
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_4 + static_cast<std::uint32_t>(6)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
tier2_gpr_5 = (tier2_gpr_4 ^ 7u);
|
|
tier2_gpr_5 = (tier2_gpr_5 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 16u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 31u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 12u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B40E0;
|
|
}
|
|
goto SB_L_088B4074;
|
|
}
|
|
|
|
SB_L_088B4074:
|
|
{ const bool branch_taken = ctx.gpr[21] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B40C4;
|
|
}
|
|
goto SB_L_088B407C;
|
|
}
|
|
|
|
SB_L_088B407C:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(76)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[16]);
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_4 + static_cast<std::uint32_t>(6)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
tier2_gpr_5 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_5 = (tier2_gpr_5 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 16u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 31u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 12u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B40E0;
|
|
}
|
|
goto SB_L_088B40C4;
|
|
}
|
|
|
|
SB_L_088B40C4:
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(76)));
|
|
tier2_gpr_6 = (tier2_gpr_6 + ctx.gpr[16]);
|
|
tier2_gpr_4 = (ctx.gpr[20] | 0u);
|
|
ctx.gpr[7] = (ctx.gpr[23] | 0u);
|
|
ctx.gpr[31] = (0x088B40E0u);
|
|
ctx.gpr[8] = (tier2_gpr_29 | 0u);
|
|
if (tier2_return_depth < kTier2ReturnCapacity) {
|
|
if (!rt.tier2_enter_fused_transfer<43u, 0x088B18ECu>(ctx)) {
|
|
ctx.pc = 0x088B18ECu;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
tier2_return_pc[tier2_return_depth] = 0x088B40E0u;
|
|
tier2_return_unit[tier2_return_depth] = 44u;
|
|
tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers;
|
|
++tier2_return_depth;
|
|
++tier2_stats.fused_calls;
|
|
goto SB_L_088B18EC;
|
|
}
|
|
++tier2_stats.fallbacks;
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_trusted_direct<&recomp_unit_0043_entry, 43u, 210u, 0x088B18ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x088B40E0u) goto SB_L_088B40E0;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_088B40E0:
|
|
tier2_gpr_17 = (tier2_gpr_17 + static_cast<std::uint32_t>(1));
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(ctx.gpr[18] + static_cast<std::uint32_t>(14))))));
|
|
tier2_gpr_4 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(tier2_gpr_17) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
ctx.gpr[16] = (ctx.gpr[16] + static_cast<std::uint32_t>(8));
|
|
if (branch_taken) {
|
|
goto SB_L_088B4018;
|
|
}
|
|
goto SB_L_088B40F4;
|
|
}
|
|
|
|
SB_L_088B40F4:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(48)));
|
|
goto SB_L_088B40F8;
|
|
|
|
SB_L_088B40F8:
|
|
tier2_gpr_4 = (tier2_gpr_4 + static_cast<std::uint32_t>(1));
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(52)));
|
|
ctx.gpr[30] = (ctx.gpr[30] + static_cast<std::uint32_t>(16));
|
|
tier2_gpr_5 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(tier2_gpr_5) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_5 != 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(48), tier2_gpr_4);
|
|
if (branch_taken) {
|
|
if (!rt.tier2_enter_fused_transfer<43u, 0x088B3FCCu>(ctx)) {
|
|
ctx.pc = 0x088B3FCCu;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
++tier2_pending_transfers;
|
|
++tier2_stats.fused_tail_edges;
|
|
goto SB_L_088B3FCC;
|
|
}
|
|
goto SB_L_088B4110;
|
|
}
|
|
|
|
SB_L_088B4110:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B4208;
|
|
}
|
|
goto SB_L_088B4118;
|
|
}
|
|
|
|
SB_L_088B4118:
|
|
ctx.gpr[16] = (0u | 0u);
|
|
tier2_gpr_4 = (tier2_mem.aot_load16(tier2_gpr_19 + static_cast<std::uint32_t>(50)));
|
|
tier2_gpr_4 = (static_cast<std::int32_t>(ctx.gpr[16]) < static_cast<std::int32_t>(tier2_gpr_4) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
tier2_gpr_17 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_088B4208;
|
|
}
|
|
goto SB_L_088B412C;
|
|
}
|
|
|
|
SB_L_088B412C:
|
|
{ const bool branch_taken = ctx.gpr[22] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B4188;
|
|
}
|
|
goto SB_L_088B4134;
|
|
}
|
|
|
|
SB_L_088B4134:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(76)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_17);
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_4 + static_cast<std::uint32_t>(6)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
tier2_gpr_5 = (tier2_gpr_4 ^ 7u);
|
|
tier2_gpr_5 = (tier2_gpr_5 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 16u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 31u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 12u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B41F4;
|
|
}
|
|
goto SB_L_088B4188;
|
|
}
|
|
|
|
SB_L_088B4188:
|
|
{ const bool branch_taken = ctx.gpr[21] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B41D8;
|
|
}
|
|
goto SB_L_088B4190;
|
|
}
|
|
|
|
SB_L_088B4190:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(76)));
|
|
tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_17);
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_4 + static_cast<std::uint32_t>(6)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
tier2_gpr_5 = (tier2_gpr_4 ^ 8u);
|
|
tier2_gpr_5 = (tier2_gpr_5 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 16u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_6 = (tier2_gpr_4 ^ 31u);
|
|
tier2_gpr_6 = (tier2_gpr_6 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 12u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_088B41F4;
|
|
}
|
|
goto SB_L_088B41D8;
|
|
}
|
|
|
|
SB_L_088B41D8:
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_19 + static_cast<std::uint32_t>(76)));
|
|
tier2_gpr_6 = (tier2_gpr_6 + tier2_gpr_17);
|
|
tier2_gpr_4 = (ctx.gpr[20] | 0u);
|
|
ctx.gpr[7] = (ctx.gpr[23] | 0u);
|
|
ctx.gpr[31] = (0x088B41F4u);
|
|
ctx.gpr[8] = (tier2_gpr_29 | 0u);
|
|
if (tier2_return_depth < kTier2ReturnCapacity) {
|
|
if (!rt.tier2_enter_fused_transfer<43u, 0x088B18ECu>(ctx)) {
|
|
ctx.pc = 0x088B18ECu;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
tier2_return_pc[tier2_return_depth] = 0x088B41F4u;
|
|
tier2_return_unit[tier2_return_depth] = 44u;
|
|
tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers;
|
|
++tier2_return_depth;
|
|
++tier2_stats.fused_calls;
|
|
goto SB_L_088B18EC;
|
|
}
|
|
++tier2_stats.fallbacks;
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_trusted_direct<&recomp_unit_0043_entry, 43u, 210u, 0x088B18ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x088B41F4u) goto SB_L_088B41F4;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_088B41F4:
|
|
ctx.gpr[16] = (ctx.gpr[16] + static_cast<std::uint32_t>(1));
|
|
tier2_gpr_4 = (tier2_mem.aot_load16(tier2_gpr_19 + static_cast<std::uint32_t>(50)));
|
|
tier2_gpr_4 = (static_cast<std::int32_t>(ctx.gpr[16]) < static_cast<std::int32_t>(tier2_gpr_4) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
tier2_gpr_17 = (tier2_gpr_17 + static_cast<std::uint32_t>(8));
|
|
if (branch_taken) {
|
|
goto SB_L_088B412C;
|
|
}
|
|
goto SB_L_088B4208;
|
|
}
|
|
|
|
SB_L_088B4208:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(56)));
|
|
goto SB_L_088B420C;
|
|
|
|
SB_L_088B420C:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(0)));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
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_088B4234;
|
|
}
|
|
goto SB_L_088B4224;
|
|
}
|
|
|
|
SB_L_088B4224:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(0)));
|
|
tier2_mem.aot_store32(tier2_gpr_4 + static_cast<std::uint32_t>(0), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
{ const bool branch_taken = 0u == 0u;
|
|
ctx.gpr[2] = (0u | 1u);
|
|
if (branch_taken) {
|
|
goto SB_L_088B4238;
|
|
}
|
|
goto SB_L_088B4234;
|
|
}
|
|
|
|
SB_L_088B4234:
|
|
ctx.gpr[2] = (0u | 0u);
|
|
goto SB_L_088B4238;
|
|
|
|
SB_L_088B4238:
|
|
{ std::uint32_t tier2_words[11]{};
|
|
if (tier2_mem.aot_try_load32_block(tier2_gpr_29 + static_cast<std::uint32_t>(60), tier2_words)) {
|
|
ctx.fpr[20] = std::bit_cast<float>(tier2_words[0]);
|
|
ctx.gpr[16] = tier2_words[1];
|
|
tier2_gpr_17 = tier2_words[2];
|
|
ctx.gpr[18] = tier2_words[3];
|
|
tier2_gpr_19 = tier2_words[4];
|
|
ctx.gpr[20] = tier2_words[5];
|
|
ctx.gpr[21] = tier2_words[6];
|
|
ctx.gpr[22] = tier2_words[7];
|
|
ctx.gpr[23] = tier2_words[8];
|
|
ctx.gpr[30] = tier2_words[9];
|
|
ctx.gpr[31] = tier2_words[10];
|
|
} else {
|
|
ctx.fpr[20] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(60)));
|
|
ctx.gpr[16] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(64)));
|
|
tier2_gpr_17 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(68)));
|
|
ctx.gpr[18] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_19 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(76)));
|
|
ctx.gpr[20] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(80)));
|
|
ctx.gpr[21] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(84)));
|
|
ctx.gpr[22] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(88)));
|
|
ctx.gpr[23] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(92)));
|
|
ctx.gpr[30] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(96)));
|
|
ctx.gpr[31] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(100)));
|
|
} }
|
|
jump_target = ctx.gpr[31];
|
|
tier2_gpr_29 = (tier2_gpr_29 + static_cast<std::uint32_t>(112));
|
|
local_pc = jump_target;
|
|
goto TIER2_LOCAL_DISPATCH_U0044;
|
|
// 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
|